From bd6ed1e08cddc23a5cd6090fa6b884a0c48b9236 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:46:26 +0200 Subject: [PATCH 001/103] draft: metrics engine --- deno.jsonc | 53 + deno.lock | 1603 +++++++++++++++++++++++++++++++ metrics/components/component.ts | 169 ++++ metrics/components/internal.ts | 51 + metrics/components/plugin.ts | 189 ++++ metrics/components/processor.ts | 99 ++ metrics/components/requests.ts | 122 +++ metrics/config.ts | 180 ++++ metrics/metadata.ts | 37 + metrics/process.ts | 29 + metrics/utils/browser.ts | 66 ++ metrics/utils/errors.ts | 19 + metrics/utils/format.ts | 69 ++ metrics/utils/graph.ts | 0 metrics/utils/io.ts | 59 ++ metrics/utils/log.ts | 180 ++++ metrics/utils/parse.ts | 24 + metrics/utils/testing.ts | 15 + metrics/utils/validator.ts | 14 + metrics/version.ts | 6 + 20 files changed, 2984 insertions(+) create mode 100644 deno.jsonc create mode 100644 deno.lock create mode 100644 metrics/components/component.ts create mode 100644 metrics/components/internal.ts create mode 100644 metrics/components/plugin.ts create mode 100644 metrics/components/processor.ts create mode 100644 metrics/components/requests.ts create mode 100644 metrics/config.ts create mode 100644 metrics/metadata.ts create mode 100644 metrics/process.ts create mode 100644 metrics/utils/browser.ts create mode 100644 metrics/utils/errors.ts create mode 100644 metrics/utils/format.ts create mode 100644 metrics/utils/graph.ts create mode 100644 metrics/utils/io.ts create mode 100644 metrics/utils/log.ts create mode 100644 metrics/utils/parse.ts create mode 100644 metrics/utils/testing.ts create mode 100644 metrics/utils/validator.ts create mode 100644 metrics/version.ts diff --git a/deno.jsonc b/deno.jsonc new file mode 100644 index 00000000000..d6b66d04a38 --- /dev/null +++ b/deno.jsonc @@ -0,0 +1,53 @@ +// TODO(@lowlighter): remove legacy when migrated +{ + "version": "4.0.0", + "imports": { + "std/": "https://deno.land/std@0.201.0/", + "x/": "https://deno.land/x/", + "y/": "https://esm.sh/", + "@metrics/": "./metrics/", + "@utils/": "./metrics/utils/", + "@testing": "./metrics/utils/testing.ts", + "@plugin": "./metrics/components/plugin.ts", + "@processor": "./metrics/components/processor.ts", + "@plugins/": "./plugins/", + "@processors/": "./processors/" + }, + "nodeModulesDir": true, + "tasks": { + "serve": "$(deno run --allow-env run/flags.ts --allow-net=localhost run run/server/mod.ts --watch $0)", + "test": "$(deno run --allow-env run/flags.ts test run/mod_test.ts $0)", + "coverage": "rm .coverage -rf && deno task test $0 && deno coverage .coverage", + "lint": "deno lint", + "fmt": "deno fmt", + "hook": "deno task lint && deno task fmt --check && deno task test" + }, + "lint": { + "rules": { + "include": [ + "ban-untagged-todo", + "default-param-last", + "eqeqeq", + "no-const-assign", + "no-eval", + "no-sparse-arrays", + "no-sync-fn-in-async-fn", + "no-throw-literal" + ] + }, + "exclude": ["node_modules", ".legacy"] + }, + "fmt": { + "lineWidth": 200, + "semiColons": false, + "exclude": ["node_modules", "CODE_OF_CONDUCT.md", ".legacy", ".coverage", ".test"] + }, + "compilerOptions": { + "lib": [ + "deno.ns", + "dom", + "dom.asynciterable", + "dom.iterable" + ] + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 00000000000..b2bbd170134 --- /dev/null +++ b/deno.lock @@ -0,0 +1,1603 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "npm:@types/node": "npm:@types/node@18.16.19", + "npm:jsonwebtoken": "npm:jsonwebtoken@9.0.2", + "npm:puppeteer": "npm:puppeteer@21.2.1", + "npm:puppeteer-core": "npm:puppeteer-core@21.2.1_devtools-protocol@0.0.1159816", + "npm:puppeteer@21.2.1": "npm:puppeteer@21.2.1" + }, + "npm": { + "@babel/code-frame@7.22.13": { + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "@babel/highlight@7.22.13", + "chalk": "chalk@2.4.2" + } + }, + "@babel/helper-validator-identifier@7.22.19": { + "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", + "dependencies": {} + }, + "@babel/highlight@7.22.13": { + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dependencies": { + "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.19", + "chalk": "chalk@2.4.2", + "js-tokens": "js-tokens@4.0.0" + } + }, + "@puppeteer/browsers@1.7.1": { + "integrity": "sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw==", + "dependencies": { + "debug": "debug@4.3.4", + "extract-zip": "extract-zip@2.0.1", + "progress": "progress@2.0.3", + "proxy-agent": "proxy-agent@6.3.1", + "tar-fs": "tar-fs@3.0.4", + "unbzip2-stream": "unbzip2-stream@1.4.3", + "yargs": "yargs@17.7.1" + } + }, + "@tootallnate/quickjs-emscripten@0.23.0": { + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dependencies": {} + }, + "@types/node@18.16.19": { + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dependencies": {} + }, + "@types/yauzl@2.10.0": { + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dependencies": { + "@types/node": "@types/node@18.16.19" + } + }, + "agent-base@7.1.0": { + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "debug@4.3.4" + } + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dependencies": {} + }, + "ansi-styles@3.2.1": { + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "color-convert@1.9.3" + } + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "color-convert@2.0.1" + } + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dependencies": {} + }, + "ast-types@0.13.4": { + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "tslib@2.6.0" + } + }, + "b4a@1.6.4": { + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dependencies": {} + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dependencies": {} + }, + "basic-ftp@5.0.3": { + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dependencies": {} + }, + "buffer-crc32@0.2.13": { + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dependencies": {} + }, + "buffer-equal-constant-time@1.0.1": { + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dependencies": {} + }, + "buffer@5.7.1": { + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": { + "base64-js": "base64-js@1.5.1", + "ieee754": "ieee754@1.2.1" + } + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dependencies": {} + }, + "chalk@2.4.2": { + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "ansi-styles@3.2.1", + "escape-string-regexp": "escape-string-regexp@1.0.5", + "supports-color": "supports-color@5.5.0" + } + }, + "chromium-bidi@0.4.26_devtools-protocol@0.0.1159816": { + "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", + "dependencies": { + "devtools-protocol": "devtools-protocol@0.0.1159816", + "mitt": "mitt@3.0.1" + } + }, + "cliui@8.0.1": { + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "string-width@4.2.3", + "strip-ansi": "strip-ansi@6.0.1", + "wrap-ansi": "wrap-ansi@7.0.0" + } + }, + "color-convert@1.9.3": { + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "color-name@1.1.3" + } + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "color-name@1.1.4" + } + }, + "color-name@1.1.3": { + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dependencies": {} + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dependencies": {} + }, + "cosmiconfig@8.3.5": { + "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "dependencies": { + "import-fresh": "import-fresh@3.3.0", + "js-yaml": "js-yaml@4.1.0", + "parse-json": "parse-json@5.2.0", + "path-type": "path-type@4.0.0" + } + }, + "cross-fetch@4.0.0": { + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "node-fetch@2.7.0" + } + }, + "data-uri-to-buffer@5.0.1": { + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "dependencies": {} + }, + "debug@4.3.4": { + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "degenerator@5.0.1": { + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "ast-types@0.13.4", + "escodegen": "escodegen@2.1.0", + "esprima": "esprima@4.0.1" + } + }, + "devtools-protocol@0.0.1159816": { + "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==", + "dependencies": {} + }, + "ecdsa-sig-formatter@1.0.11": { + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dependencies": {} + }, + "end-of-stream@1.4.4": { + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "once@1.4.0" + } + }, + "error-ex@1.3.2": { + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "is-arrayish@0.2.1" + } + }, + "escalade@3.1.1": { + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dependencies": {} + }, + "escape-string-regexp@1.0.5": { + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dependencies": {} + }, + "escodegen@2.1.0": { + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "esprima@4.0.1", + "estraverse": "estraverse@5.3.0", + "esutils": "esutils@2.0.3", + "source-map": "source-map@0.6.1" + } + }, + "esprima@4.0.1": { + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dependencies": {} + }, + "estraverse@5.3.0": { + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dependencies": {} + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dependencies": {} + }, + "extract-zip@2.0.1": { + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "@types/yauzl": "@types/yauzl@2.10.0", + "debug": "debug@4.3.4", + "get-stream": "get-stream@5.2.0", + "yauzl": "yauzl@2.10.0" + } + }, + "fast-fifo@1.3.2": { + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dependencies": {} + }, + "fd-slicer@1.1.0": { + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "pend@1.2.0" + } + }, + "fs-extra@8.1.0": { + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "graceful-fs@4.2.11", + "jsonfile": "jsonfile@4.0.0", + "universalify": "universalify@0.1.2" + } + }, + "get-caller-file@2.0.5": { + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dependencies": {} + }, + "get-stream@5.2.0": { + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "pump@3.0.0" + } + }, + "get-uri@6.0.1": { + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "dependencies": { + "basic-ftp": "basic-ftp@5.0.3", + "data-uri-to-buffer": "data-uri-to-buffer@5.0.1", + "debug": "debug@4.3.4", + "fs-extra": "fs-extra@8.1.0" + } + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dependencies": {} + }, + "has-flag@3.0.0": { + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dependencies": {} + }, + "http-proxy-agent@7.0.0": { + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "agent-base@7.1.0", + "debug": "debug@4.3.4" + } + }, + "https-proxy-agent@7.0.2": { + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "agent-base@7.1.0", + "debug": "debug@4.3.4" + } + }, + "ieee754@1.2.1": { + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dependencies": {} + }, + "import-fresh@3.3.0": { + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "parent-module@1.0.1", + "resolve-from": "resolve-from@4.0.0" + } + }, + "ip@1.1.8": { + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dependencies": {} + }, + "ip@2.0.0": { + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dependencies": {} + }, + "is-arrayish@0.2.1": { + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dependencies": {} + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dependencies": {} + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dependencies": {} + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "argparse@2.0.1" + } + }, + "json-parse-even-better-errors@2.3.1": { + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dependencies": {} + }, + "jsonfile@4.0.0": { + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dependencies": { + "graceful-fs": "graceful-fs@4.2.11" + } + }, + "jsonwebtoken@9.0.2": { + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "jws@3.2.2", + "lodash.includes": "lodash.includes@4.3.0", + "lodash.isboolean": "lodash.isboolean@3.0.3", + "lodash.isinteger": "lodash.isinteger@4.0.4", + "lodash.isnumber": "lodash.isnumber@3.0.3", + "lodash.isplainobject": "lodash.isplainobject@4.0.6", + "lodash.isstring": "lodash.isstring@4.0.1", + "lodash.once": "lodash.once@4.1.1", + "ms": "ms@2.1.2", + "semver": "semver@7.5.4" + } + }, + "jwa@1.4.1": { + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "buffer-equal-constant-time@1.0.1", + "ecdsa-sig-formatter": "ecdsa-sig-formatter@1.0.11", + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "jws@3.2.2": { + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "jwa@1.4.1", + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "lines-and-columns@1.2.4": { + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dependencies": {} + }, + "lodash.includes@4.3.0": { + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dependencies": {} + }, + "lodash.isboolean@3.0.3": { + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dependencies": {} + }, + "lodash.isinteger@4.0.4": { + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dependencies": {} + }, + "lodash.isnumber@3.0.3": { + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dependencies": {} + }, + "lodash.isplainobject@4.0.6": { + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dependencies": {} + }, + "lodash.isstring@4.0.1": { + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dependencies": {} + }, + "lodash.once@4.1.1": { + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dependencies": {} + }, + "lru-cache@6.0.0": { + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "yallist@4.0.0" + } + }, + "lru-cache@7.18.3": { + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dependencies": {} + }, + "mitt@3.0.1": { + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dependencies": {} + }, + "mkdirp-classic@0.5.3": { + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dependencies": {} + }, + "ms@2.1.2": { + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dependencies": {} + }, + "netmask@2.0.2": { + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dependencies": {} + }, + "node-fetch@2.7.0": { + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "whatwg-url@5.0.0" + } + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "wrappy@1.0.2" + } + }, + "pac-proxy-agent@7.0.1": { + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "@tootallnate/quickjs-emscripten@0.23.0", + "agent-base": "agent-base@7.1.0", + "debug": "debug@4.3.4", + "get-uri": "get-uri@6.0.1", + "http-proxy-agent": "http-proxy-agent@7.0.0", + "https-proxy-agent": "https-proxy-agent@7.0.2", + "pac-resolver": "pac-resolver@7.0.0", + "socks-proxy-agent": "socks-proxy-agent@8.0.2" + } + }, + "pac-resolver@7.0.0": { + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dependencies": { + "degenerator": "degenerator@5.0.1", + "ip": "ip@1.1.8", + "netmask": "netmask@2.0.2" + } + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "callsites@3.1.0" + } + }, + "parse-json@5.2.0": { + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "@babel/code-frame@7.22.13", + "error-ex": "error-ex@1.3.2", + "json-parse-even-better-errors": "json-parse-even-better-errors@2.3.1", + "lines-and-columns": "lines-and-columns@1.2.4" + } + }, + "path-type@4.0.0": { + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dependencies": {} + }, + "pend@1.2.0": { + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dependencies": {} + }, + "progress@2.0.3": { + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dependencies": {} + }, + "proxy-agent@6.3.1": { + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dependencies": { + "agent-base": "agent-base@7.1.0", + "debug": "debug@4.3.4", + "http-proxy-agent": "http-proxy-agent@7.0.0", + "https-proxy-agent": "https-proxy-agent@7.0.2", + "lru-cache": "lru-cache@7.18.3", + "pac-proxy-agent": "pac-proxy-agent@7.0.1", + "proxy-from-env": "proxy-from-env@1.1.0", + "socks-proxy-agent": "socks-proxy-agent@8.0.2" + } + }, + "proxy-from-env@1.1.0": { + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dependencies": {} + }, + "pump@3.0.0": { + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "end-of-stream@1.4.4", + "once": "once@1.4.0" + } + }, + "puppeteer-core@21.2.1_devtools-protocol@0.0.1159816": { + "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", + "dependencies": { + "@puppeteer/browsers": "@puppeteer/browsers@1.7.1", + "chromium-bidi": "chromium-bidi@0.4.26_devtools-protocol@0.0.1159816", + "cross-fetch": "cross-fetch@4.0.0", + "debug": "debug@4.3.4", + "devtools-protocol": "devtools-protocol@0.0.1159816", + "ws": "ws@8.14.1" + } + }, + "puppeteer@21.2.1": { + "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", + "dependencies": { + "@puppeteer/browsers": "@puppeteer/browsers@1.7.1", + "cosmiconfig": "cosmiconfig@8.3.5", + "puppeteer-core": "puppeteer-core@21.2.1_devtools-protocol@0.0.1159816" + } + }, + "queue-tick@1.0.1": { + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dependencies": {} + }, + "require-directory@2.1.1": { + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dependencies": {} + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dependencies": {} + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dependencies": {} + }, + "semver@7.5.4": { + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "lru-cache@6.0.0" + } + }, + "smart-buffer@4.2.0": { + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dependencies": {} + }, + "socks-proxy-agent@8.0.2": { + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "agent-base@7.1.0", + "debug": "debug@4.3.4", + "socks": "socks@2.7.1" + } + }, + "socks@2.7.1": { + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "ip@2.0.0", + "smart-buffer": "smart-buffer@4.2.0" + } + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dependencies": {} + }, + "streamx@2.15.1": { + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dependencies": { + "fast-fifo": "fast-fifo@1.3.2", + "queue-tick": "queue-tick@1.0.1" + } + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "emoji-regex@8.0.0", + "is-fullwidth-code-point": "is-fullwidth-code-point@3.0.0", + "strip-ansi": "strip-ansi@6.0.1" + } + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "ansi-regex@5.0.1" + } + }, + "supports-color@5.5.0": { + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "has-flag@3.0.0" + } + }, + "tar-fs@3.0.4": { + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "mkdirp-classic@0.5.3", + "pump": "pump@3.0.0", + "tar-stream": "tar-stream@3.1.6" + } + }, + "tar-stream@3.1.6": { + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "b4a@1.6.4", + "fast-fifo": "fast-fifo@1.3.2", + "streamx": "streamx@2.15.1" + } + }, + "through@2.3.8": { + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dependencies": {} + }, + "tr46@0.0.3": { + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dependencies": {} + }, + "tslib@2.6.0": { + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dependencies": {} + }, + "unbzip2-stream@1.4.3": { + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "buffer@5.7.1", + "through": "through@2.3.8" + } + }, + "universalify@0.1.2": { + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dependencies": {} + }, + "webidl-conversions@3.0.1": { + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dependencies": {} + }, + "whatwg-url@5.0.0": { + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "tr46@0.0.3", + "webidl-conversions": "webidl-conversions@3.0.1" + } + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "string-width": "string-width@4.2.3", + "strip-ansi": "strip-ansi@6.0.1" + } + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dependencies": {} + }, + "ws@8.14.1": { + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "dependencies": {} + }, + "y18n@5.0.8": { + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dependencies": {} + }, + "yallist@4.0.0": { + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dependencies": {} + }, + "yargs-parser@21.1.1": { + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dependencies": {} + }, + "yargs@17.7.1": { + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "cliui@8.0.1", + "escalade": "escalade@3.1.1", + "get-caller-file": "get-caller-file@2.0.5", + "require-directory": "require-directory@2.1.1", + "string-width": "string-width@4.2.3", + "y18n": "y18n@5.0.8", + "yargs-parser": "yargs-parser@21.1.1" + } + }, + "yauzl@2.10.0": { + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "buffer-crc32@0.2.13", + "fd-slicer": "fd-slicer@1.1.0" + } + } + } + }, + "redirects": { + "https://esm.sh/@octokit/auth-app": "https://esm.sh/@octokit/auth-app@6.0.0", + "https://esm.sh/@octokit/core": "https://esm.sh/@octokit/core@5.0.0", + "https://esm.sh/octokit": "https://esm.sh/octokit@3.1.0", + "https://esm.sh/v132/@types/csso@~5.0/index.d.ts": "https://esm.sh/v132/@types/csso@5.0.1/index.d.ts", + "https://esm.sh/v132/@types/ejs@~3.1/index.d.ts": "https://esm.sh/v132/@types/ejs@3.1.2/index.d.ts", + "https://esm.sh/v132/@types/html-escaper@~3.0/index.d.ts": "https://esm.sh/v132/@types/html-escaper@3.0.0/index.d.ts", + "https://esm.sh/v132/@types/pluralize@latest/index.d.ts": "https://esm.sh/v132/@types/pluralize@0.0.30/index.d.ts", + "https://esm.sh/v132/@types/primer__octicons@^19/index.d.ts": "https://esm.sh/v132/@types/primer__octicons@19.6.0/index.d.ts" + }, + "remote": { + "https://api.github.com/emojis": "9d2b0d98d88cf1e20ad659bdc6ce67219eac949c598b7d6b58c6284092a385d7", + "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", + "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", + "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", + "https://deno.land/std@0.194.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.194.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", + "https://deno.land/std@0.194.0/io/buffer.ts": "17f4410eaaa60a8a85733e8891349a619eadfbbe42e2f319283ce2b8f29723ab", + "https://deno.land/std@0.194.0/yaml/_dumper/dumper.ts": "a2c937a53a2b0473125a31a330334cc3f30e98fd82f8143bc225583d1260890b", + "https://deno.land/std@0.194.0/yaml/_dumper/dumper_state.ts": "f0d0673ceea288334061ca34b63954c2bb5feb5bf6de5e4cfe9a942cdf6e5efe", + "https://deno.land/std@0.194.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", + "https://deno.land/std@0.194.0/yaml/_loader/loader.ts": "47b9592efcb390b58b1903cc471bfdf1fc71a0d2d2b31e37b5cae7d8804c7aed", + "https://deno.land/std@0.194.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", + "https://deno.land/std@0.194.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", + "https://deno.land/std@0.194.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", + "https://deno.land/std@0.194.0/yaml/_type/binary.ts": "d34d8c8d8ed521e270cfede3401c425b971af4f6c69da1e2cb32b172d42c7da7", + "https://deno.land/std@0.194.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", + "https://deno.land/std@0.194.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", + "https://deno.land/std@0.194.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", + "https://deno.land/std@0.194.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", + "https://deno.land/std@0.194.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", + "https://deno.land/std@0.194.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", + "https://deno.land/std@0.194.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", + "https://deno.land/std@0.194.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", + "https://deno.land/std@0.194.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", + "https://deno.land/std@0.194.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", + "https://deno.land/std@0.194.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", + "https://deno.land/std@0.194.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", + "https://deno.land/std@0.194.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", + "https://deno.land/std@0.194.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", + "https://deno.land/std@0.194.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", + "https://deno.land/std@0.194.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", + "https://deno.land/std@0.194.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", + "https://deno.land/std@0.194.0/yaml/mod.ts": "28ecda6652f3e7a7735ee29c247bfbd32a2e2fc5724068e9fd173ec4e59f66f7", + "https://deno.land/std@0.194.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", + "https://deno.land/std@0.194.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", + "https://deno.land/std@0.194.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", + "https://deno.land/std@0.194.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", + "https://deno.land/std@0.194.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", + "https://deno.land/std@0.194.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", + "https://deno.land/std@0.194.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", + "https://deno.land/std@0.194.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", + "https://deno.land/std@0.194.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", + "https://deno.land/std@0.194.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.201.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.201.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", + "https://deno.land/std@0.201.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", + "https://deno.land/std@0.201.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", + "https://deno.land/std@0.201.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", + "https://deno.land/std@0.201.0/assert/assert_false.ts": "a9962749f4bf5844e3fa494257f1de73d69e4fe0e82c34d0099287552163a2dc", + "https://deno.land/std@0.201.0/assert/assert_greater.ts": "ae2158a2d19313bf675bf7251d31c6dc52973edb12ac64ac8fc7064152af3e63", + "https://deno.land/std@0.201.0/assert/assert_greater_or_equal.ts": "1439da5ebbe20855446cac50097ac78b9742abe8e9a43e7de1ce1426d556e89c", + "https://deno.land/std@0.201.0/assert/assert_instance_of.ts": "3aedb3d8186e120812d2b3a5dea66a6e42bf8c57a8bd927645770bd21eea554c", + "https://deno.land/std@0.201.0/assert/assert_is_error.ts": "c21113094a51a296ffaf036767d616a78a2ae5f9f7bbd464cd0197476498b94b", + "https://deno.land/std@0.201.0/assert/assert_less.ts": "aec695db57db42ec3e2b62e97e1e93db0063f5a6ec133326cc290ff4b71b47e4", + "https://deno.land/std@0.201.0/assert/assert_less_or_equal.ts": "5fa8b6a3ffa20fd0a05032fe7257bf985d207b85685fdbcd23651b70f928c848", + "https://deno.land/std@0.201.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", + "https://deno.land/std@0.201.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", + "https://deno.land/std@0.201.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", + "https://deno.land/std@0.201.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", + "https://deno.land/std@0.201.0/assert/assert_not_strict_equals.ts": "ca6c6d645e95fbc873d25320efeb8c4c6089a9a5e09f92d7c1c4b6e935c2a6ad", + "https://deno.land/std@0.201.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", + "https://deno.land/std@0.201.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", + "https://deno.land/std@0.201.0/assert/assert_strict_equals.ts": "b1f538a7ea5f8348aeca261d4f9ca603127c665e0f2bbfeb91fa272787c87265", + "https://deno.land/std@0.201.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", + "https://deno.land/std@0.201.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", + "https://deno.land/std@0.201.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.201.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.201.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", + "https://deno.land/std@0.201.0/assert/mod.ts": "37c49a26aae2b254bbe25723434dc28cd7532e444cf0b481a97c045d110ec085", + "https://deno.land/std@0.201.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", + "https://deno.land/std@0.201.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", + "https://deno.land/std@0.201.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", + "https://deno.land/std@0.201.0/async/delay.ts": "a6142eb44cdd856b645086af2b811b1fcce08ec06bb7d50969e6a872ee9b8659", + "https://deno.land/std@0.201.0/bytes/bytes_list.ts": "ecf5098c230b793970f43c06e8f30d70b937c031658365aeb3de9a8ae4d406a3", + "https://deno.land/std@0.201.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", + "https://deno.land/std@0.201.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", + "https://deno.land/std@0.201.0/collections/_comparators.ts": "fa7f9a44cea1d270098a2a5a6f8bb30c61b595c1b1f983bd67c6297d766adffa", + "https://deno.land/std@0.201.0/collections/_utils.ts": "5114abc026ddef71207a79609b984614e66a63a4bda17d819d56b0e72c51527e", + "https://deno.land/std@0.201.0/collections/aggregate_groups.ts": "22c7115a2e3d057979066a2238d3ba23b04acdd35491e82d08d2e052b1d7c068", + "https://deno.land/std@0.201.0/collections/associate_by.ts": "64869182eeed3be9222137d071224ac6a01bcc3c5236610306f99e3e3107ec47", + "https://deno.land/std@0.201.0/collections/associate_with.ts": "cf9735d7b4d345275fd3b7420eaba9726a2844e847f2d9e4be9f103f6f3e2c8b", + "https://deno.land/std@0.201.0/collections/binary_heap.ts": "6c889ad21a86593d5d321e3404918f0449c2cde82ba1b57cbc5ffcd6a1d063ae", + "https://deno.land/std@0.201.0/collections/binary_search_node.ts": "8d99dd95901d73a0edbe105826ef7ce0e1111ce184d2d0410dbfda172c9ebf35", + "https://deno.land/std@0.201.0/collections/binary_search_tree.ts": "c3588493fd3b090453fade1903db19cbe398490db6a40a0574d7abdaa87ba652", + "https://deno.land/std@0.201.0/collections/chunk.ts": "f82c52a82ad9338018570c42f6de0fb132fcb14914c31a444e360ac104d7b55b", + "https://deno.land/std@0.201.0/collections/deep_merge.ts": "9db788ba56cb05b65c77166b789e58e125dff159b7f41bf4d19dc1cba19ecb8b", + "https://deno.land/std@0.201.0/collections/distinct.ts": "01595bd8e608a5e2de8a8631055587e6f01d68861e463eef34f8e295713500b8", + "https://deno.land/std@0.201.0/collections/distinct_by.ts": "3afe11d81eafb30c7c9dbf568d94357f3d88153292c00671b72cd695deae6602", + "https://deno.land/std@0.201.0/collections/drop_last_while.ts": "03dd8c55c362efea4f2738b93f102d7487f68beff7b4e4ed67495046b3fe1e4c", + "https://deno.land/std@0.201.0/collections/drop_while.ts": "74cfa9d6b74b3503d5dc70c8ab96af21e7cb2eaff8b9f11aca2aca403e56aeae", + "https://deno.land/std@0.201.0/collections/filter_entries.ts": "77d3f0b3dddcb43e92fc745dd66d01b4922d0eff2a3e2bd25d9d826889f203d8", + "https://deno.land/std@0.201.0/collections/filter_keys.ts": "a29cfe8730ddb54e9e071ea45e8a82e166c7629d18675652def70c1bf80e2ef6", + "https://deno.land/std@0.201.0/collections/filter_values.ts": "16e1fc456a7969e770ec5b89edf5ac97b295ca534b47c1a83f061b409aad7814", + "https://deno.land/std@0.201.0/collections/find_single.ts": "d941876fbec0c1d8b7f41a52f8c1b03198c5695dfaa8d7a12e7a6317d2e6085b", + "https://deno.land/std@0.201.0/collections/first_not_nullish_of.ts": "08d92c4f9c66ff1b1f64a48fa7c1e557e3e6d43f48a46d53a98c3383041b98ae", + "https://deno.land/std@0.201.0/collections/group_by.ts": "f90f483598b38f0174f946589f3af25b1c3cf89d4f3b14d4f0fbe3aaaca0abdd", + "https://deno.land/std@0.201.0/collections/includes_value.ts": "8284a0b3178465b6565d234c1995117320b248dbcff332f77c5e891a11459e0c", + "https://deno.land/std@0.201.0/collections/intersect.ts": "0b4924e2aceaddd5e55591bd9d648cf75745151795ee8a76beddf4facec77548", + "https://deno.land/std@0.201.0/collections/join_to_string.ts": "a487ccc99dbac988698cf5b7c6cc4bb50eefd1784042d0b958a77af413683fe0", + "https://deno.land/std@0.201.0/collections/map_entries.ts": "282b0e5141fbe73a45903674597fb10ec2b211fab8cbac85874eebd97f522a62", + "https://deno.land/std@0.201.0/collections/map_keys.ts": "3dd2cf3a940f1432628cb0252b919d268e8bb38fe8bcd78153a440909173ae98", + "https://deno.land/std@0.201.0/collections/map_not_nullish.ts": "8793a340ca245664902a309ac02861b9eb01780f7b78aa5ad329da7d95e011ec", + "https://deno.land/std@0.201.0/collections/map_values.ts": "c88f306b2b3ec84043e16ab4e1b062055ab32cf4d68bb1d7447afaafa0a1b3bf", + "https://deno.land/std@0.201.0/collections/max_by.ts": "9d5940986aac51b2e4feaebef9cd8bf6e1eceeee5edcf3303e334b737f99520d", + "https://deno.land/std@0.201.0/collections/max_of.ts": "aa29268f102159364bc296eea9f45b0d4f1b041ae9d0037c3dce1c43e21e30be", + "https://deno.land/std@0.201.0/collections/max_with.ts": "252fe7788b6dfcf30cf8c4138cf9bae006a5d545408064ff520293ff0e2fe304", + "https://deno.land/std@0.201.0/collections/min_by.ts": "0fcf1973e8e309da83070dc22def47f468e410d7da462a294c5513ae2c5d6479", + "https://deno.land/std@0.201.0/collections/min_of.ts": "7f2b64620f4f54b75badddfac17e0a84660457233d0921b4c9d9ab31bd3323a8", + "https://deno.land/std@0.201.0/collections/min_with.ts": "ecca4ba5da922fb4b1be515949c59f287e580166985f2b12ee711f768004b33f", + "https://deno.land/std@0.201.0/collections/mod.ts": "f355b8abba1479dfc208ec54fba35f9afaeb996cae01dd06f8d854da56ccb967", + "https://deno.land/std@0.201.0/collections/partition.ts": "28336d4af97eb8a2a2c3ec4ce28597e657e724be5969417eb697ff0860b9711c", + "https://deno.land/std@0.201.0/collections/partition_entries.ts": "7a30b99b64a31af8e9d6da24239f7778b1cff9cd2f240f41aa2f535d647d54f9", + "https://deno.land/std@0.201.0/collections/permutations.ts": "3e3a9d7a8cc806a9ce9ae8fb0c7f3d37d884b3c7429fcaca4bc5d177d92d8217", + "https://deno.land/std@0.201.0/collections/red_black_node.ts": "eb766a69d82132fc4f1789eb3dc753781da7c3b0938756256be3764c9941e3ac", + "https://deno.land/std@0.201.0/collections/red_black_tree.ts": "e78d2aa89d23410079ad1f26e8bf95f05c84c8f8a9ef9c9ae41b312d7062b861", + "https://deno.land/std@0.201.0/collections/reduce_groups.ts": "31e2f977cb3597f98ded2a56e3b5c122d4983ac8c79de184957d17d62ee0b2f1", + "https://deno.land/std@0.201.0/collections/running_reduce.ts": "e25f165456b946e7689a27e0e7fbb2f53d8189ef7cd0937b903e737bd37bacc6", + "https://deno.land/std@0.201.0/collections/sample.ts": "6330fb6567573b252a2ed9da475e54c4b98ca06e6266d34e5f0392095020c86b", + "https://deno.land/std@0.201.0/collections/sliding_windows.ts": "d1c8d18d86b8f02b407379e8681881880b7e3e173d152c5d8dc89d458031b740", + "https://deno.land/std@0.201.0/collections/sort_by.ts": "1207755af756a5da04bebff39146c93cbe54f7870a5d67cf6922e871d96a01d5", + "https://deno.land/std@0.201.0/collections/sum_of.ts": "76db7f04a66bdfa4911c4a592b868c854c690d6f0f83140c315f70caf742c761", + "https://deno.land/std@0.201.0/collections/take_last_while.ts": "9adcfe94a3dd56fbd55951099a121267aa42d8ccbc8152ed3aa210f86c74ca57", + "https://deno.land/std@0.201.0/collections/take_while.ts": "cd9a494d56e6a0a9c3f1e1123d1370633f0d4c6525ccf8aa3bd00b006742bddf", + "https://deno.land/std@0.201.0/collections/union.ts": "0577babef67dd38dc584accbcf75605318346046fe4ff476f0f6e2a1b1092391", + "https://deno.land/std@0.201.0/collections/unzip.ts": "3d3469c616b04200ff6a883e0d6dc82cac4c205aa65742e375afb8816be75b35", + "https://deno.land/std@0.201.0/collections/without_all.ts": "1e3cccb1ed0659455b473c0766d9414b7710d8cef48862c899f445178f66b779", + "https://deno.land/std@0.201.0/collections/zip.ts": "82710f115f1ed61bd0ce7b8ba0b38ecc8b38f7687ba3a768ee59d24e5efb1aad", + "https://deno.land/std@0.201.0/datetime/to_imf.ts": "8f9c0af8b167031ffe2e03da01a12a3b0672cc7562f89c61942a0ab0129771b2", + "https://deno.land/std@0.201.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", + "https://deno.land/std@0.201.0/flags/mod.ts": "0948466fc437f017f00c0b972a422b3dc3317a790bcf326429d23182977eaf9f", + "https://deno.land/std@0.201.0/fmt/bytes.ts": "f29cf69e0791d375f9f5d94ae1f0641e5a03b975f32ddf86d70f70fdf37e7b6a", + "https://deno.land/std@0.201.0/fmt/colors.ts": "87544aa2bc91087bb37f9c077970c85bfb041b48e4c37356129d7b450a415b6f", + "https://deno.land/std@0.201.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.201.0/fs/copy.ts": "23cc1c465babe5ca4d69778821e2f8addc44593e30a5ca0b902b3784eed75bb6", + "https://deno.land/std@0.201.0/fs/empty_dir.ts": "2e52cd4674d18e2e007175c80449fc3d263786a1361e858d9dfa9360a6581b47", + "https://deno.land/std@0.201.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.201.0/fs/ensure_file.ts": "39ac83cc283a20ec2735e956adf5de3e8a3334e0b6820547b5772f71c49ae083", + "https://deno.land/std@0.201.0/fs/ensure_link.ts": "c15e69c48556d78aae31b83e0c0ece04b7b8bc0951412f5b759aceb6fde7f0ac", + "https://deno.land/std@0.201.0/fs/ensure_symlink.ts": "b389c8568f0656d145ac7ece472afe710815cccbb2ebfd19da7978379ae143fe", + "https://deno.land/std@0.201.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", + "https://deno.land/std@0.201.0/fs/exists.ts": "cb59a853d84871d87acab0e7936a4dac11282957f8e195102c5a7acb42546bb8", + "https://deno.land/std@0.201.0/fs/expand_glob.ts": "52b8b6f5b1fa585c348250da1c80ce5d820746cb4a75d874b3599646f677d3a7", + "https://deno.land/std@0.201.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", + "https://deno.land/std@0.201.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9", + "https://deno.land/std@0.201.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", + "https://deno.land/std@0.201.0/http/cookie.ts": "d965ca071376732663738861bc5dd524df5d8ee69658de40dbfe41c39e379aa4", + "https://deno.land/std@0.201.0/http/etag.ts": "807382795850cde5c437c74bcc09392bc0fc56de348fc1271f383f4b28935b9f", + "https://deno.land/std@0.201.0/http/file_server.ts": "6f5c4a28c36995f31544abb49b86bee6e7a2d34664cac3936ff08ccad1682d85", + "https://deno.land/std@0.201.0/http/http_status.ts": "8a7bcfe3ac025199ad804075385e57f63d055b2aed539d943ccc277616d6f932", + "https://deno.land/std@0.201.0/http/server.ts": "1b2403b3c544c0624ad23e8ca4e05877e65380d9e0d75d04957432d65c3d5f41", + "https://deno.land/std@0.201.0/http/util.ts": "4cf044067febaa26d0830e356b0f3a5f76d701a60d7ff7a516fad7b192f4c3a7", + "https://deno.land/std@0.201.0/io/buf_reader.ts": "0bd8ad26255945b5f418940db23db03bee0c160dbb5ae4627e2c0be3b361df6a", + "https://deno.land/std@0.201.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", + "https://deno.land/std@0.201.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", + "https://deno.land/std@0.201.0/io/copy_n.ts": "c055296297b9d4897d90d1ac056b072dc02614e60c67f438e23fbce052ea4c69", + "https://deno.land/std@0.201.0/io/limited_reader.ts": "1976bb087e6aab06ebd6bd511bc801da9afeda31dbee2353dfd6ec44f1402324", + "https://deno.land/std@0.201.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b", + "https://deno.land/std@0.201.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271", + "https://deno.land/std@0.201.0/io/read_delim.ts": "f3aac4e09b14cbe397612e7d490f1a043edfad18865ad0b277eb144157f676fc", + "https://deno.land/std@0.201.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f", + "https://deno.land/std@0.201.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc", + "https://deno.land/std@0.201.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e", + "https://deno.land/std@0.201.0/io/read_range.ts": "46a2263d0f8369b6d9abb0b25d99ceb65ff08d621fc57bcc53832e6979295043", + "https://deno.land/std@0.201.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20", + "https://deno.land/std@0.201.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce", + "https://deno.land/std@0.201.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7", + "https://deno.land/std@0.201.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f", + "https://deno.land/std@0.201.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e", + "https://deno.land/std@0.201.0/json/common.ts": "ecd5e87d45b5f0df33238ed8b1746e1444da7f5c86ae53d0f0b04280f41a25bb", + "https://deno.land/std@0.201.0/jsonc/mod.ts": "b88dce28eb3645667caa856538ae2fe87af51410822544a0b45a4177ef3bd7dd", + "https://deno.land/std@0.201.0/jsonc/parse.ts": "c1096e2b7ffb4996d7ed841dfdb29a4fccc78edcc55299beaa20d6fe5facf7b6", + "https://deno.land/std@0.201.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570", + "https://deno.land/std@0.201.0/media_types/_util.ts": "0879b04cc810ff18d3dcd97d361e03c9dfb29f67d7fc4a9c6c9d387282ef5fe8", + "https://deno.land/std@0.201.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc", + "https://deno.land/std@0.201.0/media_types/extension.ts": "a7cd28c9417143387cdfed27d4e8607ebcf5b1ec27eb8473d5b000144689fe65", + "https://deno.land/std@0.201.0/media_types/extensions_by_type.ts": "43806d6a52a0d6d965ada9d20e60a982feb40bc7a82268178d94edb764694fed", + "https://deno.land/std@0.201.0/media_types/format_media_type.ts": "f5e1073c05526a6f5a516ac5c5587a1abd043bf1039c71cde1166aa4328c8baf", + "https://deno.land/std@0.201.0/media_types/get_charset.ts": "18b88274796fda5d353806bf409eb1d2ddb3f004eb4bd311662c4cdd8ac173db", + "https://deno.land/std@0.201.0/media_types/parse_media_type.ts": "31ccf2388ffab31b49500bb89fa0f5de189c8897e2ee6c9954f207637d488211", + "https://deno.land/std@0.201.0/media_types/type_by_extension.ts": "daa801eb0f11cdf199445d0f1b656cf116d47dcf9e5b85cc1e6b4469f5ee0432", + "https://deno.land/std@0.201.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586", + "https://deno.land/std@0.201.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.201.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.201.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.201.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.201.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.201.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", + "https://deno.land/std@0.201.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.201.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.201.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", + "https://deno.land/std@0.201.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.201.0/path/_os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.201.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.201.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.201.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.201.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", + "https://deno.land/std@0.201.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.201.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.201.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", + "https://deno.land/std@0.201.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.201.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", + "https://deno.land/std@0.201.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", + "https://deno.land/std@0.201.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", + "https://deno.land/std@0.201.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", + "https://deno.land/std@0.201.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", + "https://deno.land/std@0.201.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", + "https://deno.land/std@0.201.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", + "https://deno.land/std@0.201.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", + "https://deno.land/std@0.201.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", + "https://deno.land/std@0.201.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", + "https://deno.land/std@0.201.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.201.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", + "https://deno.land/std@0.201.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", + "https://deno.land/std@0.201.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.201.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", + "https://deno.land/std@0.201.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", + "https://deno.land/std@0.201.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", + "https://deno.land/std@0.201.0/streams/_common.ts": "3b2c1f0287ce2ad51fff4091a7d0f48375c85b0ec341468e76d5ac13bb0014dd", + "https://deno.land/std@0.201.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", + "https://deno.land/std@0.201.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", + "https://deno.land/std@0.201.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71", + "https://deno.land/std@0.201.0/streams/delimiter_stream.ts": "a676837e8bdaa94502fe3d8cae57fbf54697801ae61cefbaf39fb7ab64169d2a", + "https://deno.land/std@0.201.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", + "https://deno.land/std@0.201.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072", + "https://deno.land/std@0.201.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", + "https://deno.land/std@0.201.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", + "https://deno.land/std@0.201.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", + "https://deno.land/std@0.201.0/streams/mod.ts": "206c718cebeba0ea690be032f6095a8fd079d4168ad7eb3d6e1b6d35b8ee4f42", + "https://deno.land/std@0.201.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be", + "https://deno.land/std@0.201.0/streams/readable_stream_from_reader.ts": "9bc9e71f0ddad557daa7035daca052ca840e0a45e9d1d467d40afcf2c78933fb", + "https://deno.land/std@0.201.0/streams/reader_from_iterable.ts": "c2d655262d1f6593b49b494430815c273a272b4804e4d07f11987813fbbb9ef1", + "https://deno.land/std@0.201.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73", + "https://deno.land/std@0.201.0/streams/text_delimiter_stream.ts": "f0dc8ff953a8a77f0d1fa8db1fee62de817f36e20d79b00b1362847e30fbdd90", + "https://deno.land/std@0.201.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", + "https://deno.land/std@0.201.0/streams/to_transform_stream.ts": "50af06140c414090df8c3879f46bed4043a5d73caa60352c0c9682a88ec7a8c9", + "https://deno.land/std@0.201.0/streams/writable_stream_from_writer.ts": "c8f6b8525089c7db5a94cffe30d2be11f77ec9a92492644461c736ffc29f68f1", + "https://deno.land/std@0.201.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", + "https://deno.land/std@0.201.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950", + "https://deno.land/std@0.201.0/streams/zip_readable_streams.ts": "5639c8fea8c21d7dab6f34edcf3d08218b7e548a197f7fd79a3a995305a81e9f", + "https://deno.land/std@0.201.0/testing/_test_suite.ts": "30f018feeb3835f12ab198d8a518f9089b1bcb2e8c838a8b615ab10d5005465c", + "https://deno.land/std@0.201.0/testing/bdd.ts": "3f446df5ef8e856a869e8eec54c8482590415741ff0b6358a00c43486cc15769", + "https://deno.land/std@0.201.0/version.ts": "93ab592680d0d50d5269536653f52e2a446d85497e4d71a38e65de533093c040", + "https://deno.land/std@0.201.0/yaml/_dumper/dumper.ts": "717403d0e700de783f2ef5c906b3d7245383e1509fc050e7ff5d4a53a03dbf40", + "https://deno.land/std@0.201.0/yaml/_dumper/dumper_state.ts": "f0d0673ceea288334061ca34b63954c2bb5feb5bf6de5e4cfe9a942cdf6e5efe", + "https://deno.land/std@0.201.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", + "https://deno.land/std@0.201.0/yaml/_loader/loader.ts": "63ec7f0a265dbbabc54b25a4beefff7650e205160a2d75c7d8f8363b5f84851a", + "https://deno.land/std@0.201.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", + "https://deno.land/std@0.201.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", + "https://deno.land/std@0.201.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", + "https://deno.land/std@0.201.0/yaml/_type/binary.ts": "24d49614463a7339a8a16d894919c2ec18a10588ae360ec352093b60e2cc8b0d", + "https://deno.land/std@0.201.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", + "https://deno.land/std@0.201.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", + "https://deno.land/std@0.201.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", + "https://deno.land/std@0.201.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", + "https://deno.land/std@0.201.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", + "https://deno.land/std@0.201.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", + "https://deno.land/std@0.201.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", + "https://deno.land/std@0.201.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", + "https://deno.land/std@0.201.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", + "https://deno.land/std@0.201.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", + "https://deno.land/std@0.201.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", + "https://deno.land/std@0.201.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", + "https://deno.land/std@0.201.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", + "https://deno.land/std@0.201.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", + "https://deno.land/std@0.201.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", + "https://deno.land/std@0.201.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", + "https://deno.land/std@0.201.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", + "https://deno.land/std@0.201.0/yaml/mod.ts": "28ecda6652f3e7a7735ee29c247bfbd32a2e2fc5724068e9fd173ec4e59f66f7", + "https://deno.land/std@0.201.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", + "https://deno.land/std@0.201.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", + "https://deno.land/std@0.201.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", + "https://deno.land/std@0.201.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", + "https://deno.land/std@0.201.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", + "https://deno.land/std@0.201.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", + "https://deno.land/std@0.201.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", + "https://deno.land/std@0.201.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", + "https://deno.land/std@0.201.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", + "https://deno.land/std@0.201.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/std@0.91.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.91.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.91.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", + "https://deno.land/std@0.91.0/encoding/hex.ts": "f952e0727bddb3b2fd2e6889d104eacbd62e92091f540ebd6459317a61932d9b", + "https://deno.land/std@0.91.0/fs/_util.ts": "f2ce811350236ea8c28450ed822a5f42a0892316515b1cd61321dec13569c56b", + "https://deno.land/std@0.91.0/fs/ensure_dir.ts": "f21262e788a707aaa2dd22064da7cd40e3b2f0f067e9b2aed1b288091170cc05", + "https://deno.land/std@0.91.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", + "https://deno.land/std@0.91.0/hash/_wasm/hash.ts": "cb6ad1ab429f8ac9d6eae48f3286e08236d662e1a2e5cfd681ba1c0f17375895", + "https://deno.land/std@0.91.0/hash/_wasm/wasm.js": "94b1b997ae6fb4e6d2156bcea8f79cfcd1e512a91252b08800a92071e5e84e1a", + "https://deno.land/std@0.91.0/hash/hasher.ts": "57a9ec05dd48a9eceed319ac53463d9873490feea3832d58679df6eec51c176b", + "https://deno.land/std@0.91.0/hash/mod.ts": "5d032bd34186cda2f8d17fc122d621430953a6030d4b3f11172004715e3e2441", + "https://deno.land/std@0.91.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.91.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.91.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", + "https://deno.land/std@0.91.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.91.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", + "https://deno.land/std@0.91.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.91.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", + "https://deno.land/std@0.91.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.91.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", + "https://deno.land/std@0.93.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.93.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.93.0/bytes/mod.ts": "1ae1ccfe98c4b979f12b015982c7444f81fcb921bea7aa215bf37d84f46e1e13", + "https://deno.land/std@0.93.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", + "https://deno.land/std@0.93.0/fmt/printf.ts": "7ec612e9b89958b8f7710129f74f502327aad285a9e48ee5297f5882fbc3a078", + "https://deno.land/std@0.93.0/fs/_util.ts": "f2ce811350236ea8c28450ed822a5f42a0892316515b1cd61321dec13569c56b", + "https://deno.land/std@0.93.0/fs/copy.ts": "631bbafbfe6cba282158abc8aeb7e8251cc69a7ec28ce12878ea1b75fec2add4", + "https://deno.land/std@0.93.0/fs/ensure_dir.ts": "b7c103dc41a3d1dbbb522bf183c519c37065fdc234831a4a0f7d671b1ed5fea7", + "https://deno.land/std@0.93.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", + "https://deno.land/std@0.93.0/fs/walk.ts": "8d37f2164a7397668842a7cb5d53b9e7bcd216462623b1b96abe519f76d7f8b9", + "https://deno.land/std@0.93.0/io/buffer.ts": "2a92f02c1d8daaebaf13e5678ea5969c89f4fab533f687b9e7e86f49f11c3118", + "https://deno.land/std@0.93.0/io/bufio.ts": "729ea49afacd27ed0687451c694752dcaa68250871d1c957ca886ef5d82c461f", + "https://deno.land/std@0.93.0/io/ioutil.ts": "275fa440494df9b4b3aa656301ced2eeac533feec128b3a39b2b40f4cd957e42", + "https://deno.land/std@0.93.0/io/mod.ts": "ae04a3f647845dd8ce0a523c208f80636d0640d9e5c730f0e6272cf86c1c0855", + "https://deno.land/std@0.93.0/io/readers.ts": "17403919724fef2f343c88555606368868a5c752a1099ad801f6a381c170f62d", + "https://deno.land/std@0.93.0/io/streams.ts": "61c441d9d60eda8d5a3782517042536ce87ffd29a8bb72bdab4bdb5fe048e877", + "https://deno.land/std@0.93.0/io/util.ts": "843ccf667ff291ba2315c2419a54b4e76dbc7c0f6c3152f640eac4dc954e3753", + "https://deno.land/std@0.93.0/io/writers.ts": "5453864be11da42dc91f19eb14c0a0e27e9e7f21f5c7174f5419921a6ab64fda", + "https://deno.land/std@0.93.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.93.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.93.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", + "https://deno.land/std@0.93.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.93.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", + "https://deno.land/std@0.93.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.93.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", + "https://deno.land/std@0.93.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.93.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", + "https://deno.land/x/cache@0.2.12/deps.ts": "f992c28c82770eab287f0ea332eae502e397c78e5f27a0a4512f59dd54dee865", + "https://deno.land/x/cache@0.2.12/directories.ts": "ef48531cab3f827252e248596d15cede0de179a2fb15392ae24cf8034519994f", + "https://deno.land/x/deno_dom@v0.1.38/build/deno-wasm/deno-wasm.js": "98b1ad24a1c13284557917659402202e5c5258ab1431b3f3a82434ad36ffa05a", + "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts": "bfd999a493a6974e9fca4d331bee03bfb68cfc600c662cd0b48b21d67a2a8ba0", + "https://deno.land/x/deno_dom@v0.1.38/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7", + "https://deno.land/x/deno_dom@v0.1.38/src/constructor-lock.ts": "59714df7e0571ec7bd338903b1f396202771a6d4d7f55a452936bd0de9deb186", + "https://deno.land/x/deno_dom@v0.1.38/src/deserialize.ts": "f4d34514ca00473ca428b69ad437ba345925744b5d791cb9552e2d7a0e7b0439", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/document-fragment.ts": "a40c6e18dd0efcf749a31552c1c9a6f7fa614452245e86ee38fc92ba0235e5ae", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/document.ts": "b8f4e4ccabaaa063d6562a0f2f8dea9c0419515d63d8bd79bfde95f7cd64bd93", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/dom-parser.ts": "609097b426f8c2358f3e5d2bca55ed026cf26cdf86562e94130dfdb0f2537f92", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/element.ts": "77c454e228dfeb5c570da5aa61d91850400116bfa0f5a85505acdd3c667171a4", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/elements/html-template-element.ts": "127bb291bb08afeb7e9a66294a5aa6ff2780f4eb4601fa6f7869fe8b70a81472", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/html-collection.ts": "ae90197f5270c32074926ad6cf30ee07d274d44596c7e413c354880cebce8565", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/node-list.ts": "4c6e4b4585301d4147addaccd90cb5f5a80e8d6290a1ba7058c5e3dfea16e15d", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/node.ts": "3069e6fc93ac4111a136ed68199d76673339842b9751610ba06f111ba7dc10a7", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436", + "https://deno.land/x/deno_dom@v0.1.38/src/dom/utils.ts": "55f3e9dc71d6c4a54605888d3f99d26fb0cf9973924709f159252a6933ceeabe", + "https://deno.land/x/deno_dom@v0.1.38/src/parser.ts": "b65eb7e673fa7ca611de871de109655f0aa9fa35ddc1de73df1a5fc2baafc332", + "https://deno.land/x/deno_image@0.0.4/deps.ts": "ab0d77ff6a832f98fd47ca3eccc53c277c188768b9526743dbce76e8944ddceb", + "https://deno.land/x/deno_image@0.0.4/index.ts": "53a1ad6d0d1bfc158b2f4d774077e691d7384540bc93db74254ad32106982b7f", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/PNGDecoder.ts": "9ab11e0e4081ae9beec33bc9fff2343d0cacd9f97e7493f8ecaa836b3855b4e6", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/PNGEncoder.ts": "d24f87fffed9f59ae65e51562d049db16bb73d81416de44f4e38923c552d076a", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/common.ts": "96a3ee4a7e5e2067d51fd89a60e3a25c34bde867629d576285078ce3619c0789", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/index.ts": "e6af07e10d88bdf988a723a7dd9bcc278f0e797374f2b8c74d9e76f134117121", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/internalTypes.ts": "aa00b83cb49aa2c6cc833e4f28476e6ed5b4a5995aaa3da465c54e3fe9df0acd", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/iobuffer/IOBuffer.ts": "a030ae19737ebb98576f3ffcb620ce63058b98fe0f44528440b94d973823face", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/iobuffer/utf8.ts": "c2241c9ac7a46ca0734ffc040c704c506d9447cafc1975ca65c574f0a9391d59", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/index.js": "315a2b1dc7709050d632dbea1c920a4dc405f7079e88494d217d12d7a0d7e285", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/deflate.js": "f019793490803b3ac8e0193dcb9c5787b394909182a09cb5125767e4031c3c0e", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/inflate.js": "7c07d6084f95159405356fd35a77d6c79f35ca19048bb8e35630477f6da3cd34", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/utils/common.js": "d4e0dfc23eece2ab062d53e2f9726c14675bfe20cd890eeceb87291f31c5439b", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/utils/strings.js": "93d014c89c3d72ae2de82b29ae2e93583c203c04a494886d1826095b30e2c4fe", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/adler32.js": "495ef7b1d93d1b12aacfa0f13ef8d7f8f90e2b0073942bfc01b15d2b54e7f5d1", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/constants.js": "a50cd695b9408e424c1c04d3d5b50c06051861beb8417d008c2a973073c285cc", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/crc32.js": "529262cc302562e854873480dfa2654ce9b7ee32474cbbf12526426928e001be", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/deflate.js": "29b5c80f4ee3df72dd267693069a7418fec4d3c00015453539cf8ea28dd8952c", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/gzheader.js": "7395e33c625c064dfcbee9b84f4ff77c47a94dda9e117e1aca749df96c5b76f9", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inffast.js": "113e0dc8a0878880ac0b5437b66395309938f55b6036613f3bcc4cd2b0c95baa", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inflate.js": "c3d6cfaf68a4c2d97d24e5bd7754622b59860fcd317a0f56cde5431e51ad5fed", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inftrees.js": "53c160e37b83f2325b1d85b7927bfde7bdd680a85175affef0862e5bfe775681", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/messages.js": "ed9ad2f2379aab2cffa6692db2a5be3a2af30d36f3940339b053a10045d8a2a6", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/trees.js": "a2f17c8e20e57214076c1efa1bf9d1444543ce7b6de364f09cab9ec7a0a4a31b", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/zstream.js": "a4667e4b65cc69d31787cf1a695533e22e0b54e441d470524db6abe82bc29a25", + "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/types.ts": "1dd91035997af1ea8d92a8887b9c28401ccf5f453ea5442e542055d94ca92602", + "https://deno.land/x/deno_image@0.0.4/lib/resize/resize.js": "271fc007ae18b90628f1c9b213ac900875ccec31214fe9cfc338a467237acbdc", + "https://deno.land/x/deno_image@0.0.4/mime-type.ts": "f6cbba14a3a6503554113bf6f9acae8fd6112245e1e659a922828fc2acab1d1f", + "https://deno.land/x/deno_image@0.0.4/mod.ts": "ff0028d3593dc470ddddba3ee6701f340ade4e9af5a9068272539589b42d6d0a", + "https://deno.land/x/deno_image@0.0.4/types.ts": "2c731878a70c232a710fc1fb650a01765d87cb31dcd07dc1561875a5ad486d20", + "https://deno.land/x/jose@v4.14.6/jws/compact/sign.ts": "1e88d19dc26d3ea5f2ce3da989813daf5c555d8dec6528051530f7b5a3e87bae", + "https://deno.land/x/jose@v4.14.6/jws/flattened/sign.ts": "be5db0e622a6c5b1e905338d33851e89e956350c9d774de50c70f30a6a156356", + "https://deno.land/x/jose@v4.14.6/jwt/produce.ts": "dfe55ae98056a40be6fda924144c0656bb19c8bbf3fe35d842efe2d1545df3e4", + "https://deno.land/x/jose@v4.14.6/jwt/sign.ts": "54d0a761056edeec428a956abd8db034a20536d87fc7b7a2d4fbf953e931aa37", + "https://deno.land/x/jose@v4.14.6/key/import.ts": "cdf200d1eea914677117835c36f5332924fb2e5cb6fd07594b6455b3ab0f7749", + "https://deno.land/x/jose@v4.14.6/lib/buffer_utils.ts": "dad65c92c9baef14cd5366a4131252afa7a5b4f3a068d0244e2df8660ea2bd8e", + "https://deno.land/x/jose@v4.14.6/lib/check_key_type.ts": "81f5a2c3764464d2b917a1c55c6011d312184e8c68e43bee51565c2db1b166c4", + "https://deno.land/x/jose@v4.14.6/lib/crypto_key.ts": "3da8e265080fb72be9f66a33c6aa76c7176b6162b4ae2534828822cf9c5b04e8", + "https://deno.land/x/jose@v4.14.6/lib/epoch.ts": "cd608f73f6c100e8156c6020ec2bce6757e01759793f0d6aab23908d3d2ea933", + "https://deno.land/x/jose@v4.14.6/lib/format_pem.ts": "b5230682e7a89609238015b77f33afd248f3e0f69bcb5895eece2f86d83100f6", + "https://deno.land/x/jose@v4.14.6/lib/invalid_key_input.ts": "9ca81c899000c18cf1b70ab8221f39b306cc153663e748190307e284fd47ab6a", + "https://deno.land/x/jose@v4.14.6/lib/is_disjoint.ts": "b5ea1cb260899f5cfb04f032029956e637067714a275d13be429fc53287a4b17", + "https://deno.land/x/jose@v4.14.6/lib/is_object.ts": "43549ddc51a3b3d4c22b953b191a961fbb61fb5081e8efb88ad075afa1f4d214", + "https://deno.land/x/jose@v4.14.6/lib/secs.ts": "03a2f02fda0f76bf431734552a947c2916c699b904ae0d2f90a415931c30e66d", + "https://deno.land/x/jose@v4.14.6/lib/validate_crit.ts": "6d2b43959ddf432060505ef13af32cb1bf0daff815ef1eae4d7971629566a695", + "https://deno.land/x/jose@v4.14.6/runtime/asn1.ts": "695f4792d2fc092be76713a165fbb7a738554435b4fb6d5f06ac591e62b1d411", + "https://deno.land/x/jose@v4.14.6/runtime/base64url.ts": "74ecb18b90de56bcc4424b6c911cfe49b56dd4a316978f5c8ee9a23560069636", + "https://deno.land/x/jose@v4.14.6/runtime/check_key_length.ts": "5656870cc4460602775134280bf46f17e27100b237bdb5c687aceabeffc8f2a2", + "https://deno.land/x/jose@v4.14.6/runtime/digest.ts": "cee73fad56ce596ffedc56811d174ab413e7981eb847eb67c0e77f213cc2ac2d", + "https://deno.land/x/jose@v4.14.6/runtime/get_sign_verify_key.ts": "f08a086524491a54fb2a0e203819d4ca2b193444aecf6dfbaf6d400431cb439c", + "https://deno.land/x/jose@v4.14.6/runtime/is_key_like.ts": "d9660a40820d254843721a53b51eb94a4db39a1ee36103ea8c28e2cc2207599b", + "https://deno.land/x/jose@v4.14.6/runtime/jwk_to_key.ts": "3779cb38ea2857b37f378a45d6b27651eb672f398ddae16cd1fb2aacaa451df5", + "https://deno.land/x/jose@v4.14.6/runtime/sign.ts": "1524f8855538ca5fd607cd681f804ba421b0ec58f562118f3c635324ba053f90", + "https://deno.land/x/jose@v4.14.6/runtime/subtle_dsa.ts": "bab28945afd1aac19d3142a70f0c44c4b283b581d33cf8e1234889b58338e80d", + "https://deno.land/x/jose@v4.14.6/runtime/webcrypto.ts": "3365b7d62eaa7e6befe5e2f4f67aa7859805c41b87064433b6e70f94501aa36e", + "https://deno.land/x/jose@v4.14.6/util/errors.ts": "107a41f79bd8a226c836080f617809cd148e00112fdadc0e15c3a6079da02f5d", + "https://deno.land/x/jpegts@1.1/lib/decoder.ts": "b8823ee917fc99a1e085c353b2cd4ca1fbaacaaf1f80be94175e42487666c822", + "https://deno.land/x/jpegts@1.1/lib/encoder.ts": "d75fc5ae88f77e1fa349af08d7a46937add31a03b6d3605ff4d2e3303eb32b3b", + "https://deno.land/x/jpegts@1.1/lib/image.ts": "32255e99b6c1bf4e72e13367516a0d878ba9d195d81fac1f145ce4c11e951962", + "https://deno.land/x/jpegts@1.1/lib/pixel.ts": "19f7f28f09514157be87d01d1d12915cc17c787d8c1707899d2f5570ac6a12fe", + "https://deno.land/x/jpegts@1.1/mod.ts": "2014257f7269bcc822a4d6eb871e5002b347f13a641c12d45c1a61586374f127", + "https://deno.land/x/puppeteer@16.2.0/mod.ts": "52a47aa1850fc0a8255d6c8c462f4ab7e43104d342e6de7bda334221ca8bdcac", + "https://deno.land/x/puppeteer@16.2.0/src/deno/BrowserFetcher.ts": "6be7a586667b429138994a4955b2339fc58af9b6d08378672c8a2b052045e308", + "https://deno.land/x/puppeteer@16.2.0/src/deno/BrowserRunner.ts": "a32b6d2df712afce5f0707aabb6fbcd1e9b1b20e90fc5c34daa081960a638e62", + "https://deno.land/x/puppeteer@16.2.0/src/deno/LaunchOptions.ts": "16a89285fade2690d50eaa3b81e1412cb6c4c4f0a4ac77484a8c016b5f860f9f", + "https://deno.land/x/puppeteer@16.2.0/src/deno/Launcher.ts": "aed1359406480cac72c82fd6944c5de098b1b08ed3c0bf750f4bb2ea75ec1f93", + "https://deno.land/x/puppeteer@16.2.0/src/deno/Puppeteer.ts": "cd01ac2f8b9e8fa9f30ceab1864fbccf20ea7c447794912248e83684706ad0ec", + "https://deno.land/x/puppeteer@16.2.0/src/initialize-deno.ts": "b19511d8fcddd0ed2f6f0938ec0d791f0549da4269cd07a9b05798d66ee23764", + "https://deno.land/x/puppeteer@16.2.0/src/mod.ts": "72d600588db0da6039b8a86f735328b3250512b1e48431ea2971f6a7da74033e", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Accessibility.js": "0b68faa6d65f98309900d21027f3923876c78034efe8d62c149862a5f1f9f696", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/AriaQueryHandler.js": "0c89b1fc865afde7085d2eb59d3e133a5e4de9700abdb233e0c139bc878c4148", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Browser.js": "5a4246bc69be030ee4c04622c265f22316fe3e126f602d8412854496dabd610b", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/BrowserConnector.js": "bf35821f0daa788409c821a785d08853651f5fb3009802df83236a9798c9cb0c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/BrowserWebSocketTransport.js": "1a5a83d8953f578caa07909b17544a10aec33e3690552c2d6bc191aec0c74ccb", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ChromeTargetManager.js": "574ad8b564eda146a73b4074ef83e70da73d80bef803b07ad6778de504b4b08c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Connection.js": "7b68d904e2b7f654324feb45e2ec17f642cb13b4bac0405bcf1beb46fcbd6232", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ConnectionTransport.js": "81c099dd5b8c5dce1f078168614fddc90a56f7f3622c6c7eae624fa62522d661", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ConsoleMessage.js": "82af42681337b3304c87f71e89caa90598edddb15a2d5d794a2b65b469a21461", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Coverage.js": "bebaee68ca9231d0f7f723bdc34b27b4145f5d162c45ae65cdaf039dce6fcb43", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Debug.js": "2db131d2d224f504bb083a33a43a2be103b3bdec4554c2efd18d84b0bc726691", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/DeviceDescriptors.js": "b53379c2756711961e8e574499052c9274a477cdc4ffb2e18440cba1d9e835d2", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Dialog.js": "0c193b4703e6b799fb37da40a870023d83d605a55a08b9993efebc0670044dfd", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ElementHandle.js": "1cc33711925f0a63088b25ca15846430e0004436f714f4eb8a5f26c51e5c64d5", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/EmulationManager.js": "8f46460f17e2066422fdbc84f8bebf21049c266f98413061c54901437e92e81b", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Errors.js": "e745fda7c9f59ac13aebec1c206074ee0f32beb5ef80d559f525d02af375a836", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/EventEmitter.js": "932e4374ca9c0d553f2ff1c12aa5e50432646105e2250753ce27c8dd2b0f0372", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ExecutionContext.js": "7d3112858a01ee84281b5a461c2b443c68353101a5db05dbce8f0e0160701b20", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FileChooser.js": "374afa00292e72740c341e9862049fc96583956410efa7e2d4277c469886ab59", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FirefoxTargetManager.js": "486925a2c4114c50b61e24e595b314795c6ccf8e922ac6de6158856f0ca74698", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Frame.js": "4b1668171db1649e0c7e4d48db05d801e6b906d9015a9c524c26ea584b89ab96", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FrameManager.js": "787ec35f5513064b42e501a2b06162cd56f7cd177f69d3f46372c384dbbe3fa2", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/HTTPRequest.js": "cd96da286e4484ece7c2852fd91490c0cb52b32494d11c519362a94c09d18dde", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/HTTPResponse.js": "9cc7dd5bc9e87027dcd36a048c36a2651c295a1124be26733064812fbaadda7b", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Input.js": "b06a0dde90317937cac17beca95c7e53af2eca1e125a433f3f3ba7364d75a83b", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/IsolatedWorld.js": "0c86c3e08c56992a71cdd2b6c00693aa283fa51ad3acc1b5dfece29d0150b53c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/JSHandle.js": "d24a93e0b93f8a67359d539b53caff6635a29fc74960c26624561abc94054c48", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/LifecycleWatcher.js": "ab1365f3a2b3c425c797e850f68e3b031684e51d1b361e3aba50a096ecbfbcf6", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkConditions.js": "81d878736d8b5f65fc634d51aa4f17c67c2e401d01c3ee2bfbba8a578da1b502", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkEventManager.js": "9dd099fdb8f9c3ec3cdbd49663fbb211b3e113cff0a0e17e8d0528e1387a1b8d", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkManager.js": "cf7ee9cc6899e42d82080185da4992c90ebd800bb9bfe0c7339296bf759a75b5", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/PDFOptions.js": "02444592eb17c3fe725a326db25bd4516bb8b2b156c07eed8f989c8fdf965180", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Page.js": "42cd535eeedfe7f0e2b1c26879bbe131b22fa9005e6d20e79e0645326671db81", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Product.js": "bf93481a7be7d15bf474b7dd0352cbf5f2282e7b27bef423be9a2971f227a823", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Puppeteer.js": "e9e414d0104a773ac05aba8643828bc17d9f14c3562fa1d26bea00d276f8da4c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/PuppeteerViewport.js": "bb396810641954eeb95e60d4340aef70c0e0bf9c87f8b2887786d54d5c8118a6", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/QueryHandler.js": "653d7c74199d12283482e2e44e8770414103b312d6718dd4316007fd46b5d091", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/SecurityDetails.js": "0c8c9b77d7216eb53f920d7b24e353693f7385d0e86b8f69c197df4142af2981", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Target.js": "6965637348b625dd50e5692db4ea2a3257e71e92e93743865acb9b778fb31bef", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TargetManager.js": "be195fd820c380b7a61f09810986bafd1ecc9e8a96f86e856191ebb14ca8fe05", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TaskQueue.js": "99de891382620fd905b3cdb523900939f147497dea377367fe89962c25b4b392", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TimeoutSettings.js": "a66ed134363732a20c4d6b15d303eb076268101be43beffac4947de01715260c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Tracing.js": "402aa026afabf6569577dd0de0be693c05462d386b8bb83cdf6eb11231f55691", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/USKeyboardLayout.js": "1a1138b5b503f9c285d767fd4ab364cd567eb034e8d1c64c11e5d2a8f4b9714a", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/WebWorker.js": "b115e1c40232afe9c71e7322b31bc2eb90cb02d0d576f54f692353b8677892be", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/fetch.js": "085b136a4cd76cc930b1512f1513854293fc76cfb7bd52dc024ecb1ca0d4eacf", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/types.js": "2e960c2577695d154e0ff17f850dbd786beeb42bd7b96617c6fbadcc282d20a3", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/util.js": "c2a1bd2d6444bf0263861892bb960bd2111200134617bdb0ac8e1b5bc00cad37", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/generated/injected.js": "19021fb0bbccb51d940b3fd9a1c2f3edf3f497cc5b439ddcd751578515be0510", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/generated/version.js": "98cdb536e79a80aebf533181f23aee2dc6a519b68cee450941d6f8522a17d1c3", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/revisions.js": "73bab96295d98b96687a72ce0face0ca322e033fd892eb498e856e6087fbe98c", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/types.js": "6d3502ab9da8cf5c338812b84909010d392d7bd3454c1cbfe0903e53de3929c2", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/DeferredPromise.js": "c9e7b394c04644d5b6705503ff1f80aabd64f6b918a25220ed88d37007741a13", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/ErrorLike.js": "d2867293d032857b9a8cbac7882deb88f53f607cdb7efaa5be67b326513979ac", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/assert.js": "463158c2d8421c9afa844beabb02192a30cb49c08eb01190d68ded32e7205cbc", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/cache.ts": "5237f44a6df69fbc9d9ccece95454d5b323f859af15fc516cd62fe3063132fbf", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/mitt/src/index.js": "b19eeafe8c1f3a5cded4b88bb2fe44f1ce4af618a80fcc91a7241a10fe9eba91", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/std.ts": "f40a7715328679df890400a7ed5ca6d959695f416f15f164cf3ad30bf0b00e90", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/zip/mod.ts": "29165da19740460ef193cd4f148c936176f22e6422b193fe6b7b1f2be78394d5", + "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/zip/types.ts": "1528d1279fbb64dd118c371331c641a3a5eff2b594336fb38a7659cf4c53b2d1", + "https://deno.land/x/puppeteer_plus@0.18.0/src/install.ts": "2b190694c3435522d021e601778fc83c6ffca55ef58d0e3be92e365a4dae44c7", + "https://deno.land/x/puppeteer_plus@0.18.0/src/patch.ts": "f5f7f105f82d736b95727ec58b159aa5c1e89f2e4e7b82865aeaa0afab21a6ba", + "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", + "https://deno.land/x/zod@v3.21.4/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea", + "https://deno.land/x/zod@v3.21.4/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef", + "https://deno.land/x/zod@v3.21.4/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe", + "https://deno.land/x/zod@v3.21.4/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c", + "https://deno.land/x/zod@v3.21.4/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7", + "https://deno.land/x/zod@v3.21.4/helpers/parseUtil.ts": "51a76c126ee212be86013d53a9d07f87e9ae04bb1496f2558e61b62cb74a6aa8", + "https://deno.land/x/zod@v3.21.4/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7", + "https://deno.land/x/zod@v3.21.4/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e", + "https://deno.land/x/zod@v3.21.4/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774", + "https://deno.land/x/zod@v3.21.4/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268", + "https://deno.land/x/zod@v3.21.4/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", + "https://deno.land/x/zod@v3.21.4/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4", + "https://deno.land/x/zod@v3.21.4/types.ts": "b5d061babea250de14fc63764df5b3afa24f2b088a1d797fc060ba49a0ddff28", + "https://esm.sh/@actions/core@1.10.1": "14b058f0b7444a7ea81babc115b4d6585cb3d5c552f9c0a2106ab8e8afd2b038", + "https://esm.sh/@actions/github@5.1.1": "78cad9d60ae3cdb764360f8eee1e2ed1358f90d39b8af01814da191488e8bdb9", + "https://esm.sh/@faker-js/faker@8.0.2": "4cd8d861f446522d0811d5f4a501bb082a31b30046733ea39ad39e5cbbcb7712", + "https://esm.sh/@octokit/app@14.0.0": "45bb494eeed35628bd85aadc1abb34bf3739a813408cd954addc6e8182bed34a", + "https://esm.sh/@octokit/auth-app@6.0.0": "72be9f1fe2ecc086787f829a5ed26ebaa703be927fc52f3589c4bb5d8380ca7a", + "https://esm.sh/@octokit/core@5.0.0": "0f2622aaa42566d70392a2d569286cd4aa6ec1e773f7dd7b09467f6e938227dd", + "https://esm.sh/@octokit/graphql@7.0.1": "fd09433d190777e8cf298f52a9386af86bda8db904528d2dd3b46e644b220c34", + "https://esm.sh/@octokit/plugin-paginate-graphql@4.0.0": "e6afc9cb1c47fd29797b947329ae0b71a88507876d3f0d572cefa9a1478d98d3", + "https://esm.sh/@octokit/request-error@5.0.0": "b1d20c66a66d7fb914f0c8eda88d5e34a9d4786a62dc452aeb46cc5d1d74a4fb", + "https://esm.sh/@octokit/request@8.1.1": "cbbe5fcd60423f1dfd6d2e950137955b99172099de5aefde86952b4966dee09c", + "https://esm.sh/@octokit/rest@20.0.1": "712b542e635e5559c688d02dab40be563bdbece31cd3c041fb4487d5542bcc50", + "https://esm.sh/@octokit/types@11.1.0": "fabf6997a3adf11e45d11e3c4d58d0634ab98f9d72f3116f3694123818ccd457", + "https://esm.sh/@primer/octicons@19.7.0": "a7b8fb121497e51c33845d3254f1e1b8a90ee136407daace6f734127940cd1b6", + "https://esm.sh/@twemoji/parser@14.1.0": "41ed855240ff0afbc66408434540e76b67401b629d639bfdc5f3db8b6675e993", + "https://esm.sh/alpinejs@3.13.0": "aa91411ce241773bab3f63a7b8bcf18ffaf626f9129f549dba9be1aa6c99f990", + "https://esm.sh/browserify@17.0.0": "8d30acb42e4d4eb9b103c48e7bcf035dc703e5ab851e67fe8f7a2dac3d2c4046", + "https://esm.sh/compare-versions@6.1.0": "201fa5a67808b194128313e2aa2e4305fad94f2366eb28d86051bf084cca2931", + "https://esm.sh/csso@5.0.5": "337688fa652a52757a5562702a9047bde37af888e61031de951ca39f389e56c0", + "https://esm.sh/ejs@3.1.9": "ab1f9d32be4812a740e8fa7ce878bc211316fb4464c6c88a76951c86c7aaeabc", + "https://esm.sh/html-escaper@3.0.3": "2e9ff7f87a30ecd9aa82e9b68a2b913309132337a903077a162fe31b7f6dbfc8", + "https://esm.sh/human-format@1.2.0": "e6ea2ab38602460722afaeefe088006f3a09834e3caf06e342159275090440e2", + "https://esm.sh/jose@4.14.6": "2591dce58fe92a24a982b79d3858c066867fd5d374ff1ae53d806b025ce824f7", + "https://esm.sh/jszip@3.5.0": "4bc490d6b677225a9b48fda8f0c7c907d2a28495567d938236d90492781abb7f", + "https://esm.sh/octokit@3.1.0": "6df8737861c4e6359ca5fdab03fb952463a79d4d71d65cfbfcb82db8a6028784", + "https://esm.sh/pluralize@8.0.0": "0af95641fb7cb57ee6577ba628491448c62c48cf7a6ff4a790c8d8594f39a2c2", + "https://esm.sh/puppeteer-core@21.2.1": "a7448d48cfd9f01b63ff1a33aae3a7e16ec152f0e5c2bece6419a401e33f996e", + "https://esm.sh/puppeteer-core@21.2.1?alias=ws:@libsql/isomorphic-ws&bundle": "718abc810a3d455454510838075fb381e3a6e6244b4a9d9cd4b961085a038234", + "https://esm.sh/puppeteer-core@21.2.1?alias=ws:isomorphic-ws": "098465166c2ad823870bd6a19c5912487f7b19656188cd852c6857f2e159fa26", + "https://esm.sh/puppeteer-core@21.2.1?alias=ws:isomorphic-ws&bundle": "3570e37be426bb6cd1d36f95da09af6e824efa56a525bc3c1c5ff6a367edc97e", + "https://esm.sh/puppeteer-core@21.2.1?bundle": "ad7cdfce86001282f0bf2abfc1669117fd14d80466550c9d3b5245d7e2a9c5b8", + "https://esm.sh/puppeteer-core@21.2.1?bundle&alias=ws:isomorphic-ws": "3570e37be426bb6cd1d36f95da09af6e824efa56a525bc3c1c5ff6a367edc97e", + "https://esm.sh/purgecss@5.0.0": "d1fe60566dbc54243e91c0f8079c49d0c1c03988c863d3cdf59c468d216db09e", + "https://esm.sh/rss-parser@3.13.0": "1978a4035b2d4b90f49330d73e2c6773c44fbb51cedac5549ad6cd0d6c4eb094", + "https://esm.sh/svgo@3.0.2": "321af489ac4abe4ddd35d060406d939a29389baf6d582f82e206b8329e42c532", + "https://esm.sh/v131/@actions/github@5.1.1/denonext/github.mjs": "944224744ff7452f35c89caaf7f0f41ff92ef6ff5dcfd0ce351a819e7cdc2fc8", + "https://esm.sh/v131/@actions/http-client@2.1.0/denonext/http-client.mjs": "05bf430d357f6142a150464ec368fe7eff8f512fb362e88ddb5e2791278f8437", + "https://esm.sh/v131/@octokit/auth-token@2.5.0/denonext/auth-token.mjs": "a7f067796a1a6e00422c3903511a25d4406d1e2396c815b0cd2b34e8b34bb2a1", + "https://esm.sh/v131/@octokit/core@3.6.0/denonext/core.mjs": "0c527f3aa5116147addfed833710039519b46bf632a35ab6117951c4dc9189f1", + "https://esm.sh/v131/@octokit/endpoint@6.0.12/denonext/endpoint.mjs": "bbd789652cfe02227295485a062c0af5de221fc8366934a4feb34a1efc295b09", + "https://esm.sh/v131/@octokit/graphql@4.8.0/denonext/graphql.mjs": "ed31ab8af94a5ec8e737d84e2dab2c541d767225967d635072819c01b4cf3e3c", + "https://esm.sh/v131/@octokit/plugin-paginate-rest@2.21.3/denonext/plugin-paginate-rest.mjs": "28a049516c0c4f831ed504697cf7f4765038c06b071d577a3b9f63b17edfeb8a", + "https://esm.sh/v131/@octokit/plugin-rest-endpoint-methods@5.16.2/denonext/plugin-rest-endpoint-methods.mjs": "02504fb911e19696fe1d10fb65c071e96b3744c1b066b98836fdb2a4aeb4fa14", + "https://esm.sh/v131/@octokit/request-error@2.1.0/denonext/request-error.mjs": "d56a726d70299599d18d9ca458a2fac78d28ff78dacfc0cb5f244169318ab487", + "https://esm.sh/v131/@octokit/request@5.6.3/denonext/request.mjs": "f2784f1530f5f103520bf81075c8fe45261c97725f74744ad8997c4f43b1f463", + "https://esm.sh/v131/@trysound/sax@0.2.0/denonext/sax.mjs": "5af2a1f55d3d7b89542b1412e592e50a4da57906ffa256d2ec17ee56d8876d6c", + "https://esm.sh/v131/JSONStream@1.3.5/denonext/JSONStream.mjs": "a559d227c3711e2665dbecf8d9496574f02a507183faee525d377fe2c43703f5", + "https://esm.sh/v131/acorn-node@1.8.2/denonext/acorn-node.mjs": "be7f83cfe1ebdc423d36498dbc12157a8f4ffb97fa02ed27d956c1e994409f4a", + "https://esm.sh/v131/acorn-node@1.8.2/denonext/walk.js": "fe98cedff08421512d9a7f94f3828b926c2efefdf19c30f53d8642171ead0233", + "https://esm.sh/v131/acorn-walk@7.2.0/denonext/acorn-walk.mjs": "f689ae555ca0f4e97e3c7aec9e5a7a362528321210ed4c78b3e2f92353695cc3", + "https://esm.sh/v131/acorn@7.4.1/denonext/acorn.mjs": "90757e3a809caae2f42084867bb4166d246397ecc8a2572301827bc62f6c37dd", + "https://esm.sh/v131/before-after-hook@2.2.3/denonext/before-after-hook.mjs": "f4262d059d899d7fcaa8d903bcf352df38ac1c040bb45273d79de200ffdad267", + "https://esm.sh/v131/boolbase@1.0.0/denonext/boolbase.mjs": "4e3bd67e9b1c5c55094eae98345d0107c6a44ef57bd3d4b9579698fa44722280", + "https://esm.sh/v131/browser-pack@6.1.0/denonext/browser-pack.mjs": "d85a39bde4cfc034e1f2501c1b91a595e91ec464470d501b706cf060b7bcb2a1", + "https://esm.sh/v131/browser-resolve@2.0.0/denonext/browser-resolve.mjs": "f050c929a5f5b4368798d0bd8ecb486f0a705954333be61bcec10a95b48ca820", + "https://esm.sh/v131/browserify@17.0.0/denonext/browserify.mjs": "44db2c5879ec41dcc2b84b8ba21bad520c8a265ab8def501be24155f79aba917", + "https://esm.sh/v131/buffer-from@1.1.2/denonext/buffer-from.mjs": "078451542b62cb4261c01a01ff7e9bc0f94bef4eb710831d40e1f92c4dfe3883", + "https://esm.sh/v131/cached-path-relative@1.1.0/denonext/cached-path-relative.mjs": "f46b20c0e7d32ea696f9272ff6be5d81c4536d949bddfaceb84ff63cec07f26e", + "https://esm.sh/v131/combine-source-map@0.8.0/denonext/combine-source-map.mjs": "c6ee2dcd70203eb45eeee9abef460dfcbe6daa1ed3a7712766791a93f415b6ba", + "https://esm.sh/v131/concat-stream@1.6.2/denonext/concat-stream.mjs": "11f925b8c8db99486ee0e8656c5e2fadb06a1e5dd3d3cbd3004881e3cac46921", + "https://esm.sh/v131/convert-source-map@1.1.3/denonext/convert-source-map.mjs": "abf64a8283e540c335a8f090f415e18de33e0a4f8e06b32f2fb32e82ec7bfd52", + "https://esm.sh/v131/core-util-is@1.0.3/denonext/core-util-is.mjs": "f19dfe63f62278ae0c5a25bd85ffeac5bbdb099b22f005d01bbb62673505deec", + "https://esm.sh/v131/css-select@5.1.0/denonext/css-select.mjs": "c2dd9ef23add4ebee64156f6d9a87ad7e40875b1477cf0bb6a456c4a2c9570e1", + "https://esm.sh/v131/css-tree@2.2.1/denonext/css-tree.mjs": "b757a3220a7ae7c34512091c697457ccec3414f498452e581083ec6cd813a421", + "https://esm.sh/v131/css-tree@2.3.1/denonext/css-tree.mjs": "1006dd9810e6482c38a228a7ba7458e5997d9d4ae96448cdd09ddb6f1bca8cfe", + "https://esm.sh/v131/css-what@6.1.0/denonext/css-what.mjs": "283d02df6fef73d3223b55324b559b363dd0e4c008ea1efbcf9f14b8f2642202", + "https://esm.sh/v131/csso@5.0.5/denonext/csso.mjs": "4ce8ca79a2edba20025de6c7955632d80c9c0881631b02be1ebbb1e105f1092c", + "https://esm.sh/v131/dash-ast@1.0.0/denonext/dash-ast.mjs": "f373d7ee50f9029af3b5688f06ac1733df201ef56f6b8048058e50d369ded030", + "https://esm.sh/v131/defined@1.0.1/denonext/defined.mjs": "23a4b6f1dd519b704146cb6f269ec68310b71e4f18812174f5257a9cd2ba04c5", + "https://esm.sh/v131/deprecation@2.3.1/denonext/deprecation.mjs": "0bf7139d1068345709e59dddb4daea315691d290a8c896a6e076dea02dd66eaf", + "https://esm.sh/v131/deps-sort@2.0.1/denonext/deps-sort.mjs": "4442b68c49b052e0361a868c291c4d2d8346e1ca16c958c42d1647b7686df8fb", + "https://esm.sh/v131/detective@5.2.1/denonext/detective.mjs": "0a56371138f12a1b0bdc3593e1df0ed7419c0d1b7a097ab6c53fd9747aa1cf5f", + "https://esm.sh/v131/dom-serializer@2.0.0/denonext/dom-serializer.mjs": "b4653fd91e295a1afebe4dbd9d41c4e437931e60bd71d6140ccf23cb824afb43", + "https://esm.sh/v131/domelementtype@2.3.0/denonext/domelementtype.mjs": "371936c356d5ac797f2ce3a66b98dfc73e6fff0e095b2858b85668e6ad7d10e0", + "https://esm.sh/v131/domhandler@5.0.3/denonext/domhandler.mjs": "f88707ec8b4321b3c36661deec7e8b6d9670e5feccf977cf5cb9018a783567b9", + "https://esm.sh/v131/domutils@3.1.0/denonext/domutils.mjs": "ae611c3563bfdeac51e0b797dc2053551f782b1a8bb5b2fcacd3e4882c5185ce", + "https://esm.sh/v131/duplexer2@0.1.4/denonext/duplexer2.mjs": "90cf4d0253e9fade0258cf4b89137cf4efcfb75fbf1f7788d7f3cc59eb8b9d0b", + "https://esm.sh/v131/entities@4.5.0/denonext/entities.mjs": "e491f306bcd67703da07e7a4364656fc109d55cc871422c282ed7829b8bfbfab", + "https://esm.sh/v131/fast-safe-stringify@2.1.1/denonext/fast-safe-stringify.mjs": "8b0ef0a4235c4efe44865357a73aa6d9eaf4d0c7c8705dfe744f5cce60eefd00", + "https://esm.sh/v131/function-bind@1.1.1/denonext/function-bind.mjs": "331f5d2a5830a67a767be946331716b1b9db05125891100a16e24114dba8ef87", + "https://esm.sh/v131/get-assigned-identifiers@1.2.0/denonext/get-assigned-identifiers.mjs": "763ae087d80fc9c56e29470244fc6d18d4586ada9c3082001f860b2752baf149", + "https://esm.sh/v131/has@1.0.3/denonext/has.mjs": "863ea1c6778762af15a01d6b6cb050be483239a2394a1cbd48ad861cdcd1e5d8", + "https://esm.sh/v131/htmlescape@1.1.1/denonext/htmlescape.mjs": "cc11c0cfccbffe79a032cab4e0bc138505917f490e3baafef463e08a60811c69", + "https://esm.sh/v131/immediate@3.0.6/denonext/immediate.mjs": "521875473fbc7a2cbf94a7475e64883a9ca4b79c19d9138edfbf31ac2eeb0efa", + "https://esm.sh/v131/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", + "https://esm.sh/v131/inline-source-map@0.6.2/denonext/inline-source-map.mjs": "b675e32637b99f1924a541e8f1cdc26c8190c6f5916b8c84cf240197d7abe3f1", + "https://esm.sh/v131/insert-module-globals@7.2.1/denonext/insert-module-globals.mjs": "58f9c2929865572ceec9968304120cd0d3c2b6784d3c5a1e2b68d91a978bf0d3", + "https://esm.sh/v131/is-core-module@2.12.1/denonext/is-core-module.mjs": "56aa0fcf25374a0ca4a50dd25523c6e02d6515545f942c56a35c9737910bc0f1", + "https://esm.sh/v131/is-plain-object@5.0.0/denonext/is-plain-object.mjs": "6d9568ddc8b90de99a46c63e14984810280b6b021dc4e478803b3c240811985f", + "https://esm.sh/v131/isarray@1.0.0/denonext/isarray.mjs": "6368a41cf02c83843453ac571deb4c393c14e6f5e1d9ca6bbe43a4623f3856c8", + "https://esm.sh/v131/jsonparse@1.3.1/denonext/jsonparse.mjs": "ea8830b4bfaa7972aafe503ec91c8af862a24ce06e5b1406b808fca70356531f", + "https://esm.sh/v131/jszip@3.5.0/denonext/jszip.mjs": "b6318816ff10636a011ba3c36a31a0a97c659e3bfc149d214475e4259f91ab5f", + "https://esm.sh/v131/labeled-stream-splicer@2.0.2/denonext/labeled-stream-splicer.mjs": "08290ae2532a21e38bfdb0dd1963f833e0c9c12e248056a233521c6a5e26f90b", + "https://esm.sh/v131/lie@3.3.0/denonext/lie.mjs": "6c830a20ad3c0530774990a360acb832e43bc30f4f477c7a367b02bcecf8bdf3", + "https://esm.sh/v131/lodash.memoize@3.0.4/denonext/lodash.memoize.mjs": "06bfc7fd8d11ad7314e470d11e409aff2a6778321a48b830fb689a2f5d386214", + "https://esm.sh/v131/module-deps@6.2.3/denonext/module-deps.mjs": "dfc7d632f18420edec18469b824341c12d1de6f39f0c37bd1ffd132345b590ff", + "https://esm.sh/v131/node_fetch.js": "eb4be18bc6ed9f45aacb943cc12e2d9a7dff73537dc6155b96e8c7ab3f79b6ba", + "https://esm.sh/v131/nth-check@2.1.1/denonext/nth-check.mjs": "963086b6de9570c12d67400ca45358dbe4e2e4f54f197ee21b83308e5e4158fa", + "https://esm.sh/v131/once@1.4.0/denonext/once.mjs": "b4eb5beddf7f0f8ab4db5e56987d53e5f0fd77961eac5dd554ab75aa79ef0202", + "https://esm.sh/v131/pako@1.0.11/denonext/pako.mjs": "e5785da102bdb7ef477f4198b2be65517909be7b8e74cb9267591cbc2e650d5a", + "https://esm.sh/v131/parents@1.0.1/denonext/parents.mjs": "2726031f02be1ae223bdce8b16d8178b3571f8f8cb6ffa8536f46636f590fce8", + "https://esm.sh/v131/path-is-absolute@1.0.1/denonext/path-is-absolute.mjs": "678005e3a51e4d28fabe4689d94e4fc86e00bed0f1f86d6225f1bb83b94a1b2e", + "https://esm.sh/v131/path-parse@1.0.7/denonext/path-parse.mjs": "7076e749c5b4c0027bab7dc698bd4477fdc31c2f4a308838d4e549d84a58bff3", + "https://esm.sh/v131/path-platform@0.11.15/denonext/path-platform.mjs": "028b52ce65f77b8096452892024f9cd8ae05d7c6aea62b5384cc4d6671e342cf", + "https://esm.sh/v131/process-nextick-args@2.0.1/denonext/process-nextick-args.mjs": "a57885eb600374afb2521e1d47e92df4d292d49c90c31496da5d0dde2f0d0b5f", + "https://esm.sh/v131/read-only-stream@2.0.0/denonext/read-only-stream.mjs": "9cd694b0f224e32dc37b6ef2aaef4a4f30cbe0befb7179c3f907729fa89f2aa3", + "https://esm.sh/v131/readable-stream@2.3.8/denonext/readable-stream.mjs": "9c2952f308e93db73ce18182be01e4e820866fdf35042a60ef29c317a4ffa72b", + "https://esm.sh/v131/resolve@1.22.2/denonext/resolve.mjs": "aa9aa2137defa06f284e4f074d6bd24012116df08da2e9d09026a74565904794", + "https://esm.sh/v131/safe-buffer@5.1.2/denonext/safe-buffer.mjs": "bf91200afdaf8be92e5c7d4c79e4dc9b5c534f76e104f1b37e5891d6f81eaca2", + "https://esm.sh/v131/safe-buffer@5.2.1/denonext/safe-buffer.mjs": "facbcb4f4622e13062978522fa12c42cae4e12f55b0e1d3fa1c4bc751bd827c7", + "https://esm.sh/v131/set-immediate-shim@1.0.1/denonext/set-immediate-shim.mjs": "2ff36ce48c47dda8fb85fdfde6ad53ed3a329d140b3e19bbe9750aebdf10812a", + "https://esm.sh/v131/shasum-object@1.0.0/denonext/shasum-object.mjs": "5c14c2f8ab529594c6042637e7fa7befb5ecef95c8fd925e63a2e531d5df8c82", + "https://esm.sh/v131/source-map-js@1.0.2/denonext/lib/source-map-generator.js": "8aff2603c0b8e01a585cd0d43582e6bc2787071fd68c4eb7a4dfe03da9cab69e", + "https://esm.sh/v131/source-map@0.5.7/denonext/source-map.mjs": "410c2b46179b5fca0fc98d83d62061e29a620fdcb9011c0f0c1d25848f8d7322", + "https://esm.sh/v131/stream-combiner2@1.1.1/denonext/stream-combiner2.mjs": "cc9b21e76c443e11f10f5810a43a26379e6acbc6d787849e13cad071863c838e", + "https://esm.sh/v131/stream-splicer@2.0.1/denonext/stream-splicer.mjs": "75989e7ec3cfac4105a180494b975b45315faef0fac96b8c06be565c1206944e", + "https://esm.sh/v131/svgo@3.0.2/denonext/svgo.mjs": "3541ba27b6240c4b5d349cc17b8d5dcbc9ab8c7ec783fc269e557a409447dfd5", + "https://esm.sh/v131/syntax-error@1.4.0/denonext/syntax-error.mjs": "38f92387aa060e47f6013cd68ff15d49233865dc09d433665a04187a617eec5c", + "https://esm.sh/v131/through2@2.0.5/denonext/through2.mjs": "e4f46832b4a86219fc292f44b3e77efe58cb0fe841f096100dffcef4ac25bb8a", + "https://esm.sh/v131/through@2.3.8/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", + "https://esm.sh/v131/tunnel@0.0.6/denonext/tunnel.mjs": "4677e2d07e87aa3cd9400cb25ce42d65b6e487d7fe66bcdbd7f18549aa6b88ed", + "https://esm.sh/v131/typedarray@0.0.6/denonext/typedarray.mjs": "78da14557506ad44e927cfb54f4c615f64ecd89aef5abdbfdf17bd29df64554d", + "https://esm.sh/v131/umd@3.0.3/denonext/umd.mjs": "913294420c96d1d4d0cac1fa19dd82ed1b349cab6ad2f275d4ac46373e5fec91", + "https://esm.sh/v131/undeclared-identifiers@1.1.3/denonext/undeclared-identifiers.mjs": "fa33ce8b455d3331af4e619086575dccc11bd56bfdbf4022e70f23f8ab14969e", + "https://esm.sh/v131/universal-user-agent@6.0.0/denonext/universal-user-agent.mjs": "2969647abd054007e6d838dd2ecc7de9c513c18c43322dfa3de57eec8d2d6447", + "https://esm.sh/v131/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", + "https://esm.sh/v131/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", + "https://esm.sh/v131/xtend@4.0.2/denonext/xtend.mjs": "503056f181793967e90c0566a737612694366fa7191172f4a106099b5c2a80d2", + "https://esm.sh/v132/@actions/core@1.10.1/denonext/core.mjs": "80be5c75e93f1fd245333c63723dc621f0a2e7add8c92f09de728f69a756c272", + "https://esm.sh/v132/@actions/http-client@2.1.0/denonext/http-client.mjs": "86f27b9c63eca386d3b2725124a86fd50f8c4dff1dba30648689195c87598bb5", + "https://esm.sh/v132/@actions/http-client@2.1.0/denonext/lib/auth.js": "e27889069e589eef705601a5878554a90c4b824732864f750c4f2b7303dfe974", + "https://esm.sh/v132/@faker-js/faker@8.0.2/denonext/faker.mjs": "870def5d50e632211a71722109fae486a00080a14a2329589ea4a83f878b6699", + "https://esm.sh/v132/@octokit/app@14.0.0/denonext/app.mjs": "660db7abb5831110a12017a317fa1fe45b303c3a61d299a12c5f4dfb972990db", + "https://esm.sh/v132/@octokit/auth-app@6.0.0/denonext/auth-app.mjs": "5833c3fdd9249d53d1c33652eb6f4a3b238ed21f303fa7cd4475e9342dcb8ea2", + "https://esm.sh/v132/@octokit/auth-oauth-app@7.0.0/denonext/auth-oauth-app.mjs": "d24f9baa219f4da5828f7395f3b149d0529eff900eed456efeef752e18314a63", + "https://esm.sh/v132/@octokit/auth-oauth-device@6.0.0/denonext/auth-oauth-device.mjs": "3e398998f4e34a4beccf9e71ff89f01cae0191ebf6c57926479af430174a1419", + "https://esm.sh/v132/@octokit/auth-oauth-user@4.0.0/denonext/auth-oauth-user.mjs": "314e2b8a9c5e844f43ef551b487a4fe7cc096245155b7bfc11788c6706878e86", + "https://esm.sh/v132/@octokit/auth-token@4.0.0/denonext/auth-token.mjs": "ab9285959f2bc3ca7942bfb81df3e2f15f5895c829455156647faa403b75703b", + "https://esm.sh/v132/@octokit/auth-unauthenticated@5.0.0/denonext/auth-unauthenticated.mjs": "5c2690a2af409c0e9abe13b6188fee74bd157f787ebbe8d2377813b696b2a74e", + "https://esm.sh/v132/@octokit/core@5.0.0/denonext/core.mjs": "3ba35fb190fc3296e0359f34314aa7ae5a5795dbd72d7068a74c553533191959", + "https://esm.sh/v132/@octokit/endpoint@9.0.0/denonext/endpoint.mjs": "e12041e99a773321b0d175a860b81b7c39708de6dbadddfe3398ee159b8c9e9e", + "https://esm.sh/v132/@octokit/graphql@7.0.1/denonext/graphql.mjs": "51816b6e7188dce0e3d7435251e7310157ad20658673def6e9fa47e816654dfc", + "https://esm.sh/v132/@octokit/oauth-app@6.0.0/denonext/oauth-app.mjs": "0b448785123ee4fe3e2bf1a08e74964100aaaefb0507e99d5563b057d05cb1a9", + "https://esm.sh/v132/@octokit/oauth-authorization-url@6.0.2/denonext/oauth-authorization-url.mjs": "c4a3809c1092ab4135bbb65ba82e885b915a3e0b68e8c9554c98766388baa399", + "https://esm.sh/v132/@octokit/oauth-methods@4.0.0/denonext/oauth-methods.mjs": "fd10083bf9e2ed4beeccdab7a40ba3181cd1cc76958521cdc0c395c63cdb665e", + "https://esm.sh/v132/@octokit/plugin-paginate-graphql@4.0.0/denonext/plugin-paginate-graphql.mjs": "6d2abafdadec31dc3afb9308c18a44b51b834357011d67dce611817196ac032f", + "https://esm.sh/v132/@octokit/plugin-paginate-rest@8.0.0/denonext/plugin-paginate-rest.mjs": "8ed6e17dcb65d460c99fe3c3133c20b566fa2c7c4aedcf931e795ea2ca46e24f", + "https://esm.sh/v132/@octokit/plugin-request-log@4.0.0/denonext/plugin-request-log.mjs": "8683bc54297e4657259a0edc6abe2c8cf9953c1b044faa8cfb1a9bc0970b54a3", + "https://esm.sh/v132/@octokit/plugin-rest-endpoint-methods@9.0.0/denonext/plugin-rest-endpoint-methods.mjs": "84a5baa44ee16c3ffe9347291fbc106aefa5e57c48b31eacf6bb0ca60b7ad5cd", + "https://esm.sh/v132/@octokit/plugin-retry@6.0.0/denonext/plugin-retry.mjs": "09841bfd643bbdcf55a7c8e884c23533ccb952de063e68c32970ee08ecb86e4d", + "https://esm.sh/v132/@octokit/plugin-throttling@7.0.0/denonext/plugin-throttling.mjs": "e481fde726771da89041353e30f097de0464fda4ec408c9ea541ffa5d37f67f4", + "https://esm.sh/v132/@octokit/request-error@5.0.0/denonext/request-error.mjs": "dfc75ef3272174505d06ccd7bb0128ccc81603bf6c3d45d4089bcf57de956fc2", + "https://esm.sh/v132/@octokit/request@8.1.1/denonext/request.mjs": "9188b4e13c35b697fd9a61c164d3e3f9fe01c8c70a8807a01f2f790cf8baf06f", + "https://esm.sh/v132/@octokit/rest@20.0.1/denonext/rest.mjs": "682fd99ba3a3a08099fbdf228c740b9ba962f9929ea3b179e94864f10a0b7e61", + "https://esm.sh/v132/@octokit/webhooks-methods@4.0.0/denonext/webhooks-methods.mjs": "b44d80a07e6e698c95a2fc2789e2caf10b4ff821300e947b2e79c449453a7a19", + "https://esm.sh/v132/@octokit/webhooks@12.0.3/denonext/webhooks.mjs": "0cfd18152589f098ba5d8bde4bd0e884c51e61ae814f93dd77707682291706f1", + "https://esm.sh/v132/@primer/octicons@19.7.0/denonext/octicons.mjs": "fac114048b389625024008b8e689aa47590a2d7d399dd968de699b9942c2c1bd", + "https://esm.sh/v132/@puppeteer/browsers@1.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/browsers.mjs": "1d70b01b6a52b24dfc2bc5a21e04ed9701fad498e75bcd02faeadb19fa384199", + "https://esm.sh/v132/@puppeteer/browsers@1.7.1/denonext/browsers.mjs": "ba676db07959dbd4c963bf88305ebb6b8f86ddbd19cecf30382e1d95cec7a4d9", + "https://esm.sh/v132/@tootallnate/quickjs-emscripten@0.23.0/X-YS93czppc29tb3JwaGljLXdz/denonext/quickjs-emscripten.mjs": "47b4c7313960abe0169c9686ac7fb81c5499816e059ced10d0d150545e40d3e7", + "https://esm.sh/v132/@tootallnate/quickjs-emscripten@0.23.0/denonext/quickjs-emscripten.mjs": "c71def3a2ffe572f7b9587bd353c0405564faa8c7f35864dcbcacbf539b09eaa", + "https://esm.sh/v132/@twemoji/parser@14.1.0/denonext/parser.mjs": "49be06f8aace91c31d62ab861d019657bdbed8fac3491a2ec2521ebada375139", + "https://esm.sh/v132/agent-base@7.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/agent-base.mjs": "fa8d6479aa0028074ed701078b47c3303b68ac435050b1364b20577a531ca6fe", + "https://esm.sh/v132/agent-base@7.1.0/denonext/agent-base.mjs": "fa8d6479aa0028074ed701078b47c3303b68ac435050b1364b20577a531ca6fe", + "https://esm.sh/v132/aggregate-error@3.1.0/denonext/aggregate-error.mjs": "b28a9c083fba80c73d235f2ef8869695ac288af1fb371469aa218ea9128a209a", + "https://esm.sh/v132/alpinejs@3.13.0/denonext/alpinejs.mjs": "fc7a8d3ed5384c2f7f722812ddb98991461740ede9c0d4e49c63383697909c0c", + "https://esm.sh/v132/ansi-regex@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/ansi-regex.mjs": "738d194ad7037256cfcd3f87d3716d28096261492d163395badfbdab3f72ce15", + "https://esm.sh/v132/ansi-regex@5.0.1/denonext/ansi-regex.mjs": "738d194ad7037256cfcd3f87d3716d28096261492d163395badfbdab3f72ce15", + "https://esm.sh/v132/ast-types@0.13.4/X-YS93czppc29tb3JwaGljLXdz/denonext/ast-types.mjs": "8b8888d9fcffda3e8dde19410468778d03696a8dcf8d1b295fbb17cd4122c6c0", + "https://esm.sh/v132/ast-types@0.13.4/denonext/ast-types.mjs": "1ad44647c921093c5baabf8c4ff6dd4e000e93e7ba4b5dc8bb5c37da3fe4ac0d", + "https://esm.sh/v132/b4a@1.6.4/X-YS93czppc29tb3JwaGljLXdz/denonext/b4a.mjs": "f34afd65a97ec9e9e600c2f8211cd21285d0fd37cdca8f6b69c18b915704dbc5", + "https://esm.sh/v132/b4a@1.6.4/denonext/b4a.mjs": "f34afd65a97ec9e9e600c2f8211cd21285d0fd37cdca8f6b69c18b915704dbc5", + "https://esm.sh/v132/balanced-match@1.0.2/denonext/balanced-match.mjs": "b2f9737a6fb330aedd4a444eb85ba127d757c49032a528400fc0e2efb70ddca3", + "https://esm.sh/v132/basic-ftp@5.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/basic-ftp.mjs": "74bd9f9d9e67abbc1f3965c18efc175d617eebe8b6609c31ca8481f918681d46", + "https://esm.sh/v132/basic-ftp@5.0.3/denonext/basic-ftp.mjs": "74bd9f9d9e67abbc1f3965c18efc175d617eebe8b6609c31ca8481f918681d46", + "https://esm.sh/v132/before-after-hook@2.2.3/denonext/before-after-hook.mjs": "f4262d059d899d7fcaa8d903bcf352df38ac1c040bb45273d79de200ffdad267", + "https://esm.sh/v132/bottleneck@2.19.5/denonext/light.js": "964cbaaa1bf999d34a2410023ae269f921c82c72009c707a1fd02fb6abad5b1d", + "https://esm.sh/v132/brace-expansion@2.0.1/denonext/brace-expansion.mjs": "d6952fb4f0cee3ad87c36030f0128b23bf50a566625678207e9fde8b9a30326d", + "https://esm.sh/v132/btoa-lite@1.0.0/denonext/btoa-lite.mjs": "5f8ecdf77c8824225e30cf84b62ded0fa667ef51fe1a8b772b1ddf46410bf78f", + "https://esm.sh/v132/buffer-crc32@0.2.13/X-YS93czppc29tb3JwaGljLXdz/denonext/buffer-crc32.mjs": "8e65c573993c2df678b998137569aee9a72c3f4a607bc4778a122756b3ce297e", + "https://esm.sh/v132/buffer-crc32@0.2.13/denonext/buffer-crc32.mjs": "8e65c573993c2df678b998137569aee9a72c3f4a607bc4778a122756b3ce297e", + "https://esm.sh/v132/bufferutil@4.0.7/denonext/bufferutil.mjs": "b25ca474c1bd022655bcc0489055a5384e298963c3a046cb75cc83c7e5e2e225", + "https://esm.sh/v132/chromium-bidi@0.4.26/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/cjs/bidiMapper/bidiMapper.js": "53c1e19d84600b9ce365f97b418b7b08782e8021fd828820f65cdba335e6314b", + "https://esm.sh/v132/chromium-bidi@0.4.26/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/cjs/protocol/protocol.js": "6ed4cea0c46f6f41f3bd829da1a83497f4455f23ce9111004539608a860bfefc", + "https://esm.sh/v132/chromium-bidi@0.4.26/denonext/lib/cjs/bidiMapper/bidiMapper.js": "277a0b0490035622b4fe9410159e51d8e3dfad3d03487819368a694c7fedb877", + "https://esm.sh/v132/chromium-bidi@0.4.26/denonext/lib/cjs/protocol/protocol.js": "6ed4cea0c46f6f41f3bd829da1a83497f4455f23ce9111004539608a860bfefc", + "https://esm.sh/v132/clean-stack@2.2.0/denonext/clean-stack.mjs": "8a2732fd195c0663d9f8a3957932215f3d4cb45dbe2f4747c9f39a966a4f067b", + "https://esm.sh/v132/cliui@8.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/cliui.mjs": "ae61b40db8f38866c143dfe4a7c2206bba9526fc4bdf5cec1443294420ef3eba", + "https://esm.sh/v132/cliui@8.0.1/denonext/cliui.mjs": "ae61b40db8f38866c143dfe4a7c2206bba9526fc4bdf5cec1443294420ef3eba", + "https://esm.sh/v132/compare-versions@6.1.0/denonext/compare-versions.mjs": "4f3fdfdd991b1e698c212697e8eb407a3a0f6f63dd45b15841afe0a944eb0ea8", + "https://esm.sh/v132/cross-fetch@4.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/cross-fetch.mjs": "238eae32034ab217cdbef10b812c7357f61ab2730c58207f4cf9135e9dec7a61", + "https://esm.sh/v132/cross-fetch@4.0.0/denonext/cross-fetch.mjs": "238eae32034ab217cdbef10b812c7357f61ab2730c58207f4cf9135e9dec7a61", + "https://esm.sh/v132/css-tree@2.2.1/denonext/css-tree.mjs": "029fb11a6dc01851e2010d82011c0c982718df39b8205ab001ca680d100da977", + "https://esm.sh/v132/cssesc@3.0.0/denonext/cssesc.mjs": "8e1441106b9e0d6a2b1c5f012f9f22962fbd8661490c06e7d0f602dd2b65864f", + "https://esm.sh/v132/csso@5.0.5/denonext/csso.mjs": "2636ff0820a385e131cb80d50be52fa7495ddad6ed67f2e904d51ce17bd0f40c", + "https://esm.sh/v132/data-uri-to-buffer@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/data-uri-to-buffer.mjs": "8cd7bd53af8e36a0beaf6405d63d51af7a2abb72219d5359d3f61d3cee73c4bc", + "https://esm.sh/v132/data-uri-to-buffer@5.0.1/denonext/data-uri-to-buffer.mjs": "8cd7bd53af8e36a0beaf6405d63d51af7a2abb72219d5359d3f61d3cee73c4bc", + "https://esm.sh/v132/debug@4.3.4/X-YS93czppc29tb3JwaGljLXdz/denonext/debug.mjs": "d0d5027ba8245e7dc34bb3356ccdddbb3ac2aa1bf1ca1d7321981ce4bf71dc05", + "https://esm.sh/v132/debug@4.3.4/denonext/debug.mjs": "d2d7158f8de406c9ce8e9601650e16bcf4031f476bc212a750fa851b33f8adf7", + "https://esm.sh/v132/degenerator@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/degenerator.mjs": "bf57cdbcdcff3d551788e51bf69d735271d1395caf9622cd011719dd4b462634", + "https://esm.sh/v132/degenerator@5.0.1/denonext/degenerator.mjs": "9a21df7d9f28a76cee1b1aa2f685703ed8de973771713bcba4c86919c847b7fc", + "https://esm.sh/v132/deprecation@2.3.1/denonext/deprecation.mjs": "0bf7139d1068345709e59dddb4daea315691d290a8c896a6e076dea02dd66eaf", + "https://esm.sh/v132/ejs@3.1.9/denonext/ejs.mjs": "46c96cc938964f65517d07e9b2960fb84317eec0078bfdce0ed60c63e1dcd23d", + "https://esm.sh/v132/emoji-regex@8.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/emoji-regex.mjs": "da8ce329dbc5d6fab22dc15280b7f53836043511ca208246f376e0808d98c656", + "https://esm.sh/v132/emoji-regex@8.0.0/denonext/emoji-regex.mjs": "da8ce329dbc5d6fab22dc15280b7f53836043511ca208246f376e0808d98c656", + "https://esm.sh/v132/end-of-stream@1.4.4/X-YS93czppc29tb3JwaGljLXdz/denonext/end-of-stream.mjs": "4f450b8139d3b56cfd2c638e53b2ac014a9e8aef901807f8d53aa6b25219f862", + "https://esm.sh/v132/end-of-stream@1.4.4/denonext/end-of-stream.mjs": "a44af9df6e745ef11b7915823ee5633326776816cec039795d05354cf15c9aea", + "https://esm.sh/v132/entities@2.2.0/denonext/entities.mjs": "af15975e7c8b5f17be658d1db80f9de7c076cb9cd53c4dcfc9dd60d460266d62", + "https://esm.sh/v132/escalade@3.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/sync.js": "9a3234bc32771d5f39cb1054ae66351d44a35235c4b8fed07e8241d7215f0b23", + "https://esm.sh/v132/escalade@3.1.1/denonext/sync.js": "9a3234bc32771d5f39cb1054ae66351d44a35235c4b8fed07e8241d7215f0b23", + "https://esm.sh/v132/escodegen@2.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/escodegen.mjs": "6e51c2b911bcd23c85d11061931b66336bc6963e0b1d60a8aa0da4a9373204af", + "https://esm.sh/v132/escodegen@2.1.0/denonext/escodegen.mjs": "09eef48118403c9c84f43e65bb6241ffe7b303e72468dd4e939ed193ba4374b5", + "https://esm.sh/v132/esprima@4.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/esprima.mjs": "e8601201d5cc2c881a4a1225806fa460455917137b2b852354c2cf3bc2a60f78", + "https://esm.sh/v132/esprima@4.0.1/denonext/esprima.mjs": "e8601201d5cc2c881a4a1225806fa460455917137b2b852354c2cf3bc2a60f78", + "https://esm.sh/v132/estraverse@5.3.0/X-YS93czppc29tb3JwaGljLXdz/denonext/estraverse.mjs": "3e3574b932e1b7c1476f467e6103559d7b978df412e50b6b97299679d4556004", + "https://esm.sh/v132/estraverse@5.3.0/denonext/estraverse.mjs": "3e3574b932e1b7c1476f467e6103559d7b978df412e50b6b97299679d4556004", + "https://esm.sh/v132/esutils@2.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/esutils.mjs": "56b9038ae71de0a374c86435a347793030afc96deb151466a5009cb5384a85d0", + "https://esm.sh/v132/esutils@2.0.3/denonext/esutils.mjs": "56b9038ae71de0a374c86435a347793030afc96deb151466a5009cb5384a85d0", + "https://esm.sh/v132/extract-zip@2.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/extract-zip.mjs": "a00041595b46c1b0553195dd5f9b916c2c7e6f177b947e6c66a9c164b71bf33d", + "https://esm.sh/v132/extract-zip@2.0.1/denonext/extract-zip.mjs": "217739b3b6f3828ebb2e9493c0d1c7334df8b2c40e7f3c6bc4f282cc6ecc14a7", + "https://esm.sh/v132/fast-fifo@1.3.0/denonext/fast-fifo.mjs": "298b77b0f0e0c0f5bfb1597b543ca81783163015afb6e18e57453883ea937f53", + "https://esm.sh/v132/fast-fifo@1.3.2/X-YS93czppc29tb3JwaGljLXdz/denonext/fast-fifo.mjs": "c4aabf3d2b427cd6c05d64d83c59cb3131f3abf9e638663925977b9bf10c47a1", + "https://esm.sh/v132/fd-slicer@1.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/fd-slicer.mjs": "7ad40246ac9b1de5b45bbe2c754ca0522053a297a47e2a0494f7b0e390b583d8", + "https://esm.sh/v132/fd-slicer@1.1.0/denonext/fd-slicer.mjs": "82ba1fa74b48e8aca975c5298be74d26736dd0cf68c10677b7a73430632c7a25", + "https://esm.sh/v132/fs-extra@8.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/fs-extra.mjs": "f60fe248394cd5d93924a87f2566b939920f87af65a1159c867676681854ef37", + "https://esm.sh/v132/fs-extra@8.1.0/denonext/fs-extra.mjs": "5350d09ddd3b49774de877571e03680fb295af826844841ece9bf4a562339314", + "https://esm.sh/v132/fs.realpath@1.0.0/denonext/fs.realpath.mjs": "289f113bc42f0e616afcb7f5d677424a20ee8cecb4eeac0c24be14e83ae3e1ac", + "https://esm.sh/v132/get-caller-file@2.0.5/X-YS93czppc29tb3JwaGljLXdz/denonext/get-caller-file.mjs": "6499276b8de4753fad331af2a8fff9efb8f4aebb5111c94b0430f751b4aac6e5", + "https://esm.sh/v132/get-caller-file@2.0.5/denonext/get-caller-file.mjs": "6499276b8de4753fad331af2a8fff9efb8f4aebb5111c94b0430f751b4aac6e5", + "https://esm.sh/v132/get-stream@5.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/get-stream.mjs": "704bdd45a40426a83f4634a9194191026adeca14e109b7e370e117ffda4ec591", + "https://esm.sh/v132/get-stream@5.2.0/denonext/get-stream.mjs": "791d0f28f61e094c0a9e686e32dea69342e97618799223988f42fa379280e383", + "https://esm.sh/v132/get-uri@6.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/get-uri.mjs": "8fd8736b3d52efa9ee2356558bf45bcf8adc4f434b2e036d391240d556be9c82", + "https://esm.sh/v132/get-uri@6.0.1/denonext/get-uri.mjs": "86587f08c548fc43cdb1dfb4e8c6e8617201a6ed5f965bc123f3d743e01c2cc3", + "https://esm.sh/v132/glob@8.1.0/denonext/glob.mjs": "5231076466f6a71b3fac965f8b9cc216c8165868bec7ef17ebad935710d7a439", + "https://esm.sh/v132/graceful-fs@4.2.11/X-YS93czppc29tb3JwaGljLXdz/denonext/graceful-fs.mjs": "c1d9c1b7a280b3c2bb3cf2c48e1cbfb1791bd052f0836a58100725e0beac3c16", + "https://esm.sh/v132/graceful-fs@4.2.11/denonext/graceful-fs.mjs": "1af0eb8163173bcbd5bb33526f42bdfe66e2489227fc82181fb3a081fb32ee4e", + "https://esm.sh/v132/html-escaper@3.0.3/denonext/html-escaper.mjs": "c51d972a3e0a4560b4f2e81b42a71b68d986461c809d576c56d00e729d08258e", + "https://esm.sh/v132/http-proxy-agent@7.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/http-proxy-agent.mjs": "ddac68fe569a37602c2fa17f6111241452765acb1742801e1501d008ab65a9f7", + "https://esm.sh/v132/http-proxy-agent@7.0.0/denonext/http-proxy-agent.mjs": "9134b2f1ea33408977966b59e8459468b302d2cc1f919f510ccbaaf631c600a3", + "https://esm.sh/v132/https-proxy-agent@7.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/https-proxy-agent.mjs": "4f4c007a4ea1cc3f6acdaed4f38b29e06a0c849d4c03c5ddaa46e4ecb2d3f5a9", + "https://esm.sh/v132/https-proxy-agent@7.0.2/denonext/https-proxy-agent.mjs": "81ae7c11d8ee1e99cfc12f8661ae2450a76f49119be8a7aef2303af7e34ba4f5", + "https://esm.sh/v132/human-format@1.2.0/denonext/human-format.mjs": "d767edbf69b662936013c764c680b80180e26b7851d633bbf5c0f28090bad4e6", + "https://esm.sh/v132/indent-string@4.0.0/denonext/indent-string.mjs": "de4038b836a42fe2a7c453bd0b44cdae706a9560bbef99b1857c13f9d55ace14", + "https://esm.sh/v132/inflight@1.0.6/denonext/inflight.mjs": "05e2dc32d0f09a76d2072d10e53a3341cd1b72a60e0ae5344b3ff8ccaea769e1", + "https://esm.sh/v132/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", + "https://esm.sh/v132/ip@1.1.8/X-YS93czppc29tb3JwaGljLXdz/denonext/ip.mjs": "fbbc4c97819b14fc512e99e6236416e67defd7315facfa09f90ed2bdeef9ba95", + "https://esm.sh/v132/ip@1.1.8/denonext/ip.mjs": "fbbc4c97819b14fc512e99e6236416e67defd7315facfa09f90ed2bdeef9ba95", + "https://esm.sh/v132/ip@2.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/ip.mjs": "93a8de80ff6d67996023e1df52ca092d55fc30794166c1e23bc5e87c84863a5f", + "https://esm.sh/v132/ip@2.0.0/denonext/ip.mjs": "93a8de80ff6d67996023e1df52ca092d55fc30794166c1e23bc5e87c84863a5f", + "https://esm.sh/v132/is-fullwidth-code-point@3.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/is-fullwidth-code-point.mjs": "c499d96ea8ae837a9e8d2f64d39411eccb8f931e0fb802ae84b6edb731f5afbc", + "https://esm.sh/v132/is-fullwidth-code-point@3.0.0/denonext/is-fullwidth-code-point.mjs": "c499d96ea8ae837a9e8d2f64d39411eccb8f931e0fb802ae84b6edb731f5afbc", + "https://esm.sh/v132/is-plain-object@5.0.0/denonext/is-plain-object.mjs": "6d9568ddc8b90de99a46c63e14984810280b6b021dc4e478803b3c240811985f", + "https://esm.sh/v132/isomorphic-ws@5.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/isomorphic-ws.mjs": "fb52bf0d2b1f864173976df3d31ded32f0620a2a74f35cfe84307e82b44c42c4", + "https://esm.sh/v132/jose@4.14.6/denonext/jose.mjs": "686277bc7177b7f5863b8dc5afacd4ce4c6b6da01054404f7a568309d04f7f77", + "https://esm.sh/v132/jsonfile@4.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/jsonfile.mjs": "c41c0445bc05f73e06fc50212f45ee76a3c5b1aa4f6e7828bd8e5d99ae103025", + "https://esm.sh/v132/jsonfile@4.0.0/denonext/jsonfile.mjs": "31d3ea319b51676ae21f43f81a8ab5dc6f919a5015b9082177482cc38f9c7e93", + "https://esm.sh/v132/lru-cache@10.0.1/denonext/lru-cache.mjs": "0bf693a0bedd7806c7bf2f336f83ec6dd1933b881703cf59bee326573473aa35", + "https://esm.sh/v132/lru-cache@7.18.3/X-YS93czppc29tb3JwaGljLXdz/denonext/lru-cache.mjs": "74aded0c7912e078f5be8b37ced802ca2d144873eaab81090d92245409a5f2e2", + "https://esm.sh/v132/lru-cache@7.18.3/denonext/lru-cache.mjs": "74aded0c7912e078f5be8b37ced802ca2d144873eaab81090d92245409a5f2e2", + "https://esm.sh/v132/minimatch@5.1.6/denonext/minimatch.mjs": "7307d9f0864dce7f8b413d69c070077f1863517df3c84b7b439578cbcb3fe71d", + "https://esm.sh/v132/mitt@3.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/mitt.mjs": "c8a314c966ba64128035339cd4c7f48c6e15bb27bb19703c99deae857bb4b3cd", + "https://esm.sh/v132/mitt@3.0.1/denonext/mitt.mjs": "c8a314c966ba64128035339cd4c7f48c6e15bb27bb19703c99deae857bb4b3cd", + "https://esm.sh/v132/mkdirp-classic@0.5.3/X-YS93czppc29tb3JwaGljLXdz/denonext/mkdirp-classic.mjs": "8008e607ebb76c210842f49adabadb8cab51d5d69df1b9d4b9b08516188a28cb", + "https://esm.sh/v132/mkdirp-classic@0.5.3/denonext/mkdirp-classic.mjs": "8008e607ebb76c210842f49adabadb8cab51d5d69df1b9d4b9b08516188a28cb", + "https://esm.sh/v132/ms@2.1.2/X-YS93czppc29tb3JwaGljLXdz/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", + "https://esm.sh/v132/ms@2.1.2/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", + "https://esm.sh/v132/nanoid@3.3.6/denonext/non-secure.js": "9339526d48828770370eba72bf719a40b74de0e1197d8a582c15fbd9ab837d3d", + "https://esm.sh/v132/netmask@2.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/netmask.mjs": "364b1700f5dceb0e1cb371c01dde64c69fcab7e2696134ae0d4c275c12ab6387", + "https://esm.sh/v132/netmask@2.0.2/denonext/netmask.mjs": "364b1700f5dceb0e1cb371c01dde64c69fcab7e2696134ae0d4c275c12ab6387", + "https://esm.sh/v132/node-gyp-build@4.6.1/denonext/node-gyp-build.mjs": "5899c174a6ae92bb5a99c3cc06e388bc5ba51af5309d65eac78ff7565d8d1a0b", + "https://esm.sh/v132/octokit@3.1.0/denonext/octokit.mjs": "4856d0f0e036881b19117b75c8bed7fa7dae19e007b75a812f947e019a3b0ea2", + "https://esm.sh/v132/once@1.4.0/X-YS93czppc29tb3JwaGljLXdz/denonext/once.mjs": "81d965ce058f4f2beb3ba2f424dd57e666d60fe2b81a01c3816e3c9f358dd1ff", + "https://esm.sh/v132/once@1.4.0/denonext/once.mjs": "afcb39a581b8e3b52af3ce15acb08b0f6a162478c68dab3526ee68b9295a8ddf", + "https://esm.sh/v132/pac-proxy-agent@7.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/pac-proxy-agent.mjs": "21551fd49aaf0e7c928efd1a88326358e271a8eff5267b6d86a82af019c5a056", + "https://esm.sh/v132/pac-proxy-agent@7.0.1/denonext/pac-proxy-agent.mjs": "243dccbd02b28e0fa9f2687267517c55dbd1d2d99b6c5521f508b5947a98d192", + "https://esm.sh/v132/pac-resolver@7.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pac-resolver.mjs": "21fa8213e8d9ef94f115f698c42d40ae7d387c8d2e025e7b3b3e16ad243cdc0c", + "https://esm.sh/v132/pac-resolver@7.0.0/denonext/pac-resolver.mjs": "5792be4f96c3325ca1baedc0c2e2ff73566600740249daa4d560906bf19a6923", + "https://esm.sh/v132/pend@1.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pend.mjs": "d1e8e306939cc0a21596689c44fd3c42fe98521c4595e7210087bc48ced0ef7d", + "https://esm.sh/v132/pend@1.2.0/denonext/pend.mjs": "d1e8e306939cc0a21596689c44fd3c42fe98521c4595e7210087bc48ced0ef7d", + "https://esm.sh/v132/picocolors@1.0.0/denonext/picocolors.mjs": "5d53d745955947dce84f82222cfd00fd021239fcbe9336c6bbfe34ed2f40886c", + "https://esm.sh/v132/pluralize@8.0.0/denonext/pluralize.mjs": "c874f2612d057d4484c386f6a093496c73bbf249f764a1c34b2417cd952ac153", + "https://esm.sh/v132/postcss-selector-parser@6.0.13/denonext/postcss-selector-parser.mjs": "784c9089c758ad1466ed0c6a8ef4817cc4a850f7ed2d03828f2ccde169a799ca", + "https://esm.sh/v132/postcss@8.4.29/denonext/postcss.mjs": "e0df04f357162570808f516f214e12555d981710e0b8287e901142d33e762ecf", + "https://esm.sh/v132/progress@2.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/progress.mjs": "344d149d0884888a9c45a4a30a0c9e3d3927de7a9413cf56912333aa659267e9", + "https://esm.sh/v132/progress@2.0.3/denonext/progress.mjs": "344d149d0884888a9c45a4a30a0c9e3d3927de7a9413cf56912333aa659267e9", + "https://esm.sh/v132/proxy-agent@6.3.1/X-YS93czppc29tb3JwaGljLXdz/denonext/proxy-agent.mjs": "6c6ec38f64b2e1521572ddcc3460c7f18cdc455f79e603a2d04bdbb71cc659cc", + "https://esm.sh/v132/proxy-agent@6.3.1/denonext/proxy-agent.mjs": "f8f276001ee54cf74b6db76f703d226e7c1eaa9fadb5ee3ad57c2e78206ba627", + "https://esm.sh/v132/proxy-from-env@1.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/proxy-from-env.mjs": "5a2113ba20eb6fc83d6d68efd3aa65c4b61f05611da20339b14d165807eccfd7", + "https://esm.sh/v132/proxy-from-env@1.1.0/denonext/proxy-from-env.mjs": "5a2113ba20eb6fc83d6d68efd3aa65c4b61f05611da20339b14d165807eccfd7", + "https://esm.sh/v132/pump@3.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pump.mjs": "0c4674f9bdd34e81969bd6f5999d899cc6adeac448998bab34dd968ef0519abe", + "https://esm.sh/v132/pump@3.0.0/denonext/pump.mjs": "31ad08f78a09af7b8e50af11460fcca41a0a5f34e39919a349c2d1411155a425", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czpAbGlic3FsL2lzb21vcnBoaWMtd3M/denonext/puppeteer-core.bundle.mjs": "6d22db7680d056d60f3b3e9569970a5871c3d3538ebad1308363ed1bf1c94faa", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/BrowserWebSocketTransport.js": "2fd8233d9b68e8886204980eea9bb8adefebed6463259543530fbd620f7abf3f", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/NodeWebSocketTransport.js": "3ae3be180aaaf9414d4e0d11c9e8e62e4269f7c56dec043c815ea1ff5c9be4af", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/bidi/bidi.js": "96fb2a595d3af0c7bb0b22ae23d578b39a65584d7a5a9b32d23989036f0c9fc2", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/puppeteer-core.bundle.mjs": "8b1382990cbbd89e24fd289e00303187bada679085ec4c809c589bc99544a901", + "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/puppeteer-core.mjs": "39542c3992429873fdab9c0684ded439bfb6beaaf7b8ff1ba42c3a342aed126c", + "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/BrowserWebSocketTransport.js": "2fd8233d9b68e8886204980eea9bb8adefebed6463259543530fbd620f7abf3f", + "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/NodeWebSocketTransport.js": "c96a41e8fee998db17f75ee350fa5216e90daadbf80f2f69b334f55a9bc9f6ba", + "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/bidi/bidi.js": "ce00d75a0f86c00aa211708dc6ca5f2112877368243fa4380fe90ac3cc378905", + "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/puppeteer-core.bundle.mjs": "09f343ba0f3269f8685acf1bd25fb3f5754838af3d4428e203c0b727710dd025", + "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/puppeteer-core.mjs": "46bd4b2d5b517c44b54153e8dcd45a01f702654a41b3e53aa9f1c95c6c80e344", + "https://esm.sh/v132/purgecss@5.0.0/denonext/purgecss.mjs": "38a0802b9826c29526373261e38e3170edc840e19b1f63c343901abdb67b7f13", + "https://esm.sh/v132/queue-tick@1.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/queue-tick.mjs": "452aeea5f84fb1e7e93ab394187a262ded2482669d5554ac283bde794ee2f18b", + "https://esm.sh/v132/queue-tick@1.0.1/denonext/queue-tick.mjs": "452aeea5f84fb1e7e93ab394187a262ded2482669d5554ac283bde794ee2f18b", + "https://esm.sh/v132/require-directory@2.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/require-directory.mjs": "2d9a5c8f6302a91fd07939584573781bff22aa7e763ecc9b1c6d541ea88a0d92", + "https://esm.sh/v132/require-directory@2.1.1/denonext/require-directory.mjs": "2d9a5c8f6302a91fd07939584573781bff22aa7e763ecc9b1c6d541ea88a0d92", + "https://esm.sh/v132/rss-parser@3.13.0/denonext/rss-parser.mjs": "3817c6ec46d9128125ed0413c7534a1bb7213e36d2b3dff5ac9db166d6ea734b", + "https://esm.sh/v132/sax@1.2.4/denonext/sax.mjs": "c709f5e231d178e08230a3e35ea55a1d4ccccefa69e47a7cb7da37adb5b342dd", + "https://esm.sh/v132/smart-buffer@4.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/smart-buffer.mjs": "a33271361967158f6968d2ae5949e1683ef37657e921da492012aed57edc518a", + "https://esm.sh/v132/smart-buffer@4.2.0/denonext/smart-buffer.mjs": "a33271361967158f6968d2ae5949e1683ef37657e921da492012aed57edc518a", + "https://esm.sh/v132/socks-proxy-agent@8.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/socks-proxy-agent.mjs": "a21cec162e282b342710a1f3518a995585099e74296772113e8d0dcc9c368e62", + "https://esm.sh/v132/socks-proxy-agent@8.0.2/denonext/socks-proxy-agent.mjs": "363fa6b4d6edc4056a57eb8f108843c13e4b2ab88222a12d14660e6197c72803", + "https://esm.sh/v132/socks@2.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/socks.mjs": "6ba66323d1fc6ce09ed43515191f8ccadd7ae9d9b8624c7785d326b1378fc79c", + "https://esm.sh/v132/socks@2.7.1/denonext/socks.mjs": "73599bf258f22fb7e99d112beee956279d9a69f4f878a81fe6c7300d38aa54ad", + "https://esm.sh/v132/source-map-js@1.0.2/denonext/lib/source-map-generator.js": "8aff2603c0b8e01a585cd0d43582e6bc2787071fd68c4eb7a4dfe03da9cab69e", + "https://esm.sh/v132/source-map-js@1.0.2/denonext/source-map-js.mjs": "81ed2d1f28bd08a762f6819d5b366285a1bacf4b5c3757d866c79e4950529bfd", + "https://esm.sh/v132/source-map@0.6.1/X-YS93czppc29tb3JwaGljLXdz/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8", + "https://esm.sh/v132/source-map@0.6.1/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8", + "https://esm.sh/v132/streamx@2.15.1/X-YS93czppc29tb3JwaGljLXdz/denonext/streamx.mjs": "c818a6c743608dce5593826398da1971663bf51d2c9651e76c32f99c70f2e6fd", + "https://esm.sh/v132/streamx@2.15.1/denonext/streamx.mjs": "1cfbaabd9eace72efe8171fda04dfb90492475f58a4c6c0dcad7fa69fd4c32ac", + "https://esm.sh/v132/string-width@4.2.3/X-YS93czppc29tb3JwaGljLXdz/denonext/string-width.mjs": "189e33d013706a02d7764e16591c341aba1c2b3d8ea0545658a55c76b2ddf275", + "https://esm.sh/v132/string-width@4.2.3/denonext/string-width.mjs": "7c16f8ff22815ff51f8c49984ec2e295301aefc5d3c33f6f75926d67884b5169", + "https://esm.sh/v132/strip-ansi@6.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/strip-ansi.mjs": "4dbd44fbeeed1fab845e7d1a11eb07bfd3f78cb8ab854812b492ee9ac4f96afc", + "https://esm.sh/v132/strip-ansi@6.0.1/denonext/strip-ansi.mjs": "1286d07bc344b44139a1da63a37326d8ad2ac68b181e0f9e7fc7120e3582f845", + "https://esm.sh/v132/tar-fs@3.0.4/X-YS93czppc29tb3JwaGljLXdz/denonext/tar-fs.mjs": "01dabc90b5f14a98ecd6547ceeeda5d237d40f08624a87b0bbf4a94c216ad560", + "https://esm.sh/v132/tar-fs@3.0.4/denonext/tar-fs.mjs": "04c713c3fc2084f6b9d9e59d821ab570c7d8a1c4b06ebee26c6da2462f6535c6", + "https://esm.sh/v132/tar-stream@3.1.6/X-YS93czppc29tb3JwaGljLXdz/denonext/tar-stream.mjs": "89561d50cf301b472c6b9b95f53dfb3f7ee40cbc04d682174297d01b513d243c", + "https://esm.sh/v132/tar-stream@3.1.6/denonext/tar-stream.mjs": "d0cd9ace591eadec08021ee752b25e068bb89a915d4fad3e9e9dfb12a098a6f3", + "https://esm.sh/v132/through@2.3.8/X-YS93czppc29tb3JwaGljLXdz/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", + "https://esm.sh/v132/through@2.3.8/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", + "https://esm.sh/v132/tslib@2.6.2/X-YS93czppc29tb3JwaGljLXdz/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1", + "https://esm.sh/v132/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1", + "https://esm.sh/v132/tunnel@0.0.6/denonext/tunnel.mjs": "4677e2d07e87aa3cd9400cb25ce42d65b6e487d7fe66bcdbd7f18549aa6b88ed", + "https://esm.sh/v132/unbzip2-stream@1.4.3/X-YS93czppc29tb3JwaGljLXdz/denonext/unbzip2-stream.mjs": "8eaded4ccd35d5d0264ecb76ba9a616804fd81e80c29745ac371d77974da83a4", + "https://esm.sh/v132/unbzip2-stream@1.4.3/denonext/unbzip2-stream.mjs": "8517654c2cd1d62ba176441c2e465c65c4de1946f4c80dd15c0f91fc3c3396c5", + "https://esm.sh/v132/universal-github-app-jwt@1.1.1/denonext/universal-github-app-jwt.mjs": "546280ef9d50e167172bc039c0c2f4348a728ae1732f467af726b08491d2ea18", + "https://esm.sh/v132/universal-user-agent@6.0.0/denonext/universal-user-agent.mjs": "2969647abd054007e6d838dd2ecc7de9c513c18c43322dfa3de57eec8d2d6447", + "https://esm.sh/v132/universalify@0.1.2/X-YS93czppc29tb3JwaGljLXdz/denonext/universalify.mjs": "7c2f90ff22f72e811b6d50ac138f6878ddf884bf21ef7e0d764fd10aba96b64d", + "https://esm.sh/v132/universalify@0.1.2/denonext/universalify.mjs": "7c2f90ff22f72e811b6d50ac138f6878ddf884bf21ef7e0d764fd10aba96b64d", + "https://esm.sh/v132/utf-8-validate@6.0.3/denonext/utf-8-validate.mjs": "dd2d212a3344d99eb810e76983ec83f0a5cfbdb99ae4a1e6eed91514ee335cb2", + "https://esm.sh/v132/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", + "https://esm.sh/v132/uuid@8.3.2/denonext/uuid.mjs": "2cea289bbecc01fab6f701b719513f6ac8a3c21a5e52aa3f8682cf61d70a5dc5", + "https://esm.sh/v132/wrappy@1.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", + "https://esm.sh/v132/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", + "https://esm.sh/v132/ws@8.14.1/X-YS93czppc29tb3JwaGljLXdz/denonext/ws.mjs": "ae5191c024a4001324548fc928a686ba79837736958a5b5bc3bee4c96d98e827", + "https://esm.sh/v132/ws@8.14.1/denonext/ws.mjs": "ae5191c024a4001324548fc928a686ba79837736958a5b5bc3bee4c96d98e827", + "https://esm.sh/v132/xml-formatter@3.5.0/denonext/xml-formatter.mjs": "a254ee3694bf8eb06db53f183e4ecec5a33576b3c8b33522d502ea1b267d7e4b", + "https://esm.sh/v132/xml-parser-xo@4.1.0/denonext/xml-parser-xo.mjs": "5d3e8439358c12b3b6df5b8c6abb3e553c65782bf0a976d52e2d7403ec56e372", + "https://esm.sh/v132/xml2js@0.5.0/denonext/xml2js.mjs": "e8f57cd5035b76fd535d88824ba0ba675545597ee2db39202fdc6b0928ec3e06", + "https://esm.sh/v132/xmlbuilder@11.0.1/denonext/xmlbuilder.mjs": "0237a65baf14b6bb98e2b6fa513dd259d7afa5bfbf4275cb0f6fa4c4ceee0d68", + "https://esm.sh/v132/y18n@5.0.8/X-YS93czppc29tb3JwaGljLXdz/denonext/y18n.mjs": "2b6dff6a9688f56abe26750bb395c2707102feda94dc7e9156aea92038b10004", + "https://esm.sh/v132/y18n@5.0.8/denonext/y18n.mjs": "2b6dff6a9688f56abe26750bb395c2707102feda94dc7e9156aea92038b10004", + "https://esm.sh/v132/yargs-parser@21.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/yargs-parser.mjs": "81b68000098a71ef9ab399378da084702a66707199b5626f93a227fab3d1cf23", + "https://esm.sh/v132/yargs-parser@21.1.1/denonext/yargs-parser.mjs": "81b68000098a71ef9ab399378da084702a66707199b5626f93a227fab3d1cf23", + "https://esm.sh/v132/yargs@17.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/helpers.js": "2ed8f619b4fe20bc8fa33f09b452a5d188bdecaf6b11b918bb279df5162e89a6", + "https://esm.sh/v132/yargs@17.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/yargs.js": "e3e594cdbb5c81b181afdc1e698d93f8d526a4c998e2298660ed1396544cbd88", + "https://esm.sh/v132/yargs@17.7.1/denonext/helpers.js": "41bfc19c908e02fc6bd0193e941d416b40e652869ec21a4d14557930cc1c472c", + "https://esm.sh/v132/yargs@17.7.1/denonext/yargs.js": "30909a640c05369b89910e85e9930a0ad0632c2b7e049ef6372c4b6abe1a302f", + "https://esm.sh/v132/yauzl@2.10.0/X-YS93czppc29tb3JwaGljLXdz/denonext/yauzl.mjs": "5b09c5398c88be85640a0b273c234354b1add2ab0167c1a8dcc4de51d8d056af", + "https://esm.sh/v132/yauzl@2.10.0/denonext/yauzl.mjs": "3666c1694f3eab2e9f5252eff117e9fcee48f19745f1eea94bd39439dbff4b3a", + "https://esm.sh/v132/zod-to-json-schema@3.21.4/denonext/zod-to-json-schema.mjs": "582e650e1bbe793617717c0475536db159cf3c3834713da85cd0c33840566916", + "https://esm.sh/v132/zod@3.22.2/denonext/zod.mjs": "b72f0eac903e994642e59258bd5552020471f60b5b17ed859650bffd3c33daa0", + "https://esm.sh/ws@8.14.1": "149322ff1179abaf6b5db21fae8053126dab99c6a026acd9e32904c1c943837b", + "https://esm.sh/xml-formatter@3.5.0": "3c019e6acfa0c5213995476cd3b3b64ebec2b88ef18a18da268be629618461da", + "https://esm.sh/zod-to-json-schema@3.21.4": "4c9971fa5438ccfc6b98464903e45d587e23bce5706c629e20e72f37b9eb8a4c", + "https://raw.githubusercontent.com/octokit/types.ts/v11.1.0/src/RequestInterface.ts": "b0bcde7d00187fd2111cdcfbf2c0f7e885f1d0adeb01f246453ff4dcc1dd582e" + } +} diff --git a/metrics/components/component.ts b/metrics/components/component.ts new file mode 100644 index 00000000000..63add5cb23c --- /dev/null +++ b/metrics/components/component.ts @@ -0,0 +1,169 @@ +// Imports +import { component as schema } from "@metrics/config.ts" +import { delay } from "std/async/delay.ts" +import { is, toSchema, Validator } from "@utils/validator.ts" +import { Internal } from "@metrics/components/internal.ts" +import { toFileUrl } from "std/path/to_file_url.ts" +import { formatValidationError, throws } from "@utils/errors.ts" +import { exists } from "std/fs/exists.ts" +import * as YAML from "std/yaml/mod.ts" +import { read } from "@utils/io.ts" + +/** Component */ +export abstract class Component extends Internal { + /** Import meta */ + protected static readonly meta = import.meta + + /** Context */ + declare protected readonly context: is.infer + + /** Name */ + abstract readonly name: string + + /** Category */ + abstract readonly category: string + + /** Description */ + abstract readonly description: string + + /** Inputs */ + abstract readonly inputs: Validator + + /** Ouputs */ + abstract readonly outputs: Validator + + /** Scopes */ + readonly scopes = [] as string[] + + /** Supports */ + readonly supports = [] as string[] + + /** Icon */ + get icon() { + return this.name.match(/(\p{Emoji_Presentation})/gu)?.[0] ?? "⏹️" + } + + /** Action */ + protected abstract action(state: state): Promise + + /** Is supported ? */ + protected abstract supported(): void + + /** Run component */ + protected async run(state: state) { + this.log.info("execution started") + await Component.state.parseAsync(state) + this.log.trace(this.context) + let result = null, error = null, recoverable = true + for (let attempt = 1; attempt <= (this.context.retries?.attempts ?? 1); attempt++) { + if (attempt > 1) { + this.log.message(`attempt ${attempt} of ${this.context.retries.attempts}`) + } + try { + // Ensure component is supported for current context + try { + this.supported() + } catch (error) { + recoverable = false + throw error + } + // Run component action + result = await this.outputs.parseAsync(await this.action(state) ?? {}) + } catch (caught) { + error = caught + // Handle validation errors + if (error instanceof is.ZodError) { + recoverable = false + error = formatValidationError(error) + } + } + // Handle general errors + if (error) { + this.log.warn(`attempt ${attempt} failed: ${error}`) + // Retry on recoverable errors + if (recoverable && (this.context.retries.delay) && (attempt < this.context.retries.attempts)) { + this.log.warn(`next attempt in ${this.context.retries.delay}s`) + await delay(this.context.retries.delay * 1000) + continue + } + // Handle fatal errors + if (!recoverable) { + this.log.error(`error is not recoverable`) + } + if (this.context.fatal) { + this.log.error(`execution failed: ${error}`) + throw error + } + this.log.warn(`execution failed: ${error}`) + } + this.log.success("execution completed") + break + } + return { result, error } + } + + /** List tests */ + async tests(path: string) { + if (!await exists(path)) { + return [] + } + const content = await read(path) + return YAML.parse(content) as Array> + } + + /** Load component statically */ + static async load(context: Record & { id: string }) { + const url = context.id.startsWith("https://") ? new URL(context.id) : toFileUrl(`${this.path}/${context.id}/mod.ts`) + const { default: Module } = await import(url.href) + if (!Module) { + throws(`${this.name} ${context.id} could not be loaded`) + } + return new Module(context) + } + + /** Run component statically */ + static async run({ state, context }: { state: state; context: Record & { id: string } }) { + const component = await this.load(context) + return component.run(state) + } + + /** Result */ + static readonly result = is.object({ + content: is.string(), + mime: is.string(), + base64: is.boolean(), + result: is.union([is.record(is.unknown()), is.instanceof(Error)]), + }) + + /** State */ + static readonly state = is.object({ + result: Component.result.optional(), + results: is.array(Component.result), + errors: is.array(is.object({ + source: is.string(), + message: is.string(), + severity: is.enum(["error", "warning"]), + })), + }) + + /** Metadata */ + protected get metadata() { + return { + id: this.id, + icon: this.icon, + name: this.name, + category: this.category, + description: this.description, + scopes: this.scopes, + supports: this.supports, + inputs: toSchema(this.inputs), + outputs: toSchema(this.outputs), + } + } +} + +/** State */ +export type state = is.infer + +// Exports +export { is, toSchema } diff --git a/metrics/components/internal.ts b/metrics/components/internal.ts new file mode 100644 index 00000000000..841f26aa38c --- /dev/null +++ b/metrics/components/internal.ts @@ -0,0 +1,51 @@ +// Imports +import { Logger } from "@utils/log.ts" +import { internal as schema } from "@metrics/config.ts" +import { is, toSchema } from "@utils/validator.ts" +import { fromFileUrl } from "std/path/from_file_url.ts" +import { toFileUrl } from "std/path/to_file_url.ts" + +/** Component root path */ +const path = fromFileUrl(new URL("../..", import.meta.url)).replaceAll("\\", "/").replace(/\/$/, "") + +/** Internal component */ +export abstract class Internal { + /** Import meta */ + protected static readonly meta = import.meta + + /** Import meta */ + protected readonly meta + + /** Logger */ + protected readonly log + + /** Context */ + protected readonly context + + /** Identifier */ + readonly id + + /** Constructor */ + protected constructor(context: is.infer) { + const constructor = this.constructor as typeof Internal + const tags = {} as Record + this.meta = constructor.meta + this.id = this.meta.url.replace(toFileUrl(constructor.path).href, "").replace(/\/mod\.ts$/, "").replace(/^\//, "") + this.context = context ?? {} + if (Internal.tracker in this.context) { + tags[Internal.tracker] = this.context[Internal.tracker] + } + this.log = new Logger(this.meta, { level: this.context.logs, tags }) + } + + /** Component root path */ + protected static get path() { + return path + } + + /** Internal tracker symbol */ + protected static readonly tracker = Symbol.for("@@tracker") +} + +// Exports +export { is, toSchema } diff --git a/metrics/components/plugin.ts b/metrics/components/plugin.ts new file mode 100644 index 00000000000..10f04956b35 --- /dev/null +++ b/metrics/components/plugin.ts @@ -0,0 +1,189 @@ +// Imports +import { Component, is, state } from "@metrics/components/component.ts" +import { list, read } from "@utils/io.ts" +import { plugin as schema, plugin_nop as schema_nop } from "@metrics/config.ts" +import * as ejs from "y/ejs@3.1.9" +import { Requests } from "@metrics/components/requests.ts" +import { Formatter } from "@utils/format.ts" +import { basename } from "std/path/basename.ts" +import { Processor } from "@processor" +import { throws } from "@utils/errors.ts" + +/** Plugin */ +export abstract class Plugin extends Component { + /** Import meta */ + protected static readonly meta = import.meta + + /** Context */ + declare protected readonly context: is.infer + + /** Constructor */ + protected constructor(context: Plugin["context"]) { + super(context) + this.requests = new Requests(this.meta, this.context) + for (const log of [this, this.requests] as unknown as Array<{ log: Component["log"] }>) { + Object.assign(log, { log: this.log.with({ handle: this.context.handle, entity: this.context.entity }) }) + } + delete (this.context as { token?: string }).token + this.log.trace("instantiated") + } + + /** Requests */ + protected readonly requests + + /** REST api (Note: always use `this.rest()` to perform queries in order for queries to be properly traced and mocked) */ + protected get api() { + return this.requests.api + } + + /** Perform a REST query */ + protected rest(...args: Parameters) { + return this.requests.rest(...args) + } + + /** Perform a GraphQL query */ + protected graphql(...args: Parameters) { + return this.requests.graphql(...args) + } + + /** Perform an HTTP query */ + protected fetch(...args: Parameters) { + return this.requests.fetch(...args) + } + + /** Ratelimit */ + protected ratelimit() { + return this.requests.ratelimit() + } + + /** Render an EJS template */ + protected async render({ state }: { state: state }) { + const name = this.context.template + const path = new URL(`templates/${name}.ejs`, this.meta.url) + const template = await read(path) + const { data: args = {} } = await this.inputs.safeParseAsync(this.context.args) as { data?: Record } + this.log.debug(`rendering template: ${name}`) + return ejs.render(template, Object.assign(structuredClone(this.context), { args, result: state.result?.result ?? null, state, format: new Formatter(this.context) }), { + async: true, + _with: true, + context: null, + }) + } + + /** Is supported ? */ + protected supported() { + if (!this.supports.includes(this.context.entity)) { + throws(`Not supported for ${this.context.entity}`) + } + } + + /** Run component */ + protected async run(state: state) { + const { result: raw, error } = await super.run(state) + const result = { content: "", mime: "application/xml", base64: false, result: raw ?? error } + state = { result, ...state } + state.results.push(result) + + // Render content + if ((this.context.template) && (this.context.render)) { + result.content = await this.render({ state }) + } + + // Apply processors + for (const [i, processor] of Object.entries(this.context.processors)) { + this.log.debug(`running processor: ${processor.id}`) + const tracker = Component.tracker in this.context ? `${this.context[Component.tracker]}[${i}]` : processor.id + const processed = await Processor.run({ tracker, state, context: processor, plugin: this }) + if (processed.result) { + Object.assign(result.result, processed.result) + } + if (processed.error) { + state.errors.push({ severity: "error", source: tracker, message: `${processed.error}` }) + } + } + + return { result, error } + } + + /** List tests */ + tests() { + return super.tests(`${Plugin.path}/${this.id}/tests/list.yml`) + } + + /** List templates */ + async templates() { + return [...await list(`${Plugin.path}/${this.id}/templates/*.ejs`)].map((ejs) => basename(ejs).replace(/\.ejs$/, "")) + } + + /** List plugins */ + static async list() { + return [...await list(`${Plugin.path}/**/mod.ts`)].map((mod) => mod.replace(/\/mod\.ts$/, "")) + } + + /** Run component statically */ + static run({ tracker, state, context }: { tracker?: string; state: state; context: Record }) { + if (tracker) { + Object.defineProperties(context, { [Component.tracker]: { enumerable: false, value: tracker } }) + } + if (!context.id) { + return new Plugin.NOP(context).run(state) + } + return super.run({ state, context: context as typeof context & { id: string } }) + } + + /** Plugins root path */ + protected static get path() { + return `${super.path}/plugins` + } + + /** Metadata */ + get metadata() { + return super.metadata + } + + /** NOP plugin */ + static readonly NOP = class extends Plugin { + /** Import meta */ + protected static readonly meta = { ...import.meta, url: import.meta.url.replace(/\.ts$/, "@nop") } + + /** Name */ + readonly name = "🔳 NOP" + + /** Category */ + readonly category = "core" + + /** Description */ + readonly description = "No operation" + + /** Inputs */ + readonly inputs = is.object({}) + + /** Outputs */ + readonly outputs = is.object({}) + + /** Constructor */ + constructor(context = {} as Record, { meta = Plugin.NOP.meta } = {}) { + super(schema_nop.parse(context) as Plugin["context"]) + Object.assign(this, { meta, id: "@nop" }) + } + + /** Is supported ? */ + protected supported() {} + + /** Action */ + protected action() { + return Promise.resolve({}) + } + + /** Render an EJS template */ + render({ template, result, state }: { template: string; result: Record; state: state }) { + this.context.template = template + this.context.args = {} + return super.render({ state: { ...state, result: { result } as unknown as typeof state["result"] } }) + } + } +} + +// Exports +export { is } +export type { state } diff --git a/metrics/components/processor.ts b/metrics/components/processor.ts new file mode 100644 index 00000000000..0e96ff8434e --- /dev/null +++ b/metrics/components/processor.ts @@ -0,0 +1,99 @@ +// Imports +import { Component, is, state } from "@metrics/components/component.ts" +import { processor as schema } from "@metrics/config.ts" +import { list } from "@utils/io.ts" +import type { Plugin } from "@plugin" +import { Requests } from "@metrics/components/requests.ts" + +/** Processor */ +export abstract class Processor extends Component { + /** Import meta */ + protected static readonly meta = import.meta + + /** Context */ + declare protected readonly context: is.infer & { parent?: Record } + + /** Constructor */ + protected constructor(context: Processor["context"]) { + super(context) + if (this.context.parent) { + Object.assign(this, { log: this.log.with({ handle: this.context.parent.handle, entity: this.context.parent.entity }) }) + } + this.log.trace("instantiated") + } + + /** Inputs */ + readonly inputs = is.object({}) + + /** Outputs */ + readonly outputs = is.object({}) + + /** Is supported ? */ + protected supported() { + //TODO(@lowlighter): Implement + } + + /** Retrieve piped result */ + protected async piped(state: state) { + await Component.state.pick({ result: true }).required().parseAsync(state) + return state.result! + } + + /** Requests */ + protected readonly requests = null as unknown as Requests + + /** Does this processor needs to perform requests ? */ + protected requesting = false + + /** List tests */ + tests() { + return super.tests(`${Processor.path}/${this.id}/tests/list.yml`) + } + + /** List processors */ + static async list() { + return [...await list(`${Processor.path}/**/mod.ts`)].map((mod) => mod.replace(/\/mod\.ts$/, "")) + } + + /** Run component statically */ + static run({ tracker, state, context, plugin }: { tracker?: string; state: state; context: Record & { id: string }; plugin: Plugin }) { + if (tracker) { + Object.defineProperties(context, { [Component.tracker]: { enumerable: false, value: tracker } }) + } + if (plugin) { + Object.defineProperties(context, { + [Processor.plugin]: { enumerable: false, value: plugin }, + parent: { enumerable: false, value: (plugin as unknown as { context: Record }).context }, + }) + } + return super.run({ state, context: context as typeof context & { id: string } }) + } + + /** Load component statically */ + static async load(context: Record & { id: string }) { + const processor = await super.load(context) + if ((context[Processor.plugin]) && (processor.requesting)) { + const parent = context[Processor.plugin] as { requests: { octokit: unknown }; context: Requests["context"] } + const requests = Object.assign(new Requests(processor.meta, parent.context), { octokit: parent.requests.octokit }) + Object.assign(processor, { requests }) + } + return processor + } + + /** Plugin symbol */ + private static readonly plugin = Symbol.for("@@plugin") + + /** Processors root path */ + protected static get path() { + return `${super.path}/processors` + } + + /** Metadata */ + get metadata() { + return super.metadata + } +} + +// Exports +export { is } +export type { state } diff --git a/metrics/components/requests.ts b/metrics/components/requests.ts new file mode 100644 index 00000000000..0c1de9a549a --- /dev/null +++ b/metrics/components/requests.ts @@ -0,0 +1,122 @@ +// Imports +import { Octokit } from "y/@octokit/rest@20.0.1" +import { paginateGraphql } from "y/@octokit/plugin-paginate-graphql@4.0.0" +import { RequestInterface } from "y/@octokit/types@11.1.0" +import { Internal, is } from "@metrics/components/internal.ts" +import { read } from "@utils/io.ts" +import { requests as schema } from "@metrics/config.ts" +import { version } from "@metrics/version.ts" +import { throws } from "@utils/errors.ts" + +/** Plugin */ +export class Requests extends Internal { + /** Import meta */ + protected static readonly meta = import.meta + + /** Context */ + declare protected readonly context: is.infer + + /** Constructor */ + constructor(meta: typeof Requests["meta"], context: Requests["context"]) { + super(context) + Object.assign(this, { meta }) + this.octokit = new (Octokit.plugin(paginateGraphql))({ + userAgent: `metrics/${version}`, + auth: this.context.token, + timeZone: this.context.timezone, + baseUrl: this.context.api, + }) + delete (this.context as { token?: string }).token + } + + /** Octokit SDK */ + private readonly octokit + + /** REST api (Note: always use `this.rest()` to perform queries in order for queries to be properly traced and mocked) */ + get api() { + return this.octokit.rest + } + + /** Perform a REST query */ + async rest(endpoint: T, vars = {} as Parameters[0], { paginate = false } = {}) { + const { endpoint: { DEFAULTS: { method, url } } } = endpoint + this.log.io(`calling rest query: ${method} ${url}`) + if (this.context.mock) { + try { + const { default: mock } = await import(new URL("tests/rest.ts", this.meta.url).href) + if (url! in mock) { + this.log.debug(`mocking rest query: ${method} ${url}}`) + return mock[url!](vars) + } + } catch (error) { + console.log(error) + this.log.warn(`rest query ${method} ${url} could not be mocked: ${error}`) + } + } + if (paginate) { + return this.octokit.paginate(endpoint, vars) + } + console.log(await endpoint(vars)) + return endpoint(vars) + } + + /** Perform a GraphQL query */ + async graphql(name: string, vars = {} as Record, { paginate = false } = {}) { + const path = new URL(`queries/${name}.graphql`, this.meta.url) + const query = await read(path) + this.log.io(`calling graphql query: ${name}`) + if (this.context.mock) { + try { + const { default: mock } = await import(new URL(`tests/${name}.graphql.ts`, this.meta.url).href) + this.log.debug(`mocking graphql query: ${name}`) + return mock(vars) + } catch (error) { + this.log.warn(`graphql query ${name} could not be mocked: ${error}`) + } + } + if (paginate) { + if (!query.includes("pageInfo")) { + throws(`Query is missing "pageInfo { hasNextPage, endCursor }" but pagination is enabled`) + } + return this.octokit.graphql.paginate(query, vars) + } + return this.octokit.graphql(query, vars) + } + + /** Perform an HTTP query */ + async fetch(url: string | URL, { type = "text" as string, options = {} as Parameters[1] } = {}) { + this.log.io(`calling http query: ${url}`) + if ((this.context.mock) && (new URL(url).host.endsWith(".test"))) { + try { + const name = new URL(url).pathname.slice(1) + const { default: mock } = await import(new URL(`tests/${name}.http.ts`, this.meta.url).href) + this.log.debug(`mocking http query: ${name}`) + return mock(options) + } catch (error) { + this.log.warn(`http query ${url} could not be mocked: ${error}`) + } + } + const response = await fetch(url, options) + switch (type) { + case "json": + return response.json() + case "text": + return response.text() + default: + return response + } + } + + /** Ratelimit */ + async ratelimit() { + const { data: { resources: { core, search, graphql = { remaining: 0, limit: 0 }, ...others } } } = await this.octokit.rest.rateLimit.get() + const { code_search: code } = others as { code_search: { remaining: number; limit: number } } + this.log.io({ + core: `${core.remaining}/${core.limit}`, + graphql: `${graphql.remaining}/${graphql.limit}`, + search: `${search.remaining}/${search.limit}`, + code: `${code.remaining}/${code.limit}`, + }) + return { core: core.remaining, graphql: graphql.remaining, search: search.remaining, code: code.remaining } + } +} diff --git a/metrics/config.ts b/metrics/config.ts new file mode 100644 index 00000000000..19158bae543 --- /dev/null +++ b/metrics/config.ts @@ -0,0 +1,180 @@ +// Imports +import { is } from "@utils/validator.ts" +import { deepMerge } from "std/collections/deep_merge.ts" + +//TODO(@lowlighter): some cleanup needed here and description to complete + +/** Entities */ +const entities = ["user", "organization", "repository"] as const + +/** Default log level */ +const loglevel = { + presets: "warn", + action: "warn", + server: "trace", +} as const + +/** Internal component config */ +export const internal = is.object({ + logs: is.enum(["none", "error", "warn", "info", "message", "debug", "trace"]), +}) + +/** General component config */ +export const component = internal.extend({ + id: is.string(), + retries: is.object({ + attempts: is.coerce.number().min(1).max(100), + delay: is.coerce.number().min(0).max(3600), + }), + fatal: is.coerce.boolean(), +}) + +/** Requests component config */ +export const requests = internal.extend({ + mock: is.coerce.boolean(), + api: is.coerce.string(), + token: is.coerce.string(), + timezone: is.coerce.string(), +}) + +/** Plugin component internal config (without processors, for recursive typing) */ +const __plugin = component.merge(requests).extend({ + handle: is.coerce.string(), + entity: is.enum(entities), + template: is.coerce.string(), + render: is.coerce.boolean(), + args: is.record(is.coerce.string(), is.unknown()), +}) + +/** Processor component internal config */ +const _processor = component.extend({ + args: is.record(is.coerce.string(), is.unknown()), + parent: __plugin, +}) + +/** Processor component preset config */ +const _preset_processor = is.object({ + logs: _processor.shape.logs.default(loglevel.presets), + fatal: _processor.shape.fatal.default(false), + retries: is.object({ + attempts: _processor.shape.retries.shape.attempts.default(1), + delay: _processor.shape.retries.shape.delay.default(120), + }).default(() => ({})), + args: is.record(is.coerce.string(), is.unknown()).default(() => ({})), +}) + +/** Processor component config */ +export const processor = is.preprocess((value) => _preset_processor.passthrough().parse(value), _processor.omit({ parent: true })) + +/** Plugin component internal config */ +const _plugin = __plugin.extend({ + processors: is.array(processor), +}) + +/** Plugin NOP internal config */ +const _plugin_nop = _plugin.omit({ id: true, retries: true, template: true, render: true, args: true }) + +/** Plugin component preset config */ +const _preset_plugin = is.object({ + logs: _plugin.shape.logs.default(loglevel.presets), + api: _plugin.shape.api.default("https://api.github.com"), + token: _plugin.shape.token.default(""), + handle: _plugin.shape.handle.default(""), + entity: _plugin.shape.entity.default("user"), + template: _plugin.shape.template.default("classic"), + timezone: _plugin.shape.timezone.default(() => Intl.DateTimeFormat().resolvedOptions().timeZone), + mock: _plugin.shape.mock.default(false), + processors: _plugin.shape.processors.default(() => []), + fatal: _plugin.shape.fatal.default(false), + render: _plugin.shape.render.default(true), + retries: is.object({ + attempts: _plugin.shape.retries.shape.attempts.default(3), + delay: _plugin.shape.retries.shape.delay.default(120), + }).default(() => ({})), + args: is.record(is.coerce.string(), is.unknown()).default(() => ({})), +}) + +/** Plugin component config */ +export const plugin = is.preprocess((value) => _preset_plugin.passthrough().parse(value), _plugin) + +/** Plugin NOP config */ +export const plugin_nop = is.preprocess((value) => _preset_plugin.passthrough().parse(value), _plugin_nop) + +/** Preset component config */ +const preset = is.object({ + plugins: _preset_plugin.default(() => _preset_plugin.parse({})), + processors: _preset_processor.default(() => _preset_processor.parse({})), +}) + +/** Internal config */ +const _config = is.object({ + plugins: is.array(is.union([plugin, plugin_nop])), + presets: is.record(is.coerce.string(), preset), +}) + +/** Config */ +export const config = is.preprocess((_value) => { + const value = is.object({ + plugins: is.array( + is.object({ + preset: is.string().optional(), + processors: is.array( + is.object({ + preset: is.string().optional(), + }).passthrough(), + ).default(() => []), + }).passthrough(), + ).default(() => []), + presets: _config.shape.presets.default(() => ({ default: preset.parse({}) })), + }).passthrough().parse(_value) + for (const plugin of value.plugins) { + Object.assign(plugin, deepMerge(value.presets[plugin.preset ?? "default"]?.plugins ?? {}, plugin, { arrays: "replace" })) + for (const processor of plugin.processors) { + Object.assign(processor, deepMerge(value.presets[processor.preset ?? plugin.preset ?? "default"]?.processors ?? {}, processor, { arrays: "replace" })) + } + } + return value +}, _config) + +/** Action config */ +export const action = internal.merge(requests).extend({ + logs: internal.shape.logs.default(loglevel.action), + check_updates: is.boolean().default(false), + config: config.default(() => ({})), +}) + +/** Server config */ +export const server = internal.extend({ + logs: internal.shape.logs.default(loglevel.server), + hostname: is.coerce.string().default("localhost"), + port: is.coerce.number().min(1).max(65535).default(8080), + config: config.default(() => ({})), + users: is.object({ + allowed: is.union([is.literal("all"), is.array(is.coerce.string())]).default("all"), + }).default(() => ({})), + github_app: is.object({ + id: is.coerce.number(), + private_key_path: is.coerce.string(), + client_id: is.coerce.string(), + client_secret: is.coerce.string(), + }).nullable().optional(), +}) + +/** Web request config */ +export const webrequest = is.object({ + plugins: is.array( + _plugin.pick({ + id: true, + timezone: true, + handle: true, + fatal: true, + entity: true, + template: true, + args: true, + preset: true, + }) + .extend({ + processors: is.array(_processor.pick({ id: true, fatal: true, args: true }).partial().extend({ id: _plugin.shape.id })), + }).partial(), + ).default(() => []), +}) diff --git a/metrics/metadata.ts b/metrics/metadata.ts new file mode 100644 index 00000000000..d68d1dee3c2 --- /dev/null +++ b/metrics/metadata.ts @@ -0,0 +1,37 @@ +//Imports +import { is, Plugin } from "@plugin" +import { Processor } from "@processor" +import { action, server, webrequest } from "@metrics/config.ts" +import { version } from "@metrics/version.ts" + +/** Metadata */ +export async function metadata() { + const metadata = { + version, + plugins: [] as Record[], + processors: [] as Record[], + action: action.omit({ config: true }), + server: server.omit({ config: true }), + webrequest: webrequest.extend({ + plugins: is.array( + webrequest.shape.plugins._def.innerType._def.type.omit({ id: true, args: true }).extend({ + processors: is.array(webrequest.shape.plugins._def.innerType._def.type.shape.processors._def.innerType._def.type.omit({ id: true, args: true })), + }), + ), + }), + } + + // Populate plugins + for (const id of await Plugin.list()) { + const plugin = await Plugin.load({ id }) + metadata.plugins.push(plugin.metadata) + } + + // Populate processors + for (const id of await Processor.list()) { + const processor = await Processor.load({ id }) + metadata.processors.push(processor.metadata) + } + + return metadata +} diff --git a/metrics/process.ts b/metrics/process.ts new file mode 100644 index 00000000000..2086985511b --- /dev/null +++ b/metrics/process.ts @@ -0,0 +1,29 @@ +// Imports +import { Plugin } from "@plugin" +import { config as schema } from "@metrics/config.ts" + +/** Process metrics */ +export async function process(_config: Record) { + const config = await schema.parseAsync(_config) + const pending = new Set>() + const state = await Plugin.state.parseAsync({ results: [], errors: [] }) + let result = undefined as typeof state.result + + // Process config + for (const [tracker, plugin] of Object.entries(config.plugins)) { + if ((plugin as { id?: string }).id) { + pending.add(Plugin.run({ tracker, context: plugin, state })) + continue + } + await Promise.all([...pending]) + const { result: _result } = await Plugin.run({ tracker, context: plugin, state }) + result = _result + pending.clear() + } + const results = await Promise.all([...pending]) as Array<{ result: typeof state.result }> + if (!result) { + result = results.at(-1)?.result + } + + return result ?? null +} diff --git a/metrics/utils/browser.ts b/metrics/utils/browser.ts new file mode 100644 index 00000000000..8ab4fb68308 --- /dev/null +++ b/metrics/utils/browser.ts @@ -0,0 +1,66 @@ +//Imports +import { join } from "std/path/join.ts" +import { Logger } from "@utils/log.ts" +import { cwd, env, os } from "@utils/io.ts" +import type puppeteer from "npm:puppeteer@21.2.1" + +//TODO(@lowlighter): connect to external web browser instead, only use puppeteer core + +/** Browser */ +export class Browser { + /** Logger */ + private static readonly log = new Logger(import.meta) + + /** Shared browser mode */ + static shared = true + + /** Browser instance */ + private static instance = null as null | Awaited> + + /** Puppeteer library */ + private static puppeteer: typeof puppeteer + + /** Get browser */ + private static async get({ log = this.log } = {}) { + if ((this.shared) && (this.instance)) { + return this.instance + } + if (!this.puppeteer) { + env.set("PUPPETEER_CACHE_DIR", join(cwd(), "node_modules/.cache")) + await import("x/puppeteer_plus@0.18.0/src/patch.ts") + await import("x/puppeteer_plus@0.18.0/src/install.ts") + const { default: imported } = await import("npm:puppeteer@21.2.1") + this.puppeteer = imported + } + const args = { + headless: "new" as unknown as boolean, + args: ["--no-sandbox", "--disable-extensions", "--disable-setuid-sandbox", "--disable-dev-shm-usage"], + handleSIGHUP: os !== "windows", + } + const browser = await this.puppeteer.launch(args) + log.io("browser started") + if (this.shared) { + this.instance = browser + Object.assign(this, { log: log.with({ browser: await this.instance!.version() }) }) + } + return browser + } + + /** Spawn a new page */ + static async newPage({ width = 1000, height = 1000 } = {}) { + const log = this.log.with({ uuid: crypto.randomUUID().slice(-12) }) + const browser = await this.get({ log }) + const page = await browser.newPage() + page.setViewport({ width, height }) + page + .on("console", (message: { text: () => string }) => log.debug(`puppeteer: ${message.text()}`)) + .on("pageerror", (error: { message: string }) => log.warn(`puppeteer: ${error.message}`)) + if (!this.shared) { + page.close = async () => { + await browser.close() + log.io("browser closed") + } + } + return page + } +} diff --git a/metrics/utils/errors.ts b/metrics/utils/errors.ts new file mode 100644 index 00000000000..d90656aafa8 --- /dev/null +++ b/metrics/utils/errors.ts @@ -0,0 +1,19 @@ +//Imports +import { is } from "@utils/validator.ts" + +/** Throws an error */ +export function throws(message?: string): never { + throw Object.assign(new Error(message), { stack: "" }) +} + +/** Format Validation error */ +export function formatValidationError(error: is.ZodError) { + if (!(error instanceof is.ZodError)) { + return error + } + const messages = [] + for (const { message, path } of error.errors) { + messages.push(`${path.join(".")}: ${message}`) + } + return Object.assign(new Error(messages.join("\n")), { stack: "" }) +} diff --git a/metrics/utils/format.ts b/metrics/utils/format.ts new file mode 100644 index 00000000000..0fba94086e9 --- /dev/null +++ b/metrics/utils/format.ts @@ -0,0 +1,69 @@ +// Imports +import humanformat from "y/human-format@1.2.0" +import pluralize from "y/pluralize@8.0.0" + +/** Formatter */ +export class Formatter { + /** Constructor */ + constructor({ timezone = Intl.DateTimeFormat().resolvedOptions().timeZone } = {}) { + this.timezone = timezone + } + + /** Timezone */ + readonly timezone + + /** Format date */ + date(date: string) { + const intl = new Intl.DateTimeFormat("en-GB", { timeZone: this.timezone, day: "numeric", month: "short", year: "numeric" }) + return intl.format(new Date(date)) + } + + /** Format time */ + time(time: string) { + const intl = new Intl.DateTimeFormat("en-GB", { timeZone: this.timezone, hour: "2-digit", minute: "2-digit", second: "2-digit" }) + return intl.format(new Date(time)) + } + + /** Format number */ + number(text: string, number: number, options?: Record): string + number(number: number, options?: Record): string + number() { + let [text, number, options] = arguments + if (typeof text === "number") { + options = number + number = text + text = "" + } + options ??= {} + if (options.format === "bytes") { + options = { scale: "binary", unit: "B", ...options } + } + return `${humanformat(number, options)} ${pluralize(text, number)}`.trim() + } + + /** Format content in HTML */ + html(content: string) { + return ` + + + + + + +
+ ${content} +
+ + + + `.trim() + } +} + +/** Default formatter */ +export const Format = new Formatter() diff --git a/metrics/utils/graph.ts b/metrics/utils/graph.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/metrics/utils/io.ts b/metrics/utils/io.ts new file mode 100644 index 00000000000..89561d79b66 --- /dev/null +++ b/metrics/utils/io.ts @@ -0,0 +1,59 @@ +//Imports +import { ensureDir, expandGlob } from "std/fs/mod.ts" +import { throws } from "@utils/errors.ts" +import { dirname } from "std/path/dirname.ts" + +/** Read file */ +export function read(path: string | URL) { + return globalThis.Deno?.readTextFile(path) +} + +/** Write file */ +export async function write(path: string, data: string | Uint8Array | ReadableStream) { + await ensureDir(dirname(path)) + if (typeof data === "string") { + return globalThis.Deno?.writeTextFile(path, data) + } + return globalThis.Deno?.writeFile(path, data) +} + +/** List files in globpath */ +export async function list(glob: string) { + const files = [] + const base = glob.match(/(?.*\/)\*/)?.groups?.base + const prefix = base ? new RegExp(`.*?${base}`) : null + for await (const { path } of expandGlob(glob, { extended: true, globstar: true })) { + let file = path.replaceAll("\\", "/") + if (prefix) { + file = file.replace(prefix, "") + } + files.push(file) + } + return files +} + +/** Environment */ +export const env = globalThis.Deno?.env ?? { set(_k: string, _v: string) {}, get(_: string) {} } + +/** Port listener */ +export const listen = globalThis.Deno?.listen ?? (() => throws("Deno.listen is not available in this environment")) + +/** Inspect */ +export function inspect(message: unknown) { + if (globalThis.Deno?.inspect) { + return globalThis.Deno.inspect(message, { colors: true, depth: Infinity, iterableLimit: 16, strAbbreviateSize: 120 }) + } + try { + return JSON.stringify(message, null, 2) + } catch { + return message + } +} + +/** Current working directory */ +export function cwd() { + return globalThis.Deno?.cwd() ?? "" +} + +/** Operating system */ +export const os = globalThis.Deno?.build.os ?? "unknown" diff --git a/metrics/utils/log.ts b/metrics/utils/log.ts new file mode 100644 index 00000000000..dfc8e7ae5c6 --- /dev/null +++ b/metrics/utils/log.ts @@ -0,0 +1,180 @@ +//Imports +import { inspect } from "@utils/io.ts" + +/** Logger */ +export class Logger { + /** Identifier */ + readonly id: string + + /** Level */ + level + + /** Constructor */ + constructor(meta: { url: string }, { level = "message" as channel | "none", tags = {} as Record } = {}) { + this.id = meta.url.replace(Logger.root, "").replace(".ts", "").replace("/mod", "") + this.level = level === "none" ? -Infinity : Logger.channels[level] + this.tags = tags + } + + /** Tags */ + readonly tags + + /** Error */ + error(message: unknown) { + if (this.level >= Logger.channels.error) { + this.print("error", message) + } + } + + /** Warn */ + warn(message: unknown) { + if (this.level >= Logger.channels.warn) { + this.print("warn", message) + } + } + + /** Success */ + success(message: unknown) { + if (this.level >= Logger.channels.success) { + this.print("success", message) + } + } + + /** Info */ + info(message: unknown) { + if (this.level >= Logger.channels.info) { + this.print("info", message) + } + } + + /** Message */ + message(message: unknown) { + if (this.level >= Logger.channels.message) { + this.print("message", message) + } + } + + /** IO operations */ + io(message: unknown) { + if (this.level >= Logger.channels.io) { + this.print("io", message) + } + } + + /** Debug */ + debug(message: unknown) { + if (this.level >= Logger.channels.debug) { + this.print("debug", message) + } + } + + /** Trace */ + trace(message: unknown) { + if (this.level >= Logger.channels.trace) { + this.print("trace", message) + } + } + + /** Development message (bypass log level) */ + probe(message: unknown) { + this.print("probe", message) + } + + /** Create a new logger with tags */ + with(tags: Record) { + const logger = new Logger({ url: "" }) + Object.assign(logger, { id: this.id, level: this.level, tags: { ...this.tags, ...tags } }) + return logger + } + + /** Print message */ + private print(channel: channel, content: unknown) { + switch (channel) { + case "error": + return console.error(...this.format(channel, content)) + case "warn": + return console.warn(...this.format(channel, content)) + case "success": + case "info": + return console.info(...this.format(channel, content)) + case "message": + return console.log(...this.format(channel, content)) + case "io": + case "debug": + case "trace": + case "probe": + return console.debug(...this.format(channel, content)) + } + } + + /** Format */ + private format(channel: channel, message: unknown) { + const color = Logger.colors[channel] + const styles = [ + `%c${Logger.blocks[channel]}%c ${this.id.padEnd(28)}%c`, + `color: ${{ black: "gray" }[color] ?? color}`, + `background-color: ${{ inherit: "white" }[color] ?? color}; color: ${{ gray: "black", black: "gray", inherit: "black" }[color] ?? "white"}`, + "", + ] + if (Object.keys(this.tags).length) { + styles[0] += " " + } + for (const [key, value] of Object.entries(this.tags)) { + styles[0] += `%c ${key} %c ${value} %c` + styles.push("background-color: gray; font-style: italic", "background-color: white; color: gray; font-style: italic", "") + } + if (typeof message === "object") { + styles[0] += `%c ${inspect(message)}` + styles.push("") + } else { + styles[0] += `%c ${message}%c` + styles.push(`color: ${{ black: "white" }[color] ?? color}`, "") + } + return styles + } + + /** Channels */ + static readonly channels = { + error: 0, + warn: 1, + success: 2, + io: 3, + info: 2, + message: 3, + debug: 4, + trace: 5, + probe: -1, + } + + /** Project root path */ + private static readonly root = new URL("../..", import.meta.url).href + + /** Color schemes */ + private static readonly colors = { + error: "red", + warn: "yellow", + success: "green", + io: "blue", + info: "cyan", + message: "inherit", + debug: "gray", + trace: "black", + probe: "magenta", + } + + /** Blocks */ + private static readonly blocks = { + error: "█", + warn: "▓", + success: "▒", + io: "▒", + info: "▒", + message: "░", + debug: "░", + trace: "░", + probe: "█", + } +} + +/** Channel */ +type channel = keyof typeof Logger.channels diff --git a/metrics/utils/parse.ts b/metrics/utils/parse.ts new file mode 100644 index 00000000000..336da2b72d2 --- /dev/null +++ b/metrics/utils/parse.ts @@ -0,0 +1,24 @@ +//Imports +import { throws } from "@utils/errors.ts" + +/** Parse handle */ +export function parseHandle(_handle: string, { entity = "unknown" as "user" | "organization" | "repository" | "unknown" } = {}) { + const handle = _handle.replace(/[\n\r]/g, "") + switch (entity) { + case "repository": { + const [owner, name] = handle.split("/") as [string, string] + if ((!owner) || (!name)) { + throws(`Invalid repo handle: ${handle}`) + } + return { owner, name } + } + case "user": + case "organization": { + return { login: handle } + } + default: { + const [login] = handle.split("/") as [string] + return { handle, login } + } + } +} diff --git a/metrics/utils/testing.ts b/metrics/utils/testing.ts new file mode 100644 index 00000000000..6a05997b652 --- /dev/null +++ b/metrics/utils/testing.ts @@ -0,0 +1,15 @@ +// Imports +export { faker } from "y/@faker-js/faker@8.0.2" +import { is } from "@utils/validator.ts" + +/** Mock utility (first argument is the expected input, and second a mock function called with parsed input that return mocked output) */ +export function mock(input: T, data: (vars: is.infer>) => unknown) { + return function (vars: Record) { + return data(is.object(input).parse(vars)) + } +} + +// Exports +export { is } +export * from "std/assert/mod.ts" +export * from "std/testing/bdd.ts" diff --git a/metrics/utils/validator.ts b/metrics/utils/validator.ts new file mode 100644 index 00000000000..ed30861cd66 --- /dev/null +++ b/metrics/utils/validator.ts @@ -0,0 +1,14 @@ +//Imports +import { z as is } from "x/zod@v3.21.4/mod.ts" +import { zodToJsonSchema } from "y/zod-to-json-schema@3.21.4" + +/** Validator */ +export type Validator = is.ZodObject + +/** Schema */ +export function toSchema(validator: Validator) { + return zodToJsonSchema(validator as unknown as Parameters[0]) +} + +// Exports +export { is } diff --git a/metrics/version.ts b/metrics/version.ts new file mode 100644 index 00000000000..ffa079e6d46 --- /dev/null +++ b/metrics/version.ts @@ -0,0 +1,6 @@ +// Imports +import { read } from "@utils/io.ts" +import * as JSONC from "std/jsonc/mod.ts" + +/** Version */ +export const { version } = JSONC.parse(await read("deno.jsonc")) as { version: string } From 3f990d4741c819b66b5803e3db737b9945bc02da Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:46:48 +0200 Subject: [PATCH 002/103] feat(plugins/calendar): v4 --- plugins/calendar/mod.ts | 249 +++++++++++++++++++++ plugins/calendar/queries/calendar.graphql | 15 ++ plugins/calendar/queries/colors.graphql | 9 + plugins/calendar/queries/user.graphql | 5 + plugins/calendar/templates/classic.ejs | 109 +++++++++ plugins/calendar/tests/calendar.graphql.ts | 32 +++ plugins/calendar/tests/colors.graphql.ts | 16 ++ plugins/calendar/tests/list.yml | 179 +++++++++++++++ plugins/calendar/tests/user.graphql.ts | 7 + 9 files changed, 621 insertions(+) create mode 100644 plugins/calendar/mod.ts create mode 100644 plugins/calendar/queries/calendar.graphql create mode 100644 plugins/calendar/queries/colors.graphql create mode 100644 plugins/calendar/queries/user.graphql create mode 100644 plugins/calendar/templates/classic.ejs create mode 100644 plugins/calendar/tests/calendar.graphql.ts create mode 100644 plugins/calendar/tests/colors.graphql.ts create mode 100644 plugins/calendar/tests/list.yml create mode 100644 plugins/calendar/tests/user.graphql.ts diff --git a/plugins/calendar/mod.ts b/plugins/calendar/mod.ts new file mode 100644 index 00000000000..16d3eeca273 --- /dev/null +++ b/plugins/calendar/mod.ts @@ -0,0 +1,249 @@ +// Imports +import { is, Plugin } from "@plugin" + +/** Plugin */ +export default class extends Plugin { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "📆 Commit calendar" + + /** Category */ + readonly category = "github" + + /** Supports */ + readonly supports = ["user"] + + /** Description */ + readonly description = "Displays a commit calendar along with a few additional statistics" + + /** Inputs */ + readonly inputs = is.object({ + view: is.enum(["isometric", "top-down"]).default("isometric").describe("Calendar view"), + range: is.union([ + is.object({ + from: is.union([is.literal("registration"), is.coerce.number().min(1970), is.coerce.number().negative()]).default("registration").describe( + "Start date (use `registration` to set it to user registration year, and a negative value to set it to `range.to` minus specified value)", + ), + to: is.union([is.literal("current-year"), is.coerce.number().min(1970)]).default("current-year").describe("End date (use `current-year` to set it to current year)"), + }), + is.literal("last-180-days"), + is.literal("last-365-days"), + is.literal("current-year"), + is.coerce.number().min(1970), + ]).default("last-365-days").describe("Date range"), + colors: is.enum(["auto", "halloween", "winter"]).default("auto").describe("Color scheme"), + }) + + /** Outputs */ + readonly outputs = is.object({ + range: is.object({ + start: is.coerce.date().describe("Start date"), + end: is.coerce.date().describe("End date"), + average: is.number().min(0).describe("Average number of commits per day"), + max: is.number().int().min(0).describe("Highest number of commits in a single day"), + streak: is.object({ + max: is.number().int().min(0).describe("Highest number of consecutive days with commits"), + current: is.number().int().min(0).describe("Current number of consecutive days with commits"), + }).describe("Streak statistics"), + }).describe("Date range"), + calendar: is.object({ + colors: is.enum(["default", "halloween", "winter"]).describe("Color scheme"), + years: is.array(is.object({ + year: is.union([is.string(), is.coerce.number().int().positive()]).describe("Year"), + weeks: is.array(is.object({ + days: is.array( + is.object({ + date: is.coerce.date().describe("Date"), + count: is.number().int().min(0).describe("Number of commits"), + level: is.number().min(0).max(4).describe("Commit quartile level"), + }).nullable(), + ).describe("Days statistics (`null` if fetched day is outside current year)"), + })).describe("Weeks statistics"), + average: is.number().min(0).describe("Average number of commits per day for the year "), + max: is.number().int().min(0).describe("Highest number of commits in a single day for the year"), + streak: is.object({ + max: is.number().int().min(0).describe("Highest number of consecutive days with commits for the year"), + }).describe("Streak statistics"), + })), + }).describe("Calendar statistics"), + }) + + /** Action */ + protected async action() { + const { handle } = this.context + const { range, ...inputs } = await this.inputs.parseAsync(this.context.args) + + //Color scheme + const { entity: { contributions: { calendar: { colors: [color] } } } } = await this.graphql("colors", { login: handle }) + const colors = inputs.colors !== "auto" ? inputs.colors : { "#ffee4a": "halloween", "#0a3069": "winter" }[color as string] ?? "default" + + //Compute date range + const lastXdays = /^last-(?\d+)-days$/ + const today = new Date() + let end = this.date(today, { time: "23:59" }) + let start = this.date(today, { time: "00:00" }) + if (typeof range === "object") { + // End date + switch (true) { + case range.to === "current-year": + end = this.date(today.getFullYear(), { day: "31st dec", time: "23:59" }) + break + case typeof range.to === "number": + end = this.date(range.to as number, { day: "31st dec", time: "23:59" }) + break + } + // Start date + switch (true) { + case range.from === "registration": { + start = this.date(new Date((await this.graphql("user", { login: handle })).entity.registration), { time: "00:00" }) + break + } + case typeof range.from === "number": + if (range.from as number < 0) { + start = this.date(end.getFullYear() + (range.from as number), { day: "1st jan", time: "00:00" }) + } else { + start = this.date(range.from as number, { day: "1st jan", time: "00:00" }) + } + break + } + } // Specific year + else if (typeof range === "number") { + start = this.date(range, { day: "1st jan", time: "00:00" }) + end = (range === today.getFullYear()) ? this.date(today, { time: "keep" }) : this.date(range, { day: "31st dec", time: "23:59" }) + } // Current year + else if (range === "current-year") { + start = this.date(today.getFullYear(), { day: "1st jan", time: "00:00" }) + end = this.date(today, { time: "keep" }) + } // Last X days + else if (lastXdays.test(`${range}`)) { + const n = Number((range as string).match(lastXdays)!.groups!.n) + end = this.date(today, { time: "keep" }) + start = this.date(end, { time: "keep" }) + start.setHours((-n + 1) * 24 + start.getTimezoneOffset() / 60) + } + this.log.trace(`start date set from year "${typeof range === "object" ? range.from : range}" → ${start.toISOString()}`) + this.log.trace(`end date set from "${typeof range === "object" ? range.to : range}" → ${end.toISOString()}`) + + //Fetch data + const calendar = { colors, years: [] } as is.infer + const result = { range: { start, end, average: 0, max: 0, streak: { max: 0, current: 0 } }, calendar } + this.log.debug(`fetching data from ${start.toISOString()} to ${end.toISOString()}`) + for (let year = start.getFullYear(); year <= end.getFullYear(); year++) { + this.log.trace(`processing ${lastXdays.test(`${range}`) ? `"${range}"` : `year ${year}`}`) + calendar.years.push({ year, weeks: [], average: 0, max: 0, streak: { max: 0 } }) + + //Ensure starting date is on a sunday (to avoid incomplete week arrays that would offset results later on) + const A = lastXdays.test(`${range}`) ? this.date(start, { time: "keep" }) : this.date(year, { day: "1st jan", time: "00:00" }) + const O = this.date(A, { time: "keep" }) + A.setHours(-A.getDay() * 24) + + //Ensure ending date is either on today or a 31st of december + const B = lastXdays.test(`${range}`) ? this.date(end, { time: "keep" }) : (year >= today.getFullYear()) ? this.date(today, { time: "keep" }) : this.date(year, { day: "31st dec", time: "23:59" }) + + //Iterate over year + for (let a = this.date(A, { time: "keep" }), first = true; a < B; first = false) { + //Compute next date range + let b = this.date(a, { time: "23:59" }) + b.setHours(27 * 24) + if (b > B) { + b = this.date(B, { time: "keep" }) + } + + //Fetch data from api and clean padded days on first iteration + this.log.trace(`querying data from ${a.toISOString()} to ${b.toISOString()}`) + const { entity: { contributions: { calendar: { weeks } } } } = await this.graphql("calendar", { login: handle, from: a.toISOString(), to: b.toISOString() }) + if (first) { + for (let i = 0; i < weeks[0].days.length; i++) { + const { date } = weeks[0].days[i] + if (this.date(date, { time: "00:00" }) < O) { + weeks[0].days[i] = null + } + } + } + calendar.years.at(-1)!.weeks.push(...weeks) + this.log.trace(`fetched ${(weeks as Array<{ days: unknown[] }>).flatMap(({ days }) => days).filter((day) => day).length} days`) + + //Set next date range + a = this.date(b, { time: "00:00" }) + a.setDate(a.getDate() + 1) + } + + //Set custom title for special ranges + if (lastXdays.test(`${range}`)) { + calendar.years.at(-1)!.year = { "last-180-days": "Last 180 days", "last-365-days": "Last 365 days" }[range as string] ?? "" + break + } + } + this.log.debug(`fetched ${calendar.years.flatMap(({ weeks }) => weeks.flatMap(({ days }) => days)).filter((day) => day).length} days in total`) + + //Compute streaks and average + const global = [] as number[] + for (const year of calendar.years) { + this.log.trace(`computing additional data for ${lastXdays.test(`${range}`) ? `"${range}"` : `year ${year}`}`) + const local = [] as number[] + let streak = 0 + for (const { days } of year.weeks) { + for (const day of days) { + if (!day) { + continue + } + local.push(day.count) + streak = day.count ? streak + 1 : 0 + result.range.streak.current = day.count ? result.range.streak.current + 1 : 0 + year.max = Math.max(year.max, day.count) + year.streak.max = Math.max(year.streak.max, streak) + day.level = { NONE: 0, FIRST_QUARTILE: 1, SECOND_QUARTILE: 2, THIRD_QUARTILE: 3, FOURTH_QUARTILE: 4 }[day.level as unknown as string] ?? 0 + } + } + year.average = local.reduce((a, b) => a + b, 0) / (local.length || 1) + global.push(...local) + } + result.range.streak.max = Math.max(...calendar.years.map((year) => year.streak.max)) + result.range.max = Math.max(0, ...global) + result.range.average = global.reduce((a, b) => a + b, 0) / (global.length || 1) + + return result + } + + /** Create a date from a reference, and optionally clean time */ + private date(date: Date, options: { time: "00:00" | "23:59" | "keep" }): Date + private date(year: number, options: { day: "1st jan" | "31st dec"; time: "00:00" | "23:59" }): Date + private date(ref: number | Date, { day, time }: { day?: "1st jan" | "31st dec"; time: "00:00" | "23:59" | "keep" }) { + const date = new Date(new Date().toLocaleString("en", { timeZone: this.context.timezone })) + switch (typeof ref) { + case "number": + date.setFullYear(ref) + if (day) { + date.setMonth({ "1st jan": 0, "31st dec": 11 }[day]) + date.setDate({ "1st jan": 1, "31st dec": 31 }[day]) + } + break + case "object": + date.setFullYear(ref.getFullYear()) + date.setMonth(ref.getMonth()) + date.setDate(ref.getDate()) + date.setHours(ref.getHours()) + date.setMinutes(ref.getMinutes()) + date.setSeconds(ref.getSeconds()) + date.setMilliseconds(ref.getMilliseconds()) + break + } + switch (time) { + case "00:00": + date.setHours(0) + date.setMinutes(0) + date.setSeconds(0) + date.setMilliseconds(0) + break + case "23:59": + date.setHours(23) + date.setMinutes(59) + date.setSeconds(59) + date.setMilliseconds(999) + break + } + return date + } +} diff --git a/plugins/calendar/queries/calendar.graphql b/plugins/calendar/queries/calendar.graphql new file mode 100644 index 00000000000..26fcba9f040 --- /dev/null +++ b/plugins/calendar/queries/calendar.graphql @@ -0,0 +1,15 @@ +query Calendar($login: String!, $from: DateTime!, $to: DateTime!) { + entity: user(login: $login) { + contributions: contributionsCollection(from: $from, to: $to) { + calendar: contributionCalendar { + weeks { + days: contributionDays { + count: contributionCount + level: contributionLevel + date + } + } + } + } + } +} \ No newline at end of file diff --git a/plugins/calendar/queries/colors.graphql b/plugins/calendar/queries/colors.graphql new file mode 100644 index 00000000000..b62ef2f4640 --- /dev/null +++ b/plugins/calendar/queries/colors.graphql @@ -0,0 +1,9 @@ +query CalendarColors($login: String!) { + entity: user(login: $login) { + contributions: contributionsCollection { + calendar: contributionCalendar { + colors + } + } + } +} \ No newline at end of file diff --git a/plugins/calendar/queries/user.graphql b/plugins/calendar/queries/user.graphql new file mode 100644 index 00000000000..47360d645a1 --- /dev/null +++ b/plugins/calendar/queries/user.graphql @@ -0,0 +1,5 @@ +query CalendarUser($login: String!) { + entity: user(login: $login) { + registration: createdAt + } +} \ No newline at end of file diff --git a/plugins/calendar/templates/classic.ejs b/plugins/calendar/templates/classic.ejs new file mode 100644 index 00000000000..d0dd1a5628e --- /dev/null +++ b/plugins/calendar/templates/classic.ejs @@ -0,0 +1,109 @@ +
+
+ + Contributions calendar + <% if (!(result instanceof Error)) { %> + (<%= format.date(result.range.start) %> to <%= format.date(result.range.end) %>) + <% } %> +
+
+ <% if (result instanceof Error) { %> +
+ + <%= result.message %> +
+ <% } else { %> +
+ <% for (const {year, weeks, average, max, streak} of result.calendar.years.reverse()) { %> +
year year-<%= year %>"> + + +
+ <% } %> +
+ <% } %> +
+ <% if (args.view === "isometric") { %> + + <% } %> +
+ + + diff --git a/plugins/calendar/tests/calendar.graphql.ts b/plugins/calendar/tests/calendar.graphql.ts new file mode 100644 index 00000000000..ea2d4df0a78 --- /dev/null +++ b/plugins/calendar/tests/calendar.graphql.ts @@ -0,0 +1,32 @@ +import { faker, is, mock } from "@testing" + +export default mock({ login: is.string(), from: is.coerce.date(), to: is.coerce.date() }, ({ from, to }) => { + let days = [] + const weeks = [] + const distribution = [[0, 50], [1, 15], [2, 15], [3, 5], [4, 5], [5, 3], [6, 1], [7, 1], [8, 1], [9, 1], [10, 1], [11, 1], [12, 1]].flatMap(([n, r]) => new Array(r).fill(n)) + const max = Math.max(...distribution) + if (from.getFullYear() > 1970) { + for (const date = new Date(from); date <= to; date.setDate(date.getDate() + 1)) { + if ((!date.getDay()) && (date.getTime() !== from.getTime())) { + weeks.push({ days }) + days = [] + } + const count = faker.helpers.arrayElement(distribution) + days.push({ + count, + level: count ? ["FIRST_QUARTILE", "SECOND_QUARTILE", "THIRD_QUARTILE", "FOURTH_QUARTILE"][Math.floor(3 * count / max)] as string : "NONE", + date: new Date(date), + }) + } + } + weeks.push({ days }) + return { + entity: { + contributions: { + calendar: { + weeks, + }, + }, + }, + } +}) diff --git a/plugins/calendar/tests/colors.graphql.ts b/plugins/calendar/tests/colors.graphql.ts new file mode 100644 index 00000000000..d17dc7c6631 --- /dev/null +++ b/plugins/calendar/tests/colors.graphql.ts @@ -0,0 +1,16 @@ +import { is, mock } from "@testing" + +export default mock({ login: is.string() }, () => ({ + entity: { + contributions: { + calendar: { + colors: [ + "#9be9a8", + "#40c463", + "#30a14e", + "#216e39", + ], + }, + }, + }, +})) diff --git a/plugins/calendar/tests/list.yml b/plugins/calendar/tests/list.yml new file mode 100644 index 00000000000..3cfdc625375 --- /dev/null +++ b/plugins/calendar/tests/list.yml @@ -0,0 +1,179 @@ +- name: range last-180-days + plugins: + - id: calendar + args: + view: isometric + range: last-180-days + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .year .day + count: 180~1 + - id: calendar + args: + view: top-down + range: last-180-days + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .year .day + count: 180~1 + +- name: range last-365-days + plugins: + - id: calendar + args: + view: isometric + range: last-365-days + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .year .day + count: 365~1 + - id: calendar + args: + view: top-down + range: last-365-days + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .year .day + count: 365~1 + +- name: range current-year + plugins: + - id: calendar + args: + range: current-year + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .title sub + match: /1 jan (\d+) to \d+ \w+ \1/i + +- name: range specific year + plugins: + - id: calendar + args: + range: 2020 + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .title sub + match: /1 jan 2020 to 31 dec 2020/i + - id: calendar + args: + range: 1970 + processors: + - id: assert + args: + select: .calendar .year + count: 1= + - id: assert + args: + select: .calendar .title sub + match: /1 jan 1970 to 31 dec 1970/i + +- name: range specific years + plugins: + - id: calendar + args: + range: + from: 2019 + to: 2020 + processors: + - id: assert + args: + select: .calendar .year + count: 2= + - id: assert + args: + select: .calendar .title sub + match: /1 jan 2019 to 31 dec 2020/i + +- name: range relative years + plugins: + - id: calendar + args: + range: + from: -1 + to: current-year + processors: + - id: assert + args: + select: .calendar .year + count: 2= + - id: calendar + args: + range: + from: -1 + to: 2020 + processors: + - id: assert + args: + select: .calendar .year + count: 2= + - id: assert + args: + select: .calendar .title sub + match: /1 jan 2019 to 31 dec 2020/i + +- name: range from registration + plugins: + - id: calendar + args: + range: + from: registration + to: current-year + processors: + - id: assert + args: + select: .calendar .year + count: 1>= + +- name: color schemes + plugins: + - id: calendar + args: + view: top-down + colors: halloween + processors: + - id: assert + args: + select: .calendar svg.render [fill^="var"] + match: /fill="var\(--calendar-halloween-L\d\)"/ + html: true + - id: calendar + args: + view: isometric + colors: winter + processors: + - id: assert + args: + select: .calendar svg.render [fill^="var"] + match: /fill="var\(--calendar-winter-L\d\)"/ + html: true diff --git a/plugins/calendar/tests/user.graphql.ts b/plugins/calendar/tests/user.graphql.ts new file mode 100644 index 00000000000..754e72dd88d --- /dev/null +++ b/plugins/calendar/tests/user.graphql.ts @@ -0,0 +1,7 @@ +import { faker, is, mock } from "@testing" + +export default mock({ login: is.string() }, () => ({ + entity: { + registration: faker.date.past({ years: 3 }), + }, +})) From 66898bd510f24ebfbd4c1850bc0a944d61da676d Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:46:54 +0200 Subject: [PATCH 003/103] feat(plugins/gists): v4 --- plugins/gists/mod.ts | 63 ++++++++++++++++++++++++++++ plugins/gists/queries/gists.graphql | 24 +++++++++++ plugins/gists/templates/classic.ejs | 44 +++++++++++++++++++ plugins/gists/tests/gists.graphql.ts | 32 ++++++++++++++ plugins/gists/tests/list.yml | 46 ++++++++++++++++++++ 5 files changed, 209 insertions(+) create mode 100644 plugins/gists/mod.ts create mode 100644 plugins/gists/queries/gists.graphql create mode 100644 plugins/gists/templates/classic.ejs create mode 100644 plugins/gists/tests/gists.graphql.ts create mode 100644 plugins/gists/tests/list.yml diff --git a/plugins/gists/mod.ts b/plugins/gists/mod.ts new file mode 100644 index 00000000000..62e3ccaa589 --- /dev/null +++ b/plugins/gists/mod.ts @@ -0,0 +1,63 @@ +// Imports +import { is, Plugin, state } from "@plugin" + +/** Plugin */ +export default class extends Plugin { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🎫 Gists" + + /** Category */ + readonly category = "github" + + /** Supports */ + readonly supports = ["user"] + + /** Description */ + readonly description = "Displays [GitHub gists](https://gist.github.com)" + + /** Inputs */ + readonly inputs = is.object({ + forks: is.boolean().default(false).describe("Whether to include forks"), + visibility: is.enum(["public", "all"]).default("public").describe("Gists visibility"), + }) + + /** Outputs */ + readonly outputs = is.object({ + count: is.number().int().min(0).describe("Total number of gists"), + forked: is.number().int().min(0).describe("Total number of forked gists"), + comments: is.number().int().min(0).describe("Total number of comments"), + files: is.number().int().min(0).describe("Total number of files"), + forks: is.number().int().min(0).describe("Total number of forks"), + stargazers: is.number().int().min(0).describe("Total number of stargazers"), + }) + + /** Action */ + protected async action({ errors }: state) { + const { handle } = this.context + const { forks, visibility } = await this.inputs.parseAsync(this.context.args) + const { entity: { gists: { count, nodes: gists } } } = await this.graphql("gists", { login: handle, privacy: visibility.toLocaleUpperCase() }, { paginate: true }) + const result = { count, forked: 0, comments: 0, files: 0, forks: 0, stargazers: 0 } + let missing = 0 + for (const gist of gists) { + if (!gist) { + missing++ + continue + } + if ((gist.forked) && (!forks)) { + continue + } + result.forked += gist.forked ? 1 : 0 + result.stargazers += gist.stargazers + result.forks += gist.forks.count + result.comments += gist.comments.count + result.files += gist.files.length + } + if (missing) { + errors.push({ severity: "warning", source: this.id, message: `${missing} gists could not be correctly fetched.\nProvided token may not have sufficient permissions.` }) + } + return result + } +} diff --git a/plugins/gists/queries/gists.graphql b/plugins/gists/queries/gists.graphql new file mode 100644 index 00000000000..27e7e8eced4 --- /dev/null +++ b/plugins/gists/queries/gists.graphql @@ -0,0 +1,24 @@ +query Gists($login: String!, $privacy: GistPrivacy!, $cursor: String) { + entity: user(login: $login) { + gists(after: $cursor, first: 50, orderBy: {field: UPDATED_AT, direction: DESC}, privacy: $privacy) { + count: totalCount + nodes { + stargazers: stargazerCount + forked: isFork + forks { + count: totalCount + } + files { + name + } + comments { + count: totalCount + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} \ No newline at end of file diff --git a/plugins/gists/templates/classic.ejs b/plugins/gists/templates/classic.ejs new file mode 100644 index 00000000000..ad48a57ea01 --- /dev/null +++ b/plugins/gists/templates/classic.ejs @@ -0,0 +1,44 @@ +
+
+ + <% if (!(result instanceof Error)) { %> + <%= format.number("Gist", result.count) %> + <% if (result.forked) { %> + (including <%= format.number("fork", result.forked) %>) + <% } %> + <% } else { %> + Gists + <% } %> +
+
+ <% if (result instanceof Error) { %> +
+ + <%= result.message %> +
+ <% } else { %> +
+ + +
+ <% } %> +
+
diff --git a/plugins/gists/tests/gists.graphql.ts b/plugins/gists/tests/gists.graphql.ts new file mode 100644 index 00000000000..933ee869882 --- /dev/null +++ b/plugins/gists/tests/gists.graphql.ts @@ -0,0 +1,32 @@ +import { faker, is, mock } from "@testing" + +export default mock({ login: is.string(), privacy: is.enum(["PUBLIC", "ALL"]) }, ({ privacy }) => { + const count = { PUBLIC: 10, ALL: 20 }[privacy] + return { + entity: { + gists: { + count, + nodes: [ + ...Array.from({ length: count }, (_, i) => ({ + stargazers: faker.number.int({ max: 100 }), + forked: i % 2 === 0, + forks: { + count: faker.number.int({ max: 100 }), + }, + files: Array.from({ length: faker.number.int({ min: 1, max: 5 }) }, () => ({ + name: faker.system.fileName(), + })), + comments: { + count: faker.number.int({ max: 100 }), + }, + })), + null, + ], + pageInfo: { + hasNextPage: false, + endCursor: null, + }, + }, + }, + } +}) diff --git a/plugins/gists/tests/list.yml b/plugins/gists/tests/list.yml new file mode 100644 index 00000000000..9a79f22fd76 --- /dev/null +++ b/plugins/gists/tests/list.yml @@ -0,0 +1,46 @@ +- name: gists visibility + plugins: + - id: gists + handle: octocat + entity: user + args: + visibility: public + processors: + - id: assert + args: + select: .gists .title + match: /10 gists/i + - id: gists + handle: octocat + entity: user + args: + visibility: all + processors: + - id: assert + args: + select: .gists .title + match: /20 gists/i + +- name: gists forks + plugins: + - id: gists + handle: octocat + entity: user + args: + forks: true + processors: + - id: assert + args: + select: .gists .title + match: /including \d+ forks?/i + - id: gists + handle: octocat + entity: user + args: + forks: false + processors: + - id: assert + args: + select: .gists .title + match: /!/including \d+ forks?/i + From e05c264986acbdc0b90a700ce3b2dea2270d4eb3 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:02 +0200 Subject: [PATCH 004/103] feat(plugins/introduction): v4 --- plugins/introduction/mod.ts | 36 +++++++++++++++++++ .../introduction/queries/organization.graphql | 5 +++ .../introduction/queries/repository.graphql | 5 +++ plugins/introduction/queries/user.graphql | 5 +++ plugins/introduction/templates/classic.ejs | 24 +++++++++++++ plugins/introduction/tests/list.yml | 32 +++++++++++++++++ .../tests/organization.graphql.ts | 7 ++++ .../introduction/tests/repository.graphql.ts | 7 ++++ plugins/introduction/tests/user.graphql.ts | 7 ++++ 9 files changed, 128 insertions(+) create mode 100644 plugins/introduction/mod.ts create mode 100644 plugins/introduction/queries/organization.graphql create mode 100644 plugins/introduction/queries/repository.graphql create mode 100644 plugins/introduction/queries/user.graphql create mode 100644 plugins/introduction/templates/classic.ejs create mode 100644 plugins/introduction/tests/list.yml create mode 100644 plugins/introduction/tests/organization.graphql.ts create mode 100644 plugins/introduction/tests/repository.graphql.ts create mode 100644 plugins/introduction/tests/user.graphql.ts diff --git a/plugins/introduction/mod.ts b/plugins/introduction/mod.ts new file mode 100644 index 00000000000..dc736974350 --- /dev/null +++ b/plugins/introduction/mod.ts @@ -0,0 +1,36 @@ +// Imports +import { is, Plugin } from "@plugin" +import { parseHandle } from "@utils/parse.ts" + +/** Plugin */ +export default class extends Plugin { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🙋 Introduction" + + /** Category */ + readonly category = "github" + + /** Description */ + readonly description = "Displays user, organization or repository description".trim() + + /** Supports */ + readonly supports = ["user", "organization", "repository"] + + /** Inputs */ + readonly inputs = is.object({}) + + /** Outputs */ + readonly outputs = is.object({ + text: is.string().describe("Introduction text"), + }) + + /** Action */ + protected async action() { + const { handle, entity } = this.context + const { entity: { text } } = await this.graphql(entity, parseHandle(handle, { entity })) + return { text } + } +} diff --git a/plugins/introduction/queries/organization.graphql b/plugins/introduction/queries/organization.graphql new file mode 100644 index 00000000000..99d309bab63 --- /dev/null +++ b/plugins/introduction/queries/organization.graphql @@ -0,0 +1,5 @@ +query IntroductionOrganization($login: String!) { + entity: organization(login: $login) { + text: description + } +} \ No newline at end of file diff --git a/plugins/introduction/queries/repository.graphql b/plugins/introduction/queries/repository.graphql new file mode 100644 index 00000000000..c03228d9cd5 --- /dev/null +++ b/plugins/introduction/queries/repository.graphql @@ -0,0 +1,5 @@ +query IntroductionRepository($owner: String!, $name: String!) { + entity: repository(owner: $owner, name: $name) { + text: description + } +} \ No newline at end of file diff --git a/plugins/introduction/queries/user.graphql b/plugins/introduction/queries/user.graphql new file mode 100644 index 00000000000..149aeae8c5e --- /dev/null +++ b/plugins/introduction/queries/user.graphql @@ -0,0 +1,5 @@ +query IntroductionUser($login: String!) { + entity: user(login: $login) { + text: bio + } +} \ No newline at end of file diff --git a/plugins/introduction/templates/classic.ejs b/plugins/introduction/templates/classic.ejs new file mode 100644 index 00000000000..10d2bb0d5bb --- /dev/null +++ b/plugins/introduction/templates/classic.ejs @@ -0,0 +1,24 @@ +
+
+ + About <%= {user:"me", organization:"us"}[entity] ?? "" %> +
+
+ <% if (result instanceof Error) { %> +
+ + <%= result.message %> +
+ <% } else { %> +
+ <%= result.text %> +
+ <% } %> +
+ +
\ No newline at end of file diff --git a/plugins/introduction/tests/list.yml b/plugins/introduction/tests/list.yml new file mode 100644 index 00000000000..c229fc69965 --- /dev/null +++ b/plugins/introduction/tests/list.yml @@ -0,0 +1,32 @@ +- name: user + plugins: + - id: introduction + handle: octocat + entity: user + processors: + - id: assert + args: + select: .introduction .text + match: octocat + +- name: organization + plugins: + - id: introduction + handle: github + entity: organization + processors: + - id: assert + args: + select: .introduction .text + match: github + +- name: repository + plugins: + - id: introduction + handle: octocat/hello-world + entity: repository + processors: + - id: assert + args: + select: .introduction .text + match: octocat/hello-world \ No newline at end of file diff --git a/plugins/introduction/tests/organization.graphql.ts b/plugins/introduction/tests/organization.graphql.ts new file mode 100644 index 00000000000..46dc48a386d --- /dev/null +++ b/plugins/introduction/tests/organization.graphql.ts @@ -0,0 +1,7 @@ +import { faker, is, mock } from "@testing" + +export default mock({ login: is.string() }, ({ login }) => ({ + entity: { + text: `${login}: ${faker.company.catchPhrase()}`, + }, +})) diff --git a/plugins/introduction/tests/repository.graphql.ts b/plugins/introduction/tests/repository.graphql.ts new file mode 100644 index 00000000000..bd34f0c5662 --- /dev/null +++ b/plugins/introduction/tests/repository.graphql.ts @@ -0,0 +1,7 @@ +import { faker, is, mock } from "@testing" + +export default mock({ owner: is.string(), name: is.string() }, ({ owner, name }) => ({ + entity: { + text: `${owner}/${name}: ${faker.company.buzzPhrase()}`, + }, +})) diff --git a/plugins/introduction/tests/user.graphql.ts b/plugins/introduction/tests/user.graphql.ts new file mode 100644 index 00000000000..f4b7a36cfb1 --- /dev/null +++ b/plugins/introduction/tests/user.graphql.ts @@ -0,0 +1,7 @@ +import { faker, is, mock } from "@testing" + +export default mock({ login: is.string() }, ({ login }) => ({ + entity: { + text: `${login}: ${faker.person.jobTitle()}`, + }, +})) From b2df94232208f5dd2c9ff0600d892e72dae130c2 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:07 +0200 Subject: [PATCH 005/103] feat(plugins/rss): v4 --- plugins/rss/mod.ts | 51 +++++++++++++++++++++++++++++++ plugins/rss/templates/classic.ejs | 44 ++++++++++++++++++++++++++ plugins/rss/tests/list.yml | 23 ++++++++++++++ plugins/rss/tests/rss.http.ts | 23 ++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 plugins/rss/mod.ts create mode 100644 plugins/rss/templates/classic.ejs create mode 100644 plugins/rss/tests/list.yml create mode 100644 plugins/rss/tests/rss.http.ts diff --git a/plugins/rss/mod.ts b/plugins/rss/mod.ts new file mode 100644 index 00000000000..4ac519abfb6 --- /dev/null +++ b/plugins/rss/mod.ts @@ -0,0 +1,51 @@ +// Imports +import { is, Plugin } from "@plugin" +import RSS from "y/rss-parser@3.13.0" + +/** Plugin */ +export default class extends Plugin { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🗼 Rss feed" + + /** Category */ + readonly category = "social" + + /** Supports */ + readonly supports = ["user", "organization", "repository"] + + /** Description */ + readonly description = "Displays entries from a RSS feed" + + /** Inputs */ + readonly inputs = is.object({ + feed: is.string().url().describe("RSS feed (e.g. `https://news.ycombinator.com/rss`)"), + limit: is.number().int().min(1).nullable().default(4).describe("Display limit (use `null` to disable)"), + }) + + /** Outputs */ + readonly outputs = is.object({ + name: is.string().describe("Feed name"), + description: is.string().describe("Feed description"), + entries: is.array(is.object({ + title: is.string().describe("Entry title"), + link: is.string().url().describe("Entry link"), + date: is.date().nullable().describe("Entry date"), + })).describe("Feed entries"), + }) + + /** Action */ + protected async action() { + const { feed, limit } = await this.inputs.parseAsync(this.context.args) + const content = await this.fetch(feed, { type: "text" }) + const { title: name, description, items } = await (new RSS()).parseString(content) + let entries = items.map(({ title, link, isoDate: date }) => ({ title, link, date: date ? new Date(date) : null })) + this.log.debug(`found ${entries.length} entries from ${feed}`) + if (limit) { + entries = entries.slice(0, limit) + } + return { name, description, entries } + } +} diff --git a/plugins/rss/templates/classic.ejs b/plugins/rss/templates/classic.ejs new file mode 100644 index 00000000000..2b2f6a6d4c2 --- /dev/null +++ b/plugins/rss/templates/classic.ejs @@ -0,0 +1,44 @@ +
+
+ + <%= result?.name ?? "" %> RSS feed +
+
+ <% if (result instanceof Error) { %> +
+ + <%= result.message %> +
+ <% } else { %> +
+ <% if (result.description) { %> +
+ + <%= result.description %> +
+ <% } %> + <% if (result.entries.length) { %> + <% for (const {title, date:published} of result.entries) { %> +
+ +
+
<%= title %>
+
<%= format.date(published) %>
+
+
+ <% } %> + <% } else { %> + + <% } %> +
+ <% } %> +
+ +
+ + diff --git a/plugins/rss/tests/list.yml b/plugins/rss/tests/list.yml new file mode 100644 index 00000000000..8474b3ec79b --- /dev/null +++ b/plugins/rss/tests/list.yml @@ -0,0 +1,23 @@ +- name: feed + plugins: + - id: rss + args: + feed: https://metrics.test/rss + limit: 1 + processors: + - id: assert + args: + select: .rss .entry + count: 1= + +- name: feed with limit disabled + plugins: + - id: rss + args: + feed: https://metrics.test/rss + limit: null + processors: + - id: assert + args: + select: .rss .entry + count: 1>= diff --git a/plugins/rss/tests/rss.http.ts b/plugins/rss/tests/rss.http.ts new file mode 100644 index 00000000000..0e95788f873 --- /dev/null +++ b/plugins/rss/tests/rss.http.ts @@ -0,0 +1,23 @@ +import { faker, mock } from "@testing" + +export default mock({}, () => { + return ` + + + ${faker.company.name()} + ${faker.internet.url()} + ${faker.company.catchPhrase()} + + ${faker.company.buzzPhrase()} + ${faker.internet.url()} + Sat, 16 Sep 2023 19:48:15 +0000 + + + ${faker.company.buzzPhrase()} + ${faker.internet.url()} + Sat, 16 Sep 2023 22:27:08 +0000 + + + + `.trim() +}) From a1b1fc882a671b9985448c9dd46acd9925ac5c11 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:13 +0200 Subject: [PATCH 006/103] feat(plugins/webscraping): v4 --- plugins/webscraping/mod.ts | 82 ++++++++++++++++++++++ plugins/webscraping/templates/classic.ejs | 26 +++++++ plugins/webscraping/tests/example.html | 19 +++++ plugins/webscraping/tests/example.png | Bin 0 -> 101296 bytes plugins/webscraping/tests/list.yml | 47 +++++++++++++ 5 files changed, 174 insertions(+) create mode 100644 plugins/webscraping/mod.ts create mode 100644 plugins/webscraping/templates/classic.ejs create mode 100644 plugins/webscraping/tests/example.html create mode 100644 plugins/webscraping/tests/example.png create mode 100644 plugins/webscraping/tests/list.yml diff --git a/plugins/webscraping/mod.ts b/plugins/webscraping/mod.ts new file mode 100644 index 00000000000..b910984c76e --- /dev/null +++ b/plugins/webscraping/mod.ts @@ -0,0 +1,82 @@ +// Imports +import { is, Plugin } from "@plugin" +import { Browser } from "@utils/browser.ts" +import { delay } from "std/async/delay.ts" +import { resize } from "x/deno_image@0.0.4/mod.ts" +import * as Base64 from "std/encoding/base64.ts" + +/** Plugin */ +export default class extends Plugin { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "📸 Webscraping" + + /** Category */ + readonly category = "other" + + /** Supports */ + readonly supports = ["user", "organization", "repository"] + + /** Description */ + readonly description = "Screenshot or extract content from a website" + + /** Inputs */ + readonly inputs = is.object({ + url: is.string().url().describe("Website URL (e.g. `https://github.com`)"), + select: is.string().default("body").describe("Query selector"), + viewport: is.object({ + width: is.number().positive().default(1280).describe("Viewport width"), + height: is.number().positive().default(1280).describe("Viewport height"), + }).default(() => ({})), + mode: is.enum(["text", "image"]).default("image").describe("Output"), + wait: is.number().default(0).describe("Wait time before screenshot (in seconds)"), + background: is.boolean().default(true).describe("Background"), + }) + + /** Outputs */ + readonly outputs = is.object({ + title: is.string(), + content: is.string(), + }) + + /** Action */ + protected async action() { + if (this.context.mock) { + this.context.args.url = new URL("tests/example.html", import.meta.url).href + } + const { url, select: selector, mode, viewport, wait, background } = await this.inputs.parseAsync(this.context.args) + const page = await Browser.newPage() + try { + await page.setViewport(viewport) + await page.goto(url, { waitUntil: ["domcontentloaded", "networkidle2"] }) + if (wait) { + await delay(wait * 1000) + } + await page.waitForSelector(selector) + const result = { content: "", title: await page.title() } + switch (mode) { + case "image": { + const { x, y, width, height } = await page.evaluate([ + `const {x, y, width, height} = document.querySelector('${selector}').getBoundingClientRect()`, + `;({x, y, width, height})`, + ].join("\n")) as { [key: PropertyKey]: number } + const buffer = await page.screenshot({ type: "png", clip: { width, height, x, y }, omitBackground: !background }) as Uint8Array + const img = await resize(buffer, { height: 400 }) + result.content = `data:image/png;base64,${Base64.encode(img)}` + break + } + case "text": { + result.content = await page.evaluate(`document.querySelector('${selector}')?.innerText ?? ""`) as string + break + } + } + await page.close() + return result + } catch (error) { + await page.close() + throw error + } + } +} diff --git a/plugins/webscraping/templates/classic.ejs b/plugins/webscraping/templates/classic.ejs new file mode 100644 index 00000000000..38e86b49a53 --- /dev/null +++ b/plugins/webscraping/templates/classic.ejs @@ -0,0 +1,26 @@ +
+
+ + <%= result?.title ?? "Web scraping" %> +
+
+ <% if (result instanceof Error) { %> +
+ + <%= result.message %> +
+ <% } else { %> +
+ <% if (args.mode === "image") { %> + + <% } else if (args.mode === "text") { %> + <%= result.content %> + <% } %> +
+ <% } %> +
+ +
+ + diff --git a/plugins/webscraping/tests/example.html b/plugins/webscraping/tests/example.html new file mode 100644 index 00000000000..abe0e38f947 --- /dev/null +++ b/plugins/webscraping/tests/example.html @@ -0,0 +1,19 @@ + + + example + + + + +
+
hello world
+ example +
+ + + \ No newline at end of file diff --git a/plugins/webscraping/tests/example.png b/plugins/webscraping/tests/example.png new file mode 100644 index 0000000000000000000000000000000000000000..71c3afcd1475e4ff6f831de1f822fa3f82dfd711 GIT binary patch literal 101296 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 J2YQ&e{{u9>>" + processors: + - id: assert + args: + select: .webscraping + error: true From c9d55faf237fde65be01710bb0f03e49f74b5639 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:30 +0200 Subject: [PATCH 007/103] feat(processors/assert): add support --- processors/assert/mod.ts | 105 +++++++++++++++++++++++++++++++ processors/assert/tests/list.yml | 61 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 processors/assert/mod.ts create mode 100644 processors/assert/tests/list.yml diff --git a/processors/assert/mod.ts b/processors/assert/mod.ts new file mode 100644 index 00000000000..6e3b4631394 --- /dev/null +++ b/processors/assert/mod.ts @@ -0,0 +1,105 @@ +// Imports +import { DOMParser } from "x/deno_dom@v0.1.38/deno-dom-wasm.ts" +import { Format } from "@utils/format.ts" +import { is, Processor, state } from "@processor" +import { assert, assertMatch, assertNotMatch, assertStrictEquals, assertStringIncludes } from "@testing" + +/** Regexs */ +const regexs = { + count: /^(?\d+)(?<|<=|=|>=|>|~)(?:(?<=~)(?\d+))?$/, + match: /^\/(?!\/)?(?[\s\S]+)\/(?\w*)$/, +} + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🧪 Assertions" + + /** Category */ + readonly category = "testing" + + /** Description */ + readonly description = "Assert selection matches specified criteria" + + /** Supports */ + readonly supports = ["application/xml", "image/svg+xml"] + + /** Inputs */ + readonly inputs = is.object({ + select: is.string().default("main").describe("Query selector"), + match: is.coerce.string().optional().describe("Assert element content match pattern (will be treated as regex if matching `/pattern/flags`, prefix with `/!` to negate regex matching)"), + html: is.boolean().default(false).describe("Use raw HTML instead of text content"), + count: is.coerce.string().regex(regexs.count).optional().describe("Assert number of elements"), + error: is.boolean().default(false).describe("Assert previous content returned an error"), + mime: is.string().optional(), + }) + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const { count, select, match, error, html, mime } = await this.inputs.parseAsync(this.context.args) + if (typeof result.content !== "string") { + if (error) { + return + } + assert(false, `expected previous content to be successful`) + } + if (mime && (!result.mime.includes(mime))) { + assert(false, `expected previous content to be ${mime} (got ${result.mime})`) + } + const document = new DOMParser().parseFromString(Format.html(result.content), "text/html") + const selected = [...document?.querySelectorAll(select) ?? []] + if (typeof count === "string") { + const captured = count.match(regexs.count)!.groups ?? {} + const n = Number(captured.n) + const m = Number(captured.m) + const op = captured.op || "=" + switch (op) { + case "<": + assert(selected.length < n, `expected less than ${n} elements (got ${selected.length})`) + break + case "<=": + assert(selected.length <= n, `expected less than ${n} elements (got ${selected.length})`) + break + case ">": + assert(selected.length > n, `expected more than ${n} elements (got ${selected.length})`) + break + case ">=": + assert(selected.length >= n, `expected more than ${n} elements (got ${selected.length})`) + break + case "=": + assertStrictEquals(selected.length, n, `expected ${n} elements (got ${selected.length})`) + break + case "~": + assert(Math.abs(selected.length - n) <= m, `expected ${n}±${m} elements (got ${selected.length})`) + break + } + if ((op === "=") && (n === 0)) { + return + } + } + if (!selected.length) { + assert(false, `expected at least one element to be present`) + } + + for (const element of selected) { + if (typeof match === "string") { + const content = html ? ((element.parentElement ?? element) as unknown as { innerHTML?: string }).innerHTML ?? "" : element.textContent + if (regexs.match.test(match)) { + const { negate = "", pattern = "", flags = "" } = match.match(regexs.match)!.groups ?? {} + const regex = new RegExp(pattern, flags) + if (negate) { + assertNotMatch(content, regex, `${content.trim()} match ${regex} but should not`) + } else { + assertMatch(content, regex, `${content.trim()} does not match ${regex}`) + } + } else { + assertStringIncludes(content, match, `${content.trim()} does not include ${match}`) + } + } + } + } +} diff --git a/processors/assert/tests/list.yml b/processors/assert/tests/list.yml new file mode 100644 index 00000000000..88ea8122713 --- /dev/null +++ b/processors/assert/tests/list.yml @@ -0,0 +1,61 @@ +- name: match text + plugins: + - processors: + - id: inject.content + args: + content: hello world + - id: assert + args: + select: .test + match: hello world + - id: assert + args: + select: .test + match: /hello world/ + - id: assert + args: + select: .test + match: /!/foo bar/ + +- name: match html + plugins: + - processors: + - id: inject.content + args: + content: + - id: assert + args: + select: .test + match: /data-test="true"/ + html: true + +- name: count elements + plugins: + - processors: + - id: inject.content + args: + content: + - id: assert + args: + select: .a + count: 1= + - id: assert + args: + select: .a + count: 0~1 + - id: assert + args: + select: .a + count: 1>= + - id: assert + args: + select: .a + count: 0> + - id: assert + args: + select: .a + count: 1<= + - id: assert + args: + select: .a + count: 2< From 918e7330f42ea86ebd5688699ed606b1897c1d06 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:35 +0200 Subject: [PATCH 008/103] feat(processors/inject.content): add support --- processors/inject.content/mod.ts | 32 ++++++++++++++++++++++++ processors/inject.content/tests/list.yml | 10 ++++++++ 2 files changed, 42 insertions(+) create mode 100644 processors/inject.content/mod.ts create mode 100644 processors/inject.content/tests/list.yml diff --git a/processors/inject.content/mod.ts b/processors/inject.content/mod.ts new file mode 100644 index 00000000000..8357289b7e2 --- /dev/null +++ b/processors/inject.content/mod.ts @@ -0,0 +1,32 @@ +// Imports +import { is, Processor, state } from "@processor" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🔩 Inject raw content" + + /** Category */ + readonly category = "injector" + + /** Description */ + readonly description = "Inject custom raw content" + + /** Supports */ + readonly supports = ["application/xml"] + + /** Inputs */ + readonly inputs = is.object({ + content: is.string().describe("Content to inject"), + }) + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const { content } = await this.inputs.parseAsync(this.context.args) + result.content = `${result.content}${content}` + } +} diff --git a/processors/inject.content/tests/list.yml b/processors/inject.content/tests/list.yml new file mode 100644 index 00000000000..8581557c33c --- /dev/null +++ b/processors/inject.content/tests/list.yml @@ -0,0 +1,10 @@ +- name: inject + plugins: + - processors: + - id: inject.content + args: + content: hello world + - id: assert + args: + select: main + match: hello world From 510479b4bf3131e485ff1eab0ef52e83bdd5bb41 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:41 +0200 Subject: [PATCH 009/103] feat(processors/inject.script): add support --- processors/inject.script/mod.ts | 47 +++++++++++++++++++++++++ processors/inject.script/tests/list.yml | 29 +++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 processors/inject.script/mod.ts create mode 100644 processors/inject.script/tests/list.yml diff --git a/processors/inject.script/mod.ts b/processors/inject.script/mod.ts new file mode 100644 index 00000000000..7337c04aa87 --- /dev/null +++ b/processors/inject.script/mod.ts @@ -0,0 +1,47 @@ +// Imports +import { is, Processor, state } from "@processor" +import { Browser } from "@utils/browser.ts" +import { Format } from "@utils/format.ts" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🔩 Inject JavaScript" + + /** Category */ + readonly category = "injector" + + /** Description */ + readonly description = "Inject and execute custom JavaScript" + + /** Supports */ + readonly supports = ["application/xml"] + + /** Inputs */ + readonly inputs = is.object({ + script: is.string().describe("JavaScript to inject and execute"), + }) + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const { script } = await this.inputs.parseAsync(this.context.args) + const page = await Browser.newPage() + try { + this.log.trace("processing content in browser") + await page.setContent(Format.html(result.content), { waitUntil: ["load", "domcontentloaded"] }) + this.log.trace(`injecting script: ${script}`) + result.content = await page.evaluate(async (script: string) => { + await new Function("document", `return (async () => { ${script} })()`)(document) + return document.querySelector("main")!.innerHTML + }, script) + await page.close() + } catch (error) { + await page.close() + throw error + } + } +} diff --git a/processors/inject.script/tests/list.yml b/processors/inject.script/tests/list.yml new file mode 100644 index 00000000000..d87455ab520 --- /dev/null +++ b/processors/inject.script/tests/list.yml @@ -0,0 +1,29 @@ +- name: inject + plugins: + - processors: + - id: inject.content + args: + content: + - id: inject.script + args: + script: | + document.querySelector(".test").textContent = "hello world"; + - id: assert + args: + select: .test + match: hello world + +- name: inject error + plugins: + - processors: + - id: inject.content + args: + content: + - id: inject.script + fatal: false + args: + script: | + throw new Error("expected error") + - id: assert + args: + error: true From e6f23035dc2d06a13aadedff5b7ed12ba1e34f95 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:47 +0200 Subject: [PATCH 010/103] feat(processors/inject.style): add support --- processors/inject.style/mod.ts | 65 ++++++++++++++++++++++++++ processors/inject.style/tests/list.yml | 20 ++++++++ 2 files changed, 85 insertions(+) create mode 100644 processors/inject.style/mod.ts create mode 100644 processors/inject.style/tests/list.yml diff --git a/processors/inject.style/mod.ts b/processors/inject.style/mod.ts new file mode 100644 index 00000000000..ab597c15198 --- /dev/null +++ b/processors/inject.style/mod.ts @@ -0,0 +1,65 @@ +// Imports +import { is, Processor, state } from "@processor" +import { Browser } from "@utils/browser.ts" +import { Format } from "@utils/format.ts" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🔩 Inject CSS" + + /** Category */ + readonly category = "injector" + + /** Description */ + readonly description = "Inject custom CSS" + + /** Supports */ + readonly supports = ["application/xml"] + + /** Inputs */ + readonly inputs = is.object({ + style: is.string().describe("CSS to inject"), + }) + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const { style } = await this.inputs.parseAsync(this.context.args) + const page = await Browser.newPage() + try { + this.log.trace("processing content in browser") + await page.setContent(Format.html(result.content), { waitUntil: ["load", "domcontentloaded"] }) + const scope = `inject-style-${crypto.randomUUID().slice(-12)}` + this.log.trace(`injecting style: ${style}`) + result.content = await page.evaluate( + (scope: string, style: string) => { + // List CSS rules + const virtual = document.implementation.createHTMLDocument(""), tag = document.createElement("style") + tag.textContent = style + virtual.body.appendChild(tag) + let styled = "" + for (const { selectorText: selectors, cssText: rule } of Object.values(tag.sheet!.cssRules) as CSSStyleRule[]) { + const parsed = selectors.split(",").map((selector: string) => selector.trim()) as string[] + styled += rule.replace(selectors, parsed.flatMap((selector) => [`[${scope}]${selector}`, `[${scope}] ${selector}`]).join(",")) + } + tag.textContent = styled + // Inject CSS + const main = document.querySelector("main")! + main.appendChild(tag) + document.querySelectorAll("main > *:not(style)").forEach((element) => element.setAttribute(scope, "true")) + return main.innerHTML + }, + scope, + style, + ) + await page.close() + } catch (error) { + await page.close() + throw error + } + } +} diff --git a/processors/inject.style/tests/list.yml b/processors/inject.style/tests/list.yml new file mode 100644 index 00000000000..fc139c3ed72 --- /dev/null +++ b/processors/inject.style/tests/list.yml @@ -0,0 +1,20 @@ +- name: inject + plugins: + - processors: + - id: inject.content + args: + content: + - id: inject.style + args: + style: | + .test { color: blue; } + - id: assert + args: + select: .test + match: //i + html: true + - id: assert + args: + select: .test + match: /\[inject-style-.*?\]\s+.test.*color:\s+blue/i + html: true From 2d061ff209907e3c3fbcdbc479707fd3a58a88e5 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:52 +0200 Subject: [PATCH 011/103] feat(processors/optimize.css): add support --- processors/optimize.css/mod.ts | 42 +++++++++++++++++++++ processors/optimize.css/tests/list.yml | 52 ++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 processors/optimize.css/mod.ts create mode 100644 processors/optimize.css/tests/list.yml diff --git a/processors/optimize.css/mod.ts b/processors/optimize.css/mod.ts new file mode 100644 index 00000000000..5a9c8a3e9a7 --- /dev/null +++ b/processors/optimize.css/mod.ts @@ -0,0 +1,42 @@ +// Imports +import { Processor, state } from "@processor" +import { PurgeCSS } from "y/purgecss@5.0.0" +import { DOMParser } from "x/deno_dom@v0.1.38/deno-dom-wasm.ts" +import { Format } from "@utils/format.ts" +import { minify } from "y/csso@5.0.5" +import { unescape } from "y/html-escaper@3.0.3" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🧹 Optimize CSS" + + /** Category */ + readonly category = "optimizer" + + /** Description */ + readonly description = "Optimize CSS by removing unused styles and minifying" + + /** Supports */ + readonly supports = ["application/xml", "image/svg+xml"] + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const document = new DOMParser().parseFromString(Format.html(result.content), "text/html")! + for (const style of document.querySelectorAll('style[data-optimizable="true"]')) { + this.log.trace("purging css") + const raw = unescape(style.textContent) + style.textContent = "" + const purged = await new PurgeCSS().purge({ content: [{ raw: document.querySelector("main")!.innerHTML, extension: "html" }], css: [{ raw }] }) + this.log.trace("optimizing css") + const optimized = minify(purged.map(({ css }) => css).join("\n")).css + style.textContent = optimized + ;(style as unknown as Element).removeAttribute("data-optimizable") + } + result.content = document.querySelector("main")!.innerHTML + } +} diff --git a/processors/optimize.css/tests/list.yml b/processors/optimize.css/tests/list.yml new file mode 100644 index 00000000000..736348e1635 --- /dev/null +++ b/processors/optimize.css/tests/list.yml @@ -0,0 +1,52 @@ +- name: optimize + plugins: + - processors: + - id: inject.content + args: + content: | + + + Hello + World + + + + - id: optimize.css + - id: assert + args: + select: svg style + match: /\.a\{.*\}/i + - id: assert + args: + select: svg style + match: /!/\.b\{.*\}/i + +- name: optimize does not remove non-optimizable styles + plugins: + - processors: + - id: inject.content + args: + content: | + + + Hello + World + + + + - id: optimize.css + - id: assert + args: + select: svg style + match: /\.a { color:\ red; \}/i + - id: assert + args: + select: svg style + match: /\.b \{ color:\ blue; \}/i + From 71d837e61667f1d2aebb1fa68e1c1727d3fe1491 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:47:59 +0200 Subject: [PATCH 012/103] feat(processors/optimize.svg): add support --- processors/optimize.svg/mod.ts | 46 ++++++++++++++++++++++++++ processors/optimize.svg/tests/list.yml | 24 ++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 processors/optimize.svg/mod.ts create mode 100644 processors/optimize.svg/tests/list.yml diff --git a/processors/optimize.svg/mod.ts b/processors/optimize.svg/mod.ts new file mode 100644 index 00000000000..22a15cf7e6f --- /dev/null +++ b/processors/optimize.svg/mod.ts @@ -0,0 +1,46 @@ +// Imports +import { Processor, state } from "@processor" +import { optimize } from "y/svgo@3.0.2" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🧹 Optimize SVG" + + /** Category */ + readonly category = "optimizer" + + /** Description */ + readonly description = "Optimize SVG to reduce file size and improve rendering speed" + + /** Supports */ + readonly supports = ["image/svg+xml"] + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + const { data: optimized } = optimize(result.content, { + plugins: [ + { + name: "preset-default", + params: { + //Force CSS style consistency + overrides: { + inlineStyles: false, + removeViewBox: false, + }, + }, + }, + //Additional cleanup + "cleanupListOfValues", + "removeRasterImages", + "removeScriptElement", + ], + multipass: true, + }) + result.content = optimized + } +} diff --git a/processors/optimize.svg/tests/list.yml b/processors/optimize.svg/tests/list.yml new file mode 100644 index 00000000000..d00fe52784b --- /dev/null +++ b/processors/optimize.svg/tests/list.yml @@ -0,0 +1,24 @@ +- name: optimize + plugins: + - processors: + - id: inject.content + args: + content: + - id: optimize.svg + - id: assert + args: + select: main + match: /<.svg>/i + html: true + +- name: invalid svg + plugins: + - processors: + - id: inject.content + args: + content: + - id: optimize.svg + fatal: false + - id: assert + args: + error: true From d161d3e3bee1f9642b546f57d7f92e2e50d6072b Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:48:05 +0200 Subject: [PATCH 013/103] feat(processors/optimize.xml): add support --- processors/optimize.xml/mod.ts | 27 ++++++++++++++++++++++++++ processors/optimize.xml/tests/list.yml | 24 +++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 processors/optimize.xml/mod.ts create mode 100644 processors/optimize.xml/tests/list.yml diff --git a/processors/optimize.xml/mod.ts b/processors/optimize.xml/mod.ts new file mode 100644 index 00000000000..25f1c951249 --- /dev/null +++ b/processors/optimize.xml/mod.ts @@ -0,0 +1,27 @@ +// Imports +import { Processor, state } from "@processor" +import xmlFormat from "y/xml-formatter@3.5.0" + +/** Processor */ +export default class extends Processor { + /** Import meta */ + static readonly meta = import.meta + + /** Name */ + readonly name = "🧹 Optimize XML" + + /** Category */ + readonly category = "optimizer" + + /** Description */ + readonly description = "Format XML to improve diff readability and size" + + /** Supports */ + readonly supports = ["application/xml", "image/svg+xml"] + + /** Action */ + protected async action(state: state) { + const result = await this.piped(state) + result.content = xmlFormat(result.content, { indentation: " ", collapseContent: true, ignoredPaths: [] }) + } +} diff --git a/processors/optimize.xml/tests/list.yml b/processors/optimize.xml/tests/list.yml new file mode 100644 index 00000000000..f65949ac691 --- /dev/null +++ b/processors/optimize.xml/tests/list.yml @@ -0,0 +1,24 @@ +- name: optimize + plugins: + - processors: + - id: inject.content + args: + content: + - id: optimize.xml + - id: assert + args: + select: main + match: /<.span>/i + html: true + +- name: invalid svg + plugins: + - processors: + - id: inject.content + args: + content: + + + + + + + + \ No newline at end of file diff --git a/run/server/static/opengraph.png b/run/server/static/opengraph.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd369da5fe822e37684bcd604eba5207f3b6311 GIT binary patch literal 330860 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 z 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 literal 0 HcmV?d00001 From 11c4e2b2f4678abbe3ddbafdb0b5674f6c285899 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:50:20 +0200 Subject: [PATCH 025/103] chore: flags and tests --- run/flags.ts | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ run/mod_test.ts | 72 ++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 run/flags.ts create mode 100644 run/mod_test.ts diff --git a/run/flags.ts b/run/flags.ts new file mode 100644 index 00000000000..5e7e59c2e99 --- /dev/null +++ b/run/flags.ts @@ -0,0 +1,113 @@ +// Imports +import { join } from "std/path/join.ts" +import { parse } from "std/flags/mod.ts" +import { cwd, env } from "@utils/io.ts" + +// Flags +const { "allow-net": _net = [], "allow-sys": _sys = [], "allow-write": _write = [], "allow-run": _run = [], _: [subcommand, ...args], ..._flags } = parse(Deno.args, { + collect: ["allow-net", "allow-sys", "allow-write", "allow-run", "allow-ffi", "allow-hrtime"], +}) +if (!subcommand) { + console.log("echo 'missing subcommand'") +} + +// Paths +const PWD = env.get("PWD") ?? cwd() +const TMP = env.get("TMP") ?? join(PWD, "/.tmp") +const CACHE = join(PWD, "/node_modules/.cache") +if ((!PWD) || (!TMP)) { + console.log("echo 'missing PWD or TMP environment variables'") +} + +// Network +const net = new Set([ + // Dependencies + "deno.land/std", + "deno.land/x", + "esm.sh", + // Puppeteer + "127.0.0.1", + "edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing", + // User defined + ..._net, +]) + +// System +const sys = new Set([ + // Puppeteer (as SIGHUP is not implemented on Windows, it is needed to detect on which OS the app is runnnig) + "osRelease", + // User defined + ..._sys, +]) + +// Write +const write = new Set([ + // Dependencies + TMP, + // Puppeteer + join(CACHE, "chrome"), + // User defined + ..._write, +]) + +// Process +const run = new Set([ + // Puppeteer + join(CACHE, "chrome/win64-116.0.5845.96/chrome-win64/chrome.exe"), + // User defined + ..._run, +]) + +// Additional flags +const dflags = ["--allow-ffi", "--allow-hrtime", "--allow-all", "--watch", "--no-check", "--reload"] + +// Additional arguments based on sub command +switch (subcommand) { + case "test": + // processors/render.gemojis + net.add("api.github.com/emojis") + // processors/render.twemojis + net.add("cdn.jsdelivr.net") + // + write.add(PWD) + // Arguments + args.unshift( + "--seed=0", + "--trace-ops", + "--parallel", + "--coverage=.coverage", + "--doc", + "--shuffle", + ) + dflags.push("--fail-fast", "--filter") + break + case "run": + // GitHub API + net.add("api.github.com") + // Github OAuth + net.add("github.com/login/oauth") + break +} +const flags = { + deno: Object.entries(_flags).filter(([k]) => dflags.includes(`--${k}`)).map(([k, v]) => `--${k}${v !== true ? `=${v}` : ""}`), + user: Object.entries(_flags).filter(([k]) => !dflags.includes(`--${k}`)).map(([k, v]) => `--${k}${v !== true ? `=${v}` : ""}`), +} + +// Command +console.log([ + // Subcommand + "deno", + subcommand, + // Minimal permissions + "--allow-env", + "--allow-read", + // Granular permissions + `--allow-net=${[...net]}`, + `--allow-write=${[...write]}`, + `--allow-run=${[...run]}`, + `--allow-sys=${[...sys]}`, + // Additional arguments + ...flags.deno, + ...args, + ...flags.user, +].join(" ")) diff --git a/run/mod_test.ts b/run/mod_test.ts new file mode 100644 index 00000000000..95bcd2b176b --- /dev/null +++ b/run/mod_test.ts @@ -0,0 +1,72 @@ +//Imports +import { assert, describe, it } from "@testing" +import { Plugin } from "@plugin" +import { Processor } from "@processor" +import { process } from "@metrics/process.ts" +import { deepMerge } from "std/collections/deep_merge.ts" +import { Browser } from "@utils/browser.ts" + +/** Test preset */ +const config = { + presets: { + default: { + plugins: { + logs: "none", + mock: true, + fatal: true, + retries: { attempts: 1, delay: 0 }, + }, + get processors() { + return this.plugins + }, + }, + }, +} + +// Disable shared browser so each test is self-contained +Browser.shared = false + +//TODO(@lowlighter): test for engine +//TODO(@lowlighter): check if puppeteer leaking test is fixable... +const options = { sanitizeResources: false, sanitizeOps: false } + +// Plugins +for (const id of await Plugin.list()) { + const plugin = await Plugin.load({ id }) + const tests = await plugin.tests() + const templates = await plugin.templates() + const name = `${plugin.icon} plugins/${plugin.id}` + if (!tests.length) { + it.skip(name, () => void null) + continue + } + describe({ ...options, name }, () => { + for (const test of tests) { + describe(test.name, () => { + for (const template of templates) { + it(template, async () => { + assert(await process(deepMerge({ presets: { default: { plugins: { template } } } }, deepMerge(config, test, { arrays: "replace" })))) + }) + } + }) + } + }) +} + +// Processors +for (const id of await Processor.list()) { + const processor = await Processor.load({ id }) + const tests = await processor.tests() + const name = `${processor.icon} processors/${processor.id}` + if (!tests.length) { + it.skip(name, () => void null) + continue + } + describe({ ...options, name }, () => { + for (const test of tests) { + it(test.name, async () => { + assert(await process(deepMerge(config, test, { arrays: "replace" }))) + }) + } + }) +} From 3330c236fb0528564b5b46ef509523640b1b13c6 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 08:10:25 +0200 Subject: [PATCH 026/103] refactor: move code to source/ and use deno kv for sessions --- .github/workflows/ci.yml | 4 +- .gitignore | 2 + deno.jsonc | 22 ++-- deno.lock | 119 ++++++++++++++++++ .../metrics}/components/component.ts | 0 .../metrics}/components/internal.ts | 0 .../metrics}/components/plugin.ts | 1 - .../metrics}/components/processor.ts | 0 .../metrics}/components/requests.ts | 3 +- {metrics => source/metrics}/config.ts | 11 +- {metrics => source/metrics}/metadata.ts | 0 {metrics => source/metrics}/process.ts | 0 {metrics => source/metrics}/utils/browser.ts | 0 {metrics => source/metrics}/utils/errors.ts | 0 {metrics => source/metrics}/utils/format.ts | 0 {metrics => source/metrics}/utils/graph.ts | 0 {metrics => source/metrics}/utils/io.ts | 0 {metrics => source/metrics}/utils/log.ts | 0 {metrics => source/metrics}/utils/parse.ts | 0 {metrics => source/metrics}/utils/testing.ts | 0 .../metrics}/utils/validator.ts | 0 {metrics => source/metrics}/version.ts | 0 {plugins => source/plugins}/calendar/mod.ts | 0 .../calendar/queries/calendar.graphql | 0 .../plugins}/calendar/queries/colors.graphql | 0 .../plugins}/calendar/queries/user.graphql | 0 .../plugins}/calendar/templates/classic.ejs | 0 .../calendar/tests/calendar.graphql.ts | 0 .../plugins}/calendar/tests/colors.graphql.ts | 0 .../plugins}/calendar/tests/list.yml | 0 .../plugins}/calendar/tests/user.graphql.ts | 0 {plugins => source/plugins}/gists/mod.ts | 0 .../plugins}/gists/queries/gists.graphql | 0 .../plugins}/gists/templates/classic.ejs | 0 .../plugins}/gists/tests/gists.graphql.ts | 0 .../plugins}/gists/tests/list.yml | 0 .../plugins}/introduction/mod.ts | 0 .../introduction/queries/organization.graphql | 0 .../introduction/queries/repository.graphql | 0 .../introduction/queries/user.graphql | 0 .../introduction/templates/classic.ejs | 0 .../plugins}/introduction/tests/list.yml | 0 .../tests/organization.graphql.ts | 0 .../introduction/tests/repository.graphql.ts | 0 .../introduction/tests/user.graphql.ts | 0 {plugins => source/plugins}/rss/mod.ts | 0 .../plugins}/rss/templates/classic.ejs | 0 .../plugins}/rss/tests/list.yml | 0 .../plugins}/rss/tests/rss.http.ts | 0 .../plugins}/webscraping/mod.ts | 0 .../webscraping/templates/classic.ejs | 0 .../plugins}/webscraping/tests/example.html | 0 .../plugins}/webscraping/tests/example.png | Bin .../plugins}/webscraping/tests/list.yml | 0 .../processors}/assert/mod.ts | 0 .../processors}/assert/tests/list.yml | 0 .../processors}/inject.content/mod.ts | 0 .../processors}/inject.content/tests/list.yml | 0 .../processors}/inject.script/mod.ts | 0 .../processors}/inject.script/tests/list.yml | 0 .../processors}/inject.style/mod.ts | 0 .../processors}/inject.style/tests/list.yml | 0 .../processors}/optimize.css/mod.ts | 0 .../processors}/optimize.css/tests/list.yml | 0 .../processors}/optimize.svg/mod.ts | 0 .../processors}/optimize.svg/tests/list.yml | 0 .../processors}/optimize.xml/mod.ts | 0 .../processors}/optimize.xml/tests/list.yml | 0 .../processors}/publish.console/mod.ts | 0 .../publish.console/tests/list.yml | 0 .../processors}/publish.file/mod.ts | 0 .../processors}/publish.file/tests/list.yml | 0 .../processors}/publish.gist/mod.ts | 0 .../processors}/publish.gist/tests/list.yml | 0 .../processors}/publish.gist/tests/rest.ts | 0 .../processors}/publish.git/mod.ts | 0 .../publish.git/queries/commit.graphql | 0 .../publish.git/queries/createref.graphql | 0 .../publish.git/queries/head.graphql | 0 .../publish.git/queries/pullrequest.graphql | 0 .../publish.git/queries/repository.graphql | 0 .../publish.git/tests/commit.graphql.ts | 0 .../publish.git/tests/createref.graphql.ts | 0 .../publish.git/tests/head.graphql.ts | 0 .../processors}/publish.git/tests/list.yml | 0 .../processors}/render.gemojis/mod.ts | 0 .../processors}/render.gemojis/tests/list.yml | 0 .../processors}/render.octicons/mod.ts | 0 .../render.octicons/tests/list.yml | 0 .../processors}/render.twemojis/mod.ts | 0 .../render.twemojis/tests/list.yml | 0 .../processors}/render/mod.ts | 9 +- .../render/templates/classic/styles.css | 0 .../processors}/render/templates/html.ejs | 0 .../processors}/render/templates/json.ejs | 0 .../processors}/render/templates/svg.ejs | 0 .../processors}/render/tests/list.yml | 0 {run => source/run}/action/mod.ts | 0 {run => source/run}/cli/mod.ts | 0 {run => source/run}/flags.ts | 4 + {run => source/run}/mod_test.ts | 0 {run => source/run}/server/mod.ts | 76 ++++++----- {run => source/run}/server/static/favicon.png | Bin {run => source/run}/server/static/index.html | 0 .../run}/server/static/opengraph.png | Bin 105 files changed, 195 insertions(+), 56 deletions(-) rename {metrics => source/metrics}/components/component.ts (100%) rename {metrics => source/metrics}/components/internal.ts (100%) rename {metrics => source/metrics}/components/plugin.ts (99%) rename {metrics => source/metrics}/components/processor.ts (100%) rename {metrics => source/metrics}/components/requests.ts (98%) rename {metrics => source/metrics}/config.ts (93%) rename {metrics => source/metrics}/metadata.ts (100%) rename {metrics => source/metrics}/process.ts (100%) rename {metrics => source/metrics}/utils/browser.ts (100%) rename {metrics => source/metrics}/utils/errors.ts (100%) rename {metrics => source/metrics}/utils/format.ts (100%) rename {metrics => source/metrics}/utils/graph.ts (100%) rename {metrics => source/metrics}/utils/io.ts (100%) rename {metrics => source/metrics}/utils/log.ts (100%) rename {metrics => source/metrics}/utils/parse.ts (100%) rename {metrics => source/metrics}/utils/testing.ts (100%) rename {metrics => source/metrics}/utils/validator.ts (100%) rename {metrics => source/metrics}/version.ts (100%) rename {plugins => source/plugins}/calendar/mod.ts (100%) rename {plugins => source/plugins}/calendar/queries/calendar.graphql (100%) rename {plugins => source/plugins}/calendar/queries/colors.graphql (100%) rename {plugins => source/plugins}/calendar/queries/user.graphql (100%) rename {plugins => source/plugins}/calendar/templates/classic.ejs (100%) rename {plugins => source/plugins}/calendar/tests/calendar.graphql.ts (100%) rename {plugins => source/plugins}/calendar/tests/colors.graphql.ts (100%) rename {plugins => source/plugins}/calendar/tests/list.yml (100%) rename {plugins => source/plugins}/calendar/tests/user.graphql.ts (100%) rename {plugins => source/plugins}/gists/mod.ts (100%) rename {plugins => source/plugins}/gists/queries/gists.graphql (100%) rename {plugins => source/plugins}/gists/templates/classic.ejs (100%) rename {plugins => source/plugins}/gists/tests/gists.graphql.ts (100%) rename {plugins => source/plugins}/gists/tests/list.yml (100%) rename {plugins => source/plugins}/introduction/mod.ts (100%) rename {plugins => source/plugins}/introduction/queries/organization.graphql (100%) rename {plugins => source/plugins}/introduction/queries/repository.graphql (100%) rename {plugins => source/plugins}/introduction/queries/user.graphql (100%) rename {plugins => source/plugins}/introduction/templates/classic.ejs (100%) rename {plugins => source/plugins}/introduction/tests/list.yml (100%) rename {plugins => source/plugins}/introduction/tests/organization.graphql.ts (100%) rename {plugins => source/plugins}/introduction/tests/repository.graphql.ts (100%) rename {plugins => source/plugins}/introduction/tests/user.graphql.ts (100%) rename {plugins => source/plugins}/rss/mod.ts (100%) rename {plugins => source/plugins}/rss/templates/classic.ejs (100%) rename {plugins => source/plugins}/rss/tests/list.yml (100%) rename {plugins => source/plugins}/rss/tests/rss.http.ts (100%) rename {plugins => source/plugins}/webscraping/mod.ts (100%) rename {plugins => source/plugins}/webscraping/templates/classic.ejs (100%) rename {plugins => source/plugins}/webscraping/tests/example.html (100%) rename {plugins => source/plugins}/webscraping/tests/example.png (100%) rename {plugins => source/plugins}/webscraping/tests/list.yml (100%) rename {processors => source/processors}/assert/mod.ts (100%) rename {processors => source/processors}/assert/tests/list.yml (100%) rename {processors => source/processors}/inject.content/mod.ts (100%) rename {processors => source/processors}/inject.content/tests/list.yml (100%) rename {processors => source/processors}/inject.script/mod.ts (100%) rename {processors => source/processors}/inject.script/tests/list.yml (100%) rename {processors => source/processors}/inject.style/mod.ts (100%) rename {processors => source/processors}/inject.style/tests/list.yml (100%) rename {processors => source/processors}/optimize.css/mod.ts (100%) rename {processors => source/processors}/optimize.css/tests/list.yml (100%) rename {processors => source/processors}/optimize.svg/mod.ts (100%) rename {processors => source/processors}/optimize.svg/tests/list.yml (100%) rename {processors => source/processors}/optimize.xml/mod.ts (100%) rename {processors => source/processors}/optimize.xml/tests/list.yml (100%) rename {processors => source/processors}/publish.console/mod.ts (100%) rename {processors => source/processors}/publish.console/tests/list.yml (100%) rename {processors => source/processors}/publish.file/mod.ts (100%) rename {processors => source/processors}/publish.file/tests/list.yml (100%) rename {processors => source/processors}/publish.gist/mod.ts (100%) rename {processors => source/processors}/publish.gist/tests/list.yml (100%) rename {processors => source/processors}/publish.gist/tests/rest.ts (100%) rename {processors => source/processors}/publish.git/mod.ts (100%) rename {processors => source/processors}/publish.git/queries/commit.graphql (100%) rename {processors => source/processors}/publish.git/queries/createref.graphql (100%) rename {processors => source/processors}/publish.git/queries/head.graphql (100%) rename {processors => source/processors}/publish.git/queries/pullrequest.graphql (100%) rename {processors => source/processors}/publish.git/queries/repository.graphql (100%) rename {processors => source/processors}/publish.git/tests/commit.graphql.ts (100%) rename {processors => source/processors}/publish.git/tests/createref.graphql.ts (100%) rename {processors => source/processors}/publish.git/tests/head.graphql.ts (100%) rename {processors => source/processors}/publish.git/tests/list.yml (100%) rename {processors => source/processors}/render.gemojis/mod.ts (100%) rename {processors => source/processors}/render.gemojis/tests/list.yml (100%) rename {processors => source/processors}/render.octicons/mod.ts (100%) rename {processors => source/processors}/render.octicons/tests/list.yml (100%) rename {processors => source/processors}/render.twemojis/mod.ts (100%) rename {processors => source/processors}/render.twemojis/tests/list.yml (100%) rename {processors => source/processors}/render/mod.ts (94%) rename {processors => source/processors}/render/templates/classic/styles.css (100%) rename {processors => source/processors}/render/templates/html.ejs (100%) rename {processors => source/processors}/render/templates/json.ejs (100%) rename {processors => source/processors}/render/templates/svg.ejs (100%) rename {processors => source/processors}/render/tests/list.yml (100%) rename {run => source/run}/action/mod.ts (100%) rename {run => source/run}/cli/mod.ts (100%) rename {run => source/run}/flags.ts (97%) rename {run => source/run}/mod_test.ts (100%) rename {run => source/run}/server/mod.ts (85%) rename {run => source/run}/server/static/favicon.png (100%) rename {run => source/run}/server/static/index.html (100%) rename {run => source/run}/server/static/opengraph.png (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f531ce47253..9b0c41960f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,10 +2,10 @@ name: Continuous integration on: push: branches: - - v4 + - v4-dev pull_request: branches: - - v4 + - v4-dev jobs: testing: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 98bb56289f4..00e0cce03d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .coverage .test +.kv +.kv-* node_modules metrics.config.yml diff --git a/deno.jsonc b/deno.jsonc index d6b66d04a38..7716a35d224 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -5,22 +5,23 @@ "std/": "https://deno.land/std@0.201.0/", "x/": "https://deno.land/x/", "y/": "https://esm.sh/", - "@metrics/": "./metrics/", - "@utils/": "./metrics/utils/", - "@testing": "./metrics/utils/testing.ts", - "@plugin": "./metrics/components/plugin.ts", - "@processor": "./metrics/components/processor.ts", - "@plugins/": "./plugins/", - "@processors/": "./processors/" + "@metrics/": "./source/metrics/", + "@utils/": "./source/metrics/utils/", + "@testing": "./source/metrics/utils/testing.ts", + "@plugin": "./source/metrics/components/plugin.ts", + "@processor": "./source/metrics/components/processor.ts", + "@plugins/": "./source/plugins/", + "@processors/": "./source/processors/" }, "nodeModulesDir": true, "tasks": { - "serve": "$(deno run --allow-env run/flags.ts --allow-net=localhost run run/server/mod.ts --watch $0)", - "test": "$(deno run --allow-env run/flags.ts test run/mod_test.ts $0)", + "serve": "$(deno run --allow-env source/run/flags.ts --allow-net=localhost run source/run/server/mod.ts --watch $0)", + "test": "$(deno run --allow-env source/run/flags.ts test source/run/mod_test.ts $0)", "coverage": "rm .coverage -rf && deno task test $0 && deno coverage .coverage", "lint": "deno lint", "fmt": "deno fmt", - "hook": "deno task lint && deno task fmt --check && deno task test" + "hook": "deno task lint && deno task fmt --check && deno task test", + "deploy": "deployctl deploy --project=metrics --include=source,deno.jsonc,LICENSE --prod source/run/server/mod.ts" }, "lint": { "rules": { @@ -45,6 +46,7 @@ "compilerOptions": { "lib": [ "deno.ns", + "deno.unstable", "dom", "dom.asynciterable", "dom.iterable" diff --git a/deno.lock b/deno.lock index b2bbd170134..8e2665aa2b1 100644 --- a/deno.lock +++ b/deno.lock @@ -726,6 +726,7 @@ } }, "redirects": { + "https://deno.land/x/import/mod.ts": "https://deno.land/x/import@0.2.1/mod.ts", "https://esm.sh/@octokit/auth-app": "https://esm.sh/@octokit/auth-app@6.0.0", "https://esm.sh/@octokit/core": "https://esm.sh/@octokit/core@5.0.0", "https://esm.sh/octokit": "https://esm.sh/octokit@3.1.0", @@ -737,9 +738,55 @@ }, "remote": { "https://api.github.com/emojis": "9d2b0d98d88cf1e20ad659bdc6ce67219eac949c598b7d6b58c6284092a385d7", + "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", + "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", + "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", + "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", + "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", + "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", + "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", + "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", + "https://deno.land/std@0.140.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", + "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", + "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", + "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", + "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", + "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", + "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", + "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", + "https://deno.land/std@0.173.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", + "https://deno.land/std@0.173.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.173.0/encoding/base32.ts": "cb15f16e53c580d2491637280302bc6cfeb48f8911521ea9c7895ba513a2bcc5", + "https://deno.land/std@0.173.0/encoding/jsonc.ts": "02b86115d2b812f26789481ebcf4748171e8ece6514b60243b3733e2c200876a", + "https://deno.land/std@0.173.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", + "https://deno.land/std@0.173.0/fs/copy.ts": "14214efd94fc3aa6db1e4af2b4b9578e50f7362b7f3725d5a14ad259a5df26c8", + "https://deno.land/std@0.173.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", + "https://deno.land/std@0.173.0/fs/ensure_dir.ts": "724209875497a6b4628dfb256116e5651c4f7816741368d6c44aab2531a1e603", + "https://deno.land/std@0.173.0/fs/ensure_file.ts": "c38602670bfaf259d86ca824a94e6cb9e5eb73757fefa4ebf43a90dd017d53d9", + "https://deno.land/std@0.173.0/fs/ensure_link.ts": "c0f5b2f0ec094ed52b9128eccb1ee23362a617457aa0f699b145d4883f5b2fb4", + "https://deno.land/std@0.173.0/fs/ensure_symlink.ts": "2955cc8332aeca9bdfefd05d8d3976b94e282b0f353392a71684808ed2ffdd41", + "https://deno.land/std@0.173.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", + "https://deno.land/std@0.173.0/fs/exists.ts": "b8c8a457b71e9d7f29b9d2f87aad8dba2739cbe637e8926d6ba6e92567875f8e", + "https://deno.land/std@0.173.0/fs/expand_glob.ts": "45d17e89796a24bd6002e4354eda67b4301bb8ba67d2cac8453cdabccf1d9ab0", + "https://deno.land/std@0.173.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", + "https://deno.land/std@0.173.0/fs/move.ts": "4cb47f880e3f0582c55e71c9f8b1e5e8cfaacb5e84f7390781dd563b7298ec19", + "https://deno.land/std@0.173.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", + "https://deno.land/std@0.173.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.173.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.173.0/path/_util.ts": "86c2375a996c1931b2f2ac71fefd5ddf0cf0e579fa4ab12d3e4c552d4223b8d8", + "https://deno.land/std@0.173.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.173.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.173.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232", + "https://deno.land/std@0.173.0/path/posix.ts": "0874b341c2c6968ca38d323338b8b295ea1dae10fa872a768d812e2e7d634789", + "https://deno.land/std@0.173.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.173.0/path/win32.ts": "672942919dd66ce1b8c224e77d3447e2ad8254eaff13fe6946420a9f78fa141e", "https://deno.land/std@0.194.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", "https://deno.land/std@0.194.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", "https://deno.land/std@0.194.0/io/buffer.ts": "17f4410eaaa60a8a85733e8891349a619eadfbbe42e2f319283ce2b8f29723ab", @@ -779,6 +826,44 @@ "https://deno.land/std@0.194.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", "https://deno.land/std@0.194.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", "https://deno.land/std@0.194.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/std@0.198.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.198.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.198.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.198.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.198.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.198.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.198.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.198.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.198.0/path/_from_file_url.ts": "7e4e5626089785adddb061f1b9f4932d6b21c7df778e7449531a11e32048245c", + "https://deno.land/std@0.198.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.198.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.198.0/path/_join.ts": "fd78555bc34d5f188918fc7018dfe8fe2df5bbad94a3b30a433666c03934d77f", + "https://deno.land/std@0.198.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.198.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.198.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.198.0/path/_resolve.ts": "3bf0287d62488cad08c3c219a9708c4a4c658c65d7b4400fd99afdc3ba10a64d", + "https://deno.land/std@0.198.0/path/_to_file_url.ts": "739bfda583598790b2e77ce227f2bb618f6ebdb939788cea47555b43970ec58c", + "https://deno.land/std@0.198.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.198.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.198.0/path/basename.ts": "6f08fbb90dbfcf320765b3abb01f995b1723f75e2534acfd5380e202c802a3aa", + "https://deno.land/std@0.198.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.198.0/path/dirname.ts": "098996822a31b4c46e1eb52a19540d3c6f9f54b772fc8a197939eeabc29fca2f", + "https://deno.land/std@0.198.0/path/extname.ts": "9b83c62fd16505739541f7a3ab447d8972da39dbf668d47af2f93206c2480893", + "https://deno.land/std@0.198.0/path/format.ts": "cb22f95cc7853d590b87708cc9441785e760d711188facff3d225305a8213aca", + "https://deno.land/std@0.198.0/path/from_file_url.ts": "a6221cfc928928ec4d9786d767dfac98fa2ab746af0786446c9834a07b98817e", + "https://deno.land/std@0.198.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.198.0/path/is_absolute.ts": "6b3d36352eb7fa29edb53f9e7b09b1aeb022a3c5465764f6cc5b8c41f9736197", + "https://deno.land/std@0.198.0/path/join.ts": "4a2867ff2f3c81ffc9eb3d56dade16db6f8bd3854f269306d23dad4115089c84", + "https://deno.land/std@0.198.0/path/mod.ts": "7765507696cb321994cdacfc19ee3ba61e8e3ebf4bd98fa75a276cf5dc18ce2a", + "https://deno.land/std@0.198.0/path/normalize.ts": "7d992cd262b2deefa842d93a8ba2ed51f3949ba595b1d07f627ac2cddbc74808", + "https://deno.land/std@0.198.0/path/parse.ts": "031fe488b3497fb8312fc1dc3c3d6c2d80707edd9c661e18ee9fd20f95edf322", + "https://deno.land/std@0.198.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.198.0/path/relative.ts": "7db80c5035016174267da16321a742d76e875215c317859a383b12f413c6f5d6", + "https://deno.land/std@0.198.0/path/resolve.ts": "103b62207726a27f28177f397008545804ecb20aaf00623af1f622b18cd80b9f", + "https://deno.land/std@0.198.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.198.0/path/to_file_url.ts": "dd32f7a01bbf3b15b5df46796659984b372973d9b2d7d59bcf0eb990763a0cb5", + "https://deno.land/std@0.198.0/path/to_namespaced_path.ts": "4e643ab729bf49ccdc166ad48d2de262ff462938fcf2a44a4425588f4a0bd690", + "https://deno.land/std@0.198.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", @@ -1017,6 +1102,12 @@ "https://deno.land/std@0.201.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", "https://deno.land/std@0.201.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", "https://deno.land/std@0.201.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/std@0.203.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.203.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", + "https://deno.land/std@0.203.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.203.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.203.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.203.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", "https://deno.land/std@0.91.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", "https://deno.land/std@0.91.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", "https://deno.land/std@0.91.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", @@ -1066,6 +1157,16 @@ "https://deno.land/std@0.93.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", "https://deno.land/x/cache@0.2.12/deps.ts": "f992c28c82770eab287f0ea332eae502e397c78e5f27a0a4512f59dd54dee865", "https://deno.land/x/cache@0.2.12/directories.ts": "ef48531cab3f827252e248596d15cede0de179a2fb15392ae24cf8034519994f", + "https://deno.land/x/deno_cache@0.4.1/auth_tokens.ts": "5fee7e9155e78cedf3f6ff3efacffdb76ac1a76c86978658d9066d4fb0f7326e", + "https://deno.land/x/deno_cache@0.4.1/cache.ts": "51f72f4299411193d780faac8c09d4e8cbee951f541121ef75fcc0e94e64c195", + "https://deno.land/x/deno_cache@0.4.1/deno_dir.ts": "f2a9044ce8c7fe1109004cda6be96bf98b08f478ce77e7a07f866eff1bdd933f", + "https://deno.land/x/deno_cache@0.4.1/deps.ts": "8974097d6c17e65d9a82d39377ae8af7d94d74c25c0cbb5855d2920e063f2343", + "https://deno.land/x/deno_cache@0.4.1/dirs.ts": "d2fa473ef490a74f2dcb5abb4b9ab92a48d2b5b6320875df2dee64851fa64aa9", + "https://deno.land/x/deno_cache@0.4.1/disk_cache.ts": "1f3f5232cba4c56412d93bdb324c624e95d5dd179d0578d2121e3ccdf55539f9", + "https://deno.land/x/deno_cache@0.4.1/file_fetcher.ts": "07a6c5f8fd94bf50a116278cc6012b4921c70d2251d98ce1c9f3c352135c39f7", + "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", + "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", + "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", "https://deno.land/x/deno_dom@v0.1.38/build/deno-wasm/deno-wasm.js": "98b1ad24a1c13284557917659402202e5c5258ab1431b3f3a82434ad36ffa05a", "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts": "bfd999a493a6974e9fca4d331bee03bfb68cfc600c662cd0b48b21d67a2a8ba0", "https://deno.land/x/deno_dom@v0.1.38/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7", @@ -1118,6 +1219,24 @@ "https://deno.land/x/deno_image@0.0.4/mime-type.ts": "f6cbba14a3a6503554113bf6f9acae8fd6112245e1e659a922828fc2acab1d1f", "https://deno.land/x/deno_image@0.0.4/mod.ts": "ff0028d3593dc470ddddba3ee6701f340ade4e9af5a9068272539589b42d6d0a", "https://deno.land/x/deno_image@0.0.4/types.ts": "2c731878a70c232a710fc1fb650a01765d87cb31dcd07dc1561875a5ad486d20", + "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", + "https://deno.land/x/esbuild@v0.19.1/mod.js": "37937134e2c363c2afd42bf83640b6cf8296403a4711b27318fb45a7c9f12c31", + "https://deno.land/x/esbuild@v0.19.1/wasm.js": "6f2b5d809456db4ebb9f8fbfd8120b5b00d095cad760eb1041572e521157a69b", + "https://deno.land/x/esbuild@v0.19.4/mod.js": "6277018cfbcad3912fd346409e0b2a9807cf10c9555a15e4aac299b3194fa4fb", + "https://deno.land/x/esbuild@v0.19.4/wasm.js": "14e8be187eaed201e71dc04f20884403566d57150ca9723bb914651820a1f1c0", + "https://deno.land/x/esbuild_deno_loader@0.8.1/deps.ts": "987b50a1a921fcc84ddfcf1a1256cb955f6b16acac28a3fc77901c12c0752173", + "https://deno.land/x/esbuild_deno_loader@0.8.1/mod.ts": "28524460bef46d487221b01ade6ed913d2e127de7eeee025ab75b34b491283da", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/deno.ts": "b0af3e430c068f18c6fa48c2083a1b4354b6c303e16fb37855e02fcafb95f36d", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/loader_native.ts": "0289d8708f47c876d6a4280592a8a12bb2d29676fedf25ddf222ecd6a1bb0bd8", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/loader_portable.ts": "d999f452ef3d8ec2dd3c8443f542adf57efc8a2cd59b29cc41f5b3d7dff512e5", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/plugin_deno_loader.ts": "166356133ee63d80e5559a10c18e10b625da96e39a4518b8c7adfef718bb4e32", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/plugin_deno_resolver.ts": "0449ed23ae93db1ec74d015a46934aefd7ba7a8f719f7a4980b616cb3f5bbee4", + "https://deno.land/x/esbuild_deno_loader@0.8.1/src/shared.ts": "33052684aeb542ebd24da372816bbbf885cd090a7ab0fde7770801f7f5b49572", + "https://deno.land/x/import@0.2.1/mod.ts": "574a255ac7f454c99df6497b28a85197929a91772048c9c0eae59f5227502a0d", + "https://deno.land/x/importmap@0.2.1/_util.ts": "ada9a9618b537e6c0316c048a898352396c882b9f2de38aba18fd3f2950ede89", + "https://deno.land/x/importmap@0.2.1/mod.ts": "ae3d1cd7eabd18c01a4960d57db471126b020f23b37ef14e1359bbb949227ade", "https://deno.land/x/jose@v4.14.6/jws/compact/sign.ts": "1e88d19dc26d3ea5f2ce3da989813daf5c555d8dec6528051530f7b5a3e87bae", "https://deno.land/x/jose@v4.14.6/jws/flattened/sign.ts": "be5db0e622a6c5b1e905338d33851e89e956350c9d774de50c70f30a6a156356", "https://deno.land/x/jose@v4.14.6/jwt/produce.ts": "dfe55ae98056a40be6fda924144c0656bb19c8bbf3fe35d842efe2d1545df3e4", diff --git a/metrics/components/component.ts b/source/metrics/components/component.ts similarity index 100% rename from metrics/components/component.ts rename to source/metrics/components/component.ts diff --git a/metrics/components/internal.ts b/source/metrics/components/internal.ts similarity index 100% rename from metrics/components/internal.ts rename to source/metrics/components/internal.ts diff --git a/metrics/components/plugin.ts b/source/metrics/components/plugin.ts similarity index 99% rename from metrics/components/plugin.ts rename to source/metrics/components/plugin.ts index 10f04956b35..46ba4a92464 100644 --- a/metrics/components/plugin.ts +++ b/source/metrics/components/plugin.ts @@ -24,7 +24,6 @@ export abstract class Plugin extends Component { for (const log of [this, this.requests] as unknown as Array<{ log: Component["log"] }>) { Object.assign(log, { log: this.log.with({ handle: this.context.handle, entity: this.context.entity }) }) } - delete (this.context as { token?: string }).token this.log.trace("instantiated") } diff --git a/metrics/components/processor.ts b/source/metrics/components/processor.ts similarity index 100% rename from metrics/components/processor.ts rename to source/metrics/components/processor.ts diff --git a/metrics/components/requests.ts b/source/metrics/components/requests.ts similarity index 98% rename from metrics/components/requests.ts rename to source/metrics/components/requests.ts index 0c1de9a549a..2f7cbf23312 100644 --- a/metrics/components/requests.ts +++ b/source/metrics/components/requests.ts @@ -22,11 +22,10 @@ export class Requests extends Internal { Object.assign(this, { meta }) this.octokit = new (Octokit.plugin(paginateGraphql))({ userAgent: `metrics/${version}`, - auth: this.context.token, + auth: this.context.token?.read(), timeZone: this.context.timezone, baseUrl: this.context.api, }) - delete (this.context as { token?: string }).token } /** Octokit SDK */ diff --git a/metrics/config.ts b/source/metrics/config.ts similarity index 93% rename from metrics/config.ts rename to source/metrics/config.ts index 19158bae543..bcbb552aefb 100644 --- a/metrics/config.ts +++ b/source/metrics/config.ts @@ -1,6 +1,8 @@ // Imports import { is } from "@utils/validator.ts" import { deepMerge } from "std/collections/deep_merge.ts" +import { Secret } from "@utils/secret.ts" +import { env } from "@utils/io.ts" //TODO(@lowlighter): some cleanup needed here and description to complete @@ -14,6 +16,9 @@ const loglevel = { server: "trace", } as const +/** Secret */ +const secret = is.preprocess((value) => value instanceof Secret ? value : new Secret(value), is.instanceof(Secret)) + /** Internal component config */ export const internal = is.object({ logs: is.enum(["none", "error", "warn", "info", "message", "debug", "trace"]), @@ -33,7 +38,7 @@ export const component = internal.extend({ export const requests = internal.extend({ mock: is.coerce.boolean(), api: is.coerce.string(), - token: is.coerce.string(), + token: secret, timezone: is.coerce.string(), }) @@ -78,7 +83,7 @@ const _plugin_nop = _plugin.omit({ id: true, retries: true, template: true, rend const _preset_plugin = is.object({ logs: _plugin.shape.logs.default(loglevel.presets), api: _plugin.shape.api.default("https://api.github.com"), - token: _plugin.shape.token.default(""), + token: _plugin.shape.token.default(env.get("METRICS_GITHUB_TOKEN") ?? ""), handle: _plugin.shape.handle.default(""), entity: _plugin.shape.entity.default("user"), template: _plugin.shape.template.default("classic"), @@ -156,7 +161,7 @@ export const server = internal.extend({ id: is.coerce.number(), private_key_path: is.coerce.string(), client_id: is.coerce.string(), - client_secret: is.coerce.string(), + client_secret: secret.default(env.get("METRICS_GITHUB_APP_SECRET") ?? ""), }).nullable().optional(), }) diff --git a/metrics/metadata.ts b/source/metrics/metadata.ts similarity index 100% rename from metrics/metadata.ts rename to source/metrics/metadata.ts diff --git a/metrics/process.ts b/source/metrics/process.ts similarity index 100% rename from metrics/process.ts rename to source/metrics/process.ts diff --git a/metrics/utils/browser.ts b/source/metrics/utils/browser.ts similarity index 100% rename from metrics/utils/browser.ts rename to source/metrics/utils/browser.ts diff --git a/metrics/utils/errors.ts b/source/metrics/utils/errors.ts similarity index 100% rename from metrics/utils/errors.ts rename to source/metrics/utils/errors.ts diff --git a/metrics/utils/format.ts b/source/metrics/utils/format.ts similarity index 100% rename from metrics/utils/format.ts rename to source/metrics/utils/format.ts diff --git a/metrics/utils/graph.ts b/source/metrics/utils/graph.ts similarity index 100% rename from metrics/utils/graph.ts rename to source/metrics/utils/graph.ts diff --git a/metrics/utils/io.ts b/source/metrics/utils/io.ts similarity index 100% rename from metrics/utils/io.ts rename to source/metrics/utils/io.ts diff --git a/metrics/utils/log.ts b/source/metrics/utils/log.ts similarity index 100% rename from metrics/utils/log.ts rename to source/metrics/utils/log.ts diff --git a/metrics/utils/parse.ts b/source/metrics/utils/parse.ts similarity index 100% rename from metrics/utils/parse.ts rename to source/metrics/utils/parse.ts diff --git a/metrics/utils/testing.ts b/source/metrics/utils/testing.ts similarity index 100% rename from metrics/utils/testing.ts rename to source/metrics/utils/testing.ts diff --git a/metrics/utils/validator.ts b/source/metrics/utils/validator.ts similarity index 100% rename from metrics/utils/validator.ts rename to source/metrics/utils/validator.ts diff --git a/metrics/version.ts b/source/metrics/version.ts similarity index 100% rename from metrics/version.ts rename to source/metrics/version.ts diff --git a/plugins/calendar/mod.ts b/source/plugins/calendar/mod.ts similarity index 100% rename from plugins/calendar/mod.ts rename to source/plugins/calendar/mod.ts diff --git a/plugins/calendar/queries/calendar.graphql b/source/plugins/calendar/queries/calendar.graphql similarity index 100% rename from plugins/calendar/queries/calendar.graphql rename to source/plugins/calendar/queries/calendar.graphql diff --git a/plugins/calendar/queries/colors.graphql b/source/plugins/calendar/queries/colors.graphql similarity index 100% rename from plugins/calendar/queries/colors.graphql rename to source/plugins/calendar/queries/colors.graphql diff --git a/plugins/calendar/queries/user.graphql b/source/plugins/calendar/queries/user.graphql similarity index 100% rename from plugins/calendar/queries/user.graphql rename to source/plugins/calendar/queries/user.graphql diff --git a/plugins/calendar/templates/classic.ejs b/source/plugins/calendar/templates/classic.ejs similarity index 100% rename from plugins/calendar/templates/classic.ejs rename to source/plugins/calendar/templates/classic.ejs diff --git a/plugins/calendar/tests/calendar.graphql.ts b/source/plugins/calendar/tests/calendar.graphql.ts similarity index 100% rename from plugins/calendar/tests/calendar.graphql.ts rename to source/plugins/calendar/tests/calendar.graphql.ts diff --git a/plugins/calendar/tests/colors.graphql.ts b/source/plugins/calendar/tests/colors.graphql.ts similarity index 100% rename from plugins/calendar/tests/colors.graphql.ts rename to source/plugins/calendar/tests/colors.graphql.ts diff --git a/plugins/calendar/tests/list.yml b/source/plugins/calendar/tests/list.yml similarity index 100% rename from plugins/calendar/tests/list.yml rename to source/plugins/calendar/tests/list.yml diff --git a/plugins/calendar/tests/user.graphql.ts b/source/plugins/calendar/tests/user.graphql.ts similarity index 100% rename from plugins/calendar/tests/user.graphql.ts rename to source/plugins/calendar/tests/user.graphql.ts diff --git a/plugins/gists/mod.ts b/source/plugins/gists/mod.ts similarity index 100% rename from plugins/gists/mod.ts rename to source/plugins/gists/mod.ts diff --git a/plugins/gists/queries/gists.graphql b/source/plugins/gists/queries/gists.graphql similarity index 100% rename from plugins/gists/queries/gists.graphql rename to source/plugins/gists/queries/gists.graphql diff --git a/plugins/gists/templates/classic.ejs b/source/plugins/gists/templates/classic.ejs similarity index 100% rename from plugins/gists/templates/classic.ejs rename to source/plugins/gists/templates/classic.ejs diff --git a/plugins/gists/tests/gists.graphql.ts b/source/plugins/gists/tests/gists.graphql.ts similarity index 100% rename from plugins/gists/tests/gists.graphql.ts rename to source/plugins/gists/tests/gists.graphql.ts diff --git a/plugins/gists/tests/list.yml b/source/plugins/gists/tests/list.yml similarity index 100% rename from plugins/gists/tests/list.yml rename to source/plugins/gists/tests/list.yml diff --git a/plugins/introduction/mod.ts b/source/plugins/introduction/mod.ts similarity index 100% rename from plugins/introduction/mod.ts rename to source/plugins/introduction/mod.ts diff --git a/plugins/introduction/queries/organization.graphql b/source/plugins/introduction/queries/organization.graphql similarity index 100% rename from plugins/introduction/queries/organization.graphql rename to source/plugins/introduction/queries/organization.graphql diff --git a/plugins/introduction/queries/repository.graphql b/source/plugins/introduction/queries/repository.graphql similarity index 100% rename from plugins/introduction/queries/repository.graphql rename to source/plugins/introduction/queries/repository.graphql diff --git a/plugins/introduction/queries/user.graphql b/source/plugins/introduction/queries/user.graphql similarity index 100% rename from plugins/introduction/queries/user.graphql rename to source/plugins/introduction/queries/user.graphql diff --git a/plugins/introduction/templates/classic.ejs b/source/plugins/introduction/templates/classic.ejs similarity index 100% rename from plugins/introduction/templates/classic.ejs rename to source/plugins/introduction/templates/classic.ejs diff --git a/plugins/introduction/tests/list.yml b/source/plugins/introduction/tests/list.yml similarity index 100% rename from plugins/introduction/tests/list.yml rename to source/plugins/introduction/tests/list.yml diff --git a/plugins/introduction/tests/organization.graphql.ts b/source/plugins/introduction/tests/organization.graphql.ts similarity index 100% rename from plugins/introduction/tests/organization.graphql.ts rename to source/plugins/introduction/tests/organization.graphql.ts diff --git a/plugins/introduction/tests/repository.graphql.ts b/source/plugins/introduction/tests/repository.graphql.ts similarity index 100% rename from plugins/introduction/tests/repository.graphql.ts rename to source/plugins/introduction/tests/repository.graphql.ts diff --git a/plugins/introduction/tests/user.graphql.ts b/source/plugins/introduction/tests/user.graphql.ts similarity index 100% rename from plugins/introduction/tests/user.graphql.ts rename to source/plugins/introduction/tests/user.graphql.ts diff --git a/plugins/rss/mod.ts b/source/plugins/rss/mod.ts similarity index 100% rename from plugins/rss/mod.ts rename to source/plugins/rss/mod.ts diff --git a/plugins/rss/templates/classic.ejs b/source/plugins/rss/templates/classic.ejs similarity index 100% rename from plugins/rss/templates/classic.ejs rename to source/plugins/rss/templates/classic.ejs diff --git a/plugins/rss/tests/list.yml b/source/plugins/rss/tests/list.yml similarity index 100% rename from plugins/rss/tests/list.yml rename to source/plugins/rss/tests/list.yml diff --git a/plugins/rss/tests/rss.http.ts b/source/plugins/rss/tests/rss.http.ts similarity index 100% rename from plugins/rss/tests/rss.http.ts rename to source/plugins/rss/tests/rss.http.ts diff --git a/plugins/webscraping/mod.ts b/source/plugins/webscraping/mod.ts similarity index 100% rename from plugins/webscraping/mod.ts rename to source/plugins/webscraping/mod.ts diff --git a/plugins/webscraping/templates/classic.ejs b/source/plugins/webscraping/templates/classic.ejs similarity index 100% rename from plugins/webscraping/templates/classic.ejs rename to source/plugins/webscraping/templates/classic.ejs diff --git a/plugins/webscraping/tests/example.html b/source/plugins/webscraping/tests/example.html similarity index 100% rename from plugins/webscraping/tests/example.html rename to source/plugins/webscraping/tests/example.html diff --git a/plugins/webscraping/tests/example.png b/source/plugins/webscraping/tests/example.png similarity index 100% rename from plugins/webscraping/tests/example.png rename to source/plugins/webscraping/tests/example.png diff --git a/plugins/webscraping/tests/list.yml b/source/plugins/webscraping/tests/list.yml similarity index 100% rename from plugins/webscraping/tests/list.yml rename to source/plugins/webscraping/tests/list.yml diff --git a/processors/assert/mod.ts b/source/processors/assert/mod.ts similarity index 100% rename from processors/assert/mod.ts rename to source/processors/assert/mod.ts diff --git a/processors/assert/tests/list.yml b/source/processors/assert/tests/list.yml similarity index 100% rename from processors/assert/tests/list.yml rename to source/processors/assert/tests/list.yml diff --git a/processors/inject.content/mod.ts b/source/processors/inject.content/mod.ts similarity index 100% rename from processors/inject.content/mod.ts rename to source/processors/inject.content/mod.ts diff --git a/processors/inject.content/tests/list.yml b/source/processors/inject.content/tests/list.yml similarity index 100% rename from processors/inject.content/tests/list.yml rename to source/processors/inject.content/tests/list.yml diff --git a/processors/inject.script/mod.ts b/source/processors/inject.script/mod.ts similarity index 100% rename from processors/inject.script/mod.ts rename to source/processors/inject.script/mod.ts diff --git a/processors/inject.script/tests/list.yml b/source/processors/inject.script/tests/list.yml similarity index 100% rename from processors/inject.script/tests/list.yml rename to source/processors/inject.script/tests/list.yml diff --git a/processors/inject.style/mod.ts b/source/processors/inject.style/mod.ts similarity index 100% rename from processors/inject.style/mod.ts rename to source/processors/inject.style/mod.ts diff --git a/processors/inject.style/tests/list.yml b/source/processors/inject.style/tests/list.yml similarity index 100% rename from processors/inject.style/tests/list.yml rename to source/processors/inject.style/tests/list.yml diff --git a/processors/optimize.css/mod.ts b/source/processors/optimize.css/mod.ts similarity index 100% rename from processors/optimize.css/mod.ts rename to source/processors/optimize.css/mod.ts diff --git a/processors/optimize.css/tests/list.yml b/source/processors/optimize.css/tests/list.yml similarity index 100% rename from processors/optimize.css/tests/list.yml rename to source/processors/optimize.css/tests/list.yml diff --git a/processors/optimize.svg/mod.ts b/source/processors/optimize.svg/mod.ts similarity index 100% rename from processors/optimize.svg/mod.ts rename to source/processors/optimize.svg/mod.ts diff --git a/processors/optimize.svg/tests/list.yml b/source/processors/optimize.svg/tests/list.yml similarity index 100% rename from processors/optimize.svg/tests/list.yml rename to source/processors/optimize.svg/tests/list.yml diff --git a/processors/optimize.xml/mod.ts b/source/processors/optimize.xml/mod.ts similarity index 100% rename from processors/optimize.xml/mod.ts rename to source/processors/optimize.xml/mod.ts diff --git a/processors/optimize.xml/tests/list.yml b/source/processors/optimize.xml/tests/list.yml similarity index 100% rename from processors/optimize.xml/tests/list.yml rename to source/processors/optimize.xml/tests/list.yml diff --git a/processors/publish.console/mod.ts b/source/processors/publish.console/mod.ts similarity index 100% rename from processors/publish.console/mod.ts rename to source/processors/publish.console/mod.ts diff --git a/processors/publish.console/tests/list.yml b/source/processors/publish.console/tests/list.yml similarity index 100% rename from processors/publish.console/tests/list.yml rename to source/processors/publish.console/tests/list.yml diff --git a/processors/publish.file/mod.ts b/source/processors/publish.file/mod.ts similarity index 100% rename from processors/publish.file/mod.ts rename to source/processors/publish.file/mod.ts diff --git a/processors/publish.file/tests/list.yml b/source/processors/publish.file/tests/list.yml similarity index 100% rename from processors/publish.file/tests/list.yml rename to source/processors/publish.file/tests/list.yml diff --git a/processors/publish.gist/mod.ts b/source/processors/publish.gist/mod.ts similarity index 100% rename from processors/publish.gist/mod.ts rename to source/processors/publish.gist/mod.ts diff --git a/processors/publish.gist/tests/list.yml b/source/processors/publish.gist/tests/list.yml similarity index 100% rename from processors/publish.gist/tests/list.yml rename to source/processors/publish.gist/tests/list.yml diff --git a/processors/publish.gist/tests/rest.ts b/source/processors/publish.gist/tests/rest.ts similarity index 100% rename from processors/publish.gist/tests/rest.ts rename to source/processors/publish.gist/tests/rest.ts diff --git a/processors/publish.git/mod.ts b/source/processors/publish.git/mod.ts similarity index 100% rename from processors/publish.git/mod.ts rename to source/processors/publish.git/mod.ts diff --git a/processors/publish.git/queries/commit.graphql b/source/processors/publish.git/queries/commit.graphql similarity index 100% rename from processors/publish.git/queries/commit.graphql rename to source/processors/publish.git/queries/commit.graphql diff --git a/processors/publish.git/queries/createref.graphql b/source/processors/publish.git/queries/createref.graphql similarity index 100% rename from processors/publish.git/queries/createref.graphql rename to source/processors/publish.git/queries/createref.graphql diff --git a/processors/publish.git/queries/head.graphql b/source/processors/publish.git/queries/head.graphql similarity index 100% rename from processors/publish.git/queries/head.graphql rename to source/processors/publish.git/queries/head.graphql diff --git a/processors/publish.git/queries/pullrequest.graphql b/source/processors/publish.git/queries/pullrequest.graphql similarity index 100% rename from processors/publish.git/queries/pullrequest.graphql rename to source/processors/publish.git/queries/pullrequest.graphql diff --git a/processors/publish.git/queries/repository.graphql b/source/processors/publish.git/queries/repository.graphql similarity index 100% rename from processors/publish.git/queries/repository.graphql rename to source/processors/publish.git/queries/repository.graphql diff --git a/processors/publish.git/tests/commit.graphql.ts b/source/processors/publish.git/tests/commit.graphql.ts similarity index 100% rename from processors/publish.git/tests/commit.graphql.ts rename to source/processors/publish.git/tests/commit.graphql.ts diff --git a/processors/publish.git/tests/createref.graphql.ts b/source/processors/publish.git/tests/createref.graphql.ts similarity index 100% rename from processors/publish.git/tests/createref.graphql.ts rename to source/processors/publish.git/tests/createref.graphql.ts diff --git a/processors/publish.git/tests/head.graphql.ts b/source/processors/publish.git/tests/head.graphql.ts similarity index 100% rename from processors/publish.git/tests/head.graphql.ts rename to source/processors/publish.git/tests/head.graphql.ts diff --git a/processors/publish.git/tests/list.yml b/source/processors/publish.git/tests/list.yml similarity index 100% rename from processors/publish.git/tests/list.yml rename to source/processors/publish.git/tests/list.yml diff --git a/processors/render.gemojis/mod.ts b/source/processors/render.gemojis/mod.ts similarity index 100% rename from processors/render.gemojis/mod.ts rename to source/processors/render.gemojis/mod.ts diff --git a/processors/render.gemojis/tests/list.yml b/source/processors/render.gemojis/tests/list.yml similarity index 100% rename from processors/render.gemojis/tests/list.yml rename to source/processors/render.gemojis/tests/list.yml diff --git a/processors/render.octicons/mod.ts b/source/processors/render.octicons/mod.ts similarity index 100% rename from processors/render.octicons/mod.ts rename to source/processors/render.octicons/mod.ts diff --git a/processors/render.octicons/tests/list.yml b/source/processors/render.octicons/tests/list.yml similarity index 100% rename from processors/render.octicons/tests/list.yml rename to source/processors/render.octicons/tests/list.yml diff --git a/processors/render.twemojis/mod.ts b/source/processors/render.twemojis/mod.ts similarity index 100% rename from processors/render.twemojis/mod.ts rename to source/processors/render.twemojis/mod.ts diff --git a/processors/render.twemojis/tests/list.yml b/source/processors/render.twemojis/tests/list.yml similarity index 100% rename from processors/render.twemojis/tests/list.yml rename to source/processors/render.twemojis/tests/list.yml diff --git a/processors/render/mod.ts b/source/processors/render/mod.ts similarity index 94% rename from processors/render/mod.ts rename to source/processors/render/mod.ts index f38896b85cd..3060aabb74d 100644 --- a/processors/render/mod.ts +++ b/source/processors/render/mod.ts @@ -58,7 +58,8 @@ export default class extends Processor { }) //Process SVG in browser and convert to image if needed - if (wrapper === "svg") { + //TODO(@lowlighter): handle no local puppeteer + if ((wrapper === "svg") && (!Deno.env.get("DENO_DEPLOYMENT_ID"))) { const page = await Browser.newPage() try { // Compute SVG rendered dimensions @@ -99,10 +100,10 @@ export default class extends Processor { this.log.trace(`template ${template} has no ${path}, using fallback`) return await read(template.startsWith("https://") ? new URL(`${template}/${path}`) : new URL(`templates/classic/${path}`, import.meta.url)) } catch (error) { - if (!/no such file or directory/i.test(`${error}`)) { - return "" + if (!(error instanceof globalThis?.Deno.errors.NotFound)) { + this.log.warn(error) } - throw error + return "" } } } diff --git a/processors/render/templates/classic/styles.css b/source/processors/render/templates/classic/styles.css similarity index 100% rename from processors/render/templates/classic/styles.css rename to source/processors/render/templates/classic/styles.css diff --git a/processors/render/templates/html.ejs b/source/processors/render/templates/html.ejs similarity index 100% rename from processors/render/templates/html.ejs rename to source/processors/render/templates/html.ejs diff --git a/processors/render/templates/json.ejs b/source/processors/render/templates/json.ejs similarity index 100% rename from processors/render/templates/json.ejs rename to source/processors/render/templates/json.ejs diff --git a/processors/render/templates/svg.ejs b/source/processors/render/templates/svg.ejs similarity index 100% rename from processors/render/templates/svg.ejs rename to source/processors/render/templates/svg.ejs diff --git a/processors/render/tests/list.yml b/source/processors/render/tests/list.yml similarity index 100% rename from processors/render/tests/list.yml rename to source/processors/render/tests/list.yml diff --git a/run/action/mod.ts b/source/run/action/mod.ts similarity index 100% rename from run/action/mod.ts rename to source/run/action/mod.ts diff --git a/run/cli/mod.ts b/source/run/cli/mod.ts similarity index 100% rename from run/cli/mod.ts rename to source/run/cli/mod.ts diff --git a/run/flags.ts b/source/run/flags.ts similarity index 97% rename from run/flags.ts rename to source/run/flags.ts index 5e7e59c2e99..bdea45f0f66 100644 --- a/run/flags.ts +++ b/source/run/flags.ts @@ -25,6 +25,7 @@ const net = new Set([ "deno.land/std", "deno.land/x", "esm.sh", + "registry.npmjs.org", // Puppeteer "127.0.0.1", "edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing", @@ -46,6 +47,8 @@ const write = new Set([ TMP, // Puppeteer join(CACHE, "chrome"), + // KV store + join(PWD, ".kv"), // User defined ..._write, ]) @@ -98,6 +101,7 @@ console.log([ // Subcommand "deno", subcommand, + "--unstable", // Minimal permissions "--allow-env", "--allow-read", diff --git a/run/mod_test.ts b/source/run/mod_test.ts similarity index 100% rename from run/mod_test.ts rename to source/run/mod_test.ts diff --git a/run/server/mod.ts b/source/run/server/mod.ts similarity index 85% rename from run/server/mod.ts rename to source/run/server/mod.ts index d764448e44b..bc03426f116 100644 --- a/run/server/mod.ts +++ b/source/run/server/mod.ts @@ -17,8 +17,10 @@ import { deepMerge } from "std/collections/deep_merge.ts" import { formats } from "@processors/render/mod.ts" import { getCookies, setCookie } from "std/http/cookie.ts" import { formatValidationError, throws } from "@utils/errors.ts" - -const z = await metadata() +import { Secret } from "@utils/secret.ts" +try { + await import("./imports.ts") +} catch { /* Ignore */ } /** Server */ class Server extends Internal { @@ -49,14 +51,12 @@ class Server extends Internal { return serveListener(listen({ hostname: this.context.hostname, port: this.context.port }), (request) => this.handle(request)) } - /** Active sessions */ - #sessions = new Map() - - /** State tokens */ - #states = new Set() + /** Metadata */ + #metadata = null as unknown /** Request handler */ protected async handle(request: Request) { + const kv = Deno.env.get("DENO_DEPLOYMENT_ID") ? await Deno.openKv() : await Deno.openKv(".kv") const url = new URL(request.url) const cookies = getCookies(request.headers) const { metrics_session: session = null } = cookies @@ -78,17 +78,19 @@ class Server extends Internal { case url.pathname.startsWith("/static/"): { return serveDir(request, { fsRoot: fromFileUrl(new URL("static", import.meta.url)), urlRoot: "static", quiet: true }) } - + // Metadata case url.pathname === "/metadata": { - return new Response(JSON.stringify(z), { status: Status.OK, headers: { "content-type": "application/json" } }) + if (!this.#metadata) { + this.#metadata = await metadata() + } + return new Response(JSON.stringify(this.#metadata), { status: Status.OK, headers: { "content-type": "application/json" } }) } - // Authenticated user case this.routes.me.test(url.pathname): { - if ((!session) || (!this.#sessions.has(session))) { + if ((!session) || (!await kv.get(["sessions", session]).then(({ value }) => value))) { return new Response("Unauthorized", { status: Status.Unauthorized }) } - const { login, name, avatar } = this.#sessions.get(session)! + const { value: { login, name, avatar } } = await kv.get(["sessions", session]) as { value: user } return new Response(JSON.stringify({ login, name, avatar }), { status: Status.OK, headers: { "content-type": "application/json" } }) } // OAuth login @@ -99,12 +101,12 @@ class Server extends Internal { // Start OAuth process case "": case "/": { - if (session && (this.#sessions.has(session))) { + if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { return Response.redirect(url.origin, Status.Found) } // Create state const state = crypto.randomUUID() - this.#states.add(state) + await kv.set(["states", state], true, { expireIn: 15 * 60 * 1000 }) log.trace(`oauth process: ${state} started`) // Redirect to GitHub const params = new URLSearchParams({ client_id: app.client_id, state, allow_signup: "false" }) @@ -112,16 +114,16 @@ class Server extends Internal { } // OAuth authorization process case "/authorize": { - if (session && (this.#sessions.has(session))) { + if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { return Response.redirect(url.origin, Status.Found) } try { // Validate state const state = url.searchParams.get("state") - if ((!state) || (!this.#states.has(state))) { + if ((!state) || (!await kv.get(["states", state]).then(({ value }) => value))) { throws("Invalid state") } - this.#states.delete(state) + await kv.delete(["states", state]) log.trace(`oauth process: ${state} received callback from github app`) // Retrieve token const code = url.searchParams.get("code") @@ -134,20 +136,20 @@ class Server extends Internal { "content-type": "application/x-www-form-urlencoded", "accept": "application/json", }, - body: new URLSearchParams({ client_id: app.client_id, client_secret: app.client_secret, code }), + body: new URLSearchParams({ client_id: app.client_id, client_secret: app.client_secret.read(), code }), }).then((response) => response.json()) log.trace(`oauth process: ${state} retrieved access token`) // Validate token const { login, name, avatar_url } = await fetch("https://api.github.com/user", { headers: { "accept": "application/json", "content-type": "application/json", Authorization: `Bearer ${token}` }, }).then((response) => response.json()) - if ([...this.#sessions.values()].find((session) => session.login === login)) { + if (await kv.get(["sessions", "login", login]).then(({ value }) => value)) { log.trace(`oauth process: ${state} user ${login} was already authenticated`) return Response.redirect(url.origin, Status.Found) } - const user = { login, name, avatar: avatar_url, token, session: crypto.randomUUID() } - this.#sessions.set(user.session, user) - setTimeout(() => this.#sessions.delete(user.session), 1000 * expiration) + const user = { login, name, avatar: avatar_url, token: new Secret(token), session: crypto.randomUUID() } + await kv.set(["sessions", user.session], user, { expireIn: 1000 * expiration }) + await kv.set(["sessions", "login", user.login], true, { expireIn: 1000 * expiration }) log.message(`oauth process: ${state} user ${login} authenticated`) // Redirect to homepage const headers = new Headers({ Location: url.origin }) @@ -160,7 +162,7 @@ class Server extends Internal { } // OAuth token revocation case "/revoke": { - if ((!session) || (!this.#sessions.has(session))) { + if ((!session) || (!await kv.get(["sessions", session]).then(({ value }) => value))) { return Response.redirect(url.origin, Status.Found) } //TODO(@lowlighter): is it not possible to revoke oauth token from github app (this always return not found) ? @@ -208,7 +210,7 @@ class Server extends Internal { // Honor single request at a time if ((!mock) && (pending.has(handle))) { log.trace("existing request pending, waiting for completion") - return pending.get(handle) + return pending.get(handle)! } log.trace("processing request") const promise = deferred() @@ -230,7 +232,7 @@ class Server extends Internal { log.trace(context) } catch (error) { log.warn(error) - return promise.resolve(new Response(`Bad request: ${formatValidationError(error)}`, { status: Status.BadRequest })) + return promise.resolve(new Response(`Bad request: ${formatValidationError(error)}`, { status: Status.BadRequest }))! } // Filter features and apply server configuration @@ -243,14 +245,14 @@ class Server extends Internal { //TODO(@lowlighter): toggle enabled plugins } catch (error) { log.warn(error) - return promise.resolve(new Response(`Bad request: ${formatValidationError(error)}`, { status: Status.BadRequest })) + return promise.resolve(new Response(`Bad request: ${formatValidationError(error)}`, { status: Status.BadRequest }))! } // Apply server configuration try { const extras = {} as Record - if (session && (this.#sessions.has(session))) { - const user = this.#sessions.get(session)! + if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { + const { value: user } = await kv.get(["sessions", session]) as { value: user } extras.token = user.token log.debug(`using token from user: ${user.login}`) } @@ -265,7 +267,7 @@ class Server extends Internal { } catch (error) { log.warn(error) // Do not print error to users to avoid data leaks - return promise.resolve(new Response("Internal Server Error: Failed to apply server configuration", { status: Status.InternalServerError })) + return promise.resolve(new Response("Internal Server Error: Failed to apply server configuration", { status: Status.InternalServerError }))! } // Process request @@ -273,13 +275,13 @@ class Server extends Internal { const { content = "", mime = "image/svg+xml", base64 = false } = await process(context) ?? {} const body = base64 ? Base64.decode(content) : content if (!body) { - return promise.resolve(new Response("No content", { status: Status.NoContent })) + return promise.resolve(new Response(null, { status: Status.NoContent }))! } - return promise.resolve(new Response(body, { status: Status.OK, headers: { "content-type": mime } })) + return promise.resolve(new Response(body, { status: Status.OK, headers: { "content-type": mime } }))! } catch (error) { log.warn(error) // Do not print error to users to avoid data leaks - return promise.resolve(new Response("Internal Server Error: Failed to process metrics", { status: Status.InternalServerError })) + return promise.resolve(new Response("Internal Server Error: Failed to process metrics", { status: Status.InternalServerError }))! } } finally { log.trace("cleaning request") @@ -318,10 +320,16 @@ class Server extends Internal { } /** User */ -type user = { login: string; name: string; avatar: string; token: string; session: string } +type user = { login: string; name: string; avatar: string; token: Secret; session: string } // Entry point if (import.meta.main) { - const config = await YAML.parse(await read("metrics.config.yml")) + const config = {} as Record + try { + await YAML.parse(await read("metrics.config.yml")) + } + catch { + console.log("metrics.config.yml not found, using default configuration") + } await new Server(config).start() } diff --git a/run/server/static/favicon.png b/source/run/server/static/favicon.png similarity index 100% rename from run/server/static/favicon.png rename to source/run/server/static/favicon.png diff --git a/run/server/static/index.html b/source/run/server/static/index.html similarity index 100% rename from run/server/static/index.html rename to source/run/server/static/index.html diff --git a/run/server/static/opengraph.png b/source/run/server/static/opengraph.png similarity index 100% rename from run/server/static/opengraph.png rename to source/run/server/static/opengraph.png From 0f1b5e0808b85055539c0ca4e979eedb632981ed Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 08:10:42 +0200 Subject: [PATCH 027/103] feat: add secret to censor token from logs --- source/metrics/utils/secret.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 source/metrics/utils/secret.ts diff --git a/source/metrics/utils/secret.ts b/source/metrics/utils/secret.ts new file mode 100644 index 00000000000..4d8a7d918fe --- /dev/null +++ b/source/metrics/utils/secret.ts @@ -0,0 +1,16 @@ +/** Secret, used to prevent leaks in logs by hiding its value */ +export class Secret { + /** Constructor */ + constructor(value: unknown) { + this.#value = `${value}` + } + + /** Value */ + readonly #value + + /** Read value */ + read() { + return this.#value + } + +} From 87dee1e291b16bf694af941f294891dd3559ffd4 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 08:14:33 +0200 Subject: [PATCH 028/103] feat: statically analyzable dynamic imports for deno deploy --- deno.jsonc | 3 ++- source/run/server/imports.ts | 36 ++++++++++++++++++++++++++++++++ source/run/server/mod_imports.ts | 27 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 source/run/server/imports.ts create mode 100644 source/run/server/mod_imports.ts diff --git a/deno.jsonc b/deno.jsonc index 7716a35d224..eacf2612331 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -21,7 +21,8 @@ "lint": "deno lint", "fmt": "deno fmt", "hook": "deno task lint && deno task fmt --check && deno task test", - "deploy": "deployctl deploy --project=metrics --include=source,deno.jsonc,LICENSE --prod source/run/server/mod.ts" + "deploy": "deployctl deploy --project=metrics --include=source,deno.jsonc,LICENSE --prod source/run/server/mod.ts", + "deploy:imports": "$(deno run --allow-env source/run/flags.ts test source/run/server/mod_imports.ts $0)" }, "lint": { "rules": { diff --git a/source/run/server/imports.ts b/source/run/server/imports.ts new file mode 100644 index 00000000000..26e66a37745 --- /dev/null +++ b/source/run/server/imports.ts @@ -0,0 +1,36 @@ +/* + * Statically analyzable dynamic imports for deno deploy + * Auto-generated, do not edit manually + */ +;(async () => await import("../../plugins/calendar/mod.ts")) +;(async () => await import("../../plugins/calendar/tests/calendar.graphql.ts")) +;(async () => await import("../../plugins/calendar/tests/colors.graphql.ts")) +;(async () => await import("../../plugins/calendar/tests/user.graphql.ts")) +;(async () => await import("../../plugins/gists/mod.ts")) +;(async () => await import("../../plugins/gists/tests/gists.graphql.ts")) +;(async () => await import("../../plugins/introduction/mod.ts")) +;(async () => await import("../../plugins/introduction/tests/organization.graphql.ts")) +;(async () => await import("../../plugins/introduction/tests/repository.graphql.ts")) +;(async () => await import("../../plugins/introduction/tests/user.graphql.ts")) +;(async () => await import("../../plugins/rss/mod.ts")) +;(async () => await import("../../plugins/rss/tests/rss.http.ts")) +;(async () => await import("../../plugins/webscraping/mod.ts")) +;(async () => await import("../../processors/assert/mod.ts")) +;(async () => await import("../../processors/inject.content/mod.ts")) +;(async () => await import("../../processors/inject.script/mod.ts")) +;(async () => await import("../../processors/inject.style/mod.ts")) +;(async () => await import("../../processors/optimize.css/mod.ts")) +;(async () => await import("../../processors/optimize.svg/mod.ts")) +;(async () => await import("../../processors/optimize.xml/mod.ts")) +;(async () => await import("../../processors/publish.console/mod.ts")) +;(async () => await import("../../processors/publish.file/mod.ts")) +;(async () => await import("../../processors/publish.gist/mod.ts")) +;(async () => await import("../../processors/publish.gist/tests/rest.ts")) +;(async () => await import("../../processors/publish.git/mod.ts")) +;(async () => await import("../../processors/publish.git/tests/commit.graphql.ts")) +;(async () => await import("../../processors/publish.git/tests/createref.graphql.ts")) +;(async () => await import("../../processors/publish.git/tests/head.graphql.ts")) +;(async () => await import("../../processors/render.gemojis/mod.ts")) +;(async () => await import("../../processors/render.octicons/mod.ts")) +;(async () => await import("../../processors/render.twemojis/mod.ts")) +;(async () => await import("../../processors/render/mod.ts")) diff --git a/source/run/server/mod_imports.ts b/source/run/server/mod_imports.ts new file mode 100644 index 00000000000..6ff89092db9 --- /dev/null +++ b/source/run/server/mod_imports.ts @@ -0,0 +1,27 @@ +// Imports +import { expandGlob } from "std/fs/expand_glob.ts" +import { relative } from "std/path/relative.ts" +import { fromFileUrl } from "std/path/from_file_url.ts" +import { write } from "@utils/io.ts" +import { dirname } from "std/path/dirname.ts" + +if (import.meta.main) { + const base = dirname(fromFileUrl(import.meta.url)) + const imports = [] + for await (const { path } of expandGlob("source/{plugins,processors}/**/mod.ts")) { + imports.push(relative(base, path)) + } + for await (const { path } of expandGlob("source/{plugins,processors}/**/tests/*.ts")) { + imports.push(relative(base, path)) + } + await write( + "source/run/server/imports.ts", + [ + "/*", + " * Statically analyzable dynamic imports for deno deploy", + " * Auto-generated, do not edit manually", + " */", + imports.map((imported) => `(async () => await import("${imported.replaceAll("\\", "/")}"))`).sort().join(";\n"), + ].join("\n"), + ) +} From 6ca69774f57d666ea7111ec6a054de093f0fe0f6 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 08:21:01 +0200 Subject: [PATCH 029/103] chore: fmt --- source/metrics/utils/secret.ts | 1 - source/run/server/mod.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/source/metrics/utils/secret.ts b/source/metrics/utils/secret.ts index 4d8a7d918fe..a2a9f2b448b 100644 --- a/source/metrics/utils/secret.ts +++ b/source/metrics/utils/secret.ts @@ -12,5 +12,4 @@ export class Secret { read() { return this.#value } - } diff --git a/source/run/server/mod.ts b/source/run/server/mod.ts index bc03426f116..e881f9ee085 100644 --- a/source/run/server/mod.ts +++ b/source/run/server/mod.ts @@ -327,8 +327,7 @@ if (import.meta.main) { const config = {} as Record try { await YAML.parse(await read("metrics.config.yml")) - } - catch { + } catch { console.log("metrics.config.yml not found, using default configuration") } await new Server(config).start() From 7e8494f52d1a5524f4cf2757cf7426fa398298c3 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Thu, 5 Oct 2023 08:25:22 +0200 Subject: [PATCH 030/103] fix: remove lock file for now --- deno.jsonc | 2 + deno.lock | 1722 ---------------------------------------------------- 2 files changed, 2 insertions(+), 1722 deletions(-) delete mode 100644 deno.lock diff --git a/deno.jsonc b/deno.jsonc index eacf2612331..53c45636e18 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -13,6 +13,8 @@ "@plugins/": "./source/plugins/", "@processors/": "./source/processors/" }, + // TODO(@lowlighter): I think SVGO breaks the lock as it depends on OS maybe ? + "lock": false, "nodeModulesDir": true, "tasks": { "serve": "$(deno run --allow-env source/run/flags.ts --allow-net=localhost run source/run/server/mod.ts --watch $0)", diff --git a/deno.lock b/deno.lock deleted file mode 100644 index 8e2665aa2b1..00000000000 --- a/deno.lock +++ /dev/null @@ -1,1722 +0,0 @@ -{ - "version": "3", - "packages": { - "specifiers": { - "npm:@types/node": "npm:@types/node@18.16.19", - "npm:jsonwebtoken": "npm:jsonwebtoken@9.0.2", - "npm:puppeteer": "npm:puppeteer@21.2.1", - "npm:puppeteer-core": "npm:puppeteer-core@21.2.1_devtools-protocol@0.0.1159816", - "npm:puppeteer@21.2.1": "npm:puppeteer@21.2.1" - }, - "npm": { - "@babel/code-frame@7.22.13": { - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "@babel/highlight@7.22.13", - "chalk": "chalk@2.4.2" - } - }, - "@babel/helper-validator-identifier@7.22.19": { - "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", - "dependencies": {} - }, - "@babel/highlight@7.22.13": { - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dependencies": { - "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.19", - "chalk": "chalk@2.4.2", - "js-tokens": "js-tokens@4.0.0" - } - }, - "@puppeteer/browsers@1.7.1": { - "integrity": "sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw==", - "dependencies": { - "debug": "debug@4.3.4", - "extract-zip": "extract-zip@2.0.1", - "progress": "progress@2.0.3", - "proxy-agent": "proxy-agent@6.3.1", - "tar-fs": "tar-fs@3.0.4", - "unbzip2-stream": "unbzip2-stream@1.4.3", - "yargs": "yargs@17.7.1" - } - }, - "@tootallnate/quickjs-emscripten@0.23.0": { - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dependencies": {} - }, - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - }, - "@types/yauzl@2.10.0": { - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dependencies": { - "@types/node": "@types/node@18.16.19" - } - }, - "agent-base@7.1.0": { - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "debug@4.3.4" - } - }, - "ansi-regex@5.0.1": { - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dependencies": {} - }, - "ansi-styles@3.2.1": { - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "color-convert@1.9.3" - } - }, - "ansi-styles@4.3.0": { - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "color-convert@2.0.1" - } - }, - "argparse@2.0.1": { - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dependencies": {} - }, - "ast-types@0.13.4": { - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "tslib@2.6.0" - } - }, - "b4a@1.6.4": { - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dependencies": {} - }, - "base64-js@1.5.1": { - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dependencies": {} - }, - "basic-ftp@5.0.3": { - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", - "dependencies": {} - }, - "buffer-crc32@0.2.13": { - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dependencies": {} - }, - "buffer-equal-constant-time@1.0.1": { - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dependencies": {} - }, - "buffer@5.7.1": { - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dependencies": { - "base64-js": "base64-js@1.5.1", - "ieee754": "ieee754@1.2.1" - } - }, - "callsites@3.1.0": { - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dependencies": {} - }, - "chalk@2.4.2": { - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "ansi-styles@3.2.1", - "escape-string-regexp": "escape-string-regexp@1.0.5", - "supports-color": "supports-color@5.5.0" - } - }, - "chromium-bidi@0.4.26_devtools-protocol@0.0.1159816": { - "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==", - "dependencies": { - "devtools-protocol": "devtools-protocol@0.0.1159816", - "mitt": "mitt@3.0.1" - } - }, - "cliui@8.0.1": { - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "string-width@4.2.3", - "strip-ansi": "strip-ansi@6.0.1", - "wrap-ansi": "wrap-ansi@7.0.0" - } - }, - "color-convert@1.9.3": { - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "color-name@1.1.3" - } - }, - "color-convert@2.0.1": { - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "color-name@1.1.4" - } - }, - "color-name@1.1.3": { - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dependencies": {} - }, - "color-name@1.1.4": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dependencies": {} - }, - "cosmiconfig@8.3.5": { - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", - "dependencies": { - "import-fresh": "import-fresh@3.3.0", - "js-yaml": "js-yaml@4.1.0", - "parse-json": "parse-json@5.2.0", - "path-type": "path-type@4.0.0" - } - }, - "cross-fetch@4.0.0": { - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "node-fetch@2.7.0" - } - }, - "data-uri-to-buffer@5.0.1": { - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", - "dependencies": {} - }, - "debug@4.3.4": { - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "ms@2.1.2" - } - }, - "degenerator@5.0.1": { - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "ast-types@0.13.4", - "escodegen": "escodegen@2.1.0", - "esprima": "esprima@4.0.1" - } - }, - "devtools-protocol@0.0.1159816": { - "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==", - "dependencies": {} - }, - "ecdsa-sig-formatter@1.0.11": { - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "safe-buffer@5.2.1" - } - }, - "emoji-regex@8.0.0": { - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dependencies": {} - }, - "end-of-stream@1.4.4": { - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "once@1.4.0" - } - }, - "error-ex@1.3.2": { - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "is-arrayish@0.2.1" - } - }, - "escalade@3.1.1": { - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dependencies": {} - }, - "escape-string-regexp@1.0.5": { - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dependencies": {} - }, - "escodegen@2.1.0": { - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "esprima@4.0.1", - "estraverse": "estraverse@5.3.0", - "esutils": "esutils@2.0.3", - "source-map": "source-map@0.6.1" - } - }, - "esprima@4.0.1": { - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dependencies": {} - }, - "estraverse@5.3.0": { - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dependencies": {} - }, - "esutils@2.0.3": { - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dependencies": {} - }, - "extract-zip@2.0.1": { - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "@types/yauzl": "@types/yauzl@2.10.0", - "debug": "debug@4.3.4", - "get-stream": "get-stream@5.2.0", - "yauzl": "yauzl@2.10.0" - } - }, - "fast-fifo@1.3.2": { - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dependencies": {} - }, - "fd-slicer@1.1.0": { - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "pend@1.2.0" - } - }, - "fs-extra@8.1.0": { - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "graceful-fs@4.2.11", - "jsonfile": "jsonfile@4.0.0", - "universalify": "universalify@0.1.2" - } - }, - "get-caller-file@2.0.5": { - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dependencies": {} - }, - "get-stream@5.2.0": { - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "pump@3.0.0" - } - }, - "get-uri@6.0.1": { - "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", - "dependencies": { - "basic-ftp": "basic-ftp@5.0.3", - "data-uri-to-buffer": "data-uri-to-buffer@5.0.1", - "debug": "debug@4.3.4", - "fs-extra": "fs-extra@8.1.0" - } - }, - "graceful-fs@4.2.11": { - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dependencies": {} - }, - "has-flag@3.0.0": { - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dependencies": {} - }, - "http-proxy-agent@7.0.0": { - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dependencies": { - "agent-base": "agent-base@7.1.0", - "debug": "debug@4.3.4" - } - }, - "https-proxy-agent@7.0.2": { - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dependencies": { - "agent-base": "agent-base@7.1.0", - "debug": "debug@4.3.4" - } - }, - "ieee754@1.2.1": { - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dependencies": {} - }, - "import-fresh@3.3.0": { - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "parent-module@1.0.1", - "resolve-from": "resolve-from@4.0.0" - } - }, - "ip@1.1.8": { - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dependencies": {} - }, - "ip@2.0.0": { - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dependencies": {} - }, - "is-arrayish@0.2.1": { - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dependencies": {} - }, - "is-fullwidth-code-point@3.0.0": { - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dependencies": {} - }, - "js-tokens@4.0.0": { - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dependencies": {} - }, - "js-yaml@4.1.0": { - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "argparse@2.0.1" - } - }, - "json-parse-even-better-errors@2.3.1": { - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dependencies": {} - }, - "jsonfile@4.0.0": { - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dependencies": { - "graceful-fs": "graceful-fs@4.2.11" - } - }, - "jsonwebtoken@9.0.2": { - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "jws@3.2.2", - "lodash.includes": "lodash.includes@4.3.0", - "lodash.isboolean": "lodash.isboolean@3.0.3", - "lodash.isinteger": "lodash.isinteger@4.0.4", - "lodash.isnumber": "lodash.isnumber@3.0.3", - "lodash.isplainobject": "lodash.isplainobject@4.0.6", - "lodash.isstring": "lodash.isstring@4.0.1", - "lodash.once": "lodash.once@4.1.1", - "ms": "ms@2.1.2", - "semver": "semver@7.5.4" - } - }, - "jwa@1.4.1": { - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "buffer-equal-constant-time@1.0.1", - "ecdsa-sig-formatter": "ecdsa-sig-formatter@1.0.11", - "safe-buffer": "safe-buffer@5.2.1" - } - }, - "jws@3.2.2": { - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "jwa@1.4.1", - "safe-buffer": "safe-buffer@5.2.1" - } - }, - "lines-and-columns@1.2.4": { - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dependencies": {} - }, - "lodash.includes@4.3.0": { - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dependencies": {} - }, - "lodash.isboolean@3.0.3": { - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dependencies": {} - }, - "lodash.isinteger@4.0.4": { - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dependencies": {} - }, - "lodash.isnumber@3.0.3": { - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dependencies": {} - }, - "lodash.isplainobject@4.0.6": { - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dependencies": {} - }, - "lodash.isstring@4.0.1": { - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dependencies": {} - }, - "lodash.once@4.1.1": { - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dependencies": {} - }, - "lru-cache@6.0.0": { - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "yallist@4.0.0" - } - }, - "lru-cache@7.18.3": { - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dependencies": {} - }, - "mitt@3.0.1": { - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dependencies": {} - }, - "mkdirp-classic@0.5.3": { - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dependencies": {} - }, - "ms@2.1.2": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dependencies": {} - }, - "netmask@2.0.2": { - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dependencies": {} - }, - "node-fetch@2.7.0": { - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "whatwg-url@5.0.0" - } - }, - "once@1.4.0": { - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "wrappy@1.0.2" - } - }, - "pac-proxy-agent@7.0.1": { - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "@tootallnate/quickjs-emscripten@0.23.0", - "agent-base": "agent-base@7.1.0", - "debug": "debug@4.3.4", - "get-uri": "get-uri@6.0.1", - "http-proxy-agent": "http-proxy-agent@7.0.0", - "https-proxy-agent": "https-proxy-agent@7.0.2", - "pac-resolver": "pac-resolver@7.0.0", - "socks-proxy-agent": "socks-proxy-agent@8.0.2" - } - }, - "pac-resolver@7.0.0": { - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", - "dependencies": { - "degenerator": "degenerator@5.0.1", - "ip": "ip@1.1.8", - "netmask": "netmask@2.0.2" - } - }, - "parent-module@1.0.1": { - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "callsites@3.1.0" - } - }, - "parse-json@5.2.0": { - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "@babel/code-frame@7.22.13", - "error-ex": "error-ex@1.3.2", - "json-parse-even-better-errors": "json-parse-even-better-errors@2.3.1", - "lines-and-columns": "lines-and-columns@1.2.4" - } - }, - "path-type@4.0.0": { - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dependencies": {} - }, - "pend@1.2.0": { - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dependencies": {} - }, - "progress@2.0.3": { - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dependencies": {} - }, - "proxy-agent@6.3.1": { - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "dependencies": { - "agent-base": "agent-base@7.1.0", - "debug": "debug@4.3.4", - "http-proxy-agent": "http-proxy-agent@7.0.0", - "https-proxy-agent": "https-proxy-agent@7.0.2", - "lru-cache": "lru-cache@7.18.3", - "pac-proxy-agent": "pac-proxy-agent@7.0.1", - "proxy-from-env": "proxy-from-env@1.1.0", - "socks-proxy-agent": "socks-proxy-agent@8.0.2" - } - }, - "proxy-from-env@1.1.0": { - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dependencies": {} - }, - "pump@3.0.0": { - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "end-of-stream@1.4.4", - "once": "once@1.4.0" - } - }, - "puppeteer-core@21.2.1_devtools-protocol@0.0.1159816": { - "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==", - "dependencies": { - "@puppeteer/browsers": "@puppeteer/browsers@1.7.1", - "chromium-bidi": "chromium-bidi@0.4.26_devtools-protocol@0.0.1159816", - "cross-fetch": "cross-fetch@4.0.0", - "debug": "debug@4.3.4", - "devtools-protocol": "devtools-protocol@0.0.1159816", - "ws": "ws@8.14.1" - } - }, - "puppeteer@21.2.1": { - "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==", - "dependencies": { - "@puppeteer/browsers": "@puppeteer/browsers@1.7.1", - "cosmiconfig": "cosmiconfig@8.3.5", - "puppeteer-core": "puppeteer-core@21.2.1_devtools-protocol@0.0.1159816" - } - }, - "queue-tick@1.0.1": { - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dependencies": {} - }, - "require-directory@2.1.1": { - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dependencies": {} - }, - "resolve-from@4.0.0": { - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dependencies": {} - }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dependencies": {} - }, - "semver@7.5.4": { - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "lru-cache@6.0.0" - } - }, - "smart-buffer@4.2.0": { - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dependencies": {} - }, - "socks-proxy-agent@8.0.2": { - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dependencies": { - "agent-base": "agent-base@7.1.0", - "debug": "debug@4.3.4", - "socks": "socks@2.7.1" - } - }, - "socks@2.7.1": { - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dependencies": { - "ip": "ip@2.0.0", - "smart-buffer": "smart-buffer@4.2.0" - } - }, - "source-map@0.6.1": { - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dependencies": {} - }, - "streamx@2.15.1": { - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", - "dependencies": { - "fast-fifo": "fast-fifo@1.3.2", - "queue-tick": "queue-tick@1.0.1" - } - }, - "string-width@4.2.3": { - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "emoji-regex@8.0.0", - "is-fullwidth-code-point": "is-fullwidth-code-point@3.0.0", - "strip-ansi": "strip-ansi@6.0.1" - } - }, - "strip-ansi@6.0.1": { - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "ansi-regex@5.0.1" - } - }, - "supports-color@5.5.0": { - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "has-flag@3.0.0" - } - }, - "tar-fs@3.0.4": { - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dependencies": { - "mkdirp-classic": "mkdirp-classic@0.5.3", - "pump": "pump@3.0.0", - "tar-stream": "tar-stream@3.1.6" - } - }, - "tar-stream@3.1.6": { - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "b4a@1.6.4", - "fast-fifo": "fast-fifo@1.3.2", - "streamx": "streamx@2.15.1" - } - }, - "through@2.3.8": { - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dependencies": {} - }, - "tr46@0.0.3": { - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dependencies": {} - }, - "tslib@2.6.0": { - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", - "dependencies": {} - }, - "unbzip2-stream@1.4.3": { - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "buffer@5.7.1", - "through": "through@2.3.8" - } - }, - "universalify@0.1.2": { - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dependencies": {} - }, - "webidl-conversions@3.0.1": { - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dependencies": {} - }, - "whatwg-url@5.0.0": { - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "tr46@0.0.3", - "webidl-conversions": "webidl-conversions@3.0.1" - } - }, - "wrap-ansi@7.0.0": { - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "ansi-styles@4.3.0", - "string-width": "string-width@4.2.3", - "strip-ansi": "strip-ansi@6.0.1" - } - }, - "wrappy@1.0.2": { - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dependencies": {} - }, - "ws@8.14.1": { - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", - "dependencies": {} - }, - "y18n@5.0.8": { - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dependencies": {} - }, - "yallist@4.0.0": { - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dependencies": {} - }, - "yargs-parser@21.1.1": { - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dependencies": {} - }, - "yargs@17.7.1": { - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dependencies": { - "cliui": "cliui@8.0.1", - "escalade": "escalade@3.1.1", - "get-caller-file": "get-caller-file@2.0.5", - "require-directory": "require-directory@2.1.1", - "string-width": "string-width@4.2.3", - "y18n": "y18n@5.0.8", - "yargs-parser": "yargs-parser@21.1.1" - } - }, - "yauzl@2.10.0": { - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "buffer-crc32@0.2.13", - "fd-slicer": "fd-slicer@1.1.0" - } - } - } - }, - "redirects": { - "https://deno.land/x/import/mod.ts": "https://deno.land/x/import@0.2.1/mod.ts", - "https://esm.sh/@octokit/auth-app": "https://esm.sh/@octokit/auth-app@6.0.0", - "https://esm.sh/@octokit/core": "https://esm.sh/@octokit/core@5.0.0", - "https://esm.sh/octokit": "https://esm.sh/octokit@3.1.0", - "https://esm.sh/v132/@types/csso@~5.0/index.d.ts": "https://esm.sh/v132/@types/csso@5.0.1/index.d.ts", - "https://esm.sh/v132/@types/ejs@~3.1/index.d.ts": "https://esm.sh/v132/@types/ejs@3.1.2/index.d.ts", - "https://esm.sh/v132/@types/html-escaper@~3.0/index.d.ts": "https://esm.sh/v132/@types/html-escaper@3.0.0/index.d.ts", - "https://esm.sh/v132/@types/pluralize@latest/index.d.ts": "https://esm.sh/v132/@types/pluralize@0.0.30/index.d.ts", - "https://esm.sh/v132/@types/primer__octicons@^19/index.d.ts": "https://esm.sh/v132/@types/primer__octicons@19.6.0/index.d.ts" - }, - "remote": { - "https://api.github.com/emojis": "9d2b0d98d88cf1e20ad659bdc6ce67219eac949c598b7d6b58c6284092a385d7", - "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", - "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", - "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", - "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", - "https://deno.land/std@0.140.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", - "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d", - "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44", - "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757", - "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", - "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", - "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", - "https://deno.land/std@0.173.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.173.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.173.0/encoding/base32.ts": "cb15f16e53c580d2491637280302bc6cfeb48f8911521ea9c7895ba513a2bcc5", - "https://deno.land/std@0.173.0/encoding/jsonc.ts": "02b86115d2b812f26789481ebcf4748171e8ece6514b60243b3733e2c200876a", - "https://deno.land/std@0.173.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32", - "https://deno.land/std@0.173.0/fs/copy.ts": "14214efd94fc3aa6db1e4af2b4b9578e50f7362b7f3725d5a14ad259a5df26c8", - "https://deno.land/std@0.173.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688", - "https://deno.land/std@0.173.0/fs/ensure_dir.ts": "724209875497a6b4628dfb256116e5651c4f7816741368d6c44aab2531a1e603", - "https://deno.land/std@0.173.0/fs/ensure_file.ts": "c38602670bfaf259d86ca824a94e6cb9e5eb73757fefa4ebf43a90dd017d53d9", - "https://deno.land/std@0.173.0/fs/ensure_link.ts": "c0f5b2f0ec094ed52b9128eccb1ee23362a617457aa0f699b145d4883f5b2fb4", - "https://deno.land/std@0.173.0/fs/ensure_symlink.ts": "2955cc8332aeca9bdfefd05d8d3976b94e282b0f353392a71684808ed2ffdd41", - "https://deno.land/std@0.173.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", - "https://deno.land/std@0.173.0/fs/exists.ts": "b8c8a457b71e9d7f29b9d2f87aad8dba2739cbe637e8926d6ba6e92567875f8e", - "https://deno.land/std@0.173.0/fs/expand_glob.ts": "45d17e89796a24bd6002e4354eda67b4301bb8ba67d2cac8453cdabccf1d9ab0", - "https://deno.land/std@0.173.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", - "https://deno.land/std@0.173.0/fs/move.ts": "4cb47f880e3f0582c55e71c9f8b1e5e8cfaacb5e84f7390781dd563b7298ec19", - "https://deno.land/std@0.173.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32", - "https://deno.land/std@0.173.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.173.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.173.0/path/_util.ts": "86c2375a996c1931b2f2ac71fefd5ddf0cf0e579fa4ab12d3e4c552d4223b8d8", - "https://deno.land/std@0.173.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.173.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.173.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232", - "https://deno.land/std@0.173.0/path/posix.ts": "0874b341c2c6968ca38d323338b8b295ea1dae10fa872a768d812e2e7d634789", - "https://deno.land/std@0.173.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.173.0/path/win32.ts": "672942919dd66ce1b8c224e77d3447e2ad8254eaff13fe6946420a9f78fa141e", - "https://deno.land/std@0.194.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462", - "https://deno.land/std@0.194.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", - "https://deno.land/std@0.194.0/io/buffer.ts": "17f4410eaaa60a8a85733e8891349a619eadfbbe42e2f319283ce2b8f29723ab", - "https://deno.land/std@0.194.0/yaml/_dumper/dumper.ts": "a2c937a53a2b0473125a31a330334cc3f30e98fd82f8143bc225583d1260890b", - "https://deno.land/std@0.194.0/yaml/_dumper/dumper_state.ts": "f0d0673ceea288334061ca34b63954c2bb5feb5bf6de5e4cfe9a942cdf6e5efe", - "https://deno.land/std@0.194.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", - "https://deno.land/std@0.194.0/yaml/_loader/loader.ts": "47b9592efcb390b58b1903cc471bfdf1fc71a0d2d2b31e37b5cae7d8804c7aed", - "https://deno.land/std@0.194.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", - "https://deno.land/std@0.194.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", - "https://deno.land/std@0.194.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", - "https://deno.land/std@0.194.0/yaml/_type/binary.ts": "d34d8c8d8ed521e270cfede3401c425b971af4f6c69da1e2cb32b172d42c7da7", - "https://deno.land/std@0.194.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", - "https://deno.land/std@0.194.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", - "https://deno.land/std@0.194.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", - "https://deno.land/std@0.194.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", - "https://deno.land/std@0.194.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", - "https://deno.land/std@0.194.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", - "https://deno.land/std@0.194.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", - "https://deno.land/std@0.194.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", - "https://deno.land/std@0.194.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", - "https://deno.land/std@0.194.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", - "https://deno.land/std@0.194.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", - "https://deno.land/std@0.194.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", - "https://deno.land/std@0.194.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", - "https://deno.land/std@0.194.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", - "https://deno.land/std@0.194.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", - "https://deno.land/std@0.194.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", - "https://deno.land/std@0.194.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", - "https://deno.land/std@0.194.0/yaml/mod.ts": "28ecda6652f3e7a7735ee29c247bfbd32a2e2fc5724068e9fd173ec4e59f66f7", - "https://deno.land/std@0.194.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", - "https://deno.land/std@0.194.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", - "https://deno.land/std@0.194.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", - "https://deno.land/std@0.194.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", - "https://deno.land/std@0.194.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", - "https://deno.land/std@0.194.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", - "https://deno.land/std@0.194.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", - "https://deno.land/std@0.194.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", - "https://deno.land/std@0.194.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", - "https://deno.land/std@0.194.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", - "https://deno.land/std@0.198.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.198.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", - "https://deno.land/std@0.198.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", - "https://deno.land/std@0.198.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", - "https://deno.land/std@0.198.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.198.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", - "https://deno.land/std@0.198.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", - "https://deno.land/std@0.198.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", - "https://deno.land/std@0.198.0/path/_from_file_url.ts": "7e4e5626089785adddb061f1b9f4932d6b21c7df778e7449531a11e32048245c", - "https://deno.land/std@0.198.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.198.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", - "https://deno.land/std@0.198.0/path/_join.ts": "fd78555bc34d5f188918fc7018dfe8fe2df5bbad94a3b30a433666c03934d77f", - "https://deno.land/std@0.198.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", - "https://deno.land/std@0.198.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", - "https://deno.land/std@0.198.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", - "https://deno.land/std@0.198.0/path/_resolve.ts": "3bf0287d62488cad08c3c219a9708c4a4c658c65d7b4400fd99afdc3ba10a64d", - "https://deno.land/std@0.198.0/path/_to_file_url.ts": "739bfda583598790b2e77ce227f2bb618f6ebdb939788cea47555b43970ec58c", - "https://deno.land/std@0.198.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", - "https://deno.land/std@0.198.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", - "https://deno.land/std@0.198.0/path/basename.ts": "6f08fbb90dbfcf320765b3abb01f995b1723f75e2534acfd5380e202c802a3aa", - "https://deno.land/std@0.198.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.198.0/path/dirname.ts": "098996822a31b4c46e1eb52a19540d3c6f9f54b772fc8a197939eeabc29fca2f", - "https://deno.land/std@0.198.0/path/extname.ts": "9b83c62fd16505739541f7a3ab447d8972da39dbf668d47af2f93206c2480893", - "https://deno.land/std@0.198.0/path/format.ts": "cb22f95cc7853d590b87708cc9441785e760d711188facff3d225305a8213aca", - "https://deno.land/std@0.198.0/path/from_file_url.ts": "a6221cfc928928ec4d9786d767dfac98fa2ab746af0786446c9834a07b98817e", - "https://deno.land/std@0.198.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", - "https://deno.land/std@0.198.0/path/is_absolute.ts": "6b3d36352eb7fa29edb53f9e7b09b1aeb022a3c5465764f6cc5b8c41f9736197", - "https://deno.land/std@0.198.0/path/join.ts": "4a2867ff2f3c81ffc9eb3d56dade16db6f8bd3854f269306d23dad4115089c84", - "https://deno.land/std@0.198.0/path/mod.ts": "7765507696cb321994cdacfc19ee3ba61e8e3ebf4bd98fa75a276cf5dc18ce2a", - "https://deno.land/std@0.198.0/path/normalize.ts": "7d992cd262b2deefa842d93a8ba2ed51f3949ba595b1d07f627ac2cddbc74808", - "https://deno.land/std@0.198.0/path/parse.ts": "031fe488b3497fb8312fc1dc3c3d6c2d80707edd9c661e18ee9fd20f95edf322", - "https://deno.land/std@0.198.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", - "https://deno.land/std@0.198.0/path/relative.ts": "7db80c5035016174267da16321a742d76e875215c317859a383b12f413c6f5d6", - "https://deno.land/std@0.198.0/path/resolve.ts": "103b62207726a27f28177f397008545804ecb20aaf00623af1f622b18cd80b9f", - "https://deno.land/std@0.198.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", - "https://deno.land/std@0.198.0/path/to_file_url.ts": "dd32f7a01bbf3b15b5df46796659984b372973d9b2d7d59bcf0eb990763a0cb5", - "https://deno.land/std@0.198.0/path/to_namespaced_path.ts": "4e643ab729bf49ccdc166ad48d2de262ff462938fcf2a44a4425588f4a0bd690", - "https://deno.land/std@0.198.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", - "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", - "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", - "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", - "https://deno.land/std@0.201.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", - "https://deno.land/std@0.201.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", - "https://deno.land/std@0.201.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", - "https://deno.land/std@0.201.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", - "https://deno.land/std@0.201.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", - "https://deno.land/std@0.201.0/assert/assert_false.ts": "a9962749f4bf5844e3fa494257f1de73d69e4fe0e82c34d0099287552163a2dc", - "https://deno.land/std@0.201.0/assert/assert_greater.ts": "ae2158a2d19313bf675bf7251d31c6dc52973edb12ac64ac8fc7064152af3e63", - "https://deno.land/std@0.201.0/assert/assert_greater_or_equal.ts": "1439da5ebbe20855446cac50097ac78b9742abe8e9a43e7de1ce1426d556e89c", - "https://deno.land/std@0.201.0/assert/assert_instance_of.ts": "3aedb3d8186e120812d2b3a5dea66a6e42bf8c57a8bd927645770bd21eea554c", - "https://deno.land/std@0.201.0/assert/assert_is_error.ts": "c21113094a51a296ffaf036767d616a78a2ae5f9f7bbd464cd0197476498b94b", - "https://deno.land/std@0.201.0/assert/assert_less.ts": "aec695db57db42ec3e2b62e97e1e93db0063f5a6ec133326cc290ff4b71b47e4", - "https://deno.land/std@0.201.0/assert/assert_less_or_equal.ts": "5fa8b6a3ffa20fd0a05032fe7257bf985d207b85685fdbcd23651b70f928c848", - "https://deno.land/std@0.201.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", - "https://deno.land/std@0.201.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", - "https://deno.land/std@0.201.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", - "https://deno.land/std@0.201.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", - "https://deno.land/std@0.201.0/assert/assert_not_strict_equals.ts": "ca6c6d645e95fbc873d25320efeb8c4c6089a9a5e09f92d7c1c4b6e935c2a6ad", - "https://deno.land/std@0.201.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", - "https://deno.land/std@0.201.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", - "https://deno.land/std@0.201.0/assert/assert_strict_equals.ts": "b1f538a7ea5f8348aeca261d4f9ca603127c665e0f2bbfeb91fa272787c87265", - "https://deno.land/std@0.201.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", - "https://deno.land/std@0.201.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", - "https://deno.land/std@0.201.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", - "https://deno.land/std@0.201.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", - "https://deno.land/std@0.201.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", - "https://deno.land/std@0.201.0/assert/mod.ts": "37c49a26aae2b254bbe25723434dc28cd7532e444cf0b481a97c045d110ec085", - "https://deno.land/std@0.201.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", - "https://deno.land/std@0.201.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", - "https://deno.land/std@0.201.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", - "https://deno.land/std@0.201.0/async/delay.ts": "a6142eb44cdd856b645086af2b811b1fcce08ec06bb7d50969e6a872ee9b8659", - "https://deno.land/std@0.201.0/bytes/bytes_list.ts": "ecf5098c230b793970f43c06e8f30d70b937c031658365aeb3de9a8ae4d406a3", - "https://deno.land/std@0.201.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", - "https://deno.land/std@0.201.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", - "https://deno.land/std@0.201.0/collections/_comparators.ts": "fa7f9a44cea1d270098a2a5a6f8bb30c61b595c1b1f983bd67c6297d766adffa", - "https://deno.land/std@0.201.0/collections/_utils.ts": "5114abc026ddef71207a79609b984614e66a63a4bda17d819d56b0e72c51527e", - "https://deno.land/std@0.201.0/collections/aggregate_groups.ts": "22c7115a2e3d057979066a2238d3ba23b04acdd35491e82d08d2e052b1d7c068", - "https://deno.land/std@0.201.0/collections/associate_by.ts": "64869182eeed3be9222137d071224ac6a01bcc3c5236610306f99e3e3107ec47", - "https://deno.land/std@0.201.0/collections/associate_with.ts": "cf9735d7b4d345275fd3b7420eaba9726a2844e847f2d9e4be9f103f6f3e2c8b", - "https://deno.land/std@0.201.0/collections/binary_heap.ts": "6c889ad21a86593d5d321e3404918f0449c2cde82ba1b57cbc5ffcd6a1d063ae", - "https://deno.land/std@0.201.0/collections/binary_search_node.ts": "8d99dd95901d73a0edbe105826ef7ce0e1111ce184d2d0410dbfda172c9ebf35", - "https://deno.land/std@0.201.0/collections/binary_search_tree.ts": "c3588493fd3b090453fade1903db19cbe398490db6a40a0574d7abdaa87ba652", - "https://deno.land/std@0.201.0/collections/chunk.ts": "f82c52a82ad9338018570c42f6de0fb132fcb14914c31a444e360ac104d7b55b", - "https://deno.land/std@0.201.0/collections/deep_merge.ts": "9db788ba56cb05b65c77166b789e58e125dff159b7f41bf4d19dc1cba19ecb8b", - "https://deno.land/std@0.201.0/collections/distinct.ts": "01595bd8e608a5e2de8a8631055587e6f01d68861e463eef34f8e295713500b8", - "https://deno.land/std@0.201.0/collections/distinct_by.ts": "3afe11d81eafb30c7c9dbf568d94357f3d88153292c00671b72cd695deae6602", - "https://deno.land/std@0.201.0/collections/drop_last_while.ts": "03dd8c55c362efea4f2738b93f102d7487f68beff7b4e4ed67495046b3fe1e4c", - "https://deno.land/std@0.201.0/collections/drop_while.ts": "74cfa9d6b74b3503d5dc70c8ab96af21e7cb2eaff8b9f11aca2aca403e56aeae", - "https://deno.land/std@0.201.0/collections/filter_entries.ts": "77d3f0b3dddcb43e92fc745dd66d01b4922d0eff2a3e2bd25d9d826889f203d8", - "https://deno.land/std@0.201.0/collections/filter_keys.ts": "a29cfe8730ddb54e9e071ea45e8a82e166c7629d18675652def70c1bf80e2ef6", - "https://deno.land/std@0.201.0/collections/filter_values.ts": "16e1fc456a7969e770ec5b89edf5ac97b295ca534b47c1a83f061b409aad7814", - "https://deno.land/std@0.201.0/collections/find_single.ts": "d941876fbec0c1d8b7f41a52f8c1b03198c5695dfaa8d7a12e7a6317d2e6085b", - "https://deno.land/std@0.201.0/collections/first_not_nullish_of.ts": "08d92c4f9c66ff1b1f64a48fa7c1e557e3e6d43f48a46d53a98c3383041b98ae", - "https://deno.land/std@0.201.0/collections/group_by.ts": "f90f483598b38f0174f946589f3af25b1c3cf89d4f3b14d4f0fbe3aaaca0abdd", - "https://deno.land/std@0.201.0/collections/includes_value.ts": "8284a0b3178465b6565d234c1995117320b248dbcff332f77c5e891a11459e0c", - "https://deno.land/std@0.201.0/collections/intersect.ts": "0b4924e2aceaddd5e55591bd9d648cf75745151795ee8a76beddf4facec77548", - "https://deno.land/std@0.201.0/collections/join_to_string.ts": "a487ccc99dbac988698cf5b7c6cc4bb50eefd1784042d0b958a77af413683fe0", - "https://deno.land/std@0.201.0/collections/map_entries.ts": "282b0e5141fbe73a45903674597fb10ec2b211fab8cbac85874eebd97f522a62", - "https://deno.land/std@0.201.0/collections/map_keys.ts": "3dd2cf3a940f1432628cb0252b919d268e8bb38fe8bcd78153a440909173ae98", - "https://deno.land/std@0.201.0/collections/map_not_nullish.ts": "8793a340ca245664902a309ac02861b9eb01780f7b78aa5ad329da7d95e011ec", - "https://deno.land/std@0.201.0/collections/map_values.ts": "c88f306b2b3ec84043e16ab4e1b062055ab32cf4d68bb1d7447afaafa0a1b3bf", - "https://deno.land/std@0.201.0/collections/max_by.ts": "9d5940986aac51b2e4feaebef9cd8bf6e1eceeee5edcf3303e334b737f99520d", - "https://deno.land/std@0.201.0/collections/max_of.ts": "aa29268f102159364bc296eea9f45b0d4f1b041ae9d0037c3dce1c43e21e30be", - "https://deno.land/std@0.201.0/collections/max_with.ts": "252fe7788b6dfcf30cf8c4138cf9bae006a5d545408064ff520293ff0e2fe304", - "https://deno.land/std@0.201.0/collections/min_by.ts": "0fcf1973e8e309da83070dc22def47f468e410d7da462a294c5513ae2c5d6479", - "https://deno.land/std@0.201.0/collections/min_of.ts": "7f2b64620f4f54b75badddfac17e0a84660457233d0921b4c9d9ab31bd3323a8", - "https://deno.land/std@0.201.0/collections/min_with.ts": "ecca4ba5da922fb4b1be515949c59f287e580166985f2b12ee711f768004b33f", - "https://deno.land/std@0.201.0/collections/mod.ts": "f355b8abba1479dfc208ec54fba35f9afaeb996cae01dd06f8d854da56ccb967", - "https://deno.land/std@0.201.0/collections/partition.ts": "28336d4af97eb8a2a2c3ec4ce28597e657e724be5969417eb697ff0860b9711c", - "https://deno.land/std@0.201.0/collections/partition_entries.ts": "7a30b99b64a31af8e9d6da24239f7778b1cff9cd2f240f41aa2f535d647d54f9", - "https://deno.land/std@0.201.0/collections/permutations.ts": "3e3a9d7a8cc806a9ce9ae8fb0c7f3d37d884b3c7429fcaca4bc5d177d92d8217", - "https://deno.land/std@0.201.0/collections/red_black_node.ts": "eb766a69d82132fc4f1789eb3dc753781da7c3b0938756256be3764c9941e3ac", - "https://deno.land/std@0.201.0/collections/red_black_tree.ts": "e78d2aa89d23410079ad1f26e8bf95f05c84c8f8a9ef9c9ae41b312d7062b861", - "https://deno.land/std@0.201.0/collections/reduce_groups.ts": "31e2f977cb3597f98ded2a56e3b5c122d4983ac8c79de184957d17d62ee0b2f1", - "https://deno.land/std@0.201.0/collections/running_reduce.ts": "e25f165456b946e7689a27e0e7fbb2f53d8189ef7cd0937b903e737bd37bacc6", - "https://deno.land/std@0.201.0/collections/sample.ts": "6330fb6567573b252a2ed9da475e54c4b98ca06e6266d34e5f0392095020c86b", - "https://deno.land/std@0.201.0/collections/sliding_windows.ts": "d1c8d18d86b8f02b407379e8681881880b7e3e173d152c5d8dc89d458031b740", - "https://deno.land/std@0.201.0/collections/sort_by.ts": "1207755af756a5da04bebff39146c93cbe54f7870a5d67cf6922e871d96a01d5", - "https://deno.land/std@0.201.0/collections/sum_of.ts": "76db7f04a66bdfa4911c4a592b868c854c690d6f0f83140c315f70caf742c761", - "https://deno.land/std@0.201.0/collections/take_last_while.ts": "9adcfe94a3dd56fbd55951099a121267aa42d8ccbc8152ed3aa210f86c74ca57", - "https://deno.land/std@0.201.0/collections/take_while.ts": "cd9a494d56e6a0a9c3f1e1123d1370633f0d4c6525ccf8aa3bd00b006742bddf", - "https://deno.land/std@0.201.0/collections/union.ts": "0577babef67dd38dc584accbcf75605318346046fe4ff476f0f6e2a1b1092391", - "https://deno.land/std@0.201.0/collections/unzip.ts": "3d3469c616b04200ff6a883e0d6dc82cac4c205aa65742e375afb8816be75b35", - "https://deno.land/std@0.201.0/collections/without_all.ts": "1e3cccb1ed0659455b473c0766d9414b7710d8cef48862c899f445178f66b779", - "https://deno.land/std@0.201.0/collections/zip.ts": "82710f115f1ed61bd0ce7b8ba0b38ecc8b38f7687ba3a768ee59d24e5efb1aad", - "https://deno.land/std@0.201.0/datetime/to_imf.ts": "8f9c0af8b167031ffe2e03da01a12a3b0672cc7562f89c61942a0ab0129771b2", - "https://deno.land/std@0.201.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", - "https://deno.land/std@0.201.0/flags/mod.ts": "0948466fc437f017f00c0b972a422b3dc3317a790bcf326429d23182977eaf9f", - "https://deno.land/std@0.201.0/fmt/bytes.ts": "f29cf69e0791d375f9f5d94ae1f0641e5a03b975f32ddf86d70f70fdf37e7b6a", - "https://deno.land/std@0.201.0/fmt/colors.ts": "87544aa2bc91087bb37f9c077970c85bfb041b48e4c37356129d7b450a415b6f", - "https://deno.land/std@0.201.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", - "https://deno.land/std@0.201.0/fs/copy.ts": "23cc1c465babe5ca4d69778821e2f8addc44593e30a5ca0b902b3784eed75bb6", - "https://deno.land/std@0.201.0/fs/empty_dir.ts": "2e52cd4674d18e2e007175c80449fc3d263786a1361e858d9dfa9360a6581b47", - "https://deno.land/std@0.201.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", - "https://deno.land/std@0.201.0/fs/ensure_file.ts": "39ac83cc283a20ec2735e956adf5de3e8a3334e0b6820547b5772f71c49ae083", - "https://deno.land/std@0.201.0/fs/ensure_link.ts": "c15e69c48556d78aae31b83e0c0ece04b7b8bc0951412f5b759aceb6fde7f0ac", - "https://deno.land/std@0.201.0/fs/ensure_symlink.ts": "b389c8568f0656d145ac7ece472afe710815cccbb2ebfd19da7978379ae143fe", - "https://deno.land/std@0.201.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842", - "https://deno.land/std@0.201.0/fs/exists.ts": "cb59a853d84871d87acab0e7936a4dac11282957f8e195102c5a7acb42546bb8", - "https://deno.land/std@0.201.0/fs/expand_glob.ts": "52b8b6f5b1fa585c348250da1c80ce5d820746cb4a75d874b3599646f677d3a7", - "https://deno.land/std@0.201.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898", - "https://deno.land/std@0.201.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9", - "https://deno.land/std@0.201.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", - "https://deno.land/std@0.201.0/http/cookie.ts": "d965ca071376732663738861bc5dd524df5d8ee69658de40dbfe41c39e379aa4", - "https://deno.land/std@0.201.0/http/etag.ts": "807382795850cde5c437c74bcc09392bc0fc56de348fc1271f383f4b28935b9f", - "https://deno.land/std@0.201.0/http/file_server.ts": "6f5c4a28c36995f31544abb49b86bee6e7a2d34664cac3936ff08ccad1682d85", - "https://deno.land/std@0.201.0/http/http_status.ts": "8a7bcfe3ac025199ad804075385e57f63d055b2aed539d943ccc277616d6f932", - "https://deno.land/std@0.201.0/http/server.ts": "1b2403b3c544c0624ad23e8ca4e05877e65380d9e0d75d04957432d65c3d5f41", - "https://deno.land/std@0.201.0/http/util.ts": "4cf044067febaa26d0830e356b0f3a5f76d701a60d7ff7a516fad7b192f4c3a7", - "https://deno.land/std@0.201.0/io/buf_reader.ts": "0bd8ad26255945b5f418940db23db03bee0c160dbb5ae4627e2c0be3b361df6a", - "https://deno.land/std@0.201.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", - "https://deno.land/std@0.201.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", - "https://deno.land/std@0.201.0/io/copy_n.ts": "c055296297b9d4897d90d1ac056b072dc02614e60c67f438e23fbce052ea4c69", - "https://deno.land/std@0.201.0/io/limited_reader.ts": "1976bb087e6aab06ebd6bd511bc801da9afeda31dbee2353dfd6ec44f1402324", - "https://deno.land/std@0.201.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b", - "https://deno.land/std@0.201.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271", - "https://deno.land/std@0.201.0/io/read_delim.ts": "f3aac4e09b14cbe397612e7d490f1a043edfad18865ad0b277eb144157f676fc", - "https://deno.land/std@0.201.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f", - "https://deno.land/std@0.201.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc", - "https://deno.land/std@0.201.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e", - "https://deno.land/std@0.201.0/io/read_range.ts": "46a2263d0f8369b6d9abb0b25d99ceb65ff08d621fc57bcc53832e6979295043", - "https://deno.land/std@0.201.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20", - "https://deno.land/std@0.201.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce", - "https://deno.land/std@0.201.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7", - "https://deno.land/std@0.201.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f", - "https://deno.land/std@0.201.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e", - "https://deno.land/std@0.201.0/json/common.ts": "ecd5e87d45b5f0df33238ed8b1746e1444da7f5c86ae53d0f0b04280f41a25bb", - "https://deno.land/std@0.201.0/jsonc/mod.ts": "b88dce28eb3645667caa856538ae2fe87af51410822544a0b45a4177ef3bd7dd", - "https://deno.land/std@0.201.0/jsonc/parse.ts": "c1096e2b7ffb4996d7ed841dfdb29a4fccc78edcc55299beaa20d6fe5facf7b6", - "https://deno.land/std@0.201.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570", - "https://deno.land/std@0.201.0/media_types/_util.ts": "0879b04cc810ff18d3dcd97d361e03c9dfb29f67d7fc4a9c6c9d387282ef5fe8", - "https://deno.land/std@0.201.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc", - "https://deno.land/std@0.201.0/media_types/extension.ts": "a7cd28c9417143387cdfed27d4e8607ebcf5b1ec27eb8473d5b000144689fe65", - "https://deno.land/std@0.201.0/media_types/extensions_by_type.ts": "43806d6a52a0d6d965ada9d20e60a982feb40bc7a82268178d94edb764694fed", - "https://deno.land/std@0.201.0/media_types/format_media_type.ts": "f5e1073c05526a6f5a516ac5c5587a1abd043bf1039c71cde1166aa4328c8baf", - "https://deno.land/std@0.201.0/media_types/get_charset.ts": "18b88274796fda5d353806bf409eb1d2ddb3f004eb4bd311662c4cdd8ac173db", - "https://deno.land/std@0.201.0/media_types/parse_media_type.ts": "31ccf2388ffab31b49500bb89fa0f5de189c8897e2ee6c9954f207637d488211", - "https://deno.land/std@0.201.0/media_types/type_by_extension.ts": "daa801eb0f11cdf199445d0f1b656cf116d47dcf9e5b85cc1e6b4469f5ee0432", - "https://deno.land/std@0.201.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586", - "https://deno.land/std@0.201.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", - "https://deno.land/std@0.201.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.201.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", - "https://deno.land/std@0.201.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", - "https://deno.land/std@0.201.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", - "https://deno.land/std@0.201.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", - "https://deno.land/std@0.201.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", - "https://deno.land/std@0.201.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", - "https://deno.land/std@0.201.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", - "https://deno.land/std@0.201.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", - "https://deno.land/std@0.201.0/path/_os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", - "https://deno.land/std@0.201.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", - "https://deno.land/std@0.201.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", - "https://deno.land/std@0.201.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", - "https://deno.land/std@0.201.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", - "https://deno.land/std@0.201.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", - "https://deno.land/std@0.201.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", - "https://deno.land/std@0.201.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", - "https://deno.land/std@0.201.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", - "https://deno.land/std@0.201.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", - "https://deno.land/std@0.201.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", - "https://deno.land/std@0.201.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", - "https://deno.land/std@0.201.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", - "https://deno.land/std@0.201.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", - "https://deno.land/std@0.201.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", - "https://deno.land/std@0.201.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", - "https://deno.land/std@0.201.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", - "https://deno.land/std@0.201.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", - "https://deno.land/std@0.201.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", - "https://deno.land/std@0.201.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", - "https://deno.land/std@0.201.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", - "https://deno.land/std@0.201.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", - "https://deno.land/std@0.201.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", - "https://deno.land/std@0.201.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", - "https://deno.land/std@0.201.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", - "https://deno.land/std@0.201.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", - "https://deno.land/std@0.201.0/streams/_common.ts": "3b2c1f0287ce2ad51fff4091a7d0f48375c85b0ec341468e76d5ac13bb0014dd", - "https://deno.land/std@0.201.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", - "https://deno.land/std@0.201.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", - "https://deno.land/std@0.201.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71", - "https://deno.land/std@0.201.0/streams/delimiter_stream.ts": "a676837e8bdaa94502fe3d8cae57fbf54697801ae61cefbaf39fb7ab64169d2a", - "https://deno.land/std@0.201.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", - "https://deno.land/std@0.201.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072", - "https://deno.land/std@0.201.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", - "https://deno.land/std@0.201.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", - "https://deno.land/std@0.201.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", - "https://deno.land/std@0.201.0/streams/mod.ts": "206c718cebeba0ea690be032f6095a8fd079d4168ad7eb3d6e1b6d35b8ee4f42", - "https://deno.land/std@0.201.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be", - "https://deno.land/std@0.201.0/streams/readable_stream_from_reader.ts": "9bc9e71f0ddad557daa7035daca052ca840e0a45e9d1d467d40afcf2c78933fb", - "https://deno.land/std@0.201.0/streams/reader_from_iterable.ts": "c2d655262d1f6593b49b494430815c273a272b4804e4d07f11987813fbbb9ef1", - "https://deno.land/std@0.201.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73", - "https://deno.land/std@0.201.0/streams/text_delimiter_stream.ts": "f0dc8ff953a8a77f0d1fa8db1fee62de817f36e20d79b00b1362847e30fbdd90", - "https://deno.land/std@0.201.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", - "https://deno.land/std@0.201.0/streams/to_transform_stream.ts": "50af06140c414090df8c3879f46bed4043a5d73caa60352c0c9682a88ec7a8c9", - "https://deno.land/std@0.201.0/streams/writable_stream_from_writer.ts": "c8f6b8525089c7db5a94cffe30d2be11f77ec9a92492644461c736ffc29f68f1", - "https://deno.land/std@0.201.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", - "https://deno.land/std@0.201.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950", - "https://deno.land/std@0.201.0/streams/zip_readable_streams.ts": "5639c8fea8c21d7dab6f34edcf3d08218b7e548a197f7fd79a3a995305a81e9f", - "https://deno.land/std@0.201.0/testing/_test_suite.ts": "30f018feeb3835f12ab198d8a518f9089b1bcb2e8c838a8b615ab10d5005465c", - "https://deno.land/std@0.201.0/testing/bdd.ts": "3f446df5ef8e856a869e8eec54c8482590415741ff0b6358a00c43486cc15769", - "https://deno.land/std@0.201.0/version.ts": "93ab592680d0d50d5269536653f52e2a446d85497e4d71a38e65de533093c040", - "https://deno.land/std@0.201.0/yaml/_dumper/dumper.ts": "717403d0e700de783f2ef5c906b3d7245383e1509fc050e7ff5d4a53a03dbf40", - "https://deno.land/std@0.201.0/yaml/_dumper/dumper_state.ts": "f0d0673ceea288334061ca34b63954c2bb5feb5bf6de5e4cfe9a942cdf6e5efe", - "https://deno.land/std@0.201.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", - "https://deno.land/std@0.201.0/yaml/_loader/loader.ts": "63ec7f0a265dbbabc54b25a4beefff7650e205160a2d75c7d8f8363b5f84851a", - "https://deno.land/std@0.201.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", - "https://deno.land/std@0.201.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", - "https://deno.land/std@0.201.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", - "https://deno.land/std@0.201.0/yaml/_type/binary.ts": "24d49614463a7339a8a16d894919c2ec18a10588ae360ec352093b60e2cc8b0d", - "https://deno.land/std@0.201.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", - "https://deno.land/std@0.201.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", - "https://deno.land/std@0.201.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", - "https://deno.land/std@0.201.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", - "https://deno.land/std@0.201.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", - "https://deno.land/std@0.201.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", - "https://deno.land/std@0.201.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", - "https://deno.land/std@0.201.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", - "https://deno.land/std@0.201.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", - "https://deno.land/std@0.201.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", - "https://deno.land/std@0.201.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", - "https://deno.land/std@0.201.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", - "https://deno.land/std@0.201.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", - "https://deno.land/std@0.201.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", - "https://deno.land/std@0.201.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", - "https://deno.land/std@0.201.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", - "https://deno.land/std@0.201.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", - "https://deno.land/std@0.201.0/yaml/mod.ts": "28ecda6652f3e7a7735ee29c247bfbd32a2e2fc5724068e9fd173ec4e59f66f7", - "https://deno.land/std@0.201.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", - "https://deno.land/std@0.201.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", - "https://deno.land/std@0.201.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", - "https://deno.land/std@0.201.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", - "https://deno.land/std@0.201.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", - "https://deno.land/std@0.201.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", - "https://deno.land/std@0.201.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", - "https://deno.land/std@0.201.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", - "https://deno.land/std@0.201.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02", - "https://deno.land/std@0.201.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", - "https://deno.land/std@0.203.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", - "https://deno.land/std@0.203.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", - "https://deno.land/std@0.203.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", - "https://deno.land/std@0.203.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", - "https://deno.land/std@0.203.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", - "https://deno.land/std@0.203.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", - "https://deno.land/std@0.91.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", - "https://deno.land/std@0.91.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", - "https://deno.land/std@0.91.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", - "https://deno.land/std@0.91.0/encoding/hex.ts": "f952e0727bddb3b2fd2e6889d104eacbd62e92091f540ebd6459317a61932d9b", - "https://deno.land/std@0.91.0/fs/_util.ts": "f2ce811350236ea8c28450ed822a5f42a0892316515b1cd61321dec13569c56b", - "https://deno.land/std@0.91.0/fs/ensure_dir.ts": "f21262e788a707aaa2dd22064da7cd40e3b2f0f067e9b2aed1b288091170cc05", - "https://deno.land/std@0.91.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", - "https://deno.land/std@0.91.0/hash/_wasm/hash.ts": "cb6ad1ab429f8ac9d6eae48f3286e08236d662e1a2e5cfd681ba1c0f17375895", - "https://deno.land/std@0.91.0/hash/_wasm/wasm.js": "94b1b997ae6fb4e6d2156bcea8f79cfcd1e512a91252b08800a92071e5e84e1a", - "https://deno.land/std@0.91.0/hash/hasher.ts": "57a9ec05dd48a9eceed319ac53463d9873490feea3832d58679df6eec51c176b", - "https://deno.land/std@0.91.0/hash/mod.ts": "5d032bd34186cda2f8d17fc122d621430953a6030d4b3f11172004715e3e2441", - "https://deno.land/std@0.91.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", - "https://deno.land/std@0.91.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", - "https://deno.land/std@0.91.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", - "https://deno.land/std@0.91.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", - "https://deno.land/std@0.91.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", - "https://deno.land/std@0.91.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", - "https://deno.land/std@0.91.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", - "https://deno.land/std@0.91.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", - "https://deno.land/std@0.91.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", - "https://deno.land/std@0.93.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", - "https://deno.land/std@0.93.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", - "https://deno.land/std@0.93.0/bytes/mod.ts": "1ae1ccfe98c4b979f12b015982c7444f81fcb921bea7aa215bf37d84f46e1e13", - "https://deno.land/std@0.93.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", - "https://deno.land/std@0.93.0/fmt/printf.ts": "7ec612e9b89958b8f7710129f74f502327aad285a9e48ee5297f5882fbc3a078", - "https://deno.land/std@0.93.0/fs/_util.ts": "f2ce811350236ea8c28450ed822a5f42a0892316515b1cd61321dec13569c56b", - "https://deno.land/std@0.93.0/fs/copy.ts": "631bbafbfe6cba282158abc8aeb7e8251cc69a7ec28ce12878ea1b75fec2add4", - "https://deno.land/std@0.93.0/fs/ensure_dir.ts": "b7c103dc41a3d1dbbb522bf183c519c37065fdc234831a4a0f7d671b1ed5fea7", - "https://deno.land/std@0.93.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", - "https://deno.land/std@0.93.0/fs/walk.ts": "8d37f2164a7397668842a7cb5d53b9e7bcd216462623b1b96abe519f76d7f8b9", - "https://deno.land/std@0.93.0/io/buffer.ts": "2a92f02c1d8daaebaf13e5678ea5969c89f4fab533f687b9e7e86f49f11c3118", - "https://deno.land/std@0.93.0/io/bufio.ts": "729ea49afacd27ed0687451c694752dcaa68250871d1c957ca886ef5d82c461f", - "https://deno.land/std@0.93.0/io/ioutil.ts": "275fa440494df9b4b3aa656301ced2eeac533feec128b3a39b2b40f4cd957e42", - "https://deno.land/std@0.93.0/io/mod.ts": "ae04a3f647845dd8ce0a523c208f80636d0640d9e5c730f0e6272cf86c1c0855", - "https://deno.land/std@0.93.0/io/readers.ts": "17403919724fef2f343c88555606368868a5c752a1099ad801f6a381c170f62d", - "https://deno.land/std@0.93.0/io/streams.ts": "61c441d9d60eda8d5a3782517042536ce87ffd29a8bb72bdab4bdb5fe048e877", - "https://deno.land/std@0.93.0/io/util.ts": "843ccf667ff291ba2315c2419a54b4e76dbc7c0f6c3152f640eac4dc954e3753", - "https://deno.land/std@0.93.0/io/writers.ts": "5453864be11da42dc91f19eb14c0a0e27e9e7f21f5c7174f5419921a6ab64fda", - "https://deno.land/std@0.93.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", - "https://deno.land/std@0.93.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", - "https://deno.land/std@0.93.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", - "https://deno.land/std@0.93.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", - "https://deno.land/std@0.93.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", - "https://deno.land/std@0.93.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", - "https://deno.land/std@0.93.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", - "https://deno.land/std@0.93.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", - "https://deno.land/std@0.93.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", - "https://deno.land/x/cache@0.2.12/deps.ts": "f992c28c82770eab287f0ea332eae502e397c78e5f27a0a4512f59dd54dee865", - "https://deno.land/x/cache@0.2.12/directories.ts": "ef48531cab3f827252e248596d15cede0de179a2fb15392ae24cf8034519994f", - "https://deno.land/x/deno_cache@0.4.1/auth_tokens.ts": "5fee7e9155e78cedf3f6ff3efacffdb76ac1a76c86978658d9066d4fb0f7326e", - "https://deno.land/x/deno_cache@0.4.1/cache.ts": "51f72f4299411193d780faac8c09d4e8cbee951f541121ef75fcc0e94e64c195", - "https://deno.land/x/deno_cache@0.4.1/deno_dir.ts": "f2a9044ce8c7fe1109004cda6be96bf98b08f478ce77e7a07f866eff1bdd933f", - "https://deno.land/x/deno_cache@0.4.1/deps.ts": "8974097d6c17e65d9a82d39377ae8af7d94d74c25c0cbb5855d2920e063f2343", - "https://deno.land/x/deno_cache@0.4.1/dirs.ts": "d2fa473ef490a74f2dcb5abb4b9ab92a48d2b5b6320875df2dee64851fa64aa9", - "https://deno.land/x/deno_cache@0.4.1/disk_cache.ts": "1f3f5232cba4c56412d93bdb324c624e95d5dd179d0578d2121e3ccdf55539f9", - "https://deno.land/x/deno_cache@0.4.1/file_fetcher.ts": "07a6c5f8fd94bf50a116278cc6012b4921c70d2251d98ce1c9f3c352135c39f7", - "https://deno.land/x/deno_cache@0.4.1/http_cache.ts": "f632e0d6ec4a5d61ae3987737a72caf5fcdb93670d21032ddb78df41131360cd", - "https://deno.land/x/deno_cache@0.4.1/mod.ts": "ef1cda9235a93b89cb175fe648372fc0f785add2a43aa29126567a05e3e36195", - "https://deno.land/x/deno_cache@0.4.1/util.ts": "8cb686526f4be5205b92c819ca2ce82220aa0a8dd3613ef0913f6dc269dbbcfe", - "https://deno.land/x/deno_dom@v0.1.38/build/deno-wasm/deno-wasm.js": "98b1ad24a1c13284557917659402202e5c5258ab1431b3f3a82434ad36ffa05a", - "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts": "bfd999a493a6974e9fca4d331bee03bfb68cfc600c662cd0b48b21d67a2a8ba0", - "https://deno.land/x/deno_dom@v0.1.38/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7", - "https://deno.land/x/deno_dom@v0.1.38/src/constructor-lock.ts": "59714df7e0571ec7bd338903b1f396202771a6d4d7f55a452936bd0de9deb186", - "https://deno.land/x/deno_dom@v0.1.38/src/deserialize.ts": "f4d34514ca00473ca428b69ad437ba345925744b5d791cb9552e2d7a0e7b0439", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/document-fragment.ts": "a40c6e18dd0efcf749a31552c1c9a6f7fa614452245e86ee38fc92ba0235e5ae", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/document.ts": "b8f4e4ccabaaa063d6562a0f2f8dea9c0419515d63d8bd79bfde95f7cd64bd93", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/dom-parser.ts": "609097b426f8c2358f3e5d2bca55ed026cf26cdf86562e94130dfdb0f2537f92", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/element.ts": "77c454e228dfeb5c570da5aa61d91850400116bfa0f5a85505acdd3c667171a4", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/elements/html-template-element.ts": "127bb291bb08afeb7e9a66294a5aa6ff2780f4eb4601fa6f7869fe8b70a81472", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/html-collection.ts": "ae90197f5270c32074926ad6cf30ee07d274d44596c7e413c354880cebce8565", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/node-list.ts": "4c6e4b4585301d4147addaccd90cb5f5a80e8d6290a1ba7058c5e3dfea16e15d", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/node.ts": "3069e6fc93ac4111a136ed68199d76673339842b9751610ba06f111ba7dc10a7", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436", - "https://deno.land/x/deno_dom@v0.1.38/src/dom/utils.ts": "55f3e9dc71d6c4a54605888d3f99d26fb0cf9973924709f159252a6933ceeabe", - "https://deno.land/x/deno_dom@v0.1.38/src/parser.ts": "b65eb7e673fa7ca611de871de109655f0aa9fa35ddc1de73df1a5fc2baafc332", - "https://deno.land/x/deno_image@0.0.4/deps.ts": "ab0d77ff6a832f98fd47ca3eccc53c277c188768b9526743dbce76e8944ddceb", - "https://deno.land/x/deno_image@0.0.4/index.ts": "53a1ad6d0d1bfc158b2f4d774077e691d7384540bc93db74254ad32106982b7f", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/PNGDecoder.ts": "9ab11e0e4081ae9beec33bc9fff2343d0cacd9f97e7493f8ecaa836b3855b4e6", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/PNGEncoder.ts": "d24f87fffed9f59ae65e51562d049db16bb73d81416de44f4e38923c552d076a", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/common.ts": "96a3ee4a7e5e2067d51fd89a60e3a25c34bde867629d576285078ce3619c0789", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/index.ts": "e6af07e10d88bdf988a723a7dd9bcc278f0e797374f2b8c74d9e76f134117121", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/internalTypes.ts": "aa00b83cb49aa2c6cc833e4f28476e6ed5b4a5995aaa3da465c54e3fe9df0acd", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/iobuffer/IOBuffer.ts": "a030ae19737ebb98576f3ffcb620ce63058b98fe0f44528440b94d973823face", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/iobuffer/utf8.ts": "c2241c9ac7a46ca0734ffc040c704c506d9447cafc1975ca65c574f0a9391d59", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/index.js": "315a2b1dc7709050d632dbea1c920a4dc405f7079e88494d217d12d7a0d7e285", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/deflate.js": "f019793490803b3ac8e0193dcb9c5787b394909182a09cb5125767e4031c3c0e", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/inflate.js": "7c07d6084f95159405356fd35a77d6c79f35ca19048bb8e35630477f6da3cd34", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/utils/common.js": "d4e0dfc23eece2ab062d53e2f9726c14675bfe20cd890eeceb87291f31c5439b", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/utils/strings.js": "93d014c89c3d72ae2de82b29ae2e93583c203c04a494886d1826095b30e2c4fe", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/adler32.js": "495ef7b1d93d1b12aacfa0f13ef8d7f8f90e2b0073942bfc01b15d2b54e7f5d1", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/constants.js": "a50cd695b9408e424c1c04d3d5b50c06051861beb8417d008c2a973073c285cc", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/crc32.js": "529262cc302562e854873480dfa2654ce9b7ee32474cbbf12526426928e001be", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/deflate.js": "29b5c80f4ee3df72dd267693069a7418fec4d3c00015453539cf8ea28dd8952c", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/gzheader.js": "7395e33c625c064dfcbee9b84f4ff77c47a94dda9e117e1aca749df96c5b76f9", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inffast.js": "113e0dc8a0878880ac0b5437b66395309938f55b6036613f3bcc4cd2b0c95baa", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inflate.js": "c3d6cfaf68a4c2d97d24e5bd7754622b59860fcd317a0f56cde5431e51ad5fed", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/inftrees.js": "53c160e37b83f2325b1d85b7927bfde7bdd680a85175affef0862e5bfe775681", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/messages.js": "ed9ad2f2379aab2cffa6692db2a5be3a2af30d36f3940339b053a10045d8a2a6", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/trees.js": "a2f17c8e20e57214076c1efa1bf9d1444543ce7b6de364f09cab9ec7a0a4a31b", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/pako/lib/zlib/zstream.js": "a4667e4b65cc69d31787cf1a695533e22e0b54e441d470524db6abe82bc29a25", - "https://deno.land/x/deno_image@0.0.4/lib/decoders/fast-png/types.ts": "1dd91035997af1ea8d92a8887b9c28401ccf5f453ea5442e542055d94ca92602", - "https://deno.land/x/deno_image@0.0.4/lib/resize/resize.js": "271fc007ae18b90628f1c9b213ac900875ccec31214fe9cfc338a467237acbdc", - "https://deno.land/x/deno_image@0.0.4/mime-type.ts": "f6cbba14a3a6503554113bf6f9acae8fd6112245e1e659a922828fc2acab1d1f", - "https://deno.land/x/deno_image@0.0.4/mod.ts": "ff0028d3593dc470ddddba3ee6701f340ade4e9af5a9068272539589b42d6d0a", - "https://deno.land/x/deno_image@0.0.4/types.ts": "2c731878a70c232a710fc1fb650a01765d87cb31dcd07dc1561875a5ad486d20", - "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", - "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", - "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", - "https://deno.land/x/esbuild@v0.19.1/mod.js": "37937134e2c363c2afd42bf83640b6cf8296403a4711b27318fb45a7c9f12c31", - "https://deno.land/x/esbuild@v0.19.1/wasm.js": "6f2b5d809456db4ebb9f8fbfd8120b5b00d095cad760eb1041572e521157a69b", - "https://deno.land/x/esbuild@v0.19.4/mod.js": "6277018cfbcad3912fd346409e0b2a9807cf10c9555a15e4aac299b3194fa4fb", - "https://deno.land/x/esbuild@v0.19.4/wasm.js": "14e8be187eaed201e71dc04f20884403566d57150ca9723bb914651820a1f1c0", - "https://deno.land/x/esbuild_deno_loader@0.8.1/deps.ts": "987b50a1a921fcc84ddfcf1a1256cb955f6b16acac28a3fc77901c12c0752173", - "https://deno.land/x/esbuild_deno_loader@0.8.1/mod.ts": "28524460bef46d487221b01ade6ed913d2e127de7eeee025ab75b34b491283da", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/deno.ts": "b0af3e430c068f18c6fa48c2083a1b4354b6c303e16fb37855e02fcafb95f36d", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/loader_native.ts": "0289d8708f47c876d6a4280592a8a12bb2d29676fedf25ddf222ecd6a1bb0bd8", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/loader_portable.ts": "d999f452ef3d8ec2dd3c8443f542adf57efc8a2cd59b29cc41f5b3d7dff512e5", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/plugin_deno_loader.ts": "166356133ee63d80e5559a10c18e10b625da96e39a4518b8c7adfef718bb4e32", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/plugin_deno_resolver.ts": "0449ed23ae93db1ec74d015a46934aefd7ba7a8f719f7a4980b616cb3f5bbee4", - "https://deno.land/x/esbuild_deno_loader@0.8.1/src/shared.ts": "33052684aeb542ebd24da372816bbbf885cd090a7ab0fde7770801f7f5b49572", - "https://deno.land/x/import@0.2.1/mod.ts": "574a255ac7f454c99df6497b28a85197929a91772048c9c0eae59f5227502a0d", - "https://deno.land/x/importmap@0.2.1/_util.ts": "ada9a9618b537e6c0316c048a898352396c882b9f2de38aba18fd3f2950ede89", - "https://deno.land/x/importmap@0.2.1/mod.ts": "ae3d1cd7eabd18c01a4960d57db471126b020f23b37ef14e1359bbb949227ade", - "https://deno.land/x/jose@v4.14.6/jws/compact/sign.ts": "1e88d19dc26d3ea5f2ce3da989813daf5c555d8dec6528051530f7b5a3e87bae", - "https://deno.land/x/jose@v4.14.6/jws/flattened/sign.ts": "be5db0e622a6c5b1e905338d33851e89e956350c9d774de50c70f30a6a156356", - "https://deno.land/x/jose@v4.14.6/jwt/produce.ts": "dfe55ae98056a40be6fda924144c0656bb19c8bbf3fe35d842efe2d1545df3e4", - "https://deno.land/x/jose@v4.14.6/jwt/sign.ts": "54d0a761056edeec428a956abd8db034a20536d87fc7b7a2d4fbf953e931aa37", - "https://deno.land/x/jose@v4.14.6/key/import.ts": "cdf200d1eea914677117835c36f5332924fb2e5cb6fd07594b6455b3ab0f7749", - "https://deno.land/x/jose@v4.14.6/lib/buffer_utils.ts": "dad65c92c9baef14cd5366a4131252afa7a5b4f3a068d0244e2df8660ea2bd8e", - "https://deno.land/x/jose@v4.14.6/lib/check_key_type.ts": "81f5a2c3764464d2b917a1c55c6011d312184e8c68e43bee51565c2db1b166c4", - "https://deno.land/x/jose@v4.14.6/lib/crypto_key.ts": "3da8e265080fb72be9f66a33c6aa76c7176b6162b4ae2534828822cf9c5b04e8", - "https://deno.land/x/jose@v4.14.6/lib/epoch.ts": "cd608f73f6c100e8156c6020ec2bce6757e01759793f0d6aab23908d3d2ea933", - "https://deno.land/x/jose@v4.14.6/lib/format_pem.ts": "b5230682e7a89609238015b77f33afd248f3e0f69bcb5895eece2f86d83100f6", - "https://deno.land/x/jose@v4.14.6/lib/invalid_key_input.ts": "9ca81c899000c18cf1b70ab8221f39b306cc153663e748190307e284fd47ab6a", - "https://deno.land/x/jose@v4.14.6/lib/is_disjoint.ts": "b5ea1cb260899f5cfb04f032029956e637067714a275d13be429fc53287a4b17", - "https://deno.land/x/jose@v4.14.6/lib/is_object.ts": "43549ddc51a3b3d4c22b953b191a961fbb61fb5081e8efb88ad075afa1f4d214", - "https://deno.land/x/jose@v4.14.6/lib/secs.ts": "03a2f02fda0f76bf431734552a947c2916c699b904ae0d2f90a415931c30e66d", - "https://deno.land/x/jose@v4.14.6/lib/validate_crit.ts": "6d2b43959ddf432060505ef13af32cb1bf0daff815ef1eae4d7971629566a695", - "https://deno.land/x/jose@v4.14.6/runtime/asn1.ts": "695f4792d2fc092be76713a165fbb7a738554435b4fb6d5f06ac591e62b1d411", - "https://deno.land/x/jose@v4.14.6/runtime/base64url.ts": "74ecb18b90de56bcc4424b6c911cfe49b56dd4a316978f5c8ee9a23560069636", - "https://deno.land/x/jose@v4.14.6/runtime/check_key_length.ts": "5656870cc4460602775134280bf46f17e27100b237bdb5c687aceabeffc8f2a2", - "https://deno.land/x/jose@v4.14.6/runtime/digest.ts": "cee73fad56ce596ffedc56811d174ab413e7981eb847eb67c0e77f213cc2ac2d", - "https://deno.land/x/jose@v4.14.6/runtime/get_sign_verify_key.ts": "f08a086524491a54fb2a0e203819d4ca2b193444aecf6dfbaf6d400431cb439c", - "https://deno.land/x/jose@v4.14.6/runtime/is_key_like.ts": "d9660a40820d254843721a53b51eb94a4db39a1ee36103ea8c28e2cc2207599b", - "https://deno.land/x/jose@v4.14.6/runtime/jwk_to_key.ts": "3779cb38ea2857b37f378a45d6b27651eb672f398ddae16cd1fb2aacaa451df5", - "https://deno.land/x/jose@v4.14.6/runtime/sign.ts": "1524f8855538ca5fd607cd681f804ba421b0ec58f562118f3c635324ba053f90", - "https://deno.land/x/jose@v4.14.6/runtime/subtle_dsa.ts": "bab28945afd1aac19d3142a70f0c44c4b283b581d33cf8e1234889b58338e80d", - "https://deno.land/x/jose@v4.14.6/runtime/webcrypto.ts": "3365b7d62eaa7e6befe5e2f4f67aa7859805c41b87064433b6e70f94501aa36e", - "https://deno.land/x/jose@v4.14.6/util/errors.ts": "107a41f79bd8a226c836080f617809cd148e00112fdadc0e15c3a6079da02f5d", - "https://deno.land/x/jpegts@1.1/lib/decoder.ts": "b8823ee917fc99a1e085c353b2cd4ca1fbaacaaf1f80be94175e42487666c822", - "https://deno.land/x/jpegts@1.1/lib/encoder.ts": "d75fc5ae88f77e1fa349af08d7a46937add31a03b6d3605ff4d2e3303eb32b3b", - "https://deno.land/x/jpegts@1.1/lib/image.ts": "32255e99b6c1bf4e72e13367516a0d878ba9d195d81fac1f145ce4c11e951962", - "https://deno.land/x/jpegts@1.1/lib/pixel.ts": "19f7f28f09514157be87d01d1d12915cc17c787d8c1707899d2f5570ac6a12fe", - "https://deno.land/x/jpegts@1.1/mod.ts": "2014257f7269bcc822a4d6eb871e5002b347f13a641c12d45c1a61586374f127", - "https://deno.land/x/puppeteer@16.2.0/mod.ts": "52a47aa1850fc0a8255d6c8c462f4ab7e43104d342e6de7bda334221ca8bdcac", - "https://deno.land/x/puppeteer@16.2.0/src/deno/BrowserFetcher.ts": "6be7a586667b429138994a4955b2339fc58af9b6d08378672c8a2b052045e308", - "https://deno.land/x/puppeteer@16.2.0/src/deno/BrowserRunner.ts": "a32b6d2df712afce5f0707aabb6fbcd1e9b1b20e90fc5c34daa081960a638e62", - "https://deno.land/x/puppeteer@16.2.0/src/deno/LaunchOptions.ts": "16a89285fade2690d50eaa3b81e1412cb6c4c4f0a4ac77484a8c016b5f860f9f", - "https://deno.land/x/puppeteer@16.2.0/src/deno/Launcher.ts": "aed1359406480cac72c82fd6944c5de098b1b08ed3c0bf750f4bb2ea75ec1f93", - "https://deno.land/x/puppeteer@16.2.0/src/deno/Puppeteer.ts": "cd01ac2f8b9e8fa9f30ceab1864fbccf20ea7c447794912248e83684706ad0ec", - "https://deno.land/x/puppeteer@16.2.0/src/initialize-deno.ts": "b19511d8fcddd0ed2f6f0938ec0d791f0549da4269cd07a9b05798d66ee23764", - "https://deno.land/x/puppeteer@16.2.0/src/mod.ts": "72d600588db0da6039b8a86f735328b3250512b1e48431ea2971f6a7da74033e", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Accessibility.js": "0b68faa6d65f98309900d21027f3923876c78034efe8d62c149862a5f1f9f696", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/AriaQueryHandler.js": "0c89b1fc865afde7085d2eb59d3e133a5e4de9700abdb233e0c139bc878c4148", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Browser.js": "5a4246bc69be030ee4c04622c265f22316fe3e126f602d8412854496dabd610b", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/BrowserConnector.js": "bf35821f0daa788409c821a785d08853651f5fb3009802df83236a9798c9cb0c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/BrowserWebSocketTransport.js": "1a5a83d8953f578caa07909b17544a10aec33e3690552c2d6bc191aec0c74ccb", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ChromeTargetManager.js": "574ad8b564eda146a73b4074ef83e70da73d80bef803b07ad6778de504b4b08c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Connection.js": "7b68d904e2b7f654324feb45e2ec17f642cb13b4bac0405bcf1beb46fcbd6232", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ConnectionTransport.js": "81c099dd5b8c5dce1f078168614fddc90a56f7f3622c6c7eae624fa62522d661", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ConsoleMessage.js": "82af42681337b3304c87f71e89caa90598edddb15a2d5d794a2b65b469a21461", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Coverage.js": "bebaee68ca9231d0f7f723bdc34b27b4145f5d162c45ae65cdaf039dce6fcb43", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Debug.js": "2db131d2d224f504bb083a33a43a2be103b3bdec4554c2efd18d84b0bc726691", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/DeviceDescriptors.js": "b53379c2756711961e8e574499052c9274a477cdc4ffb2e18440cba1d9e835d2", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Dialog.js": "0c193b4703e6b799fb37da40a870023d83d605a55a08b9993efebc0670044dfd", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ElementHandle.js": "1cc33711925f0a63088b25ca15846430e0004436f714f4eb8a5f26c51e5c64d5", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/EmulationManager.js": "8f46460f17e2066422fdbc84f8bebf21049c266f98413061c54901437e92e81b", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Errors.js": "e745fda7c9f59ac13aebec1c206074ee0f32beb5ef80d559f525d02af375a836", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/EventEmitter.js": "932e4374ca9c0d553f2ff1c12aa5e50432646105e2250753ce27c8dd2b0f0372", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/ExecutionContext.js": "7d3112858a01ee84281b5a461c2b443c68353101a5db05dbce8f0e0160701b20", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FileChooser.js": "374afa00292e72740c341e9862049fc96583956410efa7e2d4277c469886ab59", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FirefoxTargetManager.js": "486925a2c4114c50b61e24e595b314795c6ccf8e922ac6de6158856f0ca74698", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Frame.js": "4b1668171db1649e0c7e4d48db05d801e6b906d9015a9c524c26ea584b89ab96", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/FrameManager.js": "787ec35f5513064b42e501a2b06162cd56f7cd177f69d3f46372c384dbbe3fa2", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/HTTPRequest.js": "cd96da286e4484ece7c2852fd91490c0cb52b32494d11c519362a94c09d18dde", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/HTTPResponse.js": "9cc7dd5bc9e87027dcd36a048c36a2651c295a1124be26733064812fbaadda7b", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Input.js": "b06a0dde90317937cac17beca95c7e53af2eca1e125a433f3f3ba7364d75a83b", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/IsolatedWorld.js": "0c86c3e08c56992a71cdd2b6c00693aa283fa51ad3acc1b5dfece29d0150b53c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/JSHandle.js": "d24a93e0b93f8a67359d539b53caff6635a29fc74960c26624561abc94054c48", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/LifecycleWatcher.js": "ab1365f3a2b3c425c797e850f68e3b031684e51d1b361e3aba50a096ecbfbcf6", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkConditions.js": "81d878736d8b5f65fc634d51aa4f17c67c2e401d01c3ee2bfbba8a578da1b502", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkEventManager.js": "9dd099fdb8f9c3ec3cdbd49663fbb211b3e113cff0a0e17e8d0528e1387a1b8d", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/NetworkManager.js": "cf7ee9cc6899e42d82080185da4992c90ebd800bb9bfe0c7339296bf759a75b5", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/PDFOptions.js": "02444592eb17c3fe725a326db25bd4516bb8b2b156c07eed8f989c8fdf965180", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Page.js": "42cd535eeedfe7f0e2b1c26879bbe131b22fa9005e6d20e79e0645326671db81", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Product.js": "bf93481a7be7d15bf474b7dd0352cbf5f2282e7b27bef423be9a2971f227a823", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Puppeteer.js": "e9e414d0104a773ac05aba8643828bc17d9f14c3562fa1d26bea00d276f8da4c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/PuppeteerViewport.js": "bb396810641954eeb95e60d4340aef70c0e0bf9c87f8b2887786d54d5c8118a6", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/QueryHandler.js": "653d7c74199d12283482e2e44e8770414103b312d6718dd4316007fd46b5d091", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/SecurityDetails.js": "0c8c9b77d7216eb53f920d7b24e353693f7385d0e86b8f69c197df4142af2981", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Target.js": "6965637348b625dd50e5692db4ea2a3257e71e92e93743865acb9b778fb31bef", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TargetManager.js": "be195fd820c380b7a61f09810986bafd1ecc9e8a96f86e856191ebb14ca8fe05", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TaskQueue.js": "99de891382620fd905b3cdb523900939f147497dea377367fe89962c25b4b392", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/TimeoutSettings.js": "a66ed134363732a20c4d6b15d303eb076268101be43beffac4947de01715260c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/Tracing.js": "402aa026afabf6569577dd0de0be693c05462d386b8bb83cdf6eb11231f55691", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/USKeyboardLayout.js": "1a1138b5b503f9c285d767fd4ab364cd567eb034e8d1c64c11e5d2a8f4b9714a", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/WebWorker.js": "b115e1c40232afe9c71e7322b31bc2eb90cb02d0d576f54f692353b8677892be", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/fetch.js": "085b136a4cd76cc930b1512f1513854293fc76cfb7bd52dc024ecb1ca0d4eacf", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/types.js": "2e960c2577695d154e0ff17f850dbd786beeb42bd7b96617c6fbadcc282d20a3", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/common/util.js": "c2a1bd2d6444bf0263861892bb960bd2111200134617bdb0ac8e1b5bc00cad37", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/generated/injected.js": "19021fb0bbccb51d940b3fd9a1c2f3edf3f497cc5b439ddcd751578515be0510", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/generated/version.js": "98cdb536e79a80aebf533181f23aee2dc6a519b68cee450941d6f8522a17d1c3", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/revisions.js": "73bab96295d98b96687a72ce0face0ca322e033fd892eb498e856e6087fbe98c", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/types.js": "6d3502ab9da8cf5c338812b84909010d392d7bd3454c1cbfe0903e53de3929c2", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/DeferredPromise.js": "c9e7b394c04644d5b6705503ff1f80aabd64f6b918a25220ed88d37007741a13", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/ErrorLike.js": "d2867293d032857b9a8cbac7882deb88f53f607cdb7efaa5be67b326513979ac", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/puppeteer/util/assert.js": "463158c2d8421c9afa844beabb02192a30cb49c08eb01190d68ded32e7205cbc", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/cache.ts": "5237f44a6df69fbc9d9ccece95454d5b323f859af15fc516cd62fe3063132fbf", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/mitt/src/index.js": "b19eeafe8c1f3a5cded4b88bb2fe44f1ce4af618a80fcc91a7241a10fe9eba91", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/std.ts": "f40a7715328679df890400a7ed5ca6d959695f416f15f164cf3ad30bf0b00e90", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/zip/mod.ts": "29165da19740460ef193cd4f148c936176f22e6422b193fe6b7b1f2be78394d5", - "https://deno.land/x/puppeteer@16.2.0/vendor/puppeteer-core/vendor/zip/types.ts": "1528d1279fbb64dd118c371331c641a3a5eff2b594336fb38a7659cf4c53b2d1", - "https://deno.land/x/puppeteer_plus@0.18.0/src/install.ts": "2b190694c3435522d021e601778fc83c6ffca55ef58d0e3be92e365a4dae44c7", - "https://deno.land/x/puppeteer_plus@0.18.0/src/patch.ts": "f5f7f105f82d736b95727ec58b159aa5c1e89f2e4e7b82865aeaa0afab21a6ba", - "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", - "https://deno.land/x/zod@v3.21.4/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea", - "https://deno.land/x/zod@v3.21.4/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef", - "https://deno.land/x/zod@v3.21.4/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe", - "https://deno.land/x/zod@v3.21.4/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c", - "https://deno.land/x/zod@v3.21.4/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7", - "https://deno.land/x/zod@v3.21.4/helpers/parseUtil.ts": "51a76c126ee212be86013d53a9d07f87e9ae04bb1496f2558e61b62cb74a6aa8", - "https://deno.land/x/zod@v3.21.4/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7", - "https://deno.land/x/zod@v3.21.4/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e", - "https://deno.land/x/zod@v3.21.4/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774", - "https://deno.land/x/zod@v3.21.4/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268", - "https://deno.land/x/zod@v3.21.4/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", - "https://deno.land/x/zod@v3.21.4/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4", - "https://deno.land/x/zod@v3.21.4/types.ts": "b5d061babea250de14fc63764df5b3afa24f2b088a1d797fc060ba49a0ddff28", - "https://esm.sh/@actions/core@1.10.1": "14b058f0b7444a7ea81babc115b4d6585cb3d5c552f9c0a2106ab8e8afd2b038", - "https://esm.sh/@actions/github@5.1.1": "78cad9d60ae3cdb764360f8eee1e2ed1358f90d39b8af01814da191488e8bdb9", - "https://esm.sh/@faker-js/faker@8.0.2": "4cd8d861f446522d0811d5f4a501bb082a31b30046733ea39ad39e5cbbcb7712", - "https://esm.sh/@octokit/app@14.0.0": "45bb494eeed35628bd85aadc1abb34bf3739a813408cd954addc6e8182bed34a", - "https://esm.sh/@octokit/auth-app@6.0.0": "72be9f1fe2ecc086787f829a5ed26ebaa703be927fc52f3589c4bb5d8380ca7a", - "https://esm.sh/@octokit/core@5.0.0": "0f2622aaa42566d70392a2d569286cd4aa6ec1e773f7dd7b09467f6e938227dd", - "https://esm.sh/@octokit/graphql@7.0.1": "fd09433d190777e8cf298f52a9386af86bda8db904528d2dd3b46e644b220c34", - "https://esm.sh/@octokit/plugin-paginate-graphql@4.0.0": "e6afc9cb1c47fd29797b947329ae0b71a88507876d3f0d572cefa9a1478d98d3", - "https://esm.sh/@octokit/request-error@5.0.0": "b1d20c66a66d7fb914f0c8eda88d5e34a9d4786a62dc452aeb46cc5d1d74a4fb", - "https://esm.sh/@octokit/request@8.1.1": "cbbe5fcd60423f1dfd6d2e950137955b99172099de5aefde86952b4966dee09c", - "https://esm.sh/@octokit/rest@20.0.1": "712b542e635e5559c688d02dab40be563bdbece31cd3c041fb4487d5542bcc50", - "https://esm.sh/@octokit/types@11.1.0": "fabf6997a3adf11e45d11e3c4d58d0634ab98f9d72f3116f3694123818ccd457", - "https://esm.sh/@primer/octicons@19.7.0": "a7b8fb121497e51c33845d3254f1e1b8a90ee136407daace6f734127940cd1b6", - "https://esm.sh/@twemoji/parser@14.1.0": "41ed855240ff0afbc66408434540e76b67401b629d639bfdc5f3db8b6675e993", - "https://esm.sh/alpinejs@3.13.0": "aa91411ce241773bab3f63a7b8bcf18ffaf626f9129f549dba9be1aa6c99f990", - "https://esm.sh/browserify@17.0.0": "8d30acb42e4d4eb9b103c48e7bcf035dc703e5ab851e67fe8f7a2dac3d2c4046", - "https://esm.sh/compare-versions@6.1.0": "201fa5a67808b194128313e2aa2e4305fad94f2366eb28d86051bf084cca2931", - "https://esm.sh/csso@5.0.5": "337688fa652a52757a5562702a9047bde37af888e61031de951ca39f389e56c0", - "https://esm.sh/ejs@3.1.9": "ab1f9d32be4812a740e8fa7ce878bc211316fb4464c6c88a76951c86c7aaeabc", - "https://esm.sh/html-escaper@3.0.3": "2e9ff7f87a30ecd9aa82e9b68a2b913309132337a903077a162fe31b7f6dbfc8", - "https://esm.sh/human-format@1.2.0": "e6ea2ab38602460722afaeefe088006f3a09834e3caf06e342159275090440e2", - "https://esm.sh/jose@4.14.6": "2591dce58fe92a24a982b79d3858c066867fd5d374ff1ae53d806b025ce824f7", - "https://esm.sh/jszip@3.5.0": "4bc490d6b677225a9b48fda8f0c7c907d2a28495567d938236d90492781abb7f", - "https://esm.sh/octokit@3.1.0": "6df8737861c4e6359ca5fdab03fb952463a79d4d71d65cfbfcb82db8a6028784", - "https://esm.sh/pluralize@8.0.0": "0af95641fb7cb57ee6577ba628491448c62c48cf7a6ff4a790c8d8594f39a2c2", - "https://esm.sh/puppeteer-core@21.2.1": "a7448d48cfd9f01b63ff1a33aae3a7e16ec152f0e5c2bece6419a401e33f996e", - "https://esm.sh/puppeteer-core@21.2.1?alias=ws:@libsql/isomorphic-ws&bundle": "718abc810a3d455454510838075fb381e3a6e6244b4a9d9cd4b961085a038234", - "https://esm.sh/puppeteer-core@21.2.1?alias=ws:isomorphic-ws": "098465166c2ad823870bd6a19c5912487f7b19656188cd852c6857f2e159fa26", - "https://esm.sh/puppeteer-core@21.2.1?alias=ws:isomorphic-ws&bundle": "3570e37be426bb6cd1d36f95da09af6e824efa56a525bc3c1c5ff6a367edc97e", - "https://esm.sh/puppeteer-core@21.2.1?bundle": "ad7cdfce86001282f0bf2abfc1669117fd14d80466550c9d3b5245d7e2a9c5b8", - "https://esm.sh/puppeteer-core@21.2.1?bundle&alias=ws:isomorphic-ws": "3570e37be426bb6cd1d36f95da09af6e824efa56a525bc3c1c5ff6a367edc97e", - "https://esm.sh/purgecss@5.0.0": "d1fe60566dbc54243e91c0f8079c49d0c1c03988c863d3cdf59c468d216db09e", - "https://esm.sh/rss-parser@3.13.0": "1978a4035b2d4b90f49330d73e2c6773c44fbb51cedac5549ad6cd0d6c4eb094", - "https://esm.sh/svgo@3.0.2": "321af489ac4abe4ddd35d060406d939a29389baf6d582f82e206b8329e42c532", - "https://esm.sh/v131/@actions/github@5.1.1/denonext/github.mjs": "944224744ff7452f35c89caaf7f0f41ff92ef6ff5dcfd0ce351a819e7cdc2fc8", - "https://esm.sh/v131/@actions/http-client@2.1.0/denonext/http-client.mjs": "05bf430d357f6142a150464ec368fe7eff8f512fb362e88ddb5e2791278f8437", - "https://esm.sh/v131/@octokit/auth-token@2.5.0/denonext/auth-token.mjs": "a7f067796a1a6e00422c3903511a25d4406d1e2396c815b0cd2b34e8b34bb2a1", - "https://esm.sh/v131/@octokit/core@3.6.0/denonext/core.mjs": "0c527f3aa5116147addfed833710039519b46bf632a35ab6117951c4dc9189f1", - "https://esm.sh/v131/@octokit/endpoint@6.0.12/denonext/endpoint.mjs": "bbd789652cfe02227295485a062c0af5de221fc8366934a4feb34a1efc295b09", - "https://esm.sh/v131/@octokit/graphql@4.8.0/denonext/graphql.mjs": "ed31ab8af94a5ec8e737d84e2dab2c541d767225967d635072819c01b4cf3e3c", - "https://esm.sh/v131/@octokit/plugin-paginate-rest@2.21.3/denonext/plugin-paginate-rest.mjs": "28a049516c0c4f831ed504697cf7f4765038c06b071d577a3b9f63b17edfeb8a", - "https://esm.sh/v131/@octokit/plugin-rest-endpoint-methods@5.16.2/denonext/plugin-rest-endpoint-methods.mjs": "02504fb911e19696fe1d10fb65c071e96b3744c1b066b98836fdb2a4aeb4fa14", - "https://esm.sh/v131/@octokit/request-error@2.1.0/denonext/request-error.mjs": "d56a726d70299599d18d9ca458a2fac78d28ff78dacfc0cb5f244169318ab487", - "https://esm.sh/v131/@octokit/request@5.6.3/denonext/request.mjs": "f2784f1530f5f103520bf81075c8fe45261c97725f74744ad8997c4f43b1f463", - "https://esm.sh/v131/@trysound/sax@0.2.0/denonext/sax.mjs": "5af2a1f55d3d7b89542b1412e592e50a4da57906ffa256d2ec17ee56d8876d6c", - "https://esm.sh/v131/JSONStream@1.3.5/denonext/JSONStream.mjs": "a559d227c3711e2665dbecf8d9496574f02a507183faee525d377fe2c43703f5", - "https://esm.sh/v131/acorn-node@1.8.2/denonext/acorn-node.mjs": "be7f83cfe1ebdc423d36498dbc12157a8f4ffb97fa02ed27d956c1e994409f4a", - "https://esm.sh/v131/acorn-node@1.8.2/denonext/walk.js": "fe98cedff08421512d9a7f94f3828b926c2efefdf19c30f53d8642171ead0233", - "https://esm.sh/v131/acorn-walk@7.2.0/denonext/acorn-walk.mjs": "f689ae555ca0f4e97e3c7aec9e5a7a362528321210ed4c78b3e2f92353695cc3", - "https://esm.sh/v131/acorn@7.4.1/denonext/acorn.mjs": "90757e3a809caae2f42084867bb4166d246397ecc8a2572301827bc62f6c37dd", - "https://esm.sh/v131/before-after-hook@2.2.3/denonext/before-after-hook.mjs": "f4262d059d899d7fcaa8d903bcf352df38ac1c040bb45273d79de200ffdad267", - "https://esm.sh/v131/boolbase@1.0.0/denonext/boolbase.mjs": "4e3bd67e9b1c5c55094eae98345d0107c6a44ef57bd3d4b9579698fa44722280", - "https://esm.sh/v131/browser-pack@6.1.0/denonext/browser-pack.mjs": "d85a39bde4cfc034e1f2501c1b91a595e91ec464470d501b706cf060b7bcb2a1", - "https://esm.sh/v131/browser-resolve@2.0.0/denonext/browser-resolve.mjs": "f050c929a5f5b4368798d0bd8ecb486f0a705954333be61bcec10a95b48ca820", - "https://esm.sh/v131/browserify@17.0.0/denonext/browserify.mjs": "44db2c5879ec41dcc2b84b8ba21bad520c8a265ab8def501be24155f79aba917", - "https://esm.sh/v131/buffer-from@1.1.2/denonext/buffer-from.mjs": "078451542b62cb4261c01a01ff7e9bc0f94bef4eb710831d40e1f92c4dfe3883", - "https://esm.sh/v131/cached-path-relative@1.1.0/denonext/cached-path-relative.mjs": "f46b20c0e7d32ea696f9272ff6be5d81c4536d949bddfaceb84ff63cec07f26e", - "https://esm.sh/v131/combine-source-map@0.8.0/denonext/combine-source-map.mjs": "c6ee2dcd70203eb45eeee9abef460dfcbe6daa1ed3a7712766791a93f415b6ba", - "https://esm.sh/v131/concat-stream@1.6.2/denonext/concat-stream.mjs": "11f925b8c8db99486ee0e8656c5e2fadb06a1e5dd3d3cbd3004881e3cac46921", - "https://esm.sh/v131/convert-source-map@1.1.3/denonext/convert-source-map.mjs": "abf64a8283e540c335a8f090f415e18de33e0a4f8e06b32f2fb32e82ec7bfd52", - "https://esm.sh/v131/core-util-is@1.0.3/denonext/core-util-is.mjs": "f19dfe63f62278ae0c5a25bd85ffeac5bbdb099b22f005d01bbb62673505deec", - "https://esm.sh/v131/css-select@5.1.0/denonext/css-select.mjs": "c2dd9ef23add4ebee64156f6d9a87ad7e40875b1477cf0bb6a456c4a2c9570e1", - "https://esm.sh/v131/css-tree@2.2.1/denonext/css-tree.mjs": "b757a3220a7ae7c34512091c697457ccec3414f498452e581083ec6cd813a421", - "https://esm.sh/v131/css-tree@2.3.1/denonext/css-tree.mjs": "1006dd9810e6482c38a228a7ba7458e5997d9d4ae96448cdd09ddb6f1bca8cfe", - "https://esm.sh/v131/css-what@6.1.0/denonext/css-what.mjs": "283d02df6fef73d3223b55324b559b363dd0e4c008ea1efbcf9f14b8f2642202", - "https://esm.sh/v131/csso@5.0.5/denonext/csso.mjs": "4ce8ca79a2edba20025de6c7955632d80c9c0881631b02be1ebbb1e105f1092c", - "https://esm.sh/v131/dash-ast@1.0.0/denonext/dash-ast.mjs": "f373d7ee50f9029af3b5688f06ac1733df201ef56f6b8048058e50d369ded030", - "https://esm.sh/v131/defined@1.0.1/denonext/defined.mjs": "23a4b6f1dd519b704146cb6f269ec68310b71e4f18812174f5257a9cd2ba04c5", - "https://esm.sh/v131/deprecation@2.3.1/denonext/deprecation.mjs": "0bf7139d1068345709e59dddb4daea315691d290a8c896a6e076dea02dd66eaf", - "https://esm.sh/v131/deps-sort@2.0.1/denonext/deps-sort.mjs": "4442b68c49b052e0361a868c291c4d2d8346e1ca16c958c42d1647b7686df8fb", - "https://esm.sh/v131/detective@5.2.1/denonext/detective.mjs": "0a56371138f12a1b0bdc3593e1df0ed7419c0d1b7a097ab6c53fd9747aa1cf5f", - "https://esm.sh/v131/dom-serializer@2.0.0/denonext/dom-serializer.mjs": "b4653fd91e295a1afebe4dbd9d41c4e437931e60bd71d6140ccf23cb824afb43", - "https://esm.sh/v131/domelementtype@2.3.0/denonext/domelementtype.mjs": "371936c356d5ac797f2ce3a66b98dfc73e6fff0e095b2858b85668e6ad7d10e0", - "https://esm.sh/v131/domhandler@5.0.3/denonext/domhandler.mjs": "f88707ec8b4321b3c36661deec7e8b6d9670e5feccf977cf5cb9018a783567b9", - "https://esm.sh/v131/domutils@3.1.0/denonext/domutils.mjs": "ae611c3563bfdeac51e0b797dc2053551f782b1a8bb5b2fcacd3e4882c5185ce", - "https://esm.sh/v131/duplexer2@0.1.4/denonext/duplexer2.mjs": "90cf4d0253e9fade0258cf4b89137cf4efcfb75fbf1f7788d7f3cc59eb8b9d0b", - "https://esm.sh/v131/entities@4.5.0/denonext/entities.mjs": "e491f306bcd67703da07e7a4364656fc109d55cc871422c282ed7829b8bfbfab", - "https://esm.sh/v131/fast-safe-stringify@2.1.1/denonext/fast-safe-stringify.mjs": "8b0ef0a4235c4efe44865357a73aa6d9eaf4d0c7c8705dfe744f5cce60eefd00", - "https://esm.sh/v131/function-bind@1.1.1/denonext/function-bind.mjs": "331f5d2a5830a67a767be946331716b1b9db05125891100a16e24114dba8ef87", - "https://esm.sh/v131/get-assigned-identifiers@1.2.0/denonext/get-assigned-identifiers.mjs": "763ae087d80fc9c56e29470244fc6d18d4586ada9c3082001f860b2752baf149", - "https://esm.sh/v131/has@1.0.3/denonext/has.mjs": "863ea1c6778762af15a01d6b6cb050be483239a2394a1cbd48ad861cdcd1e5d8", - "https://esm.sh/v131/htmlescape@1.1.1/denonext/htmlescape.mjs": "cc11c0cfccbffe79a032cab4e0bc138505917f490e3baafef463e08a60811c69", - "https://esm.sh/v131/immediate@3.0.6/denonext/immediate.mjs": "521875473fbc7a2cbf94a7475e64883a9ca4b79c19d9138edfbf31ac2eeb0efa", - "https://esm.sh/v131/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", - "https://esm.sh/v131/inline-source-map@0.6.2/denonext/inline-source-map.mjs": "b675e32637b99f1924a541e8f1cdc26c8190c6f5916b8c84cf240197d7abe3f1", - "https://esm.sh/v131/insert-module-globals@7.2.1/denonext/insert-module-globals.mjs": "58f9c2929865572ceec9968304120cd0d3c2b6784d3c5a1e2b68d91a978bf0d3", - "https://esm.sh/v131/is-core-module@2.12.1/denonext/is-core-module.mjs": "56aa0fcf25374a0ca4a50dd25523c6e02d6515545f942c56a35c9737910bc0f1", - "https://esm.sh/v131/is-plain-object@5.0.0/denonext/is-plain-object.mjs": "6d9568ddc8b90de99a46c63e14984810280b6b021dc4e478803b3c240811985f", - "https://esm.sh/v131/isarray@1.0.0/denonext/isarray.mjs": "6368a41cf02c83843453ac571deb4c393c14e6f5e1d9ca6bbe43a4623f3856c8", - "https://esm.sh/v131/jsonparse@1.3.1/denonext/jsonparse.mjs": "ea8830b4bfaa7972aafe503ec91c8af862a24ce06e5b1406b808fca70356531f", - "https://esm.sh/v131/jszip@3.5.0/denonext/jszip.mjs": "b6318816ff10636a011ba3c36a31a0a97c659e3bfc149d214475e4259f91ab5f", - "https://esm.sh/v131/labeled-stream-splicer@2.0.2/denonext/labeled-stream-splicer.mjs": "08290ae2532a21e38bfdb0dd1963f833e0c9c12e248056a233521c6a5e26f90b", - "https://esm.sh/v131/lie@3.3.0/denonext/lie.mjs": "6c830a20ad3c0530774990a360acb832e43bc30f4f477c7a367b02bcecf8bdf3", - "https://esm.sh/v131/lodash.memoize@3.0.4/denonext/lodash.memoize.mjs": "06bfc7fd8d11ad7314e470d11e409aff2a6778321a48b830fb689a2f5d386214", - "https://esm.sh/v131/module-deps@6.2.3/denonext/module-deps.mjs": "dfc7d632f18420edec18469b824341c12d1de6f39f0c37bd1ffd132345b590ff", - "https://esm.sh/v131/node_fetch.js": "eb4be18bc6ed9f45aacb943cc12e2d9a7dff73537dc6155b96e8c7ab3f79b6ba", - "https://esm.sh/v131/nth-check@2.1.1/denonext/nth-check.mjs": "963086b6de9570c12d67400ca45358dbe4e2e4f54f197ee21b83308e5e4158fa", - "https://esm.sh/v131/once@1.4.0/denonext/once.mjs": "b4eb5beddf7f0f8ab4db5e56987d53e5f0fd77961eac5dd554ab75aa79ef0202", - "https://esm.sh/v131/pako@1.0.11/denonext/pako.mjs": "e5785da102bdb7ef477f4198b2be65517909be7b8e74cb9267591cbc2e650d5a", - "https://esm.sh/v131/parents@1.0.1/denonext/parents.mjs": "2726031f02be1ae223bdce8b16d8178b3571f8f8cb6ffa8536f46636f590fce8", - "https://esm.sh/v131/path-is-absolute@1.0.1/denonext/path-is-absolute.mjs": "678005e3a51e4d28fabe4689d94e4fc86e00bed0f1f86d6225f1bb83b94a1b2e", - "https://esm.sh/v131/path-parse@1.0.7/denonext/path-parse.mjs": "7076e749c5b4c0027bab7dc698bd4477fdc31c2f4a308838d4e549d84a58bff3", - "https://esm.sh/v131/path-platform@0.11.15/denonext/path-platform.mjs": "028b52ce65f77b8096452892024f9cd8ae05d7c6aea62b5384cc4d6671e342cf", - "https://esm.sh/v131/process-nextick-args@2.0.1/denonext/process-nextick-args.mjs": "a57885eb600374afb2521e1d47e92df4d292d49c90c31496da5d0dde2f0d0b5f", - "https://esm.sh/v131/read-only-stream@2.0.0/denonext/read-only-stream.mjs": "9cd694b0f224e32dc37b6ef2aaef4a4f30cbe0befb7179c3f907729fa89f2aa3", - "https://esm.sh/v131/readable-stream@2.3.8/denonext/readable-stream.mjs": "9c2952f308e93db73ce18182be01e4e820866fdf35042a60ef29c317a4ffa72b", - "https://esm.sh/v131/resolve@1.22.2/denonext/resolve.mjs": "aa9aa2137defa06f284e4f074d6bd24012116df08da2e9d09026a74565904794", - "https://esm.sh/v131/safe-buffer@5.1.2/denonext/safe-buffer.mjs": "bf91200afdaf8be92e5c7d4c79e4dc9b5c534f76e104f1b37e5891d6f81eaca2", - "https://esm.sh/v131/safe-buffer@5.2.1/denonext/safe-buffer.mjs": "facbcb4f4622e13062978522fa12c42cae4e12f55b0e1d3fa1c4bc751bd827c7", - "https://esm.sh/v131/set-immediate-shim@1.0.1/denonext/set-immediate-shim.mjs": "2ff36ce48c47dda8fb85fdfde6ad53ed3a329d140b3e19bbe9750aebdf10812a", - "https://esm.sh/v131/shasum-object@1.0.0/denonext/shasum-object.mjs": "5c14c2f8ab529594c6042637e7fa7befb5ecef95c8fd925e63a2e531d5df8c82", - "https://esm.sh/v131/source-map-js@1.0.2/denonext/lib/source-map-generator.js": "8aff2603c0b8e01a585cd0d43582e6bc2787071fd68c4eb7a4dfe03da9cab69e", - "https://esm.sh/v131/source-map@0.5.7/denonext/source-map.mjs": "410c2b46179b5fca0fc98d83d62061e29a620fdcb9011c0f0c1d25848f8d7322", - "https://esm.sh/v131/stream-combiner2@1.1.1/denonext/stream-combiner2.mjs": "cc9b21e76c443e11f10f5810a43a26379e6acbc6d787849e13cad071863c838e", - "https://esm.sh/v131/stream-splicer@2.0.1/denonext/stream-splicer.mjs": "75989e7ec3cfac4105a180494b975b45315faef0fac96b8c06be565c1206944e", - "https://esm.sh/v131/svgo@3.0.2/denonext/svgo.mjs": "3541ba27b6240c4b5d349cc17b8d5dcbc9ab8c7ec783fc269e557a409447dfd5", - "https://esm.sh/v131/syntax-error@1.4.0/denonext/syntax-error.mjs": "38f92387aa060e47f6013cd68ff15d49233865dc09d433665a04187a617eec5c", - "https://esm.sh/v131/through2@2.0.5/denonext/through2.mjs": "e4f46832b4a86219fc292f44b3e77efe58cb0fe841f096100dffcef4ac25bb8a", - "https://esm.sh/v131/through@2.3.8/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", - "https://esm.sh/v131/tunnel@0.0.6/denonext/tunnel.mjs": "4677e2d07e87aa3cd9400cb25ce42d65b6e487d7fe66bcdbd7f18549aa6b88ed", - "https://esm.sh/v131/typedarray@0.0.6/denonext/typedarray.mjs": "78da14557506ad44e927cfb54f4c615f64ecd89aef5abdbfdf17bd29df64554d", - "https://esm.sh/v131/umd@3.0.3/denonext/umd.mjs": "913294420c96d1d4d0cac1fa19dd82ed1b349cab6ad2f275d4ac46373e5fec91", - "https://esm.sh/v131/undeclared-identifiers@1.1.3/denonext/undeclared-identifiers.mjs": "fa33ce8b455d3331af4e619086575dccc11bd56bfdbf4022e70f23f8ab14969e", - "https://esm.sh/v131/universal-user-agent@6.0.0/denonext/universal-user-agent.mjs": "2969647abd054007e6d838dd2ecc7de9c513c18c43322dfa3de57eec8d2d6447", - "https://esm.sh/v131/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", - "https://esm.sh/v131/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", - "https://esm.sh/v131/xtend@4.0.2/denonext/xtend.mjs": "503056f181793967e90c0566a737612694366fa7191172f4a106099b5c2a80d2", - "https://esm.sh/v132/@actions/core@1.10.1/denonext/core.mjs": "80be5c75e93f1fd245333c63723dc621f0a2e7add8c92f09de728f69a756c272", - "https://esm.sh/v132/@actions/http-client@2.1.0/denonext/http-client.mjs": "86f27b9c63eca386d3b2725124a86fd50f8c4dff1dba30648689195c87598bb5", - "https://esm.sh/v132/@actions/http-client@2.1.0/denonext/lib/auth.js": "e27889069e589eef705601a5878554a90c4b824732864f750c4f2b7303dfe974", - "https://esm.sh/v132/@faker-js/faker@8.0.2/denonext/faker.mjs": "870def5d50e632211a71722109fae486a00080a14a2329589ea4a83f878b6699", - "https://esm.sh/v132/@octokit/app@14.0.0/denonext/app.mjs": "660db7abb5831110a12017a317fa1fe45b303c3a61d299a12c5f4dfb972990db", - "https://esm.sh/v132/@octokit/auth-app@6.0.0/denonext/auth-app.mjs": "5833c3fdd9249d53d1c33652eb6f4a3b238ed21f303fa7cd4475e9342dcb8ea2", - "https://esm.sh/v132/@octokit/auth-oauth-app@7.0.0/denonext/auth-oauth-app.mjs": "d24f9baa219f4da5828f7395f3b149d0529eff900eed456efeef752e18314a63", - "https://esm.sh/v132/@octokit/auth-oauth-device@6.0.0/denonext/auth-oauth-device.mjs": "3e398998f4e34a4beccf9e71ff89f01cae0191ebf6c57926479af430174a1419", - "https://esm.sh/v132/@octokit/auth-oauth-user@4.0.0/denonext/auth-oauth-user.mjs": "314e2b8a9c5e844f43ef551b487a4fe7cc096245155b7bfc11788c6706878e86", - "https://esm.sh/v132/@octokit/auth-token@4.0.0/denonext/auth-token.mjs": "ab9285959f2bc3ca7942bfb81df3e2f15f5895c829455156647faa403b75703b", - "https://esm.sh/v132/@octokit/auth-unauthenticated@5.0.0/denonext/auth-unauthenticated.mjs": "5c2690a2af409c0e9abe13b6188fee74bd157f787ebbe8d2377813b696b2a74e", - "https://esm.sh/v132/@octokit/core@5.0.0/denonext/core.mjs": "3ba35fb190fc3296e0359f34314aa7ae5a5795dbd72d7068a74c553533191959", - "https://esm.sh/v132/@octokit/endpoint@9.0.0/denonext/endpoint.mjs": "e12041e99a773321b0d175a860b81b7c39708de6dbadddfe3398ee159b8c9e9e", - "https://esm.sh/v132/@octokit/graphql@7.0.1/denonext/graphql.mjs": "51816b6e7188dce0e3d7435251e7310157ad20658673def6e9fa47e816654dfc", - "https://esm.sh/v132/@octokit/oauth-app@6.0.0/denonext/oauth-app.mjs": "0b448785123ee4fe3e2bf1a08e74964100aaaefb0507e99d5563b057d05cb1a9", - "https://esm.sh/v132/@octokit/oauth-authorization-url@6.0.2/denonext/oauth-authorization-url.mjs": "c4a3809c1092ab4135bbb65ba82e885b915a3e0b68e8c9554c98766388baa399", - "https://esm.sh/v132/@octokit/oauth-methods@4.0.0/denonext/oauth-methods.mjs": "fd10083bf9e2ed4beeccdab7a40ba3181cd1cc76958521cdc0c395c63cdb665e", - "https://esm.sh/v132/@octokit/plugin-paginate-graphql@4.0.0/denonext/plugin-paginate-graphql.mjs": "6d2abafdadec31dc3afb9308c18a44b51b834357011d67dce611817196ac032f", - "https://esm.sh/v132/@octokit/plugin-paginate-rest@8.0.0/denonext/plugin-paginate-rest.mjs": "8ed6e17dcb65d460c99fe3c3133c20b566fa2c7c4aedcf931e795ea2ca46e24f", - "https://esm.sh/v132/@octokit/plugin-request-log@4.0.0/denonext/plugin-request-log.mjs": "8683bc54297e4657259a0edc6abe2c8cf9953c1b044faa8cfb1a9bc0970b54a3", - "https://esm.sh/v132/@octokit/plugin-rest-endpoint-methods@9.0.0/denonext/plugin-rest-endpoint-methods.mjs": "84a5baa44ee16c3ffe9347291fbc106aefa5e57c48b31eacf6bb0ca60b7ad5cd", - "https://esm.sh/v132/@octokit/plugin-retry@6.0.0/denonext/plugin-retry.mjs": "09841bfd643bbdcf55a7c8e884c23533ccb952de063e68c32970ee08ecb86e4d", - "https://esm.sh/v132/@octokit/plugin-throttling@7.0.0/denonext/plugin-throttling.mjs": "e481fde726771da89041353e30f097de0464fda4ec408c9ea541ffa5d37f67f4", - "https://esm.sh/v132/@octokit/request-error@5.0.0/denonext/request-error.mjs": "dfc75ef3272174505d06ccd7bb0128ccc81603bf6c3d45d4089bcf57de956fc2", - "https://esm.sh/v132/@octokit/request@8.1.1/denonext/request.mjs": "9188b4e13c35b697fd9a61c164d3e3f9fe01c8c70a8807a01f2f790cf8baf06f", - "https://esm.sh/v132/@octokit/rest@20.0.1/denonext/rest.mjs": "682fd99ba3a3a08099fbdf228c740b9ba962f9929ea3b179e94864f10a0b7e61", - "https://esm.sh/v132/@octokit/webhooks-methods@4.0.0/denonext/webhooks-methods.mjs": "b44d80a07e6e698c95a2fc2789e2caf10b4ff821300e947b2e79c449453a7a19", - "https://esm.sh/v132/@octokit/webhooks@12.0.3/denonext/webhooks.mjs": "0cfd18152589f098ba5d8bde4bd0e884c51e61ae814f93dd77707682291706f1", - "https://esm.sh/v132/@primer/octicons@19.7.0/denonext/octicons.mjs": "fac114048b389625024008b8e689aa47590a2d7d399dd968de699b9942c2c1bd", - "https://esm.sh/v132/@puppeteer/browsers@1.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/browsers.mjs": "1d70b01b6a52b24dfc2bc5a21e04ed9701fad498e75bcd02faeadb19fa384199", - "https://esm.sh/v132/@puppeteer/browsers@1.7.1/denonext/browsers.mjs": "ba676db07959dbd4c963bf88305ebb6b8f86ddbd19cecf30382e1d95cec7a4d9", - "https://esm.sh/v132/@tootallnate/quickjs-emscripten@0.23.0/X-YS93czppc29tb3JwaGljLXdz/denonext/quickjs-emscripten.mjs": "47b4c7313960abe0169c9686ac7fb81c5499816e059ced10d0d150545e40d3e7", - "https://esm.sh/v132/@tootallnate/quickjs-emscripten@0.23.0/denonext/quickjs-emscripten.mjs": "c71def3a2ffe572f7b9587bd353c0405564faa8c7f35864dcbcacbf539b09eaa", - "https://esm.sh/v132/@twemoji/parser@14.1.0/denonext/parser.mjs": "49be06f8aace91c31d62ab861d019657bdbed8fac3491a2ec2521ebada375139", - "https://esm.sh/v132/agent-base@7.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/agent-base.mjs": "fa8d6479aa0028074ed701078b47c3303b68ac435050b1364b20577a531ca6fe", - "https://esm.sh/v132/agent-base@7.1.0/denonext/agent-base.mjs": "fa8d6479aa0028074ed701078b47c3303b68ac435050b1364b20577a531ca6fe", - "https://esm.sh/v132/aggregate-error@3.1.0/denonext/aggregate-error.mjs": "b28a9c083fba80c73d235f2ef8869695ac288af1fb371469aa218ea9128a209a", - "https://esm.sh/v132/alpinejs@3.13.0/denonext/alpinejs.mjs": "fc7a8d3ed5384c2f7f722812ddb98991461740ede9c0d4e49c63383697909c0c", - "https://esm.sh/v132/ansi-regex@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/ansi-regex.mjs": "738d194ad7037256cfcd3f87d3716d28096261492d163395badfbdab3f72ce15", - "https://esm.sh/v132/ansi-regex@5.0.1/denonext/ansi-regex.mjs": "738d194ad7037256cfcd3f87d3716d28096261492d163395badfbdab3f72ce15", - "https://esm.sh/v132/ast-types@0.13.4/X-YS93czppc29tb3JwaGljLXdz/denonext/ast-types.mjs": "8b8888d9fcffda3e8dde19410468778d03696a8dcf8d1b295fbb17cd4122c6c0", - "https://esm.sh/v132/ast-types@0.13.4/denonext/ast-types.mjs": "1ad44647c921093c5baabf8c4ff6dd4e000e93e7ba4b5dc8bb5c37da3fe4ac0d", - "https://esm.sh/v132/b4a@1.6.4/X-YS93czppc29tb3JwaGljLXdz/denonext/b4a.mjs": "f34afd65a97ec9e9e600c2f8211cd21285d0fd37cdca8f6b69c18b915704dbc5", - "https://esm.sh/v132/b4a@1.6.4/denonext/b4a.mjs": "f34afd65a97ec9e9e600c2f8211cd21285d0fd37cdca8f6b69c18b915704dbc5", - "https://esm.sh/v132/balanced-match@1.0.2/denonext/balanced-match.mjs": "b2f9737a6fb330aedd4a444eb85ba127d757c49032a528400fc0e2efb70ddca3", - "https://esm.sh/v132/basic-ftp@5.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/basic-ftp.mjs": "74bd9f9d9e67abbc1f3965c18efc175d617eebe8b6609c31ca8481f918681d46", - "https://esm.sh/v132/basic-ftp@5.0.3/denonext/basic-ftp.mjs": "74bd9f9d9e67abbc1f3965c18efc175d617eebe8b6609c31ca8481f918681d46", - "https://esm.sh/v132/before-after-hook@2.2.3/denonext/before-after-hook.mjs": "f4262d059d899d7fcaa8d903bcf352df38ac1c040bb45273d79de200ffdad267", - "https://esm.sh/v132/bottleneck@2.19.5/denonext/light.js": "964cbaaa1bf999d34a2410023ae269f921c82c72009c707a1fd02fb6abad5b1d", - "https://esm.sh/v132/brace-expansion@2.0.1/denonext/brace-expansion.mjs": "d6952fb4f0cee3ad87c36030f0128b23bf50a566625678207e9fde8b9a30326d", - "https://esm.sh/v132/btoa-lite@1.0.0/denonext/btoa-lite.mjs": "5f8ecdf77c8824225e30cf84b62ded0fa667ef51fe1a8b772b1ddf46410bf78f", - "https://esm.sh/v132/buffer-crc32@0.2.13/X-YS93czppc29tb3JwaGljLXdz/denonext/buffer-crc32.mjs": "8e65c573993c2df678b998137569aee9a72c3f4a607bc4778a122756b3ce297e", - "https://esm.sh/v132/buffer-crc32@0.2.13/denonext/buffer-crc32.mjs": "8e65c573993c2df678b998137569aee9a72c3f4a607bc4778a122756b3ce297e", - "https://esm.sh/v132/bufferutil@4.0.7/denonext/bufferutil.mjs": "b25ca474c1bd022655bcc0489055a5384e298963c3a046cb75cc83c7e5e2e225", - "https://esm.sh/v132/chromium-bidi@0.4.26/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/cjs/bidiMapper/bidiMapper.js": "53c1e19d84600b9ce365f97b418b7b08782e8021fd828820f65cdba335e6314b", - "https://esm.sh/v132/chromium-bidi@0.4.26/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/cjs/protocol/protocol.js": "6ed4cea0c46f6f41f3bd829da1a83497f4455f23ce9111004539608a860bfefc", - "https://esm.sh/v132/chromium-bidi@0.4.26/denonext/lib/cjs/bidiMapper/bidiMapper.js": "277a0b0490035622b4fe9410159e51d8e3dfad3d03487819368a694c7fedb877", - "https://esm.sh/v132/chromium-bidi@0.4.26/denonext/lib/cjs/protocol/protocol.js": "6ed4cea0c46f6f41f3bd829da1a83497f4455f23ce9111004539608a860bfefc", - "https://esm.sh/v132/clean-stack@2.2.0/denonext/clean-stack.mjs": "8a2732fd195c0663d9f8a3957932215f3d4cb45dbe2f4747c9f39a966a4f067b", - "https://esm.sh/v132/cliui@8.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/cliui.mjs": "ae61b40db8f38866c143dfe4a7c2206bba9526fc4bdf5cec1443294420ef3eba", - "https://esm.sh/v132/cliui@8.0.1/denonext/cliui.mjs": "ae61b40db8f38866c143dfe4a7c2206bba9526fc4bdf5cec1443294420ef3eba", - "https://esm.sh/v132/compare-versions@6.1.0/denonext/compare-versions.mjs": "4f3fdfdd991b1e698c212697e8eb407a3a0f6f63dd45b15841afe0a944eb0ea8", - "https://esm.sh/v132/cross-fetch@4.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/cross-fetch.mjs": "238eae32034ab217cdbef10b812c7357f61ab2730c58207f4cf9135e9dec7a61", - "https://esm.sh/v132/cross-fetch@4.0.0/denonext/cross-fetch.mjs": "238eae32034ab217cdbef10b812c7357f61ab2730c58207f4cf9135e9dec7a61", - "https://esm.sh/v132/css-tree@2.2.1/denonext/css-tree.mjs": "029fb11a6dc01851e2010d82011c0c982718df39b8205ab001ca680d100da977", - "https://esm.sh/v132/cssesc@3.0.0/denonext/cssesc.mjs": "8e1441106b9e0d6a2b1c5f012f9f22962fbd8661490c06e7d0f602dd2b65864f", - "https://esm.sh/v132/csso@5.0.5/denonext/csso.mjs": "2636ff0820a385e131cb80d50be52fa7495ddad6ed67f2e904d51ce17bd0f40c", - "https://esm.sh/v132/data-uri-to-buffer@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/data-uri-to-buffer.mjs": "8cd7bd53af8e36a0beaf6405d63d51af7a2abb72219d5359d3f61d3cee73c4bc", - "https://esm.sh/v132/data-uri-to-buffer@5.0.1/denonext/data-uri-to-buffer.mjs": "8cd7bd53af8e36a0beaf6405d63d51af7a2abb72219d5359d3f61d3cee73c4bc", - "https://esm.sh/v132/debug@4.3.4/X-YS93czppc29tb3JwaGljLXdz/denonext/debug.mjs": "d0d5027ba8245e7dc34bb3356ccdddbb3ac2aa1bf1ca1d7321981ce4bf71dc05", - "https://esm.sh/v132/debug@4.3.4/denonext/debug.mjs": "d2d7158f8de406c9ce8e9601650e16bcf4031f476bc212a750fa851b33f8adf7", - "https://esm.sh/v132/degenerator@5.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/degenerator.mjs": "bf57cdbcdcff3d551788e51bf69d735271d1395caf9622cd011719dd4b462634", - "https://esm.sh/v132/degenerator@5.0.1/denonext/degenerator.mjs": "9a21df7d9f28a76cee1b1aa2f685703ed8de973771713bcba4c86919c847b7fc", - "https://esm.sh/v132/deprecation@2.3.1/denonext/deprecation.mjs": "0bf7139d1068345709e59dddb4daea315691d290a8c896a6e076dea02dd66eaf", - "https://esm.sh/v132/ejs@3.1.9/denonext/ejs.mjs": "46c96cc938964f65517d07e9b2960fb84317eec0078bfdce0ed60c63e1dcd23d", - "https://esm.sh/v132/emoji-regex@8.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/emoji-regex.mjs": "da8ce329dbc5d6fab22dc15280b7f53836043511ca208246f376e0808d98c656", - "https://esm.sh/v132/emoji-regex@8.0.0/denonext/emoji-regex.mjs": "da8ce329dbc5d6fab22dc15280b7f53836043511ca208246f376e0808d98c656", - "https://esm.sh/v132/end-of-stream@1.4.4/X-YS93czppc29tb3JwaGljLXdz/denonext/end-of-stream.mjs": "4f450b8139d3b56cfd2c638e53b2ac014a9e8aef901807f8d53aa6b25219f862", - "https://esm.sh/v132/end-of-stream@1.4.4/denonext/end-of-stream.mjs": "a44af9df6e745ef11b7915823ee5633326776816cec039795d05354cf15c9aea", - "https://esm.sh/v132/entities@2.2.0/denonext/entities.mjs": "af15975e7c8b5f17be658d1db80f9de7c076cb9cd53c4dcfc9dd60d460266d62", - "https://esm.sh/v132/escalade@3.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/sync.js": "9a3234bc32771d5f39cb1054ae66351d44a35235c4b8fed07e8241d7215f0b23", - "https://esm.sh/v132/escalade@3.1.1/denonext/sync.js": "9a3234bc32771d5f39cb1054ae66351d44a35235c4b8fed07e8241d7215f0b23", - "https://esm.sh/v132/escodegen@2.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/escodegen.mjs": "6e51c2b911bcd23c85d11061931b66336bc6963e0b1d60a8aa0da4a9373204af", - "https://esm.sh/v132/escodegen@2.1.0/denonext/escodegen.mjs": "09eef48118403c9c84f43e65bb6241ffe7b303e72468dd4e939ed193ba4374b5", - "https://esm.sh/v132/esprima@4.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/esprima.mjs": "e8601201d5cc2c881a4a1225806fa460455917137b2b852354c2cf3bc2a60f78", - "https://esm.sh/v132/esprima@4.0.1/denonext/esprima.mjs": "e8601201d5cc2c881a4a1225806fa460455917137b2b852354c2cf3bc2a60f78", - "https://esm.sh/v132/estraverse@5.3.0/X-YS93czppc29tb3JwaGljLXdz/denonext/estraverse.mjs": "3e3574b932e1b7c1476f467e6103559d7b978df412e50b6b97299679d4556004", - "https://esm.sh/v132/estraverse@5.3.0/denonext/estraverse.mjs": "3e3574b932e1b7c1476f467e6103559d7b978df412e50b6b97299679d4556004", - "https://esm.sh/v132/esutils@2.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/esutils.mjs": "56b9038ae71de0a374c86435a347793030afc96deb151466a5009cb5384a85d0", - "https://esm.sh/v132/esutils@2.0.3/denonext/esutils.mjs": "56b9038ae71de0a374c86435a347793030afc96deb151466a5009cb5384a85d0", - "https://esm.sh/v132/extract-zip@2.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/extract-zip.mjs": "a00041595b46c1b0553195dd5f9b916c2c7e6f177b947e6c66a9c164b71bf33d", - "https://esm.sh/v132/extract-zip@2.0.1/denonext/extract-zip.mjs": "217739b3b6f3828ebb2e9493c0d1c7334df8b2c40e7f3c6bc4f282cc6ecc14a7", - "https://esm.sh/v132/fast-fifo@1.3.0/denonext/fast-fifo.mjs": "298b77b0f0e0c0f5bfb1597b543ca81783163015afb6e18e57453883ea937f53", - "https://esm.sh/v132/fast-fifo@1.3.2/X-YS93czppc29tb3JwaGljLXdz/denonext/fast-fifo.mjs": "c4aabf3d2b427cd6c05d64d83c59cb3131f3abf9e638663925977b9bf10c47a1", - "https://esm.sh/v132/fd-slicer@1.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/fd-slicer.mjs": "7ad40246ac9b1de5b45bbe2c754ca0522053a297a47e2a0494f7b0e390b583d8", - "https://esm.sh/v132/fd-slicer@1.1.0/denonext/fd-slicer.mjs": "82ba1fa74b48e8aca975c5298be74d26736dd0cf68c10677b7a73430632c7a25", - "https://esm.sh/v132/fs-extra@8.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/fs-extra.mjs": "f60fe248394cd5d93924a87f2566b939920f87af65a1159c867676681854ef37", - "https://esm.sh/v132/fs-extra@8.1.0/denonext/fs-extra.mjs": "5350d09ddd3b49774de877571e03680fb295af826844841ece9bf4a562339314", - "https://esm.sh/v132/fs.realpath@1.0.0/denonext/fs.realpath.mjs": "289f113bc42f0e616afcb7f5d677424a20ee8cecb4eeac0c24be14e83ae3e1ac", - "https://esm.sh/v132/get-caller-file@2.0.5/X-YS93czppc29tb3JwaGljLXdz/denonext/get-caller-file.mjs": "6499276b8de4753fad331af2a8fff9efb8f4aebb5111c94b0430f751b4aac6e5", - "https://esm.sh/v132/get-caller-file@2.0.5/denonext/get-caller-file.mjs": "6499276b8de4753fad331af2a8fff9efb8f4aebb5111c94b0430f751b4aac6e5", - "https://esm.sh/v132/get-stream@5.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/get-stream.mjs": "704bdd45a40426a83f4634a9194191026adeca14e109b7e370e117ffda4ec591", - "https://esm.sh/v132/get-stream@5.2.0/denonext/get-stream.mjs": "791d0f28f61e094c0a9e686e32dea69342e97618799223988f42fa379280e383", - "https://esm.sh/v132/get-uri@6.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/get-uri.mjs": "8fd8736b3d52efa9ee2356558bf45bcf8adc4f434b2e036d391240d556be9c82", - "https://esm.sh/v132/get-uri@6.0.1/denonext/get-uri.mjs": "86587f08c548fc43cdb1dfb4e8c6e8617201a6ed5f965bc123f3d743e01c2cc3", - "https://esm.sh/v132/glob@8.1.0/denonext/glob.mjs": "5231076466f6a71b3fac965f8b9cc216c8165868bec7ef17ebad935710d7a439", - "https://esm.sh/v132/graceful-fs@4.2.11/X-YS93czppc29tb3JwaGljLXdz/denonext/graceful-fs.mjs": "c1d9c1b7a280b3c2bb3cf2c48e1cbfb1791bd052f0836a58100725e0beac3c16", - "https://esm.sh/v132/graceful-fs@4.2.11/denonext/graceful-fs.mjs": "1af0eb8163173bcbd5bb33526f42bdfe66e2489227fc82181fb3a081fb32ee4e", - "https://esm.sh/v132/html-escaper@3.0.3/denonext/html-escaper.mjs": "c51d972a3e0a4560b4f2e81b42a71b68d986461c809d576c56d00e729d08258e", - "https://esm.sh/v132/http-proxy-agent@7.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/http-proxy-agent.mjs": "ddac68fe569a37602c2fa17f6111241452765acb1742801e1501d008ab65a9f7", - "https://esm.sh/v132/http-proxy-agent@7.0.0/denonext/http-proxy-agent.mjs": "9134b2f1ea33408977966b59e8459468b302d2cc1f919f510ccbaaf631c600a3", - "https://esm.sh/v132/https-proxy-agent@7.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/https-proxy-agent.mjs": "4f4c007a4ea1cc3f6acdaed4f38b29e06a0c849d4c03c5ddaa46e4ecb2d3f5a9", - "https://esm.sh/v132/https-proxy-agent@7.0.2/denonext/https-proxy-agent.mjs": "81ae7c11d8ee1e99cfc12f8661ae2450a76f49119be8a7aef2303af7e34ba4f5", - "https://esm.sh/v132/human-format@1.2.0/denonext/human-format.mjs": "d767edbf69b662936013c764c680b80180e26b7851d633bbf5c0f28090bad4e6", - "https://esm.sh/v132/indent-string@4.0.0/denonext/indent-string.mjs": "de4038b836a42fe2a7c453bd0b44cdae706a9560bbef99b1857c13f9d55ace14", - "https://esm.sh/v132/inflight@1.0.6/denonext/inflight.mjs": "05e2dc32d0f09a76d2072d10e53a3341cd1b72a60e0ae5344b3ff8ccaea769e1", - "https://esm.sh/v132/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b", - "https://esm.sh/v132/ip@1.1.8/X-YS93czppc29tb3JwaGljLXdz/denonext/ip.mjs": "fbbc4c97819b14fc512e99e6236416e67defd7315facfa09f90ed2bdeef9ba95", - "https://esm.sh/v132/ip@1.1.8/denonext/ip.mjs": "fbbc4c97819b14fc512e99e6236416e67defd7315facfa09f90ed2bdeef9ba95", - "https://esm.sh/v132/ip@2.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/ip.mjs": "93a8de80ff6d67996023e1df52ca092d55fc30794166c1e23bc5e87c84863a5f", - "https://esm.sh/v132/ip@2.0.0/denonext/ip.mjs": "93a8de80ff6d67996023e1df52ca092d55fc30794166c1e23bc5e87c84863a5f", - "https://esm.sh/v132/is-fullwidth-code-point@3.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/is-fullwidth-code-point.mjs": "c499d96ea8ae837a9e8d2f64d39411eccb8f931e0fb802ae84b6edb731f5afbc", - "https://esm.sh/v132/is-fullwidth-code-point@3.0.0/denonext/is-fullwidth-code-point.mjs": "c499d96ea8ae837a9e8d2f64d39411eccb8f931e0fb802ae84b6edb731f5afbc", - "https://esm.sh/v132/is-plain-object@5.0.0/denonext/is-plain-object.mjs": "6d9568ddc8b90de99a46c63e14984810280b6b021dc4e478803b3c240811985f", - "https://esm.sh/v132/isomorphic-ws@5.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/isomorphic-ws.mjs": "fb52bf0d2b1f864173976df3d31ded32f0620a2a74f35cfe84307e82b44c42c4", - "https://esm.sh/v132/jose@4.14.6/denonext/jose.mjs": "686277bc7177b7f5863b8dc5afacd4ce4c6b6da01054404f7a568309d04f7f77", - "https://esm.sh/v132/jsonfile@4.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/jsonfile.mjs": "c41c0445bc05f73e06fc50212f45ee76a3c5b1aa4f6e7828bd8e5d99ae103025", - "https://esm.sh/v132/jsonfile@4.0.0/denonext/jsonfile.mjs": "31d3ea319b51676ae21f43f81a8ab5dc6f919a5015b9082177482cc38f9c7e93", - "https://esm.sh/v132/lru-cache@10.0.1/denonext/lru-cache.mjs": "0bf693a0bedd7806c7bf2f336f83ec6dd1933b881703cf59bee326573473aa35", - "https://esm.sh/v132/lru-cache@7.18.3/X-YS93czppc29tb3JwaGljLXdz/denonext/lru-cache.mjs": "74aded0c7912e078f5be8b37ced802ca2d144873eaab81090d92245409a5f2e2", - "https://esm.sh/v132/lru-cache@7.18.3/denonext/lru-cache.mjs": "74aded0c7912e078f5be8b37ced802ca2d144873eaab81090d92245409a5f2e2", - "https://esm.sh/v132/minimatch@5.1.6/denonext/minimatch.mjs": "7307d9f0864dce7f8b413d69c070077f1863517df3c84b7b439578cbcb3fe71d", - "https://esm.sh/v132/mitt@3.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/mitt.mjs": "c8a314c966ba64128035339cd4c7f48c6e15bb27bb19703c99deae857bb4b3cd", - "https://esm.sh/v132/mitt@3.0.1/denonext/mitt.mjs": "c8a314c966ba64128035339cd4c7f48c6e15bb27bb19703c99deae857bb4b3cd", - "https://esm.sh/v132/mkdirp-classic@0.5.3/X-YS93czppc29tb3JwaGljLXdz/denonext/mkdirp-classic.mjs": "8008e607ebb76c210842f49adabadb8cab51d5d69df1b9d4b9b08516188a28cb", - "https://esm.sh/v132/mkdirp-classic@0.5.3/denonext/mkdirp-classic.mjs": "8008e607ebb76c210842f49adabadb8cab51d5d69df1b9d4b9b08516188a28cb", - "https://esm.sh/v132/ms@2.1.2/X-YS93czppc29tb3JwaGljLXdz/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", - "https://esm.sh/v132/ms@2.1.2/denonext/ms.mjs": "aa4dc45ba72554c5011168f8910cc646c37af53cfff1a15a4decced838b8eb14", - "https://esm.sh/v132/nanoid@3.3.6/denonext/non-secure.js": "9339526d48828770370eba72bf719a40b74de0e1197d8a582c15fbd9ab837d3d", - "https://esm.sh/v132/netmask@2.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/netmask.mjs": "364b1700f5dceb0e1cb371c01dde64c69fcab7e2696134ae0d4c275c12ab6387", - "https://esm.sh/v132/netmask@2.0.2/denonext/netmask.mjs": "364b1700f5dceb0e1cb371c01dde64c69fcab7e2696134ae0d4c275c12ab6387", - "https://esm.sh/v132/node-gyp-build@4.6.1/denonext/node-gyp-build.mjs": "5899c174a6ae92bb5a99c3cc06e388bc5ba51af5309d65eac78ff7565d8d1a0b", - "https://esm.sh/v132/octokit@3.1.0/denonext/octokit.mjs": "4856d0f0e036881b19117b75c8bed7fa7dae19e007b75a812f947e019a3b0ea2", - "https://esm.sh/v132/once@1.4.0/X-YS93czppc29tb3JwaGljLXdz/denonext/once.mjs": "81d965ce058f4f2beb3ba2f424dd57e666d60fe2b81a01c3816e3c9f358dd1ff", - "https://esm.sh/v132/once@1.4.0/denonext/once.mjs": "afcb39a581b8e3b52af3ce15acb08b0f6a162478c68dab3526ee68b9295a8ddf", - "https://esm.sh/v132/pac-proxy-agent@7.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/pac-proxy-agent.mjs": "21551fd49aaf0e7c928efd1a88326358e271a8eff5267b6d86a82af019c5a056", - "https://esm.sh/v132/pac-proxy-agent@7.0.1/denonext/pac-proxy-agent.mjs": "243dccbd02b28e0fa9f2687267517c55dbd1d2d99b6c5521f508b5947a98d192", - "https://esm.sh/v132/pac-resolver@7.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pac-resolver.mjs": "21fa8213e8d9ef94f115f698c42d40ae7d387c8d2e025e7b3b3e16ad243cdc0c", - "https://esm.sh/v132/pac-resolver@7.0.0/denonext/pac-resolver.mjs": "5792be4f96c3325ca1baedc0c2e2ff73566600740249daa4d560906bf19a6923", - "https://esm.sh/v132/pend@1.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pend.mjs": "d1e8e306939cc0a21596689c44fd3c42fe98521c4595e7210087bc48ced0ef7d", - "https://esm.sh/v132/pend@1.2.0/denonext/pend.mjs": "d1e8e306939cc0a21596689c44fd3c42fe98521c4595e7210087bc48ced0ef7d", - "https://esm.sh/v132/picocolors@1.0.0/denonext/picocolors.mjs": "5d53d745955947dce84f82222cfd00fd021239fcbe9336c6bbfe34ed2f40886c", - "https://esm.sh/v132/pluralize@8.0.0/denonext/pluralize.mjs": "c874f2612d057d4484c386f6a093496c73bbf249f764a1c34b2417cd952ac153", - "https://esm.sh/v132/postcss-selector-parser@6.0.13/denonext/postcss-selector-parser.mjs": "784c9089c758ad1466ed0c6a8ef4817cc4a850f7ed2d03828f2ccde169a799ca", - "https://esm.sh/v132/postcss@8.4.29/denonext/postcss.mjs": "e0df04f357162570808f516f214e12555d981710e0b8287e901142d33e762ecf", - "https://esm.sh/v132/progress@2.0.3/X-YS93czppc29tb3JwaGljLXdz/denonext/progress.mjs": "344d149d0884888a9c45a4a30a0c9e3d3927de7a9413cf56912333aa659267e9", - "https://esm.sh/v132/progress@2.0.3/denonext/progress.mjs": "344d149d0884888a9c45a4a30a0c9e3d3927de7a9413cf56912333aa659267e9", - "https://esm.sh/v132/proxy-agent@6.3.1/X-YS93czppc29tb3JwaGljLXdz/denonext/proxy-agent.mjs": "6c6ec38f64b2e1521572ddcc3460c7f18cdc455f79e603a2d04bdbb71cc659cc", - "https://esm.sh/v132/proxy-agent@6.3.1/denonext/proxy-agent.mjs": "f8f276001ee54cf74b6db76f703d226e7c1eaa9fadb5ee3ad57c2e78206ba627", - "https://esm.sh/v132/proxy-from-env@1.1.0/X-YS93czppc29tb3JwaGljLXdz/denonext/proxy-from-env.mjs": "5a2113ba20eb6fc83d6d68efd3aa65c4b61f05611da20339b14d165807eccfd7", - "https://esm.sh/v132/proxy-from-env@1.1.0/denonext/proxy-from-env.mjs": "5a2113ba20eb6fc83d6d68efd3aa65c4b61f05611da20339b14d165807eccfd7", - "https://esm.sh/v132/pump@3.0.0/X-YS93czppc29tb3JwaGljLXdz/denonext/pump.mjs": "0c4674f9bdd34e81969bd6f5999d899cc6adeac448998bab34dd968ef0519abe", - "https://esm.sh/v132/pump@3.0.0/denonext/pump.mjs": "31ad08f78a09af7b8e50af11460fcca41a0a5f34e39919a349c2d1411155a425", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czpAbGlic3FsL2lzb21vcnBoaWMtd3M/denonext/puppeteer-core.bundle.mjs": "6d22db7680d056d60f3b3e9569970a5871c3d3538ebad1308363ed1bf1c94faa", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/BrowserWebSocketTransport.js": "2fd8233d9b68e8886204980eea9bb8adefebed6463259543530fbd620f7abf3f", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/NodeWebSocketTransport.js": "3ae3be180aaaf9414d4e0d11c9e8e62e4269f7c56dec043c815ea1ff5c9be4af", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/lib/esm/puppeteer/common/bidi/bidi.js": "96fb2a595d3af0c7bb0b22ae23d578b39a65584d7a5a9b32d23989036f0c9fc2", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/puppeteer-core.bundle.mjs": "8b1382990cbbd89e24fd289e00303187bada679085ec4c809c589bc99544a901", - "https://esm.sh/v132/puppeteer-core@21.2.1/X-YS93czppc29tb3JwaGljLXdz/denonext/puppeteer-core.mjs": "39542c3992429873fdab9c0684ded439bfb6beaaf7b8ff1ba42c3a342aed126c", - "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/BrowserWebSocketTransport.js": "2fd8233d9b68e8886204980eea9bb8adefebed6463259543530fbd620f7abf3f", - "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/NodeWebSocketTransport.js": "c96a41e8fee998db17f75ee350fa5216e90daadbf80f2f69b334f55a9bc9f6ba", - "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/lib/esm/puppeteer/common/bidi/bidi.js": "ce00d75a0f86c00aa211708dc6ca5f2112877368243fa4380fe90ac3cc378905", - "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/puppeteer-core.bundle.mjs": "09f343ba0f3269f8685acf1bd25fb3f5754838af3d4428e203c0b727710dd025", - "https://esm.sh/v132/puppeteer-core@21.2.1/denonext/puppeteer-core.mjs": "46bd4b2d5b517c44b54153e8dcd45a01f702654a41b3e53aa9f1c95c6c80e344", - "https://esm.sh/v132/purgecss@5.0.0/denonext/purgecss.mjs": "38a0802b9826c29526373261e38e3170edc840e19b1f63c343901abdb67b7f13", - "https://esm.sh/v132/queue-tick@1.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/queue-tick.mjs": "452aeea5f84fb1e7e93ab394187a262ded2482669d5554ac283bde794ee2f18b", - "https://esm.sh/v132/queue-tick@1.0.1/denonext/queue-tick.mjs": "452aeea5f84fb1e7e93ab394187a262ded2482669d5554ac283bde794ee2f18b", - "https://esm.sh/v132/require-directory@2.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/require-directory.mjs": "2d9a5c8f6302a91fd07939584573781bff22aa7e763ecc9b1c6d541ea88a0d92", - "https://esm.sh/v132/require-directory@2.1.1/denonext/require-directory.mjs": "2d9a5c8f6302a91fd07939584573781bff22aa7e763ecc9b1c6d541ea88a0d92", - "https://esm.sh/v132/rss-parser@3.13.0/denonext/rss-parser.mjs": "3817c6ec46d9128125ed0413c7534a1bb7213e36d2b3dff5ac9db166d6ea734b", - "https://esm.sh/v132/sax@1.2.4/denonext/sax.mjs": "c709f5e231d178e08230a3e35ea55a1d4ccccefa69e47a7cb7da37adb5b342dd", - "https://esm.sh/v132/smart-buffer@4.2.0/X-YS93czppc29tb3JwaGljLXdz/denonext/smart-buffer.mjs": "a33271361967158f6968d2ae5949e1683ef37657e921da492012aed57edc518a", - "https://esm.sh/v132/smart-buffer@4.2.0/denonext/smart-buffer.mjs": "a33271361967158f6968d2ae5949e1683ef37657e921da492012aed57edc518a", - "https://esm.sh/v132/socks-proxy-agent@8.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/socks-proxy-agent.mjs": "a21cec162e282b342710a1f3518a995585099e74296772113e8d0dcc9c368e62", - "https://esm.sh/v132/socks-proxy-agent@8.0.2/denonext/socks-proxy-agent.mjs": "363fa6b4d6edc4056a57eb8f108843c13e4b2ab88222a12d14660e6197c72803", - "https://esm.sh/v132/socks@2.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/socks.mjs": "6ba66323d1fc6ce09ed43515191f8ccadd7ae9d9b8624c7785d326b1378fc79c", - "https://esm.sh/v132/socks@2.7.1/denonext/socks.mjs": "73599bf258f22fb7e99d112beee956279d9a69f4f878a81fe6c7300d38aa54ad", - "https://esm.sh/v132/source-map-js@1.0.2/denonext/lib/source-map-generator.js": "8aff2603c0b8e01a585cd0d43582e6bc2787071fd68c4eb7a4dfe03da9cab69e", - "https://esm.sh/v132/source-map-js@1.0.2/denonext/source-map-js.mjs": "81ed2d1f28bd08a762f6819d5b366285a1bacf4b5c3757d866c79e4950529bfd", - "https://esm.sh/v132/source-map@0.6.1/X-YS93czppc29tb3JwaGljLXdz/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8", - "https://esm.sh/v132/source-map@0.6.1/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8", - "https://esm.sh/v132/streamx@2.15.1/X-YS93czppc29tb3JwaGljLXdz/denonext/streamx.mjs": "c818a6c743608dce5593826398da1971663bf51d2c9651e76c32f99c70f2e6fd", - "https://esm.sh/v132/streamx@2.15.1/denonext/streamx.mjs": "1cfbaabd9eace72efe8171fda04dfb90492475f58a4c6c0dcad7fa69fd4c32ac", - "https://esm.sh/v132/string-width@4.2.3/X-YS93czppc29tb3JwaGljLXdz/denonext/string-width.mjs": "189e33d013706a02d7764e16591c341aba1c2b3d8ea0545658a55c76b2ddf275", - "https://esm.sh/v132/string-width@4.2.3/denonext/string-width.mjs": "7c16f8ff22815ff51f8c49984ec2e295301aefc5d3c33f6f75926d67884b5169", - "https://esm.sh/v132/strip-ansi@6.0.1/X-YS93czppc29tb3JwaGljLXdz/denonext/strip-ansi.mjs": "4dbd44fbeeed1fab845e7d1a11eb07bfd3f78cb8ab854812b492ee9ac4f96afc", - "https://esm.sh/v132/strip-ansi@6.0.1/denonext/strip-ansi.mjs": "1286d07bc344b44139a1da63a37326d8ad2ac68b181e0f9e7fc7120e3582f845", - "https://esm.sh/v132/tar-fs@3.0.4/X-YS93czppc29tb3JwaGljLXdz/denonext/tar-fs.mjs": "01dabc90b5f14a98ecd6547ceeeda5d237d40f08624a87b0bbf4a94c216ad560", - "https://esm.sh/v132/tar-fs@3.0.4/denonext/tar-fs.mjs": "04c713c3fc2084f6b9d9e59d821ab570c7d8a1c4b06ebee26c6da2462f6535c6", - "https://esm.sh/v132/tar-stream@3.1.6/X-YS93czppc29tb3JwaGljLXdz/denonext/tar-stream.mjs": "89561d50cf301b472c6b9b95f53dfb3f7ee40cbc04d682174297d01b513d243c", - "https://esm.sh/v132/tar-stream@3.1.6/denonext/tar-stream.mjs": "d0cd9ace591eadec08021ee752b25e068bb89a915d4fad3e9e9dfb12a098a6f3", - "https://esm.sh/v132/through@2.3.8/X-YS93czppc29tb3JwaGljLXdz/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", - "https://esm.sh/v132/through@2.3.8/denonext/through.mjs": "ea67ca65246081652c6155900c09fced3ac9111838816ab7a2f1bcd8447d1c51", - "https://esm.sh/v132/tslib@2.6.2/X-YS93czppc29tb3JwaGljLXdz/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1", - "https://esm.sh/v132/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1", - "https://esm.sh/v132/tunnel@0.0.6/denonext/tunnel.mjs": "4677e2d07e87aa3cd9400cb25ce42d65b6e487d7fe66bcdbd7f18549aa6b88ed", - "https://esm.sh/v132/unbzip2-stream@1.4.3/X-YS93czppc29tb3JwaGljLXdz/denonext/unbzip2-stream.mjs": "8eaded4ccd35d5d0264ecb76ba9a616804fd81e80c29745ac371d77974da83a4", - "https://esm.sh/v132/unbzip2-stream@1.4.3/denonext/unbzip2-stream.mjs": "8517654c2cd1d62ba176441c2e465c65c4de1946f4c80dd15c0f91fc3c3396c5", - "https://esm.sh/v132/universal-github-app-jwt@1.1.1/denonext/universal-github-app-jwt.mjs": "546280ef9d50e167172bc039c0c2f4348a728ae1732f467af726b08491d2ea18", - "https://esm.sh/v132/universal-user-agent@6.0.0/denonext/universal-user-agent.mjs": "2969647abd054007e6d838dd2ecc7de9c513c18c43322dfa3de57eec8d2d6447", - "https://esm.sh/v132/universalify@0.1.2/X-YS93czppc29tb3JwaGljLXdz/denonext/universalify.mjs": "7c2f90ff22f72e811b6d50ac138f6878ddf884bf21ef7e0d764fd10aba96b64d", - "https://esm.sh/v132/universalify@0.1.2/denonext/universalify.mjs": "7c2f90ff22f72e811b6d50ac138f6878ddf884bf21ef7e0d764fd10aba96b64d", - "https://esm.sh/v132/utf-8-validate@6.0.3/denonext/utf-8-validate.mjs": "dd2d212a3344d99eb810e76983ec83f0a5cfbdb99ae4a1e6eed91514ee335cb2", - "https://esm.sh/v132/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "f69f67cf655c38428b0934e0f7c865c055834a87cc3866b629d6b2beb21005e9", - "https://esm.sh/v132/uuid@8.3.2/denonext/uuid.mjs": "2cea289bbecc01fab6f701b719513f6ac8a3c21a5e52aa3f8682cf61d70a5dc5", - "https://esm.sh/v132/wrappy@1.0.2/X-YS93czppc29tb3JwaGljLXdz/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", - "https://esm.sh/v132/wrappy@1.0.2/denonext/wrappy.mjs": "3c31e4782e0307cf56b319fcec6110f925dafe6cb47a8fa23350d480f5fa8b06", - "https://esm.sh/v132/ws@8.14.1/X-YS93czppc29tb3JwaGljLXdz/denonext/ws.mjs": "ae5191c024a4001324548fc928a686ba79837736958a5b5bc3bee4c96d98e827", - "https://esm.sh/v132/ws@8.14.1/denonext/ws.mjs": "ae5191c024a4001324548fc928a686ba79837736958a5b5bc3bee4c96d98e827", - "https://esm.sh/v132/xml-formatter@3.5.0/denonext/xml-formatter.mjs": "a254ee3694bf8eb06db53f183e4ecec5a33576b3c8b33522d502ea1b267d7e4b", - "https://esm.sh/v132/xml-parser-xo@4.1.0/denonext/xml-parser-xo.mjs": "5d3e8439358c12b3b6df5b8c6abb3e553c65782bf0a976d52e2d7403ec56e372", - "https://esm.sh/v132/xml2js@0.5.0/denonext/xml2js.mjs": "e8f57cd5035b76fd535d88824ba0ba675545597ee2db39202fdc6b0928ec3e06", - "https://esm.sh/v132/xmlbuilder@11.0.1/denonext/xmlbuilder.mjs": "0237a65baf14b6bb98e2b6fa513dd259d7afa5bfbf4275cb0f6fa4c4ceee0d68", - "https://esm.sh/v132/y18n@5.0.8/X-YS93czppc29tb3JwaGljLXdz/denonext/y18n.mjs": "2b6dff6a9688f56abe26750bb395c2707102feda94dc7e9156aea92038b10004", - "https://esm.sh/v132/y18n@5.0.8/denonext/y18n.mjs": "2b6dff6a9688f56abe26750bb395c2707102feda94dc7e9156aea92038b10004", - "https://esm.sh/v132/yargs-parser@21.1.1/X-YS93czppc29tb3JwaGljLXdz/denonext/yargs-parser.mjs": "81b68000098a71ef9ab399378da084702a66707199b5626f93a227fab3d1cf23", - "https://esm.sh/v132/yargs-parser@21.1.1/denonext/yargs-parser.mjs": "81b68000098a71ef9ab399378da084702a66707199b5626f93a227fab3d1cf23", - "https://esm.sh/v132/yargs@17.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/helpers.js": "2ed8f619b4fe20bc8fa33f09b452a5d188bdecaf6b11b918bb279df5162e89a6", - "https://esm.sh/v132/yargs@17.7.1/X-YS93czppc29tb3JwaGljLXdz/denonext/yargs.js": "e3e594cdbb5c81b181afdc1e698d93f8d526a4c998e2298660ed1396544cbd88", - "https://esm.sh/v132/yargs@17.7.1/denonext/helpers.js": "41bfc19c908e02fc6bd0193e941d416b40e652869ec21a4d14557930cc1c472c", - "https://esm.sh/v132/yargs@17.7.1/denonext/yargs.js": "30909a640c05369b89910e85e9930a0ad0632c2b7e049ef6372c4b6abe1a302f", - "https://esm.sh/v132/yauzl@2.10.0/X-YS93czppc29tb3JwaGljLXdz/denonext/yauzl.mjs": "5b09c5398c88be85640a0b273c234354b1add2ab0167c1a8dcc4de51d8d056af", - "https://esm.sh/v132/yauzl@2.10.0/denonext/yauzl.mjs": "3666c1694f3eab2e9f5252eff117e9fcee48f19745f1eea94bd39439dbff4b3a", - "https://esm.sh/v132/zod-to-json-schema@3.21.4/denonext/zod-to-json-schema.mjs": "582e650e1bbe793617717c0475536db159cf3c3834713da85cd0c33840566916", - "https://esm.sh/v132/zod@3.22.2/denonext/zod.mjs": "b72f0eac903e994642e59258bd5552020471f60b5b17ed859650bffd3c33daa0", - "https://esm.sh/ws@8.14.1": "149322ff1179abaf6b5db21fae8053126dab99c6a026acd9e32904c1c943837b", - "https://esm.sh/xml-formatter@3.5.0": "3c019e6acfa0c5213995476cd3b3b64ebec2b88ef18a18da268be629618461da", - "https://esm.sh/zod-to-json-schema@3.21.4": "4c9971fa5438ccfc6b98464903e45d587e23bce5706c629e20e72f37b9eb8a4c", - "https://raw.githubusercontent.com/octokit/types.ts/v11.1.0/src/RequestInterface.ts": "b0bcde7d00187fd2111cdcfbf2c0f7e885f1d0adeb01f246453ff4dcc1dd582e" - } -} From 93c83a1d68182cd1c8df53342c5c3f6f7b94da49 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Fri, 6 Oct 2023 07:50:10 +0200 Subject: [PATCH 031/103] server: continue implementation --- deno.jsonc | 8 +- source/metrics/config.ts | 90 +++++---- source/metrics/utils/browser.ts | 120 ++++++++---- source/metrics/utils/io.ts | 60 +++++- source/run/flags.ts | 23 ++- source/run/mod_test.ts | 17 +- source/run/server/mod.ts | 271 +++++++++++++++++----------- source/run/server/mod_client.ts | 128 +++++++++++++ source/run/server/static/index.html | 198 +++++--------------- 9 files changed, 573 insertions(+), 342 deletions(-) create mode 100644 source/run/server/mod_client.ts diff --git a/deno.jsonc b/deno.jsonc index 53c45636e18..f0e96a8a465 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,5 +1,6 @@ // TODO(@lowlighter): remove legacy when migrated { + "deno.enable": true, "version": "4.0.0", "imports": { "std/": "https://deno.land/std@0.201.0/", @@ -17,14 +18,15 @@ "lock": false, "nodeModulesDir": true, "tasks": { - "serve": "$(deno run --allow-env source/run/flags.ts --allow-net=localhost run source/run/server/mod.ts --watch $0)", - "test": "$(deno run --allow-env source/run/flags.ts test source/run/mod_test.ts $0)", + "serve": "$(deno run --allow-env --allow-read source/run/flags.ts --allow-net=localhost run source/run/server/mod.ts --watch $0)", + "test": "$(deno run --allow-env --allow-read source/run/flags.ts test source/run/mod_test.ts $0)", "coverage": "rm .coverage -rf && deno task test $0 && deno coverage .coverage", "lint": "deno lint", "fmt": "deno fmt", "hook": "deno task lint && deno task fmt --check && deno task test", + "browser": "$(deno run --allow-env --allow-read source/run/flags.ts run source/metrics/utils/browser.ts $0)", "deploy": "deployctl deploy --project=metrics --include=source,deno.jsonc,LICENSE --prod source/run/server/mod.ts", - "deploy:imports": "$(deno run --allow-env source/run/flags.ts test source/run/server/mod_imports.ts $0)" + "deploy:imports": "$(deno run --allow-env --allow-read source/run/flags.ts test source/run/server/mod_imports.ts $0)" }, "lint": { "rules": { diff --git a/source/metrics/config.ts b/source/metrics/config.ts index bcbb552aefb..1ac998d8e6f 100644 --- a/source/metrics/config.ts +++ b/source/metrics/config.ts @@ -21,39 +21,39 @@ const secret = is.preprocess((value) => value instanceof Secret ? value : new Se /** Internal component config */ export const internal = is.object({ - logs: is.enum(["none", "error", "warn", "info", "message", "debug", "trace"]), + logs: is.enum(["none", "error", "warn", "info", "message", "debug", "trace"]).describe("Log level"), }) /** General component config */ export const component = internal.extend({ - id: is.string(), + id: is.string().describe("Component identifier"), retries: is.object({ - attempts: is.coerce.number().min(1).max(100), - delay: is.coerce.number().min(0).max(3600), - }), - fatal: is.coerce.boolean(), + attempts: is.number().int().positive().describe("Number of attempts"), + delay: is.number().positive().describe("Delay between attempts (in seconds)"), + }).describe("Retry policy"), + fatal: is.boolean().describe("Whether to stop on error"), }) /** Requests component config */ export const requests = internal.extend({ - mock: is.coerce.boolean(), - api: is.coerce.string(), - token: secret, - timezone: is.coerce.string(), + mock: is.boolean().describe("Whether to use mocked data"), + api: is.string().url().describe("GitHub API endpoint"), + token: secret.describe("GitHub token"), + timezone: is.string().describe("Timezone"), }) /** Plugin component internal config (without processors, for recursive typing) */ const __plugin = component.merge(requests).extend({ - handle: is.coerce.string(), - entity: is.enum(entities), - template: is.coerce.string(), - render: is.coerce.boolean(), - args: is.record(is.coerce.string(), is.unknown()), + handle: is.coerce.string().describe("Entity handle"), + entity: is.enum(entities).describe("Entity type"), + template: is.coerce.string().describe("Template name"), + render: is.boolean().describe("Whether to render template"), + args: is.record(is.string(), is.unknown()).describe("Plugin arguments"), }) /** Processor component internal config */ const _processor = component.extend({ - args: is.record(is.coerce.string(), is.unknown()), + args: is.record(is.string(), is.unknown()).describe("Processor arguments"), parent: __plugin, }) @@ -65,7 +65,7 @@ const _preset_processor = is.object({ attempts: _processor.shape.retries.shape.attempts.default(1), delay: _processor.shape.retries.shape.delay.default(120), }).default(() => ({})), - args: is.record(is.coerce.string(), is.unknown()).default(() => ({})), + args: _processor.shape.args.default(() => ({})), }) /** Processor component config */ @@ -73,7 +73,7 @@ export const processor = is.preprocess((value) => _preset_processor.passthrough( /** Plugin component internal config */ const _plugin = __plugin.extend({ - processors: is.array(processor), + processors: is.array(processor).describe("Processors"), }) /** Plugin NOP internal config */ @@ -96,7 +96,7 @@ const _preset_plugin = is.object({ attempts: _plugin.shape.retries.shape.attempts.default(3), delay: _plugin.shape.retries.shape.delay.default(120), }).default(() => ({})), - args: is.record(is.coerce.string(), is.unknown()).default(() => ({})), + args: _plugin.shape.args.default(() => ({})), }) /** Plugin component config */ @@ -107,14 +107,14 @@ export const plugin_nop = is.preprocess((value) => _preset_plugin.passthrough(). /** Preset component config */ const preset = is.object({ - plugins: _preset_plugin.default(() => _preset_plugin.parse({})), - processors: _preset_processor.default(() => _preset_processor.parse({})), + plugins: _preset_plugin.default(() => _preset_plugin.parse({})).describe("Default settings for plugins using this preset"), + processors: _preset_processor.default(() => _preset_processor.parse({})).describe("Default settings for processors using this preset"), }) /** Internal config */ const _config = is.object({ - plugins: is.array(is.union([plugin, plugin_nop])), - presets: is.record(is.coerce.string(), preset), + plugins: is.array(is.union([plugin, plugin_nop])).describe("Plugins"), + presets: is.record(is.string(), preset).describe("Presets settings"), }) /** Config */ @@ -144,29 +144,47 @@ export const config = is.preprocess((_value) => { /** Action config */ export const action = internal.merge(requests).extend({ logs: internal.shape.logs.default(loglevel.action), - check_updates: is.boolean().default(false), - config: config.default(() => ({})), + check_updates: is.boolean().default(false).describe("Whether to check for updates"), + config: config.default(() => ({})).describe("Configuration"), }) /** Server config */ export const server = internal.extend({ logs: internal.shape.logs.default(loglevel.server), - hostname: is.coerce.string().default("localhost"), - port: is.coerce.number().min(1).max(65535).default(8080), - config: config.default(() => ({})), - users: is.object({ - allowed: is.union([is.literal("all"), is.array(is.coerce.string())]).default("all"), + hostname: is.string().default("localhost").describe("Server hostname"), + port: is.number().int().min(1).max(65535).default(8080).describe("Server port"), + config: config.default(() => ({})).describe("Configuration"), + limit: is.object({ + guests: is.object({ + max: is.number().int().min(0).optional().describe("Maximum number of guests"), + requests: is.object({ + limit: is.number().int().positive().default(60).describe("Maximum number of requests per window duration per guest"), + duration: is.number().positive().default(60).describe("Window duration (in seconds)"), + ignore_mocked: is.boolean().default(true).describe("Whether to ignore mocked requests from rate limit"), + }).optional().describe("Rate limit for guests"), + }).optional().describe("Guests limitations"), + users: is.object({ + max: is.number().int().min(0).optional().describe("Maximum number of logged users"), + requests: is.object({ + limit: is.number().int().positive().default(60).describe("Maximum number of requests per window duration per logged user"), + duration: is.number().positive().default(60).describe("Window duration (in seconds)"), + ignore_mocked: is.boolean().default(true).describe("Whether to ignore mocked requests from rate limit"), + }).optional().describe("Rate limit for logged users"), + }).optional().describe("Logged users limitations"), }).default(() => ({})), + cache: is.number().int().positive().optional().describe("Cache duration for processed requests (in seconds)"), github_app: is.object({ - id: is.coerce.number(), - private_key_path: is.coerce.string(), - client_id: is.coerce.string(), - client_secret: secret.default(env.get("METRICS_GITHUB_APP_SECRET") ?? ""), - }).nullable().optional(), + id: is.number().int().positive().describe("GitHub app identifier"), + private_key_path: is.string().describe("Path to GitHub app private key file (must be in PKCS#8 format)"), + client_id: is.string().describe("GitHub app client identifier"), + client_secret: secret.default(env.get("METRICS_GITHUB_APP_SECRET") ?? "").describe("GitHub app client secret"), + }).optional().describe("GitHub app settings"), + control: is.record(is.string(), is.array(is.enum(["stop"]))).default(() => ({})).describe("Control profiles. Each profile is designed by a token bearer and a list of allowed routes"), }) /** Web request config */ export const webrequest = is.object({ + mock: is.boolean().default(false).describe("Whether to use mocked data"), plugins: is.array( _plugin.pick({ id: true, @@ -181,5 +199,5 @@ export const webrequest = is.object({ .extend({ processors: is.array(_processor.pick({ id: true, fatal: true, args: true }).partial().extend({ id: _plugin.shape.id })), }).partial(), - ).default(() => []), + ).default(() => []).describe("Plugins"), }) diff --git a/source/metrics/utils/browser.ts b/source/metrics/utils/browser.ts index 8ab4fb68308..150d9021193 100644 --- a/source/metrics/utils/browser.ts +++ b/source/metrics/utils/browser.ts @@ -1,66 +1,122 @@ //Imports import { join } from "std/path/join.ts" import { Logger } from "@utils/log.ts" -import { cwd, env, os } from "@utils/io.ts" -import type puppeteer from "npm:puppeteer@21.2.1" - +import { cwd, os, write } from "@utils/io.ts" +import puppeteer from "npm:puppeteer-core@21.3.6" +import { Browser as Browsers, computeExecutablePath, detectBrowserPlatform, install, resolveBuildId } from "npm:@puppeteer/browsers@1.7.1" +import { throws } from "@utils/errors.ts" +import { exists } from "std/fs/exists.ts" +import ProgressBar from "x/progress@v1.3.9/mod.ts" +import { delay } from "std/async/delay.ts" //TODO(@lowlighter): connect to external web browser instead, only use puppeteer core /** Browser */ export class Browser { /** Logger */ - private static readonly log = new Logger(import.meta) + static readonly log = new Logger(import.meta) - /** Shared browser mode */ - static shared = true + /** Remote browser endpoint */ + static endpoint = null as string | null /** Browser instance */ private static instance = null as null | Awaited> - /** Puppeteer library */ - private static puppeteer: typeof puppeteer + /** Browser executable path */ + private static executable = "" - /** Get browser */ - private static async get({ log = this.log } = {}) { - if ((this.shared) && (this.instance)) { - return this.instance - } - if (!this.puppeteer) { - env.set("PUPPETEER_CACHE_DIR", join(cwd(), "node_modules/.cache")) - await import("x/puppeteer_plus@0.18.0/src/patch.ts") - await import("x/puppeteer_plus@0.18.0/src/install.ts") - const { default: imported } = await import("npm:puppeteer@21.2.1") - this.puppeteer = imported + /** Spawn browser instance */ + static async spawn() { + if (!this.executable) { + const browser = Browsers.CHROMIUM + const platform = detectBrowserPlatform() ?? throws("unsupported platform for puppeteer") + const version = await resolveBuildId(browser, platform, "latest") + const cache = join(cwd(), "node_modules/.cache") + this.executable = computeExecutablePath({ cacheDir: cache, browser, buildId: version }) + if (!await exists(this.executable)) { + let progress: ProgressBar + await install({ + cacheDir: cache, + browser, + buildId: version, + downloadProgressCallback(bytes, total) { + if (!progress) { + progress = new ProgressBar({ total, complete: "=", incomplete: "-", clear: true }) + } + progress.render(bytes) + }, + }) + } } const args = { headless: "new" as unknown as boolean, args: ["--no-sandbox", "--disable-extensions", "--disable-setuid-sandbox", "--disable-dev-shm-usage"], handleSIGHUP: os !== "windows", + executablePath: this.executable, } - const browser = await this.puppeteer.launch(args) - log.io("browser started") - if (this.shared) { - this.instance = browser - Object.assign(this, { log: log.with({ browser: await this.instance!.version() }) }) + this.instance = await puppeteer.launch(args) + this.log.io("started browser") + if (!this.endpoint) { + this.endpoint = this.instance.wsEndpoint() } - return browser + } + + /** Close browser instance */ + static async close() { + if (this.instance) { + try { + await Promise.allSettled([...await this.instance.pages()].map((page) => page.close())) + await this.instance.close() + await delay(1 * 1000) + this.instance.process()?.kill("SIGINT") + } catch (error) { + this.log.warn(error) + } + this.instance = null + this.log.io("closed browser") + } + } + + /** Connect to browser */ + private static async connect({ log = this.log } = {}) { + if (this.instance) { + return this.instance + } + if (this.endpoint) { + this.instance = await puppeteer.connect({ browserWSEndpoint: this.endpoint }) + log.io("connected to browser") + } else { + await this.spawn() + } + Object.assign(this, { log: log.with({ browser: await this.instance!.version() }) }) } /** Spawn a new page */ static async newPage({ width = 1000, height = 1000 } = {}) { const log = this.log.with({ uuid: crypto.randomUUID().slice(-12) }) - const browser = await this.get({ log }) - const page = await browser.newPage() + await this.connect({ log }) + const page = await this.instance!.newPage() page.setViewport({ width, height }) page .on("console", (message: { text: () => string }) => log.debug(`puppeteer: ${message.text()}`)) .on("pageerror", (error: { message: string }) => log.warn(`puppeteer: ${error.message}`)) - if (!this.shared) { - page.close = async () => { - await browser.close() - log.io("browser closed") - } + const close = page.close.bind(page) + page.close = async () => { + await close() + log.io("closed browser page") } + log.io("opened browser page") return page } } + +// Entry point +if (import.meta.main) { + await Browser.spawn() + await write(".test/browser", Browser.endpoint!) + for (const signal of ["SIGINT", "SIGBREAK"] as const) { + globalThis?.Deno.addSignalListener(signal, async () => { + await Browser.close() + Deno.exit(0) + }) + } +} diff --git a/source/metrics/utils/io.ts b/source/metrics/utils/io.ts index 89561d79b66..f369d69fbbd 100644 --- a/source/metrics/utils/io.ts +++ b/source/metrics/utils/io.ts @@ -2,10 +2,13 @@ import { ensureDir, expandGlob } from "std/fs/mod.ts" import { throws } from "@utils/errors.ts" import { dirname } from "std/path/dirname.ts" +import { deferred } from "std/async/deferred.ts" /** Read file */ -export function read(path: string | URL) { - return globalThis.Deno?.readTextFile(path) +export function read(path: string | URL, options: { sync: true }): string +export function read(path: string | URL, options?: { sync?: false }): Promise +export function read(path: string | URL, { sync = false } = {}) { + return sync ? globalThis.Deno?.readTextFileSync(path) : globalThis.Deno?.readTextFile(path) } /** Write file */ @@ -57,3 +60,56 @@ export function cwd() { /** Operating system */ export const os = globalThis.Deno?.build.os ?? "unknown" + +/** KV storage */ +export class KV { + /** Constructor */ + constructor(path = ".kv") { + if (globalThis.Deno) { + ;(async () => { + this.#kv = env.get("DENO_DEPLOYMENT_ID") ? await globalThis.Deno?.openKv() : await globalThis.Deno?.openKv(path) + this.ready.resolve(this) + })() + } + } + + /** Is ready ? */ + readonly ready = deferred() + + /** KV storage */ + #kv = null as null | Deno.Kv + + /** Get key value */ + async get(path: string) { + if (!this.#kv) { + throws("KV storage is not ready") + } + const { value } = await this.#kv.get(path.split(".")) + return (value ?? null) as T + } + + /** Has key */ + async has(path: string) { + const value = await this.get(path) + return (value !== null) && (value !== undefined) + } + + /** Delete key */ + async delete(path: string) { + if (!this.#kv) { + throws("KV storage is not ready") + } + await this.#kv.delete(path.split(".")) + } + + /** Set key value */ + async set(path: string, value: unknown, { ttl = NaN } = {}) { + if (!this.#kv) { + throws("KV storage is not ready") + } + await this.#kv.set(path.split("."), value, { ...(Number.isFinite(ttl) ? { expireIn: ttl } : null) }) + if (Number.isFinite(ttl)) { + setTimeout(() => this.delete(path), ttl + 1) + } + } +} diff --git a/source/run/flags.ts b/source/run/flags.ts index bdea45f0f66..ae03a2c8c2e 100644 --- a/source/run/flags.ts +++ b/source/run/flags.ts @@ -2,6 +2,7 @@ import { join } from "std/path/join.ts" import { parse } from "std/flags/mod.ts" import { cwd, env } from "@utils/io.ts" +import { expandGlobSync } from "std/fs/expand_glob.ts" // Flags const { "allow-net": _net = [], "allow-sys": _sys = [], "allow-write": _write = [], "allow-run": _run = [], _: [subcommand, ...args], ..._flags } = parse(Deno.args, { @@ -14,6 +15,7 @@ if (!subcommand) { // Paths const PWD = env.get("PWD") ?? cwd() const TMP = env.get("TMP") ?? join(PWD, "/.tmp") +const TEST = join(PWD, "/.test") const CACHE = join(PWD, "/node_modules/.cache") if ((!PWD) || (!TMP)) { console.log("echo 'missing PWD or TMP environment variables'") @@ -28,7 +30,7 @@ const net = new Set([ "registry.npmjs.org", // Puppeteer "127.0.0.1", - "edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing", + "storage.googleapis.com", // User defined ..._net, ]) @@ -46,7 +48,7 @@ const write = new Set([ // Dependencies TMP, // Puppeteer - join(CACHE, "chrome"), + join(CACHE, "chromium"), // KV store join(PWD, ".kv"), // User defined @@ -56,7 +58,7 @@ const write = new Set([ // Process const run = new Set([ // Puppeteer - join(CACHE, "chrome/win64-116.0.5845.96/chrome-win64/chrome.exe"), + ...[...expandGlobSync(join(CACHE, "chromium/**/*.exe"))].map(({ path }) => path), // User defined ..._run, ]) @@ -71,20 +73,27 @@ switch (subcommand) { net.add("api.github.com/emojis") // processors/render.twemojis net.add("cdn.jsdelivr.net") - // - write.add(PWD) + // Temporary test files + write.add(TEST) + // Subprocess + run.add("deno") // Arguments args.unshift( "--seed=0", "--trace-ops", - "--parallel", + // "--parallel", "--coverage=.coverage", "--doc", - "--shuffle", + // "--shuffle", ) dflags.push("--fail-fast", "--filter") break case "run": + // Temporary test files + if (args.includes("source/metrics/utils/browser.ts")) { + write.add(TEST) + } + // GitHub API net.add("api.github.com") // Github OAuth diff --git a/source/run/mod_test.ts b/source/run/mod_test.ts index 95bcd2b176b..050fe324c8b 100644 --- a/source/run/mod_test.ts +++ b/source/run/mod_test.ts @@ -1,5 +1,5 @@ //Imports -import { assert, describe, it } from "@testing" +import { afterAll, assert, beforeAll, describe, it } from "@testing" import { Plugin } from "@plugin" import { Processor } from "@processor" import { process } from "@metrics/process.ts" @@ -23,8 +23,19 @@ const config = { }, } -// Disable shared browser so each test is self-contained -Browser.shared = false +const shared = { process: null as null | Deno.ChildProcess, controller: new AbortController() } + +beforeAll(async () => { + const command = new Deno.Command("deno", { args: ["task", "browser", "--allow-write"], signal: shared.controller.signal }) + Object.assign(shared, { process: command.spawn() }) + Browser.endpoint = await read(".test/browser") +}) + +afterAll(async () => { + await Browser.close() + shared.controller.abort() + await shared.process?.status +}) //TODO(@lowlighter): test for engine //TODO(@lowlighter): check if puppeteer leaking test is fixable... diff --git a/source/run/server/mod.ts b/source/run/server/mod.ts index e881f9ee085..1fd4b670e19 100644 --- a/source/run/server/mod.ts +++ b/source/run/server/mod.ts @@ -3,7 +3,7 @@ import { serveListener } from "std/http/server.ts" import { server as schema, webrequest } from "@metrics/config.ts" import { process } from "@metrics/process.ts" import { is } from "@utils/validator.ts" -import { listen, read } from "@utils/io.ts" +import { KV, listen, read } from "@utils/io.ts" import { Internal } from "@metrics/components/internal.ts" import * as YAML from "std/yaml/mod.ts" import { parseHandle } from "@utils/parse.ts" @@ -14,10 +14,12 @@ import { Status } from "std/http/http_status.ts" import { metadata } from "@metrics/metadata.ts" import { deferred } from "std/async/deferred.ts" import { deepMerge } from "std/collections/deep_merge.ts" -import { formats } from "@processors/render/mod.ts" import { getCookies, setCookie } from "std/http/cookie.ts" -import { formatValidationError, throws } from "@utils/errors.ts" +import { formatValidationError } from "@utils/errors.ts" import { Secret } from "@utils/secret.ts" +import { Requests } from "@metrics/components/requests.ts" +import { App } from "y/@octokit/app@14.0.0" +import { bundle } from "x/emit@0.24.0/mod.ts" try { await import("./imports.ts") } catch { /* Ignore */ } @@ -33,36 +35,56 @@ class Server extends Internal { /** Constructor */ constructor(context = {} as Record) { super(schema.parse(context)) + if (this.context.github_app) { + this.log.info(`loaded github app: ${this.context.github_app.id}`) + this.#app = new App({ + appId: this.context.github_app.id, + privateKey: read(this.context.github_app.private_key_path, { sync: true }), + oauth: { + clientId: this.context.github_app.client_id, + clientSecret: this.context.github_app.client_secret.read(), + }, + }) + } + this.#kv = new KV() + console.log(this.context) } + /** KV */ + readonly #kv + + /** GitHub app */ + readonly #app = null as App | null + /** Routes */ protected readonly routes = { index: /^\/(?:index\.html)?$/, favicon: /^\/favicon\.(?:ico|png)$/, metrics: /^\/(?[-\w]+(?:\/[-\w]+)?)(?:\.(?svg|png|jpg|jpeg|webp|json|html))?$/, - control: /^\/metrics\/$/, - login: /^\/login(?\/(?:authorize|review)?)?$/, + control: /^\/metrics\/(?\w+)$/, + login: /^\/login(?\/(?:authorize|review|revoke)?)?$/, me: /^\/me$/, + ratelimit: /^\/ratelimit$/, } /** Start server */ start() { this.log.info(`listening on ${this.context.hostname}:${this.context.port}`) - return serveListener(listen({ hostname: this.context.hostname, port: this.context.port }), (request) => this.handle(request)) + return serveListener(listen({ hostname: this.context.hostname, port: this.context.port }), (request, connection) => this.handle(request, connection)) } /** Metadata */ #metadata = null as unknown /** Request handler */ - protected async handle(request: Request) { - const kv = Deno.env.get("DENO_DEPLOYMENT_ID") ? await Deno.openKv() : await Deno.openKv(".kv") + protected async handle(request: Request, { remoteAddr: { hostname: from } } = { remoteAddr: { hostname: "unknown" } }) { const url = new URL(request.url) const cookies = getCookies(request.headers) const { metrics_session: session = null } = cookies - const log = session ? this.log.with({ session }) : this.log + const log = this.log.with({ from, ...(session ? { session } : null) }) log.io(`${request.method} ${url.pathname}`) const pending = new Map>() + await this.#kv.ready routing: switch (request.method) { case "GET": { switch (true) { @@ -74,6 +96,12 @@ class Server extends Internal { case this.routes.favicon.test(url.pathname): { return serveFile(request, fromFileUrl(new URL("static/favicon.png", import.meta.url))) } + // + case url.pathname === "/static/app.js": { + const result = await bundle(new URL("./mod_client.ts", import.meta.url), { type: "module" }) + const { code } = result + return new Response(code, { status: Status.OK, headers: { "content-type": "application/javascript" } }) + } // Serve static files case url.pathname.startsWith("/static/"): { return serveDir(request, { fsRoot: fromFileUrl(new URL("static", import.meta.url)), urlRoot: "static", quiet: true }) @@ -85,73 +113,52 @@ class Server extends Internal { } return new Response(JSON.stringify(this.#metadata), { status: Status.OK, headers: { "content-type": "application/json" } }) } - // Authenticated user + // User profile case this.routes.me.test(url.pathname): { - if ((!session) || (!await kv.get(["sessions", session]).then(({ value }) => value))) { - return new Response("Unauthorized", { status: Status.Unauthorized }) + if (!this.context.github_app) { + return new Response(JSON.stringify(null), { status: Status.OK, headers: { "content-type": "application/json" } }) } - const { value: { login, name, avatar } } = await kv.get(["sessions", session]) as { value: user } - return new Response(JSON.stringify({ login, name, avatar }), { status: Status.OK, headers: { "content-type": "application/json" } }) + if ((!session) || (!await this.#kv.has(`sessions.${session}`))) { + return new Response(JSON.stringify({ login: null }), { status: Status.OK, headers: { "content-type": "application/json" } }) + } + const { login, avatar } = await this.#kv.get(`sessions.${session}`) + return new Response(JSON.stringify({ login, avatar }), { status: Status.OK, headers: { "content-type": "application/json" } }) } // OAuth login - case (this.context.github_app) && (this.routes.login.test(url.pathname)): { - const app = this.context.github_app! + case this.routes.login.test(url.pathname): { + if (!this.context.github_app) { + return Response.redirect(url.origin, Status.Found) + } + const app = this.context.github_app const { action = "/" } = url.pathname.match(this.routes.login)?.groups ?? {} switch (action) { // Start OAuth process case "": case "/": { - if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { + if (session && (await this.#kv.has(`sessions.${session}`))) { return Response.redirect(url.origin, Status.Found) } - // Create state - const state = crypto.randomUUID() - await kv.set(["states", state], true, { expireIn: 15 * 60 * 1000 }) - log.trace(`oauth process: ${state} started`) - // Redirect to GitHub - const params = new URLSearchParams({ client_id: app.client_id, state, allow_signup: "false" }) - return Response.redirect(`https://github.com/login/oauth/authorize?${params}`, Status.Found) + return Response.redirect(this.#app.oauth.getWebFlowAuthorizationUrl({ allowSignup: false }).url, Status.Found) } // OAuth authorization process case "/authorize": { - if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { + if (session && (await this.#kv.has(`sessions.${session}`))) { return Response.redirect(url.origin, Status.Found) } try { - // Validate state const state = url.searchParams.get("state") - if ((!state) || (!await kv.get(["states", state]).then(({ value }) => value))) { - throws("Invalid state") - } - await kv.delete(["states", state]) - log.trace(`oauth process: ${state} received callback from github app`) - // Retrieve token const code = url.searchParams.get("code") - if (!code) { - throws("Invalid code") - } - const { access_token: token, expires_in: expiration } = await fetch("https://github.com/login/oauth/access_token", { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - "accept": "application/json", - }, - body: new URLSearchParams({ client_id: app.client_id, client_secret: app.client_secret.read(), code }), - }).then((response) => response.json()) - log.trace(`oauth process: ${state} retrieved access token`) - // Validate token - const { login, name, avatar_url } = await fetch("https://api.github.com/user", { - headers: { "accept": "application/json", "content-type": "application/json", Authorization: `Bearer ${token}` }, - }).then((response) => response.json()) - if (await kv.get(["sessions", "login", login]).then(({ value }) => value)) { - log.trace(`oauth process: ${state} user ${login} was already authenticated`) + const { authentication: { token, expiresAt: expiration } } = await this.#app.oauth.createToken({ state, code }) + const ttl = new Date(expiration).getTime() - Date.now() + const { data: { user: { login, avatar_url: avatar } } } = await this.#app.oauth.checkToken({ token }) + if (await this.#kv.has(`sessions.login.${login}`)) { + log.trace(`oauth process: user ${login} was already authenticated`) return Response.redirect(url.origin, Status.Found) } - const user = { login, name, avatar: avatar_url, token: new Secret(token), session: crypto.randomUUID() } - await kv.set(["sessions", user.session], user, { expireIn: 1000 * expiration }) - await kv.set(["sessions", "login", user.login], true, { expireIn: 1000 * expiration }) - log.message(`oauth process: ${state} user ${login} authenticated`) - // Redirect to homepage + const user = { login, avatar, token, session: crypto.randomUUID() } + await this.#kv.set(`sessions.${user.session}`, user, { ttl }) + await this.#kv.set(`sessions.login.${user.login}`, true, { ttl }) + log.message(`oauth process: user ${login} authenticated`) const headers = new Headers({ Location: url.origin }) setCookie(headers, { name: "metrics_session", value: user.session, path: "/", sameSite: "None", httpOnly: true, secure: true, expires: new Date(Date.now() + 1000 * expiration) }) return new Response(null, { status: Status.SeeOther, headers }) @@ -162,17 +169,20 @@ class Server extends Internal { } // OAuth token revocation case "/revoke": { - if ((!session) || (!await kv.get(["sessions", session]).then(({ value }) => value))) { + if ((!session) || (!await this.#kv.has(`sessions.${session}`))) { return Response.redirect(url.origin, Status.Found) } - //TODO(@lowlighter): is it not possible to revoke oauth token from github app (this always return not found) ? - /*const user = this.#sessions.get(session)! - console.log(await fetch(`https://api.github.com/applications/${app.client_id}/token`, {method:"DELETE", headers:{ - "accept": "application/json", - Authorization:`Bearer ${app.client_secret}`, - "content-type": 'application/json', - }, body: JSON.stringify({access_token:user.token})}))*/ - return Response.redirect(url.origin, Status.Found) + try { + const { login, token } = await this.#kv.get(`sessions.${session}`) + await this.#app.oauth.deleteToken({ token }) + await this.#kv.delete(`sessions.${session}`) + await this.#kv.delete(`sessions.login.${login}`) + log.trace(`oauth process: user ${login} revoked their token`) + return Response.redirect(url.origin, Status.Found) + } catch (error) { + log.warn(error) + return new Response("Bad request: Revocation process failed", { status: Status.BadRequest }) + } } // OAuth permissions review case "/review": { @@ -181,40 +191,38 @@ class Server extends Internal { } break routing } - + // Ratelimit + case this.routes.ratelimit.test(url.pathname): { + const context = { login: null as string | null, ...this.context.config.presets.default.plugins } + if (session && (await this.#kv.has(`sessions.${session}`))) { + const { login, token } = await this.#kv.get(`sessions.${session}`) + context.token = new Secret(token) + context.login = login + } + const requests = new Requests(this.meta, context) + return new Response(JSON.stringify({ login: context.login, ...await requests.ratelimit() }), { status: Status.OK, headers: { "content-type": "application/json" } }) + } // Serve renders case this.routes.metrics.test(url.pathname): { const { handle: _handle, ext = "svg" } = url.pathname.match(this.routes.metrics)?.groups ?? {} - const { handle, login: user } = parseHandle(_handle) - const mock = user === "preview" // ????? + const { handle, login } = parseHandle(_handle) const _log = log + let user = null as user | null if (!handle) { return new Response("Not found", { status: Status.NotFound }) } { const log = _log.with({ handle }) log.trace(url.href) - //TODO(@lowlighter): cached system - //TODO(@lowlighter): max users / single requests - - // Verify requestion extension - if (!(formats as readonly string[]).includes(ext)) { - log.trace(`rejected request: "${ext}" is not supported`) - return new Response(`Unsupported Media Type: ${ext} is not supported`, { status: Status.UnsupportedMediaType }) - } - // Honor allowed users list - if ((!mock) && (Array.isArray(this.context.users.allowed)) && (!this.context.users.allowed.includes(user))) { - log.trace(`rejected request: "${user}" is not allowed`) - return new Response(`Forbidden: ${user} is not allowed`, { status: Status.Forbidden }) - } // Honor single request at a time - if ((!mock) && (pending.has(handle))) { + const requested = url.href.replace(url.origin, "") + if (pending.has(requested)) { log.trace("existing request pending, waiting for completion") - return pending.get(handle)! + return pending.get(requested)! } - log.trace("processing request") const promise = deferred() - pending.set(handle, promise) + pending.set(requested, promise) + log.trace("processing request") try { // Parse inputs (lax-YAML) let context = {} as unknown as is.infer @@ -242,24 +250,64 @@ class Server extends Internal { context = await webrequest.parseAsync(context) log.trace("parsed request") log.trace(context) - //TODO(@lowlighter): toggle enabled plugins + //TODO(@lowlighter): filter enabled plugins and params } catch (error) { log.warn(error) return promise.resolve(new Response(`Bad request: ${formatValidationError(error)}`, { status: Status.BadRequest }))! } + // Load user session if available + if (session && (await this.#kv.has(`sessions.${session}`))) { + user = await this.#kv.get(`sessions.${session}`) + log.debug(`logged as: ${user.login}`) + } + + // Honor server limits + if (this.context.limit) { + const section = user ? "users" : "guests" + // Users limits + if (typeof this.context.limit[section]?.max === "number") { + //TODO(@lowlighter): max users + if (0 > this.context.limit[section]?.max!) { + return new Response("Service unavailable: server capacity is full", { status: Status.ServiceUnavailable }) + } + } + + // Requests limit + if (this.context.limit[section]?.requests) { + if ((context.mock) && (this.context.limit[section]?.requests?.ignore_mocked)) { + log.trace("requests ratelimit: bypassed as request is mocked") + } else { + const { limit, duration } = this.context.limit[section]?.requests! + const { current = 0, reset = Date.now() + 1000 * duration, init = false } = + await this.#kv.get<{ current: number; reset: number; init?: boolean }>(`requests.ratelimit.${user}`) ?? { init: true } + log.trace(`requests ratelimit: ${current + 1} / ${limit} until ${new Date(reset).toISOString()}`) + if (current + 1 > limit) { + log.trace(`requests ratelimit: preventing further requests for "${login}" until ${new Date(reset).toISOString()}`) + return new Response(`Too Many Requests: Rate limit exceeded (wait ~${Math.ceil(Math.max((reset - Date.now()) / 1000, 1))}s)`, { status: Status.TooManyRequests }) + } + if (init) { + await this.#kv.set(`requests.ratelimit.${login}`, { current: current + 1, reset }, { ttl: 1000 * duration }) + } else { + await this.#kv.set(`requests.ratelimit.${login}`, { current: current + 1, reset }) + } + } + } + } + // Apply server configuration try { const extras = {} as Record - if (session && (await kv.get(["sessions", session]).then(({ value }) => value))) { - const { value: user } = await kv.get(["sessions", session]) as { value: user } - extras.token = user.token + if (user?.token) { + extras.token = new Secret(user.token) log.debug(`using token from user: ${user.login}`) } context = deepMerge( context, deepMerge(this.context.config, { - presets: Object.fromEntries(Object.entries(this.context.config.presets).map(([preset, { plugins }]) => [preset, { plugins: { ...plugins, ...extras, handle, mock } }])), + presets: Object.fromEntries( + Object.entries(this.context.config.presets).map(([preset, { plugins }]) => [preset, { plugins: { ...plugins, ...extras, handle, mock: context.mock } }]), + ), }), ) log.trace("applied server configuration") @@ -274,10 +322,12 @@ class Server extends Internal { try { const { content = "", mime = "image/svg+xml", base64 = false } = await process(context) ?? {} const body = base64 ? Base64.decode(content) : content + const headers = new Headers({ "cache-control": typeof this.context.cache === "number" ? `max-age=${this.context.cache}` : "no-store" }) if (!body) { - return promise.resolve(new Response(null, { status: Status.NoContent }))! + return promise.resolve(new Response(null, { status: Status.NoContent, headers }))! } - return promise.resolve(new Response(body, { status: Status.OK, headers: { "content-type": mime } }))! + headers.set("content-type", mime) + return promise.resolve(new Response(body, { status: Status.OK, headers }))! } catch (error) { log.warn(error) // Do not print error to users to avoid data leaks @@ -296,20 +346,28 @@ class Server extends Internal { break } case "POST": { - /*const middleware = (req, res, next) => { - console.debug(`metrics/app/control > ${req.url.replace(/[\n\r]/g, "")}`) - if (req.headers.authorization === conf.settings.control.token) { - next() - return + // Control API + switch (true) { + case this.routes.control.test(url.pathname): { + const authorization = request.headers.get("authorization") + if (!authorization) { + return new Response("Unauthorized", { status: Status.Unauthorized }) + } + const token = authorization.replace(/^Bearer\s+/, "") + const { action } = url.pathname.match(this.routes.control)?.groups ?? {} + switch (action) { + // Stop instance + case "stop": { + if (!this.context.control[token]?.includes(action)) { + return new Response("Forbidden", { status: Status.Forbidden }) + } + this.log.info("received stop request, server will shutdown in a few seconds") + setTimeout(() => Deno.exit(0), 5000) + return new Response("Accepted", { status: Status.Accepted }) + } + } } - return res.status(401).send("Unauthorized: invalid token") } - app.post("/.control/stop", limiter, middleware, async (req, res) => { - console.debug("metrics/app/control > instance will be stopped in a few seconds") - res.status(202).send("Accepted: instance will be stopped in a few seconds") - await new Promise(resolve => setTimeout(resolve, 5000)) - process.exit(1) - })*/ break } default: @@ -320,15 +378,16 @@ class Server extends Internal { } /** User */ -type user = { login: string; name: string; avatar: string; token: Secret; session: string } +type user = { login: string; avatar: string; token: string; session: string } // Entry point if (import.meta.main) { + const path = "metrics.config.yml" const config = {} as Record try { - await YAML.parse(await read("metrics.config.yml")) + Object.assign(config, await YAML.parse(await read(path))) } catch { - console.log("metrics.config.yml not found, using default configuration") + console.log(`${path} not found, using default configuration`) } await new Server(config).start() } diff --git a/source/run/server/mod_client.ts b/source/run/server/mod_client.ts new file mode 100644 index 00000000000..7d3b5feff6d --- /dev/null +++ b/source/run/server/mod_client.ts @@ -0,0 +1,128 @@ +// Imports +import Alpine from "y/alpinejs@3.13.0" +import * as YAML from "y/js-yaml@4.1.0" +import hljs from "y/highlight.js@11.8.0/lib/core" +import hlyaml from "y/highlight.js@11.8.0/lib/languages/yaml" +hljs.registerLanguage("yaml", hlyaml) + +// Alpine components +document.querySelectorAll("[x-component]").forEach((component) => { + customElements.define( + `x-${component.getAttribute("x-component")}`, + class extends HTMLElement { + connectedCallback() { + this.append(component.content.cloneNode(true)) + } + data() { + return Object.fromEntries(this.getAttributeNames().map((attribute) => [attribute, this.getAttribute(attribute)])) + } + }, + ) +}) + +/* +timezone: true, +handle: true, +entity: true, +template: true, +preset: true, +fatal: true, + */ + +const data = await fetch("/metadata").then((response) => response.json()) +data.user = await fetch("/me").then((response) => response.json()) +data.ratelimit = await fetch("/ratelimit").then((response) => response.json()) +console.log(data) +Alpine.data("data", () => data) + +Alpine.store("menu", { + dropdown: false, +}) + +Alpine.store("craft", { + handle: "", + plugins: [], + addPlugin(plugin) { + this.plugins.push({ ...plugin, processors: [], edit: "ui" }) + }, + removePlugin(i) { + this.plugins.splice(i, 1) + }, + addProcessor(processor, i) { + this.plugins[i].processors.push(processor) + }, + removeProcessor(i, j) { + this.plugins[i].processors.splice(j, 1) + }, + setEditMode(mode, i) { + this.plugins[i].edit = mode + }, + + async craftConfig(index) { + const config = { handle: this.handle, plugins: [] } + + for (let i = 0; i < this.plugins.length; i++) { + const plugin = { id: this.plugins[i].id, args: {}, processors: [] } + const inputs = document.querySelectorAll(`[data-plugin="${i}"] input, [data-plugin="${i}"] select`) + let skip = "" + for (const input of inputs) { + console.log(input.name, input.value, skip) + const [_, ...parts] = input.name.split(".") + let at = plugin + if (/^processors\[(\d+)\]$/.test(_)) { + const j = Number(_.match(/^processors\[(\d+)\]$/)[1]) + plugin.processors[j] ??= { id: this.plugins[i].processors[j].id, args: {} } + at = plugin.processors[j] + } + const last = parts.pop() + if (last === "$") { + skip = (!input.checked) ? [_, ...parts].join(".") : "" + continue + } + if (skip && (input.name.startsWith(skip))) { + continue + } + skip = "" + console.log(">>>>> setting", input.name, "to", input.value) + for (const part of parts) { + at[part] ??= {} + at = at[part] + } + switch (input.type) { + case "number": + at[last] = Number(input.value) + break + case "checkbox": + at[last] = input.checked + break + case "hidden": + at[last] = JSON.parse(input.value) + break + default: + at[last] = input.value + } + } + config.plugins[i] = plugin + console.log(YAML.dump(config)) + } + if (typeof index === "number") { + return config.plugins[index] + } + // document.querySelector(`[data-plugin="${i}"] .preview img`).src = `/preview?plugins=${JSON.stringify(config.plugins)}&t=${Date.now()}` + + return config + }, + async getUrl({ preview = false, time = false } = {}) { + const { plugins } = await this.craftConfig() + const handle = preview ? "preview" : this.handle || "preview" + const params = new URLSearchParams({ plugins: JSON.stringify(plugins) }) + if (time) { + params.set("t", Date.now()) + } + return `${window.origin}/${handle}?${params}` + }, + async getConfig() { + return hljs.highlight(YAML.dump(await this.craftConfig()), { language: "yaml" }).value + }, +}) +Alpine.start() diff --git a/source/run/server/static/index.html b/source/run/server/static/index.html index 126bb2347dc..b40e8ed8390 100644 --- a/source/run/server/static/index.html +++ b/source/run/server/static/index.html @@ -12,6 +12,7 @@ +