diff --git a/.gitignore b/.gitignore index 668b69c..e005d9d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,8 @@ Thumbs.db *.zip *.as *.bin +.env +assets/ # Nitro /src/configuration.json diff --git a/package-lock.json b/package-lock.json index 1bd356b..575c79d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,4390 @@ { "name": "nitro-converter", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "nitro-converter", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bytebuffer": "^5.0.1", + "concat-frames": "^1.0.3", + "free-tex-packer-core": "^0.3.2", + "jimp": "^0.16.1", + "jpg-stream": "^1.1.2", + "lodash": "^4.17.20", + "lzma-purejs": "^0.9.3", + "node-fetch": "^2.6.1", + "node-gzip": "^1.1.2", + "ora": "^5.3.0", + "pako": "^2.0.4", + "png-stream": "^1.0.5", + "reflect-metadata": "^0.1.13", + "shelljs": "^0.8.4", + "stream-to-array": "^2.3.0", + "tsyringe": "^4.4.0", + "xml2js": "^0.4.23" + }, + "devDependencies": { + "@types/bytebuffer": "^5.0.42", + "@types/node": "^14.14.28", + "@types/node-fetch": "^2.5.8", + "@types/pako": "^1.0.2", + "@types/shelljs": "^0.8.10", + "@types/stream-to-array": "^2.3.0", + "@types/xml2js": "^0.4.8", + "@typescript-eslint/eslint-plugin": "^4.15.1", + "@typescript-eslint/parser": "^4.15.1", + "eslint": "^7.20.0", + "ts-node": "^9.1.1", + "ts-node-dev": "^1.1.1", + "typescript": "^4.1.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", + "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", + "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", + "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.1" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", + "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", + "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "jpeg-js": "0.4.2" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", + "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", + "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", + "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", + "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", + "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", + "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", + "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", + "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", + "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", + "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", + "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", + "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", + "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", + "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", + "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", + "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", + "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", + "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", + "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", + "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", + "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", + "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.1", + "@jimp/plugin-blur": "^0.16.1", + "@jimp/plugin-circle": "^0.16.1", + "@jimp/plugin-color": "^0.16.1", + "@jimp/plugin-contain": "^0.16.1", + "@jimp/plugin-cover": "^0.16.1", + "@jimp/plugin-crop": "^0.16.1", + "@jimp/plugin-displace": "^0.16.1", + "@jimp/plugin-dither": "^0.16.1", + "@jimp/plugin-fisheye": "^0.16.1", + "@jimp/plugin-flip": "^0.16.1", + "@jimp/plugin-gaussian": "^0.16.1", + "@jimp/plugin-invert": "^0.16.1", + "@jimp/plugin-mask": "^0.16.1", + "@jimp/plugin-normalize": "^0.16.1", + "@jimp/plugin-print": "^0.16.1", + "@jimp/plugin-resize": "^0.16.1", + "@jimp/plugin-rotate": "^0.16.1", + "@jimp/plugin-scale": "^0.16.1", + "@jimp/plugin-shadow": "^0.16.1", + "@jimp/plugin-threshold": "^0.16.1", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", + "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.1", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", + "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", + "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.1", + "@jimp/gif": "^0.16.1", + "@jimp/jpeg": "^0.16.1", + "@jimp/png": "^0.16.1", + "@jimp/tiff": "^0.16.1", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", + "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@jvitela/mustache-wax": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jvitela/mustache-wax/-/mustache-wax-1.0.3.tgz", + "integrity": "sha512-5M5p8d9YQwEDSa0oLoeCZ8ECiM2ZJLKxI/D0pDByiNBJw+4Tizjk/NMIjGx7IoJOGBnWcfHX3Pwd6m/MpMHoGA==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/bytebuffer": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", + "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", + "dev": true, + "dependencies": { + "@types/long": "*", + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", + "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", + "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/pako": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.2.tgz", + "integrity": "sha512-8UJl2MjkqqS6ncpLZqRZ5LmGiFBkbYxocD4e4jmBqGvfRG1RS23gKsBQbdtV9O9GvRyjFTiRHRByjSlKCLlmZw==", + "dev": true + }, + "node_modules/@types/shelljs": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.10.tgz", + "integrity": "sha512-nhBdUA/n0nRo1B6E4BuRnUvllYAqal4T9zd91ZDnBh+qQMQTwvxmJHx6xEn/0vdjP2kqEA5eVeLazs4nMxeuFg==", + "dev": true, + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/xml2js": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", + "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.1.tgz", + "integrity": "sha512-yW2epMYZSpNJXZy22Biu+fLdTG8Mn6b22kR3TqblVk50HGNV8Zya15WAXuQCr8tKw4Qf1BL4QtI6kv6PCkLoJw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.15.1", + "@typescript-eslint/scope-manager": "4.15.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.1.tgz", + "integrity": "sha512-9LQRmOzBRI1iOdJorr4jEnQhadxK4c9R2aEAsm7WE/7dq8wkKD1suaV0S/JucTL8QlYUPU1y2yjqg+aGC0IQBQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.1.tgz", + "integrity": "sha512-V8eXYxNJ9QmXi5ETDguB7O9diAXlIyS+e3xzLoP/oVE4WCAjssxLIa0mqCLsCGXulYJUfT+GV70Jv1vHsdKwtA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.15.1", + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/typescript-estree": "4.15.1", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.1.tgz", + "integrity": "sha512-ibQrTFcAm7yG4C1iwpIYK7vDnFg+fKaZVfvyOm3sNsGAerKfwPVFtYft5EbjzByDJ4dj1WD8/34REJfw/9wdVA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.1.tgz", + "integrity": "sha512-iGsaUyWFyLz0mHfXhX4zO6P7O3sExQpBJ2dgXB0G5g/8PRVfBBsmQIc3r83ranEQTALLR3Vko/fnCIVqmH+mPw==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.1.tgz", + "integrity": "sha512-z8MN3CicTEumrWAEB2e2CcoZa3KP9+SMYLIA2aM49XW3cWIaiVSOAGq30ffR5XHxRirqE90fgLw3e6WmNx5uNw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "@typescript-eslint/visitor-keys": "4.15.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.1.tgz", + "integrity": "sha512-tYzaTP9plooRJY8eNlpAewTOqtWW/4ff/5wBjNVaJ0S0wC4Gpq/zDVRTJa5bq2v1pCNQ08xxMCndcvR+h7lMww==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.1.1.tgz", + "integrity": "sha1-tcdcUyBS3M1qOcAGTHcsjVegbNI=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "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" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "dependencies": { + "readable-stream": "~1.0.26" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/concat-frames": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concat-frames/-/concat-frames-1.0.3.tgz", + "integrity": "sha1-z+moFvJce3WWPZn+8vSqBFj7+Zs=", + "dependencies": { + "pixel-stream": "^1.0.3" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", + "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + }, + "node_modules/exif-reader": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exif-reader/-/exif-reader-1.0.3.tgz", + "integrity": "sha512-tWMBj1+9jUSibgR/kv/GQ/fkR0biaN9GEZ5iPdf7jFeH//d2bSzgPoaWf1OfMv4MXFD4upwvpCCyeMvSyLWSfA==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", + "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/free-tex-packer-core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/free-tex-packer-core/-/free-tex-packer-core-0.3.2.tgz", + "integrity": "sha512-CauShorQ77Pgm+u2YalXX6HyR0rnkuccS3lIKCZpnBeAjcUV6SXCwswUGS8cbrvS5/dIwM5UeqFu02X86PPMkg==", + "dependencies": { + "@jvitela/mustache-wax": "^1.0.1", + "jimp": "^0.2.28", + "maxrects-packer": "^2.5.0", + "mustache": "^2.3.0", + "tinify": "^1.5.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" + }, + "node_modules/free-tex-packer-core/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "dependencies": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + } + }, + "node_modules/free-tex-packer-core/node_modules/jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" + }, + "node_modules/free-tex-packer-core/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/free-tex-packer-core/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gifwrap": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", + "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", + "dependencies": { + "image-q": "^1.1.1", + "omggif": "^1.0.10" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-q": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", + "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=", + "engines": { + "node": ">=0.9.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dependencies": { + "has": "^1.0.3" + }, + "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": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jimp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", + "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.1", + "@jimp/plugins": "^0.16.1", + "@jimp/types": "^0.16.1", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", + "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" + }, + "node_modules/jpg-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jpg-stream/-/jpg-stream-1.1.2.tgz", + "integrity": "sha1-TboVnZ0ZNo3yExj2SM7pgKcr5Ac=", + "dependencies": { + "exif-reader": "^1.0.0", + "pixel-stream": "^1.0.3" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lzma-purejs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/lzma-purejs/-/lzma-purejs-0.9.3.tgz", + "integrity": "sha1-yJF+iUsbTbXIZbkn34ZO3edZzN4=", + "dependencies": { + "amdefine": "~0.1.0", + "commander": "~2.0.0" + }, + "bin": { + "lzmajs": "bin/lzmajs" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxrects-packer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/maxrects-packer/-/maxrects-packer-2.7.2.tgz", + "integrity": "sha512-akd5IRLPqQeWlpJyRJyfYq86VB05zzbMIdyTgLxRk4z1H0A8g4oTJW31Yo6zO9piSRsFNYdzmgudW7J2g1gEhQ==" + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "bin": { + "mustache": "bin/mustache" + }, + "engines": { + "npm": ">=1.4.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-gzip": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/node-gzip/-/node-gzip-1.1.2.tgz", + "integrity": "sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/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==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ora/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "node_modules/parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "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": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pixel-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz", + "integrity": "sha1-U+jFSyHVUIOTtTvLMrZKd1Xx+l4=", + "dependencies": { + "shallow-copy": "0.0.1" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/png-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/png-stream/-/png-stream-1.0.5.tgz", + "integrity": "sha1-W8cWh+qJWUJ+lQ5Sx8yknipvBMY=", + "dependencies": { + "bl": "^0.9.3", + "buffer-crc32": "^0.2.3", + "buffer-equal": "^0.0.1", + "pixel-stream": "^1.0.3" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-nodeify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/promise-nodeify/-/promise-nodeify-3.0.1.tgz", + "integrity": "sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg==", + "engines": { + "node": ">=6", + "npm": ">=1.3.7" + } + }, + "node_modules/proxying-agent": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/proxying-agent/-/proxying-agent-2.4.0.tgz", + "integrity": "sha512-b9vDqIcViJZVsWPpQlp9Py74u+Wqd0a+kMkkg7zX58mwNtrNbOChNlRTM7lUrlpiwNzyJCV8+5D8rnZYLDFh7Q==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", + "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "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" + } + ] + }, + "node_modules/read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/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==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "dependencies": { + "stream-to": "~0.2.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "dependencies": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tinify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tinify/-/tinify-1.5.0.tgz", + "integrity": "sha1-a6LqfognyEXSY947RvTbe61VWSA=", + "dependencies": { + "promise-nodeify": ">= 0.1", + "proxying-agent": ">= 2.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/ts-node-dev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.1.tgz", + "integrity": "sha512-kAO8LUZgXZSY0+PucMPsQ0Bbdv0x+lgbN7j8gcD4PuTI4uKC6YchekaspmYTBNilkiu+rQYkWJA7cK+Q8/B0tQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.4.0", + "dateformat": "~1.0.4-1.2.3", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^9.0.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsyringe": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.4.0.tgz", + "integrity": "sha512-SlMApe1lhIq546CDp7bF+IdF4RB6d+9C5T7B0AS0P/Bm+Qpizj/gEmZzvw9J/KlXPEt4qHTbi1TRvX3rCPSdTg==", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dependencies": { + "ip-regex": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } + }, + "node_modules/utif/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", @@ -431,6 +4813,16 @@ "@types/node": "*" } }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -443,6 +4835,12 @@ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", "dev": true }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "@types/node": { "version": "14.14.28", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.28.tgz", @@ -472,6 +4870,31 @@ } } }, + "@types/pako": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.2.tgz", + "integrity": "sha512-8UJl2MjkqqS6ncpLZqRZ5LmGiFBkbYxocD4e4jmBqGvfRG1RS23gKsBQbdtV9O9GvRyjFTiRHRByjSlKCLlmZw==", + "dev": true + }, + "@types/shelljs": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.10.tgz", + "integrity": "sha512-nhBdUA/n0nRo1B6E4BuRnUvllYAqal4T9zd91ZDnBh+qQMQTwvxmJHx6xEn/0vdjP2kqEA5eVeLazs4nMxeuFg==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -586,7 +5009,8 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -708,8 +5132,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.5.1", @@ -752,7 +5175,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -827,51 +5249,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -945,8 +5322,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-util-is": { "version": "1.0.2", @@ -1156,6 +5532,57 @@ "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "eslint-scope": { @@ -1453,8 +5880,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -1466,8 +5892,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -1502,7 +5927,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1585,7 +6009,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -1657,7 +6080,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1668,6 +6090,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, "ip-regex": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", @@ -1692,7 +6119,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -1895,6 +6321,51 @@ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "requires": { "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "long": { @@ -2016,7 +6487,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2107,7 +6577,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2149,6 +6618,14 @@ "wcwidth": "^1.0.1" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2159,6 +6636,33 @@ "readable-stream": "^3.4.0" } }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -2176,9 +6680,22 @@ "requires": { "safe-buffer": "~5.2.0" } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2233,8 +6750,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -2245,8 +6761,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-type": { "version": "4.0.0", @@ -2430,6 +6945,14 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -2502,7 +7025,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -2591,6 +7113,16 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -2730,6 +7262,11 @@ "stream-to": "~0.2.0" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -2741,11 +7278,6 @@ "strip-ansi": "^6.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -3099,8 +7631,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xhr": { "version": "2.6.0", diff --git a/package.json b/package.json index 46b55de..7c4fcea 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "start": "ts-node-transpile-only src/Main.ts", + "start": "node dist/Main.js", "start:dev": "ts-node-dev --respawn --transpile-only src/Main.ts" }, "author": "", @@ -20,8 +20,10 @@ "node-fetch": "^2.6.1", "node-gzip": "^1.1.2", "ora": "^5.3.0", + "pako": "^2.0.4", "png-stream": "^1.0.5", "reflect-metadata": "^0.1.13", + "shelljs": "^0.8.4", "stream-to-array": "^2.3.0", "tsyringe": "^4.4.0", "xml2js": "^0.4.23" @@ -30,6 +32,9 @@ "@types/bytebuffer": "^5.0.42", "@types/node": "^14.14.28", "@types/node-fetch": "^2.5.8", + "@types/pako": "^1.0.2", + "@types/shelljs": "^0.8.10", + "@types/stream-to-array": "^2.3.0", "@types/xml2js": "^0.4.8", "@typescript-eslint/eslint-plugin": "^4.15.1", "@typescript-eslint/parser": "^4.15.1", diff --git a/src/Main.ts b/src/Main.ts index 60be08c..9f05405 100644 --- a/src/Main.ts +++ b/src/Main.ts @@ -10,14 +10,11 @@ import { FigureDataConverter } from './converters/FigureDataConverter'; import { FigureMapConverter } from './converters/FigureMapConverter'; import { FurnitureConverter } from './converters/FurnitureConverter'; import { FurnitureDataConverter } from './converters/FurnitureDataConverter'; -import { OldAssetConverter } from './converters/OldAssetConverter'; import { PetConverter } from './converters/PetConverter'; import { ProductDataConverter } from './converters/ProductDataConverter'; (async () => { - checkNodeVersion(); - const config = container.resolve(Configuration); await config.init(); @@ -31,26 +28,15 @@ import { ProductDataConverter } from './converters/ProductDataConverter'; FurnitureConverter, FigureConverter, EffectConverter, - PetConverter, - OldAssetConverter + PetConverter ]; - const [ arg1, arg2, ...rest ] = process.argv; - for(const converterClass of converters) { const converter = (container.resolve(converterClass) as IConverter); - await converter.convertAsync(rest); + await converter.convertAsync(); } -})(); -function checkNodeVersion() -{ - const version = process.version.replace('v', ''); - const major = version.split('.')[0]; - if(parseInt(major) < 14) - { - throw new Error('Invalid node version: ' + version + ' please use >= 14'); - } -} + process.kill(process.pid, 'SIGTERM'); +})(); diff --git a/src/common/bundle/BundleProvider.ts b/src/common/bundle/BundleProvider.ts deleted file mode 100644 index 8f57cbb..0000000 --- a/src/common/bundle/BundleProvider.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { packAsync } from 'free-tex-packer-core'; -import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; -import { ImageBundle } from './ImageBundle'; -import { SpriteBundle } from './SpriteBundle'; - -export class BundleProvider -{ - public static imageSource: Map = new Map(); - - public static async generateSpriteSheet(habboAssetSWF: HabboAssetSWF, convertCase: boolean = false): Promise - { - const tagList = habboAssetSWF.symbolTags(); - const names: string[] = []; - const tags: number[] = []; - - let documentClass = habboAssetSWF.getDocumentClass(); - - if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))); - - for(const tag of tagList) - { - names.push(...tag.names); - tags.push(...tag.tags); - } - - const imageBundle = new ImageBundle(); - - const imageTags = habboAssetSWF.imageTags(); - - for(const imageTag of imageTags) - { - if(tags.includes(imageTag.characterID)) - { - for(let i = 0; i < tags.length; i++) - { - if(tags[i] != imageTag.characterID) continue; - - if(names[i] == imageTag.className) continue; - - if(imageTag.className.startsWith('sh_')) continue; - - if(imageTag.className.indexOf('_32_') >= 0) continue; - - BundleProvider.imageSource.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1)); - } - } - - if(imageTag.className.startsWith('sh_')) continue; - - if(imageTag.className.indexOf('_32_') >= 0) continue; - - let className = imageTag.className; - - if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1)); - - imageBundle.addImage(className, imageTag.imgData); - } - - if(!imageBundle.images.length) return null; - - return await this.packImages(documentClass, imageBundle, convertCase); - } - - private static async packImages(documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false): Promise - { - const files = await packAsync(imageBundle.images, { - textureName: (convertCase ? documentClass.substring(1) : documentClass), - width: 10240, - height: 4320, - fixedSize: false, - allowRotation: false, - detectIdentical: true, - allowTrim: true, - //@ts-ignore - exporter: 'Pixi' - }); - - const bundle = new SpriteBundle(); - - for(const item of files) - { - if(item.name.endsWith('.json')) - { - bundle.spritesheet = JSON.parse(item.buffer.toString('utf8')); - - delete bundle.spritesheet.meta.app; - delete bundle.spritesheet.meta.version; - } - else - { - bundle.imageData = { - name: item.name, - buffer: item.buffer - }; - - if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1); - } - } - - if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name; - - return bundle; - } -} diff --git a/src/common/bundle/NitroBundle.ts b/src/common/bundle/NitroBundle.ts new file mode 100644 index 0000000..2ea51fc --- /dev/null +++ b/src/common/bundle/NitroBundle.ts @@ -0,0 +1,75 @@ +import ByteBuffer from 'bytebuffer'; +import { Data, deflate, inflate } from 'pako'; +import { BinaryReader } from '../utils'; + +export class NitroBundle +{ + private readonly _files: Map; + + constructor() + { + this._files = new Map(); + } + + public static from(buffer: ArrayBuffer): NitroBundle + { + const nitroBundle = new NitroBundle(); + const binaryReader = new BinaryReader(buffer); + + let fileCount = binaryReader.readShort(); + + while(fileCount > 0) + { + const fileNameLength = binaryReader.readShort(); + const fileName = binaryReader.readBytes(fileNameLength).toString(); + const fileLength = binaryReader.readInt(); + const buffer = binaryReader.readBytes(fileLength); + const decompressed = inflate((buffer.toArrayBuffer() as Data)); + + nitroBundle.addFile(fileName, Buffer.from(decompressed.buffer)); + + fileCount--; + } + + return nitroBundle; + } + + public addFile(name: string, data: Buffer): void + { + this._files.set(name, data); + } + + public async toBufferAsync(): Promise + { + const buffer = new ByteBuffer(); + + buffer.writeUint16(this._files.size); + + for(const file of this._files.entries()) + { + const fileName = file[0]; + const fileBuffer = file[1]; + + buffer.writeUint16(fileName.length); + buffer.writeString(fileName); + + const compressed = deflate(fileBuffer); + buffer.writeUint32(compressed.length); + buffer.append(compressed); + } + + buffer.flip(); + + return buffer.toBuffer(); + } + + public get files(): Map + { + return this._files; + } + + public get totalFiles(): number + { + return this._files.size; + } +} diff --git a/src/common/bundle/SpriteBundle.ts b/src/common/bundle/SpriteBundle.ts index f058f60..b39a026 100644 --- a/src/common/bundle/SpriteBundle.ts +++ b/src/common/bundle/SpriteBundle.ts @@ -1,4 +1,4 @@ -import { ISpritesheetData } from '../../mapping/json'; +import { ISpritesheetData } from '../mapping'; export class SpriteBundle { diff --git a/src/common/bundle/index.ts b/src/common/bundle/index.ts new file mode 100644 index 0000000..d0e332d --- /dev/null +++ b/src/common/bundle/index.ts @@ -0,0 +1,3 @@ +export * from './ImageBundle'; +export * from './NitroBundle'; +export * from './SpriteBundle'; diff --git a/src/common/config/Configuration.ts b/src/common/config/Configuration.ts index e291943..11ec41b 100644 --- a/src/common/config/Configuration.ts +++ b/src/common/config/Configuration.ts @@ -1,6 +1,6 @@ import { singleton } from 'tsyringe'; import * as configuration from '../../configuration.json'; -import { FileUtilities } from '../../utils/FileUtilities'; +import { FileUtilities } from '../utils'; @singleton() export class Configuration @@ -101,6 +101,7 @@ export class Configuration public interpolate(value: string, regex: RegExp = null): string { + if(!value || (typeof value === 'object')) return value; if(!regex) regex = new RegExp(/\${(.*?)}/g); const pieces = value.match(regex); diff --git a/src/common/config/index.ts b/src/common/config/index.ts new file mode 100644 index 0000000..a699b40 --- /dev/null +++ b/src/common/config/index.ts @@ -0,0 +1 @@ +export * from './Configuration'; diff --git a/src/common/converters/Converter.ts b/src/common/converters/Converter.ts deleted file mode 100644 index 0ce6736..0000000 --- a/src/common/converters/Converter.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IConverter } from './IConverter'; - -export class Converter implements IConverter -{ - public async convertAsync(args: string[] = []): Promise - { - return; - } -} diff --git a/src/common/converters/ConverterResult.ts b/src/common/converters/ConverterResult.ts new file mode 100644 index 0000000..6a968a3 --- /dev/null +++ b/src/common/converters/ConverterResult.ts @@ -0,0 +1,7 @@ +export class ConverterResult +{ + public static OK: number = 1; + public static BAD_ARGS: number = 2; + public static FILE_EXISTS: number = 3; + public static INVALID_SWF: number = 4; +} diff --git a/src/common/converters/ConverterType.ts b/src/common/converters/ConverterType.ts deleted file mode 100644 index 2b744fa..0000000 --- a/src/common/converters/ConverterType.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class ConverterType -{ - public static EFFECT_CONVERTER: string = 'effect'; - public static FIGURE_CONVERTER: string = 'figure'; - public static FURNITURE_CONVERTER: string = 'furni'; - public static PET_CONVERTER: string = 'pet'; -} diff --git a/src/common/converters/IConverter.ts b/src/common/converters/IConverter.ts index 3041112..7375373 100644 --- a/src/common/converters/IConverter.ts +++ b/src/common/converters/IConverter.ts @@ -1,4 +1,4 @@ export interface IConverter { - convertAsync(args?: string[]): Promise; + convertAsync(): Promise; } diff --git a/src/common/converters/index.ts b/src/common/converters/index.ts new file mode 100644 index 0000000..73109e9 --- /dev/null +++ b/src/common/converters/index.ts @@ -0,0 +1,2 @@ +export * from './ConverterResult'; +export * from './IConverter'; diff --git a/src/common/index.ts b/src/common/index.ts new file mode 100644 index 0000000..10e7235 --- /dev/null +++ b/src/common/index.ts @@ -0,0 +1,40 @@ +export * from './bundle'; +export * from './config'; +export * from './converters'; +export * from './mapping'; +export * from './mapping/json'; +export * from './mapping/json/asset'; +export * from './mapping/json/asset/animation'; +export * from './mapping/json/asset/logic'; +export * from './mapping/json/asset/logic/model'; +export * from './mapping/json/asset/logic/particlesystem'; +export * from './mapping/json/asset/spritesheet'; +export * from './mapping/json/asset/visualization'; +export * from './mapping/json/asset/visualization/animation'; +export * from './mapping/json/asset/visualization/color'; +export * from './mapping/json/asset/visualization/gestures'; +export * from './mapping/json/asset/visualization/postures'; +export * from './mapping/json/effectmap'; +export * from './mapping/json/externaltexts'; +export * from './mapping/json/figuredata'; +export * from './mapping/json/figuremap'; +export * from './mapping/json/furnituredata'; +export * from './mapping/json/productdata'; +export * from './mapping/mappers'; +export * from './mapping/mappers/asset'; +export * from './mapping/xml'; +export * from './mapping/xml/asset'; +export * from './mapping/xml/asset/animation'; +export * from './mapping/xml/asset/assets'; +export * from './mapping/xml/asset/logic'; +export * from './mapping/xml/asset/logic/model'; +export * from './mapping/xml/asset/logic/particlesystem'; +export * from './mapping/xml/asset/manifest'; +export * from './mapping/xml/asset/visualization'; +export * from './mapping/xml/asset/visualization/animation'; +export * from './mapping/xml/asset/visualization/color'; +export * from './mapping/xml/effectmap'; +export * from './mapping/xml/figuredata'; +export * from './mapping/xml/figuremap'; +export * from './mapping/xml/furnituredata'; +export * from './utils'; diff --git a/src/common/mapping/index.ts b/src/common/mapping/index.ts new file mode 100644 index 0000000..3b699b8 --- /dev/null +++ b/src/common/mapping/index.ts @@ -0,0 +1,35 @@ +export * from './json'; +export * from './json/asset'; +export * from './json/asset/animation'; +export * from './json/asset/logic'; +export * from './json/asset/logic/model'; +export * from './json/asset/logic/particlesystem'; +export * from './json/asset/spritesheet'; +export * from './json/asset/visualization'; +export * from './json/asset/visualization/animation'; +export * from './json/asset/visualization/color'; +export * from './json/asset/visualization/gestures'; +export * from './json/asset/visualization/postures'; +export * from './json/effectmap'; +export * from './json/externaltexts'; +export * from './json/figuredata'; +export * from './json/figuremap'; +export * from './json/furnituredata'; +export * from './json/productdata'; +export * from './mappers'; +export * from './mappers/asset'; +export * from './xml'; +export * from './xml/asset'; +export * from './xml/asset/animation'; +export * from './xml/asset/assets'; +export * from './xml/asset/logic'; +export * from './xml/asset/logic/model'; +export * from './xml/asset/logic/particlesystem'; +export * from './xml/asset/manifest'; +export * from './xml/asset/visualization'; +export * from './xml/asset/visualization/animation'; +export * from './xml/asset/visualization/color'; +export * from './xml/effectmap'; +export * from './xml/figuredata'; +export * from './xml/figuremap'; +export * from './xml/furnituredata'; diff --git a/src/mapping/json/asset/IAsset.ts b/src/common/mapping/json/asset/IAsset.ts similarity index 100% rename from src/mapping/json/asset/IAsset.ts rename to src/common/mapping/json/asset/IAsset.ts diff --git a/src/mapping/json/asset/IAssetAlias.ts b/src/common/mapping/json/asset/IAssetAlias.ts similarity index 100% rename from src/mapping/json/asset/IAssetAlias.ts rename to src/common/mapping/json/asset/IAssetAlias.ts diff --git a/src/mapping/json/asset/IAssetData.ts b/src/common/mapping/json/asset/IAssetData.ts similarity index 100% rename from src/mapping/json/asset/IAssetData.ts rename to src/common/mapping/json/asset/IAssetData.ts diff --git a/src/mapping/json/asset/IAssetPalette.ts b/src/common/mapping/json/asset/IAssetPalette.ts similarity index 100% rename from src/mapping/json/asset/IAssetPalette.ts rename to src/common/mapping/json/asset/IAssetPalette.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimation.ts b/src/common/mapping/json/asset/animation/IAssetAnimation.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimation.ts rename to src/common/mapping/json/asset/animation/IAssetAnimation.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationAdd.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationAdd.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationAdd.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationAvatar.ts b/src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationAvatar.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationAvatar.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationDirection.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationDirection.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFrame.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFrame.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFrame.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePart.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFramePart.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePart.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts b/src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationFramePartItem.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationOverride.ts b/src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationOverride.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationOverride.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationRemove.ts b/src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationRemove.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationRemove.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationShadow.ts b/src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationShadow.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationShadow.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationSprite.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationSprite.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationSprite.ts diff --git a/src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts b/src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts similarity index 100% rename from src/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts rename to src/common/mapping/json/asset/animation/IAssetAnimationSpriteDirection.ts diff --git a/src/mapping/json/asset/animation/index.ts b/src/common/mapping/json/asset/animation/index.ts similarity index 100% rename from src/mapping/json/asset/animation/index.ts rename to src/common/mapping/json/asset/animation/index.ts diff --git a/src/mapping/json/asset/index.ts b/src/common/mapping/json/asset/index.ts similarity index 100% rename from src/mapping/json/asset/index.ts rename to src/common/mapping/json/asset/index.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicCustomVars.ts b/src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicCustomVars.ts rename to src/common/mapping/json/asset/logic/IAssetLogicCustomVars.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicData.ts b/src/common/mapping/json/asset/logic/IAssetLogicData.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicData.ts rename to src/common/mapping/json/asset/logic/IAssetLogicData.ts diff --git a/src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts b/src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts similarity index 100% rename from src/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts rename to src/common/mapping/json/asset/logic/IAssetLogicPlanetSystem.ts diff --git a/src/mapping/json/asset/logic/ISoundSample.ts b/src/common/mapping/json/asset/logic/ISoundSample.ts similarity index 100% rename from src/mapping/json/asset/logic/ISoundSample.ts rename to src/common/mapping/json/asset/logic/ISoundSample.ts diff --git a/src/mapping/json/asset/logic/index.ts b/src/common/mapping/json/asset/logic/index.ts similarity index 100% rename from src/mapping/json/asset/logic/index.ts rename to src/common/mapping/json/asset/logic/index.ts diff --git a/src/mapping/json/asset/logic/model/IAssetDimension.ts b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts similarity index 77% rename from src/mapping/json/asset/logic/model/IAssetDimension.ts rename to src/common/mapping/json/asset/logic/model/IAssetDimension.ts index 4a4629f..a467a03 100644 --- a/src/mapping/json/asset/logic/model/IAssetDimension.ts +++ b/src/common/mapping/json/asset/logic/model/IAssetDimension.ts @@ -3,4 +3,5 @@ export interface IAssetDimension x: number; y: number; z?: number; -} \ No newline at end of file + centerZ?: number; +} diff --git a/src/mapping/json/asset/logic/model/IAssetLogicModel.ts b/src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts similarity index 100% rename from src/mapping/json/asset/logic/model/IAssetLogicModel.ts rename to src/common/mapping/json/asset/logic/model/IAssetLogicModel.ts diff --git a/src/mapping/json/asset/logic/model/index.ts b/src/common/mapping/json/asset/logic/model/index.ts similarity index 100% rename from src/mapping/json/asset/logic/model/index.ts rename to src/common/mapping/json/asset/logic/model/index.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystem.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystem.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemEmitter.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemParticle.ts diff --git a/src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts b/src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts rename to src/common/mapping/json/asset/logic/particlesystem/IParticleSystemSimulation.ts diff --git a/src/mapping/json/asset/logic/particlesystem/index.ts b/src/common/mapping/json/asset/logic/particlesystem/index.ts similarity index 100% rename from src/mapping/json/asset/logic/particlesystem/index.ts rename to src/common/mapping/json/asset/logic/particlesystem/index.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetData.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetData.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetData.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetFrame.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetFrame.ts diff --git a/src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts b/src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/ISpritesheetMeta.ts rename to src/common/mapping/json/asset/spritesheet/ISpritesheetMeta.ts diff --git a/src/mapping/json/asset/spritesheet/index.ts b/src/common/mapping/json/asset/spritesheet/index.ts similarity index 100% rename from src/mapping/json/asset/spritesheet/index.ts rename to src/common/mapping/json/asset/spritesheet/index.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationData.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationData.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationData.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationDirection.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationDirection.ts diff --git a/src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts b/src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/IAssetVisualizationLayer.ts rename to src/common/mapping/json/asset/visualization/IAssetVisualizationLayer.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimation.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationLayer.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequence.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts diff --git a/src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts rename to src/common/mapping/json/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts diff --git a/src/mapping/json/asset/visualization/animation/index.ts b/src/common/mapping/json/asset/visualization/animation/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/animation/index.ts rename to src/common/mapping/json/asset/visualization/animation/index.ts diff --git a/src/mapping/json/asset/visualization/color/IAssetColor.ts b/src/common/mapping/json/asset/visualization/color/IAssetColor.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/IAssetColor.ts rename to src/common/mapping/json/asset/visualization/color/IAssetColor.ts diff --git a/src/mapping/json/asset/visualization/color/IAssetColorLayer.ts b/src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/IAssetColorLayer.ts rename to src/common/mapping/json/asset/visualization/color/IAssetColorLayer.ts diff --git a/src/mapping/json/asset/visualization/color/index.ts b/src/common/mapping/json/asset/visualization/color/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/color/index.ts rename to src/common/mapping/json/asset/visualization/color/index.ts diff --git a/src/mapping/json/asset/visualization/gestures/IAssetGesture.ts b/src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts similarity index 100% rename from src/mapping/json/asset/visualization/gestures/IAssetGesture.ts rename to src/common/mapping/json/asset/visualization/gestures/IAssetGesture.ts diff --git a/src/mapping/json/asset/visualization/gestures/index.ts b/src/common/mapping/json/asset/visualization/gestures/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/gestures/index.ts rename to src/common/mapping/json/asset/visualization/gestures/index.ts diff --git a/src/mapping/json/asset/visualization/index.ts b/src/common/mapping/json/asset/visualization/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/index.ts rename to src/common/mapping/json/asset/visualization/index.ts diff --git a/src/mapping/json/asset/visualization/postures/IAssetPosture.ts b/src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts similarity index 100% rename from src/mapping/json/asset/visualization/postures/IAssetPosture.ts rename to src/common/mapping/json/asset/visualization/postures/IAssetPosture.ts diff --git a/src/mapping/json/asset/visualization/postures/index.ts b/src/common/mapping/json/asset/visualization/postures/index.ts similarity index 100% rename from src/mapping/json/asset/visualization/postures/index.ts rename to src/common/mapping/json/asset/visualization/postures/index.ts diff --git a/src/mapping/json/effectmap/IEffectMap.ts b/src/common/mapping/json/effectmap/IEffectMap.ts similarity index 100% rename from src/mapping/json/effectmap/IEffectMap.ts rename to src/common/mapping/json/effectmap/IEffectMap.ts diff --git a/src/mapping/json/effectmap/IEffectMapLibrary.ts b/src/common/mapping/json/effectmap/IEffectMapLibrary.ts similarity index 100% rename from src/mapping/json/effectmap/IEffectMapLibrary.ts rename to src/common/mapping/json/effectmap/IEffectMapLibrary.ts diff --git a/src/mapping/json/effectmap/index.ts b/src/common/mapping/json/effectmap/index.ts similarity index 100% rename from src/mapping/json/effectmap/index.ts rename to src/common/mapping/json/effectmap/index.ts diff --git a/src/mapping/json/externaltexts/IExternalTexts.ts b/src/common/mapping/json/externaltexts/IExternalTexts.ts similarity index 100% rename from src/mapping/json/externaltexts/IExternalTexts.ts rename to src/common/mapping/json/externaltexts/IExternalTexts.ts diff --git a/src/mapping/json/externaltexts/index.ts b/src/common/mapping/json/externaltexts/index.ts similarity index 100% rename from src/mapping/json/externaltexts/index.ts rename to src/common/mapping/json/externaltexts/index.ts diff --git a/src/mapping/json/figuredata/IFigureData.ts b/src/common/mapping/json/figuredata/IFigureData.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureData.ts rename to src/common/mapping/json/figuredata/IFigureData.ts diff --git a/src/mapping/json/figuredata/IFigureDataColor.ts b/src/common/mapping/json/figuredata/IFigureDataColor.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataColor.ts rename to src/common/mapping/json/figuredata/IFigureDataColor.ts diff --git a/src/mapping/json/figuredata/IFigureDataHiddenLayer.ts b/src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataHiddenLayer.ts rename to src/common/mapping/json/figuredata/IFigureDataHiddenLayer.ts diff --git a/src/mapping/json/figuredata/IFigureDataPalette.ts b/src/common/mapping/json/figuredata/IFigureDataPalette.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataPalette.ts rename to src/common/mapping/json/figuredata/IFigureDataPalette.ts diff --git a/src/mapping/json/figuredata/IFigureDataPart.ts b/src/common/mapping/json/figuredata/IFigureDataPart.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataPart.ts rename to src/common/mapping/json/figuredata/IFigureDataPart.ts diff --git a/src/mapping/json/figuredata/IFigureDataSet.ts b/src/common/mapping/json/figuredata/IFigureDataSet.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataSet.ts rename to src/common/mapping/json/figuredata/IFigureDataSet.ts diff --git a/src/mapping/json/figuredata/IFigureDataSetType.ts b/src/common/mapping/json/figuredata/IFigureDataSetType.ts similarity index 100% rename from src/mapping/json/figuredata/IFigureDataSetType.ts rename to src/common/mapping/json/figuredata/IFigureDataSetType.ts diff --git a/src/mapping/json/figuredata/index.ts b/src/common/mapping/json/figuredata/index.ts similarity index 100% rename from src/mapping/json/figuredata/index.ts rename to src/common/mapping/json/figuredata/index.ts diff --git a/src/mapping/json/figuremap/IFigureMap.ts b/src/common/mapping/json/figuremap/IFigureMap.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMap.ts rename to src/common/mapping/json/figuremap/IFigureMap.ts diff --git a/src/mapping/json/figuremap/IFigureMapLibrary.ts b/src/common/mapping/json/figuremap/IFigureMapLibrary.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMapLibrary.ts rename to src/common/mapping/json/figuremap/IFigureMapLibrary.ts diff --git a/src/mapping/json/figuremap/IFigureMapLibraryPart.ts b/src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts similarity index 100% rename from src/mapping/json/figuremap/IFigureMapLibraryPart.ts rename to src/common/mapping/json/figuremap/IFigureMapLibraryPart.ts diff --git a/src/mapping/json/figuremap/index.ts b/src/common/mapping/json/figuremap/index.ts similarity index 100% rename from src/mapping/json/figuremap/index.ts rename to src/common/mapping/json/figuremap/index.ts diff --git a/src/mapping/json/furnituredata/IFurnitureData.ts b/src/common/mapping/json/furnituredata/IFurnitureData.ts similarity index 100% rename from src/mapping/json/furnituredata/IFurnitureData.ts rename to src/common/mapping/json/furnituredata/IFurnitureData.ts diff --git a/src/mapping/json/furnituredata/IFurnitureType.ts b/src/common/mapping/json/furnituredata/IFurnitureType.ts similarity index 100% rename from src/mapping/json/furnituredata/IFurnitureType.ts rename to src/common/mapping/json/furnituredata/IFurnitureType.ts diff --git a/src/mapping/json/furnituredata/index.ts b/src/common/mapping/json/furnituredata/index.ts similarity index 100% rename from src/mapping/json/furnituredata/index.ts rename to src/common/mapping/json/furnituredata/index.ts diff --git a/src/mapping/json/index.ts b/src/common/mapping/json/index.ts similarity index 100% rename from src/mapping/json/index.ts rename to src/common/mapping/json/index.ts diff --git a/src/mapping/json/productdata/IProductData.ts b/src/common/mapping/json/productdata/IProductData.ts similarity index 100% rename from src/mapping/json/productdata/IProductData.ts rename to src/common/mapping/json/productdata/IProductData.ts diff --git a/src/mapping/json/productdata/IProductType.ts b/src/common/mapping/json/productdata/IProductType.ts similarity index 100% rename from src/mapping/json/productdata/IProductType.ts rename to src/common/mapping/json/productdata/IProductType.ts diff --git a/src/mapping/json/productdata/index.ts b/src/common/mapping/json/productdata/index.ts similarity index 100% rename from src/mapping/json/productdata/index.ts rename to src/common/mapping/json/productdata/index.ts diff --git a/src/mapping/mappers/EffectMapMapper.ts b/src/common/mapping/mappers/EffectMapMapper.ts similarity index 97% rename from src/mapping/mappers/EffectMapMapper.ts rename to src/common/mapping/mappers/EffectMapMapper.ts index 712b69b..dea07a1 100644 --- a/src/mapping/mappers/EffectMapMapper.ts +++ b/src/common/mapping/mappers/EffectMapMapper.ts @@ -1,6 +1,6 @@ import { IEffectMap, IEffectMapLibrary } from '../json'; import { EffectMapEffectXML, EffectMapXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class EffectMapMapper extends Mapper { diff --git a/src/mapping/mappers/FigureDataMapper.ts b/src/common/mapping/mappers/FigureDataMapper.ts similarity index 85% rename from src/mapping/mappers/FigureDataMapper.ts rename to src/common/mapping/mappers/FigureDataMapper.ts index 8b50a40..71c2627 100644 --- a/src/mapping/mappers/FigureDataMapper.ts +++ b/src/common/mapping/mappers/FigureDataMapper.ts @@ -1,18 +1,6 @@ -import { IFigureDataHiddenLayer } from '../json'; -import { IFigureDataPalette } from '../json/figuredata/IFigureDataPalette'; -import { IFigureDataSet } from '../json/figuredata/IFigureDataSet'; -import { FigureDataHiddenLayerXML } from '../xml'; -import { FigureDataColorXML } from '../xml/figuredata/FigureDataColorXML'; -import { FigureDataPaletteXML } from '../xml/figuredata/FigureDataPaletteXML'; -import { FigureDataXML } from '../xml/figuredata/FigureDataXML'; -import { IFigureData } from './../json/figuredata/IFigureData'; -import { IFigureDataColor } from './../json/figuredata/IFigureDataColor'; -import { IFigureDataPart } from './../json/figuredata/IFigureDataPart'; -import { IFigureDataSetType } from './../json/figuredata/IFigureDataSetType'; -import { FigureDataPartXML } from './../xml/figuredata/FigureDataPartXML'; -import { FigureDataSetTypeXML } from './../xml/figuredata/FigureDataSetTypeXML'; -import { FigureDataSetXML } from './../xml/figuredata/FigureDataSetXML'; -import { Mapper } from './asset/Mapper'; +import { IFigureData, IFigureDataColor, IFigureDataHiddenLayer, IFigureDataPalette, IFigureDataPart, IFigureDataSet, IFigureDataSetType } from '../json'; +import { FigureDataColorXML, FigureDataHiddenLayerXML, FigureDataPaletteXML, FigureDataPartXML, FigureDataSetTypeXML, FigureDataSetXML, FigureDataXML } from '../xml'; +import { Mapper } from './asset'; export class FigureDataMapper extends Mapper { diff --git a/src/mapping/mappers/FigureMapMapper.ts b/src/common/mapping/mappers/FigureMapMapper.ts similarity index 98% rename from src/mapping/mappers/FigureMapMapper.ts rename to src/common/mapping/mappers/FigureMapMapper.ts index 5c7e8e7..daa8bc9 100644 --- a/src/mapping/mappers/FigureMapMapper.ts +++ b/src/common/mapping/mappers/FigureMapMapper.ts @@ -1,6 +1,6 @@ import { IFigureMap, IFigureMapLibrary, IFigureMapLibraryPart } from '../json'; import { FigureLibraryPartXML, FigureLibraryXML, FigureMapXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class FigureMapMapper extends Mapper { diff --git a/src/mapping/mappers/FurnitureDataMapper.ts b/src/common/mapping/mappers/FurnitureDataMapper.ts similarity index 98% rename from src/mapping/mappers/FurnitureDataMapper.ts rename to src/common/mapping/mappers/FurnitureDataMapper.ts index 2a45c40..5387840 100644 --- a/src/mapping/mappers/FurnitureDataMapper.ts +++ b/src/common/mapping/mappers/FurnitureDataMapper.ts @@ -1,6 +1,6 @@ import { IFurnitureData, IFurnitureType } from '../json'; import { FurnitureDataXML, FurnitureTypeXML } from '../xml'; -import { Mapper } from './asset/Mapper'; +import { Mapper } from './asset'; export class FurnitureDataMapper extends Mapper { diff --git a/src/mapping/mappers/asset/AnimationMapper.ts b/src/common/mapping/mappers/asset/AnimationMapper.ts similarity index 100% rename from src/mapping/mappers/asset/AnimationMapper.ts rename to src/common/mapping/mappers/asset/AnimationMapper.ts diff --git a/src/mapping/mappers/asset/AssetMapper.ts b/src/common/mapping/mappers/asset/AssetMapper.ts similarity index 89% rename from src/mapping/mappers/asset/AssetMapper.ts rename to src/common/mapping/mappers/asset/AssetMapper.ts index 4ebc586..f889ac4 100644 --- a/src/mapping/mappers/asset/AssetMapper.ts +++ b/src/common/mapping/mappers/asset/AssetMapper.ts @@ -1,4 +1,4 @@ -import { BundleProvider } from '../../../common/bundle/BundleProvider'; +import { IMAGE_SOURCES } from '../../../../swf'; import { IAsset, IAssetData, IAssetPalette } from '../../json'; import { AssetsXML, AssetXML, PaletteXML } from '../../xml'; import { Mapper } from './Mapper'; @@ -55,12 +55,12 @@ export class AssetMapper extends Mapper { asset.source = assetXML.source; - if(BundleProvider.imageSource.has(assetXML.source)) asset.source = BundleProvider.imageSource.get(assetXML.source) as string; + if(IMAGE_SOURCES.has(assetXML.source)) asset.source = IMAGE_SOURCES.get(assetXML.source) as string; } if(assetXML.name !== undefined) { - if(BundleProvider.imageSource.has(assetXML.name)) asset.source = BundleProvider.imageSource.get(assetXML.name) as string; + if(IMAGE_SOURCES.has(assetXML.name)) asset.source = IMAGE_SOURCES.get(assetXML.name) as string; } if(assetXML.x !== undefined) asset.x = assetXML.x; diff --git a/src/mapping/mappers/asset/IndexMapper.ts b/src/common/mapping/mappers/asset/IndexMapper.ts similarity index 100% rename from src/mapping/mappers/asset/IndexMapper.ts rename to src/common/mapping/mappers/asset/IndexMapper.ts diff --git a/src/mapping/mappers/asset/LogicMapper.ts b/src/common/mapping/mappers/asset/LogicMapper.ts similarity index 96% rename from src/mapping/mappers/asset/LogicMapper.ts rename to src/common/mapping/mappers/asset/LogicMapper.ts index 8d29529..ff3f6cf 100644 --- a/src/mapping/mappers/asset/LogicMapper.ts +++ b/src/common/mapping/mappers/asset/LogicMapper.ts @@ -25,9 +25,12 @@ export class LogicMapper extends Mapper { output.model.dimensions = { x: xml.model.dimensions.x, - y: xml.model.dimensions.y, - z: xml.model.dimensions.z + y: xml.model.dimensions.y }; + + if(xml.model.dimensions.z !== undefined) output.model.dimensions.z = xml.model.dimensions.z; + + if(xml.model.dimensions.centerZ !== undefined) output.model.dimensions.centerZ = xml.model.dimensions.centerZ; } if(xml.model.directions !== undefined) diff --git a/src/mapping/mappers/asset/ManifestMapper.ts b/src/common/mapping/mappers/asset/ManifestMapper.ts similarity index 93% rename from src/mapping/mappers/asset/ManifestMapper.ts rename to src/common/mapping/mappers/asset/ManifestMapper.ts index bd26d3a..afc4cd7 100644 --- a/src/mapping/mappers/asset/ManifestMapper.ts +++ b/src/common/mapping/mappers/asset/ManifestMapper.ts @@ -1,4 +1,4 @@ -import { BundleProvider } from '../../../common/bundle/BundleProvider'; +import { IMAGE_SOURCES } from '../../../../swf'; import { IAsset, IAssetAlias, IAssetData } from '../../json'; import { ManifestLibraryAliasXML, ManifestLibraryAssetParamXML, ManifestLibraryAssetXML, ManifestLibraryXML, ManifestXML } from '../../xml'; import { Mapper } from './Mapper'; @@ -60,7 +60,7 @@ export class ManifestMapper extends Mapper if(libraryAssetXML.param !== undefined) ManifestMapper.mapManifestLibraryAssetParamXML(libraryAssetXML.param, asset); - if(BundleProvider.imageSource.has(libraryAssetXML.name)) asset.source = BundleProvider.imageSource.get(libraryAssetXML.name); + if(IMAGE_SOURCES.has(libraryAssetXML.name)) asset.source = IMAGE_SOURCES.get(libraryAssetXML.name); output[libraryAssetXML.name] = asset; } diff --git a/src/mapping/mappers/asset/Mapper.ts b/src/common/mapping/mappers/asset/Mapper.ts similarity index 100% rename from src/mapping/mappers/asset/Mapper.ts rename to src/common/mapping/mappers/asset/Mapper.ts diff --git a/src/mapping/mappers/asset/VisualizationMapper.ts b/src/common/mapping/mappers/asset/VisualizationMapper.ts similarity index 100% rename from src/mapping/mappers/asset/VisualizationMapper.ts rename to src/common/mapping/mappers/asset/VisualizationMapper.ts diff --git a/src/mapping/mappers/asset/index.ts b/src/common/mapping/mappers/asset/index.ts similarity index 100% rename from src/mapping/mappers/asset/index.ts rename to src/common/mapping/mappers/asset/index.ts diff --git a/src/mapping/mappers/index.ts b/src/common/mapping/mappers/index.ts similarity index 100% rename from src/mapping/mappers/index.ts rename to src/common/mapping/mappers/index.ts diff --git a/src/mapping/xml/asset/IndexXML.ts b/src/common/mapping/xml/asset/IndexXML.ts similarity index 100% rename from src/mapping/xml/asset/IndexXML.ts rename to src/common/mapping/xml/asset/IndexXML.ts diff --git a/src/mapping/xml/asset/animation/AddXML.ts b/src/common/mapping/xml/asset/animation/AddXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/AddXML.ts rename to src/common/mapping/xml/asset/animation/AddXML.ts diff --git a/src/mapping/xml/asset/animation/AvatarXML.ts b/src/common/mapping/xml/asset/animation/AvatarXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/AvatarXML.ts rename to src/common/mapping/xml/asset/animation/AvatarXML.ts diff --git a/src/mapping/xml/asset/animation/DirectionOffsetXML.ts b/src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/DirectionOffsetXML.ts rename to src/common/mapping/xml/asset/animation/DirectionOffsetXML.ts diff --git a/src/mapping/xml/asset/animation/DirectionXML.ts b/src/common/mapping/xml/asset/animation/DirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/DirectionXML.ts rename to src/common/mapping/xml/asset/animation/DirectionXML.ts diff --git a/src/mapping/xml/asset/animation/EffectAnimationXML.ts b/src/common/mapping/xml/asset/animation/EffectAnimationXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectAnimationXML.ts rename to src/common/mapping/xml/asset/animation/EffectAnimationXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFramePartItemXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFramePartItemXML.ts rename to src/common/mapping/xml/asset/animation/EffectFramePartItemXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFramePartXML.ts b/src/common/mapping/xml/asset/animation/EffectFramePartXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFramePartXML.ts rename to src/common/mapping/xml/asset/animation/EffectFramePartXML.ts diff --git a/src/mapping/xml/asset/animation/EffectFrameXML.ts b/src/common/mapping/xml/asset/animation/EffectFrameXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/EffectFrameXML.ts rename to src/common/mapping/xml/asset/animation/EffectFrameXML.ts diff --git a/src/mapping/xml/asset/animation/OverrideXML.ts b/src/common/mapping/xml/asset/animation/OverrideXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/OverrideXML.ts rename to src/common/mapping/xml/asset/animation/OverrideXML.ts diff --git a/src/mapping/xml/asset/animation/RemoveXML.ts b/src/common/mapping/xml/asset/animation/RemoveXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/RemoveXML.ts rename to src/common/mapping/xml/asset/animation/RemoveXML.ts diff --git a/src/mapping/xml/asset/animation/ShadowXML.ts b/src/common/mapping/xml/asset/animation/ShadowXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/ShadowXML.ts rename to src/common/mapping/xml/asset/animation/ShadowXML.ts diff --git a/src/mapping/xml/asset/animation/SpriteXML.ts b/src/common/mapping/xml/asset/animation/SpriteXML.ts similarity index 100% rename from src/mapping/xml/asset/animation/SpriteXML.ts rename to src/common/mapping/xml/asset/animation/SpriteXML.ts diff --git a/src/mapping/xml/asset/animation/index.ts b/src/common/mapping/xml/asset/animation/index.ts similarity index 100% rename from src/mapping/xml/asset/animation/index.ts rename to src/common/mapping/xml/asset/animation/index.ts diff --git a/src/mapping/xml/asset/index.ts b/src/common/mapping/xml/asset/index.ts similarity index 100% rename from src/mapping/xml/asset/index.ts rename to src/common/mapping/xml/asset/index.ts diff --git a/src/mapping/xml/asset/logic/ActionXML.ts b/src/common/mapping/xml/asset/logic/ActionXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/ActionXML.ts rename to src/common/mapping/xml/asset/logic/ActionXML.ts diff --git a/src/mapping/xml/asset/logic/CreditsXML.ts b/src/common/mapping/xml/asset/logic/CreditsXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/CreditsXML.ts rename to src/common/mapping/xml/asset/logic/CreditsXML.ts diff --git a/src/mapping/xml/asset/logic/CustomVarsXML.ts b/src/common/mapping/xml/asset/logic/CustomVarsXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/CustomVarsXML.ts rename to src/common/mapping/xml/asset/logic/CustomVarsXML.ts diff --git a/src/mapping/xml/asset/logic/LogicXML.ts b/src/common/mapping/xml/asset/logic/LogicXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/LogicXML.ts rename to src/common/mapping/xml/asset/logic/LogicXML.ts diff --git a/src/mapping/xml/asset/logic/MaskXML.ts b/src/common/mapping/xml/asset/logic/MaskXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/MaskXML.ts rename to src/common/mapping/xml/asset/logic/MaskXML.ts diff --git a/src/mapping/xml/asset/logic/PlanetSystemXML.ts b/src/common/mapping/xml/asset/logic/PlanetSystemXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/PlanetSystemXML.ts rename to src/common/mapping/xml/asset/logic/PlanetSystemXML.ts diff --git a/src/mapping/xml/asset/logic/SoundSampleXML.ts b/src/common/mapping/xml/asset/logic/SoundSampleXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/SoundSampleXML.ts rename to src/common/mapping/xml/asset/logic/SoundSampleXML.ts diff --git a/src/mapping/xml/asset/logic/index.ts b/src/common/mapping/xml/asset/logic/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/index.ts rename to src/common/mapping/xml/asset/logic/index.ts diff --git a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts similarity index 59% rename from src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts index 2507c6a..a04fb6a 100644 --- a/src/mapping/xml/asset/logic/model/ModelDimensionsXML.ts +++ b/src/common/mapping/xml/asset/logic/model/ModelDimensionsXML.ts @@ -3,6 +3,7 @@ export class ModelDimensionsXML private readonly _x: number; private readonly _y: number; private readonly _z: number; + private readonly _centerZ: number; constructor(xml: any) { @@ -10,9 +11,10 @@ export class ModelDimensionsXML if(attributes !== undefined) { - if(attributes.x !== undefined) this._x = parseInt(attributes.x); - if(attributes.y !== undefined) this._y = parseInt(attributes.y); + if(attributes.x !== undefined) this._x = parseFloat(attributes.x); + if(attributes.y !== undefined) this._y = parseFloat(attributes.y); if(attributes.z !== undefined) this._z = parseFloat(attributes.z); + if(attributes.centerZ !== undefined) this._centerZ = parseFloat(attributes.centerZ); } } @@ -30,4 +32,9 @@ export class ModelDimensionsXML { return this._z; } + + public get centerZ(): number + { + return this._centerZ; + } } diff --git a/src/mapping/xml/asset/logic/model/ModelDirectionXML.ts b/src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/ModelDirectionXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelDirectionXML.ts diff --git a/src/mapping/xml/asset/logic/model/ModelXML.ts b/src/common/mapping/xml/asset/logic/model/ModelXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/ModelXML.ts rename to src/common/mapping/xml/asset/logic/model/ModelXML.ts diff --git a/src/mapping/xml/asset/logic/model/index.ts b/src/common/mapping/xml/asset/logic/model/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/model/index.ts rename to src/common/mapping/xml/asset/logic/model/index.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemEmitterXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemObjectXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemParticleXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemSimulationXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/ParticleSystemXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts b/src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts rename to src/common/mapping/xml/asset/logic/particlesystem/PlanetSystemObjectXML.ts diff --git a/src/mapping/xml/asset/logic/particlesystem/index.ts b/src/common/mapping/xml/asset/logic/particlesystem/index.ts similarity index 100% rename from src/mapping/xml/asset/logic/particlesystem/index.ts rename to src/common/mapping/xml/asset/logic/particlesystem/index.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAliasXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetParamXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryAssetXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestLibraryXML.ts b/src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestLibraryXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestLibraryXML.ts diff --git a/src/mapping/xml/asset/manifest/ManifestXML.ts b/src/common/mapping/xml/asset/manifest/ManifestXML.ts similarity index 100% rename from src/mapping/xml/asset/manifest/ManifestXML.ts rename to src/common/mapping/xml/asset/manifest/ManifestXML.ts diff --git a/src/mapping/xml/asset/manifest/index.ts b/src/common/mapping/xml/asset/manifest/index.ts similarity index 100% rename from src/mapping/xml/asset/manifest/index.ts rename to src/common/mapping/xml/asset/manifest/index.ts diff --git a/src/mapping/xml/asset/visualization/GestureXML.ts b/src/common/mapping/xml/asset/visualization/GestureXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/GestureXML.ts rename to src/common/mapping/xml/asset/visualization/GestureXML.ts diff --git a/src/mapping/xml/asset/visualization/LayerXML.ts b/src/common/mapping/xml/asset/visualization/LayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/LayerXML.ts rename to src/common/mapping/xml/asset/visualization/LayerXML.ts diff --git a/src/mapping/xml/asset/visualization/PostureXML.ts b/src/common/mapping/xml/asset/visualization/PostureXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/PostureXML.ts rename to src/common/mapping/xml/asset/visualization/PostureXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualDirectionXML.ts b/src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualDirectionXML.ts rename to src/common/mapping/xml/asset/visualization/VisualDirectionXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualizationDataXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualizationDataXML.ts rename to src/common/mapping/xml/asset/visualization/VisualizationDataXML.ts diff --git a/src/mapping/xml/asset/visualization/VisualizationXML.ts b/src/common/mapping/xml/asset/visualization/VisualizationXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/VisualizationXML.ts rename to src/common/mapping/xml/asset/visualization/VisualizationXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts rename to src/common/mapping/xml/asset/visualization/animation/AnimationLayerXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/AnimationXML.ts b/src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/AnimationXML.ts rename to src/common/mapping/xml/asset/visualization/animation/AnimationXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameOffsetXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameSequenceXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/FrameXML.ts b/src/common/mapping/xml/asset/visualization/animation/FrameXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/FrameXML.ts rename to src/common/mapping/xml/asset/visualization/animation/FrameXML.ts diff --git a/src/mapping/xml/asset/visualization/animation/index.ts b/src/common/mapping/xml/asset/visualization/animation/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/animation/index.ts rename to src/common/mapping/xml/asset/visualization/animation/index.ts diff --git a/src/mapping/xml/asset/visualization/color/ColorLayerXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/ColorLayerXML.ts rename to src/common/mapping/xml/asset/visualization/color/ColorLayerXML.ts diff --git a/src/mapping/xml/asset/visualization/color/ColorXML.ts b/src/common/mapping/xml/asset/visualization/color/ColorXML.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/ColorXML.ts rename to src/common/mapping/xml/asset/visualization/color/ColorXML.ts diff --git a/src/mapping/xml/asset/visualization/color/index.ts b/src/common/mapping/xml/asset/visualization/color/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/color/index.ts rename to src/common/mapping/xml/asset/visualization/color/index.ts diff --git a/src/mapping/xml/asset/visualization/index.ts b/src/common/mapping/xml/asset/visualization/index.ts similarity index 100% rename from src/mapping/xml/asset/visualization/index.ts rename to src/common/mapping/xml/asset/visualization/index.ts diff --git a/src/mapping/xml/effectmap/EffectMapEffectXML.ts b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts similarity index 95% rename from src/mapping/xml/effectmap/EffectMapEffectXML.ts rename to src/common/mapping/xml/effectmap/EffectMapEffectXML.ts index f48d8d0..735519d 100644 --- a/src/mapping/xml/effectmap/EffectMapEffectXML.ts +++ b/src/common/mapping/xml/effectmap/EffectMapEffectXML.ts @@ -1,41 +1,41 @@ - -export class EffectMapEffectXML -{ - private _id: string; - private _lib: string; - private _type: string; - private _revision: number; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = attributes.id; - if(attributes.lib !== undefined) this._lib = attributes.lib; - if(attributes.type !== undefined) this._type = attributes.type; - if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); - } - } - - public get id(): string - { - return this._id; - } - - public get lib(): string - { - return this._lib; - } - - public get type(): string - { - return this._type; - } - - public get revision(): number - { - return this._revision; - } -} + +export class EffectMapEffectXML +{ + private _id: string; + private _lib: string; + private _type: string; + private _revision: number; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.lib !== undefined) this._lib = attributes.lib; + if(attributes.type !== undefined) this._type = attributes.type; + if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); + } + } + + public get id(): string + { + return this._id; + } + + public get lib(): string + { + return this._lib; + } + + public get type(): string + { + return this._type; + } + + public get revision(): number + { + return this._revision; + } +} diff --git a/src/mapping/xml/effectmap/EffectMapXML.ts b/src/common/mapping/xml/effectmap/EffectMapXML.ts similarity index 100% rename from src/mapping/xml/effectmap/EffectMapXML.ts rename to src/common/mapping/xml/effectmap/EffectMapXML.ts diff --git a/src/mapping/xml/effectmap/index.ts b/src/common/mapping/xml/effectmap/index.ts similarity index 100% rename from src/mapping/xml/effectmap/index.ts rename to src/common/mapping/xml/effectmap/index.ts diff --git a/src/mapping/xml/figuredata/FigureDataColorXML.ts b/src/common/mapping/xml/figuredata/FigureDataColorXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataColorXML.ts rename to src/common/mapping/xml/figuredata/FigureDataColorXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts b/src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts rename to src/common/mapping/xml/figuredata/FigureDataHiddenLayerXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataPaletteXML.ts b/src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataPaletteXML.ts rename to src/common/mapping/xml/figuredata/FigureDataPaletteXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataPartXML.ts b/src/common/mapping/xml/figuredata/FigureDataPartXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataPartXML.ts rename to src/common/mapping/xml/figuredata/FigureDataPartXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataSetTypeXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataSetTypeXML.ts rename to src/common/mapping/xml/figuredata/FigureDataSetTypeXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataSetXML.ts b/src/common/mapping/xml/figuredata/FigureDataSetXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataSetXML.ts rename to src/common/mapping/xml/figuredata/FigureDataSetXML.ts diff --git a/src/mapping/xml/figuredata/FigureDataXML.ts b/src/common/mapping/xml/figuredata/FigureDataXML.ts similarity index 100% rename from src/mapping/xml/figuredata/FigureDataXML.ts rename to src/common/mapping/xml/figuredata/FigureDataXML.ts diff --git a/src/mapping/xml/figuredata/index.ts b/src/common/mapping/xml/figuredata/index.ts similarity index 100% rename from src/mapping/xml/figuredata/index.ts rename to src/common/mapping/xml/figuredata/index.ts diff --git a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts similarity index 95% rename from src/mapping/xml/figuremap/FigureLibraryPartXML.ts rename to src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts index 964ae29..11c62f4 100644 --- a/src/mapping/xml/figuremap/FigureLibraryPartXML.ts +++ b/src/common/mapping/xml/figuremap/FigureLibraryPartXML.ts @@ -1,26 +1,26 @@ -export class FigureLibraryPartXML -{ - private _id: number; - private _type: string; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = parseInt(attributes.id); - if(attributes.type !== undefined) this._type = attributes.type; - } - } - - public get id(): number - { - return this._id; - } - - public get type(): string - { - return this._type; - } -} +export class FigureLibraryPartXML +{ + private _id: number; + private _type: string; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = parseInt(attributes.id); + if(attributes.type !== undefined) this._type = attributes.type; + } + } + + public get id(): number + { + return this._id; + } + + public get type(): string + { + return this._type; + } +} diff --git a/src/mapping/xml/figuremap/FigureLibraryXML.ts b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts similarity index 95% rename from src/mapping/xml/figuremap/FigureLibraryXML.ts rename to src/common/mapping/xml/figuremap/FigureLibraryXML.ts index 3522491..487da09 100644 --- a/src/mapping/xml/figuremap/FigureLibraryXML.ts +++ b/src/common/mapping/xml/figuremap/FigureLibraryXML.ts @@ -1,49 +1,49 @@ -import { FigureLibraryPartXML } from './FigureLibraryPartXML'; - -export class FigureLibraryXML -{ - private _id: string; - private _revision: number; - private _parts: FigureLibraryPartXML[]; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = attributes.id; - if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); - } - - if(xml.part !== undefined) - { - if(Array.isArray(xml.part)) - { - this._parts = []; - - for(const partId in xml.part) - { - const part = xml.part[partId]; - - this._parts.push(new FigureLibraryPartXML(part)); - } - } - } - } - - public get id(): string - { - return this._id; - } - - public get revision(): number - { - return this._revision; - } - - public get parts(): FigureLibraryPartXML[] - { - return this._parts; - } -} +import { FigureLibraryPartXML } from './FigureLibraryPartXML'; + +export class FigureLibraryXML +{ + private _id: string; + private _revision: number; + private _parts: FigureLibraryPartXML[]; + + constructor(xml: any) + { + const attributes = xml.$; + + if(attributes) + { + if(attributes.id !== undefined) this._id = attributes.id; + if(attributes.revision !== undefined) this._revision = parseInt(attributes.revision); + } + + if(xml.part !== undefined) + { + if(Array.isArray(xml.part)) + { + this._parts = []; + + for(const partId in xml.part) + { + const part = xml.part[partId]; + + this._parts.push(new FigureLibraryPartXML(part)); + } + } + } + } + + public get id(): string + { + return this._id; + } + + public get revision(): number + { + return this._revision; + } + + public get parts(): FigureLibraryPartXML[] + { + return this._parts; + } +} diff --git a/src/mapping/xml/figuremap/FigureMapXML.ts b/src/common/mapping/xml/figuremap/FigureMapXML.ts similarity index 100% rename from src/mapping/xml/figuremap/FigureMapXML.ts rename to src/common/mapping/xml/figuremap/FigureMapXML.ts diff --git a/src/mapping/xml/figuremap/index.ts b/src/common/mapping/xml/figuremap/index.ts similarity index 100% rename from src/mapping/xml/figuremap/index.ts rename to src/common/mapping/xml/figuremap/index.ts diff --git a/src/mapping/xml/furnituredata/FurnitureDataXML.ts b/src/common/mapping/xml/furnituredata/FurnitureDataXML.ts similarity index 100% rename from src/mapping/xml/furnituredata/FurnitureDataXML.ts rename to src/common/mapping/xml/furnituredata/FurnitureDataXML.ts diff --git a/src/mapping/xml/furnituredata/FurnitureTypeXML.ts b/src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts similarity index 100% rename from src/mapping/xml/furnituredata/FurnitureTypeXML.ts rename to src/common/mapping/xml/furnituredata/FurnitureTypeXML.ts diff --git a/src/mapping/xml/furnituredata/index.ts b/src/common/mapping/xml/furnituredata/index.ts similarity index 100% rename from src/mapping/xml/furnituredata/index.ts rename to src/common/mapping/xml/furnituredata/index.ts diff --git a/src/mapping/xml/index.ts b/src/common/mapping/xml/index.ts similarity index 100% rename from src/mapping/xml/index.ts rename to src/common/mapping/xml/index.ts diff --git a/src/common/utils/BinaryReader.ts b/src/common/utils/BinaryReader.ts new file mode 100644 index 0000000..60869c5 --- /dev/null +++ b/src/common/utils/BinaryReader.ts @@ -0,0 +1,62 @@ +export class BinaryReader +{ + private _position: number; + private _dataView: DataView; + + constructor(buffer: ArrayBuffer) + { + this._position = 0; + this._dataView = new DataView(buffer); + } + + public readByte(): number + { + const byte = this._dataView.getInt8(this._position); + + this._position++; + + return byte; + } + + public readBytes(length: number): BinaryReader + { + const buffer = new BinaryReader(this._dataView.buffer.slice(this._position, this._position + length)); + + this._position += length; + + return buffer; + } + + public readShort(): number + { + const short = this._dataView.getInt16(this._position); + + this._position += 2; + + return short; + } + + public readInt(): number + { + const int = this._dataView.getInt32(this._position); + + this._position += 4; + + return int; + } + + public remaining(): number + { + return this._dataView.byteLength - this._position; + } + + public toString(encoding?: string): string + { + return new TextDecoder().decode(this._dataView.buffer); + } + + public toArrayBuffer(): ArrayBuffer + { + return this._dataView.buffer; + } +} diff --git a/src/utils/CustomIterator.ts b/src/common/utils/CustomIterator.ts similarity index 97% rename from src/utils/CustomIterator.ts rename to src/common/utils/CustomIterator.ts index 72abc2f..1e8f37d 100644 --- a/src/utils/CustomIterator.ts +++ b/src/common/utils/CustomIterator.ts @@ -1,6 +1,5 @@ -export default class CustomIterator +export class CustomIterator { - private idx: number; private readonly top: number; private readonly keys: Array; diff --git a/src/common/utils/File.ts b/src/common/utils/File.ts new file mode 100644 index 0000000..9ba26fc --- /dev/null +++ b/src/common/utils/File.ts @@ -0,0 +1,101 @@ +import { existsSync } from 'fs'; +import { lstat, mkdir, readdir, readFile, writeFile } from 'fs/promises'; + +export class File +{ + constructor(private readonly _path: string) + {} + + public async createDirectory(): Promise + { + try + { + await mkdir(this._path, { recursive: true }); + + return true; + } + + catch (error) + { + if(error.code && (error.code === 'EEXISTS')) return true; + + console.error(error); + + return false; + } + } + + public exists(): boolean + { + if(existsSync(this._path)) return true; + + return false; + } + + public async getFileList(): Promise + { + try + { + return await readdir(this._path); + } + + catch (error) + { + console.error(error); + + return null; + } + } + + public async isDirectory(): Promise + { + try + { + return (await lstat(this._path)).isDirectory(); + } + + catch (error) + { + console.error(error); + + return false; + } + } + + public async getContentsAsBuffer(): Promise + { + try + { + return await readFile(this._path); + } + + catch (error) + { + console.error(error); + + return null; + } + } + + public async writeData(data: string | Uint8Array): Promise + { + try + { + await writeFile(this._path, data); + + return true; + } + + catch (error) + { + console.error(error); + + return false; + } + } + + public get path(): string + { + return this._path; + } +} diff --git a/src/utils/FileUtilities.ts b/src/common/utils/FileUtilities.ts similarity index 68% rename from src/utils/FileUtilities.ts rename to src/common/utils/FileUtilities.ts index 4917252..1cab562 100644 --- a/src/utils/FileUtilities.ts +++ b/src/common/utils/FileUtilities.ts @@ -1,24 +1,14 @@ -import { readFile } from 'fs'; +import { readFile } from 'fs/promises'; import * as fetch from 'node-fetch'; -import { promisify } from 'util'; import { File } from './File'; -const readFileAsync = promisify(readFile); - export class FileUtilities { - public static getDirectory(baseFolderPath: string, childFolderName: string = null): File + public static async getDirectory(path: string): Promise { - let folder = new File(baseFolderPath); + const folder = new File(path); - if(!folder.isDirectory()) folder.mkdirs(); - - if(childFolderName) - { - folder = new File(folder.path + childFolderName); - - if(!folder.isDirectory()) folder.mkdirs(); - } + await folder.createDirectory(); return folder; } @@ -42,7 +32,7 @@ export class FileUtilities } else { - content = await readFileAsync(url); + content = await readFile(url); } return content; @@ -65,7 +55,7 @@ export class FileUtilities } else { - const data = await readFileAsync(url); + const data = await readFile(url); content = data.toString('utf-8'); } diff --git a/src/utils/SlicedToArray.ts b/src/common/utils/SlicedToArray.ts similarity index 53% rename from src/utils/SlicedToArray.ts rename to src/common/utils/SlicedToArray.ts index ba0c681..863cc01 100644 --- a/src/utils/SlicedToArray.ts +++ b/src/common/utils/SlicedToArray.ts @@ -4,7 +4,7 @@ export class SlicedToArray { if(Array.isArray(arr)) return arr; - if(Symbol.iterator in Object(arr)) return SlicedToArray.sliceIterator(arr, i); + if(Symbol.iterator in Object(arr)) return this.sliceIterator(arr, i); throw new TypeError('Invalid attempt to destructure non-iterable instance'); } @@ -13,37 +13,27 @@ export class SlicedToArray { const _arr = []; + let _i = null; + let _s = null; let _n = true; - let _d = false; - let _e = undefined; try { - for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) + for(_i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if(i && _arr.length === i) break; } + + if(!_n && _i['return']) _i['return'](); } catch (err) { - _d = true; - _e = err; - } + if(!_n && _i['return']) _i['return'](); - finally - { - try - { - if(!_n && _i['return']) _i['return'](); - } - - finally - { - if(_d) throw _e; - } + throw err; } return _arr; diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts new file mode 100644 index 0000000..7299482 --- /dev/null +++ b/src/common/utils/index.ts @@ -0,0 +1,5 @@ +export * from './BinaryReader'; +export * from './CustomIterator'; +export * from './File'; +export * from './FileUtilities'; +export * from './SlicedToArray'; diff --git a/src/configuration.json.example b/src/configuration.json.example index 27521c3..c7ae69d 100644 --- a/src/configuration.json.example +++ b/src/configuration.json.example @@ -1,5 +1,4 @@ { - "output.folder": "C:/nitro-converted-assets/", "flash.client.url": "", "furnidata.load.url": "", "productdata.load.url": "", @@ -12,10 +11,11 @@ "flash.dynamic.download.url": "", "dynamic.download.furniture.url": "${flash.dynamic.download.url}%revision%/%className%.swf", "external.variables.url": "https://www.habbo.com/gamedata/external_variables/1", - "external.texts.url": "", - "convert.figure": "0", - "convert.effect": "0", - "convert.furniture": "0", - "convert.pet": "0", - "misc.log_download_urls": "0" + "external.texts.url": "${external.texts.txt}", + "convert.figure": "1", + "convert.effect": "1", + "convert.furniture": "1", + "convert.furniture.floor.only": "0", + "convert.furniture.wall.only": "0", + "convert.pet": "1" } diff --git a/src/converters/EffectConverter.ts b/src/converters/EffectConverter.ts index c495b4d..1398d32 100644 --- a/src/converters/EffectConverter.ts +++ b/src/converters/EffectConverter.ts @@ -1,28 +1,21 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, File, FileUtilities, IConverter } from '../common'; +import { GenerateEffectBundle, SWFDownloader } from '../swf'; import { EffectMapConverter } from './EffectMapConverter'; @singleton() -export class EffectConverter extends Converter +export class EffectConverter implements IConverter { public effectTypes: Map = new Map(); constructor( private readonly _effectMapConverter: EffectMapConverter, private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { if(!this._configuration.getBoolean('convert.effect')) return; @@ -30,7 +23,7 @@ export class EffectConverter extends Converter const spinner = ora('Preparing Effects').start(); const baseUrl = this._configuration.getValue('dynamic.download.effect.url'); const effectMap = this._effectMapConverter.effectMap; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'effect'); + const directory = await FileUtilities.getDirectory('./assets/bundled/effect'); const classNames: string[] = []; @@ -48,60 +41,51 @@ export class EffectConverter extends Converter } } - for(const className of classNames) + if(classNames) { - try + const totalClassNames = classNames.length; + + for(let i = 0; i < totalClassNames; i++) { - const path = new File(directory.path + '/' + className + '.nitro'); + const className = classNames[i]; - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) + try { - spinner.text = 'Couldnt convert effect: ' + className; + const path = new File(directory.path + '/' + className + '.nitro'); + if(path.exists()) continue; + + spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`; spinner.render(); + const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); + + if(!habboAssetSWF) + { + console.log(); + console.error(`Invalid SWF: ${ className }`); + + continue; + } + + const nitroBundle = await GenerateEffectBundle(habboAssetSWF, className, this.effectTypes.get(className)); + + await writeFile(path.path, await nitroBundle.toBufferAsync()); + + spinner.text = 'Converted: ' + className; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Converting: ${ className } - ${ error.message }`); + continue; } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className); - - if(assetData) - { - assetData.name = className; - assetData.type = this.effectTypes.get(className); - } - - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; } } - console.log(); - spinner.succeed(`Effects finished in ${ Date.now() - now }ms`); + spinner.succeed(`Effects: Finished in ${ Date.now() - now }ms`); } } diff --git a/src/converters/EffectMapConverter.ts b/src/converters/EffectMapConverter.ts index 35210fb..a13aa57 100644 --- a/src/converters/EffectMapConverter.ts +++ b/src/converters/EffectMapConverter.ts @@ -1,48 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IEffectMap } from '../mapping/json'; -import { EffectMapMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, EffectMapMapper, FileUtilities, IConverter, IEffectMap } from '../common'; @singleton() -export class EffectMapConverter extends Converter +export class EffectMapConverter implements IConverter { public effectMap: IEffectMap = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing EffectMap').start(); const url = this._configuration.getValue('effectmap.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this.effectMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.effectMap = await this.mapXML2JSON(xml); - } - else - { - this.effectMap = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/EffectMap.json'; await writeFile(path, JSON.stringify(this.effectMap), 'utf8'); - spinner.succeed(`EffectMap finished in ${ Date.now() - now }ms`); + spinner.succeed(`EffectMap: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise diff --git a/src/converters/ExternalTextsConverter.ts b/src/converters/ExternalTextsConverter.ts index 7115d22..361f251 100644 --- a/src/converters/ExternalTextsConverter.ts +++ b/src/converters/ExternalTextsConverter.ts @@ -1,44 +1,32 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IExternalTexts } from '../mapping/json'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, IConverter, IExternalTexts } from '../common'; @singleton() -export class ExternalTextsConverter extends Converter +export class ExternalTextsConverter implements IConverter { public externalTexts: IExternalTexts = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing ExternalTexts').start(); const url = this._configuration.getValue('external.texts.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - this.externalTexts = await this.mapText2JSON(content); - } - else - { - this.externalTexts = JSON.parse(content); - } + this.externalTexts = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content)); - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/ExternalTexts.json'; await writeFile(path, JSON.stringify(this.externalTexts), 'utf8'); - spinner.succeed(`ExternalTexts finished in ${ Date.now() - now }ms`); + spinner.succeed(`ExternalTexts: Finished in ${ Date.now() - now }ms`); } private async mapText2JSON(text: string): Promise @@ -47,13 +35,13 @@ export class ExternalTextsConverter extends Converter const output: IExternalTexts = {}; - const parts = text.split(/\n\r{1,}|\n{1,}|\r{1,}/mg); + const parts = text.split(/\r?\n/); for(const part of parts) { - const [ key, value ] = part.split('='); + const [ key, ...value ] = part.split('='); - output[key] = value; + output[key] = value.join(); } return output; diff --git a/src/converters/FigureConverter.ts b/src/converters/FigureConverter.ts index ae412f7..69cd8dc 100644 --- a/src/converters/FigureConverter.ts +++ b/src/converters/FigureConverter.ts @@ -1,16 +1,12 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, File, FileUtilities, IConverter } from '../common'; +import { GenerateFigureBundle, SWFDownloader } from '../swf'; import { FigureMapConverter } from './FigureMapConverter'; @singleton() -export class FigureConverter +export class FigureConverter implements IConverter { public figureTypes: Map = new Map(); @@ -19,7 +15,7 @@ export class FigureConverter private readonly _configuration: Configuration) {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { if(!this._configuration.getBoolean('convert.figure')) return; @@ -27,7 +23,7 @@ export class FigureConverter const spinner = ora('Preparing Figure').start(); const baseUrl = this._configuration.getValue('dynamic.download.figure.url'); const figureMap = this._figureMapConverter.figureMap; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'figure'); + const directory = await FileUtilities.getDirectory('./assets/bundled/figure'); const classNames: string[] = []; if(figureMap.libraries !== undefined) @@ -46,60 +42,51 @@ export class FigureConverter } } - for(const className of classNames) + if(classNames) { - try + const totalClassNames = classNames.length; + + for(let i = 0; i < totalClassNames; i++) { - const path = new File(directory.path + '/' + className + '.nitro'); + const className = classNames[i]; - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) + try { - spinner.text = 'Couldnt convert figure: ' + className; + const path = new File(directory.path + '/' + className + '.nitro'); + if(path.exists()) continue; + + spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`; spinner.render(); + const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); + + if(!habboAssetSWF) + { + console.log(); + console.error(`Invalid SWF: ${ className }`); + + continue; + } + + const nitroBundle = await GenerateFigureBundle(habboAssetSWF, className, this.figureTypes.get(className)); + + await writeFile(path.path, await nitroBundle.toBufferAsync()); + + spinner.text = 'Converted: ' + className; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Converting: ${ className } - ${ error.message }`); + continue; } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, className); - - if(assetData) - { - assetData.name = className; - assetData.type = this.figureTypes.get(className); - } - - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; } } - console.log(); - spinner.succeed(`Figures finished in ${ Date.now() - now }ms`); + spinner.succeed(`Figures: Finished in ${ Date.now() - now }ms`); } } diff --git a/src/converters/FigureDataConverter.ts b/src/converters/FigureDataConverter.ts index 76b5e07..371809e 100644 --- a/src/converters/FigureDataConverter.ts +++ b/src/converters/FigureDataConverter.ts @@ -1,48 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFigureData } from '../mapping/json/figuredata/IFigureData'; -import { FigureDataMapper } from '../mapping/mappers/FigureDataMapper'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FigureDataMapper, FileUtilities, IConverter, IFigureData } from '../common'; @singleton() -export class FigureDataConverter extends Converter +export class FigureDataConverter implements IConverter { public figureData: IFigureData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FigureData').start(); const url = this._configuration.getValue('figuredata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this.figureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.figureData = await this.mapXML2JSON(xml); - } - else - { - this.figureData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FigureData.json'; await writeFile(path, JSON.stringify(this.figureData), 'utf8'); - spinner.succeed(`FigureData finished in ${ Date.now() - now }ms`); + spinner.succeed(`FigureData: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise diff --git a/src/converters/FigureMapConverter.ts b/src/converters/FigureMapConverter.ts index f087c79..8ac299b 100644 --- a/src/converters/FigureMapConverter.ts +++ b/src/converters/FigureMapConverter.ts @@ -1,50 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFigureMap } from '../mapping/json'; -import { FigureMapMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; +import { Configuration, FigureMapMapper, FileUtilities, IConverter, IFigureMap } from '../common'; @singleton() -export class FigureMapConverter extends Converter +export class FigureMapConverter implements IConverter { public figureMap: IFigureMap = null; constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } + private readonly _configuration: Configuration) + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FigureMap').start(); const url = this._configuration.getValue('figuremap.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); + this.figureMap = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.figureMap = await this.mapXML2JSON(xml); - } - else - { - this.figureMap = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FigureMap.json'; await writeFile(path, JSON.stringify(this.figureMap), 'utf8'); - spinner.succeed(`FigureMap finished in ${ Date.now() - now }ms`); + spinner.succeed(`FigureMap: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise diff --git a/src/converters/FurnitureConverter.ts b/src/converters/FurnitureConverter.ts index d0972e0..3802151 100644 --- a/src/converters/FurnitureConverter.ts +++ b/src/converters/FurnitureConverter.ts @@ -1,121 +1,227 @@ -import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { IAssetData } from '../mapping/json'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, ConverterResult, File, FileUtilities, IConverter, NitroBundle } from '../common'; +import { GenerateFurnitureBundle, SWFDownloader } from '../swf'; import { FurnitureDataConverter } from './FurnitureDataConverter'; @singleton() -export class FurnitureConverter +export class FurnitureConverter implements IConverter { - public assets: Map = new Map(); - constructor( private readonly _furniDataConverter: FurnitureDataConverter, private readonly _configuration: Configuration) {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(bundle: boolean = false, extract: boolean = false): Promise { + if(bundle) await this.convertInputToNitro(); + if(extract) await this.extractNitroToFolder(); + if(!this._configuration.getBoolean('convert.furniture')) return; const now = Date.now(); const spinner = ora('Preparing Furniture').start(); - const baseUrl = this._configuration.getValue('dynamic.download.furniture.url'); - const furniData = this._furniDataConverter.furnitureData; - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'furniture'); - const classNames: string[] = []; - const revisions: number[] = []; + const downloadBase = this._configuration.getValue('dynamic.download.furniture.url'); + const saveDirectory = await FileUtilities.getDirectory('./assets/bundled/furniture'); + const { classNames, revisions } = this._furniDataConverter.getClassNamesAndRevisions(this.floorOnly, this.wallOnly); - if(furniData.roomitemtypes) + if(classNames) { - if(furniData.roomitemtypes.furnitype) + const totalClassNames = classNames.length; + + for(let i = 0; i < totalClassNames; i++) { - for(const furniType of furniData.roomitemtypes.furnitype) + const className = classNames[i]; + const revision = revisions[i]; + + try { - const className = furniType.classname.split('*')[0]; - const revision = furniType.revision; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - revisions.push(revision); - } - } - } - - if(furniData.wallitemtypes) - { - if(furniData.wallitemtypes.furnitype) - { - for(const furniType of furniData.wallitemtypes.furnitype) - { - const className = furniType.classname.split('*')[0]; - const revision = furniType.revision; - - if(classNames.indexOf(className) >= 0) continue; - - classNames.push(className); - revisions.push(revision); - } - } - } - - for(let i = 0; i < classNames.length; i++) - { - const className = classNames[i]; - const revision = revisions[i]; - - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, revision); - - if(!habboAssetSWF) - { - spinner.text = 'Couldnt convert furni: ' + className; - + spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`; spinner.render(); + const downloadUrl = SWFDownloader.getDownloadUrl(downloadBase, className, revision); + const result = await this.convertSwfToNitro(className, downloadUrl, saveDirectory, false); + + switch(result) + { + case ConverterResult.OK: + spinner.text = 'Converted: ' + className; + spinner.render(); + break; + case ConverterResult.INVALID_SWF: + console.log(); + console.error(`Invalid SWF: ${ downloadUrl }`); + break; + } + } + + catch (error) + { + console.log(); + console.error(`Error Converting: ${ className } - ${ error.message }`); + continue; } - else - { - spinner.text = 'Couldnt convert furni: ' + className; + } + } + spinner.succeed(`Furniture: Finished in ${ Date.now() - now }ms`); + } + + public async convertInputToNitro(): Promise + { + const now = Date.now(); + const spinner = ora('Preparing Furniture Inputs').start(); + const saveDirectory = await FileUtilities.getDirectory('./assets/bundled/furniture'); + const inputDirectory = await FileUtilities.getDirectory('./assets/bundle/furniture'); + const files = await inputDirectory.getFileList(); + + for await (const name of files) + { + try + { + const [ className, extension, ...rest ] = name.split('.'); + const file = new File(`${ inputDirectory.path}/${ name }`); + + if(await file.isDirectory()) + { + spinner.text = `Bundling: ${ className }`; + spinner.render(); + + const nitroBundle = new NitroBundle(); + const childFiles = await file.getFileList(); + + if(childFiles && childFiles.length) + { + for await (const childName of childFiles) + { + const childFile = new File(`${ file.path }/${ childName }`); + + nitroBundle.addFile(childName, await childFile.getContentsAsBuffer()); + } + } + + if(nitroBundle.totalFiles) + { + const path = new File(`${ saveDirectory.path }/${ className }.nitro`); + + await path.writeData(await nitroBundle.toBufferAsync()); + } + else + { + console.log(); + console.error(`Error Bundling: ${ name } - The bundle was empty`); + + continue; + } + + spinner.text = 'Bundled: ' + name; spinner.render(); } - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'furniture'); - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); + else if(extension === 'swf') + { + spinner.text = `Converting: ${ className }`; + spinner.render(); - await writeFile(path.path, await nitroBundle.toBufferAsync()); + const downloadUrl = `${ inputDirectory.path }/${ name }`; + const result = await this.convertSwfToNitro(className, file.path, saveDirectory, true); - spinner.text = 'Finished: ' + className; - - spinner.render(); + switch(result) + { + case ConverterResult.OK: + spinner.text = 'Converted: ' + className; + spinner.render(); + break; + case ConverterResult.INVALID_SWF: + console.log(); + console.error(`Invalid SWF: ${ downloadUrl }`); + break; + } + } } catch (error) { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; + console.log(); + console.error(`Error Converting: ${ name } - ${ error.message }`); } } - console.log(); - spinner.succeed(`Furniture finished in ${ Date.now() - now }ms`); + spinner.succeed(`Furniture Inputs: Finished in ${ Date.now() - now }ms`); + } + + public async extractNitroToFolder(): Promise + { + const now = Date.now(); + const spinner = ora('Preparing Furniture Extraction').start(); + const saveBaseDirectory = await FileUtilities.getDirectory('./assets/extracted/furniture'); + const inputDirectory = await FileUtilities.getDirectory('./assets/extract/furniture'); + const files = await inputDirectory.getFileList(); + + for await (const name of files) + { + try + { + const [ className, extension, ...rest ] = name.split('.'); + const saveDirectory = await FileUtilities.getDirectory(`${ saveBaseDirectory.path }/${ className }`); + const file = new File(`${ inputDirectory.path }/${ name }`); + + spinner.text = `Extracting: ${ className }`; + spinner.render(); + + if(extension === 'nitro') + { + const nitroBundle = NitroBundle.from((await file.getContentsAsBuffer()).buffer); + + for await (const [ bundleName, bundleBuffer ] of nitroBundle.files.entries()) + { + const saveFile = new File(`${ saveDirectory.path }/${ bundleName }`); + + await saveFile.writeData(bundleBuffer); + } + } + } + + catch (error) + { + console.log(); + console.error(`Error Extracting: ${ name } - ${ error.message }`); + } + } + + spinner.succeed(`Furniture Extraction: Finished in ${ Date.now() - now }ms`); + } + + private async convertSwfToNitro(className: string, url: string, parentFile: File, overwrite: boolean = false): Promise + { + if(!className || !url || !parentFile) return ConverterResult.BAD_ARGS; + + const file = new File(`${ parentFile.path }/${ className }.nitro`); + + if(!overwrite) + { + if(file.exists()) return ConverterResult.FILE_EXISTS; + } + + const habboAssetSWF = await SWFDownloader.downloadFromUrl(url); + + if(!habboAssetSWF) return ConverterResult.INVALID_SWF; + + const nitroBundle = await GenerateFurnitureBundle(habboAssetSWF); + + await file.writeData(await nitroBundle.toBufferAsync()); + + return ConverterResult.OK; + } + + public get floorOnly(): boolean + { + return (this._configuration.getBoolean('convert.furniture.floor.only') || false); + } + + public get wallOnly(): boolean + { + return (this._configuration.getBoolean('convert.furniture.wall.only') || false); } } diff --git a/src/converters/FurnitureDataConverter.ts b/src/converters/FurnitureDataConverter.ts index 9038240..59633f5 100644 --- a/src/converters/FurnitureDataConverter.ts +++ b/src/converters/FurnitureDataConverter.ts @@ -1,49 +1,33 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; import { parseStringPromise } from 'xml2js'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IFurnitureData } from '../mapping/json'; -import { FurnitureDataMapper } from '../mapping/mappers'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, FurnitureDataMapper, IConverter, IFurnitureData } from '../common'; @singleton() -export class FurnitureDataConverter extends Converter +export class FurnitureDataConverter implements IConverter { public furnitureData: IFurnitureData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { const now = Date.now(); const spinner = ora('Preparing FurnitureData').start(); const url = this._configuration.getValue('furnidata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const xml = await parseStringPromise(content.replace(/&/g,'&')); - const furnitureData = await this.mapXML2JSON(xml); + this.furnitureData = ((!content.startsWith('{')) ? await this.mapXML2JSON(await parseStringPromise(content.replace(/&/g,'&'))) : JSON.parse(content)); - this.furnitureData = furnitureData; - } - else - { - this.furnitureData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/FurnitureData.json'; await writeFile(path, JSON.stringify(this.furnitureData), 'utf8'); - spinner.succeed(`FurnitureData finished in ${ Date.now() - now }ms`); + spinner.succeed(`FurnitureData: Finished in ${ Date.now() - now }ms`); } private async mapXML2JSON(xml: any): Promise @@ -56,4 +40,49 @@ export class FurnitureDataConverter extends Converter return output; } + + public getClassNamesAndRevisions(floorOnly: boolean = false, wallOnly: boolean = false) + { + if(!this.furnitureData) return null; + + const both = (!floorOnly && !wallOnly); + const classNames: string[] = []; + const revisions: number[] = []; + + if((both || floorOnly) && this.furnitureData.roomitemtypes) + { + if(this.furnitureData.roomitemtypes.furnitype) + { + for(const furniType of this.furnitureData.roomitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + if(classNames.indexOf(className) >= 0) continue; + + classNames.push(className); + revisions.push(revision); + } + } + } + + if((both || wallOnly) && this.furnitureData.wallitemtypes) + { + if(this.furnitureData.wallitemtypes.furnitype) + { + for(const furniType of this.furnitureData.wallitemtypes.furnitype) + { + const className = furniType.classname.split('*')[0]; + const revision = furniType.revision; + + if(classNames.indexOf(className) >= 0) continue; + + classNames.push(className); + revisions.push(revision); + } + } + } + + return { classNames, revisions }; + } } diff --git a/src/converters/OldAssetConverter.ts b/src/converters/OldAssetConverter.ts deleted file mode 100644 index 90c25bf..0000000 --- a/src/converters/OldAssetConverter.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { writeFile } from 'fs/promises'; -import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; -import { NitroBundle } from '../utils/NitroBundle'; - -@singleton() -export class OldAssetConverter extends Converter -{ - constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } - - public async convertAsync(args: string[] = []): Promise - { - if(args.shift() !== 'old-asset') return; - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'generic'); - const baseDirectory = FileUtilities.getDirectory(args.shift()); - - for(const className of args) - { - try - { - const path = new File(directory.path + '/' + className + '.nitro'); - const jsonBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.json'); - const imageBuffer = await FileUtilities.readFileAsBuffer(baseDirectory.path + '/' + className + '/' + className + '.png'); - const nitroBundle = new NitroBundle(); - - nitroBundle.addFile((className + '.json'), jsonBuffer); - nitroBundle.addFile((className + '.png'), imageBuffer); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - console.log('Finished converting: ' + className); - } - - catch (error) - { - console.log('Error converting: ' + className); - } - } - } -} diff --git a/src/converters/PetConverter.ts b/src/converters/PetConverter.ts index b2be9da..763c6a5 100644 --- a/src/converters/PetConverter.ts +++ b/src/converters/PetConverter.ts @@ -1,26 +1,17 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { BundleProvider } from '../common/bundle/BundleProvider'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { SWFConverter } from '../common/converters/SWFConverter'; -import { SWFDownloader } from '../common/SWFDownloader'; -import { File } from '../utils/File'; -import { FileUtilities } from '../utils/FileUtilities'; -import { Logger } from '../utils/Logger'; +import { Configuration, File, FileUtilities, IConverter } from '../common'; +import { GeneratePetBundle, SWFDownloader } from '../swf'; @singleton() -export class PetConverter extends Converter +export class PetConverter implements IConverter { constructor( - private readonly _configuration: Configuration, - private readonly _logger: Logger) - { - super(); - } + private readonly _configuration: Configuration) + {} - public async convertAsync(args: string[] = []): Promise + public async convertAsync(): Promise { if(!this._configuration.getBoolean('convert.pet')) return; @@ -28,56 +19,54 @@ export class PetConverter extends Converter const spinner = ora('Preparing Pets').start(); const baseUrl = this._configuration.getValue('dynamic.download.pet.url'); const classNames = this.getPetTypes(); - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'pet'); + const directory = await FileUtilities.getDirectory('./assets/bundled/pet'); - for(const className of classNames) + if(classNames) { - try + const totalClassNames = classNames.length; + + for(let i = 0; i < totalClassNames; i++) { - const path = new File(directory.path + '/' + className + '.nitro'); + const className = classNames[i]; - if(path.exists()) continue; - - const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); - - if(!habboAssetSWF) + try { - spinner.text = 'Couldnt convert pet: ' + className; + const path = new File(directory.path + '/' + className + '.nitro'); + if(path.exists()) continue; + + spinner.text = `Converting: ${ className } (${ (i + 1) } / ${ totalClassNames })`; spinner.render(); + const habboAssetSWF = await SWFDownloader.download(baseUrl, className, -1); + + if(!habboAssetSWF) + { + console.log(); + console.error(`Invalid SWF: ${ className }`); + + continue; + } + + const nitroBundle = await GeneratePetBundle(habboAssetSWF); + + await writeFile(path.path, await nitroBundle.toBufferAsync()); + + spinner.text = 'Converted: ' + className; + spinner.render(); + } + + catch (error) + { + console.log(); + console.error(`Error Converting: ${ className } - ${ error.message }`); + continue; } - else - { - spinner.text = 'Converting: ' + className; - - spinner.render(); - } - - const spriteBundle = await BundleProvider.generateSpriteSheet(habboAssetSWF); - const assetData = await SWFConverter.mapXML2JSON(habboAssetSWF, 'pet'); - const nitroBundle = SWFConverter.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); - - await writeFile(path.path, await nitroBundle.toBufferAsync()); - - spinner.text = 'Finished: ' + className; - - spinner.render(); - } - - catch (error) - { - spinner.text = `Error converting ${ className }: ${ error.message }`; - - spinner.render(); - - continue; } } - console.log(); - spinner.succeed(`Pets finished in ${ Date.now() - now }ms`); + spinner.succeed(`Pets: Finished in ${ Date.now() - now }ms`); } private getPetTypes(): string[] diff --git a/src/converters/ProductDataConverter.ts b/src/converters/ProductDataConverter.ts index acfb0a6..5b6ef95 100644 --- a/src/converters/ProductDataConverter.ts +++ b/src/converters/ProductDataConverter.ts @@ -1,21 +1,16 @@ import { writeFile } from 'fs/promises'; -import * as ora from 'ora'; +import ora from 'ora'; import { singleton } from 'tsyringe'; -import { Configuration } from '../common/config/Configuration'; -import { Converter } from '../common/converters/Converter'; -import { IProductData } from '../mapping/json'; -import { FileUtilities } from '../utils/FileUtilities'; +import { Configuration, FileUtilities, IConverter, IProductData } from '../common'; @singleton() -export class ProductDataConverter extends Converter +export class ProductDataConverter implements IConverter { public productData: IProductData = null; constructor( private readonly _configuration: Configuration) - { - super(); - } + {} public async convertAsync(args: string[] = []): Promise { @@ -24,23 +19,14 @@ export class ProductDataConverter extends Converter const url = this._configuration.getValue('productdata.load.url'); const content = await FileUtilities.readFileAsString(url); - if(!content.startsWith('{')) - { - const productData = await this.mapText2JSON(content); + this.productData = ((!content.startsWith('{')) ? await this.mapText2JSON(content) : JSON.parse(content)); - this.productData = productData; - } - else - { - this.productData = JSON.parse(content); - } - - const directory = FileUtilities.getDirectory(this._configuration.getValue('output.folder'), 'gamedata'); + const directory = await FileUtilities.getDirectory('./assets/gamedata'); const path = directory.path + '/ProductData.json'; await writeFile(path, JSON.stringify(this.productData), 'utf8'); - spinner.succeed(`ProductData finished in ${ Date.now() - now }ms`); + spinner.succeed(`ProductData: Finished in ${ Date.now() - now }ms`); } private async mapText2JSON(text: string): Promise diff --git a/src/mapping/xml/asset/assets/AssetXML.ts b/src/mapping/xml/asset/assets/AssetXML.ts deleted file mode 100644 index 9c9fd16..0000000 --- a/src/mapping/xml/asset/assets/AssetXML.ts +++ /dev/null @@ -1,61 +0,0 @@ -export class AssetXML -{ - private readonly _name: string; - private readonly _source: string; - private readonly _x: number; - private readonly _y: number; - private readonly _flipH: boolean; - private readonly _flipV: boolean; - private readonly _usesPalette: boolean; - - constructor(asset: any) - { - const attributes = asset.$; - - if(attributes !== undefined) - { - if(attributes.name !== undefined) this._name = attributes.name; - if(attributes.source !== undefined) this._source = attributes.source; - if(attributes.x !== undefined) this._x = parseInt(attributes.x); - if(attributes.x !== undefined) this._y = parseInt(attributes.y); - if(attributes.flipH !== undefined) this._flipH = (attributes.flipH === '1'); - if(attributes.flipV !== undefined) this._flipV = (attributes.flipV === '1'); - if(attributes.usesPalette !== undefined) this._usesPalette = (attributes.usesPalette === '1'); - } - } - - public get name(): string - { - return this._name; - } - - public get source(): string - { - return this._source; - } - - public get x(): number - { - return this._x; - } - - public get y(): number - { - return this._y; - } - - public get flipH(): boolean - { - return this._flipH; - } - - public get flipV(): boolean - { - return this._flipV; - } - - public get usesPalette(): boolean - { - return this._usesPalette; - } -} diff --git a/src/mapping/xml/asset/assets/AssetsXML.ts b/src/mapping/xml/asset/assets/AssetsXML.ts deleted file mode 100644 index 94c3599..0000000 --- a/src/mapping/xml/asset/assets/AssetsXML.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AssetXML } from './AssetXML'; -import { PaletteXML } from './PaletteXML'; - -export class AssetsXML -{ - private readonly _assets: AssetXML[]; - private readonly _palettes: PaletteXML[]; - - constructor(xml: any) - { - if(xml.asset !== undefined) - { - if(Array.isArray(xml.asset)) - { - this._assets = []; - - for(const asset of xml.asset) this._assets.push(new AssetXML(asset)); - } - } - - if(xml.palette !== undefined) - { - if(Array.isArray(xml.palette)) - { - this._palettes = []; - - for(const palette of xml.palette) this._palettes.push(new PaletteXML(palette)); - } - } - } - - public get assets(): AssetXML[] - { - return this._assets; - } - - public get palettes(): PaletteXML[] - { - return this._palettes; - } -} diff --git a/src/mapping/xml/asset/assets/PaletteXML.ts b/src/mapping/xml/asset/assets/PaletteXML.ts deleted file mode 100644 index d0bae8d..0000000 --- a/src/mapping/xml/asset/assets/PaletteXML.ts +++ /dev/null @@ -1,68 +0,0 @@ -export class PaletteXML -{ - private readonly _id: number; - private readonly _source: string; - private readonly _master: boolean; - private readonly _tags: string[]; - private readonly _breed: number; - private readonly _colorTag: number; - private readonly _color1: string; - private readonly _color2: string; - - constructor(xml: any) - { - const attributes = xml.$; - - if(attributes) - { - if(attributes.id !== undefined) this._id = parseInt(attributes.id); - if(attributes.source !== undefined) this._source = attributes.source; - if(attributes.master !== undefined) this._master = (attributes.master === 'true') ? true : false; - if(attributes.tags !== undefined) this._tags = attributes.tags.split(','); - if(attributes.breed !== undefined) this._breed = parseInt(attributes.breed); - if(attributes.colortag !== undefined) this._colorTag = parseInt(attributes.colortag); - if(attributes.color1 !== undefined) this._color1 = attributes.color1; - if(attributes.color2 !== undefined) this._color2 = attributes.color2; - } - } - - public get id(): number - { - return this._id; - } - - public get source(): string - { - return this._source; - } - - public get master(): boolean - { - return this._master; - } - - public get tags(): string[] - { - return this._tags; - } - - public get breed(): number - { - return this._breed; - } - - public get colorTag(): number - { - return this._colorTag; - } - - public get color1(): string - { - return this._color1; - } - - public get color2(): string - { - return this._color2; - } -} diff --git a/src/mapping/xml/asset/assets/index.ts b/src/mapping/xml/asset/assets/index.ts deleted file mode 100644 index 433c955..0000000 --- a/src/mapping/xml/asset/assets/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './AssetsXML'; -export * from './AssetXML'; -export * from './PaletteXML'; diff --git a/src/swf-reader/index.js b/src/swf-reader/index.js deleted file mode 100644 index b24740b..0000000 --- a/src/swf-reader/index.js +++ /dev/null @@ -1,491 +0,0 @@ -/** - * Simple module for reading SWF properties - * - * (c) 2014 Rafael Leal Dias - * MIT LICENCE - * - */ -const fs = require('fs'); -const zlib = require('zlib'); -const lzma = require('lzma-purejs'); -const Stream = require('stream'); -const SWFTags = require('./lib/swf-tags'); -const SWFReader = exports; -import { SWFBuffer } from './lib/SWFBuffer'; - -function readSWFTags(buff, swf) -{ - var tags = [] - , tag - , tagHeader - , flag - , l - , sc - , fc; - - /* Reads TagCodeAndLength from Tag's RECORDHEADER */ - while( (tagHeader = buff.readTagCodeAndLength()) ) - { - tag = { - header : tagHeader - }; - switch( tagHeader.code ) - { - case SWFTags.FileAttributes: { - const flag = buff.readUIntLE(32); - const fileAttrs = {}; - - fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1); - fileAttrs.as3 = tag.as3 = !!(flag & 0x8); - fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10); - fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20); - fileAttrs.useDirectBit = tag.useDirectBlit = !!(flag & 0x40); - - swf.fileAttributes = fileAttrs; - break; - } - case SWFTags.Metadata: { - swf.metadata = tag.metadata = buff.readString(); - break; - } - case SWFTags.SetBackgroundColor: { - tag.RGB = buff.readRGB(); - swf.backgroundColor = '#' + (tag.RGB[0]*65536 + tag.RGB[1]*256 + tag.RGB[0]).toString(16); - break; - } - case SWFTags.Protect : - swf.protect = tagHeader.length && buff.readString(); - break; - case SWFTags.DefineSceneAndFrameLabelData : - sc = tag.sceneCount = buff.readEncodedU32(); - tag.scenes = []; - - while(sc--) - tag.scenes.push({ - offset : buff.readEncodedU32(), - name : buff.readString() - }); - - fc = tag.frameLabelCount = buff.readEncodedU32(); - tag.labels = []; - - while(fc--) - tag.labels.push({ - frameNum : buff.readEncodedU32(), - frameLabel : buff.readString() - }); - break; - /** - * DefineShape4 extends the capabilities of - * DefineShape3 by using a new line style - * record in the shape - */ - //case SWFTags.DefineShape4 : - // /* id for this character */ - // tag.ShapeId = buff.readUIntLE(16); - // /* bounds of the shape */ - // tag.ShapeBounds = buff.readRect(); - // /* bounds of the shape, excluding the strokes */ - // tag.EdgeBounds = buff.readRect(); - // /* reserved, must be 0 */ - // if (0 !== buff.readBits(5)) - // throw new Error('Reserved bit used.'); - // /* if 1, use fill winding. >= SWF 10 */ - // if (swf.version >= 10) - // tag.UsesFillWindingRule = buff.readBits(1); - // /** - // * if 1, shape contains at least one - // * non-scaling stroke. - // */ - // tag.UsesNonScallingStrokes = buff.readBits(1); - // /** - // * if 1, shape contains at least one - // * scaling stroke - // */ - // tag.UsesScalingStrokes = buff.readBits(1); - // tag.shapes = buff.readShapeWithStyle(); - // break; - case SWFTags.FrameLabel : - tag.name = buff.readString(); - l = Buffer.byteLength(tag.name); - /* check if it's an named anchor */ - if(l & (tagHeader.length - 1) != l) - tag.anchor = buff.readUInt8(); - break; - case SWFTags.DefineSprite : - tag.SpriteID = buff.readUIntLE(16); - tag.FrameCount = buff.readUIntLE(16); - tag.ControlTags = readSWFTags(buff, swf); - break; - case SWFTags.ExportAssets : - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets.push({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - case SWFTags.ImportAssets : - /** - * URL where the source SWF file can be found - */ - tag.url = buff.readString(); - /** - * Number of assets to import - */ - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets.push({ - /** - * Character ID for the l-th item - * in importing SWF file - */ - id : buff.readUIntLE(16), - /** - * Identifies for the l-th - * imported character - */ - name : buff.readString() - }); - break; - case SWFTags.ImportAssets2 : - tag.url = buff.readString(); - - if( !(1 === buff.readUInt8() && 0 === buff.readUInt8()) ) - { - throw new Error('Reserved bits for ImportAssets2 used'); - } - - tag.count = buff.readUIntLE(16); - tag.assets = []; - - l = 0; - - while(l++ < tag.count) - tag.assets({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - case SWFTags.EnableDebbuger : - tag.password = buff.readString(); - break; - case SWFTags.EnableDebugger2 : - if(0 !== buff.readUIntLE(16)) - { - //throw new Error('Reserved bit for EnableDebugger2 used.'); - } - tag.password = buff.readString(); - break; - case SWFTags.ScriptLimits : - /** - * Maximum recursion Depth - */ - tag.maxRecursionDepth = buff.readUIntLE(16); - /** - * Maximum ActionScript processing time before script - * stuck dialog box displays - */ - tag.scriptTimeoutSeconds = buff.readUIntLE(16); - break; - case SWFTags.SymbolClass: { - tag.numSymbols = buff.readUIntLE(16); - tag.symbols = []; - - l = 0; - - while(l++ < tag.numSymbols) - tag.symbols.push({ - id : buff.readUIntLE(16), - name : buff.readString() - }); - break; - } - case SWFTags.DefineScalingGrid: { - tag.characterId = buff.readUIntLE(16); - tag.splitter = buff.readRect(); - break; - } - case SWFTags.setTabIndex: { - tag.depth = buff.readUIntLE(16); - tag.tabIndex = buff.readUIntLE(16); - break; - } - case SWFTags.JPEGTables: { - tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length); - buff.pointer += tagHeader.length; - break; - } - case SWFTags.DefineBits: { - tag.characterId = buff.readUIntLE(16); - tag.jpegData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2); - buff.pointer += tagHeader.length - 2; - break; - } - case SWFTags.DefineBitsJPEG2: { - tag.characterId = buff.readUIntLE(16); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length - 2); - buff.pointer += tagHeader.length - 2; - break; - } - case SWFTags.DefineBitsJPEG3: { - tag.characterId = buff.readUIntLE(16); - var alphaDataOffset = buff.readUIntLE(32); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset); - buff.pointer += alphaDataOffset; - var restLength = tagHeader.length - 6 - alphaDataOffset; - tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - case SWFTags.DefineBitsJPEG4: { - tag.characterId = buff.readUIntLE(16); - const alphaDataOffset = buff.readUIntLE(32); - tag.deblockParam = buff.readUIntLE(16); - tag.imageData = buff.buffer.slice(buff.pointer, buff.pointer + alphaDataOffset); - buff.pointer += alphaDataOffset; - const restLength = tagHeader.length - 8 - alphaDataOffset; - tag.bitmapAlphaData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - case SWFTags.DefineBitsLossless: - case SWFTags.DefineBitsLossless2: { - tag.characterId = buff.readUIntLE(16); - tag.bitmapFormat = buff.readUInt8(); - tag.bitmapWidth = buff.readUIntLE(16); - tag.bitmapHeight = buff.readUIntLE(16); - let restLength = tagHeader.length - 7; - if(tag.bitmapFormat == 3) - { - tag.bitmapColorTableSize = buff.readUInt8(); - restLength--; - } - tag.zlibBitmapData = buff.buffer.slice(buff.pointer, buff.pointer + restLength); - buff.pointer += restLength; - break; - } - default: - tag.data = buff.buffer.slice(buff.pointer, buff.pointer + tagHeader.length); - buff.pointer += tagHeader.length; - break; - } - tags.push(tag); - } - return tags; -} - -/** - * Reads tags and their contents, passaing a SWF object to callback - * - * @param {SWFBuffer} buff - * @param {Buffer} compressed_buff - * @param {function} callback - * @api private - * - */ -function readSWFBuff(buff, compressed_buff, next) -{ - if(!buff) return next(null, null); - - buff.seek(3);// start - - if(buff.length < 9) - { - if(isSync) throw new Error('Buffer is to small, must be greater than 9 bytes.'); - return next(new Error('Buffer is to small, must be greater than 9 bytes.')); - } - var swf = { - version : buff.readUInt8(), - fileLength : { - compressed : compressed_buff.length, - uncompressed : buff.readUIntLE(32) - }, - frameSize : buff.readRect(), // Returns a RECT object. i.e : { x : 0, y : 0, width : 200, height: 300 } - frameRate : buff.readUIntLE(16)/256, - frameCount : buff.readUIntLE(16) - } - , isSync = 'function' !== typeof next; - - try - { - swf.tags = readSWFTags(buff, swf); - } - catch (e) - { - if(isSync) throw e; - return next(e); - } - - return isSync && swf || next( null, swf ); -} - -/** - * Concat SWF Header with uncompressed Buffer - * - * @param {Buffer|ArrayBuffer} buff - * @param {Buffer|ArrayBuffer} swf - */ -function concatSWFHeader(buff, swf) -{ - return Buffer.concat([swf.slice(0, 8), buff]); -} - -/** - * Uncompress SWF and start reading it - * - * @param {Buffer|ArrayBuffer} swf - * @param {function} callback - * - */ -function uncompress(swf, next) -{ - var compressed_buff = swf.slice(8) - , uncompressed_buff - , isSync = 'function' !== typeof next - , e; - - // uncompress buffer - switch(swf[0]) - { - case 0x43 : // zlib compressed - if(isSync) - { - uncompressed_buff = concatSWFHeader(zlib.unzipSync(compressed_buff), swf); - - if(!Buffer.isBuffer(uncompressed_buff)) return null; - - return readSWFBuff(new SWFBuffer(uncompressed_buff), swf); - } - - zlib.inflate(compressed_buff, function(err, buf) - { - if(!Buffer.isBuffer(buf)) - { - readSWFBuff(null, swf, next); - } - else - { - readSWFBuff(new SWFBuffer(buf), swf, next); - } - }); - break; - case 0x46 : // uncompressed - if(!Buffer.isBuffer(swf)) return null; - - return readSWFBuff(new SWFBuffer( swf ), swf, next); - case 0x5a : // LZMA compressed - var lzmaProperties = compressed_buff.slice(4, 9); - compressed_buff = compressed_buff.slice(9); - - var input_stream = new Stream(); - input_stream.pos = 0; - input_stream.readByte = function() - { - return this.pos >= compressed_buff.length ? -1 : compressed_buff[this.pos++]; - }; - - var output_stream = new Stream(); - output_stream.buffer = new Buffer(16384); - output_stream.pos = 0; - output_stream.writeByte = function(_byte) - { - if(this.pos >= this.buffer.length) - { - var newBuffer = new Buffer(this.buffer.length * 2); - this.buffer.copy(newBuffer); - this.buffer = newBuffer; - } - this.buffer[this.pos++] = _byte; - }; - output_stream.getBuffer = function() - { - // trim buffer - if(this.pos !== this.buffer.length) - { - var newBuffer = new Buffer(this.pos); - this.buffer.copy(newBuffer, 0, 0, this.pos); - this.buffer = newBuffer; - } - return this.buffer; - }; - - lzma.decompress(lzmaProperties, input_stream, output_stream, -1); - uncompressed_buff = Buffer.concat([swf.slice(0, 8), output_stream.getBuffer()]); - - if(!Buffer.isBuffer(uncompressed_buff)) return null; - - return readSWFBuff(new SWFBuffer(uncompressed_buff), swf, next); - default : - e = new Error('Unknown SWF compressions'); - - if(isSync) - { - throw e; - } - else - { - next(e); - } - } -} - -/** - * Check if file is Buffer or ArrayBuffer - * - * @param {Buffer|ArrayBuffer) b - * @api private - * - */ -function isBuffer(b) -{ - return typeof Buffer !== 'undefined' && Buffer.isBuffer(b) || b instanceof ArrayBuffer; -} - -/* Exposes Tags constants */ -SWFReader.TAGS = SWFTags; - -/** - * Reads SWF file - * - * @param {String|Buffer}} file - * @param {function} next - if not a function, uses synchronous algorithm - * @api public - * - */ -SWFReader.read = SWFReader.readSync = function(file, next) -{ - if(isBuffer(file)) - { - /* File is already a buffer */ - return uncompress(file, next); - } - else - { - /* Get the buffer */ - if('function' === typeof next) - { - fs.readFile(file, function(err, swf) - { - if( err ) - { - next(err); - return; - } - uncompress(swf, next); - }); - } - else - { - return uncompress(fs.readFileSync(file)); - } - } -}; diff --git a/src/swf-reader/lib/swf-tags.js b/src/swf-reader/lib/swf-tags.js deleted file mode 100644 index 26a6dd0..0000000 --- a/src/swf-reader/lib/swf-tags.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Defines constants on exports object - * - * @param {String} name - * @param {Mixed} value - */ - -function define(name, value) -{ - Object.defineProperty(exports, name, { - value : value, - enumerable : true - }); -} - -/* SWF Tags Type */ - -define('End', 0); -define('ShowFrame', 1); -define('DefineShape', 2); -define('PlaceObject', 4); -define('RemoveObject', 5); -define('DefineBits', 6); -define('DefineButton', 7); -define('JPEGTables', 8); -define('SetBackgroundColor', 9); -define('DefineFont', 10); -define('DefineText', 11); -define('DoAction', 12); -define('DefineFontInfo', 13); -define('DefineSound', 14); -define('StartSound', 15); -define('DefineButtonSound', 17); -define('SoundStreamHead', 18); -define('SoundStreamBlock', 19); -define('DefineBitsLossless', 20); -define('DefineBitsJPEG2', 21); -define('DefineShape2', 22); -define('DefineButtonCxform', 23); -define('Protect', 24); -define('PlaceObject2', 26); -define('RemoveObject2', 28); -define('DefineShape3', 32); -define('DefineText2', 33); -define('DefineButton2', 34); -define('DefineBitsJPEG3', 35); -define('DefineBitsLossless2', 36); -define('DefineEditText', 37); -define('DefineSprite', 39); -define('SerialNumber', 41); -define('FrameLabel', 43); -define('SoundStreamHead2', 45); -define('DefineMorphShape', 46); -define('DefineFont2', 48); -define('ExportAssets', 56); -define('ImportAssets', 57); -define('EnableDebugger', 58); -define('DoInitAction', 59); -define('DefineVideoStream', 60); -define('VideoFrame', 61); -define('DefineFontInfo2', 62); -define('EnableDebugger2', 64); -define('ScriptLimits', 65); -define('SetTabIndex', 66); -define('FileAttributes', 69); -define('PlaceObject3', 70); -define('ImportAssets2', 71); -define('DefineFontAlignZones', 73); -define('CSMTextSettings', 74); -define('DefineFont3', 75); -define('SymbolClass', 76); -define('Metadata', 77); -define('DefineScalingGrid', 78); -define('DoABC', 82); -define('DefineShape4', 83); -define('DefineMorphShape2', 84); -define('DefineSceneAndFrameLabelData', 86); -define('DefineBinaryData', 87); -define('DefineFontName', 88); -define('StartSound2', 89); -define('DefineBitsJPEG4', 90); -define('DefineFont4', 91); -//define('TagMax' (DefineFont4 + 1) diff --git a/src/swf/ConcatSWFHeader.ts b/src/swf/ConcatSWFHeader.ts new file mode 100644 index 0000000..5e7f27d --- /dev/null +++ b/src/swf/ConcatSWFHeader.ts @@ -0,0 +1,4 @@ +export const ConcatSWFHeader = (buff: Buffer, swf: Buffer) => +{ + return Buffer.concat([ swf.slice(0, 8), buff ]); +}; diff --git a/src/swf/GenerateEffectBundle.ts b/src/swf/GenerateEffectBundle.ts new file mode 100644 index 0000000..73c94a4 --- /dev/null +++ b/src/swf/GenerateEffectBundle.ts @@ -0,0 +1,21 @@ +import { GenerateSpriteSheet } from './GenerateSpritesheet'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { SWFUtilities } from './SWFUtilities'; + +export const GenerateEffectBundle = async (habboAssetSWF: HabboAssetSWF, className: string, effectType: string) => +{ + if(!habboAssetSWF) return null; + + const spriteBundle = await GenerateSpriteSheet(habboAssetSWF); + const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, className); + + if(assetData) + { + assetData.name = className; + assetData.type = effectType; + } + + const nitroBundle = SWFUtilities.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); + + return nitroBundle; +}; diff --git a/src/swf/GenerateFigureBundle.ts b/src/swf/GenerateFigureBundle.ts new file mode 100644 index 0000000..e70109c --- /dev/null +++ b/src/swf/GenerateFigureBundle.ts @@ -0,0 +1,21 @@ +import { GenerateSpriteSheet } from './GenerateSpritesheet'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { SWFUtilities } from './SWFUtilities'; + +export const GenerateFigureBundle = async (habboAssetSWF: HabboAssetSWF, className: string, figureType: string) => +{ + if(!habboAssetSWF) return null; + + const spriteBundle = await GenerateSpriteSheet(habboAssetSWF); + const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, className); + + if(assetData) + { + assetData.name = className; + assetData.type = figureType; + } + + const nitroBundle = SWFUtilities.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); + + return nitroBundle; +}; diff --git a/src/swf/GenerateFurnitureBundle.ts b/src/swf/GenerateFurnitureBundle.ts new file mode 100644 index 0000000..f4a1ae0 --- /dev/null +++ b/src/swf/GenerateFurnitureBundle.ts @@ -0,0 +1,14 @@ +import { GenerateSpriteSheet } from './GenerateSpritesheet'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { SWFUtilities } from './SWFUtilities'; + +export const GenerateFurnitureBundle = async (habboAssetSWF: HabboAssetSWF) => +{ + if(!habboAssetSWF) return null; + + const spriteBundle = await GenerateSpriteSheet(habboAssetSWF); + const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, 'furniture'); + const nitroBundle = SWFUtilities.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); + + return nitroBundle; +}; diff --git a/src/swf/GeneratePetBundle.ts b/src/swf/GeneratePetBundle.ts new file mode 100644 index 0000000..8f61ab0 --- /dev/null +++ b/src/swf/GeneratePetBundle.ts @@ -0,0 +1,14 @@ +import { GenerateSpriteSheet } from './GenerateSpritesheet'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { SWFUtilities } from './SWFUtilities'; + +export const GeneratePetBundle = async (habboAssetSWF: HabboAssetSWF) => +{ + if(!habboAssetSWF) return null; + + const spriteBundle = await GenerateSpriteSheet(habboAssetSWF); + const assetData = await SWFUtilities.mapXML2JSON(habboAssetSWF, 'pet'); + const nitroBundle = SWFUtilities.createNitroBundle(habboAssetSWF.getDocumentClass(), assetData, spriteBundle); + + return nitroBundle; +}; diff --git a/src/swf/GenerateSpritesheet.ts b/src/swf/GenerateSpritesheet.ts new file mode 100644 index 0000000..9c2b552 --- /dev/null +++ b/src/swf/GenerateSpritesheet.ts @@ -0,0 +1,59 @@ +import { ImageBundle } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { PackImages } from './PackImages'; + +export const IMAGE_SOURCES: Map = new Map(); + +export const GenerateSpriteSheet = async (habboAssetSWF: HabboAssetSWF, convertCase: boolean = false) => +{ + const tagList = habboAssetSWF.symbolTags(); + const names: string[] = []; + const tags: number[] = []; + + let documentClass = habboAssetSWF.getDocumentClass(); + + if(convertCase) documentClass = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))); + + for(const tag of tagList) + { + names.push(...tag.names); + tags.push(...tag.tags); + } + + const imageBundle = new ImageBundle(); + + const imageTags = habboAssetSWF.imageTags(); + + for(const imageTag of imageTags) + { + if(tags.includes(imageTag.characterId)) + { + for(let i = 0; i < tags.length; i++) + { + if(tags[i] != imageTag.characterId) continue; + + if(names[i] == imageTag.className) continue; + + if(imageTag.className.startsWith('sh_')) continue; + + if(imageTag.className.indexOf('_32_') >= 0) continue; + + IMAGE_SOURCES.set(names[i].substring(documentClass.length + 1), imageTag.className.substring(documentClass.length + 1)); + } + } + + if(imageTag.className.startsWith('sh_')) continue; + + if(imageTag.className.indexOf('_32_') >= 0) continue; + + let className = imageTag.className; + + if(convertCase) className = ((className.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1)); + + imageBundle.addImage(className, imageTag.imgData); + } + + if(!imageBundle.images.length) return null; + + return await PackImages(documentClass, imageBundle, convertCase); +}; diff --git a/src/swf/HabboAssetSWF.ts b/src/swf/HabboAssetSWF.ts index 732e3ae..e41a185 100644 --- a/src/swf/HabboAssetSWF.ts +++ b/src/swf/HabboAssetSWF.ts @@ -1,32 +1,27 @@ -import CustomIterator from '../utils/CustomIterator'; -import { readImagesDefineBitsLossless, readImagesJPEG3or4, readSwfAsync } from '../utils/SwfReader'; -import { CharacterTag } from './tags/CharacterTag'; -import { DefineBinaryDataTag } from './tags/DefineBinaryDataTag'; -import { ImageTag } from './tags/ImageTag'; -import { ITag } from './tags/ITag'; -import { SymbolClassTag } from './tags/SymbolClassTag'; +import { CustomIterator } from '../common'; +import { ReadImagesDefineBitsLossless } from './ReadImagesDefineBitsLossless'; +import { ReadImagesJPEG3or4 } from './ReadImagesJPEG3or4'; +import { ReadSWF } from './ReadSWF'; +import { CharacterTag, DefineBinaryDataTag, ImageTag, ITag, SymbolClassTag } from './tags'; export class HabboAssetSWF { - private readonly _tags: Array; + private readonly _tags: Array = []; private _documentClass: string | null = null; constructor( - private readonly _data: string | Buffer + private readonly _data: Buffer ) - { - this._tags = new Array(); - } + {} - async setupAsync() + public async setupAsync() { - const swf = await readSwfAsync(this._data); + const swf = await ReadSWF(this._data); if(!swf) return; for(const tag of swf.tags) { - switch(tag.header.code) { case 76: @@ -35,67 +30,29 @@ export class HabboAssetSWF case 87: this._tags.push(new DefineBinaryDataTag(tag.data)); break; - case 6: console.log(tag); break; - case 21: { - const jpeg3 = await readImagesJPEG3or4(21, tag); - this._tags.push(new ImageTag({ - code: 21, - characterID: jpeg3.characterId, - imgType: 'jpeg', - imgData: jpeg3.imageData, - bitmapWidth: jpeg3.bitmapWidth, - bitmapHeight: jpeg3.bitmapHeight - })); + const jpeg3 = await ReadImagesJPEG3or4(21, tag); + this._tags.push(new ImageTag(jpeg3.characterId, 21, 'jpeg', jpeg3.imgData)); break; } - case 35: { - const jpeg3 = await readImagesJPEG3or4(35, tag); - this._tags.push(new ImageTag({ - code: jpeg3.code, - characterID: jpeg3.characterId, - imgType: jpeg3.imgType, - imgData: jpeg3.imgData, - bitmapWidth: jpeg3.bitmapWidth, - bitmapHeight: jpeg3.bitmapHeight - })); + const jpeg3 = await ReadImagesJPEG3or4(35, tag); + this._tags.push(new ImageTag(jpeg3.characterId, jpeg3.code, jpeg3.imgType, jpeg3.imgData)); break; } - case 36: { - const pngTagLossLess2: any = await readImagesDefineBitsLossless(tag); - this._tags.push(new ImageTag({ - code: pngTagLossLess2.code, - characterID: pngTagLossLess2.characterId, - imgType: pngTagLossLess2.imgType, - imgData: pngTagLossLess2.imgData, - bitmapWidth: pngTagLossLess2.bitmapWidth, - bitmapHeight: pngTagLossLess2.bitmapHeight - })); + const pngTagLossLess2: any = await ReadImagesDefineBitsLossless(tag); + this._tags.push(new ImageTag(pngTagLossLess2.characterId, pngTagLossLess2.code, pngTagLossLess2.imgType, pngTagLossLess2.imgData, pngTagLossLess2.bitmapWidth, pngTagLossLess2.bitmapHeight)); break; } - case 20: { - const pngTagLossless: any = await readImagesDefineBitsLossless(tag); - this._tags.push(new ImageTag({ - code: pngTagLossless.code, - characterID: pngTagLossless.characterId, - imgType: pngTagLossless.imgType, - imgData: pngTagLossless.imgData, - bitmapWidth: pngTagLossless.bitmapWidth, - bitmapHeight: pngTagLossless.bitmapHeight - })); + const pngTagLossless: any = await ReadImagesDefineBitsLossless(tag); + this._tags.push(new ImageTag(pngTagLossless.characterId, pngTagLossless.code, pngTagLossless.imgType, pngTagLossless.imgData, pngTagLossless.bitmapWidth, pngTagLossless.bitmapHeight)); break; } - - case 90: - console.log(tag); - break; - default: //console.log(tag.header.code); break; @@ -172,8 +129,7 @@ export class HabboAssetSWF public getBinaryTagByName(name: string): DefineBinaryDataTag | null { - const streamTag = this.binaryTags() - .filter(tag => tag.className === name)[0]; + const streamTag = this.binaryTags().filter(tag => tag.className === name)[0]; if(streamTag === undefined) return null; diff --git a/src/swf/PackImages.ts b/src/swf/PackImages.ts new file mode 100644 index 0000000..6458e08 --- /dev/null +++ b/src/swf/PackImages.ts @@ -0,0 +1,43 @@ +import { packAsync } from 'free-tex-packer-core'; +import { ImageBundle, SpriteBundle } from '../common'; + +export const PackImages = async (documentClass: string, imageBundle: ImageBundle, convertCase: boolean = false) => +{ + const files = await packAsync(imageBundle.images, { + textureName: (convertCase ? documentClass.substring(1) : documentClass), + width: 10240, + height: 4320, + fixedSize: false, + allowRotation: false, + detectIdentical: true, + allowTrim: true, + //@ts-ignore + exporter: 'Pixi' + }); + + const bundle = new SpriteBundle(); + + for(const item of files) + { + if(item.name.endsWith('.json')) + { + bundle.spritesheet = JSON.parse(item.buffer.toString('utf8')); + + delete bundle.spritesheet.meta.app; + delete bundle.spritesheet.meta.version; + } + else + { + bundle.imageData = { + name: item.name, + buffer: item.buffer + }; + + if(convertCase) bundle.imageData.name = (documentClass.replace(/(?:^|\.?)([A-Z])/g, (x,y) => ('_' + y.toLowerCase().replace(/^_/, '')))).substring(1); + } + } + + if((bundle.spritesheet !== undefined) && (bundle.imageData !== undefined)) bundle.spritesheet.meta.image = bundle.imageData.name; + + return bundle; +}; diff --git a/src/swf/ReadImagesDefineBitsLossless.ts b/src/swf/ReadImagesDefineBitsLossless.ts new file mode 100644 index 0000000..698671b --- /dev/null +++ b/src/swf/ReadImagesDefineBitsLossless.ts @@ -0,0 +1,89 @@ +import encoder from 'png-stream/encoder'; +import streamToArray from 'stream-to-array'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { ISWFTag } from './common'; + +export const ReadImagesDefineBitsLossless = async (tag: Partial) => +{ + const { characterId, bitmapFormat, bitmapWidth, bitmapHeight, bitmapColorTableSize, zlibBitmapData } = tag; + + const pngEncoder = new encoder(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' }); + const dataBuf = await promisify(unzip)(zlibBitmapData); + + if(!dataBuf) return null; + const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4); + + let index = 0; + let ptr = 0; + + switch(bitmapFormat) + { + case 5: { + for(let y = 0; y < bitmapHeight; ++y) + { + for(let x = 0; x < bitmapWidth; ++x) + { + const alpha = dataBuf[ptr]; + output[index] = dataBuf[ptr + 1] * (255 / alpha); + output[index + 1] = dataBuf[ptr + 2] * (255 / alpha); + output[index + 2] = dataBuf[ptr + 3] * (255 / alpha); + output[index + 3] = alpha; + index += 4; + ptr += 4; + } + } + + break; + } + case 3: { + // 8-bit colormapped image + const colorMap = []; + + for(let i = 0; i < bitmapColorTableSize + 1; ++i) + { + colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]); + + ptr += 4; + } + + for(let _y2 = 0; _y2 < bitmapHeight; ++_y2) + { + for(let _x2 = 0; _x2 < bitmapWidth; ++_x2) + { + const idx = dataBuf[ptr]; + const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0]; + output[index] = color[0]; + output[index + 1] = color[1]; + output[index + 2] = color[2]; + output[index + 3] = color[3]; + ptr += 1; + index += 4; + } + + // skip padding + ptr += (4 - bitmapWidth % 4) % 4; + } + + break; + } + default: + // reject(new Error('unhandled bitmapFormat: ' + bitmapFormat)); + break; + } + + pngEncoder.end(output); + + const parts = await streamToArray(pngEncoder); + + const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part)); + + return { + code: 36, + characterId: characterId, + imgType: 'png', + imgData: Buffer.concat(buffers), + bitmapWidth: bitmapWidth, + bitmapHeight: bitmapHeight + }; +}; diff --git a/src/swf/ReadImagesJPEG3or4.ts b/src/swf/ReadImagesJPEG3or4.ts new file mode 100644 index 0000000..65ed43d --- /dev/null +++ b/src/swf/ReadImagesJPEG3or4.ts @@ -0,0 +1,77 @@ +import * as concatFrames from 'concat-frames'; +import decoder from 'jpg-stream/decoder'; +import encoder from 'png-stream/encoder'; +import { PassThrough } from 'stream'; +import streamToArray from 'stream-to-array'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { SlicedToArray } from '../common'; +import { ISWFTag } from './common'; +import { RecognizeImageHeader } from './RecognizeImageHeader'; + +export const ReadImagesJPEG3or4 = async (code: number, tag: Partial) => +{ + const { characterId, imgData, bitmapAlphaData } = tag; + const imgType = RecognizeImageHeader(imgData); + + if(imgType !== 'jpeg') return { code, characterId, imgType, imgData }; + + const pngEncoder = new encoder(undefined, undefined, { colorSpace: 'rgba' }); + const alphaBufPre = await promisify(unzip)(bitmapAlphaData); + + let alphaBuffer: Buffer = null; + + if(alphaBufPre.length > 0) alphaBuffer = alphaBufPre; + + const bufferStream = new PassThrough(); + + bufferStream.end(imgData); + + bufferStream + .pipe(new decoder()) + .pipe(concatFrames((data: any) => + { + const _ref2 = SlicedToArray.slicedToArray(data, 1); + const frame = _ref2[0]; + + const input = frame.pixels; + const pCount = frame.width * frame.height; + const output = Buffer.alloc(pCount * 4); + + if(alphaBuffer !== null && alphaBuffer.length !== pCount) + { + console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuffer.length); + } + + const getAlphaBuffer = (i: any) => + { + if(!alphaBuffer) return 0xFF; + + return alphaBuffer[i]; + }; + + for(let i = 0; i < pCount; ++i) + { + output[4 * i] = input[3 * i]; + output[4 * i + 1] = input[3 * i + 1]; + output[4 * i + 2] = input[3 * i + 2]; + output[4 * i + 3] = getAlphaBuffer(i); + } + + pngEncoder.format.width = frame.width; + pngEncoder.format.height = frame.height; + pngEncoder.end(output); + })); + + const parts = await streamToArray(pngEncoder); + const buffers = parts.map(part => Buffer.isBuffer(part) ? part : Buffer.from(part)); + + bufferStream.end(); + + return { + code: code, + characterId: characterId, + imgType: 'png', + imgData: Buffer.concat(buffers) + }; +}; diff --git a/src/swf/ReadSWF.ts b/src/swf/ReadSWF.ts new file mode 100644 index 0000000..a5b6c20 --- /dev/null +++ b/src/swf/ReadSWF.ts @@ -0,0 +1,13 @@ +import { readFile } from 'fs/promises'; +import { UncompressSWF } from './UncompressSWF'; + +export const ReadSWF = async (buffer: Buffer) => +{ + if(Buffer.isBuffer(buffer)) return UncompressSWF(buffer); + + buffer = await readFile(buffer); + + if(!buffer) return null; + + return UncompressSWF(buffer); +}; diff --git a/src/swf/ReadSWFBuffer.ts b/src/swf/ReadSWFBuffer.ts new file mode 100644 index 0000000..25a2176 --- /dev/null +++ b/src/swf/ReadSWFBuffer.ts @@ -0,0 +1,32 @@ +import { ISWF } from './common'; +import { readSWFTags } from './ReadSWFTags'; +import { SWFBuffer } from './SWFBuffer'; + +export const ReadSWFBuff = (swfBuffer: SWFBuffer, rawBuffer: Buffer) => +{ + if(!swfBuffer || !rawBuffer) return null; + + swfBuffer.seek(3); + + if(swfBuffer.length < 9) + { + console.error('Buffer is to small, must be greater than 9 bytes.'); + + return null; + } + + const swf: ISWF = { + version: swfBuffer.readUInt8(), + fileLength: { + compressed: rawBuffer.length, + uncompressed: swfBuffer.readUIntLE(32) + }, + frameSize: swfBuffer.readRect(), + frameRate: (swfBuffer.readUIntLE(16) / 256), + frameCount: swfBuffer.readUIntLE(16), + }; + + swf.tags = readSWFTags(swfBuffer, swf); + + return swf; +}; diff --git a/src/swf/ReadSWFTags.ts b/src/swf/ReadSWFTags.ts new file mode 100644 index 0000000..4cb4505 --- /dev/null +++ b/src/swf/ReadSWFTags.ts @@ -0,0 +1,203 @@ +import { ISWF, ISWFFileAttributes, ISWFTag, ISWFTagHeader } from './common'; +import { SWFBuffer } from './SWFBuffer'; +import { SWFTags } from './SWFTags'; + +export const readSWFTags = (buffer: SWFBuffer, swf: Partial) => +{ + const tags: Partial[] = []; + + let header: ISWFTagHeader = null; + + while((header = buffer.readTagCodeAndLength())) + { + const tag: Partial = { header }; + + switch(header.code) + { + case SWFTags.FileAttributes: { + const flag = buffer.readUIntLE(32); + const fileAttrs: Partial = {}; + + fileAttrs.useNetwork = tag.useNetwork = !!(flag & 0x1); + fileAttrs.as3 = tag.as3 = !!(flag & 0x8); + fileAttrs.hasMetaData = tag.hasMetaData = !!(flag & 0x10); + fileAttrs.useGPU = tag.useGPU = !!(flag & 0x20); + fileAttrs.useDirectBit = tag.useDirectBit = !!(flag & 0x40); + + swf.fileAttributes = fileAttrs; + break; + } + case SWFTags.Metadata: + swf.metadata = tag.metadata = buffer.readString(); + break; + case SWFTags.SetBackgroundColor: + tag.RGB = buffer.readRGB(); + swf.backgroundColor = ('#' + ((tag.RGB[0] * 65536) + (tag.RGB[1] * 256) + tag.RGB[0]).toString(16)); + break; + case SWFTags.Protect: + swf.protect = header.length && buffer.readString(); + break; + case SWFTags.DefineSceneAndFrameLabelData: { + let sc = tag.sceneCount = buffer.readEncodedU32(); + tag.scenes = []; + + while(sc--) tag.scenes.push({ + offset: buffer.readEncodedU32(), + name: buffer.readString() + }); + + let fc = tag.frameLabelCount = buffer.readEncodedU32(); + tag.labels = []; + + while(fc--) tag.labels.push({ + frameNum: buffer.readEncodedU32(), + frameLabel: buffer.readString() + }); + break; + } + case SWFTags.FrameLabel: { + tag.name = buffer.readString(); + const l = Buffer.byteLength(tag.name); + if(l && ((header.length - 1) !== l)) tag.anchor = buffer.readUInt8(); + break; + } + case SWFTags.DefineSprite: + tag.SpriteID = buffer.readUIntLE(16); + tag.FrameCount = buffer.readUIntLE(16); + tag.ControlTags = readSWFTags(buffer, swf); + break; + case SWFTags.ExportAssets: { + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.ImportAssets: { + tag.url = buffer.readString(); + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.ImportAssets2: { + tag.url = buffer.readString(); + + if(!((1 === buffer.readUInt8()) && (0 === buffer.readUInt8()))) throw new Error('Reserved bits for ImportAssets2 used'); + + tag.count = buffer.readUIntLE(16); + tag.assets = []; + + let l = 0; + + while(l++ < tag.count) tag.assets.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.EnableDebugger: + tag.password = buffer.readString(); + break; + case SWFTags.EnableDebugger2: + tag.password = buffer.readString(); + break; + case SWFTags.ScriptLimits: + tag.maxRecursionDepth = buffer.readUIntLE(16); + tag.scriptTimeoutSeconds = buffer.readUIntLE(16); + break; + case SWFTags.SymbolClass: { + tag.numSymbols = buffer.readUIntLE(16); + tag.symbols = []; + + let l = 0; + + while(l++ < tag.numSymbols) tag.symbols.push({ + id: buffer.readUIntLE(16), + name: buffer.readString() + }); + break; + } + case SWFTags.DefineScalingGrid: + tag.characterId = buffer.readUIntLE(16); + tag.splitter = buffer.readRect(); + break; + case SWFTags.SetTabIndex: + tag.depth = buffer.readUIntLE(16); + tag.tabIndex = buffer.readUIntLE(16); + break; + case SWFTags.JPEGTables: + tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length); + buffer.pointer += header.length; + break; + case SWFTags.DefineBits: + tag.characterId = buffer.readUIntLE(16); + tag.jpegData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2); + buffer.pointer += (header.length - 2); + break; + case SWFTags.DefineBitsJPEG2: + tag.characterId = buffer.readUIntLE(16); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length - 2); + buffer.pointer += (header.length - 2); + break; + case SWFTags.DefineBitsJPEG3: { + tag.characterId = buffer.readUIntLE(16); + const alphaDataOffset = buffer.readUIntLE(32); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset); + buffer.pointer += alphaDataOffset; + const restLength = ((header.length - 6) - alphaDataOffset); + tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + case SWFTags.DefineBitsJPEG4: { + tag.characterId = buffer.readUIntLE(16); + const alphaDataOffset = buffer.readUIntLE(32); + tag.deblockParam = buffer.readUIntLE(16); + tag.imgData = buffer.buffer.slice(buffer.pointer, buffer.pointer + alphaDataOffset); + buffer.pointer += alphaDataOffset; + const restLength = ((header.length - 8) - alphaDataOffset); + tag.bitmapAlphaData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + case SWFTags.DefineBitsLossless: + case SWFTags.DefineBitsLossless2: { + tag.characterId = buffer.readUIntLE(16); + tag.bitmapFormat = buffer.readUInt8(); + tag.bitmapWidth = buffer.readUIntLE(16); + tag.bitmapHeight = buffer.readUIntLE(16); + let restLength = (header.length - 7); + + if(tag.bitmapFormat === 3) + { + tag.bitmapColorTableSize = buffer.readUInt8(); + restLength--; + } + + tag.zlibBitmapData = buffer.buffer.slice(buffer.pointer, buffer.pointer + restLength); + buffer.pointer += restLength; + break; + } + default: + tag.data = buffer.buffer.slice(buffer.pointer, buffer.pointer + header.length); + buffer.pointer += header.length; + break; + } + + tags.push(tag); + } + + return tags; +}; diff --git a/src/swf/RecognizeImageHeader.ts b/src/swf/RecognizeImageHeader.ts new file mode 100644 index 0000000..be94dc9 --- /dev/null +++ b/src/swf/RecognizeImageHeader.ts @@ -0,0 +1,14 @@ +const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number)); +const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number)); +const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number)); + +export const RecognizeImageHeader = (buffer: Buffer) => +{ + if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png'; + if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif'; + if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg'; + + console.error('Unknown format:', buffer.slice(0, 8)); + + return null; +}; diff --git a/src/swf-reader/lib/SWFBuffer.ts b/src/swf/SWFBuffer.ts similarity index 78% rename from src/swf-reader/lib/SWFBuffer.ts rename to src/swf/SWFBuffer.ts index bbc9012..56751ba 100644 --- a/src/swf-reader/lib/SWFBuffer.ts +++ b/src/swf/SWFBuffer.ts @@ -4,7 +4,7 @@ export class SWFBuffer public static EOS: number = 0x00; public static STYLE_COUNT_EXT: number = 0xFF; - public buffer: Buffer + public buffer: Buffer = null; public pointer: number = 0; public position: number = 1; public current: number = 0; @@ -12,10 +12,7 @@ export class SWFBuffer constructor(buffer: Buffer) { - if(!Buffer.isBuffer(buffer)) - { - throw new Error('invalid_buffer'); - } + if(!Buffer.isBuffer(buffer)) throw new Error('invalid_buffer'); this.buffer = buffer; this.length = buffer.length; @@ -35,7 +32,7 @@ export class SWFBuffer break; } - this.pointer += bits / 8; + this.pointer += (bits / 8); return value; } @@ -69,13 +66,13 @@ export class SWFBuffer return [ ...this.readRGB(), this.readUInt8() ]; } - public readString(encoding: BufferEncoding): string + public readString(encoding: BufferEncoding = 'utf8'): string { const init = this.pointer; while(this.readUInt8() !== SWFBuffer.EOS); - return this.buffer.toString(encoding || 'utf8', init, this.pointer - 1); + return this.buffer.toString((encoding || 'utf8'), init, (this.pointer - 1)); } public readStyleArray(buffer: SWFBuffer, next) @@ -122,7 +119,7 @@ export class SWFBuffer public readLineStyle(buffer: SWFBuffer): { width: number, color: [ number, number, number, number ]} { return { - width: buffer.readUIntLE(16)/20, + width: (buffer.readUIntLE(16) / 20), color: buffer.readRGBA() }; } @@ -149,10 +146,10 @@ export class SWFBuffer public readShapeWithStyle() { return { - fillStyles : this.readStyleArray(this, this.readFillStyle), - lineStyles : this.readStyleArray(this, this.readLineStyle), - numFillBits : this.readBits(4), - numLineBits : this.readBits(4), + fillStyles: this.readStyleArray(this, this.readFillStyle), + lineStyles: this.readStyleArray(this, this.readLineStyle), + numFillBits: this.readBits(4), + numLineBits: this.readBits(4), shapeRecords: this.readShapeRecords(this) }; } @@ -162,8 +159,8 @@ export class SWFBuffer if(this.pointer === this.length) return null; const n = this.readUIntLE(16); - const tagType = n >> 6; - let tagLength = n & SWFBuffer.RECORDHEADER_LENTH_FULL; + const tagType = (n >> 6); + let tagLength = (n & SWFBuffer.RECORDHEADER_LENTH_FULL); if(n === 0) return null; @@ -177,22 +174,22 @@ export class SWFBuffer this.start(); const NBits = this.readBits(5); - const Xmin = this.readBits(NBits, true) / 20; - const Xmax = this.readBits(NBits, true) / 20; - const Ymin = this.readBits(NBits, true) / 20; - const Ymax = this.readBits(NBits, true) / 20; + const Xmin = (this.readBits(NBits, true) / 20); + const Xmax = (this.readBits(NBits, true) / 20); + const Ymin = (this.readBits(NBits, true) / 20); + const Ymax = (this.readBits(NBits, true) / 20); return { - x : Xmin, - y : Ymin, - width : (Xmax > Xmin ? Xmax - Xmin : Xmin - Xmax), - height : (Ymax > Ymin ? Ymax - Ymin : Ymin - Ymax) + x: Xmin, + y: Ymin, + width: (Xmax > Xmin ? (Xmax - Xmin) : (Xmin - Xmax)), + height: (Ymax > Ymin ? (Ymax - Ymin) : (Ymin - Ymax)) }; } public seek(pos: number): void { - this.pointer = pos % this.buffer.length; + this.pointer = (pos % this.buffer.length); } public start(): void @@ -217,9 +214,9 @@ export class SWFBuffer { if( this.position > 8 ) this.start(); - r = (r << 1 ) + ((this.current >> (8 - this.position++)) & 1); + r = (r << 1) + ((this.current >> (8 - this.position++)) & 1); } - return sign * r; + return (sign * r); } } diff --git a/src/common/SWFDownloader.ts b/src/swf/SWFDownloader.ts similarity index 58% rename from src/common/SWFDownloader.ts rename to src/swf/SWFDownloader.ts index 5d9e345..c33f4bf 100644 --- a/src/common/SWFDownloader.ts +++ b/src/swf/SWFDownloader.ts @@ -1,11 +1,24 @@ -import { HabboAssetSWF } from '../swf/HabboAssetSWF'; -import { FileUtilities } from '../utils/FileUtilities'; +import { FileUtilities } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; export class SWFDownloader { public static USES_REVISION: boolean = true; public static LOG_DOWNLOADS: boolean = true; + public static getDownloadUrl(baseUrl: string, className: string, revision: number): string + { + let url = baseUrl; + + if(!url || !url.length) return null; + + if(SWFDownloader.USES_REVISION && (revision > -1)) url = url.replace('%revision%', revision.toString()); + + url = url.replace('%className%', className); + + return url; + } + public static async download(baseUrl: string, className: string, revision: number): Promise { let url = baseUrl; @@ -16,12 +29,6 @@ export class SWFDownloader url = url.replace('%className%', className); - if(SWFDownloader.LOG_DOWNLOADS) - { - console.log(); - console.log(` Downloading ${ className } from ${url}`); - } - const habboAssetSWF = await this.extractSWF(url); if(!habboAssetSWF) return null; @@ -29,19 +36,9 @@ export class SWFDownloader return habboAssetSWF; } - public static async downloadFromUrl(url: string, className: string, revision: number): Promise + public static async downloadFromUrl(url: string): Promise { - if(SWFDownloader.LOG_DOWNLOADS) - { - console.log(); - console.log(` Downloading ${ className } from ${url}`); - } - - const habboAssetSWF = await this.extractSWF(url); - - if(!habboAssetSWF) return null; - - return habboAssetSWF; + return await this.extractSWF(url); } public static async extractSWF(url: string): Promise diff --git a/src/swf/SWFTags.ts b/src/swf/SWFTags.ts new file mode 100644 index 0000000..1f0d2c7 --- /dev/null +++ b/src/swf/SWFTags.ts @@ -0,0 +1,68 @@ +export class SWFTags +{ + public static End: number = 0; + public static ShowFrame: number = 1; + public static DefineShape: number = 2; + public static PlaceObject: number = 4; + public static RemoveObject: number = 5; + public static DefineBits: number = 6; + public static DefineButton: number = 7; + public static JPEGTables: number = 8; + public static SetBackgroundColor: number = 9; + public static DefineFont: number = 10; + public static DefineText: number = 11; + public static DoAction: number = 12; + public static DefineFontInfo: number = 13; + public static DefineSound: number = 14; + public static StartSound: number = 15; + public static DefineButtonSound: number = 17; + public static SoundStreamHead: number = 18; + public static SoundStreamBlock: number = 19; + public static DefineBitsLossless: number = 20; + public static DefineBitsJPEG2: number = 21; + public static DefineShape2: number = 22; + public static DefineButtonCxform: number = 23; + public static Protect: number = 24; + public static PlaceObject2: number = 26; + public static RemoveObject2: number = 28; + public static DefineShape3: number = 32; + public static DefineText2: number = 33; + public static DefineButton2: number = 34; + public static DefineBitsJPEG3: number = 35; + public static DefineBitsLossless2: number = 36; + public static DefineEditText: number = 37; + public static DefineSprite: number = 39; + public static SerialNumber: number = 41; + public static FrameLabel: number = 43; + public static SoundStreamHead2: number = 45; + public static DefineMorphShape: number = 46; + public static DefineFont2: number = 48; + public static ExportAssets: number = 56; + public static ImportAssets: number = 57; + public static EnableDebugger: number = 58; + public static DoInitAction: number = 59; + public static DefineVideoStream: number = 60; + public static VideoFrame: number = 61; + public static DefineFontInfo2: number = 62; + public static EnableDebugger2: number = 64; + public static ScriptLimits: number = 65; + public static SetTabIndex: number = 66; + public static FileAttributes: number = 69; + public static PlaceObject3: number = 70; + public static ImportAssets2: number = 71; + public static DefineFontAlignZones: number = 73; + public static CSMTextSettings: number = 74; + public static DefineFont3: number = 75; + public static SymbolClass: number = 76; + public static Metadata: number = 77; + public static DefineScalingGrid: number = 78; + public static DoABC: number = 82; + public static DefineShape4: number = 83; + public static DefineMorphShape2: number = 84; + public static DefineSceneAndFrameLabelData: number = 86; + public static DefineBinaryData: number = 87; + public static DefineFontName: number = 88; + public static StartSound2: number = 89; + public static DefineBitsJPEG4: number = 90; + public static DefineFont4: number = 91; +} diff --git a/src/common/converters/SWFConverter.ts b/src/swf/SWFUtilities.ts similarity index 85% rename from src/common/converters/SWFConverter.ts rename to src/swf/SWFUtilities.ts index e3d20aa..e0bcd59 100644 --- a/src/common/converters/SWFConverter.ts +++ b/src/swf/SWFUtilities.ts @@ -1,14 +1,10 @@ import { wrap } from 'bytebuffer'; import { parseStringPromise } from 'xml2js'; -import { IAssetData } from '../../mapping/json'; -import { AnimationMapper, AssetMapper, IndexMapper, LogicMapper, ManifestMapper, VisualizationMapper } from '../../mapping/mappers'; -import { HabboAssetSWF } from '../../swf/HabboAssetSWF'; -import { DefineBinaryDataTag } from '../../swf/tags/DefineBinaryDataTag'; -import { NitroBundle } from '../../utils/NitroBundle'; -import { SpriteBundle } from '../bundle/SpriteBundle'; -import { Converter } from './Converter'; +import { AnimationMapper, AssetMapper, IAssetData, IndexMapper, LogicMapper, ManifestMapper, NitroBundle, SpriteBundle, VisualizationMapper } from '../common'; +import { HabboAssetSWF } from './HabboAssetSWF'; +import { DefineBinaryDataTag } from './tags'; -export class SWFConverter extends Converter +export class SWFUtilities { private static removeComments(data: string): string { @@ -44,7 +40,7 @@ export class SWFConverter extends Converter public static async getManifestXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'manifest', false, snakeCase); if(!binaryData) return null; @@ -53,7 +49,7 @@ export class SWFConverter extends Converter public static async getIndexXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'index', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'index', false, snakeCase); if(!binaryData) return null; @@ -62,7 +58,7 @@ export class SWFConverter extends Converter public static async getAssetsXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'assets', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'assets', true, snakeCase); if(!binaryData) return null; @@ -71,7 +67,7 @@ export class SWFConverter extends Converter public static async getLogicXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'logic', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'logic', true, snakeCase); if(!binaryData) return null; @@ -80,7 +76,7 @@ export class SWFConverter extends Converter public static async getVisualizationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'visualization', true, snakeCase); if(!binaryData) return null; @@ -89,7 +85,7 @@ export class SWFConverter extends Converter public static async getAnimationXML(habboAssetSWF: HabboAssetSWF, snakeCase: boolean = false): Promise { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, 'animation', false, snakeCase); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, 'animation', false, snakeCase); if(!binaryData) return null; @@ -98,7 +94,7 @@ export class SWFConverter extends Converter public static getPalette(habboAssetSWF: HabboAssetSWF, paletteName: string): [ number, number, number ][] { - const binaryData = SWFConverter.getBinaryData(habboAssetSWF, paletteName, false); + const binaryData = SWFUtilities.getBinaryData(habboAssetSWF, paletteName, false); if(!binaryData || !binaryData.binaryDataBuffer) return null; diff --git a/src/swf/UncompressSWF.ts b/src/swf/UncompressSWF.ts new file mode 100644 index 0000000..3c5e12b --- /dev/null +++ b/src/swf/UncompressSWF.ts @@ -0,0 +1,34 @@ +import lzma from 'lzma-purejs'; +import { promisify } from 'util'; +import { unzip } from 'zlib'; +import { ReadSWFBuff } from './ReadSWFBuffer'; +import { SWFBuffer } from './SWFBuffer'; + +export const UncompressSWF = async (rawBuffer: Buffer) => +{ + if(!Buffer.isBuffer(rawBuffer)) return null; + + const compressed_buff = rawBuffer.slice(8); + + switch(rawBuffer[0]) + { + case 0x43: { // zlib compressed + const buffer = await (promisify(unzip)(compressed_buff)); + + if(!Buffer.isBuffer(buffer)) return null; + + return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer); + } + case 0x46: // uncompressed + return ReadSWFBuff(new SWFBuffer(rawBuffer), rawBuffer); + case 0x5a: { // LZMA compressed + const buffer = Buffer.concat([ rawBuffer.slice(0, 8), lzma.decompressFile(compressed_buff) ]); + + if(!Buffer.isBuffer(buffer)) return null; + + return ReadSWFBuff(new SWFBuffer(buffer), rawBuffer); + } + } + + return null; +}; diff --git a/src/swf/common/ISWF.ts b/src/swf/common/ISWF.ts new file mode 100644 index 0000000..ed97c88 --- /dev/null +++ b/src/swf/common/ISWF.ts @@ -0,0 +1,18 @@ +import { ISWFFileAttributes } from './ISWFFileAttributes'; +import { ISWFFileLength } from './ISWFFileLength'; +import { ISWFFrameSize } from './ISWFFrameSize'; +import { ISWFTag } from './ISWFTag'; + +export interface ISWF +{ + version?: number; + fileLength?: ISWFFileLength; + frameSize?: ISWFFrameSize; + frameRate?: number; + frameCount?: number; + backgroundColor?: string; + fileAttributes?: Partial; + metadata?: string; + protect?: string; + tags?: Partial[]; +} diff --git a/src/swf/common/ISWFFileAttributes.ts b/src/swf/common/ISWFFileAttributes.ts new file mode 100644 index 0000000..3a396f3 --- /dev/null +++ b/src/swf/common/ISWFFileAttributes.ts @@ -0,0 +1,8 @@ +export interface ISWFFileAttributes +{ + useNetwork: boolean, + as3: boolean, + hasMetaData: boolean, + useGPU: boolean, + useDirectBit: boolean +} diff --git a/src/swf/common/ISWFFileLength.ts b/src/swf/common/ISWFFileLength.ts new file mode 100644 index 0000000..ac51b9f --- /dev/null +++ b/src/swf/common/ISWFFileLength.ts @@ -0,0 +1,5 @@ +export interface ISWFFileLength +{ + compressed: number; + uncompressed: number; +} diff --git a/src/swf/common/ISWFFrameSize.ts b/src/swf/common/ISWFFrameSize.ts new file mode 100644 index 0000000..ad43e52 --- /dev/null +++ b/src/swf/common/ISWFFrameSize.ts @@ -0,0 +1,7 @@ +export interface ISWFFrameSize +{ + x: number; + y: number; + width: number; + height: number; +} diff --git a/src/swf/common/ISWFTag.ts b/src/swf/common/ISWFTag.ts new file mode 100644 index 0000000..b7ff7ef --- /dev/null +++ b/src/swf/common/ISWFTag.ts @@ -0,0 +1,49 @@ +import { ISWFTagAsset } from './ISWFTagAsset'; +import { ISWFTagHeader } from './ISWFTagHeader'; +import { ISWFTagLabel } from './ISWFTagLabel'; +import { ISWFTagScene } from './ISWFTagScene'; +import { ISWFTagSplitter } from './ISWFTagSplitter'; +import { ISWFTagSymbol } from './ISWFTagSymbol'; + +export interface ISWFTag +{ + header: ISWFTagHeader; + useNetwork: boolean; + as3: boolean; + hasMetaData: boolean; + useGPU: boolean; + useDirectBit: boolean; + metadata: string; + RGB: [ number, number, number ]; + sceneCount: number; + scenes: ISWFTagScene[]; + frameLabelCount: number; + labels: ISWFTagLabel[]; + name: string; + anchor: number; + SpriteID: number; + FrameCount: number; + ControlTags: Partial[]; + count: number; + assets: ISWFTagAsset[]; + url: string; + characterId: number; + bitmapFormat: number; + bitmapWidth: number; + bitmapHeight: number; + bitmapColorTableSize: number; + zlibBitmapData: Buffer; + deblockParam: number; + imgData: Buffer; + bitmapAlphaData: Buffer; + jpegData: Buffer; + data: Buffer; + splitter: ISWFTagSplitter; + depth: number; + tabIndex: number; + password: string; + maxRecursionDepth: number; + scriptTimeoutSeconds: number; + numSymbols: number; + symbols: ISWFTagSymbol[]; +} diff --git a/src/swf/common/ISWFTagAsset.ts b/src/swf/common/ISWFTagAsset.ts new file mode 100644 index 0000000..de5be06 --- /dev/null +++ b/src/swf/common/ISWFTagAsset.ts @@ -0,0 +1,5 @@ +export interface ISWFTagAsset +{ + id: number; + name: string; +} diff --git a/src/swf/common/ISWFTagHeader.ts b/src/swf/common/ISWFTagHeader.ts new file mode 100644 index 0000000..ba6d6b5 --- /dev/null +++ b/src/swf/common/ISWFTagHeader.ts @@ -0,0 +1,5 @@ +export interface ISWFTagHeader +{ + code: number; + length: number; +} diff --git a/src/swf/common/ISWFTagLabel.ts b/src/swf/common/ISWFTagLabel.ts new file mode 100644 index 0000000..5b2f2e7 --- /dev/null +++ b/src/swf/common/ISWFTagLabel.ts @@ -0,0 +1,5 @@ +export interface ISWFTagLabel +{ + frameNum: number; + frameLabel: string; +} diff --git a/src/swf/common/ISWFTagScene.ts b/src/swf/common/ISWFTagScene.ts new file mode 100644 index 0000000..1fa49f3 --- /dev/null +++ b/src/swf/common/ISWFTagScene.ts @@ -0,0 +1,5 @@ +export interface ISWFTagScene +{ + offset: number; + name: string; +} diff --git a/src/swf/common/ISWFTagSplitter.ts b/src/swf/common/ISWFTagSplitter.ts new file mode 100644 index 0000000..03f30f3 --- /dev/null +++ b/src/swf/common/ISWFTagSplitter.ts @@ -0,0 +1,7 @@ +export interface ISWFTagSplitter +{ + x: number; + y: number; + width: number; + height: number; +} diff --git a/src/swf/common/ISWFTagSymbol.ts b/src/swf/common/ISWFTagSymbol.ts new file mode 100644 index 0000000..72f7a1d --- /dev/null +++ b/src/swf/common/ISWFTagSymbol.ts @@ -0,0 +1,5 @@ +export interface ISWFTagSymbol +{ + id: number; + name: string; +} diff --git a/src/swf/common/index.ts b/src/swf/common/index.ts new file mode 100644 index 0000000..c61164d --- /dev/null +++ b/src/swf/common/index.ts @@ -0,0 +1,11 @@ +export * from './ISWF'; +export * from './ISWFFileAttributes'; +export * from './ISWFFileLength'; +export * from './ISWFFrameSize'; +export * from './ISWFTag'; +export * from './ISWFTagAsset'; +export * from './ISWFTagHeader'; +export * from './ISWFTagLabel'; +export * from './ISWFTagScene'; +export * from './ISWFTagSplitter'; +export * from './ISWFTagSymbol'; diff --git a/src/swf/index.ts b/src/swf/index.ts new file mode 100644 index 0000000..2895ec8 --- /dev/null +++ b/src/swf/index.ts @@ -0,0 +1,21 @@ +export * from './common'; +export * from './ConcatSWFHeader'; +export * from './GenerateEffectBundle'; +export * from './GenerateFigureBundle'; +export * from './GenerateFurnitureBundle'; +export * from './GeneratePetBundle'; +export * from './GenerateSpritesheet'; +export * from './HabboAssetSWF'; +export * from './PackImages'; +export * from './ReadImagesDefineBitsLossless'; +export * from './ReadImagesJPEG3or4'; +export * from './ReadSWF'; +export * from './ReadSWFBuffer'; +export * from './ReadSWFTags'; +export * from './RecognizeImageHeader'; +export * from './SWFBuffer'; +export * from './SWFDownloader'; +export * from './SWFTags'; +export * from './SWFUtilities'; +export * from './tags'; +export * from './UncompressSWF'; diff --git a/src/swf/tags/CharacterTag.ts b/src/swf/tags/CharacterTag.ts index 2f44f53..3f8d35d 100644 --- a/src/swf/tags/CharacterTag.ts +++ b/src/swf/tags/CharacterTag.ts @@ -1,7 +1,11 @@ export abstract class CharacterTag { private _className: string = ''; - private _characterId: number = -1; + + constructor( + protected _characterId: number = 1 + ) + {} public get className(): string { diff --git a/src/swf/tags/ImageTag.ts b/src/swf/tags/ImageTag.ts index 422cec1..b8e09b1 100644 --- a/src/swf/tags/ImageTag.ts +++ b/src/swf/tags/ImageTag.ts @@ -3,27 +3,16 @@ import { ITag } from './ITag'; export class ImageTag extends CharacterTag implements ITag { - private readonly _code: number; - private readonly _characterID: number; - private readonly _imgType: string; - private readonly _imgData: Buffer; - - private readonly _bitmapWidth: number; - private readonly _bitmapHeight: number; - - constructor(image: { code: number, characterID: number, imgType: string, imgData: Buffer, bitmapWidth: number, bitmapHeight: number }) + constructor( + protected _characterId: number, + private _code: number, + private _imgType: string, + private _imgData: Buffer, + private _imgWidth: number = 0, + private _imgHeight: number = 0 + ) { - super(); - - this._code = image.code; - this._characterID = image.characterID; - this._imgType = image.imgType; - this._imgData = image.imgData; - - this.characterId = this._characterID; - - this._bitmapWidth = image.bitmapWidth; - this._bitmapHeight = image.bitmapHeight; + super(_characterId); } public get code(): number @@ -31,11 +20,6 @@ export class ImageTag extends CharacterTag implements ITag return this._code; } - public get characterID(): number - { - return this._characterID; - } - public get imgType(): string { return this._imgType; @@ -46,13 +30,13 @@ export class ImageTag extends CharacterTag implements ITag return this._imgData; } - public get bitmapWidth(): number + public get imgWidth(): number { - return this._bitmapWidth; + return this._imgWidth; } - public get bitmapHeight(): number + public get imgHeight(): number { - return this._bitmapHeight; + return this._imgHeight; } } diff --git a/src/swf/tags/index.ts b/src/swf/tags/index.ts new file mode 100644 index 0000000..9cb05c1 --- /dev/null +++ b/src/swf/tags/index.ts @@ -0,0 +1,6 @@ +export * from './CharacterTag'; +export * from './DefineBinaryDataTag'; +export * from './ImageTag'; +export * from './ISymbolClass'; +export * from './ITag'; +export * from './SymbolClassTag'; diff --git a/src/utils/File.ts b/src/utils/File.ts deleted file mode 100644 index 5ff7c3a..0000000 --- a/src/utils/File.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { existsSync, lstatSync, mkdirSync, readdirSync, RmOptions, rmSync } from 'fs'; - -export class File -{ - private readonly _path: string; - - constructor(path: string) - { - this._path = path; - } - - public exists(): boolean - { - return existsSync(this._path); - } - - public mkdirs(): void - { - return mkdirSync(this._path); - } - - public list(): string[] - { - const test = readdirSync(this._path); - - return test; - } - - public isDirectory(): boolean - { - return this.exists() && lstatSync(this._path).isDirectory(); - } - - public rmdir(options: RmOptions): void - { - return rmSync(this._path, options); - } - - public get path(): string - { - return this._path; - } -} diff --git a/src/utils/Logger.ts b/src/utils/Logger.ts deleted file mode 100644 index b185fe3..0000000 --- a/src/utils/Logger.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { WriteStream } from 'fs'; -import { singleton } from 'tsyringe'; - -@singleton() -export class Logger -{ - private _fileName: string = `error-${ Date.now() }.log`; - private _writeStream: WriteStream = null; - - constructor() - { - - } - - public logError(message: string): void - { - // - } -} diff --git a/src/utils/NitroBundle.ts b/src/utils/NitroBundle.ts deleted file mode 100644 index a81c84d..0000000 --- a/src/utils/NitroBundle.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as ByteBuffer from 'bytebuffer'; -import { promisify } from 'util'; -import * as zlib from 'zlib'; - -const gzip = promisify(zlib.gzip); - -export class NitroBundle -{ - private readonly _files: Map; - - constructor() - { - this._files = new Map(); - } - - addFile(name: string, data: Buffer) - { - this._files.set(name, data); - } - - async toBufferAsync() - { - const buffer = new ByteBuffer(); - - buffer.writeUint16(this._files.size); - - const iterator = this._files.entries(); - let result: IteratorResult<[string, Buffer]> = iterator.next(); - while(!result.done) - { - const fileName = result.value[0]; - const file = result.value[1]; - - buffer.writeUint16(fileName.length); - buffer.writeString(fileName); - - const compressed = await gzip(file); - buffer.writeUint32(compressed.length); - buffer.append(compressed); - - result = iterator.next(); - } - - return buffer.flip().toBuffer(); - } -} diff --git a/src/utils/SwfReader.ts b/src/utils/SwfReader.ts deleted file mode 100644 index 9c1d795..0000000 --- a/src/utils/SwfReader.ts +++ /dev/null @@ -1,311 +0,0 @@ -import {writeFileSync} from "fs"; - -const SWFReader = require('../swf-reader/index.js'); - -const _encoder = require('png-stream/encoder'); - -const _encoder2 = _interopRequireDefault(_encoder); - -const _zlib = require('zlib'); - -const _zlib2 = _interopRequireDefault(_zlib); - -const _streamToArray = require('stream-to-array'); - -const _streamToArray2 = _interopRequireDefault(_streamToArray); - -const _stream = require('stream'); - -const _stream2 = _interopRequireDefault(_stream); - -const _decoder = require('jpg-stream/decoder'); - -const _decoder2 = _interopRequireDefault(_decoder); - -function _interopRequireDefault(obj: any) -{ - return obj && obj.__esModule ? obj : { default: obj }; -} - -const _concatFrames = require('concat-frames'); - -const _concatFrames2 = _interopRequireDefault(_concatFrames); - -const _slicedToArray = function () -{ - function sliceIterator(arr: any, i: any) - { - const _arr = []; - let _n = true; - let _d = false; - let _e = undefined; - try - { - for(var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) - { - _arr.push(_s.value); - if(i && _arr.length === i) break; - } - } - catch (err) - { - _d = true; - _e = err; - } - finally - { - try - { - if(!_n && _i['return']) _i['return'](); - } - finally - { - if(_d) throw _e; - } - } - return _arr; - } - - return function (arr: any, i: any) - { - if(Array.isArray(arr)) - { - return arr; - } - else if(Symbol.iterator in Object(arr)) - { - return sliceIterator(arr, i); - } - else - { - throw new TypeError('Invalid attempt to destructure non-iterable instance'); - } - }; -}(); - -export function readSwfAsync(data: string | Buffer): Promise -{ - return new Promise(((resolve, reject) => - { - SWFReader.read(data, function (err: Error, swf: any) - { - if(err) - { - reject(err); - } - resolve(swf); - }); - })); -} - -const pngMagic = Buffer.from('0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A'.split(' ').map(Number)); -const gifMagic = Buffer.from('0x47 0x49 0x46 0x38 0x39 0x61'.split(' ').map(Number)); -const jpegMagic = Buffer.from('0xFF 0xD8'.split(' ').map(Number)); -const recognizeHeader = function recognizeHeader(buffer: Buffer) -{ - if(pngMagic.equals(buffer.slice(0, pngMagic.length))) return 'png'; - if(gifMagic.equals(buffer.slice(0, gifMagic.length))) return 'gif'; - if(jpegMagic.equals(buffer.slice(0, jpegMagic.length))) return 'jpeg'; - - throw new Error('unknown format: ' + buffer.slice(0, 8)); -}; - -export async function readImagesJPEG3or4(code: number, tagData: any): Promise -{ - const characterId = tagData.characterId, - imageData = tagData.imageData; - - const imgType = recognizeHeader(imageData); - if(imgType !== 'jpeg') - { - return { - code: code, - characterId: characterId, - imgType: imgType, - imgData: imageData - }; - } - - const bitmapAlphaData = tagData.bitmapAlphaData; - - return new Promise(function (resolve, reject) - { - const enc = new _encoder2.default(undefined, undefined, { colorSpace: 'rgba' }); - _zlib2.default.unzip(bitmapAlphaData, function (err: any, alphaBufPre: any) - { - // INVARIANT: alphaBuf is either null or a non-empty buffer - let alphaBuf: any = null; - if(err) - { - /* - Due to a bug present in node zlib (https://github.com/nodejs/node/issues/17041) - unzipping an empty buffer can raise "unexpected end of file" error. - We fix this here so that our impl does not depend on the version of node - being used. - Theoretically every zlib.unzip call needs to be guarded, but for this package, - other two zlib.unzip call happens at sites that an empty uncompressed Buffer - does not make sense. So I think the current fix is good enough. - */ - if(bitmapAlphaData && bitmapAlphaData.length > 0) - { - return reject(new Error(err)); - } - // leaving alphaBuf as null - } - else - { - // ensure alphaBuf is only assigned an non-empty Buffer - if(alphaBufPre.length > 0) alphaBuf = alphaBufPre; - } - const bufferStream = new _stream2.default.PassThrough(); - bufferStream.end(imageData); - bufferStream.pipe(new _decoder2.default()).pipe((_concatFrames2.default)(function (_ref: any) - { - const _ref2 = _slicedToArray(_ref, 1), - frame = _ref2[0]; - - const input = frame.pixels; - const pCount = frame.width * frame.height; - const output = Buffer.alloc(pCount * 4); - if(alphaBuf !== null && alphaBuf.length !== pCount) - { - console.error('expect alphaBuf to have size ' + pCount + ' while getting ' + alphaBuf.length); - } - const getAlphaBuf = alphaBuf === null ? function (_ignored: any) - { - return 0xff; - } : function (i: any) - { - return alphaBuf[i]; - }; - - for(let i = 0; i < pCount; ++i) - { - output[4 * i] = input[3 * i]; - output[4 * i + 1] = input[3 * i + 1]; - output[4 * i + 2] = input[3 * i + 2]; - output[4 * i + 3] = getAlphaBuf(i); - } - enc.format.width = frame.width; - enc.format.height = frame.height; - enc.end(output); - })); - }); - (_streamToArray2.default)(enc).then(function (parts: any) - { - const buffers = parts.map(function (part: any) - { - return Buffer.isBuffer(part) ? part : Buffer.from(part); - }); - resolve({ - code: code, - characterId: characterId, - imgType: 'png', - imgData: Buffer.concat(buffers) - }); - }); - }); -} - -export interface ImageTagData { - code: number, - characterId: number, - imgType: string, - imgData: Buffer, - bitmapWidth: number, - bitmapHeight: number -} - -export function readImagesDefineBitsLossless(tag: any) -{ - const characterId = tag.characterId, - bitmapFormat = tag.bitmapFormat, - bitmapWidth = tag.bitmapWidth, - bitmapHeight = tag.bitmapHeight, - bitmapColorTableSize = tag.bitmapColorTableSize, - zlibBitmapData = tag.zlibBitmapData; - - - return new Promise(function (resolve, reject) - { - const enc = new _encoder2.default(bitmapWidth, bitmapHeight, { colorSpace: 'rgba' }); - - _zlib2.default.unzip(zlibBitmapData, function (err: any, dataBuf: any) - { - if(err) - { - return reject(new Error(err)); - } - const output = Buffer.alloc(bitmapWidth * bitmapHeight * 4); - let index = 0; - let ptr = 0; - if(bitmapFormat === 5) - { - // 32-bit ARGB image - for(let y = 0; y < bitmapHeight; ++y) - { - for(let x = 0; x < bitmapWidth; ++x) - { - const alpha = dataBuf[ptr]; - output[index] = dataBuf[ptr + 1] * (255 / alpha); - output[index + 1] = dataBuf[ptr + 2] * (255 / alpha); - output[index + 2] = dataBuf[ptr + 3] * (255 / alpha); - output[index + 3] = alpha; - index += 4; - ptr += 4; - } - } - } - else if(bitmapFormat === 3) - { - // 8-bit colormapped image - const colorMap = []; - for(let i = 0; i < bitmapColorTableSize + 1; ++i) - { - colorMap.push([dataBuf[ptr], dataBuf[ptr + 1], dataBuf[ptr + 2], dataBuf[ptr + 3]]); - ptr += 4; - } - for(let _y2 = 0; _y2 < bitmapHeight; ++_y2) - { - for(let _x2 = 0; _x2 < bitmapWidth; ++_x2) - { - const idx = dataBuf[ptr]; - const color = idx < colorMap.length ? colorMap[idx] : [0, 0, 0, 0]; - output[index] = color[0]; - output[index + 1] = color[1]; - output[index + 2] = color[2]; - output[index + 3] = color[3]; - ptr += 1; - index += 4; - } - // skip padding - ptr += (4 - bitmapWidth % 4) % 4; - } - } - else - { - return reject(new Error('unhandled bitmapFormat: ' + bitmapFormat)); - } - enc.end(output); - }); - - (_streamToArray2.default)(enc).then(function (parts: any) - { - const buffers = parts.map(function (part: any) - { - return Buffer.isBuffer(part) ? part : Buffer.from(part); - }); - resolve({ - code: 36, - characterId: characterId, - imgType: 'png', - imgData: Buffer.concat(buffers), - bitmapWidth: bitmapWidth, - bitmapHeight: bitmapHeight - }); - }); - }).catch(function (e) - { - console.error(e); - }); -} diff --git a/tsconfig.json b/tsconfig.json index 5373a57..41b76b2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "declaration": true, + "declaration": false, "noImplicitAny": false, "noUnusedLocals": false, "removeComments": true, @@ -12,12 +12,13 @@ "target": "es6", "sourceMap": false, "allowJs": true, + "esModuleInterop": true, "baseUrl": "./src", "outDir": "./dist" }, "include": [ - "src/configuration.json", - "src/**/*" + "src/**/*", + "node_modules/wrappy/swf" ], "exclude": [ "node_modules",