devusman commited on
Commit
1ff2605
Β·
1 Parent(s): e638210
Files changed (4) hide show
  1. Dockerfile +59 -0
  2. package-lock.json +2312 -0
  3. package.json +22 -0
  4. server.js +679 -0
Dockerfile ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use official Node.js LTS base image
2
+ FROM node:18-slim
3
+
4
+ # Set working directory
5
+ WORKDIR /app
6
+
7
+ # Install dependencies for Puppeteer (Chromium needs these)
8
+ RUN apt-get update && apt-get install -y \
9
+ wget \
10
+ ca-certificates \
11
+ fonts-liberation \
12
+ libasound2 \
13
+ libatk1.0-0 \
14
+ libatk-bridge2.0-0 \
15
+ libc6 \
16
+ libcairo2 \
17
+ libcups2 \
18
+ libdbus-1-3 \
19
+ libexpat1 \
20
+ libfontconfig1 \
21
+ libgbm1 \
22
+ libgcc1 \
23
+ libglib2.0-0 \
24
+ libgtk-3-0 \
25
+ libnss3 \
26
+ libnspr4 \
27
+ libpango-1.0-0 \
28
+ libx11-6 \
29
+ libx11-xcb1 \
30
+ libxcb1 \
31
+ libxcomposite1 \
32
+ libxcursor1 \
33
+ libxdamage1 \
34
+ libxext6 \
35
+ libxfixes3 \
36
+ libxi6 \
37
+ libxrandr2 \
38
+ libxrender1 \
39
+ libxss1 \
40
+ libxtst6 \
41
+ xdg-utils \
42
+ && rm -rf /var/lib/apt/lists/*
43
+
44
+ # Copy package.json and install dependencies
45
+ COPY package*.json ./
46
+ RUN npm install --omit=dev
47
+
48
+ # Copy the rest of the app
49
+ COPY . .
50
+
51
+ # Expose port (Spaces will map automatically)
52
+ EXPOSE 7860
53
+
54
+ # Puppeteer: tell it to use the system Chromium
55
+ ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable
56
+ ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
57
+
58
+ # Start the server
59
+ CMD ["npm", "start"]
package-lock.json ADDED
@@ -0,0 +1,2312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "git",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "axios": "^1.11.0",
9
+ "cors": "^2.8.5",
10
+ "express": "^5.1.0",
11
+ "nodemon": "^3.1.10",
12
+ "puppeteer": "^24.16.2"
13
+ }
14
+ },
15
+ "node_modules/@babel/code-frame": {
16
+ "version": "7.27.1",
17
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
18
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "@babel/helper-validator-identifier": "^7.27.1",
22
+ "js-tokens": "^4.0.0",
23
+ "picocolors": "^1.1.1"
24
+ },
25
+ "engines": {
26
+ "node": ">=6.9.0"
27
+ }
28
+ },
29
+ "node_modules/@babel/helper-validator-identifier": {
30
+ "version": "7.27.1",
31
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
32
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
33
+ "license": "MIT",
34
+ "engines": {
35
+ "node": ">=6.9.0"
36
+ }
37
+ },
38
+ "node_modules/@puppeteer/browsers": {
39
+ "version": "2.10.6",
40
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz",
41
+ "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==",
42
+ "license": "Apache-2.0",
43
+ "dependencies": {
44
+ "debug": "^4.4.1",
45
+ "extract-zip": "^2.0.1",
46
+ "progress": "^2.0.3",
47
+ "proxy-agent": "^6.5.0",
48
+ "semver": "^7.7.2",
49
+ "tar-fs": "^3.1.0",
50
+ "yargs": "^17.7.2"
51
+ },
52
+ "bin": {
53
+ "browsers": "lib/cjs/main-cli.js"
54
+ },
55
+ "engines": {
56
+ "node": ">=18"
57
+ }
58
+ },
59
+ "node_modules/@tootallnate/quickjs-emscripten": {
60
+ "version": "0.23.0",
61
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
62
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
63
+ "license": "MIT"
64
+ },
65
+ "node_modules/@types/node": {
66
+ "version": "24.3.0",
67
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
68
+ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
69
+ "license": "MIT",
70
+ "optional": true,
71
+ "dependencies": {
72
+ "undici-types": "~7.10.0"
73
+ }
74
+ },
75
+ "node_modules/@types/yauzl": {
76
+ "version": "2.10.3",
77
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
78
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
79
+ "license": "MIT",
80
+ "optional": true,
81
+ "dependencies": {
82
+ "@types/node": "*"
83
+ }
84
+ },
85
+ "node_modules/accepts": {
86
+ "version": "2.0.0",
87
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
88
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
89
+ "license": "MIT",
90
+ "dependencies": {
91
+ "mime-types": "^3.0.0",
92
+ "negotiator": "^1.0.0"
93
+ },
94
+ "engines": {
95
+ "node": ">= 0.6"
96
+ }
97
+ },
98
+ "node_modules/agent-base": {
99
+ "version": "7.1.4",
100
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
101
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
102
+ "license": "MIT",
103
+ "engines": {
104
+ "node": ">= 14"
105
+ }
106
+ },
107
+ "node_modules/ansi-regex": {
108
+ "version": "5.0.1",
109
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
110
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
111
+ "license": "MIT",
112
+ "engines": {
113
+ "node": ">=8"
114
+ }
115
+ },
116
+ "node_modules/ansi-styles": {
117
+ "version": "4.3.0",
118
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
119
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
120
+ "license": "MIT",
121
+ "dependencies": {
122
+ "color-convert": "^2.0.1"
123
+ },
124
+ "engines": {
125
+ "node": ">=8"
126
+ },
127
+ "funding": {
128
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
129
+ }
130
+ },
131
+ "node_modules/anymatch": {
132
+ "version": "3.1.3",
133
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
134
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
135
+ "license": "ISC",
136
+ "dependencies": {
137
+ "normalize-path": "^3.0.0",
138
+ "picomatch": "^2.0.4"
139
+ },
140
+ "engines": {
141
+ "node": ">= 8"
142
+ }
143
+ },
144
+ "node_modules/argparse": {
145
+ "version": "2.0.1",
146
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
147
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
148
+ "license": "Python-2.0"
149
+ },
150
+ "node_modules/ast-types": {
151
+ "version": "0.13.4",
152
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
153
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
154
+ "license": "MIT",
155
+ "dependencies": {
156
+ "tslib": "^2.0.1"
157
+ },
158
+ "engines": {
159
+ "node": ">=4"
160
+ }
161
+ },
162
+ "node_modules/asynckit": {
163
+ "version": "0.4.0",
164
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
165
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
166
+ "license": "MIT"
167
+ },
168
+ "node_modules/axios": {
169
+ "version": "1.11.0",
170
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
171
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
172
+ "license": "MIT",
173
+ "dependencies": {
174
+ "follow-redirects": "^1.15.6",
175
+ "form-data": "^4.0.4",
176
+ "proxy-from-env": "^1.1.0"
177
+ }
178
+ },
179
+ "node_modules/b4a": {
180
+ "version": "1.6.7",
181
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
182
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
183
+ "license": "Apache-2.0"
184
+ },
185
+ "node_modules/balanced-match": {
186
+ "version": "1.0.2",
187
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
188
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
189
+ "license": "MIT"
190
+ },
191
+ "node_modules/bare-events": {
192
+ "version": "2.6.1",
193
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz",
194
+ "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==",
195
+ "license": "Apache-2.0",
196
+ "optional": true
197
+ },
198
+ "node_modules/bare-fs": {
199
+ "version": "4.2.0",
200
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.0.tgz",
201
+ "integrity": "sha512-oRfrw7gwwBVAWx9S5zPMo2iiOjxyiZE12DmblmMQREgcogbNO0AFaZ+QBxxkEXiPspcpvO/Qtqn8LabUx4uYXg==",
202
+ "license": "Apache-2.0",
203
+ "optional": true,
204
+ "dependencies": {
205
+ "bare-events": "^2.5.4",
206
+ "bare-path": "^3.0.0",
207
+ "bare-stream": "^2.6.4"
208
+ },
209
+ "engines": {
210
+ "bare": ">=1.16.0"
211
+ },
212
+ "peerDependencies": {
213
+ "bare-buffer": "*"
214
+ },
215
+ "peerDependenciesMeta": {
216
+ "bare-buffer": {
217
+ "optional": true
218
+ }
219
+ }
220
+ },
221
+ "node_modules/bare-os": {
222
+ "version": "3.6.1",
223
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
224
+ "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
225
+ "license": "Apache-2.0",
226
+ "optional": true,
227
+ "engines": {
228
+ "bare": ">=1.14.0"
229
+ }
230
+ },
231
+ "node_modules/bare-path": {
232
+ "version": "3.0.0",
233
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
234
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
235
+ "license": "Apache-2.0",
236
+ "optional": true,
237
+ "dependencies": {
238
+ "bare-os": "^3.0.1"
239
+ }
240
+ },
241
+ "node_modules/bare-stream": {
242
+ "version": "2.7.0",
243
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
244
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
245
+ "license": "Apache-2.0",
246
+ "optional": true,
247
+ "dependencies": {
248
+ "streamx": "^2.21.0"
249
+ },
250
+ "peerDependencies": {
251
+ "bare-buffer": "*",
252
+ "bare-events": "*"
253
+ },
254
+ "peerDependenciesMeta": {
255
+ "bare-buffer": {
256
+ "optional": true
257
+ },
258
+ "bare-events": {
259
+ "optional": true
260
+ }
261
+ }
262
+ },
263
+ "node_modules/basic-ftp": {
264
+ "version": "5.0.5",
265
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
266
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
267
+ "license": "MIT",
268
+ "engines": {
269
+ "node": ">=10.0.0"
270
+ }
271
+ },
272
+ "node_modules/binary-extensions": {
273
+ "version": "2.3.0",
274
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
275
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
276
+ "license": "MIT",
277
+ "engines": {
278
+ "node": ">=8"
279
+ },
280
+ "funding": {
281
+ "url": "https://github.com/sponsors/sindresorhus"
282
+ }
283
+ },
284
+ "node_modules/body-parser": {
285
+ "version": "2.2.0",
286
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
287
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
288
+ "license": "MIT",
289
+ "dependencies": {
290
+ "bytes": "^3.1.2",
291
+ "content-type": "^1.0.5",
292
+ "debug": "^4.4.0",
293
+ "http-errors": "^2.0.0",
294
+ "iconv-lite": "^0.6.3",
295
+ "on-finished": "^2.4.1",
296
+ "qs": "^6.14.0",
297
+ "raw-body": "^3.0.0",
298
+ "type-is": "^2.0.0"
299
+ },
300
+ "engines": {
301
+ "node": ">=18"
302
+ }
303
+ },
304
+ "node_modules/brace-expansion": {
305
+ "version": "1.1.12",
306
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
307
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
308
+ "license": "MIT",
309
+ "dependencies": {
310
+ "balanced-match": "^1.0.0",
311
+ "concat-map": "0.0.1"
312
+ }
313
+ },
314
+ "node_modules/braces": {
315
+ "version": "3.0.3",
316
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
317
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
318
+ "license": "MIT",
319
+ "dependencies": {
320
+ "fill-range": "^7.1.1"
321
+ },
322
+ "engines": {
323
+ "node": ">=8"
324
+ }
325
+ },
326
+ "node_modules/buffer-crc32": {
327
+ "version": "0.2.13",
328
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
329
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
330
+ "license": "MIT",
331
+ "engines": {
332
+ "node": "*"
333
+ }
334
+ },
335
+ "node_modules/bytes": {
336
+ "version": "3.1.2",
337
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
338
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
339
+ "license": "MIT",
340
+ "engines": {
341
+ "node": ">= 0.8"
342
+ }
343
+ },
344
+ "node_modules/call-bind-apply-helpers": {
345
+ "version": "1.0.2",
346
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
347
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
348
+ "license": "MIT",
349
+ "dependencies": {
350
+ "es-errors": "^1.3.0",
351
+ "function-bind": "^1.1.2"
352
+ },
353
+ "engines": {
354
+ "node": ">= 0.4"
355
+ }
356
+ },
357
+ "node_modules/call-bound": {
358
+ "version": "1.0.4",
359
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
360
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
361
+ "license": "MIT",
362
+ "dependencies": {
363
+ "call-bind-apply-helpers": "^1.0.2",
364
+ "get-intrinsic": "^1.3.0"
365
+ },
366
+ "engines": {
367
+ "node": ">= 0.4"
368
+ },
369
+ "funding": {
370
+ "url": "https://github.com/sponsors/ljharb"
371
+ }
372
+ },
373
+ "node_modules/callsites": {
374
+ "version": "3.1.0",
375
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
376
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
377
+ "license": "MIT",
378
+ "engines": {
379
+ "node": ">=6"
380
+ }
381
+ },
382
+ "node_modules/chokidar": {
383
+ "version": "3.6.0",
384
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
385
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
386
+ "license": "MIT",
387
+ "dependencies": {
388
+ "anymatch": "~3.1.2",
389
+ "braces": "~3.0.2",
390
+ "glob-parent": "~5.1.2",
391
+ "is-binary-path": "~2.1.0",
392
+ "is-glob": "~4.0.1",
393
+ "normalize-path": "~3.0.0",
394
+ "readdirp": "~3.6.0"
395
+ },
396
+ "engines": {
397
+ "node": ">= 8.10.0"
398
+ },
399
+ "funding": {
400
+ "url": "https://paulmillr.com/funding/"
401
+ },
402
+ "optionalDependencies": {
403
+ "fsevents": "~2.3.2"
404
+ }
405
+ },
406
+ "node_modules/chromium-bidi": {
407
+ "version": "7.3.1",
408
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.3.1.tgz",
409
+ "integrity": "sha512-i+BMGluhZZc4Jic9L1aHJBTfaopxmCqQxGklyMcqFx4fvF3nI4BJ3bCe1ad474nvYRIo/ZN/VrdA4eOaRZua4Q==",
410
+ "license": "Apache-2.0",
411
+ "dependencies": {
412
+ "mitt": "^3.0.1",
413
+ "zod": "^3.24.1"
414
+ },
415
+ "peerDependencies": {
416
+ "devtools-protocol": "*"
417
+ }
418
+ },
419
+ "node_modules/cliui": {
420
+ "version": "8.0.1",
421
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
422
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
423
+ "license": "ISC",
424
+ "dependencies": {
425
+ "string-width": "^4.2.0",
426
+ "strip-ansi": "^6.0.1",
427
+ "wrap-ansi": "^7.0.0"
428
+ },
429
+ "engines": {
430
+ "node": ">=12"
431
+ }
432
+ },
433
+ "node_modules/color-convert": {
434
+ "version": "2.0.1",
435
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
436
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
437
+ "license": "MIT",
438
+ "dependencies": {
439
+ "color-name": "~1.1.4"
440
+ },
441
+ "engines": {
442
+ "node": ">=7.0.0"
443
+ }
444
+ },
445
+ "node_modules/color-name": {
446
+ "version": "1.1.4",
447
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
448
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
449
+ "license": "MIT"
450
+ },
451
+ "node_modules/combined-stream": {
452
+ "version": "1.0.8",
453
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
454
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
455
+ "license": "MIT",
456
+ "dependencies": {
457
+ "delayed-stream": "~1.0.0"
458
+ },
459
+ "engines": {
460
+ "node": ">= 0.8"
461
+ }
462
+ },
463
+ "node_modules/concat-map": {
464
+ "version": "0.0.1",
465
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
466
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
467
+ "license": "MIT"
468
+ },
469
+ "node_modules/content-disposition": {
470
+ "version": "1.0.0",
471
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
472
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
473
+ "license": "MIT",
474
+ "dependencies": {
475
+ "safe-buffer": "5.2.1"
476
+ },
477
+ "engines": {
478
+ "node": ">= 0.6"
479
+ }
480
+ },
481
+ "node_modules/content-type": {
482
+ "version": "1.0.5",
483
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
484
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
485
+ "license": "MIT",
486
+ "engines": {
487
+ "node": ">= 0.6"
488
+ }
489
+ },
490
+ "node_modules/cookie": {
491
+ "version": "0.7.2",
492
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
493
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
494
+ "license": "MIT",
495
+ "engines": {
496
+ "node": ">= 0.6"
497
+ }
498
+ },
499
+ "node_modules/cookie-signature": {
500
+ "version": "1.2.2",
501
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
502
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
503
+ "license": "MIT",
504
+ "engines": {
505
+ "node": ">=6.6.0"
506
+ }
507
+ },
508
+ "node_modules/cors": {
509
+ "version": "2.8.5",
510
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
511
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
512
+ "license": "MIT",
513
+ "dependencies": {
514
+ "object-assign": "^4",
515
+ "vary": "^1"
516
+ },
517
+ "engines": {
518
+ "node": ">= 0.10"
519
+ }
520
+ },
521
+ "node_modules/cosmiconfig": {
522
+ "version": "9.0.0",
523
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
524
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
525
+ "license": "MIT",
526
+ "dependencies": {
527
+ "env-paths": "^2.2.1",
528
+ "import-fresh": "^3.3.0",
529
+ "js-yaml": "^4.1.0",
530
+ "parse-json": "^5.2.0"
531
+ },
532
+ "engines": {
533
+ "node": ">=14"
534
+ },
535
+ "funding": {
536
+ "url": "https://github.com/sponsors/d-fischer"
537
+ },
538
+ "peerDependencies": {
539
+ "typescript": ">=4.9.5"
540
+ },
541
+ "peerDependenciesMeta": {
542
+ "typescript": {
543
+ "optional": true
544
+ }
545
+ }
546
+ },
547
+ "node_modules/data-uri-to-buffer": {
548
+ "version": "6.0.2",
549
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
550
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
551
+ "license": "MIT",
552
+ "engines": {
553
+ "node": ">= 14"
554
+ }
555
+ },
556
+ "node_modules/debug": {
557
+ "version": "4.4.1",
558
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
559
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
560
+ "license": "MIT",
561
+ "dependencies": {
562
+ "ms": "^2.1.3"
563
+ },
564
+ "engines": {
565
+ "node": ">=6.0"
566
+ },
567
+ "peerDependenciesMeta": {
568
+ "supports-color": {
569
+ "optional": true
570
+ }
571
+ }
572
+ },
573
+ "node_modules/degenerator": {
574
+ "version": "5.0.1",
575
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
576
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
577
+ "license": "MIT",
578
+ "dependencies": {
579
+ "ast-types": "^0.13.4",
580
+ "escodegen": "^2.1.0",
581
+ "esprima": "^4.0.1"
582
+ },
583
+ "engines": {
584
+ "node": ">= 14"
585
+ }
586
+ },
587
+ "node_modules/delayed-stream": {
588
+ "version": "1.0.0",
589
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
590
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
591
+ "license": "MIT",
592
+ "engines": {
593
+ "node": ">=0.4.0"
594
+ }
595
+ },
596
+ "node_modules/depd": {
597
+ "version": "2.0.0",
598
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
599
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
600
+ "license": "MIT",
601
+ "engines": {
602
+ "node": ">= 0.8"
603
+ }
604
+ },
605
+ "node_modules/devtools-protocol": {
606
+ "version": "0.0.1475386",
607
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz",
608
+ "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==",
609
+ "license": "BSD-3-Clause"
610
+ },
611
+ "node_modules/dunder-proto": {
612
+ "version": "1.0.1",
613
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
614
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
615
+ "license": "MIT",
616
+ "dependencies": {
617
+ "call-bind-apply-helpers": "^1.0.1",
618
+ "es-errors": "^1.3.0",
619
+ "gopd": "^1.2.0"
620
+ },
621
+ "engines": {
622
+ "node": ">= 0.4"
623
+ }
624
+ },
625
+ "node_modules/ee-first": {
626
+ "version": "1.1.1",
627
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
628
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
629
+ "license": "MIT"
630
+ },
631
+ "node_modules/emoji-regex": {
632
+ "version": "8.0.0",
633
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
634
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
635
+ "license": "MIT"
636
+ },
637
+ "node_modules/encodeurl": {
638
+ "version": "2.0.0",
639
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
640
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
641
+ "license": "MIT",
642
+ "engines": {
643
+ "node": ">= 0.8"
644
+ }
645
+ },
646
+ "node_modules/end-of-stream": {
647
+ "version": "1.4.5",
648
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
649
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
650
+ "license": "MIT",
651
+ "dependencies": {
652
+ "once": "^1.4.0"
653
+ }
654
+ },
655
+ "node_modules/env-paths": {
656
+ "version": "2.2.1",
657
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
658
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
659
+ "license": "MIT",
660
+ "engines": {
661
+ "node": ">=6"
662
+ }
663
+ },
664
+ "node_modules/error-ex": {
665
+ "version": "1.3.2",
666
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
667
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
668
+ "license": "MIT",
669
+ "dependencies": {
670
+ "is-arrayish": "^0.2.1"
671
+ }
672
+ },
673
+ "node_modules/es-define-property": {
674
+ "version": "1.0.1",
675
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
676
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
677
+ "license": "MIT",
678
+ "engines": {
679
+ "node": ">= 0.4"
680
+ }
681
+ },
682
+ "node_modules/es-errors": {
683
+ "version": "1.3.0",
684
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
685
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
686
+ "license": "MIT",
687
+ "engines": {
688
+ "node": ">= 0.4"
689
+ }
690
+ },
691
+ "node_modules/es-object-atoms": {
692
+ "version": "1.1.1",
693
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
694
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
695
+ "license": "MIT",
696
+ "dependencies": {
697
+ "es-errors": "^1.3.0"
698
+ },
699
+ "engines": {
700
+ "node": ">= 0.4"
701
+ }
702
+ },
703
+ "node_modules/es-set-tostringtag": {
704
+ "version": "2.1.0",
705
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
706
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
707
+ "license": "MIT",
708
+ "dependencies": {
709
+ "es-errors": "^1.3.0",
710
+ "get-intrinsic": "^1.2.6",
711
+ "has-tostringtag": "^1.0.2",
712
+ "hasown": "^2.0.2"
713
+ },
714
+ "engines": {
715
+ "node": ">= 0.4"
716
+ }
717
+ },
718
+ "node_modules/escalade": {
719
+ "version": "3.2.0",
720
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
721
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
722
+ "license": "MIT",
723
+ "engines": {
724
+ "node": ">=6"
725
+ }
726
+ },
727
+ "node_modules/escape-html": {
728
+ "version": "1.0.3",
729
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
730
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
731
+ "license": "MIT"
732
+ },
733
+ "node_modules/escodegen": {
734
+ "version": "2.1.0",
735
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
736
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
737
+ "license": "BSD-2-Clause",
738
+ "dependencies": {
739
+ "esprima": "^4.0.1",
740
+ "estraverse": "^5.2.0",
741
+ "esutils": "^2.0.2"
742
+ },
743
+ "bin": {
744
+ "escodegen": "bin/escodegen.js",
745
+ "esgenerate": "bin/esgenerate.js"
746
+ },
747
+ "engines": {
748
+ "node": ">=6.0"
749
+ },
750
+ "optionalDependencies": {
751
+ "source-map": "~0.6.1"
752
+ }
753
+ },
754
+ "node_modules/esprima": {
755
+ "version": "4.0.1",
756
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
757
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
758
+ "license": "BSD-2-Clause",
759
+ "bin": {
760
+ "esparse": "bin/esparse.js",
761
+ "esvalidate": "bin/esvalidate.js"
762
+ },
763
+ "engines": {
764
+ "node": ">=4"
765
+ }
766
+ },
767
+ "node_modules/estraverse": {
768
+ "version": "5.3.0",
769
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
770
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
771
+ "license": "BSD-2-Clause",
772
+ "engines": {
773
+ "node": ">=4.0"
774
+ }
775
+ },
776
+ "node_modules/esutils": {
777
+ "version": "2.0.3",
778
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
779
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
780
+ "license": "BSD-2-Clause",
781
+ "engines": {
782
+ "node": ">=0.10.0"
783
+ }
784
+ },
785
+ "node_modules/etag": {
786
+ "version": "1.8.1",
787
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
788
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
789
+ "license": "MIT",
790
+ "engines": {
791
+ "node": ">= 0.6"
792
+ }
793
+ },
794
+ "node_modules/express": {
795
+ "version": "5.1.0",
796
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
797
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
798
+ "license": "MIT",
799
+ "dependencies": {
800
+ "accepts": "^2.0.0",
801
+ "body-parser": "^2.2.0",
802
+ "content-disposition": "^1.0.0",
803
+ "content-type": "^1.0.5",
804
+ "cookie": "^0.7.1",
805
+ "cookie-signature": "^1.2.1",
806
+ "debug": "^4.4.0",
807
+ "encodeurl": "^2.0.0",
808
+ "escape-html": "^1.0.3",
809
+ "etag": "^1.8.1",
810
+ "finalhandler": "^2.1.0",
811
+ "fresh": "^2.0.0",
812
+ "http-errors": "^2.0.0",
813
+ "merge-descriptors": "^2.0.0",
814
+ "mime-types": "^3.0.0",
815
+ "on-finished": "^2.4.1",
816
+ "once": "^1.4.0",
817
+ "parseurl": "^1.3.3",
818
+ "proxy-addr": "^2.0.7",
819
+ "qs": "^6.14.0",
820
+ "range-parser": "^1.2.1",
821
+ "router": "^2.2.0",
822
+ "send": "^1.1.0",
823
+ "serve-static": "^2.2.0",
824
+ "statuses": "^2.0.1",
825
+ "type-is": "^2.0.1",
826
+ "vary": "^1.1.2"
827
+ },
828
+ "engines": {
829
+ "node": ">= 18"
830
+ },
831
+ "funding": {
832
+ "type": "opencollective",
833
+ "url": "https://opencollective.com/express"
834
+ }
835
+ },
836
+ "node_modules/extract-zip": {
837
+ "version": "2.0.1",
838
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
839
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
840
+ "license": "BSD-2-Clause",
841
+ "dependencies": {
842
+ "debug": "^4.1.1",
843
+ "get-stream": "^5.1.0",
844
+ "yauzl": "^2.10.0"
845
+ },
846
+ "bin": {
847
+ "extract-zip": "cli.js"
848
+ },
849
+ "engines": {
850
+ "node": ">= 10.17.0"
851
+ },
852
+ "optionalDependencies": {
853
+ "@types/yauzl": "^2.9.1"
854
+ }
855
+ },
856
+ "node_modules/fast-fifo": {
857
+ "version": "1.3.2",
858
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
859
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
860
+ "license": "MIT"
861
+ },
862
+ "node_modules/fd-slicer": {
863
+ "version": "1.1.0",
864
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
865
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
866
+ "license": "MIT",
867
+ "dependencies": {
868
+ "pend": "~1.2.0"
869
+ }
870
+ },
871
+ "node_modules/fill-range": {
872
+ "version": "7.1.1",
873
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
874
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
875
+ "license": "MIT",
876
+ "dependencies": {
877
+ "to-regex-range": "^5.0.1"
878
+ },
879
+ "engines": {
880
+ "node": ">=8"
881
+ }
882
+ },
883
+ "node_modules/finalhandler": {
884
+ "version": "2.1.0",
885
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
886
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
887
+ "license": "MIT",
888
+ "dependencies": {
889
+ "debug": "^4.4.0",
890
+ "encodeurl": "^2.0.0",
891
+ "escape-html": "^1.0.3",
892
+ "on-finished": "^2.4.1",
893
+ "parseurl": "^1.3.3",
894
+ "statuses": "^2.0.1"
895
+ },
896
+ "engines": {
897
+ "node": ">= 0.8"
898
+ }
899
+ },
900
+ "node_modules/follow-redirects": {
901
+ "version": "1.15.11",
902
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
903
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
904
+ "funding": [
905
+ {
906
+ "type": "individual",
907
+ "url": "https://github.com/sponsors/RubenVerborgh"
908
+ }
909
+ ],
910
+ "license": "MIT",
911
+ "engines": {
912
+ "node": ">=4.0"
913
+ },
914
+ "peerDependenciesMeta": {
915
+ "debug": {
916
+ "optional": true
917
+ }
918
+ }
919
+ },
920
+ "node_modules/form-data": {
921
+ "version": "4.0.4",
922
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
923
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
924
+ "license": "MIT",
925
+ "dependencies": {
926
+ "asynckit": "^0.4.0",
927
+ "combined-stream": "^1.0.8",
928
+ "es-set-tostringtag": "^2.1.0",
929
+ "hasown": "^2.0.2",
930
+ "mime-types": "^2.1.12"
931
+ },
932
+ "engines": {
933
+ "node": ">= 6"
934
+ }
935
+ },
936
+ "node_modules/form-data/node_modules/mime-db": {
937
+ "version": "1.52.0",
938
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
939
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
940
+ "license": "MIT",
941
+ "engines": {
942
+ "node": ">= 0.6"
943
+ }
944
+ },
945
+ "node_modules/form-data/node_modules/mime-types": {
946
+ "version": "2.1.35",
947
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
948
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
949
+ "license": "MIT",
950
+ "dependencies": {
951
+ "mime-db": "1.52.0"
952
+ },
953
+ "engines": {
954
+ "node": ">= 0.6"
955
+ }
956
+ },
957
+ "node_modules/forwarded": {
958
+ "version": "0.2.0",
959
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
960
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
961
+ "license": "MIT",
962
+ "engines": {
963
+ "node": ">= 0.6"
964
+ }
965
+ },
966
+ "node_modules/fresh": {
967
+ "version": "2.0.0",
968
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
969
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
970
+ "license": "MIT",
971
+ "engines": {
972
+ "node": ">= 0.8"
973
+ }
974
+ },
975
+ "node_modules/fsevents": {
976
+ "version": "2.3.3",
977
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
978
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
979
+ "hasInstallScript": true,
980
+ "license": "MIT",
981
+ "optional": true,
982
+ "os": [
983
+ "darwin"
984
+ ],
985
+ "engines": {
986
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
987
+ }
988
+ },
989
+ "node_modules/function-bind": {
990
+ "version": "1.1.2",
991
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
992
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
993
+ "license": "MIT",
994
+ "funding": {
995
+ "url": "https://github.com/sponsors/ljharb"
996
+ }
997
+ },
998
+ "node_modules/get-caller-file": {
999
+ "version": "2.0.5",
1000
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1001
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1002
+ "license": "ISC",
1003
+ "engines": {
1004
+ "node": "6.* || 8.* || >= 10.*"
1005
+ }
1006
+ },
1007
+ "node_modules/get-intrinsic": {
1008
+ "version": "1.3.0",
1009
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
1010
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
1011
+ "license": "MIT",
1012
+ "dependencies": {
1013
+ "call-bind-apply-helpers": "^1.0.2",
1014
+ "es-define-property": "^1.0.1",
1015
+ "es-errors": "^1.3.0",
1016
+ "es-object-atoms": "^1.1.1",
1017
+ "function-bind": "^1.1.2",
1018
+ "get-proto": "^1.0.1",
1019
+ "gopd": "^1.2.0",
1020
+ "has-symbols": "^1.1.0",
1021
+ "hasown": "^2.0.2",
1022
+ "math-intrinsics": "^1.1.0"
1023
+ },
1024
+ "engines": {
1025
+ "node": ">= 0.4"
1026
+ },
1027
+ "funding": {
1028
+ "url": "https://github.com/sponsors/ljharb"
1029
+ }
1030
+ },
1031
+ "node_modules/get-proto": {
1032
+ "version": "1.0.1",
1033
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
1034
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
1035
+ "license": "MIT",
1036
+ "dependencies": {
1037
+ "dunder-proto": "^1.0.1",
1038
+ "es-object-atoms": "^1.0.0"
1039
+ },
1040
+ "engines": {
1041
+ "node": ">= 0.4"
1042
+ }
1043
+ },
1044
+ "node_modules/get-stream": {
1045
+ "version": "5.2.0",
1046
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
1047
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
1048
+ "license": "MIT",
1049
+ "dependencies": {
1050
+ "pump": "^3.0.0"
1051
+ },
1052
+ "engines": {
1053
+ "node": ">=8"
1054
+ },
1055
+ "funding": {
1056
+ "url": "https://github.com/sponsors/sindresorhus"
1057
+ }
1058
+ },
1059
+ "node_modules/get-uri": {
1060
+ "version": "6.0.5",
1061
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
1062
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
1063
+ "license": "MIT",
1064
+ "dependencies": {
1065
+ "basic-ftp": "^5.0.2",
1066
+ "data-uri-to-buffer": "^6.0.2",
1067
+ "debug": "^4.3.4"
1068
+ },
1069
+ "engines": {
1070
+ "node": ">= 14"
1071
+ }
1072
+ },
1073
+ "node_modules/glob-parent": {
1074
+ "version": "5.1.2",
1075
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1076
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1077
+ "license": "ISC",
1078
+ "dependencies": {
1079
+ "is-glob": "^4.0.1"
1080
+ },
1081
+ "engines": {
1082
+ "node": ">= 6"
1083
+ }
1084
+ },
1085
+ "node_modules/gopd": {
1086
+ "version": "1.2.0",
1087
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1088
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1089
+ "license": "MIT",
1090
+ "engines": {
1091
+ "node": ">= 0.4"
1092
+ },
1093
+ "funding": {
1094
+ "url": "https://github.com/sponsors/ljharb"
1095
+ }
1096
+ },
1097
+ "node_modules/has-flag": {
1098
+ "version": "3.0.0",
1099
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1100
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
1101
+ "license": "MIT",
1102
+ "engines": {
1103
+ "node": ">=4"
1104
+ }
1105
+ },
1106
+ "node_modules/has-symbols": {
1107
+ "version": "1.1.0",
1108
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
1109
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1110
+ "license": "MIT",
1111
+ "engines": {
1112
+ "node": ">= 0.4"
1113
+ },
1114
+ "funding": {
1115
+ "url": "https://github.com/sponsors/ljharb"
1116
+ }
1117
+ },
1118
+ "node_modules/has-tostringtag": {
1119
+ "version": "1.0.2",
1120
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
1121
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
1122
+ "license": "MIT",
1123
+ "dependencies": {
1124
+ "has-symbols": "^1.0.3"
1125
+ },
1126
+ "engines": {
1127
+ "node": ">= 0.4"
1128
+ },
1129
+ "funding": {
1130
+ "url": "https://github.com/sponsors/ljharb"
1131
+ }
1132
+ },
1133
+ "node_modules/hasown": {
1134
+ "version": "2.0.2",
1135
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1136
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1137
+ "license": "MIT",
1138
+ "dependencies": {
1139
+ "function-bind": "^1.1.2"
1140
+ },
1141
+ "engines": {
1142
+ "node": ">= 0.4"
1143
+ }
1144
+ },
1145
+ "node_modules/http-errors": {
1146
+ "version": "2.0.0",
1147
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1148
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1149
+ "license": "MIT",
1150
+ "dependencies": {
1151
+ "depd": "2.0.0",
1152
+ "inherits": "2.0.4",
1153
+ "setprototypeof": "1.2.0",
1154
+ "statuses": "2.0.1",
1155
+ "toidentifier": "1.0.1"
1156
+ },
1157
+ "engines": {
1158
+ "node": ">= 0.8"
1159
+ }
1160
+ },
1161
+ "node_modules/http-errors/node_modules/statuses": {
1162
+ "version": "2.0.1",
1163
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1164
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1165
+ "license": "MIT",
1166
+ "engines": {
1167
+ "node": ">= 0.8"
1168
+ }
1169
+ },
1170
+ "node_modules/http-proxy-agent": {
1171
+ "version": "7.0.2",
1172
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
1173
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
1174
+ "license": "MIT",
1175
+ "dependencies": {
1176
+ "agent-base": "^7.1.0",
1177
+ "debug": "^4.3.4"
1178
+ },
1179
+ "engines": {
1180
+ "node": ">= 14"
1181
+ }
1182
+ },
1183
+ "node_modules/https-proxy-agent": {
1184
+ "version": "7.0.6",
1185
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
1186
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
1187
+ "license": "MIT",
1188
+ "dependencies": {
1189
+ "agent-base": "^7.1.2",
1190
+ "debug": "4"
1191
+ },
1192
+ "engines": {
1193
+ "node": ">= 14"
1194
+ }
1195
+ },
1196
+ "node_modules/iconv-lite": {
1197
+ "version": "0.6.3",
1198
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
1199
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
1200
+ "license": "MIT",
1201
+ "dependencies": {
1202
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
1203
+ },
1204
+ "engines": {
1205
+ "node": ">=0.10.0"
1206
+ }
1207
+ },
1208
+ "node_modules/ignore-by-default": {
1209
+ "version": "1.0.1",
1210
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1211
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
1212
+ "license": "ISC"
1213
+ },
1214
+ "node_modules/import-fresh": {
1215
+ "version": "3.3.1",
1216
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
1217
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
1218
+ "license": "MIT",
1219
+ "dependencies": {
1220
+ "parent-module": "^1.0.0",
1221
+ "resolve-from": "^4.0.0"
1222
+ },
1223
+ "engines": {
1224
+ "node": ">=6"
1225
+ },
1226
+ "funding": {
1227
+ "url": "https://github.com/sponsors/sindresorhus"
1228
+ }
1229
+ },
1230
+ "node_modules/inherits": {
1231
+ "version": "2.0.4",
1232
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1233
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1234
+ "license": "ISC"
1235
+ },
1236
+ "node_modules/ip-address": {
1237
+ "version": "10.0.1",
1238
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
1239
+ "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
1240
+ "license": "MIT",
1241
+ "engines": {
1242
+ "node": ">= 12"
1243
+ }
1244
+ },
1245
+ "node_modules/ipaddr.js": {
1246
+ "version": "1.9.1",
1247
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1248
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1249
+ "license": "MIT",
1250
+ "engines": {
1251
+ "node": ">= 0.10"
1252
+ }
1253
+ },
1254
+ "node_modules/is-arrayish": {
1255
+ "version": "0.2.1",
1256
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1257
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
1258
+ "license": "MIT"
1259
+ },
1260
+ "node_modules/is-binary-path": {
1261
+ "version": "2.1.0",
1262
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1263
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1264
+ "license": "MIT",
1265
+ "dependencies": {
1266
+ "binary-extensions": "^2.0.0"
1267
+ },
1268
+ "engines": {
1269
+ "node": ">=8"
1270
+ }
1271
+ },
1272
+ "node_modules/is-extglob": {
1273
+ "version": "2.1.1",
1274
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1275
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1276
+ "license": "MIT",
1277
+ "engines": {
1278
+ "node": ">=0.10.0"
1279
+ }
1280
+ },
1281
+ "node_modules/is-fullwidth-code-point": {
1282
+ "version": "3.0.0",
1283
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1284
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1285
+ "license": "MIT",
1286
+ "engines": {
1287
+ "node": ">=8"
1288
+ }
1289
+ },
1290
+ "node_modules/is-glob": {
1291
+ "version": "4.0.3",
1292
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1293
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1294
+ "license": "MIT",
1295
+ "dependencies": {
1296
+ "is-extglob": "^2.1.1"
1297
+ },
1298
+ "engines": {
1299
+ "node": ">=0.10.0"
1300
+ }
1301
+ },
1302
+ "node_modules/is-number": {
1303
+ "version": "7.0.0",
1304
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1305
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1306
+ "license": "MIT",
1307
+ "engines": {
1308
+ "node": ">=0.12.0"
1309
+ }
1310
+ },
1311
+ "node_modules/is-promise": {
1312
+ "version": "4.0.0",
1313
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
1314
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
1315
+ "license": "MIT"
1316
+ },
1317
+ "node_modules/js-tokens": {
1318
+ "version": "4.0.0",
1319
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1320
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1321
+ "license": "MIT"
1322
+ },
1323
+ "node_modules/js-yaml": {
1324
+ "version": "4.1.0",
1325
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1326
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1327
+ "license": "MIT",
1328
+ "dependencies": {
1329
+ "argparse": "^2.0.1"
1330
+ },
1331
+ "bin": {
1332
+ "js-yaml": "bin/js-yaml.js"
1333
+ }
1334
+ },
1335
+ "node_modules/json-parse-even-better-errors": {
1336
+ "version": "2.3.1",
1337
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
1338
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
1339
+ "license": "MIT"
1340
+ },
1341
+ "node_modules/lines-and-columns": {
1342
+ "version": "1.2.4",
1343
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1344
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1345
+ "license": "MIT"
1346
+ },
1347
+ "node_modules/lru-cache": {
1348
+ "version": "7.18.3",
1349
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
1350
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
1351
+ "license": "ISC",
1352
+ "engines": {
1353
+ "node": ">=12"
1354
+ }
1355
+ },
1356
+ "node_modules/math-intrinsics": {
1357
+ "version": "1.1.0",
1358
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1359
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1360
+ "license": "MIT",
1361
+ "engines": {
1362
+ "node": ">= 0.4"
1363
+ }
1364
+ },
1365
+ "node_modules/media-typer": {
1366
+ "version": "1.1.0",
1367
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
1368
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
1369
+ "license": "MIT",
1370
+ "engines": {
1371
+ "node": ">= 0.8"
1372
+ }
1373
+ },
1374
+ "node_modules/merge-descriptors": {
1375
+ "version": "2.0.0",
1376
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
1377
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
1378
+ "license": "MIT",
1379
+ "engines": {
1380
+ "node": ">=18"
1381
+ },
1382
+ "funding": {
1383
+ "url": "https://github.com/sponsors/sindresorhus"
1384
+ }
1385
+ },
1386
+ "node_modules/mime-db": {
1387
+ "version": "1.54.0",
1388
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
1389
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1390
+ "license": "MIT",
1391
+ "engines": {
1392
+ "node": ">= 0.6"
1393
+ }
1394
+ },
1395
+ "node_modules/mime-types": {
1396
+ "version": "3.0.1",
1397
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
1398
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
1399
+ "license": "MIT",
1400
+ "dependencies": {
1401
+ "mime-db": "^1.54.0"
1402
+ },
1403
+ "engines": {
1404
+ "node": ">= 0.6"
1405
+ }
1406
+ },
1407
+ "node_modules/minimatch": {
1408
+ "version": "3.1.2",
1409
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1410
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1411
+ "license": "ISC",
1412
+ "dependencies": {
1413
+ "brace-expansion": "^1.1.7"
1414
+ },
1415
+ "engines": {
1416
+ "node": "*"
1417
+ }
1418
+ },
1419
+ "node_modules/mitt": {
1420
+ "version": "3.0.1",
1421
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
1422
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
1423
+ "license": "MIT"
1424
+ },
1425
+ "node_modules/ms": {
1426
+ "version": "2.1.3",
1427
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1428
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1429
+ "license": "MIT"
1430
+ },
1431
+ "node_modules/negotiator": {
1432
+ "version": "1.0.0",
1433
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
1434
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
1435
+ "license": "MIT",
1436
+ "engines": {
1437
+ "node": ">= 0.6"
1438
+ }
1439
+ },
1440
+ "node_modules/netmask": {
1441
+ "version": "2.0.2",
1442
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
1443
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
1444
+ "license": "MIT",
1445
+ "engines": {
1446
+ "node": ">= 0.4.0"
1447
+ }
1448
+ },
1449
+ "node_modules/nodemon": {
1450
+ "version": "3.1.10",
1451
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
1452
+ "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",
1453
+ "license": "MIT",
1454
+ "dependencies": {
1455
+ "chokidar": "^3.5.2",
1456
+ "debug": "^4",
1457
+ "ignore-by-default": "^1.0.1",
1458
+ "minimatch": "^3.1.2",
1459
+ "pstree.remy": "^1.1.8",
1460
+ "semver": "^7.5.3",
1461
+ "simple-update-notifier": "^2.0.0",
1462
+ "supports-color": "^5.5.0",
1463
+ "touch": "^3.1.0",
1464
+ "undefsafe": "^2.0.5"
1465
+ },
1466
+ "bin": {
1467
+ "nodemon": "bin/nodemon.js"
1468
+ },
1469
+ "engines": {
1470
+ "node": ">=10"
1471
+ },
1472
+ "funding": {
1473
+ "type": "opencollective",
1474
+ "url": "https://opencollective.com/nodemon"
1475
+ }
1476
+ },
1477
+ "node_modules/normalize-path": {
1478
+ "version": "3.0.0",
1479
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1480
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1481
+ "license": "MIT",
1482
+ "engines": {
1483
+ "node": ">=0.10.0"
1484
+ }
1485
+ },
1486
+ "node_modules/object-assign": {
1487
+ "version": "4.1.1",
1488
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1489
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1490
+ "license": "MIT",
1491
+ "engines": {
1492
+ "node": ">=0.10.0"
1493
+ }
1494
+ },
1495
+ "node_modules/object-inspect": {
1496
+ "version": "1.13.4",
1497
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1498
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1499
+ "license": "MIT",
1500
+ "engines": {
1501
+ "node": ">= 0.4"
1502
+ },
1503
+ "funding": {
1504
+ "url": "https://github.com/sponsors/ljharb"
1505
+ }
1506
+ },
1507
+ "node_modules/on-finished": {
1508
+ "version": "2.4.1",
1509
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1510
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1511
+ "license": "MIT",
1512
+ "dependencies": {
1513
+ "ee-first": "1.1.1"
1514
+ },
1515
+ "engines": {
1516
+ "node": ">= 0.8"
1517
+ }
1518
+ },
1519
+ "node_modules/once": {
1520
+ "version": "1.4.0",
1521
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1522
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1523
+ "license": "ISC",
1524
+ "dependencies": {
1525
+ "wrappy": "1"
1526
+ }
1527
+ },
1528
+ "node_modules/pac-proxy-agent": {
1529
+ "version": "7.2.0",
1530
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
1531
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
1532
+ "license": "MIT",
1533
+ "dependencies": {
1534
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
1535
+ "agent-base": "^7.1.2",
1536
+ "debug": "^4.3.4",
1537
+ "get-uri": "^6.0.1",
1538
+ "http-proxy-agent": "^7.0.0",
1539
+ "https-proxy-agent": "^7.0.6",
1540
+ "pac-resolver": "^7.0.1",
1541
+ "socks-proxy-agent": "^8.0.5"
1542
+ },
1543
+ "engines": {
1544
+ "node": ">= 14"
1545
+ }
1546
+ },
1547
+ "node_modules/pac-resolver": {
1548
+ "version": "7.0.1",
1549
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
1550
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
1551
+ "license": "MIT",
1552
+ "dependencies": {
1553
+ "degenerator": "^5.0.0",
1554
+ "netmask": "^2.0.2"
1555
+ },
1556
+ "engines": {
1557
+ "node": ">= 14"
1558
+ }
1559
+ },
1560
+ "node_modules/parent-module": {
1561
+ "version": "1.0.1",
1562
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1563
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1564
+ "license": "MIT",
1565
+ "dependencies": {
1566
+ "callsites": "^3.0.0"
1567
+ },
1568
+ "engines": {
1569
+ "node": ">=6"
1570
+ }
1571
+ },
1572
+ "node_modules/parse-json": {
1573
+ "version": "5.2.0",
1574
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
1575
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
1576
+ "license": "MIT",
1577
+ "dependencies": {
1578
+ "@babel/code-frame": "^7.0.0",
1579
+ "error-ex": "^1.3.1",
1580
+ "json-parse-even-better-errors": "^2.3.0",
1581
+ "lines-and-columns": "^1.1.6"
1582
+ },
1583
+ "engines": {
1584
+ "node": ">=8"
1585
+ },
1586
+ "funding": {
1587
+ "url": "https://github.com/sponsors/sindresorhus"
1588
+ }
1589
+ },
1590
+ "node_modules/parseurl": {
1591
+ "version": "1.3.3",
1592
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1593
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1594
+ "license": "MIT",
1595
+ "engines": {
1596
+ "node": ">= 0.8"
1597
+ }
1598
+ },
1599
+ "node_modules/path-to-regexp": {
1600
+ "version": "8.2.0",
1601
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
1602
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
1603
+ "license": "MIT",
1604
+ "engines": {
1605
+ "node": ">=16"
1606
+ }
1607
+ },
1608
+ "node_modules/pend": {
1609
+ "version": "1.2.0",
1610
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1611
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
1612
+ "license": "MIT"
1613
+ },
1614
+ "node_modules/picocolors": {
1615
+ "version": "1.1.1",
1616
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1617
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1618
+ "license": "ISC"
1619
+ },
1620
+ "node_modules/picomatch": {
1621
+ "version": "2.3.1",
1622
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1623
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1624
+ "license": "MIT",
1625
+ "engines": {
1626
+ "node": ">=8.6"
1627
+ },
1628
+ "funding": {
1629
+ "url": "https://github.com/sponsors/jonschlinkert"
1630
+ }
1631
+ },
1632
+ "node_modules/progress": {
1633
+ "version": "2.0.3",
1634
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1635
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1636
+ "license": "MIT",
1637
+ "engines": {
1638
+ "node": ">=0.4.0"
1639
+ }
1640
+ },
1641
+ "node_modules/proxy-addr": {
1642
+ "version": "2.0.7",
1643
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1644
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1645
+ "license": "MIT",
1646
+ "dependencies": {
1647
+ "forwarded": "0.2.0",
1648
+ "ipaddr.js": "1.9.1"
1649
+ },
1650
+ "engines": {
1651
+ "node": ">= 0.10"
1652
+ }
1653
+ },
1654
+ "node_modules/proxy-agent": {
1655
+ "version": "6.5.0",
1656
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
1657
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
1658
+ "license": "MIT",
1659
+ "dependencies": {
1660
+ "agent-base": "^7.1.2",
1661
+ "debug": "^4.3.4",
1662
+ "http-proxy-agent": "^7.0.1",
1663
+ "https-proxy-agent": "^7.0.6",
1664
+ "lru-cache": "^7.14.1",
1665
+ "pac-proxy-agent": "^7.1.0",
1666
+ "proxy-from-env": "^1.1.0",
1667
+ "socks-proxy-agent": "^8.0.5"
1668
+ },
1669
+ "engines": {
1670
+ "node": ">= 14"
1671
+ }
1672
+ },
1673
+ "node_modules/proxy-from-env": {
1674
+ "version": "1.1.0",
1675
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1676
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1677
+ "license": "MIT"
1678
+ },
1679
+ "node_modules/pstree.remy": {
1680
+ "version": "1.1.8",
1681
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1682
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1683
+ "license": "MIT"
1684
+ },
1685
+ "node_modules/pump": {
1686
+ "version": "3.0.3",
1687
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
1688
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
1689
+ "license": "MIT",
1690
+ "dependencies": {
1691
+ "end-of-stream": "^1.1.0",
1692
+ "once": "^1.3.1"
1693
+ }
1694
+ },
1695
+ "node_modules/puppeteer": {
1696
+ "version": "24.16.2",
1697
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.16.2.tgz",
1698
+ "integrity": "sha512-eNjKzwjITM4Lvho6iHb+VQamadUBgc8TsjAApsKi5N8DXipxAaAZWssBOFsrIOLo4eYWYj0Qk5gmr4wBSqzJWw==",
1699
+ "hasInstallScript": true,
1700
+ "license": "Apache-2.0",
1701
+ "dependencies": {
1702
+ "@puppeteer/browsers": "2.10.6",
1703
+ "chromium-bidi": "7.3.1",
1704
+ "cosmiconfig": "^9.0.0",
1705
+ "devtools-protocol": "0.0.1475386",
1706
+ "puppeteer-core": "24.16.2",
1707
+ "typed-query-selector": "^2.12.0"
1708
+ },
1709
+ "bin": {
1710
+ "puppeteer": "lib/cjs/puppeteer/node/cli.js"
1711
+ },
1712
+ "engines": {
1713
+ "node": ">=18"
1714
+ }
1715
+ },
1716
+ "node_modules/puppeteer-core": {
1717
+ "version": "24.16.2",
1718
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.16.2.tgz",
1719
+ "integrity": "sha512-areKSSQzpoHa5nCk3uD/o504yjrW5ws0N6jZfdFZ3a4H+Q7NBgvuDydjN5P87jN4Rj+eIpLcK3ELOThTtYuuxg==",
1720
+ "license": "Apache-2.0",
1721
+ "dependencies": {
1722
+ "@puppeteer/browsers": "2.10.6",
1723
+ "chromium-bidi": "7.3.1",
1724
+ "debug": "^4.4.1",
1725
+ "devtools-protocol": "0.0.1475386",
1726
+ "typed-query-selector": "^2.12.0",
1727
+ "ws": "^8.18.3"
1728
+ },
1729
+ "engines": {
1730
+ "node": ">=18"
1731
+ }
1732
+ },
1733
+ "node_modules/qs": {
1734
+ "version": "6.14.0",
1735
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
1736
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
1737
+ "license": "BSD-3-Clause",
1738
+ "dependencies": {
1739
+ "side-channel": "^1.1.0"
1740
+ },
1741
+ "engines": {
1742
+ "node": ">=0.6"
1743
+ },
1744
+ "funding": {
1745
+ "url": "https://github.com/sponsors/ljharb"
1746
+ }
1747
+ },
1748
+ "node_modules/range-parser": {
1749
+ "version": "1.2.1",
1750
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1751
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1752
+ "license": "MIT",
1753
+ "engines": {
1754
+ "node": ">= 0.6"
1755
+ }
1756
+ },
1757
+ "node_modules/raw-body": {
1758
+ "version": "3.0.0",
1759
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
1760
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
1761
+ "license": "MIT",
1762
+ "dependencies": {
1763
+ "bytes": "3.1.2",
1764
+ "http-errors": "2.0.0",
1765
+ "iconv-lite": "0.6.3",
1766
+ "unpipe": "1.0.0"
1767
+ },
1768
+ "engines": {
1769
+ "node": ">= 0.8"
1770
+ }
1771
+ },
1772
+ "node_modules/readdirp": {
1773
+ "version": "3.6.0",
1774
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1775
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1776
+ "license": "MIT",
1777
+ "dependencies": {
1778
+ "picomatch": "^2.2.1"
1779
+ },
1780
+ "engines": {
1781
+ "node": ">=8.10.0"
1782
+ }
1783
+ },
1784
+ "node_modules/require-directory": {
1785
+ "version": "2.1.1",
1786
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1787
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1788
+ "license": "MIT",
1789
+ "engines": {
1790
+ "node": ">=0.10.0"
1791
+ }
1792
+ },
1793
+ "node_modules/resolve-from": {
1794
+ "version": "4.0.0",
1795
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1796
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1797
+ "license": "MIT",
1798
+ "engines": {
1799
+ "node": ">=4"
1800
+ }
1801
+ },
1802
+ "node_modules/router": {
1803
+ "version": "2.2.0",
1804
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1805
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1806
+ "license": "MIT",
1807
+ "dependencies": {
1808
+ "debug": "^4.4.0",
1809
+ "depd": "^2.0.0",
1810
+ "is-promise": "^4.0.0",
1811
+ "parseurl": "^1.3.3",
1812
+ "path-to-regexp": "^8.0.0"
1813
+ },
1814
+ "engines": {
1815
+ "node": ">= 18"
1816
+ }
1817
+ },
1818
+ "node_modules/safe-buffer": {
1819
+ "version": "5.2.1",
1820
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1821
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1822
+ "funding": [
1823
+ {
1824
+ "type": "github",
1825
+ "url": "https://github.com/sponsors/feross"
1826
+ },
1827
+ {
1828
+ "type": "patreon",
1829
+ "url": "https://www.patreon.com/feross"
1830
+ },
1831
+ {
1832
+ "type": "consulting",
1833
+ "url": "https://feross.org/support"
1834
+ }
1835
+ ],
1836
+ "license": "MIT"
1837
+ },
1838
+ "node_modules/safer-buffer": {
1839
+ "version": "2.1.2",
1840
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1841
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1842
+ "license": "MIT"
1843
+ },
1844
+ "node_modules/semver": {
1845
+ "version": "7.7.2",
1846
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
1847
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
1848
+ "license": "ISC",
1849
+ "bin": {
1850
+ "semver": "bin/semver.js"
1851
+ },
1852
+ "engines": {
1853
+ "node": ">=10"
1854
+ }
1855
+ },
1856
+ "node_modules/send": {
1857
+ "version": "1.2.0",
1858
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
1859
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
1860
+ "license": "MIT",
1861
+ "dependencies": {
1862
+ "debug": "^4.3.5",
1863
+ "encodeurl": "^2.0.0",
1864
+ "escape-html": "^1.0.3",
1865
+ "etag": "^1.8.1",
1866
+ "fresh": "^2.0.0",
1867
+ "http-errors": "^2.0.0",
1868
+ "mime-types": "^3.0.1",
1869
+ "ms": "^2.1.3",
1870
+ "on-finished": "^2.4.1",
1871
+ "range-parser": "^1.2.1",
1872
+ "statuses": "^2.0.1"
1873
+ },
1874
+ "engines": {
1875
+ "node": ">= 18"
1876
+ }
1877
+ },
1878
+ "node_modules/serve-static": {
1879
+ "version": "2.2.0",
1880
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
1881
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
1882
+ "license": "MIT",
1883
+ "dependencies": {
1884
+ "encodeurl": "^2.0.0",
1885
+ "escape-html": "^1.0.3",
1886
+ "parseurl": "^1.3.3",
1887
+ "send": "^1.2.0"
1888
+ },
1889
+ "engines": {
1890
+ "node": ">= 18"
1891
+ }
1892
+ },
1893
+ "node_modules/setprototypeof": {
1894
+ "version": "1.2.0",
1895
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1896
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1897
+ "license": "ISC"
1898
+ },
1899
+ "node_modules/side-channel": {
1900
+ "version": "1.1.0",
1901
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1902
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1903
+ "license": "MIT",
1904
+ "dependencies": {
1905
+ "es-errors": "^1.3.0",
1906
+ "object-inspect": "^1.13.3",
1907
+ "side-channel-list": "^1.0.0",
1908
+ "side-channel-map": "^1.0.1",
1909
+ "side-channel-weakmap": "^1.0.2"
1910
+ },
1911
+ "engines": {
1912
+ "node": ">= 0.4"
1913
+ },
1914
+ "funding": {
1915
+ "url": "https://github.com/sponsors/ljharb"
1916
+ }
1917
+ },
1918
+ "node_modules/side-channel-list": {
1919
+ "version": "1.0.0",
1920
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1921
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1922
+ "license": "MIT",
1923
+ "dependencies": {
1924
+ "es-errors": "^1.3.0",
1925
+ "object-inspect": "^1.13.3"
1926
+ },
1927
+ "engines": {
1928
+ "node": ">= 0.4"
1929
+ },
1930
+ "funding": {
1931
+ "url": "https://github.com/sponsors/ljharb"
1932
+ }
1933
+ },
1934
+ "node_modules/side-channel-map": {
1935
+ "version": "1.0.1",
1936
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1937
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1938
+ "license": "MIT",
1939
+ "dependencies": {
1940
+ "call-bound": "^1.0.2",
1941
+ "es-errors": "^1.3.0",
1942
+ "get-intrinsic": "^1.2.5",
1943
+ "object-inspect": "^1.13.3"
1944
+ },
1945
+ "engines": {
1946
+ "node": ">= 0.4"
1947
+ },
1948
+ "funding": {
1949
+ "url": "https://github.com/sponsors/ljharb"
1950
+ }
1951
+ },
1952
+ "node_modules/side-channel-weakmap": {
1953
+ "version": "1.0.2",
1954
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1955
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1956
+ "license": "MIT",
1957
+ "dependencies": {
1958
+ "call-bound": "^1.0.2",
1959
+ "es-errors": "^1.3.0",
1960
+ "get-intrinsic": "^1.2.5",
1961
+ "object-inspect": "^1.13.3",
1962
+ "side-channel-map": "^1.0.1"
1963
+ },
1964
+ "engines": {
1965
+ "node": ">= 0.4"
1966
+ },
1967
+ "funding": {
1968
+ "url": "https://github.com/sponsors/ljharb"
1969
+ }
1970
+ },
1971
+ "node_modules/simple-update-notifier": {
1972
+ "version": "2.0.0",
1973
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1974
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1975
+ "license": "MIT",
1976
+ "dependencies": {
1977
+ "semver": "^7.5.3"
1978
+ },
1979
+ "engines": {
1980
+ "node": ">=10"
1981
+ }
1982
+ },
1983
+ "node_modules/smart-buffer": {
1984
+ "version": "4.2.0",
1985
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
1986
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
1987
+ "license": "MIT",
1988
+ "engines": {
1989
+ "node": ">= 6.0.0",
1990
+ "npm": ">= 3.0.0"
1991
+ }
1992
+ },
1993
+ "node_modules/socks": {
1994
+ "version": "2.8.7",
1995
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
1996
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
1997
+ "license": "MIT",
1998
+ "dependencies": {
1999
+ "ip-address": "^10.0.1",
2000
+ "smart-buffer": "^4.2.0"
2001
+ },
2002
+ "engines": {
2003
+ "node": ">= 10.0.0",
2004
+ "npm": ">= 3.0.0"
2005
+ }
2006
+ },
2007
+ "node_modules/socks-proxy-agent": {
2008
+ "version": "8.0.5",
2009
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
2010
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
2011
+ "license": "MIT",
2012
+ "dependencies": {
2013
+ "agent-base": "^7.1.2",
2014
+ "debug": "^4.3.4",
2015
+ "socks": "^2.8.3"
2016
+ },
2017
+ "engines": {
2018
+ "node": ">= 14"
2019
+ }
2020
+ },
2021
+ "node_modules/source-map": {
2022
+ "version": "0.6.1",
2023
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2024
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2025
+ "license": "BSD-3-Clause",
2026
+ "optional": true,
2027
+ "engines": {
2028
+ "node": ">=0.10.0"
2029
+ }
2030
+ },
2031
+ "node_modules/statuses": {
2032
+ "version": "2.0.2",
2033
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
2034
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
2035
+ "license": "MIT",
2036
+ "engines": {
2037
+ "node": ">= 0.8"
2038
+ }
2039
+ },
2040
+ "node_modules/streamx": {
2041
+ "version": "2.22.1",
2042
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
2043
+ "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==",
2044
+ "license": "MIT",
2045
+ "dependencies": {
2046
+ "fast-fifo": "^1.3.2",
2047
+ "text-decoder": "^1.1.0"
2048
+ },
2049
+ "optionalDependencies": {
2050
+ "bare-events": "^2.2.0"
2051
+ }
2052
+ },
2053
+ "node_modules/string-width": {
2054
+ "version": "4.2.3",
2055
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2056
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2057
+ "license": "MIT",
2058
+ "dependencies": {
2059
+ "emoji-regex": "^8.0.0",
2060
+ "is-fullwidth-code-point": "^3.0.0",
2061
+ "strip-ansi": "^6.0.1"
2062
+ },
2063
+ "engines": {
2064
+ "node": ">=8"
2065
+ }
2066
+ },
2067
+ "node_modules/strip-ansi": {
2068
+ "version": "6.0.1",
2069
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2070
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2071
+ "license": "MIT",
2072
+ "dependencies": {
2073
+ "ansi-regex": "^5.0.1"
2074
+ },
2075
+ "engines": {
2076
+ "node": ">=8"
2077
+ }
2078
+ },
2079
+ "node_modules/supports-color": {
2080
+ "version": "5.5.0",
2081
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2082
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2083
+ "license": "MIT",
2084
+ "dependencies": {
2085
+ "has-flag": "^3.0.0"
2086
+ },
2087
+ "engines": {
2088
+ "node": ">=4"
2089
+ }
2090
+ },
2091
+ "node_modules/tar-fs": {
2092
+ "version": "3.1.0",
2093
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz",
2094
+ "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==",
2095
+ "license": "MIT",
2096
+ "dependencies": {
2097
+ "pump": "^3.0.0",
2098
+ "tar-stream": "^3.1.5"
2099
+ },
2100
+ "optionalDependencies": {
2101
+ "bare-fs": "^4.0.1",
2102
+ "bare-path": "^3.0.0"
2103
+ }
2104
+ },
2105
+ "node_modules/tar-stream": {
2106
+ "version": "3.1.7",
2107
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
2108
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
2109
+ "license": "MIT",
2110
+ "dependencies": {
2111
+ "b4a": "^1.6.4",
2112
+ "fast-fifo": "^1.2.0",
2113
+ "streamx": "^2.15.0"
2114
+ }
2115
+ },
2116
+ "node_modules/text-decoder": {
2117
+ "version": "1.2.3",
2118
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
2119
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
2120
+ "license": "Apache-2.0",
2121
+ "dependencies": {
2122
+ "b4a": "^1.6.4"
2123
+ }
2124
+ },
2125
+ "node_modules/to-regex-range": {
2126
+ "version": "5.0.1",
2127
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2128
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2129
+ "license": "MIT",
2130
+ "dependencies": {
2131
+ "is-number": "^7.0.0"
2132
+ },
2133
+ "engines": {
2134
+ "node": ">=8.0"
2135
+ }
2136
+ },
2137
+ "node_modules/toidentifier": {
2138
+ "version": "1.0.1",
2139
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
2140
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
2141
+ "license": "MIT",
2142
+ "engines": {
2143
+ "node": ">=0.6"
2144
+ }
2145
+ },
2146
+ "node_modules/touch": {
2147
+ "version": "3.1.1",
2148
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
2149
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
2150
+ "license": "ISC",
2151
+ "bin": {
2152
+ "nodetouch": "bin/nodetouch.js"
2153
+ }
2154
+ },
2155
+ "node_modules/tslib": {
2156
+ "version": "2.8.1",
2157
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2158
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2159
+ "license": "0BSD"
2160
+ },
2161
+ "node_modules/type-is": {
2162
+ "version": "2.0.1",
2163
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
2164
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
2165
+ "license": "MIT",
2166
+ "dependencies": {
2167
+ "content-type": "^1.0.5",
2168
+ "media-typer": "^1.1.0",
2169
+ "mime-types": "^3.0.0"
2170
+ },
2171
+ "engines": {
2172
+ "node": ">= 0.6"
2173
+ }
2174
+ },
2175
+ "node_modules/typed-query-selector": {
2176
+ "version": "2.12.0",
2177
+ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
2178
+ "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
2179
+ "license": "MIT"
2180
+ },
2181
+ "node_modules/undefsafe": {
2182
+ "version": "2.0.5",
2183
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
2184
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
2185
+ "license": "MIT"
2186
+ },
2187
+ "node_modules/undici-types": {
2188
+ "version": "7.10.0",
2189
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
2190
+ "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
2191
+ "license": "MIT",
2192
+ "optional": true
2193
+ },
2194
+ "node_modules/unpipe": {
2195
+ "version": "1.0.0",
2196
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2197
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
2198
+ "license": "MIT",
2199
+ "engines": {
2200
+ "node": ">= 0.8"
2201
+ }
2202
+ },
2203
+ "node_modules/vary": {
2204
+ "version": "1.1.2",
2205
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2206
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
2207
+ "license": "MIT",
2208
+ "engines": {
2209
+ "node": ">= 0.8"
2210
+ }
2211
+ },
2212
+ "node_modules/wrap-ansi": {
2213
+ "version": "7.0.0",
2214
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2215
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2216
+ "license": "MIT",
2217
+ "dependencies": {
2218
+ "ansi-styles": "^4.0.0",
2219
+ "string-width": "^4.1.0",
2220
+ "strip-ansi": "^6.0.0"
2221
+ },
2222
+ "engines": {
2223
+ "node": ">=10"
2224
+ },
2225
+ "funding": {
2226
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2227
+ }
2228
+ },
2229
+ "node_modules/wrappy": {
2230
+ "version": "1.0.2",
2231
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2232
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2233
+ "license": "ISC"
2234
+ },
2235
+ "node_modules/ws": {
2236
+ "version": "8.18.3",
2237
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
2238
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
2239
+ "license": "MIT",
2240
+ "engines": {
2241
+ "node": ">=10.0.0"
2242
+ },
2243
+ "peerDependencies": {
2244
+ "bufferutil": "^4.0.1",
2245
+ "utf-8-validate": ">=5.0.2"
2246
+ },
2247
+ "peerDependenciesMeta": {
2248
+ "bufferutil": {
2249
+ "optional": true
2250
+ },
2251
+ "utf-8-validate": {
2252
+ "optional": true
2253
+ }
2254
+ }
2255
+ },
2256
+ "node_modules/y18n": {
2257
+ "version": "5.0.8",
2258
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
2259
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
2260
+ "license": "ISC",
2261
+ "engines": {
2262
+ "node": ">=10"
2263
+ }
2264
+ },
2265
+ "node_modules/yargs": {
2266
+ "version": "17.7.2",
2267
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
2268
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
2269
+ "license": "MIT",
2270
+ "dependencies": {
2271
+ "cliui": "^8.0.1",
2272
+ "escalade": "^3.1.1",
2273
+ "get-caller-file": "^2.0.5",
2274
+ "require-directory": "^2.1.1",
2275
+ "string-width": "^4.2.3",
2276
+ "y18n": "^5.0.5",
2277
+ "yargs-parser": "^21.1.1"
2278
+ },
2279
+ "engines": {
2280
+ "node": ">=12"
2281
+ }
2282
+ },
2283
+ "node_modules/yargs-parser": {
2284
+ "version": "21.1.1",
2285
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
2286
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
2287
+ "license": "ISC",
2288
+ "engines": {
2289
+ "node": ">=12"
2290
+ }
2291
+ },
2292
+ "node_modules/yauzl": {
2293
+ "version": "2.10.0",
2294
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
2295
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
2296
+ "license": "MIT",
2297
+ "dependencies": {
2298
+ "buffer-crc32": "~0.2.3",
2299
+ "fd-slicer": "~1.1.0"
2300
+ }
2301
+ },
2302
+ "node_modules/zod": {
2303
+ "version": "3.25.76",
2304
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
2305
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
2306
+ "license": "MIT",
2307
+ "funding": {
2308
+ "url": "https://github.com/sponsors/colinhacks"
2309
+ }
2310
+ }
2311
+ }
2312
+ }
package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "puppeteer-api",
3
+ "version": "1.0.0",
4
+ "main": "server.js",
5
+ "type": "module",
6
+ "dependencies": {
7
+ "axios": "^1.11.0",
8
+ "cors": "^2.8.5",
9
+ "express": "^5.1.0",
10
+ "puppeteer": "^24.16.2"
11
+ },
12
+ "devDependencies": {
13
+ "nodemon": "^3.1.10",
14
+ "typescript": "^5.4.0",
15
+ "tsc-watch": "^6.2.0"
16
+ },
17
+ "scripts": {
18
+ "dev": "nodemon server.js",
19
+ "start": "node server.js",
20
+ "build": "tsc"
21
+ }
22
+ }
server.js ADDED
@@ -0,0 +1,679 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const express = require('express');
2
+ const puppeteer = require('puppeteer');
3
+ const cors = require('cors');
4
+ const app = express();
5
+ const port = 7860;
6
+
7
+ app.use(cors());
8
+ app.use(express.json());
9
+
10
+ /**
11
+ * Advanced cookie banner and content bypass for StuDocu
12
+ */
13
+ const bypassCookiesAndRestrictions = async (page) => {
14
+ console.log("πŸͺ Starting comprehensive cookie and restriction bypass...");
15
+
16
+ // Step 1: Set cookies before page load
17
+ const preCookies = [
18
+ { name: 'cookieConsent', value: 'accepted', domain: '.studocu.com' },
19
+ { name: 'cookie_consent', value: 'true', domain: '.studocu.com' },
20
+ { name: 'gdpr_consent', value: 'accepted', domain: '.studocu.com' },
21
+ { name: 'privacy_policy_accepted', value: 'true', domain: '.studocu.com' },
22
+ { name: 'user_consent', value: '1', domain: '.studocu.com' },
23
+ { name: 'analytics_consent', value: 'false', domain: '.studocu.com' },
24
+ { name: 'marketing_consent', value: 'false', domain: '.studocu.com' },
25
+ { name: 'functional_consent', value: 'true', domain: '.studocu.com' },
26
+ ];
27
+
28
+ for (const cookie of preCookies) {
29
+ try {
30
+ await page.setCookie(cookie);
31
+ } catch (e) {
32
+ console.log(`Failed to set cookie ${cookie.name}:`, e.message);
33
+ }
34
+ }
35
+
36
+ // Step 2: Inject CSS to hide cookie banners immediately
37
+ await page.addStyleTag({
38
+ content: `
39
+ /* Hide all possible cookie banners */
40
+ [id*="cookie" i]:not(img):not(input),
41
+ [class*="cookie" i]:not(img):not(input),
42
+ [data-testid*="cookie" i],
43
+ [aria-label*="cookie" i],
44
+ .gdpr-banner, .gdpr-popup, .gdpr-modal,
45
+ .consent-banner, .consent-popup, .consent-modal,
46
+ .privacy-banner, .privacy-popup, .privacy-modal,
47
+ .cookie-law, .cookie-policy, .cookie-compliance,
48
+ .onetrust-banner-sdk, #onetrust-consent-sdk,
49
+ .cmp-banner, .cmp-popup, .cmp-modal,
50
+ [class*="CookieBanner"], [class*="CookieNotice"],
51
+ [class*="ConsentBanner"], [class*="ConsentManager"],
52
+ .cc-banner, .cc-window, .cc-compliance,
53
+ div[style*="position: fixed"]:has-text("cookie"),
54
+ div[style*="position: fixed"]:has-text("consent"),
55
+ .fixed:has-text("cookie"), .fixed:has-text("consent") {
56
+ display: none !important;
57
+ visibility: hidden !important;
58
+ opacity: 0 !important;
59
+ z-index: -9999 !important;
60
+ pointer-events: none !important;
61
+ }
62
+
63
+ /* Remove blur and premium overlays */
64
+ [class*="blur" i], [class*="premium" i],
65
+ [class*="paywall" i], [class*="sample-preview-blur" i] {
66
+ filter: none !important;
67
+ backdrop-filter: none !important;
68
+ opacity: 1 !important;
69
+ visibility: visible !important;
70
+ }
71
+
72
+ /* Ensure document content is visible */
73
+ .document-content, .page-content, [data-page] {
74
+ filter: none !important;
75
+ opacity: 1 !important;
76
+ visibility: visible !important;
77
+ pointer-events: auto !important;
78
+ }
79
+
80
+ /* Remove fixed overlays */
81
+ .fixed-overlay, .sticky-overlay, .content-overlay {
82
+ display: none !important;
83
+ }
84
+
85
+ /* Restore scrolling */
86
+ html, body {
87
+ overflow: auto !important;
88
+ position: static !important;
89
+ }
90
+ `
91
+ });
92
+
93
+ // Step 3: Inject JavaScript to handle dynamic cookie banners
94
+ await page.evaluateOnNewDocument(() => {
95
+ // Override common cookie consent functions
96
+ window.cookieConsent = { accepted: true };
97
+ window.gtag = () => { };
98
+ window.ga = () => { };
99
+ window.dataLayer = [];
100
+
101
+ // Mutation observer to catch dynamically added cookie banners
102
+ const observer = new MutationObserver((mutations) => {
103
+ mutations.forEach((mutation) => {
104
+ mutation.addedNodes.forEach((node) => {
105
+ if (node.nodeType === 1) { // Element node
106
+ const element = node;
107
+ const text = element.textContent || '';
108
+ const className = element.className || '';
109
+ const id = element.id || '';
110
+
111
+ // Check if this looks like a cookie banner
112
+ if (
113
+ text.toLowerCase().includes('cookie') ||
114
+ text.toLowerCase().includes('consent') ||
115
+ text.toLowerCase().includes('privacy policy') ||
116
+ className.toLowerCase().includes('cookie') ||
117
+ className.toLowerCase().includes('consent') ||
118
+ className.toLowerCase().includes('gdpr') ||
119
+ id.toLowerCase().includes('cookie') ||
120
+ id.toLowerCase().includes('consent')
121
+ ) {
122
+ console.log('Removing detected cookie banner:', element);
123
+ element.remove();
124
+ }
125
+ }
126
+ });
127
+ });
128
+ });
129
+
130
+ observer.observe(document.body, { childList: true, subtree: true });
131
+
132
+ // Set up periodic cleanup
133
+ setInterval(() => {
134
+ const cookieElements = document.querySelectorAll(`
135
+ [id*="cookie" i]:not(img):not(input),
136
+ [class*="cookie" i]:not(img):not(input),
137
+ [data-testid*="cookie" i],
138
+ .gdpr-banner, .consent-banner, .privacy-banner,
139
+ .onetrust-banner-sdk, #onetrust-consent-sdk,
140
+ .cmp-banner, .cc-banner
141
+ `);
142
+ cookieElements.forEach(el => el.remove());
143
+
144
+ // Restore body scroll
145
+ document.body.style.overflow = 'auto';
146
+ document.documentElement.style.overflow = 'auto';
147
+ }, 1000);
148
+ });
149
+
150
+ return true;
151
+ };
152
+
153
+ /**
154
+ * Enhanced content unblurring and premium bypass (integrated from extension script)
155
+ */
156
+ const unblurContent = async (page) => {
157
+ console.log("πŸ”“ Unblurring content and bypassing premium restrictions...");
158
+
159
+ await page.evaluate(() => {
160
+ // Function to remove all visual restrictions
161
+ const removeRestrictions = () => {
162
+ const removeBySelector = (selector) => {
163
+ document.querySelectorAll(selector).forEach(el => el.remove());
164
+ };
165
+
166
+ // Remove ads by known class or ID
167
+ removeBySelector("#adbox");
168
+ removeBySelector(".adsbox");
169
+ removeBySelector(".ad-box");
170
+ removeBySelector(".banner-ads");
171
+ removeBySelector(".advert");
172
+
173
+ // Remove premium banner container
174
+ removeBySelector(".PremiumBannerBlobWrapper_overflow-wrapper__xsaS8");
175
+
176
+ // Enhanced blur removal
177
+ const removeBlur = (element = document) => {
178
+ element.querySelectorAll("*").forEach(el => {
179
+ const style = window.getComputedStyle(el);
180
+
181
+ // Check for blur via filter, backdrop-filter, or class names
182
+ if (
183
+ style.filter?.includes("blur") ||
184
+ style.backdropFilter?.includes("blur") ||
185
+ parseFloat(style.opacity) < 1 ||
186
+ (el.className && el.className.toString().toLowerCase().includes("blur")) ||
187
+ (el.className && el.className.toString().toLowerCase().includes("premium"))
188
+ ) {
189
+ el.style.filter = "none !important";
190
+ el.style.backdropFilter = "none !important";
191
+ el.style.opacity = "1 !important";
192
+ if (el.classList) {
193
+ el.classList.remove("blur", "blurred", "premium-blur");
194
+ }
195
+ }
196
+
197
+ // Check parent elements for blur-inducing styles
198
+ const parent = el.parentElement;
199
+ if (parent) {
200
+ const parentStyle = window.getComputedStyle(parent);
201
+ if (
202
+ parentStyle.filter?.includes("blur") ||
203
+ parentStyle.backdropFilter?.includes("blur") ||
204
+ parseFloat(parentStyle.opacity) < 1
205
+ ) {
206
+ parent.style.filter = "none !important";
207
+ parent.style.backdropFilter = "none !important";
208
+ parent.style.opacity = "1 !important";
209
+ }
210
+ }
211
+ });
212
+ };
213
+
214
+ // Remove dark overlays and paywall-like elements
215
+ document.querySelectorAll("div, section, aside").forEach(el => {
216
+ const style = window.getComputedStyle(el);
217
+ if (
218
+ style.backgroundColor.includes("rgba") &&
219
+ (style.backgroundColor.includes("0.5") || parseFloat(style.zIndex) > 1000) ||
220
+ (el.className && el.className.toString().toLowerCase().includes("overlay")) ||
221
+ (el.className && el.className.toString().toLowerCase().includes("paywall"))
222
+ ) {
223
+ el.remove();
224
+ }
225
+ });
226
+
227
+ removeBlur();
228
+
229
+ // Remove other restrictions
230
+ removeBySelector('[class*="blur" i], [class*="premium" i], [class*="paywall" i], [class*="sample-preview-blur" i]');
231
+
232
+ // Ensure document content is visible
233
+ const contentSelectors = [
234
+ '.document-content', '.page-content', '.content',
235
+ '[data-page]', '[data-testid*="document"]', '[data-testid*="page"]',
236
+ '.page', '.document-page', 'main', 'article'
237
+ ];
238
+ contentSelectors.forEach(selector => {
239
+ document.querySelectorAll(selector).forEach(el => {
240
+ el.style.setProperty('filter', 'none', 'important');
241
+ el.style.setProperty('opacity', '1', 'important');
242
+ el.style.setProperty('visibility', 'visible', 'important');
243
+ el.style.setProperty('display', 'block', 'important');
244
+ el.style.setProperty('pointer-events', 'auto', 'important');
245
+ });
246
+ });
247
+
248
+ // Remove overlay divs that might be blocking content
249
+ const overlays = document.querySelectorAll(`
250
+ [class*="overlay" i], [class*="modal" i], [class*="popup" i],
251
+ [class*="banner" i], [style*="position: fixed"],
252
+ [style*="position: absolute"][style*="z-index"]
253
+ `);
254
+ overlays.forEach(overlay => {
255
+ const text = overlay.textContent || '';
256
+ if (text.includes('premium') || text.includes('unlock') || text.includes('subscribe') ||
257
+ text.includes('cookie') || text.includes('consent') || text.includes('login')) {
258
+ overlay.remove();
259
+ }
260
+ });
261
+ };
262
+
263
+ // Run immediately
264
+ removeRestrictions();
265
+
266
+ // Run periodically
267
+ const intervalId = setInterval(removeRestrictions, 2000);
268
+
269
+ // Clean up after 60 seconds
270
+ setTimeout(() => {
271
+ clearInterval(intervalId);
272
+ }, 60000);
273
+ });
274
+ };
275
+
276
+ /**
277
+ * Apply print styles for clean PDF output (integrated from extension script with improvements)
278
+ */
279
+ const applyPrintStyles = async (page) => {
280
+ console.log("πŸ–¨οΈ Applying print styles for clean PDF...");
281
+
282
+ await page.evaluate(() => {
283
+ const style = document.createElement("style");
284
+ style.id = "print-style-extension";
285
+ style.innerHTML = `
286
+ @page {
287
+ size: A4 portrait;
288
+ margin: 5mm;
289
+ }
290
+ @media print {
291
+ html, body {
292
+ margin: 0 !important;
293
+ padding: 0 !important;
294
+ overflow: visible !important;
295
+ }
296
+ header, footer, nav, aside, .no-print, .ads, .sidebar,
297
+ .premium-banner, .ViewerToolbar, .Layout_info-bar-wrapper__He0Ho,
298
+ .Sidebar_sidebar-scrollable__kqeBZ, .HeaderWrapper_header-wrapper__mCmf3,
299
+ .Layout_visible-content-bottom-wrapper-sticky__yaaAB,
300
+ .Layout_bottom-section-wrapper__yBWWk, .Layout_footer-wrapper__bheJQ,
301
+ .InlineBanner_inline-banner-wrapper__DAi5X, .banner-wrapper,
302
+ #top-bar-wrapper, .Layout_sidebar-wrapper__unavM,
303
+ .Layout_is-open__9DQr4 {
304
+ display: none !important;
305
+ }
306
+ body {
307
+ background: white !important;
308
+ color: black !important;
309
+ }
310
+ * {
311
+ box-shadow: none !important;
312
+ background: transparent !important;
313
+ }
314
+ .Viewer_document-wrapper__JPBWQ, .Viewer_document-wrapper__LXzoQ,
315
+ .Viewer_document-wrapper__XsO4j, .page-content {
316
+ display: flex !important;
317
+ flex-direction: column !important;
318
+ width: 100% !important;
319
+ max-width: 210mm !important;
320
+ margin: 0 auto !important;
321
+ }
322
+ [data-page], .page, .document-page, img {
323
+ page-break-after: always !important;
324
+ page-break-inside: avoid !important;
325
+ page-break-before: avoid !important;
326
+ width: 100% !important;
327
+ max-width: 100% !important;
328
+ height: auto !important;
329
+ }
330
+ }
331
+ `;
332
+ document.head.appendChild(style);
333
+ });
334
+ };
335
+
336
+ /**
337
+ * Enhanced StuDocu downloader with comprehensive bypasses and login support
338
+ */
339
+ const studocuDownloader = async (url, options = {}) => {
340
+ let browser;
341
+ try {
342
+ console.log("πŸš€ Launching browser with stealth configuration...");
343
+ browser = await puppeteer.launch({
344
+ headless: true,
345
+ args: [
346
+ '--no-sandbox',
347
+ '--disable-setuid-sandbox',
348
+ '--disable-dev-shm-usage',
349
+ '--disable-accelerated-2d-canvas',
350
+ '--no-first-run',
351
+ '--no-zygote',
352
+ '--disable-gpu',
353
+ '--disable-features=VizDisplayCompositor',
354
+ '--disable-background-networking',
355
+ '--disable-background-timer-throttling',
356
+ '--disable-renderer-backgrounding',
357
+ '--disable-backgrounding-occluded-windows',
358
+ '--disable-ipc-flooding-protection',
359
+ '--disable-web-security',
360
+ '--disable-features=site-per-process',
361
+ '--disable-blink-features=AutomationControlled',
362
+ '--disable-extensions'
363
+ ],
364
+ timeout: 300000,
365
+ });
366
+
367
+ const page = await browser.newPage();
368
+
369
+ // Set realistic browser characteristics
370
+ await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
371
+ await page.setViewport({ width: 794, height: 1122 });
372
+
373
+ // Hide webdriver property
374
+ await page.evaluateOnNewDocument(() => {
375
+ Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
376
+ Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
377
+ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5] });
378
+ });
379
+
380
+ // Set up cookie and content bypass
381
+ await bypassCookiesAndRestrictions(page);
382
+
383
+ // Block unnecessary resources
384
+ await page.setRequestInterception(true);
385
+ page.on('request', (req) => {
386
+ const resourceType = req.resourceType();
387
+ const reqUrl = req.url();
388
+
389
+ // Block trackers, ads, and analytics
390
+ if (
391
+ reqUrl.includes('doubleclick') ||
392
+ reqUrl.includes('googletagmanager') ||
393
+ reqUrl.includes('facebook.com') ||
394
+ reqUrl.includes('twitter.com') ||
395
+ reqUrl.includes('analytics') ||
396
+ reqUrl.includes('gtm') ||
397
+ reqUrl.includes('hotjar') ||
398
+ reqUrl.includes('mixpanel') ||
399
+ reqUrl.includes('onetrust') ||
400
+ reqUrl.includes('cookielaw') ||
401
+ resourceType === 'other' && reqUrl.includes('track')
402
+ ) {
403
+ req.abort();
404
+ } else {
405
+ req.continue();
406
+ }
407
+ });
408
+
409
+ // Login if credentials provided (for premium content)
410
+ if (options.email && options.password) {
411
+ console.log("πŸ”‘ Logging in to StuDocu...");
412
+ await page.goto('https://www.studocu.com/en-us/login', { waitUntil: 'domcontentloaded', timeout: 60000 });
413
+ await page.waitForSelector('#email', { timeout: 15000 });
414
+ await page.type('#email', options.email);
415
+ await page.type('#password', options.password);
416
+ await page.click('button[type="submit"]');
417
+ try {
418
+ await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 30000 });
419
+ // Additional check for successful login
420
+ await page.waitForSelector('.user-profile, [data-testid="user-menu"]', { timeout: 10000 });
421
+ console.log("βœ… Login successful.");
422
+ } catch (e) {
423
+ console.error("❌ Login failed:", e.message);
424
+ throw new Error("Login failed. Check credentials, if CAPTCHA is present, or try again.");
425
+ }
426
+ } else {
427
+ console.log("⚠️ No login credentials provided. Full unblurred content requires premium account.");
428
+ }
429
+
430
+ console.log(`πŸ“„ Navigating to ${url}...`);
431
+
432
+ // Navigate with retry logic
433
+ let navigationSuccess = false;
434
+ let attempts = 0;
435
+ const maxAttempts = 3;
436
+ while (!navigationSuccess && attempts < maxAttempts) {
437
+ try {
438
+ attempts++;
439
+ console.log(`Navigation attempt ${attempts}/${maxAttempts}`);
440
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
441
+ navigationSuccess = true;
442
+ } catch (e) {
443
+ console.log(`Navigation attempt ${attempts} failed:`, e.message);
444
+ if (attempts >= maxAttempts) throw e;
445
+ await new Promise(resolve => setTimeout(resolve, 5000));
446
+ }
447
+ }
448
+
449
+ // Wait for initial load
450
+ await new Promise(resolve => setTimeout(resolve, 5000));
451
+
452
+ // Apply content unblurring
453
+ await unblurContent(page);
454
+
455
+ // Wait for document content with multiple selectors
456
+ console.log("⏳ Waiting for document content to load...");
457
+ const contentSelectors = [
458
+ '.document-content', '.page-content', '[data-page]',
459
+ '[data-testid*="document"]', 'img[src*="document"]',
460
+ 'img[src*="page"]', '.page', 'main img', 'article img'
461
+ ];
462
+ let contentFound = false;
463
+ for (const selector of contentSelectors) {
464
+ try {
465
+ await page.waitForSelector(selector, { timeout: 20000 });
466
+ console.log(`βœ… Found content with selector: ${selector}`);
467
+ contentFound = true;
468
+ break;
469
+ } catch (e) {
470
+ console.log(`❌ Selector ${selector} not found, trying next...`);
471
+ }
472
+ }
473
+ if (!contentFound) {
474
+ console.log("⚠️ No specific content selector found, proceeding with page content...");
475
+ }
476
+
477
+ // Enhanced scrolling to load all content with loop for stability
478
+ console.log("πŸ“œ Loading all document pages with enhanced slow scroll...");
479
+ await page.evaluate(async () => {
480
+ const delay = (ms) => new Promise((res) => setTimeout(res, ms));
481
+
482
+ let scrollHeight = document.body.scrollHeight;
483
+ while (true) {
484
+ let totalHeight = 0;
485
+ const distance = 300;
486
+ while (totalHeight < scrollHeight) {
487
+ window.scrollBy(0, distance);
488
+ totalHeight += distance;
489
+ await delay(500); // Increased delay for better loading
490
+ }
491
+
492
+ await delay(2000); // Extra wait after reaching bottom
493
+
494
+ const newHeight = document.body.scrollHeight;
495
+ if (newHeight === scrollHeight) break;
496
+ scrollHeight = newHeight;
497
+ }
498
+
499
+ // Scroll to top
500
+ window.scrollTo({ top: 0, behavior: "smooth" });
501
+ await delay(1000);
502
+ });
503
+
504
+ // Re-apply unblur after loading new content
505
+ await unblurContent(page);
506
+
507
+ // Wait for all images to load
508
+ console.log("πŸ–ΌοΈ Waiting for all images to load...");
509
+ await page.evaluate(async () => {
510
+ const images = Array.from(document.querySelectorAll('img'));
511
+ await Promise.all(images.map(img => {
512
+ if (img.complete) return Promise.resolve();
513
+ return new Promise((resolve) => {
514
+ img.addEventListener('load', resolve);
515
+ img.addEventListener('error', resolve);
516
+ setTimeout(resolve, 15000);
517
+ });
518
+ }));
519
+ });
520
+
521
+ // Additional wait for any lazy loading
522
+ await new Promise(resolve => setTimeout(resolve, 10000));
523
+
524
+ // Set exact height to avoid extra blank pages
525
+ console.log("πŸ“ Setting exact document height...");
526
+ await page.evaluate(() => {
527
+ const getDocumentHeight = () => Math.max(
528
+ document.body.scrollHeight, document.body.offsetHeight,
529
+ document.documentElement.clientHeight, document.documentElement.scrollHeight,
530
+ document.documentElement.offsetHeight
531
+ );
532
+ const height = getDocumentHeight();
533
+ document.body.style.height = `${height}px !important`;
534
+ document.documentElement.style.height = `${height}px !important`;
535
+ document.body.style.overflow = 'hidden !important';
536
+ });
537
+
538
+ // Final content verification
539
+ const contentCheck = await page.evaluate(() => {
540
+ const textContent = document.body.textContent || '';
541
+ const images = document.querySelectorAll('img');
542
+ const documentImages = Array.from(images).filter(img =>
543
+ img.src.includes('document') || img.src.includes('page') ||
544
+ img.alt.includes('document') || img.alt.includes('page')
545
+ );
546
+ return {
547
+ totalText: textContent.length,
548
+ totalImages: images.length,
549
+ documentImages: documentImages.length,
550
+ hasDocumentContent: documentImages.length > 0 || textContent.length > 1000,
551
+ sampleText: textContent.substring(0, 300)
552
+ };
553
+ });
554
+ console.log("πŸ“Š Content verification:", {
555
+ textLength: contentCheck.totalText,
556
+ images: contentCheck.totalImages,
557
+ documentImages: contentCheck.documentImages,
558
+ hasContent: contentCheck.hasDocumentContent
559
+ });
560
+
561
+ if (!contentCheck.hasDocumentContent) {
562
+ console.warn("⚠️ Warning: Limited document content detected. Use premium credentials for full access.");
563
+ }
564
+
565
+ // Apply print styles
566
+ await applyPrintStyles(page);
567
+
568
+ // Emulate print media
569
+ await page.emulateMediaType('print');
570
+
571
+ // Generate PDF
572
+ console.log("πŸ”„ Generating PDF...");
573
+ const pdfBuffer = await page.pdf({
574
+ printBackground: true,
575
+ preferCSSPageSize: true,
576
+ displayHeaderFooter: false,
577
+ timeout: 180000,
578
+ scale: 1,
579
+ omitBackground: false
580
+ });
581
+ console.log(`βœ… PDF generated successfully! Size: ${(pdfBuffer.length / 1024 / 1024).toFixed(2)} MB`);
582
+
583
+ return pdfBuffer;
584
+ } catch (error) {
585
+ console.error("❌ Error during PDF generation:", error);
586
+ if (error.message.includes('timeout')) {
587
+ throw new Error("Request timed out. The document may be taking too long to load. Please try again.");
588
+ } else if (error.message.includes('net::')) {
589
+ throw new Error("Network error. Please check the URL and your internet connection.");
590
+ } else if (error.message.includes('ERR_BLOCKED')) {
591
+ throw new Error("Access blocked. Try again or check if the document is publicly accessible.");
592
+ } else {
593
+ throw new Error(`Failed to generate PDF: ${error.message}`);
594
+ }
595
+ } finally {
596
+ if (browser) {
597
+ console.log("πŸ”’ Closing browser...");
598
+ try {
599
+ await browser.close();
600
+ } catch (e) {
601
+ console.log("Error closing browser:", e.message);
602
+ }
603
+ }
604
+ }
605
+ };
606
+
607
+ // API Routes
608
+ app.post('/api/download', async (req, res) => {
609
+ const { url, filename, email, password } = req.body;
610
+
611
+ if (!url) {
612
+ return res.status(400).json({ error: 'URL is required.' });
613
+ }
614
+
615
+ if (!url.includes('studocu.com')) {
616
+ return res.status(400).json({ error: 'Please provide a valid StuDocu URL.' });
617
+ }
618
+
619
+ let normalizedUrl = url.trim();
620
+ if (!normalizedUrl.startsWith('http')) {
621
+ normalizedUrl = 'https://' + normalizedUrl;
622
+ }
623
+
624
+ console.log(`🎯 Processing request for: ${normalizedUrl}`);
625
+
626
+ try {
627
+ const startTime = Date.now();
628
+ const pdfBuffer = await studocuDownloader(normalizedUrl, { filename, email, password });
629
+ const processingTime = ((Date.now() - startTime) / 1000).toFixed(2);
630
+
631
+ res.setHeader('Content-Type', 'application/pdf');
632
+ res.setHeader('Content-Disposition', 'attachment; filename=studocu-document.pdf');
633
+ res.setHeader('Content-Length', pdfBuffer.length);
634
+ res.send(pdfBuffer);
635
+
636
+ console.log(`πŸŽ‰ Request completed successfully in ${processingTime}s`);
637
+ } catch (error) {
638
+ console.error(`❌ Failed to process ${normalizedUrl}:`, error.message);
639
+ res.status(500).json({ error: error.message });
640
+ }
641
+ });
642
+
643
+ app.get('/health', (req, res) => {
644
+ res.json({ status: 'healthy', timestamp: new Date().toISOString(), uptime: process.uptime() });
645
+ });
646
+
647
+ app.get('/', (req, res) => {
648
+ res.json({
649
+ message: 'πŸš€ Enhanced StuDocu Downloader API v5.3 - Advanced Bypass with Print Styles',
650
+ version: '5.3',
651
+ features: [
652
+ 'πŸͺ Advanced cookie banner bypass',
653
+ 'πŸ”“ Premium content unblurring (client-side only; server-side blur requires premium login)',
654
+ 'πŸ”‘ Login support for full unblurred content access',
655
+ 'πŸ€– Anti-bot detection evasion',
656
+ 'πŸ“„ Full document content extraction with print styles for clean PDF'
657
+ ],
658
+ endpoints: {
659
+ download: 'POST /api/download (body: {url, filename?, email?, password?})',
660
+ health: 'GET /health'
661
+ },
662
+ note: 'For full unblurred content, provide premium email and password. Blurring is often server-side, so CSS bypass may not suffice without login.'
663
+ });
664
+ });
665
+
666
+ process.on('SIGTERM', () => {
667
+ console.log('SIGTERM received, shutting down gracefully...');
668
+ process.exit(0);
669
+ });
670
+
671
+ process.on('SIGINT', () => {
672
+ console.log('SIGINT received, shutting down gracefully...');
673
+ process.exit(0);
674
+ });
675
+
676
+ app.listen(port, () => {
677
+ console.log(`πŸš€ Enhanced StuDocu Downloader v5.3 running on http://localhost:${port}`);
678
+ console.log(`✨ Features: Advanced cookie bypass, content unblurring, login support, print styles, anti-detection`);
679
+ });