esa-pcg-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/_inline-overrides.js +1 -1
- package/dist/adapters/wrappers/node-server.d.ts +1 -1
- package/dist/adapters/wrappers/node-server.js +8 -6
- package/dist/commands/build.js +1 -65
- package/dist/commands/serve.js +2 -2
- package/dist/runtime/image-proxy.d.ts +3 -2
- package/dist/runtime/image-proxy.js +4 -3
- package/package.json +4 -7
- package/runtime/pcg-image-loader.js +0 -13
package/README.md
CHANGED
|
@@ -55,10 +55,9 @@ Run `pcg <cmd> --help` for full option lists.
|
|
|
55
55
|
|
|
56
56
|
| Concern | Handled by |
|
|
57
57
|
|---|---|
|
|
58
|
-
| Custom image loader | `pcg build` copies `pcg-image-loader.js` into `<projectDir>/node_modules/.pcg/`; your `next.config` references it via a normal relative path. |
|
|
59
58
|
| ISR / on-demand revalidation | PCG `incrementalCache` override talks to the gateway, which proxies OSS. |
|
|
60
59
|
| `revalidateTag` | PCG `tagCache` override (Next.js `nextMode`) talks to the gateway's TableStore-backed tag store. |
|
|
61
|
-
| `<Image>` optimization |
|
|
60
|
+
| `<Image>` optimization | The wrapper intercepts Next's built-in `/_next/image?...` route and forwards it to the gateway's signed `/image/*` endpoint. No `next.config` changes required. |
|
|
62
61
|
|
|
63
62
|
## License
|
|
64
63
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
exports.INLINE_OVERRIDES = {
|
|
3
|
-
"adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path2 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path2}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path.join(assetsDir, urlPath);\n const normalizedPath = path.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await handler(event, { streamCreator });\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b, _c;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if ((_c = req.url) === null || _c === void 0 ? void 0 : _c.startsWith(\"/_pcg/image/\")) {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_pcg/image/*, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
|
|
3
|
+
"adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path2 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path2}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path.join(assetsDir, urlPath);\n const normalizedPath = path.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await handler(event, { streamCreator });\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if (urlPath === \"/_next/image\") {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
|
|
4
4
|
"adapters/converters/passthrough.js": "\"use strict\";\n\n// dist/adapters/converters/passthrough.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar converter = {\n convertFrom: async (event) => event,\n convertTo: async (result) => result,\n name: \"passthrough\"\n};\nexports.default = converter;\n",
|
|
5
5
|
"overrides/incrementalCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/_protocol/types.js\nvar require_types = __commonJS({\n \"dist/_protocol/types.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n }\n});\n\n// dist/_protocol/keys.js\nvar require_keys = __commonJS({\n \"dist/_protocol/keys.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildPageMetadataKey = exports2.buildTagKey = exports2.buildStaticAssetKey = exports2.buildOssKey = void 0;\n function stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function buildOssKey(params) {\n const { appId, buildId, cacheType = \"cache\" } = params;\n const key = stripLeadingSlash(params.key);\n if (cacheType === \"fetch\") {\n return `${appId}/__fetch/${buildId}/${key}`;\n }\n return `${appId}/${buildId}/${key}.cache`;\n }\n exports2.buildOssKey = buildOssKey;\n function buildStaticAssetKey(params) {\n const p = stripLeadingSlash(params.path);\n return `${params.appId}/_next/static/${p}`;\n }\n exports2.buildStaticAssetKey = buildStaticAssetKey;\n function buildTagKey(params) {\n return {\n app_id: params.appId,\n tag: `${params.buildId}/${params.tag}`,\n path: `${params.buildId}/${params.path}`\n };\n }\n exports2.buildTagKey = buildTagKey;\n function buildPageMetadataKey(params) {\n return {\n app_id: params.appId,\n url: params.url\n };\n }\n exports2.buildPageMetadataKey = buildPageMetadataKey;\n }\n});\n\n// dist/_protocol/endpoints.js\nvar require_endpoints = __commonJS({\n \"dist/_protocol/endpoints.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildCentralEndpoints = void 0;\n function stripTrailingSlashes(s) {\n return s.replace(/\\/+$/, \"\");\n }\n function buildCentralEndpoints(base) {\n const b = stripTrailingSlashes(base);\n return {\n base: b,\n cache: `${b}/cache`,\n cacheRefresh: `${b}/cache/refresh`,\n revalidateTag: `${b}/revalidate/tag`,\n revalidatePath: `${b}/revalidate/path`,\n tagByTag: `${b}/tag/by-tag`,\n tagByPath: `${b}/tag/by-path`,\n tagLastModified: `${b}/tag/last-modified`,\n tagWrite: `${b}/tag/write`,\n deploySts: `${b}/deploy/sts-token`,\n deployTags: `${b}/deploy/tags`\n };\n }\n exports2.buildCentralEndpoints = buildCentralEndpoints;\n }\n});\n\n// dist/_protocol/index.js\nvar require_protocol = __commonJS({\n \"dist/_protocol/index.js\"(exports2) {\n \"use strict\";\n var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() {\n return m[k];\n } };\n }\n Object.defineProperty(o, k2, desc);\n } : function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n o[k2] = m[k];\n });\n var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);\n };\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n __exportStar(require_types(), exports2);\n __exportStar(require_keys(), exports2);\n __exportStar(require_endpoints(), exports2);\n }\n});\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/overrides/incrementalCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar protocol_1 = require_protocol();\nvar gateway_auth_1 = require_gateway_auth();\nvar GET_TIMEOUT = 5e3;\nvar SET_TIMEOUT = 1e4;\nvar DELETE_TIMEOUT = 5e3;\nfunction buildKey(config, key, isFetch) {\n return (0, protocol_1.buildOssKey)({\n appId: `${config.aliuid}/${config.routinename}`,\n buildId: config.version,\n key,\n cacheType: isFetch ? \"fetch\" : \"cache\"\n });\n}\nvar GatewayIncrementalCache = class {\n constructor() {\n this.name = \"gateway-incremental-cache\";\n this.config = null;\n this.configLoaded = false;\n }\n /**\n * 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。\n */\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n /**\n * 从 Gateway 读取缓存。\n */\n async get(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return null;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"GET\",\n timeoutMs: GET_TIMEOUT\n });\n if (res.status === 404)\n return null;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] GET \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] GET \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n return null;\n }\n const body = await res.text();\n let envelope;\n try {\n envelope = JSON.parse(body);\n } catch (_a) {\n console.warn(`[incrementalCache] JSON \\u89E3\\u6790\\u5931\\u8D25: key=\"${ossKey}\"`);\n return null;\n }\n if (!envelope || typeof envelope !== \"object\" || typeof envelope.lastModified !== \"number\") {\n console.warn(`[incrementalCache] envelope \\u683C\\u5F0F\\u5F02\\u5E38\\u6216\\u7F3A lastModified: key=\"${ossKey}\"`);\n return null;\n }\n return { value: envelope.value, lastModified: envelope.lastModified };\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] GET \\u8D85\\u65F6: key=\"${ossKey}\" (${GET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] GET \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n return null;\n }\n }\n /**\n * 向 Gateway 写入缓存。\n */\n async set(key, value, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n const body = JSON.stringify({ lastModified: Date.now(), value });\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n timeoutMs: SET_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] PUT \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] PUT \\u8D85\\u65F6: key=\"${ossKey}\" (${SET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n /**\n * 通过 Gateway 删除缓存。\n */\n async delete(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"DELETE\",\n timeoutMs: DELETE_TIMEOUT\n });\n if (res.status === 404)\n return;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] DELETE \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] DELETE \\u8D85\\u65F6: key=\"${ossKey}\" (${DELETE_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n};\nexports.default = GatewayIncrementalCache;\n",
|
|
6
6
|
"overrides/tagCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/overrides/tagCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gateway_auth_1 = require_gateway_auth();\nvar QUERY_TIMEOUT = 3e3;\nvar WRITE_TIMEOUT = 5e3;\nvar BATCH_SIZE = 200;\nfunction stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n}\nvar GatewayTagCache = class {\n constructor() {\n this.name = \"gateway-tag-cache\";\n this.mode = \"nextMode\";\n this.config = null;\n this.configLoaded = false;\n }\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n buildTagKey(tag) {\n const config = this.getConfig();\n if (!config)\n return tag;\n return `${config.version}/${stripLeadingSlash(tag)}`;\n }\n async getLastRevalidated(tags) {\n const config = this.getConfig();\n if (!config)\n return 0;\n try {\n const rows = await this.batchGetTags(config, tags);\n let maxRevalidatedAt = 0;\n for (const row of rows) {\n if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {\n maxRevalidatedAt = row.revalidatedAt;\n }\n }\n return maxRevalidatedAt;\n } catch (err) {\n console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);\n return 0;\n }\n }\n async hasBeenRevalidated(tags, lastModified) {\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const now = Date.now();\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.expire !== void 0) {\n if (row.expire <= now && row.expire > lm) {\n return true;\n }\n }\n if (row.revalidatedAt !== void 0 && row.revalidatedAt > lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);\n return false;\n }\n }\n async isStale(tags, lastModified) {\n var _a;\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.stale === void 0)\n continue;\n const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;\n if (revalidatedAt > lm && row.stale >= lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] isStale error: ${err.message}`);\n return false;\n }\n }\n async writeTags(tags) {\n if (!tags || tags.length === 0)\n return;\n const config = this.getConfig();\n if (!config)\n return;\n const writeTs = Date.now();\n const rows = tags.map((input) => {\n const tagStr = typeof input === \"string\" ? input : input.tag;\n const stale = typeof input === \"string\" ? void 0 : input.stale;\n const expire = typeof input === \"string\" ? void 0 : input.expire;\n const tagKey = this.buildTagKey(tagStr);\n const columns = [\n { name: \"revalidatedAt\", value: writeTs }\n ];\n if (stale !== void 0) {\n columns.push({ name: \"stale\", value: stale });\n }\n if (expire !== void 0) {\n columns.push({ name: \"expire\", value: expire });\n }\n return {\n primaryKey: [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: tagKey }\n ],\n columns\n };\n });\n await this.batchWrite(config, rows);\n }\n // ---- private methods ----\n async batchGetTags(config, tags) {\n const primaryKeys = tags.map((tag) => [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: this.buildTagKey(tag) }\n ]);\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-get-row\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ primaryKeys }),\n timeoutMs: QUERY_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-get-row rejected (${res.status})`);\n } else {\n console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);\n }\n return [];\n }\n const data = await res.json();\n if (!data.rows)\n return [];\n return data.rows.map((row) => {\n var _a;\n const result = {};\n for (const col of (_a = row.columns) !== null && _a !== void 0 ? _a : []) {\n if (col.name === \"revalidatedAt\" && typeof col.value === \"number\") {\n result.revalidatedAt = col.value;\n } else if (col.name === \"stale\" && typeof col.value === \"number\") {\n result.stale = col.value;\n } else if (col.name === \"expire\" && typeof col.value === \"number\") {\n result.expire = col.value;\n }\n }\n return result;\n });\n }\n async batchWrite(config, rows) {\n if (rows.length === 0)\n return;\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-write\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ rows: batch }),\n timeoutMs: WRITE_TIMEOUT\n });\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-write rejected (${res.status})`);\n return;\n }\n if (!res.ok) {\n console.warn(`[tagCache] batch-write failed: status=${res.status}`);\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);\n } else {\n console.warn(`[tagCache] batch-write error: ${err.message}`);\n }\n }\n }\n }\n};\nexports.default = GatewayTagCache;\n",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 单个请求会按以下顺序分发:
|
|
8
8
|
* 1. `/__health` → 200 OK(供 pcg serve / 容器就绪探针)
|
|
9
|
-
* 2. `/
|
|
9
|
+
* 2. `/_next/image` → image-proxy(签名 client 调 Gateway)
|
|
10
10
|
* 3. `.open-next/assets/<urlPath>` 命中 → 直接 pipe 文件流
|
|
11
11
|
* 4. 其他 → OpenNext handler(Next SSR/API/RSC)
|
|
12
12
|
*
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 单个请求会按以下顺序分发:
|
|
9
9
|
* 1. `/__health` → 200 OK(供 pcg serve / 容器就绪探针)
|
|
10
|
-
* 2. `/
|
|
10
|
+
* 2. `/_next/image` → image-proxy(签名 client 调 Gateway)
|
|
11
11
|
* 3. `.open-next/assets/<urlPath>` 命中 → 直接 pipe 文件流
|
|
12
12
|
* 4. 其他 → OpenNext handler(Next SSR/API/RSC)
|
|
13
13
|
*
|
|
@@ -218,7 +218,7 @@ async function wrapper(handler) {
|
|
|
218
218
|
}
|
|
219
219
|
const dispatchToNext = bridgeOpenNextHandler(handler);
|
|
220
220
|
const server = http.createServer(async (req, res) => {
|
|
221
|
-
var _a, _b
|
|
221
|
+
var _a, _b;
|
|
222
222
|
const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split('?')[0]) !== null && _b !== void 0 ? _b : '/';
|
|
223
223
|
// 1. health check
|
|
224
224
|
if (urlPath === '/__health') {
|
|
@@ -226,8 +226,10 @@ async function wrapper(handler) {
|
|
|
226
226
|
res.end('OK');
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
|
-
// 2. 图片优化代理 ——
|
|
230
|
-
|
|
229
|
+
// 2. 图片优化代理 —— 拦截 Next 默认的 /_next/image?url=...,server 侧代发
|
|
230
|
+
// 签名请求到 Gateway。这样用户 next.config 不需要配 custom loader,
|
|
231
|
+
// <Image> 走 Next 内置 URL 生成逻辑即可。
|
|
232
|
+
if (urlPath === '/_next/image') {
|
|
231
233
|
try {
|
|
232
234
|
await (0, image_proxy_1.handleImageProxy)(req, res);
|
|
233
235
|
}
|
|
@@ -265,7 +267,7 @@ async function wrapper(handler) {
|
|
|
265
267
|
server.listen(port, () => {
|
|
266
268
|
console.log(`[pcg-node] Listening on port ${port}`);
|
|
267
269
|
console.log(`[pcg-node] assets: ${assetsDir}`);
|
|
268
|
-
console.log(`[pcg-node] routes: /__health, /
|
|
270
|
+
console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);
|
|
269
271
|
resolve();
|
|
270
272
|
});
|
|
271
273
|
});
|
|
@@ -279,4 +281,4 @@ const wrapperDef = {
|
|
|
279
281
|
supportStreaming: true,
|
|
280
282
|
};
|
|
281
283
|
exports.default = wrapperDef;
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUErQjdELDRDQUE0QztBQUU1QyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsS0FBSyxFQUFFLHdCQUF3QjtJQUMvQixNQUFNLEVBQUUsd0JBQXdCO0lBQ2hDLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLGVBQWU7SUFDdkIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLFlBQVk7SUFDdEIsTUFBTSxFQUFFLFVBQVU7SUFDbEIsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtDQUN0QixDQUFDO0FBRUYsa0NBQWtDO0FBRWxDLFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixNQUFNLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsS0FBSyxN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QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHO0lBQ2pCLE9BQU87SUFDUCxJQUFJLEVBQUUsVUFBVTtJQUNoQixnQkFBZ0IsRUFBRSxJQUFJO0NBQ3ZCLENBQUM7QUFFRixrQkFBZSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBjZyBOb2RlIFNlcnZlciBXcmFwcGVyXG4gKlxuICogT3Blbk5leHQgd3JhcHBlciDnmoTplb/ov5vnqIvlvaLmgIE65LiN5L6d6LWWIEZhYVMgcnVudGltZSzoh6rluKYgSFRUUCBzZXJ2ZXIg55u05o6l55uR5ZCsXG4gKiBgcHJvY2Vzcy5lbnYuUE9SVGAo6buY6K6kIDMwMDApLGBub2RlIGluZGV4Lm1qc2Ag5Y2z5Y+v54us56uL6L+Q6KGM44CCXG4gKlxuICog5Y2V5Liq6K+35rGC5Lya5oyJ5Lul5LiL6aG65bqP5YiG5Y+ROlxuICogICAxLiBgL19faGVhbHRoYCAgICAgICAgICAgICAgICAgIOKGkiAyMDAgT0so5L6bIHBjZyBzZXJ2ZSAvIOWuueWZqOWwsee7quaOoumSiClcbiAqICAgMi4gYC9fcGNnL2ltYWdlLypgICAgICAgICAgICAgIOKGkiBpbWFnZS1wcm94eSjnrb7lkI0gY2xpZW50IOiwgyBHYXRld2F5KVxuICogICAzLiBgLm9wZW4tbmV4dC9hc3NldHMvPHVybFBhdGg+YCDlkb3kuK0g4oaSIOebtOaOpSBwaXBlIOaWh+S7tua1gVxuICogICA0LiDlhbbku5YgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBPcGVuTmV4dCBoYW5kbGVyKE5leHQgU1NSL0FQSS9SU0MpXG4gKlxuICog5LiJ5q616YC76L6R5q2k5YmN5YiG5pWj5ZyoIHBsYXRmb3JtLWZ1bmN0aW9uIHdyYXBwZXIoaW1hZ2UgcHJveHkgKyByZXHihpJldmVudCDmoaXmjqUpXG4gKiDkuI4gYHBjZyBzZXJ2ZWAg54i26L+b56iLKOmdmeaAgei1hOa6kCArIHJldmVyc2UgcHJveHkp5LitO+atpOasoee7n+S4gOi/myB3cmFwcGVyLFxuICog6K6pIGBwY2cgc2VydmVgIOmAgOWMluS4uue6r+WtkOi/m+eoi+euoeeQhuWZqOOAglxuICovXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaGFuZGxlSW1hZ2VQcm94eSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvaW1hZ2UtcHJveHknO1xuXG4vLyA9PT0gT3Blbk5leHQg5o6l5Y+j57G75Z6LKOWGheiBlOmBv+WFjeehrOS+nei1liBAb3Blbm5leHRqcy9hd3MpID09PVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxFdmVudCB7XG4gIHR5cGU6ICdjb3JlJztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHJhd1BhdGg6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGJvZHk/OiBzdHJpbmc7XG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG4gIGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlbW90ZUFkZHJlc3M6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0cmVhbUNyZWF0b3Ige1xuICB3cml0ZUhlYWRlcnMocHJlbHVkZToge1xuICAgIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgICBjb29raWVzOiBzdHJpbmdbXTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9KTogaW1wb3J0KCdzdHJlYW0nKS5Xcml0YWJsZTtcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgb25GaW5pc2g/OiAoKSA9PiB2b2lkO1xufVxuXG50eXBlIE9wZW5OZXh0SGFuZGxlciA9IChcbiAgZXZlbnQ6IEludGVybmFsRXZlbnQsXG4gIGN0eDogeyBzdHJlYW1DcmVhdG9yOiBTdHJlYW1DcmVhdG9yIH1cbikgPT4gUHJvbWlzZTx2b2lkPjtcblxuLy8gPT09IOmdmeaAgei1hOa6kCBNSU1FKOS4juWOnyBwY2cgc2VydmUg54i26L+b56iL5a6e546w5L+d5oyB5LiA6Ie0KSA9PT1cblxuY29uc3QgTUlNRV9UWVBFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJy5qcyc6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyxcbiAgJy5tanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXG4gICcuY3NzJzogJ3RleHQvY3NzJyxcbiAgJy5odG1sJzogJ3RleHQvaHRtbCcsXG4gICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgJy5qcGcnOiAnaW1hZ2UvanBlZycsXG4gICcuanBlZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcud29mZic6ICdmb250L3dvZmYnLFxuICAnLndvZmYyJzogJ2ZvbnQvd29mZjInLFxuICAnLnR0Zic6ICdmb250L3R0ZicsXG4gICcubWFwJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnR4dCc6ICd0ZXh0L3BsYWluJyxcbiAgJy53ZWJwJzogJ2ltYWdlL3dlYnAnLFxufTtcblxuLy8gPT09IOivt+axgiDihpIgSW50ZXJuYWxFdmVudCDmoaXmjqXlt6XlhbcgPT09XG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkodXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBjb25zdCBpZHggPSB1cmwuaW5kZXhPZignPycpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIHt9O1xuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zbGljZShpZHggKyAxKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNlYXJjaFBhcmFtcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcGFyYW1zW2tleV07XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgZXhpc3RpbmcucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1trZXldID0gW2V4aXN0aW5nLCB2YWx1ZV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29va2llcyhcbiAgY29va2llSGVhZGVyOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIWNvb2tpZUhlYWRlcikgcmV0dXJuIHt9O1xuICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgcGFpciBvZiBjb29raWVIZWFkZXIuc3BsaXQoJzsnKSkge1xuICAgIGNvbnN0IGVxSWR4ID0gcGFpci5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKGVxSWR4ID09PSAtMSkgY29udGludWU7XG4gICAgY29uc3QgbmFtZSA9IHBhaXIuc2xpY2UoMCwgZXFJZHgpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhaXIuc2xpY2UoZXFJZHggKyAxKS50cmltKCk7XG4gICAgaWYgKG5hbWUpIGNvb2tpZXNbbmFtZV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gY29va2llcztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbkhlYWRlcnMoXG4gIHJhd0hlYWRlcnM6IGh0dHAuSW5jb21pbmdIdHRwSGVhZGVyc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3SGVhZGVycykpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZS5qb2luKCcsICcpXG4gICAgICA6IHZhbHVlO1xuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQm9keShcbiAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZVxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHJlcS5tZXRob2QgPT09ICdHRVQnIHx8IHJlcS5tZXRob2QgPT09ICdIRUFEJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgcmVxLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IGNodW5rcy5wdXNoKGNodW5rKSk7XG4gICAgcmVxLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmLTgnKSkpO1xuICAgIHJlcS5vbignZXJyb3InLCByZWplY3QpO1xuICB9KTtcbn1cblxuLy8gPT09IOmdmeaAgei1hOa6kCA9PT1cblxuLyoqXG4gKiDmnI3liqEgLm9wZW4tbmV4dC9hc3NldHMvIOS4i+eahOmdmeaAgeaWh+S7tuOAglxuICpcbiAqIOWMuemFjeS4pOexuzpcbiAqICAgMS4gYC9fbmV4dC9zdGF0aWMvKmAg4oCU4oCUIE5leHQuanMg55Sf5oiQ55qE5bimIGhhc2gg6LWE5rqQLOmVv+e8k+WtmCBpbW11dGFibGVcbiAqICAgMi4gYC88cHVibGljLWZpbGU+YCDigJTigJQgYHB1YmxpYy9gIOaPkOWPluWHuuadpeeahOaguee6p+mdmeaAgeaWh+S7tiznn63nvJPlrZhcbiAqXG4gKiDkuI3lrZjlnKjnmoTot6/lvoTov5Tlm54gZmFsc2Ug6K6p5LiK5bGCIGZhbGxiYWNrIOWIsCBPcGVuTmV4dCBoYW5kbGVyKEFQSSAvIFNTUiAvXG4gKiBgX3BjZy8qYCDnrYkp44CCXG4gKi9cbmZ1bmN0aW9uIHNlcnZlU3RhdGljRmlsZShcbiAgYXNzZXRzRGlyOiBzdHJpbmcsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVybFBhdGggPSByZXEudXJsPy5zcGxpdCgnPycpWzBdID8/ICcvJztcbiAgaWYgKHVybFBhdGggPT09ICcvJyB8fCAhdXJsUGF0aC5zdGFydHNXaXRoKCcvJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihhc3NldHNEaXIsIHVybFBhdGgpO1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKGFzc2V0c0RpcikpIHtcbiAgICByZXMud3JpdGVIZWFkKDQwMyk7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHN0YXQ6IGZzLlN0YXRzO1xuICB0cnkge1xuICAgIHN0YXQgPSBmcy5zdGF0U3luYyhub3JtYWxpemVkUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIXN0YXQuaXNGaWxlKCkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUobm9ybWFsaXplZFBhdGgpO1xuICBjb25zdCBjb250ZW50VHlwZSA9IE1JTUVfVFlQRVNbZXh0XSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgY29uc3QgaXNIYXNoZWRBc3NldCA9IHVybFBhdGguc3RhcnRzV2l0aCgnL19uZXh0L3N0YXRpYy8nKTtcblxuICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAnQ29udGVudC1MZW5ndGgnOiBzdGF0LnNpemUsXG4gICAgJ0NhY2hlLUNvbnRyb2wnOiBpc0hhc2hlZEFzc2V0XG4gICAgICA/ICdwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAsIGltbXV0YWJsZSdcbiAgICAgIDogJ3B1YmxpYywgbWF4LWFnZT02MCcsXG4gIH0pO1xuICBmcy5jcmVhdGVSZWFkU3RyZWFtKG5vcm1hbGl6ZWRQYXRoKS5waXBlKHJlcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIOaKiiBPcGVuTmV4dCDmj5DkvpvnmoQgaGFuZGxlciDljIXmiJAgaHR0cCAocmVxLCByZXMpIOWkhOeQhuWHveaVsOOAglxuICog6LSf6LSjOiBib2R5IOivu+WPluOAgWV2ZW50IOe7hOijheOAgea1geW8j+WTjeW6lOOAgTUwMCDlhZzlupXjgIJcbiAqL1xuZnVuY3Rpb24gYnJpZGdlT3Blbk5leHRIYW5kbGVyKGhhbmRsZXI6IE9wZW5OZXh0SGFuZGxlcikge1xuICByZXR1cm4gYXN5bmMgKFxuICAgIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdVcmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBmbGF0dGVuSGVhZGVycyhyZXEuaGVhZGVycyk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEJvZHkocmVxKTtcblxuICAgICAgLy8gT3Blbk5leHQg5YaF6YOo5a+5IGV2ZW50LnVybCDmiafooYwgYG5ldyBVUkwoLi4uKWAs5b+F6aG75piv57ud5a+5IFVSTCDigJTigJQg55SoXG4gICAgICAvLyBob3N0IGhlYWRlciArIHgtZm9yd2FyZGVkLXByb3RvIOi/mOWOnyzooYzkuLrkuI4gT3Blbk5leHQg5YaF572uIG5vZGVcbiAgICAgIC8vIGNvbnZlcnRlciDkuIDoh7QgKEBvcGVubmV4dGpzL2F3cy9kaXN0L292ZXJyaWRlcy9jb252ZXJ0ZXJzL25vZGUuanMp44CCXG4gICAgICBjb25zdCBob3N0ID0gaGVhZGVyc1snaG9zdCddIHx8IGBsb2NhbGhvc3Q6JHtwcm9jZXNzLmVudi5QT1JUID8/ICczMDAwJ31gO1xuICAgICAgY29uc3QgcHJvdG8gPSBoZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddPy5zcGxpdCgnLCcpWzBdPy50cmltKCkgfHwgJ2h0dHAnO1xuICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBuZXcgVVJMKGAke3Byb3RvfTovLyR7aG9zdH0ke3Jhd1VybH1gKTtcblxuICAgICAgY29uc3QgZXZlbnQ6IEludGVybmFsRXZlbnQgPSB7XG4gICAgICAgIHR5cGU6ICdjb3JlJyxcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgICByYXdQYXRoOiBhYnNvbHV0ZVVybC5wYXRobmFtZSxcbiAgICAgICAgdXJsOiBhYnNvbHV0ZVVybC5ocmVmLFxuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBxdWVyeTogcGFyc2VRdWVyeShyYXdVcmwpLFxuICAgICAgICBjb29raWVzOiBwYXJzZUNvb2tpZXMoaGVhZGVyc1snY29va2llJ10pLFxuICAgICAgICByZW1vdGVBZGRyZXNzOlxuICAgICAgICAgIGhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddPy5zcGxpdCgnLCcpWzBdPy50cmltKCkgfHxcbiAgICAgICAgICBoZWFkZXJzWyd4LXJlYWwtaXAnXSB8fFxuICAgICAgICAgIHJlcS5zb2NrZXQ/LnJlbW90ZUFkZHJlc3MgfHxcbiAgICAgICAgICAnMTI3LjAuMC4xJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcy5vbignY2xvc2UnLCAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSk7XG5cbiAgICAgIGNvbnN0IHN0cmVhbUNyZWF0b3I6IFN0cmVhbUNyZWF0b3IgPSB7XG4gICAgICAgIHdyaXRlSGVhZGVycyhwcmVsdWRlKSB7XG4gICAgICAgICAgcmVzLnNldEhlYWRlcignU2V0LUNvb2tpZScsIHByZWx1ZGUuY29va2llcyk7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZChwcmVsdWRlLnN0YXR1c0NvZGUsIHByZWx1ZGUuaGVhZGVycyk7XG4gICAgICAgICAgcmVzLmZsdXNoSGVhZGVycygpO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgaGFuZGxlcihldmVudCwgeyBzdHJlYW1DcmVhdG9yIH0pO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICBjb25zdCBpc0RldiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG4gICAgICAgIHJlcy53cml0ZUhlYWQoNTAwLCB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgICAgIHJlcy5lbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgICAgICAgICAgLi4uKGlzRGV2ICYmIHsgbWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2sgfSksXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3Blbk5leHQg5Zyo5Yqg6L295a6MIHNlcnZlciBidW5kbGUg5ZCO6LCD55So5q2k5Ye95pWwLOaIkeS7rOWcqOatpOWQr+WKqCBIVFRQIHNlcnZlcuOAglxuICpcbiAqIGFzc2V0cyDnm67lvZXop6PmnpDkuLogYDxjd2Q+Ly4uLy4uL2Fzc2V0c2A6T3Blbk5leHQg6buY6K6k5Lqn54mp57uT5p6E5pivXG4gKiBgLm9wZW4tbmV4dC9zZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvaW5kZXgubWpzYCzov5DooYzml7bml6DorrrmmK/nlKjmiLfmiYvliqhcbiAqIGBjZGAg5ZCOIGBub2RlIGluZGV4Lm1qc2Ag6L+Y5pivIGBwY2cgc2VydmVgIHNwYXduKGBjd2Q6IHNlcnZlckRpcmApLFxuICogYHByb2Nlc3MuY3dkKClgIOmDveetieS6jiBgc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0L2AsYXNzZXRzIOW/heWcqCBgLi4vLi4vYXNzZXRzL2DjgIJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JhcHBlcihoYW5kbGVyOiBPcGVuTmV4dEhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LlBPUlQgPz8gJzMwMDAnLCAxMCk7XG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi4nLCAnLi4nLCAnYXNzZXRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhhc3NldHNEaXIpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtwY2ctbm9kZV0gYXNzZXRzIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJHthc3NldHNEaXJ9IOKAlCBzdGF0aWMgZmlsZSByZXF1ZXN0cyB3aWxsIGZhbGwgdGhyb3VnaCB0byBOZXh0IGhhbmRsZXJgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGRpc3BhdGNoVG9OZXh0ID0gYnJpZGdlT3Blbk5leHRIYW5kbGVyKGhhbmRsZXIpO1xuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybFBhdGggPSByZXEudXJsPy5zcGxpdCgnPycpWzBdID8/ICcvJztcblxuICAgIC8vIDEuIGhlYWx0aCBjaGVja1xuICAgIGlmICh1cmxQYXRoID09PSAnL19faGVhbHRoJykge1xuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICAgIHJlcy5lbmQoJ09LJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMi4g5Zu+54mH5LyY5YyW5Luj55CGIOKAlOKAlCBgPGltZz5gIOWPkeS4jeWHuuiHquWumuS5ieetvuWQjSBoZWFkZXIsd3JhcHBlciDlnKjmraTku6Plj5FcbiAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCgnL19wY2cvaW1hZ2UvJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUltYWdlUHJveHkocmVxLCByZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3BjZy1ub2RlXSBpbWFnZS1wcm94eSBlcnJvcjonLCBlcnIpO1xuICAgICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoNTAwLCB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgICAgICAgcmVzLmVuZChKU09OLnN0cmluZ2lmeSh7IGVycm9yOiAnSW1hZ2UgcHJveHkgZmFpbGVkJyB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMy4g6Z2Z5oCB6LWE5rqQKC5vcGVuLW5leHQvYXNzZXRzLylcbiAgICBpZiAoc2VydmVTdGF0aWNGaWxlKGFzc2V0c0RpciwgcmVxLCByZXMpKSByZXR1cm47XG5cbiAgICAvLyA0LiBmYWxsYmFjayDigJTigJQgT3Blbk5leHQgTmV4dC5qcyBoYW5kbGVyXG4gICAgYXdhaXQgZGlzcGF0Y2hUb05leHQocmVxLCByZXMpO1xuICB9KTtcblxuICAvLyDkvJjpm4XlhbPpl6065YGc5q2i5o6l5pS25paw6L+e5o6lLOetiSBpbi1mbGlnaHQg6K+35rGC6Ieq54S257uT5p2fLDVzIOWFnOW6leW8uuWItumAgOWHulxuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGNvbnN0IHNodXRkb3duID0gKHNpZ25hbDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gJHtzaWduYWx9IHJlY2VpdmVkLCBzaHV0dGluZyBkb3duLi4uYCk7XG4gICAgc2VydmVyLmNsb3NlKCgpID0+IHByb2Nlc3MuZXhpdCgwKSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoMCksIDUwMDApLnVucmVmKCk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHNodXRkb3duKCdTSUdJTlQnKSk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCAoKSA9PiBzaHV0ZG93bignU0lHVEVSTScpKTtcblxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdIExpc3RlbmluZyBvbiBwb3J0ICR7cG9ydH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICAgYXNzZXRzOiAgJHthc3NldHNEaXJ9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAgIHJvdXRlczogIC9fX2hlYWx0aCwgL19wY2cvaW1hZ2UvKiwgL19uZXh0L3N0YXRpYy8qLCA8bmV4dD5gKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3Blbk5leHQg6buY6K6k5a+85Ye65aWR57qmOmB7IHdyYXBwZXIsIG5hbWUsIHN1cHBvcnRTdHJlYW1pbmcgfWDjgIJcbiAqL1xuY29uc3Qgd3JhcHBlckRlZiA9IHtcbiAgd3JhcHBlcixcbiAgbmFtZTogJ3BjZy1ub2RlJyxcbiAgc3VwcG9ydFN0cmVhbWluZzogdHJ1ZSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJEZWY7XG4iXX0=
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUErQjdELDRDQUE0QztBQUU1QyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsS0FBSyxFQUFFLHdCQUF3QjtJQUMvQixNQUFNLEVBQUUsd0JBQXdCO0lBQ2hDLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLGVBQWU7SUFDdkIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLFlBQVk7SUFDdEIsTUFBTSxFQUFFLFVBQVU7SUFDbEIsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtDQUN0QixDQUFDO0FBRUYsa0NBQWtDO0FBRWxDLFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixNQUFNLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLFlBQVksRUFBRTtRQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDckI7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjthQUFNO1lBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLFlBQWdDO0lBRWhDLElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDakM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ3JCLFVBQW9DO0lBRXBDLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDM0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDckQsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDO0tBQ1g7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVEsQ0FDckIsR0FBeUI7SUFFekIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNwRSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RELEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsZUFBZTtBQUVmOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZUFBZSxDQUN0QixTQUFpQixFQUNqQixHQUF5QixFQUN6QixHQUF3Qjs7SUFFeEIsTUFBTSxPQUFPLEdBQUcsTUFBQSxNQUFBLEdBQUcsQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLG1DQUFJLEdBQUcsQ0FBQztJQUM5QyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDekMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxJQUFjLENBQUM7SUFDbkIsSUFBSTtRQUNGLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQ3BDO0lBQUMsV0FBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRWpDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLDBCQUEwQixDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUzRCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNqQixjQUFjLEVBQUUsV0FBVztRQUMzQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSTtRQUMzQixlQUFlLEVBQUUsYUFBYTtZQUM1QixDQUFDLENBQUMscUNBQXFDO1lBQ3ZDLENBQUMsQ0FBQyxvQkFBb0I7S0FDekIsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLE9BQXdCO0lBQ3JELE9BQU8sS0FBSyxFQUNWLEdBQXlCLEVBQ3pCLEdBQXdCLEVBQ1QsRUFBRTs7UUFDakIsSUFBSTtZQUNGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFakMsMERBQTBEO1lBQzFELDBEQUEwRDtZQUMxRCxvRUFBb0U7WUFDcEUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQWEsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksbUNBQUksTUFBTSxFQUFFLENBQUM7WUFDMUUsTUFBTSxLQUFLLEdBQUcsQ0FBQSxNQUFBLE1BQUEsT0FBTyxDQUFDLG1CQUFtQixDQUFDLDBDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBDQUFFLElBQUksRUFBRSxLQUFJLE1BQU0sQ0FBQztZQUM1RSxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUUzRCxNQUFNLEtBQUssR0FBa0I7Z0JBQzNCLElBQUksRUFBRSxNQUFNO2dCQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQzNCLE9BQU8sRUFBRSxXQUFXLENBQUMsUUFBUTtnQkFDN0IsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJO2dCQUNyQixJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QyxhQUFhLEVBQ1gsQ0FBQSxNQUFBLE1BQUEsT0FBTyxDQUFDLGlCQUFpQixDQUFDLDBDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBDQUFFLElBQUksRUFBRTtvQkFDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQztxQkFDcEIsTUFBQSxHQUFHLENBQUMsTUFBTSwwQ0FBRSxhQUFhLENBQUE7b0JBQ3pCLFdBQVc7YUFDZCxDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUUvQyxNQUFNLGFBQWEsR0FBa0I7Z0JBQ25DLFlBQVksQ0FBQyxPQUFPO29CQUNsQixHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzdDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25ELEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQztnQkFDRCxXQUFXLEVBQUUsZUFBZSxDQUFDLE1BQU07YUFDcEMsQ0FBQztZQUVGLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDekM7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDO2dCQUNwRCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxHQUFHLENBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDYixLQUFLLEVBQUUsdUJBQXVCO29CQUM5QixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDekQsQ0FBQyxDQUNILENBQUM7YUFDSDtpQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtnQkFDN0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ1g7U0FDRjtJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLE9BQU8sQ0FBQyxPQUF3Qjs7SUFDN0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNENBQTRDLFNBQVMsMkRBQTJELENBQ2pILENBQUM7S0FDSDtJQUVELE1BQU0sY0FBYyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTs7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBQSxNQUFBLEdBQUcsQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLG1DQUFJLEdBQUcsQ0FBQztRQUU5QyxrQkFBa0I7UUFDbEIsSUFBSSxPQUFPLEtBQUssV0FBVyxFQUFFO1lBQzNCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDckQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLE9BQU87U0FDUjtRQUVELDJEQUEyRDtRQUMzRCx3REFBd0Q7UUFDeEQsbUNBQW1DO1FBQ25DLElBQUksT0FBTyxLQUFLLGNBQWMsRUFBRTtZQUM5QixJQUFJO2dCQUNGLE1BQU0sSUFBQSw4QkFBZ0IsRUFBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDbEM7WUFBQyxPQUFPLEdBQVEsRUFBRTtnQkFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7b0JBQ3BCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztvQkFDM0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUMxRDtxQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtvQkFDN0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNYO2FBQ0Y7WUFDRCxPQUFPO1NBQ1I7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRWpELDBDQUEwQztRQUMxQyxNQUFNLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCw0Q0FBNEM7SUFDNUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBYyxFQUFRLEVBQUU7UUFDeEMsSUFBSSxZQUFZO1lBQUUsT0FBTztRQUN6QixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxNQUFNLDZCQUE2QixDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFakQsTUFBTSxJQUFJLE9BQU8sQ0FBTyxPQUFPLENBQUMsRUFBRTtRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN0RixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixPQUFPO0lBQ1AsSUFBSSxFQUFFLFVBQVU7SUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtDQUN2QixDQUFDO0FBRUYsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwY2cgTm9kZSBTZXJ2ZXIgV3JhcHBlclxuICpcbiAqIE9wZW5OZXh0IHdyYXBwZXIg55qE6ZW/6L+b56iL5b2i5oCBOuS4jeS+nei1liBGYWFTIHJ1bnRpbWUs6Ieq5bimIEhUVFAgc2VydmVyIOebtOaOpeebkeWQrFxuICogYHByb2Nlc3MuZW52LlBPUlRgKOm7mOiupCAzMDAwKSxgbm9kZSBpbmRleC5tanNgIOWNs+WPr+eLrOeri+i/kOihjOOAglxuICpcbiAqIOWNleS4quivt+axguS8muaMieS7peS4i+mhuuW6j+WIhuWPkTpcbiAqICAgMS4gYC9fX2hlYWx0aGAgICAgICAgICAgICAgICAgICDihpIgMjAwIE9LKOS+myBwY2cgc2VydmUgLyDlrrnlmajlsLHnu6rmjqLpkogpXG4gKiAgIDIuIGAvX25leHQvaW1hZ2VgICAgICAgICAgICAgICDihpIgaW1hZ2UtcHJveHko562+5ZCNIGNsaWVudCDosIMgR2F0ZXdheSlcbiAqICAgMy4gYC5vcGVuLW5leHQvYXNzZXRzLzx1cmxQYXRoPmAg5ZG95LitIOKGkiDnm7TmjqUgcGlwZSDmlofku7bmtYFcbiAqICAgNC4g5YW25LuWICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgT3Blbk5leHQgaGFuZGxlcihOZXh0IFNTUi9BUEkvUlNDKVxuICpcbiAqIOS4ieautemAu+i+keatpOWJjeWIhuaVo+WcqCBwbGF0Zm9ybS1mdW5jdGlvbiB3cmFwcGVyKGltYWdlIHByb3h5ICsgcmVx4oaSZXZlbnQg5qGl5o6lKVxuICog5LiOIGBwY2cgc2VydmVgIOeItui/m+eoiyjpnZnmgIHotYTmupAgKyByZXZlcnNlIHByb3h5KeS4rTvmraTmrKHnu5/kuIDov5sgd3JhcHBlcixcbiAqIOiuqSBgcGNnIHNlcnZlYCDpgIDljJbkuLrnuq/lrZDov5vnqIvnrqHnkIblmajjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhhbmRsZUltYWdlUHJveHkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2ltYWdlLXByb3h5JztcblxuLy8gPT09IE9wZW5OZXh0IOaOpeWPo+exu+WeiyjlhoXogZTpgb/lhY3noazkvp3otZYgQG9wZW5uZXh0anMvYXdzKSA9PT1cblxuaW50ZXJmYWNlIEludGVybmFsRXZlbnQge1xuICB0eXBlOiAnY29yZSc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICByYXdQYXRoOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBib2R5Pzogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZW1vdGVBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJlYW1DcmVhdG9yIHtcbiAgd3JpdGVIZWFkZXJzKHByZWx1ZGU6IHtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY29va2llczogc3RyaW5nW107XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IGltcG9ydCgnc3RyZWFtJykuV3JpdGFibGU7XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uRmluaXNoPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBPcGVuTmV4dEhhbmRsZXIgPSAoXG4gIGV2ZW50OiBJbnRlcm5hbEV2ZW50LFxuICBjdHg6IHsgc3RyZWFtQ3JlYXRvcjogU3RyZWFtQ3JlYXRvciB9XG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8vID09PSDpnZnmgIHotYTmupAgTUlNRSjkuI7ljp8gcGNnIHNlcnZlIOeItui/m+eoi+WunueOsOS/neaMgeS4gOiHtCkgPT09XG5cbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXG4gICcubWpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICcuaHRtbCc6ICd0ZXh0L2h0bWwnLFxuICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAnLmljbyc6ICdpbWFnZS94LWljb24nLFxuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm1hcCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbn07XG5cbi8vID09PSDor7fmsYIg4oaSIEludGVybmFsRXZlbnQg5qGl5o6l5bel5YW3ID09PVxuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgY29uc3QgaWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiB7fTtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2xpY2UoaWR4ICsgMSkpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcmFtc1trZXldO1xuICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNba2V5XSA9IFtleGlzdGluZywgdmFsdWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZXMoXG4gIGNvb2tpZUhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFjb29raWVIZWFkZXIpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHBhaXIgb2YgY29va2llSGVhZGVyLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBlcUlkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYWlyLnNsaWNlKDAsIGVxSWR4KS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSBwYWlyLnNsaWNlKGVxSWR4ICsgMSkudHJpbSgpO1xuICAgIGlmIChuYW1lKSBjb29raWVzW25hbWVdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5IZWFkZXJzKFxuICByYXdIZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0hlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUuam9pbignLCAnKVxuICAgICAgOiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEJvZHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnR0VUJyB8fCByZXEubWV0aG9kID09PSAnSEVBRCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHJlcS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgIHJlcS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04JykpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbi8vID09PSDpnZnmgIHotYTmupAgPT09XG5cbi8qKlxuICog5pyN5YqhIC5vcGVuLW5leHQvYXNzZXRzLyDkuIvnmoTpnZnmgIHmlofku7bjgIJcbiAqXG4gKiDljLnphY3kuKTnsbs6XG4gKiAgIDEuIGAvX25leHQvc3RhdGljLypgIOKAlOKAlCBOZXh0LmpzIOeUn+aIkOeahOW4piBoYXNoIOi1hOa6kCzplb/nvJPlrZggaW1tdXRhYmxlXG4gKiAgIDIuIGAvPHB1YmxpYy1maWxlPmAg4oCU4oCUIGBwdWJsaWMvYCDmj5Dlj5blh7rmnaXnmoTmoLnnuqfpnZnmgIHmlofku7Ys55+t57yT5a2YXG4gKlxuICog5LiN5a2Y5Zyo55qE6Lev5b6E6L+U5ZueIGZhbHNlIOiuqeS4iuWxgiBmYWxsYmFjayDliLAgT3Blbk5leHQgaGFuZGxlcihBUEkgLyBTU1IgL1xuICogYF9wY2cvKmAg562JKeOAglxuICovXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpY0ZpbGUoXG4gIGFzc2V0c0Rpcjogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG4gIGlmICh1cmxQYXRoID09PSAnLycgfHwgIXVybFBhdGguc3RhcnRzV2l0aCgnLycpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCB1cmxQYXRoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChhc3NldHNEaXIpKSB7XG4gICAgcmVzLndyaXRlSGVhZCg0MDMpO1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBzdGF0OiBmcy5TdGF0cztcbiAgdHJ5IHtcbiAgICBzdGF0ID0gZnMuc3RhdFN5bmMobm9ybWFsaXplZFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFzdGF0LmlzRmlsZSgpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgY29uc3QgY29udGVudFR5cGUgPSBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIGNvbnN0IGlzSGFzaGVkQXNzZXQgPSB1cmxQYXRoLnN0YXJ0c1dpdGgoJy9fbmV4dC9zdGF0aWMvJyk7XG5cbiAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogc3RhdC5zaXplLFxuICAgICdDYWNoZS1Db250cm9sJzogaXNIYXNoZWRBc3NldFxuICAgICAgPyAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGUnXG4gICAgICA6ICdwdWJsaWMsIG1heC1hZ2U9NjAnLFxuICB9KTtcbiAgZnMuY3JlYXRlUmVhZFN0cmVhbShub3JtYWxpemVkUGF0aCkucGlwZShyZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiDmioogT3Blbk5leHQg5o+Q5L6b55qEIGhhbmRsZXIg5YyF5oiQIGh0dHAgKHJlcSwgcmVzKSDlpITnkIblh73mlbDjgIJcbiAqIOi0n+i0ozogYm9keSDor7vlj5bjgIFldmVudCDnu4Too4XjgIHmtYHlvI/lk43lupTjgIE1MDAg5YWc5bqV44CCXG4gKi9cbmZ1bmN0aW9uIGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyOiBPcGVuTmV4dEhhbmRsZXIpIHtcbiAgcmV0dXJuIGFzeW5jIChcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3VXJsID0gcmVxLnVybCB8fCAnLyc7XG4gICAgICBjb25zdCBoZWFkZXJzID0gZmxhdHRlbkhlYWRlcnMocmVxLmhlYWRlcnMpO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRCb2R5KHJlcSk7XG5cbiAgICAgIC8vIE9wZW5OZXh0IOWGhemDqOWvuSBldmVudC51cmwg5omn6KGMIGBuZXcgVVJMKC4uLilgLOW/hemhu+aYr+e7neWvuSBVUkwg4oCU4oCUIOeUqFxuICAgICAgLy8gaG9zdCBoZWFkZXIgKyB4LWZvcndhcmRlZC1wcm90byDov5jljp8s6KGM5Li65LiOIE9wZW5OZXh0IOWGhee9riBub2RlXG4gICAgICAvLyBjb252ZXJ0ZXIg5LiA6Ie0IChAb3Blbm5leHRqcy9hd3MvZGlzdC9vdmVycmlkZXMvY29udmVydGVycy9ub2RlLmpzKeOAglxuICAgICAgY29uc3QgaG9zdCA9IGhlYWRlcnNbJ2hvc3QnXSB8fCBgbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCd9YDtcbiAgICAgIGNvbnN0IHByb3RvID0gaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8ICdodHRwJztcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gbmV3IFVSTChgJHtwcm90b306Ly8ke2hvc3R9JHtyYXdVcmx9YCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBJbnRlcm5hbEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnY29yZScsXG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgcmF3UGF0aDogYWJzb2x1dGVVcmwucGF0aG5hbWUsXG4gICAgICAgIHVybDogYWJzb2x1dGVVcmwuaHJlZixcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6IHBhcnNlUXVlcnkocmF3VXJsKSxcbiAgICAgICAgY29va2llczogcGFyc2VDb29raWVzKGhlYWRlcnNbJ2Nvb2tpZSddKSxcbiAgICAgICAgcmVtb3RlQWRkcmVzczpcbiAgICAgICAgICBoZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8XG4gICAgICAgICAgaGVhZGVyc1sneC1yZWFsLWlwJ10gfHxcbiAgICAgICAgICByZXEuc29ja2V0Py5yZW1vdGVBZGRyZXNzIHx8XG4gICAgICAgICAgJzEyNy4wLjAuMScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXMub24oJ2Nsb3NlJywgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpO1xuXG4gICAgICBjb25zdCBzdHJlYW1DcmVhdG9yOiBTdHJlYW1DcmVhdG9yID0ge1xuICAgICAgICB3cml0ZUhlYWRlcnMocHJlbHVkZSkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ1NldC1Db29raWUnLCBwcmVsdWRlLmNvb2tpZXMpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQocHJlbHVkZS5zdGF0dXNDb2RlLCBwcmVsdWRlLmhlYWRlcnMpO1xuICAgICAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGhhbmRsZXIoZXZlbnQsIHsgc3RyZWFtQ3JlYXRvciB9KTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgY29uc3QgaXNEZXYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuICAgICAgICByZXMud3JpdGVIZWFkKDUwMCwgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICByZXMuZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAgICAgICAgIC4uLihpc0RldiAmJiB7IG1lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrIH0pLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZW5OZXh0IOWcqOWKoOi9veWujCBzZXJ2ZXIgYnVuZGxlIOWQjuiwg+eUqOatpOWHveaVsCzmiJHku6zlnKjmraTlkK/liqggSFRUUCBzZXJ2ZXLjgIJcbiAqXG4gKiBhc3NldHMg55uu5b2V6Kej5p6Q5Li6IGA8Y3dkPi8uLi8uLi9hc3NldHNgOk9wZW5OZXh0IOm7mOiupOS6p+eJqee7k+aehOaYr1xuICogYC5vcGVuLW5leHQvc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0L2luZGV4Lm1qc2As6L+Q6KGM5pe25peg6K665piv55So5oi35omL5YqoXG4gKiBgY2RgIOWQjiBgbm9kZSBpbmRleC5tanNgIOi/mOaYryBgcGNnIHNlcnZlYCBzcGF3bihgY3dkOiBzZXJ2ZXJEaXJgKSxcbiAqIGBwcm9jZXNzLmN3ZCgpYCDpg73nrYnkuo4gYHNlcnZlci1mdW5jdGlvbnMvZGVmYXVsdC9gLGFzc2V0cyDlv4XlnKggYC4uLy4uL2Fzc2V0cy9g44CCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyYXBwZXIoaGFuZGxlcjogT3Blbk5leHRIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChwcm9jZXNzLmVudi5QT1JUID8/ICczMDAwJywgMTApO1xuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4uJywgJy4uJywgJ2Fzc2V0cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYXNzZXRzRGlyKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbcGNnLW5vZGVdIGFzc2V0cyBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0ICR7YXNzZXRzRGlyfSDigJQgc3RhdGljIGZpbGUgcmVxdWVzdHMgd2lsbCBmYWxsIHRocm91Z2ggdG8gTmV4dCBoYW5kbGVyYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBkaXNwYXRjaFRvTmV4dCA9IGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyKTtcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG5cbiAgICAvLyAxLiBoZWFsdGggY2hlY2tcbiAgICBpZiAodXJsUGF0aCA9PT0gJy9fX2hlYWx0aCcpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7ICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicgfSk7XG4gICAgICByZXMuZW5kKCdPSycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIOWbvueJh+S8mOWMluS7o+eQhiDigJTigJQg5oum5oiqIE5leHQg6buY6K6k55qEIC9fbmV4dC9pbWFnZT91cmw9Li4uLHNlcnZlciDkvqfku6Plj5FcbiAgICAvLyAgICDnrb7lkI3or7fmsYLliLAgR2F0ZXdheeOAgui/meagt+eUqOaItyBuZXh0LmNvbmZpZyDkuI3pnIDopoHphY0gY3VzdG9tIGxvYWRlcixcbiAgICAvLyAgICA8SW1hZ2U+IOi1sCBOZXh0IOWGhee9riBVUkwg55Sf5oiQ6YC76L6R5Y2z5Y+v44CCXG4gICAgaWYgKHVybFBhdGggPT09ICcvX25leHQvaW1hZ2UnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBoYW5kbGVJbWFnZVByb3h5KHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twY2ctbm9kZV0gaW1hZ2UtcHJveHkgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDUwMCwgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICAgIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ0ltYWdlIHByb3h5IGZhaWxlZCcgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDMuIOmdmeaAgei1hOa6kCgub3Blbi1uZXh0L2Fzc2V0cy8pXG4gICAgaWYgKHNlcnZlU3RhdGljRmlsZShhc3NldHNEaXIsIHJlcSwgcmVzKSkgcmV0dXJuO1xuXG4gICAgLy8gNC4gZmFsbGJhY2sg4oCU4oCUIE9wZW5OZXh0IE5leHQuanMgaGFuZGxlclxuICAgIGF3YWl0IGRpc3BhdGNoVG9OZXh0KHJlcSwgcmVzKTtcbiAgfSk7XG5cbiAgLy8g5LyY6ZuF5YWz6ZetOuWBnOatouaOpeaUtuaWsOi/nuaOpSznrYkgaW4tZmxpZ2h0IOivt+axguiHqueEtue7k+adnyw1cyDlhZzlupXlvLrliLbpgIDlh7pcbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICBjb25zdCBzaHV0ZG93biA9IChzaWduYWw6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICR7c2lnbmFsfSByZWNlaXZlZCwgc2h1dHRpbmcgZG93bi4uLmApO1xuICAgIHNlcnZlci5jbG9zZSgoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KDApLCA1MDAwKS51bnJlZigpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiBzaHV0ZG93bignU0lHSU5UJykpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSBMaXN0ZW5pbmcgb24gcG9ydCAke3BvcnR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAgIGFzc2V0czogICR7YXNzZXRzRGlyfWApO1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gICByb3V0ZXM6ICAvX19oZWFsdGgsIC9fbmV4dC9pbWFnZSwgL19uZXh0L3N0YXRpYy8qLCA8bmV4dD5gKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3Blbk5leHQg6buY6K6k5a+85Ye65aWR57qmOmB7IHdyYXBwZXIsIG5hbWUsIHN1cHBvcnRTdHJlYW1pbmcgfWDjgIJcbiAqL1xuY29uc3Qgd3JhcHBlckRlZiA9IHtcbiAgd3JhcHBlcixcbiAgbmFtZTogJ3BjZy1ub2RlJyxcbiAgc3VwcG9ydFN0cmVhbWluZzogdHJ1ZSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJEZWY7XG4iXX0=
|
package/dist/commands/build.js
CHANGED
|
@@ -41,30 +41,6 @@ function isNextMajorUnsupported(major) {
|
|
|
41
41
|
// Relative form needed because absolute __dirname paths break when the CLI is
|
|
42
42
|
// ncc-bundled into a single file (subdirectory tree no longer exists).
|
|
43
43
|
const PCG_OVERRIDES_REL = '.pcg/overrides';
|
|
44
|
-
// Loader copied into <projectDir>/node_modules/.pcg/ at build time so
|
|
45
|
-
// next.config can reference it as 'node_modules/.pcg/pcg-image-loader.js'
|
|
46
|
-
// without writing into the user's source tree or adding esa-pcg-cli to
|
|
47
|
-
// their package.json. node_modules is gitignored and webpack handles paths
|
|
48
|
-
// under it natively.
|
|
49
|
-
const PCG_IMAGE_LOADER_FILENAME = 'pcg-image-loader.js';
|
|
50
|
-
const PCG_IMAGE_LOADER_REL_DIR = 'node_modules/.pcg';
|
|
51
|
-
async function materializeImageLoader(projectDir) {
|
|
52
|
-
const src = path.join(__dirname, '..', '..', 'runtime', PCG_IMAGE_LOADER_FILENAME);
|
|
53
|
-
const destDir = path.join(projectDir, PCG_IMAGE_LOADER_REL_DIR);
|
|
54
|
-
const dest = path.join(destDir, PCG_IMAGE_LOADER_FILENAME);
|
|
55
|
-
try {
|
|
56
|
-
await fs.mkdir(destDir, { recursive: true });
|
|
57
|
-
await fs.copyFile(src, dest);
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
if (err && err.code === 'ENOENT') {
|
|
61
|
-
throw new Error(`[build] runtime/${PCG_IMAGE_LOADER_FILENAME} missing from esa-pcg-cli, ` +
|
|
62
|
-
`or ${projectDir}/node_modules is missing. ` +
|
|
63
|
-
'Run `npm install` in the project, and reinstall esa-pcg-cli if its runtime/ is gone.');
|
|
64
|
-
}
|
|
65
|
-
throw err;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
44
|
async function materializeOverrides(projectDir) {
|
|
69
45
|
// Lazy require — keeps the inline-overrides bundle out of the import graph
|
|
70
46
|
// for code paths that don't auto-generate the config.
|
|
@@ -152,8 +128,6 @@ async function runBuild(opts) {
|
|
|
152
128
|
forceUnsupported = true;
|
|
153
129
|
}
|
|
154
130
|
}
|
|
155
|
-
await materializeImageLoader(projectDir);
|
|
156
|
-
await checkImageLoaderConfig(projectDir);
|
|
157
131
|
console.log('[build] Running OpenNext build...');
|
|
158
132
|
const prevCwd = process.cwd();
|
|
159
133
|
try {
|
|
@@ -187,44 +161,6 @@ async function runBuild(opts) {
|
|
|
187
161
|
}
|
|
188
162
|
}
|
|
189
163
|
exports.runBuild = runBuild;
|
|
190
|
-
const NEXT_CONFIG_FILES = [
|
|
191
|
-
'next.config.js',
|
|
192
|
-
'next.config.mjs',
|
|
193
|
-
'next.config.ts',
|
|
194
|
-
];
|
|
195
|
-
async function readNextConfig(projectDir) {
|
|
196
|
-
for (const f of NEXT_CONFIG_FILES) {
|
|
197
|
-
try {
|
|
198
|
-
return await fs.readFile(path.join(projectDir, f), 'utf-8');
|
|
199
|
-
}
|
|
200
|
-
catch (_a) {
|
|
201
|
-
// try next candidate
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Verify `next.config.{js,mjs,ts}` wires `images.loader = "custom"` AND
|
|
208
|
-
* `images.loaderFile` references the loader that `materializeImageLoader`
|
|
209
|
-
* just wrote into `<projectDir>/node_modules/.pcg/`. Without that wiring
|
|
210
|
-
* Next falls back to the built-in /_next/image handler and `<Image>` URLs
|
|
211
|
-
* never reach the wrapper's `/_pcg/image/*` route.
|
|
212
|
-
*/
|
|
213
|
-
async function checkImageLoaderConfig(projectDir) {
|
|
214
|
-
try {
|
|
215
|
-
const content = await readNextConfig(projectDir);
|
|
216
|
-
if (content === null)
|
|
217
|
-
return;
|
|
218
|
-
const hasCustomLoader = /loader\s*:\s*['"]custom['"]/.test(content);
|
|
219
|
-
const hasLoaderFile = content.includes('pcg-image-loader');
|
|
220
|
-
if (!hasCustomLoader || !hasLoaderFile) {
|
|
221
|
-
console.warn('[build] Warning: next.config must configure images.loader = "custom" ' +
|
|
222
|
-
'and set images.loaderFile to "node_modules/.pcg/pcg-image-loader.js" — ' +
|
|
223
|
-
'without both, <Image> URLs will not be routed through /_pcg/image/optimize.');
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (_a) { }
|
|
227
|
-
}
|
|
228
164
|
function createBuildCommand() {
|
|
229
165
|
return new commander_1.Command('build')
|
|
230
166
|
.description('Build Next.js project for deployment via pages-cache-gateway')
|
|
@@ -244,4 +180,4 @@ function createBuildCommand() {
|
|
|
244
180
|
});
|
|
245
181
|
}
|
|
246
182
|
exports.createBuildCommand = createBuildCommand;
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJQUMzQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFFM0Msc0VBQXNFO0FBQ3RFLDBFQUEwRTtBQUMxRSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLHFCQUFxQjtBQUNyQixNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUM7QUFFckQsS0FBSyxVQUFVLHNCQUFzQixDQUFDLFVBQWtCO0lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ25CLFNBQVMsRUFDVCxJQUFJLEVBQ0osSUFBSSxFQUNKLFNBQVMsRUFDVCx5QkFBeUIsQ0FDMUIsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUMzRCxJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDOUI7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLG1CQUFtQix5QkFBeUIsNkJBQTZCO2dCQUN2RSxNQUFNLFVBQVUsNEJBQTRCO2dCQUM1QyxzRkFBc0YsQ0FDekYsQ0FBQztTQUNIO1FBQ0QsTUFBTSxHQUFHLENBQUM7S0FDWDtBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsVUFBa0I7SUFDcEQsMkVBQTJFO0lBQzNFLHNEQUFzRDtJQUN0RCxJQUFJLGdCQUF3QyxDQUFDO0lBQzdDLElBQUk7UUFDRixDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0tBQzFEO0lBQUMsT0FBTyxHQUFRLEVBQUU7UUFDakIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RDtnQkFDNUQsdUVBQXVFO2dCQUN2RSw0RUFBNEUsQ0FDL0UsQ0FBQztTQUNIO1FBQ0QsTUFBTSxHQUFHLENBQUM7S0FDWDtJQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBRzVELEVBQUU7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDcEM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFVBQWtCO0lBQ2hELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0QsbUVBQW1FO0lBQ25FLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBVU0sS0FBSyxVQUFVLFFBQVEsQ0FBQyxJQUFrQjtJQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMxRCxJQUFJO1FBQ0YsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQzlCO0lBQUMsV0FBTTtRQUNOLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDLFVBQVUsb0JBQW9CLENBQy9ELENBQUM7S0FDSDtJQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXhELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDN0IsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRXZCLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDZixNQUFNLFVBQVUsR0FBRyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDbEUsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUU7WUFDMUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSTtnQkFDRixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTthQUNQO1lBQUMsV0FBTSxHQUFFO1NBQ1g7S0FDRjtJQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDZixPQUFPLENBQUMsR0FBRyxDQUNULGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0YsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsTUFBTSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFBLGdEQUFxQixFQUFDO1lBQzFDLFlBQVksRUFBRSxLQUFLLGlCQUFpQixFQUFFO1NBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUMsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQjtJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU87S0FDUjtJQUVELElBQUk7UUFDRixJQUFJLE1BQU0sSUFBQSxjQUFTLEVBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQzdELE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixLQUFLLEdBQUcsRUFBRTtZQUNwRSxNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzNELE9BQU8sQ0FBQyxJQUFJLENBQ1YsZ0JBQWdCLFNBQVMseUJBQXlCLHlCQUF5Qix5QkFBeUI7b0JBQ2xHLDBDQUEwQztvQkFDMUMseURBQXlELENBQzVELENBQUM7Z0JBQ0YsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQ3pCO1NBQ0Y7UUFFRCxNQUFNLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJO1lBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixxRUFBcUU7WUFDckUsNkVBQTZFO1lBQzdFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzFELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVyxDQUFDLENBQUM7WUFDbEUsTUFBTSxhQUFhLENBQUMsS0FBSyxDQUN2QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixDQUNqQixDQUFDO1NBQ0g7Z0JBQVM7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0tBQ3hDO1lBQVM7UUFDUixJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUk7Z0JBQ0YsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVcsQ0FBQyxDQUFDO2FBQzlCO1lBQUMsV0FBTTtnQkFDTixPQUFPLENBQUMsSUFBSSxDQUNWLDJEQUEyRCxDQUM1RCxDQUFDO2FBQ0g7WUFDRCxJQUFJO2dCQUNGLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDcEM7WUFBQyxXQUFNO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUNBQXVDLGlCQUFpQixHQUFHLENBQzVELENBQUM7YUFDSDtTQUNGO0tBQ0Y7QUFDSCxDQUFDO0FBaEhELDRCQWdIQztBQUVELE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGLEtBQUssVUFBVSxjQUFjLENBQUMsVUFBa0I7SUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxpQkFBaUIsRUFBRTtRQUNqQyxJQUFJO1lBQ0YsT0FBTyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDN0Q7UUFBQyxXQUFNO1lBQ04scUJBQXFCO1NBQ3RCO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQUMsVUFBa0I7SUFDdEQsSUFBSTtRQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksT0FBTyxLQUFLLElBQUk7WUFBRSxPQUFPO1FBQzdCLE1BQU0sZUFBZSxHQUFHLDZCQUE2QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHVFQUF1RTtnQkFDckUseUVBQXlFO2dCQUN6RSw2RUFBNkUsQ0FDaEYsQ0FBQztTQUNIO0tBQ0Y7SUFBQyxXQUFNLEdBQUU7QUFDWixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCO0lBQ2hDLE9BQU8sSUFBSSxtQkFBTyxDQUFDLE9BQU8sQ0FBQztTQUN4QixXQUFXLENBQUMsOERBQThELENBQUM7U0FDM0UsTUFBTSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxHQUFHLENBQUM7U0FDeEQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLDBCQUEwQixDQUFDO1NBQ3JELE1BQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUM7U0FDdEMsTUFBTSxDQUFDLFdBQVcsRUFBRSxtQ0FBbUMsQ0FBQztTQUN4RCxNQUFNLENBQUMsMEJBQTBCLEVBQUUsb0NBQW9DLENBQUM7U0FDeEUsTUFBTSxDQUFDLEtBQUssRUFBQyxPQUFPLEVBQUMsRUFBRTtRQUN0QixNQUFNLFFBQVEsQ0FBQztZQUNiLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWpCRCxnREFpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBkaXJFeGlzdHMgfSBmcm9tICcuLi91dGlsL2ZzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVmYXVsdENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9kZWZhdWx0LW9wZW4tbmV4dC1jb25maWcnO1xuXG4vLyBNaXJyb3Igb2YgT3Blbk5leHQncyBORVhUX1JFTEVBU0VfREFURVMgKGhlbHBlci5qcykuIFVzZWQgdG8gYXV0by1wYXNzXG4vLyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQgd2hlbiB0aGUgdXNlcidzIE5leHQgbWFqb3IgaXMgcGFzdCBpdHMgMi15ZWFyIHdpbmRvdyxcbi8vIHNvIHBpcGVsaW5lIGJ1aWxkcyBkb24ndCBmYWlsIG9uIE9wZW5OZXh0J3MgcG9saWN5IGdhdGUuXG5jb25zdCBORVhUX1JFTEVBU0VfREFURVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDE2OiAnMjAyNS0xMC0yMScsXG4gIDE1OiAnMjAyNC0xMC0yMScsXG4gIDE0OiAnMjAyMy0xMC0yNicsXG4gIDEzOiAnMjAyMi0xMC0yNicsXG4gIDEyOiAnMjAyMS0xMC0yNicsXG59O1xuY29uc3QgTkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSUyA9IDI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdE5leHRNYWpvcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKFxuICAgICAgcHJvamVjdERpcixcbiAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgJ25leHQnLFxuICAgICAgJ3BhY2thZ2UuanNvbidcbiAgICApO1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGtnUGF0aCwgJ3V0Zi04JykpO1xuICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQoU3RyaW5nKHBrZy52ZXJzaW9uKS5zcGxpdCgnLicpWzBdLCAxMCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihtYWpvcikgPyBudWxsIDogbWFqb3I7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTmV4dE1ham9yVW5zdXBwb3J0ZWQobWFqb3I6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCByZWxlYXNlRGF0ZSA9IE5FWFRfUkVMRUFTRV9EQVRFU1ttYWpvcl07XG4gIGlmICghcmVsZWFzZURhdGUpIHJldHVybiBtYWpvciA8IDEyO1xuICBjb25zdCBlb2wgPSBuZXcgRGF0ZShyZWxlYXNlRGF0ZSk7XG4gIGVvbC5zZXRGdWxsWWVhcihlb2wuZ2V0RnVsbFllYXIoKSArIE5FWFRfU1VQUE9SVF9XSU5ET1dfWUVBUlMpO1xuICByZXR1cm4gRGF0ZS5ub3coKSA+IGVvbC5nZXRUaW1lKCk7XG59XG5cbi8vIFBhdGggaW5zaWRlIDxwcm9qZWN0RGlyPiB3aGVyZSB3ZSBtYXRlcmlhbGl6ZSBvdmVycmlkZSBidW5kbGVzIHNvIHRoZVxuLy8gYXV0by1nZW5lcmF0ZWQgb3Blbi1uZXh0LmNvbmZpZyBjYW4gcmVmZXJlbmNlIHRoZW0gdmlhIGEgcmVsYXRpdmUgcGF0aC5cbi8vIFJlbGF0aXZlIGZvcm0gbmVlZGVkIGJlY2F1c2UgYWJzb2x1dGUgX19kaXJuYW1lIHBhdGhzIGJyZWFrIHdoZW4gdGhlIENMSSBpc1xuLy8gbmNjLWJ1bmRsZWQgaW50byBhIHNpbmdsZSBmaWxlIChzdWJkaXJlY3RvcnkgdHJlZSBubyBsb25nZXIgZXhpc3RzKS5cbmNvbnN0IFBDR19PVkVSUklERVNfUkVMID0gJy5wY2cvb3ZlcnJpZGVzJztcblxuLy8gTG9hZGVyIGNvcGllZCBpbnRvIDxwcm9qZWN0RGlyPi9ub2RlX21vZHVsZXMvLnBjZy8gYXQgYnVpbGQgdGltZSBzb1xuLy8gbmV4dC5jb25maWcgY2FuIHJlZmVyZW5jZSBpdCBhcyAnbm9kZV9tb2R1bGVzLy5wY2cvcGNnLWltYWdlLWxvYWRlci5qcydcbi8vIHdpdGhvdXQgd3JpdGluZyBpbnRvIHRoZSB1c2VyJ3Mgc291cmNlIHRyZWUgb3IgYWRkaW5nIGVzYS1wY2ctY2xpIHRvXG4vLyB0aGVpciBwYWNrYWdlLmpzb24uIG5vZGVfbW9kdWxlcyBpcyBnaXRpZ25vcmVkIGFuZCB3ZWJwYWNrIGhhbmRsZXMgcGF0aHNcbi8vIHVuZGVyIGl0IG5hdGl2ZWx5LlxuY29uc3QgUENHX0lNQUdFX0xPQURFUl9GSUxFTkFNRSA9ICdwY2ctaW1hZ2UtbG9hZGVyLmpzJztcbmNvbnN0IFBDR19JTUFHRV9MT0FERVJfUkVMX0RJUiA9ICdub2RlX21vZHVsZXMvLnBjZyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplSW1hZ2VMb2FkZXIocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uJyxcbiAgICAnLi4nLFxuICAgICdydW50aW1lJyxcbiAgICBQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FXG4gICk7XG4gIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX0lNQUdFX0xPQURFUl9SRUxfRElSKTtcbiAgY29uc3QgZGVzdCA9IHBhdGguam9pbihkZXN0RGlyLCBQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRlc3QpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbYnVpbGRdIHJ1bnRpbWUvJHtQQ0dfSU1BR0VfTE9BREVSX0ZJTEVOQU1FfSBtaXNzaW5nIGZyb20gZXNhLXBjZy1jbGksIGAgK1xuICAgICAgICAgIGBvciAke3Byb2plY3REaXJ9L25vZGVfbW9kdWxlcyBpcyBtaXNzaW5nLiBgICtcbiAgICAgICAgICAnUnVuIGBucG0gaW5zdGFsbGAgaW4gdGhlIHByb2plY3QsIGFuZCByZWluc3RhbGwgZXNhLXBjZy1jbGkgaWYgaXRzIHJ1bnRpbWUvIGlzIGdvbmUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG1hdGVyaWFsaXplSW1hZ2VMb2FkZXIocHJvamVjdERpcik7XG4gICAgYXdhaXQgY2hlY2tJbWFnZUxvYWRlckNvbmZpZyhwcm9qZWN0RGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBCdWlsZCBjb21wbGV0ZSEnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcENvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ1BhdGghKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBjb25maWcgZmlsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIFdhcm5pbmc6IGZhaWxlZCB0byBjbGVhbiB1cCAke1BDR19PVkVSUklERVNfUkVMfS9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IE5FWFRfQ09ORklHX0ZJTEVTID0gW1xuICAnbmV4dC5jb25maWcuanMnLFxuICAnbmV4dC5jb25maWcubWpzJyxcbiAgJ25leHQuY29uZmlnLnRzJyxcbl07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWROZXh0Q29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBmb3IgKGNvbnN0IGYgb2YgTkVYVF9DT05GSUdfRklMRVMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihwcm9qZWN0RGlyLCBmKSwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyB0cnkgbmV4dCBjYW5kaWRhdGVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVmVyaWZ5IGBuZXh0LmNvbmZpZy57anMsbWpzLHRzfWAgd2lyZXMgYGltYWdlcy5sb2FkZXIgPSBcImN1c3RvbVwiYCBBTkRcbiAqIGBpbWFnZXMubG9hZGVyRmlsZWAgcmVmZXJlbmNlcyB0aGUgbG9hZGVyIHRoYXQgYG1hdGVyaWFsaXplSW1hZ2VMb2FkZXJgXG4gKiBqdXN0IHdyb3RlIGludG8gYDxwcm9qZWN0RGlyPi9ub2RlX21vZHVsZXMvLnBjZy9gLiBXaXRob3V0IHRoYXQgd2lyaW5nXG4gKiBOZXh0IGZhbGxzIGJhY2sgdG8gdGhlIGJ1aWx0LWluIC9fbmV4dC9pbWFnZSBoYW5kbGVyIGFuZCBgPEltYWdlPmAgVVJMc1xuICogbmV2ZXIgcmVhY2ggdGhlIHdyYXBwZXIncyBgL19wY2cvaW1hZ2UvKmAgcm91dGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrSW1hZ2VMb2FkZXJDb25maWcocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWROZXh0Q29uZmlnKHByb2plY3REaXIpO1xuICAgIGlmIChjb250ZW50ID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgaGFzQ3VzdG9tTG9hZGVyID0gL2xvYWRlclxccyo6XFxzKlsnXCJdY3VzdG9tWydcIl0vLnRlc3QoY29udGVudCk7XG4gICAgY29uc3QgaGFzTG9hZGVyRmlsZSA9IGNvbnRlbnQuaW5jbHVkZXMoJ3BjZy1pbWFnZS1sb2FkZXInKTtcbiAgICBpZiAoIWhhc0N1c3RvbUxvYWRlciB8fCAhaGFzTG9hZGVyRmlsZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW2J1aWxkXSBXYXJuaW5nOiBuZXh0LmNvbmZpZyBtdXN0IGNvbmZpZ3VyZSBpbWFnZXMubG9hZGVyID0gXCJjdXN0b21cIiAnICtcbiAgICAgICAgICAnYW5kIHNldCBpbWFnZXMubG9hZGVyRmlsZSB0byBcIm5vZGVfbW9kdWxlcy8ucGNnL3BjZy1pbWFnZS1sb2FkZXIuanNcIiDigJQgJyArXG4gICAgICAgICAgJ3dpdGhvdXQgYm90aCwgPEltYWdlPiBVUkxzIHdpbGwgbm90IGJlIHJvdXRlZCB0aHJvdWdoIC9fcGNnL2ltYWdlL29wdGltaXplLidcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnYnVpbGQnKVxuICAgIC5kZXNjcmlwdGlvbignQnVpbGQgTmV4dC5qcyBwcm9qZWN0IGZvciBkZXBsb3ltZW50IHZpYSBwYWdlcy1jYWNoZS1nYXRld2F5JylcbiAgICAub3B0aW9uKCctLWRpciA8cGF0aD4nLCAnTmV4dC5qcyBwcm9qZWN0IGRpcmVjdG9yeScsICcuJylcbiAgICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnb3Blbi1uZXh0LmNvbmZpZy50cyBwYXRoJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBtb2RlJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBidWlsZCBwbGFuIHdpdGhvdXQgZXhlY3V0aW5nJylcbiAgICAub3B0aW9uKCctLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQnLCAnQWxsb3cgdW5zdXBwb3J0ZWQgTmV4dC5qcyB2ZXJzaW9ucycpXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZyxcbiAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWROZXh0OiBvcHRpb25zLmZvcmNlVW5zdXBwb3J0ZWROZXh0LFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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T0FBTyxFQUFDLEVBQUU7UUFDdEIsTUFBTSxRQUFRLENBQUM7WUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlZmF1bHRDb25maWcgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdC1vcGVuLW5leHQtY29uZmlnJztcblxuLy8gTWlycm9yIG9mIE9wZW5OZXh0J3MgTkVYVF9SRUxFQVNFX0RBVEVTIChoZWxwZXIuanMpLiBVc2VkIHRvIGF1dG8tcGFzc1xuLy8gLS1mb3JjZS11bnN1cHBvcnRlZC1uZXh0IHdoZW4gdGhlIHVzZXIncyBOZXh0IG1ham9yIGlzIHBhc3QgaXRzIDIteWVhciB3aW5kb3csXG4vLyBzbyBwaXBlbGluZSBidWlsZHMgZG9uJ3QgZmFpbCBvbiBPcGVuTmV4dCdzIHBvbGljeSBnYXRlLlxuY29uc3QgTkVYVF9SRUxFQVNFX0RBVEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAxNjogJzIwMjUtMTAtMjEnLFxuICAxNTogJzIwMjQtMTAtMjEnLFxuICAxNDogJzIwMjMtMTAtMjYnLFxuICAxMzogJzIwMjItMTAtMjYnLFxuICAxMjogJzIwMjEtMTAtMjYnLFxufTtcbmNvbnN0IE5FWFRfU1VQUE9SVF9XSU5ET1dfWUVBUlMgPSAyO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3ROZXh0TWFqb3IocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHByb2plY3REaXIsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICduZXh0JyxcbiAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBrZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBjb25zdCBtYWpvciA9IHBhcnNlSW50KFN0cmluZyhwa2cudmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obWFqb3IpID8gbnVsbCA6IG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG1ham9yOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsZWFzZURhdGUgPSBORVhUX1JFTEVBU0VfREFURVNbbWFqb3JdO1xuICBpZiAoIXJlbGVhc2VEYXRlKSByZXR1cm4gbWFqb3IgPCAxMjtcbiAgY29uc3QgZW9sID0gbmV3IERhdGUocmVsZWFzZURhdGUpO1xuICBlb2wuc2V0RnVsbFllYXIoZW9sLmdldEZ1bGxZZWFyKCkgKyBORVhUX1NVUFBPUlRfV0lORE9XX1lFQVJTKTtcbiAgcmV0dXJuIERhdGUubm93KCkgPiBlb2wuZ2V0VGltZSgpO1xufVxuXG4vLyBQYXRoIGluc2lkZSA8cHJvamVjdERpcj4gd2hlcmUgd2UgbWF0ZXJpYWxpemUgb3ZlcnJpZGUgYnVuZGxlcyBzbyB0aGVcbi8vIGF1dG8tZ2VuZXJhdGVkIG9wZW4tbmV4dC5jb25maWcgY2FuIHJlZmVyZW5jZSB0aGVtIHZpYSBhIHJlbGF0aXZlIHBhdGguXG4vLyBSZWxhdGl2ZSBmb3JtIG5lZWRlZCBiZWNhdXNlIGFic29sdXRlIF9fZGlybmFtZSBwYXRocyBicmVhayB3aGVuIHRoZSBDTEkgaXNcbi8vIG5jYy1idW5kbGVkIGludG8gYSBzaW5nbGUgZmlsZSAoc3ViZGlyZWN0b3J5IHRyZWUgbm8gbG9uZ2VyIGV4aXN0cykuXG5jb25zdCBQQ0dfT1ZFUlJJREVTX1JFTCA9ICcucGNnL292ZXJyaWRlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBCdWlsZCBjb21wbGV0ZSEnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcENvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ1BhdGghKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBjb25maWcgZmlsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIFdhcm5pbmc6IGZhaWxlZCB0byBjbGVhbiB1cCAke1BDR19PVkVSUklERVNfUkVMfS9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnYnVpbGQnKVxuICAgIC5kZXNjcmlwdGlvbignQnVpbGQgTmV4dC5qcyBwcm9qZWN0IGZvciBkZXBsb3ltZW50IHZpYSBwYWdlcy1jYWNoZS1nYXRld2F5JylcbiAgICAub3B0aW9uKCctLWRpciA8cGF0aD4nLCAnTmV4dC5qcyBwcm9qZWN0IGRpcmVjdG9yeScsICcuJylcbiAgICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnb3Blbi1uZXh0LmNvbmZpZy50cyBwYXRoJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBtb2RlJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBidWlsZCBwbGFuIHdpdGhvdXQgZXhlY3V0aW5nJylcbiAgICAub3B0aW9uKCctLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQnLCAnQWxsb3cgdW5zdXBwb3J0ZWQgTmV4dC5qcyB2ZXJzaW9ucycpXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZyxcbiAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWROZXh0OiBvcHRpb25zLmZvcmNlVW5zdXBwb3J0ZWROZXh0LFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
package/dist/commands/serve.js
CHANGED
|
@@ -96,7 +96,7 @@ async function runServe(opts) {
|
|
|
96
96
|
console.log(` ESA_CACHE_GW_ALIUID = ${aliuid}`);
|
|
97
97
|
console.log(` ESA_CACHE_GW_ROUTINENAME = ${routinename}`);
|
|
98
98
|
console.log(` ESA_CACHE_GW_VERSION = ${buildId || '(not found)'}`);
|
|
99
|
-
console.log(' Image proxy = /
|
|
99
|
+
console.log(' Image proxy = /_next/image (intercepted by node-server wrapper)');
|
|
100
100
|
}
|
|
101
101
|
const child = (0, child_process_1.spawn)('node', ['index.mjs'], {
|
|
102
102
|
cwd: serverDir,
|
|
@@ -159,4 +159,4 @@ function createServeCommand() {
|
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
161
|
exports.createServeCommand = createServeCommand;
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2VydmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsaURBQW9EO0FBQ3BELHlDQUFvQztBQWNwQzs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLElBQVksRUFDWixTQUFTLEdBQUcsS0FBTTtJQUVsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQ3RCO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixJQUFJO2dCQUNKLElBQUksRUFBRSxXQUFXO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixPQUFPLEVBQUUsSUFBSzthQUNmLEVBQ0QsR0FBRyxDQUFDLEVBQUU7Z0JBQ0osR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFO29CQUN6QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzFELE9BQU87aUJBQ1I7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQ0YsQ0FBQztZQUNGLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdB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UCxDQUFDO0FBNUJELGdEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgc3Bhd24sIENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVPcHRpb25zIHtcbiAgZGlyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgZ2F0ZXdheT86IHN0cmluZztcbiAgLyoqIOacrOWcsOS+v+WIqTpgPGFsaXVpZD4vPHJvdXRpbmVuYW1lPmAs5YaF6YOo5ouG5oiQIEVTQV9DQUNIRV9HV19BTElVSUQgKyBST1VUSU5FTkFNRSAqL1xuICBhcHBJZD86IHN0cmluZztcbiAgLyoqIEhNQUMgc2VjcmV0LOazqOWFpeWIsCBFU0FfQ0FDSEVfR1dfQVVUSF9LRVnjgILkvJjlhYjnuqfpq5jkuo4gdG9rZW7jgIIgKi9cbiAgc2VjcmV0Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQg5penIEpXVCzlt7LkuI3lho3kvb/nlKgs5LuF5L+d55WZ5ZCR5ZCO5YW85a65ICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBvbGwgdGhlIGNoaWxkIHNlcnZlcidzIC9fX2hlYWx0aCBlbmRwb2ludCB1bnRpbCBpdCByZXNwb25kcyAyMDAgb3Igd2UgdGltZSBvdXQuXG4gKiBub2RlLXNlcnZlciB3cmFwcGVyIGV4cG9zZXMgL19faGVhbHRoIHVuY29uZGl0aW9uYWxseSwgc28gdGhpcyBpcyBub3cgbG9hZC1iZWFyaW5nXG4gKiAodGhlIG9sZCBpbXBsIGFsd2F5cyBmZWxsIHRocm91Z2ggdG8gYSBzZXRUaW1lb3V0IGJlY2F1c2UgcGxhdGZvcm0tZnVuY3Rpb24gaGFkXG4gKiBubyAvX19oZWFsdGgpLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUmVhZHkoXG4gIHBvcnQ6IG51bWJlcixcbiAgdGltZW91dE1zID0gMzBfMDAwXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb2JlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KFxuICAgICAgICB7XG4gICAgICAgICAgaG9zdG5hbWU6ICcxMjcuMC4wLjEnLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgcGF0aDogJy9fX2hlYWx0aCcsXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICB0aW1lb3V0OiAxXzAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgL19faGVhbHRoIHJldHVybmVkICR7cmVzLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KHByb2JlLCAyMDApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmVxLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBjaGlsZCBzZXJ2ZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQocHJvYmUsIDIwMCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9O1xuICAgIHByb2JlKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2VydmUob3B0czogU2VydmVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJy5vcGVuLW5leHQnLCAnYXNzZXRzJyk7XG4gIGNvbnN0IHNlcnZlckRpciA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgICcub3Blbi1uZXh0JyxcbiAgICAnc2VydmVyLWZ1bmN0aW9ucycsXG4gICAgJ2RlZmF1bHQnXG4gICk7XG4gIGNvbnN0IHNlcnZlckVudHJ5ID0gcGF0aC5qb2luKHNlcnZlckRpciwgJ2luZGV4Lm1qcycpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXJ2ZXJFbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgLm9wZW4tbmV4dC9zZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvaW5kZXgubWpzIG5vdCBmb3VuZC4gUnVuIFwicGNnIGJ1aWxkXCIgZmlyc3QuYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gb3B0cy5wb3J0O1xuXG4gIGNvbnN0IGNoaWxkRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC4uLihwcm9jZXNzLmVudiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICBQT1JUOiBTdHJpbmcocG9ydCksXG4gIH07XG5cbiAgaWYgKG9wdHMuZ2F0ZXdheSkge1xuICAgIGxldCByYXdHYXRld2F5ID0gb3B0cy5nYXRld2F5LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgIGlmICghL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdHYXRld2F5KSkge1xuICAgICAgcmF3R2F0ZXdheSA9IGBodHRwOi8vJHtyYXdHYXRld2F5fWA7XG4gICAgfVxuICAgIGNvbnN0IGdhdGV3YXlVcmwgPSByYXdHYXRld2F5O1xuICAgIGNvbnN0IGFwcElkID0gb3B0cy5hcHBJZCB8fCAnbG9jYWxfdXNlci9sb2NhbF9hcHAnO1xuICAgIGNvbnN0IHNlY3JldCA9IG9wdHMuc2VjcmV0IHx8IG9wdHMudG9rZW4gfHwgJ2xvY2FsLWRldi1zZWNyZXQnO1xuICAgIGlmICghb3B0cy5zZWNyZXQgJiYgb3B0cy50b2tlbikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3NlcnZlXSAtLXRva2VuIGlzIGRlcHJlY2F0ZWQsIHVzZSAtLXNlY3JldCB0byBwcm92aWRlIEhNQUMgYXV0aCBrZXknXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNsYXNoSWR4ID0gYXBwSWQuaW5kZXhPZignLycpO1xuICAgIGlmIChzbGFzaElkeCA8PSAwIHx8IHNsYXNoSWR4ID09PSBhcHBJZC5sZW5ndGggLSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbc2VydmVdIC0tYXBwLWlkIOagvOW8j+mUmeivrzogXCIke2FwcElkfVwiLOacn+acmyBcIjxhbGl1aWQ+Lzxyb3V0aW5lbmFtZT5cImBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFsaXVpZCA9IGFwcElkLnNsaWNlKDAsIHNsYXNoSWR4KTtcbiAgICBjb25zdCByb3V0aW5lbmFtZSA9IGFwcElkLnNsaWNlKHNsYXNoSWR4ICsgMSk7XG5cbiAgICBsZXQgYnVpbGRJZCA9ICcnO1xuICAgIGNvbnN0IGJ1aWxkSWRQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgJ0JVSUxEX0lEJyk7XG4gICAgdHJ5IHtcbiAgICAgIGJ1aWxkSWQgPSBmcy5yZWFkRmlsZVN5bmMoYnVpbGRJZFBhdGgsICd1dGYtOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tzZXJ2ZV0gV2FybmluZzogQlVJTERfSUQgbm90IGZvdW5kLCB0YWcvY2FjaGUga2V5IG1heSBiZSBpbmNvcnJlY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNoaWxkRW52LkVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UID0gZ2F0ZXdheVVybDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfQVVUSF9LRVkgPSBzZWNyZXQ7XG4gICAgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX0FMSVVJRCA9IGFsaXVpZDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgPSByb3V0aW5lbmFtZTtcbiAgICBpZiAoYnVpbGRJZCkgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX1ZFUlNJT04gPSBidWlsZElkO1xuXG4gICAgY29uc29sZS5sb2coJ1tzZXJ2ZV0gR2F0ZXdheSBtb2RlIGVuYWJsZWQ6Jyk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0dBVEVXQVlfRU5EUE9JTlQgPSAke2dhdGV3YXlVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0FMSVVJRCAgICAgICAgICAgPSAke2FsaXVpZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBFU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgICAgICA9ICR7cm91dGluZW5hbWV9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX1ZFUlNJT04gICAgICAgICAgPSAke2J1aWxkSWQgfHwgJyhub3QgZm91bmQpJ31gKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICcgIEltYWdlIHByb3h5ICAgICAgICAgICAgICAgICA9IC9fcGNnL2ltYWdlLyogKGludGVyY2VwdGVkIGJ5IG5vZGUtc2VydmVyIHdyYXBwZXIpJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBjaGlsZDogQ2hpbGRQcm9jZXNzID0gc3Bhd24oJ25vZGUnLCBbJ2luZGV4Lm1qcyddLCB7XG4gICAgY3dkOiBzZXJ2ZXJEaXIsXG4gICAgZW52OiBjaGlsZEVudixcbiAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcblxuICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBbbmV4dF0gJHtkYXRhfWApO1xuICB9KTtcbiAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgW25leHRdICR7ZGF0YX1gKTtcbiAgfSk7XG5cbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICBjb25zdCBzdG9wQ2hpbGQgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKHNpZ25hbCk7XG4gIH07XG5cbiAgY2hpbGQub24oJ2V4aXQnLCBjb2RlID0+IHtcbiAgICBpZiAoIXNodXR0aW5nRG93bikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3NlcnZlXSBOZXh0LmpzIHNlcnZlciBleGl0ZWQgdW5leHBlY3RlZGx5IHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICB9KTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiBzdG9wQ2hpbGQoJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHN0b3BDaGlsZCgnU0lHVEVSTScpKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JSZWFkeShwb3J0KTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbc2VydmVdIENoaWxkIHNlcnZlciBmYWlsZWQgdG8gYmVjb21lIHJlYWR5OiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHN0b3BDaGlsZCgnU0lHVEVSTScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBbc2VydmVdIFJlYWR5IGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICBjb25zb2xlLmxvZyhgW3NlcnZlXSAgIGFzc2V0cyAgLT4gLm9wZW4tbmV4dC9hc3NldHMvIChzZXJ2ZWQgYnkgd3JhcHBlcilgKTtcbiAgY29uc29sZS5sb2coYFtzZXJ2ZV0gICBoZWFsdGggIC0+IC9fX2hlYWx0aGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVDb21tYW5kKCk6IENvbW1hbmQge1xuICByZXR1cm4gbmV3IENvbW1hbmQoJ3NlcnZlJylcbiAgICAuZGVzY3JpcHRpb24oJ1N0YXJ0IGEgbG9jYWwgZGV2IHNlcnZlciBmb3IgYSBidWlsdCBOZXh0LmpzIHByb2plY3QnKVxuICAgIC5vcHRpb24oJy0tZGlyIDxwYXRoPicsICdOZXh0LmpzIHByb2plY3QgZGlyZWN0b3J5JywgJy4nKVxuICAgIC5vcHRpb24oJy1wLCAtLXBvcnQgPG51bWJlcj4nLCAnUG9ydCBudW1iZXInLCAnMzAwMCcpXG4gICAgLm9wdGlvbignLS1nYXRld2F5IDx1cmw+JywgJ0dhdGV3YXkgVVJMIChhdXRvLWluamVjdHMgYXV0aCBlbnYgdmFycyknKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS1hcHAtaWQgPGlkPicsXG4gICAgICAnQXBwIElEIGZvciBnYXRld2F5IGF1dGggKGRlZmF1bHQ6IGxvY2FsX3VzZXIvbG9jYWxfYXBwKSdcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICctLXNlY3JldCA8c2VjcmV0PicsXG4gICAgICAnSE1BQyBzZWNyZXQgZm9yIEVTQV9DQUNIRV9HV19BVVRIX0tFWSAoZGVmYXVsdDogbG9jYWwtZGV2LXNlY3JldCknXG4gICAgKVxuICAgIC5vcHRpb24oXG4gICAgICAnLS10b2tlbiA8dG9rZW4+JyxcbiAgICAgICdbZGVwcmVjYXRlZF0gYWxpYXMgZm9yIC0tc2VjcmV0LCB3aWxsIGJlIHJlbW92ZWQnXG4gICAgKVxuICAgIC5hY3Rpb24oYXN5bmMgb3B0aW9ucyA9PiB7XG4gICAgICBhd2FpdCBydW5TZXJ2ZSh7XG4gICAgICAgIGRpcjogb3B0aW9ucy5kaXIsXG4gICAgICAgIHBvcnQ6IHBhcnNlSW50KG9wdGlvbnMucG9ydCwgMTApLFxuICAgICAgICBnYXRld2F5OiBvcHRpb25zLmdhdGV3YXksXG4gICAgICAgIGFwcElkOiBvcHRpb25zLmFwcElkLFxuICAgICAgICBzZWNyZXQ6IG9wdGlvbnMuc2VjcmV0LFxuICAgICAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICAgIH0pO1xuICAgIH0pO1xufVxuIl19
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2VydmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsaURBQW9EO0FBQ3BELHlDQUFvQztBQWNwQzs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLElBQVksRUFDWixTQUFTLEdBQUcsS0FBTTtJQUVsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQ3RCO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixJQUFJO2dCQUNKLElBQUksRUFBRSxXQUFXO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixPQUFPLEVBQUUsSUFBSzthQUNmLEVBQ0QsR0FBRyxDQUFDLEVBQUU7Z0JBQ0osR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sRUFBRSxDQUFDO29CQUNWLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFO29CQUN6QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzFELE9BQU87aUJBQ1I7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQ0YsQ0FBQztZQUNGLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdB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UCxDQUFDO0FBNUJELGdEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgc3Bhd24sIENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVPcHRpb25zIHtcbiAgZGlyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgZ2F0ZXdheT86IHN0cmluZztcbiAgLyoqIOacrOWcsOS+v+WIqTpgPGFsaXVpZD4vPHJvdXRpbmVuYW1lPmAs5YaF6YOo5ouG5oiQIEVTQV9DQUNIRV9HV19BTElVSUQgKyBST1VUSU5FTkFNRSAqL1xuICBhcHBJZD86IHN0cmluZztcbiAgLyoqIEhNQUMgc2VjcmV0LOazqOWFpeWIsCBFU0FfQ0FDSEVfR1dfQVVUSF9LRVnjgILkvJjlhYjnuqfpq5jkuo4gdG9rZW7jgIIgKi9cbiAgc2VjcmV0Pzogc3RyaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQg5penIEpXVCzlt7LkuI3lho3kvb/nlKgs5LuF5L+d55WZ5ZCR5ZCO5YW85a65ICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBvbGwgdGhlIGNoaWxkIHNlcnZlcidzIC9fX2hlYWx0aCBlbmRwb2ludCB1bnRpbCBpdCByZXNwb25kcyAyMDAgb3Igd2UgdGltZSBvdXQuXG4gKiBub2RlLXNlcnZlciB3cmFwcGVyIGV4cG9zZXMgL19faGVhbHRoIHVuY29uZGl0aW9uYWxseSwgc28gdGhpcyBpcyBub3cgbG9hZC1iZWFyaW5nXG4gKiAodGhlIG9sZCBpbXBsIGFsd2F5cyBmZWxsIHRocm91Z2ggdG8gYSBzZXRUaW1lb3V0IGJlY2F1c2UgcGxhdGZvcm0tZnVuY3Rpb24gaGFkXG4gKiBubyAvX19oZWFsdGgpLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUmVhZHkoXG4gIHBvcnQ6IG51bWJlcixcbiAgdGltZW91dE1zID0gMzBfMDAwXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb2JlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5yZXF1ZXN0KFxuICAgICAgICB7XG4gICAgICAgICAgaG9zdG5hbWU6ICcxMjcuMC4wLjEnLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgcGF0aDogJy9fX2hlYWx0aCcsXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICB0aW1lb3V0OiAxXzAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgL19faGVhbHRoIHJldHVybmVkICR7cmVzLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KHByb2JlLCAyMDApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmVxLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBjaGlsZCBzZXJ2ZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQocHJvYmUsIDIwMCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5lbmQoKTtcbiAgICB9O1xuICAgIHByb2JlKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2VydmUob3B0czogU2VydmVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJy5vcGVuLW5leHQnLCAnYXNzZXRzJyk7XG4gIGNvbnN0IHNlcnZlckRpciA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgICcub3Blbi1uZXh0JyxcbiAgICAnc2VydmVyLWZ1bmN0aW9ucycsXG4gICAgJ2RlZmF1bHQnXG4gICk7XG4gIGNvbnN0IHNlcnZlckVudHJ5ID0gcGF0aC5qb2luKHNlcnZlckRpciwgJ2luZGV4Lm1qcycpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXJ2ZXJFbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgLm9wZW4tbmV4dC9zZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvaW5kZXgubWpzIG5vdCBmb3VuZC4gUnVuIFwicGNnIGJ1aWxkXCIgZmlyc3QuYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gb3B0cy5wb3J0O1xuXG4gIGNvbnN0IGNoaWxkRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC4uLihwcm9jZXNzLmVudiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICBQT1JUOiBTdHJpbmcocG9ydCksXG4gIH07XG5cbiAgaWYgKG9wdHMuZ2F0ZXdheSkge1xuICAgIGxldCByYXdHYXRld2F5ID0gb3B0cy5nYXRld2F5LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgIGlmICghL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdHYXRld2F5KSkge1xuICAgICAgcmF3R2F0ZXdheSA9IGBodHRwOi8vJHtyYXdHYXRld2F5fWA7XG4gICAgfVxuICAgIGNvbnN0IGdhdGV3YXlVcmwgPSByYXdHYXRld2F5O1xuICAgIGNvbnN0IGFwcElkID0gb3B0cy5hcHBJZCB8fCAnbG9jYWxfdXNlci9sb2NhbF9hcHAnO1xuICAgIGNvbnN0IHNlY3JldCA9IG9wdHMuc2VjcmV0IHx8IG9wdHMudG9rZW4gfHwgJ2xvY2FsLWRldi1zZWNyZXQnO1xuICAgIGlmICghb3B0cy5zZWNyZXQgJiYgb3B0cy50b2tlbikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3NlcnZlXSAtLXRva2VuIGlzIGRlcHJlY2F0ZWQsIHVzZSAtLXNlY3JldCB0byBwcm92aWRlIEhNQUMgYXV0aCBrZXknXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNsYXNoSWR4ID0gYXBwSWQuaW5kZXhPZignLycpO1xuICAgIGlmIChzbGFzaElkeCA8PSAwIHx8IHNsYXNoSWR4ID09PSBhcHBJZC5sZW5ndGggLSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbc2VydmVdIC0tYXBwLWlkIOagvOW8j+mUmeivrzogXCIke2FwcElkfVwiLOacn+acmyBcIjxhbGl1aWQ+Lzxyb3V0aW5lbmFtZT5cImBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFsaXVpZCA9IGFwcElkLnNsaWNlKDAsIHNsYXNoSWR4KTtcbiAgICBjb25zdCByb3V0aW5lbmFtZSA9IGFwcElkLnNsaWNlKHNsYXNoSWR4ICsgMSk7XG5cbiAgICBsZXQgYnVpbGRJZCA9ICcnO1xuICAgIGNvbnN0IGJ1aWxkSWRQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgJ0JVSUxEX0lEJyk7XG4gICAgdHJ5IHtcbiAgICAgIGJ1aWxkSWQgPSBmcy5yZWFkRmlsZVN5bmMoYnVpbGRJZFBhdGgsICd1dGYtOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tzZXJ2ZV0gV2FybmluZzogQlVJTERfSUQgbm90IGZvdW5kLCB0YWcvY2FjaGUga2V5IG1heSBiZSBpbmNvcnJlY3QnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNoaWxkRW52LkVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UID0gZ2F0ZXdheVVybDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfQVVUSF9LRVkgPSBzZWNyZXQ7XG4gICAgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX0FMSVVJRCA9IGFsaXVpZDtcbiAgICBjaGlsZEVudi5FU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgPSByb3V0aW5lbmFtZTtcbiAgICBpZiAoYnVpbGRJZCkgY2hpbGRFbnYuRVNBX0NBQ0hFX0dXX1ZFUlNJT04gPSBidWlsZElkO1xuXG4gICAgY29uc29sZS5sb2coJ1tzZXJ2ZV0gR2F0ZXdheSBtb2RlIGVuYWJsZWQ6Jyk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0dBVEVXQVlfRU5EUE9JTlQgPSAke2dhdGV3YXlVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX0FMSVVJRCAgICAgICAgICAgPSAke2FsaXVpZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBFU0FfQ0FDSEVfR1dfUk9VVElORU5BTUUgICAgICA9ICR7cm91dGluZW5hbWV9YCk7XG4gICAgY29uc29sZS5sb2coYCAgRVNBX0NBQ0hFX0dXX1ZFUlNJT04gICAgICAgICAgPSAke2J1aWxkSWQgfHwgJyhub3QgZm91bmQpJ31gKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICcgIEltYWdlIHByb3h5ICAgICAgICAgICAgICAgICA9IC9fbmV4dC9pbWFnZSAoaW50ZXJjZXB0ZWQgYnkgbm9kZS1zZXJ2ZXIgd3JhcHBlciknXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkOiBDaGlsZFByb2Nlc3MgPSBzcGF3bignbm9kZScsIFsnaW5kZXgubWpzJ10sIHtcbiAgICBjd2Q6IHNlcnZlckRpcixcbiAgICBlbnY6IGNoaWxkRW52LFxuICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuXG4gIGNoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFtuZXh0XSAke2RhdGF9YCk7XG4gIH0pO1xuICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGBbbmV4dF0gJHtkYXRhfWApO1xuICB9KTtcblxuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGNvbnN0IHN0b3BDaGlsZCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgaWYgKCFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgfTtcblxuICBjaGlsZC5vbignZXhpdCcsIGNvZGUgPT4ge1xuICAgIGlmICghc2h1dHRpbmdEb3duKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbc2VydmVdIE5leHQuanMgc2VydmVyIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHN0b3BDaGlsZCgnU0lHSU5UJykpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gc3RvcENoaWxkKCdTSUdURVJNJykpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvclJlYWR5KHBvcnQpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtzZXJ2ZV0gQ2hpbGQgc2VydmVyIGZhaWxlZCB0byBiZWNvbWUgcmVhZHk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgc3RvcENoaWxkKCdTSUdURVJNJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFtzZXJ2ZV0gUmVhZHkgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCk7XG4gIGNvbnNvbGUubG9nKGBbc2VydmVdICAgYXNzZXRzICAtPiAub3Blbi1uZXh0L2Fzc2V0cy8gKHNlcnZlZCBieSB3cmFwcGVyKWApO1xuICBjb25zb2xlLmxvZyhgW3NlcnZlXSAgIGhlYWx0aCAgLT4gL19faGVhbHRoYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXJ2ZUNvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnc2VydmUnKVxuICAgIC5kZXNjcmlwdGlvbignU3RhcnQgYSBsb2NhbCBkZXYgc2VydmVyIGZvciBhIGJ1aWx0IE5leHQuanMgcHJvamVjdCcpXG4gICAgLm9wdGlvbignLS1kaXIgPHBhdGg+JywgJ05leHQuanMgcHJvamVjdCBkaXJlY3RvcnknLCAnLicpXG4gICAgLm9wdGlvbignLXAsIC0tcG9ydCA8bnVtYmVyPicsICdQb3J0IG51bWJlcicsICczMDAwJylcbiAgICAub3B0aW9uKCctLWdhdGV3YXkgPHVybD4nLCAnR2F0ZXdheSBVUkwgKGF1dG8taW5qZWN0cyBhdXRoIGVudiB2YXJzKScpXG4gICAgLm9wdGlvbihcbiAgICAgICctLWFwcC1pZCA8aWQ+JyxcbiAgICAgICdBcHAgSUQgZm9yIGdhdGV3YXkgYXV0aCAoZGVmYXVsdDogbG9jYWxfdXNlci9sb2NhbF9hcHApJ1xuICAgIClcbiAgICAub3B0aW9uKFxuICAgICAgJy0tc2VjcmV0IDxzZWNyZXQ+JyxcbiAgICAgICdITUFDIHNlY3JldCBmb3IgRVNBX0NBQ0hFX0dXX0FVVEhfS0VZIChkZWZhdWx0OiBsb2NhbC1kZXYtc2VjcmV0KSdcbiAgICApXG4gICAgLm9wdGlvbihcbiAgICAgICctLXRva2VuIDx0b2tlbj4nLFxuICAgICAgJ1tkZXByZWNhdGVkXSBhbGlhcyBmb3IgLS1zZWNyZXQsIHdpbGwgYmUgcmVtb3ZlZCdcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1blNlcnZlKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgcG9ydDogcGFyc2VJbnQob3B0aW9ucy5wb3J0LCAxMCksXG4gICAgICAgIGdhdGV3YXk6IG9wdGlvbnMuZ2F0ZXdheSxcbiAgICAgICAgYXBwSWQ6IG9wdGlvbnMuYXBwSWQsXG4gICAgICAgIHNlY3JldDogb3B0aW9ucy5zZWNyZXQsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 图片优化代理(FC 内执行)
|
|
3
3
|
*
|
|
4
|
-
* 浏览器 GET /
|
|
4
|
+
* 浏览器 GET /_next/image?url=...&w=...&q=... → ESA → FC(本模块)
|
|
5
5
|
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
6
6
|
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
7
7
|
*
|
|
8
8
|
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
9
|
+
* 拦截 Next 内置的 /_next/image 路由,用户 next.config 无需配 custom loader。
|
|
9
10
|
*/
|
|
10
11
|
/// <reference types="node" />
|
|
11
12
|
import * as http from 'http';
|
|
12
13
|
/**
|
|
13
|
-
* 处理一个 /
|
|
14
|
+
* 处理一个 /_next/image 请求。
|
|
14
15
|
* 由 node-server wrapper 在路径匹配后调用。
|
|
15
16
|
*/
|
|
16
17
|
export declare function handleImageProxy(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* 图片优化代理(FC 内执行)
|
|
4
4
|
*
|
|
5
|
-
* 浏览器 GET /
|
|
5
|
+
* 浏览器 GET /_next/image?url=...&w=...&q=... → ESA → FC(本模块)
|
|
6
6
|
* → 用 gatewayFetch 注入签名 4 header → Gateway /image/optimize
|
|
7
7
|
* → 流式 pipe 响应回浏览器(Cache-Control / ETag / Vary 等头透传)
|
|
8
8
|
*
|
|
9
9
|
* `<img>` 标签发不出自定义 header,由 FC 在这里代发签名请求 —— 这是方案三的核心。
|
|
10
|
+
* 拦截 Next 内置的 /_next/image 路由,用户 next.config 无需配 custom loader。
|
|
10
11
|
*/
|
|
11
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
exports.handleImageProxy = void 0;
|
|
@@ -48,7 +49,7 @@ function writeJson(res, status, body) {
|
|
|
48
49
|
res.end(JSON.stringify(body));
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
* 处理一个 /
|
|
52
|
+
* 处理一个 /_next/image 请求。
|
|
52
53
|
* 由 node-server wrapper 在路径匹配后调用。
|
|
53
54
|
*/
|
|
54
55
|
async function handleImageProxy(req, res) {
|
|
@@ -146,4 +147,4 @@ async function handleImageProxy(req, res) {
|
|
|
146
147
|
}
|
|
147
148
|
}
|
|
148
149
|
exports.handleImageProxy = handleImageProxy;
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUdILG1DQUFrQztBQUNsQyxpREFBcUU7QUFFckUsTUFBTSxrQkFBa0IsR0FBRyxLQUFNLENBQUM7QUFFbEMsNENBQTRDO0FBQzVDLE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsTUFBTTtJQUNOLE1BQU07SUFDTixlQUFlO0lBQ2YseUJBQXlCO0NBQzFCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsTUFBYyxFQUNkLEdBQXlCO0lBRXpCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2pFLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUNULENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUMzRCxPQUFPLENBQUM7SUFDVixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMs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QUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtRQUM3QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVixPQUFPO0tBQ1I7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSTtRQUNGLE1BQU0sVUFBVSxHQUFHLGlCQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFXLENBQUMsQ0FBQztRQUMxRCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWE7Z0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUN0QjtJQUFDLE9BQU8sR0FBUSxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQ3BCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztTQUN2RDthQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNYO0tBQ0Y7QUFDSCxDQUFDO0FBeEdELDRDQXdHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog5Zu+54mH5LyY5YyW5Luj55CG77yIRkMg5YaF5omn6KGM77yJXG4gKlxuICog5rWP6KeI5ZmoIEdFVCAvX3BjZy9pbWFnZS9vcHRpbWl6ZT91cmw9Li4uJnc9Li4uJnE9Li4uIOKGkiBFU0Eg4oaSIEZD77yI5pys5qih5Z2X77yJXG4gKiDihpIg55SoIGdhdGV3YXlGZXRjaCDms6jlhaXnrb7lkI0gNCBoZWFkZXIg4oaSIEdhdGV3YXkgL2ltYWdlL29wdGltaXplXG4gKiDihpIg5rWB5byPIHBpcGUg5ZON5bqU5Zue5rWP6KeI5Zmo77yIQ2FjaGUtQ29udHJvbCAvIEVUYWcgLyBWYXJ5IOetieWktOmAj+S8oO+8iVxuICpcbiAqIGA8aW1nPmAg5qCH562+5Y+R5LiN5Ye66Ieq5a6a5LmJIGhlYWRlcu+8jOeUsSBGQyDlnKjov5nph4zku6Plj5Hnrb7lkI3or7fmsYIg4oCU4oCUIOi/meaYr+aWueahiOS4ieeahOaguOW/g+OAglxuICovXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBsb2FkR2F0ZXdheUF1dGhDb25maWcsIGdhdGV3YXlGZXRjaCB9IGZyb20gJy4vZ2F0ZXdheS1hdXRoJztcblxuY29uc3QgR0FURVdBWV9USU1FT1VUX01TID0gMTBfMDAwO1xuXG4vKiog6YCP5Lyg57uZ5rWP6KeI5Zmo55qE5ZON5bqU5aS055m95ZCN5Y2V77yI6YG/5YWN5rOE6ZyyIEdhdGV3YXkg5YaF6YOoIGhlYWRlcu+8iSAqL1xuY29uc3QgUEFTU1RIUk9VR0hfSEVBREVSUyA9IFtcbiAgJ2NvbnRlbnQtdHlwZScsXG4gICdjb250ZW50LWxlbmd0aCcsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2V0YWcnLFxuICAndmFyeScsXG4gICdsYXN0LW1vZGlmaWVkJyxcbiAgJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5Jyxcbl07XG5cbi8qKlxuICog5oqK6K+35rGCIFVSTCDkuK3nmoQgYHVybD1gIOWPguaVsOagh+WHhuWMluaIkOe7neWvuSBVUkzjgIJcbiAqIC0g5bey57uP5pivIGh0dHAocyk6Ly8g4oaSIOWOn+agt1xuICogLSDlkKbliJnnlKggYCR7cHJvdG99Oi8vJHtob3N0fSR7dXJsfWAg5ou85o6l77yMcHJvdG8g5Y+WIHgtZm9yd2FyZGVkLXByb3Rv77yM5ZCm5YiZIGh0dHBzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBYnNvbHV0ZVVybChcbiAgcmF3VXJsOiBzdHJpbmcsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCByYXdVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgIHJldHVybiByYXdVcmw7XG4gIH1cbiAgY29uc3QgaG9zdCA9IHJlcS5oZWFkZXJzWydob3N0J107XG4gIGlmICghaG9zdCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByb3RvSGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLXByb3RvJ107XG4gIGNvbnN0IHByb3RvID1cbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgIChBcnJheS5pc0FycmF5KHByb3RvSGVhZGVyKSA/IHByb3RvSGVhZGVyWzBdIDogcHJvdG9IZWFkZXIpIHx8XG4gICAgJ2h0dHBzJztcbiAgY29uc3QgcGF0aCA9IHJhd1VybC5zdGFydHNXaXRoKCcvJykgPyByYXdVcmwgOiBgLyR7cmF3VXJsfWA7XG4gIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9JHtwYXRofWA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSnNvbihyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHN0YXR1czogbnVtYmVyLCBib2R5OiBhbnkpOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xufVxuXG4vKipcbiAqIOWkhOeQhuS4gOS4qiAvX3BjZy9pbWFnZS9vcHRpbWl6ZSDor7fmsYLjgIJcbiAqIOeUsSBub2RlLXNlcnZlciB3cmFwcGVyIOWcqOi3r+W+hOWMuemFjeWQjuiwg+eUqOOAglxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW1hZ2VQcm94eShcbiAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8g6Kej5p6QIHF1ZXJ5XG4gIGNvbnN0IHJlcVVybCA9IHJlcS51cmwgfHwgJyc7XG4gIGNvbnN0IHFJZHggPSByZXFVcmwuaW5kZXhPZignPycpO1xuICBpZiAocUlkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNDAwLCB7IGVycm9yOiAnTWlzc2luZyBxdWVyeSBwYXJhbWV0ZXJzJyB9KTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHJlcVVybC5zbGljZShxSWR4ICsgMSkpO1xuICBjb25zdCByYXdVcmwgPSBwYXJhbXMuZ2V0KCd1cmwnKTtcbiAgY29uc3QgdyA9IHBhcmFtcy5nZXQoJ3cnKTtcbiAgY29uc3QgcSA9IHBhcmFtcy5nZXQoJ3EnKTtcblxuICBpZiAoIXJhd1VybCB8fCAhdykge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA0MDAsIHtcbiAgICAgIGVycm9yOiAnTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzOiB1cmwsIHcnLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5qCH5YeG5YyWIHVybCDlj4LmlbDkuLrnu53lr7kgVVJMXG4gIGNvbnN0IGFic29sdXRlVXJsID0gcmVzb2x2ZUFic29sdXRlVXJsKHJhd1VybCwgcmVxKTtcbiAgaWYgKCFhYnNvbHV0ZVVybCkge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDAsIHtcbiAgICAgIGVycm9yOiAnQ2Fubm90IHJlc29sdmUgYWJzb2x1dGUgVVJMOiBtaXNzaW5nIEhvc3QgaGVhZGVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOWKoOi9veetvuWQjemFjee9rlxuICBjb25zdCBjZmcgPSBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTtcbiAgaWYgKCFjZmcpIHtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAwLCB7XG4gICAgICBlcnJvcjogJ0dhdGV3YXkgYXV0aCBjb25maWcgbWlzc2luZycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmnoTpgKAgR2F0ZXdheSDor7fmsYLot6/lvoRcbiAgY29uc3QgdXBzdHJlYW1QYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgdXJsOiBhYnNvbHV0ZVVybCwgdyB9KTtcbiAgaWYgKHEpIHVwc3RyZWFtUGFyYW1zLnNldCgncScsIHEpO1xuICBjb25zdCB1cHN0cmVhbVBhdGggPSBgL2ltYWdlL29wdGltaXplPyR7dXBzdHJlYW1QYXJhbXN9YDtcblxuICAvLyDpgI/kvKAgSWYtTm9uZS1NYXRjaCDorqkgR2F0ZXdheSDotbAgMzA0XG4gIGNvbnN0IGlmTm9uZU1hdGNoID0gcmVxLmhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXTtcbiAgY29uc3QgdXBzdHJlYW1IZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGlmICh0eXBlb2YgaWZOb25lTWF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgdXBzdHJlYW1IZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPSBpZk5vbmVNYXRjaDtcbiAgfVxuICBjb25zdCBhY2NlcHQgPSByZXEuaGVhZGVyc1snYWNjZXB0J107XG4gIGlmICh0eXBlb2YgYWNjZXB0ID09PSAnc3RyaW5nJykge1xuICAgIHVwc3RyZWFtSGVhZGVyc1snYWNjZXB0J10gPSBhY2NlcHQ7XG4gIH1cblxuICBsZXQgdXBzdHJlYW06IFJlc3BvbnNlO1xuICB0cnkge1xuICAgIHVwc3RyZWFtID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNmZywgdXBzdHJlYW1QYXRoLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczogdXBzdHJlYW1IZWFkZXJzLFxuICAgICAgdGltZW91dE1zOiBHQVRFV0FZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtpbWFnZS1wcm94eV0gR2F0ZXdheSB0aW1lb3V0IGFmdGVyICR7R0FURVdBWV9USU1FT1VUX01TfW1zOiAke2Fic29sdXRlVXJsfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTA0LCB7IGVycm9yOiAnVXBzdHJlYW0gdGltZW91dCcgfSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbaW1hZ2UtcHJveHldIEdhdGV3YXkgZmV0Y2ggZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh1cmw9JHthYnNvbHV0ZVVybH0pYFxuICAgICk7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMiwgeyBlcnJvcjogJ0JhZCBnYXRld2F5JyB9KTtcbiAgfVxuXG4gIC8vIOmAj+S8oOeKtuaAgeeggSArIOeZveWQjeWNlSBoZWFkZXJcbiAgcmVzLnN0YXR1c0NvZGUgPSB1cHN0cmVhbS5zdGF0dXM7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBQQVNTVEhST1VHSF9IRUFERVJTKSB7XG4gICAgY29uc3QgdmFsdWUgPSB1cHN0cmVhbS5oZWFkZXJzLmdldChuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIDMwNCAvIOaXoCBib2R5IOebtOaOpee7k+adn1xuICBpZiAodXBzdHJlYW0uc3RhdHVzID09PSAzMDQgfHwgIXVwc3RyZWFtLmJvZHkpIHtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g5rWB5byPIHBpcGXvvIjpgb/lhY3lpKflm74gYnVmZmVyIOWNoOWGheWtmO+8iVxuICB0cnkge1xuICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tV2ViKHVwc3RyZWFtLmJvZHkgYXMgYW55KTtcbiAgICBub2RlU3RyZWFtLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oYFtpbWFnZS1wcm94eV0gU3RyZWFtIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkgcmVzLmVuZCgpO1xuICAgIH0pO1xuICAgIG5vZGVTdHJlYW0ucGlwZShyZXMpO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUud2FybihgW2ltYWdlLXByb3h5XSBQaXBlIHNldHVwIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgd3JpdGVKc29uKHJlcywgNTAyLCB7IGVycm9yOiAnU3RyZWFtIHNldHVwIGZhaWxlZCcgfSk7XG4gICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFHSCxtQ0FBa0M7QUFDbEMsaURBQXFFO0FBRXJFLE1BQU0sa0JBQWtCLEdBQUcsS0FBTSxDQUFDO0FBRWxDLDRDQUE0QztBQUM1QyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLE1BQU07SUFDTixNQUFNO0lBQ04sZUFBZTtJQUNmLHlCQUF5QjtDQUMxQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLE1BQWMsRUFDZCxHQUF5QjtJQUV6QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqRSxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0QsT0FBTyxDQUFDO0lBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFD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SUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDN0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1YsT0FBTztLQUNSO0lBRUQsMkJBQTJCO0lBQzNCLElBQUk7UUFDRixNQUFNLFVBQVUsR0FBRyxpQkFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBVyxDQUFDLENBQUM7UUFDMUQsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhO2dCQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEI7SUFBQyxPQUFPLEdBQVEsRUFBRTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUNwQixTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDdkQ7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUM3QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDWDtLQUNGO0FBQ0gsQ0FBQztBQXhHRCw0Q0F3R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOWbvueJh+S8mOWMluS7o+eQhu+8iEZDIOWGheaJp+ihjO+8iVxuICpcbiAqIOa1j+iniOWZqCBHRVQgL19uZXh0L2ltYWdlP3VybD0uLi4mdz0uLi4mcT0uLi4g4oaSIEVTQSDihpIgRkPvvIjmnKzmqKHlnZfvvIlcbiAqIOKGkiDnlKggZ2F0ZXdheUZldGNoIOazqOWFpeetvuWQjSA0IGhlYWRlciDihpIgR2F0ZXdheSAvaW1hZ2Uvb3B0aW1pemVcbiAqIOKGkiDmtYHlvI8gcGlwZSDlk43lupTlm57mtY/op4jlmajvvIhDYWNoZS1Db250cm9sIC8gRVRhZyAvIFZhcnkg562J5aS06YCP5Lyg77yJXG4gKlxuICogYDxpbWc+YCDmoIfnrb7lj5HkuI3lh7roh6rlrprkuYkgaGVhZGVy77yM55SxIEZDIOWcqOi/memHjOS7o+WPkeetvuWQjeivt+axgiDigJTigJQg6L+Z5piv5pa55qGI5LiJ55qE5qC45b+D44CCXG4gKiDmi6bmiKogTmV4dCDlhoXnva7nmoQgL19uZXh0L2ltYWdlIOi3r+eUsSznlKjmiLcgbmV4dC5jb25maWcg5peg6ZyA6YWNIGN1c3RvbSBsb2FkZXLjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLCBnYXRld2F5RmV0Y2ggfSBmcm9tICcuL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IEdBVEVXQVlfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuLyoqIOmAj+S8oOe7mea1j+iniOWZqOeahOWTjeW6lOWktOeZveWQjeWNle+8iOmBv+WFjeazhOmcsiBHYXRld2F5IOWGhemDqCBoZWFkZXLvvIkgKi9cbmNvbnN0IFBBU1NUSFJPVUdIX0hFQURFUlMgPSBbXG4gICdjb250ZW50LXR5cGUnLFxuICAnY29udGVudC1sZW5ndGgnLFxuICAnY2FjaGUtY29udHJvbCcsXG4gICdldGFnJyxcbiAgJ3ZhcnknLFxuICAnbGFzdC1tb2RpZmllZCcsXG4gICdjb250ZW50LXNlY3VyaXR5LXBvbGljeScsXG5dO1xuXG4vKipcbiAqIOaKiuivt+axgiBVUkwg5Lit55qEIGB1cmw9YCDlj4LmlbDmoIflh4bljJbmiJDnu53lr7kgVVJM44CCXG4gKiAtIOW3sue7j+aYryBodHRwKHMpOi8vIOKGkiDljp/moLdcbiAqIC0g5ZCm5YiZ55SoIGAke3Byb3RvfTovLyR7aG9zdH0ke3VybH1gIOaLvOaOpe+8jHByb3RvIOWPliB4LWZvcndhcmRlZC1wcm90b++8jOWQpuWImSBodHRwc1xuICovXG5mdW5jdGlvbiByZXNvbHZlQWJzb2x1dGVVcmwoXG4gIHJhd1VybDogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHJhd1VybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcmF3VXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICByZXR1cm4gcmF3VXJsO1xuICB9XG4gIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVyc1snaG9zdCddO1xuICBpZiAoIWhvc3QpIHJldHVybiBudWxsO1xuICBjb25zdCBwcm90b0hlYWRlciA9IHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1wcm90byddO1xuICBjb25zdCBwcm90byA9XG4gICAgKEFycmF5LmlzQXJyYXkocHJvdG9IZWFkZXIpID8gcHJvdG9IZWFkZXJbMF0gOiBwcm90b0hlYWRlcikgfHxcbiAgICAoQXJyYXkuaXNBcnJheShwcm90b0hlYWRlcikgPyBwcm90b0hlYWRlclswXSA6IHByb3RvSGVhZGVyKSB8fFxuICAgICdodHRwcyc7XG4gIGNvbnN0IHBhdGggPSByYXdVcmwuc3RhcnRzV2l0aCgnLycpID8gcmF3VXJsIDogYC8ke3Jhd1VybH1gO1xuICByZXR1cm4gYCR7cHJvdG99Oi8vJHtob3N0fSR7cGF0aH1gO1xufVxuXG5mdW5jdGlvbiB3cml0ZUpzb24ocmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLCBzdGF0dXM6IG51bWJlciwgYm9keTogYW55KTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xuICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbn1cblxuLyoqXG4gKiDlpITnkIbkuIDkuKogL19uZXh0L2ltYWdlIOivt+axguOAglxuICog55SxIG5vZGUtc2VydmVyIHdyYXBwZXIg5Zyo6Lev5b6E5Yy56YWN5ZCO6LCD55So44CCXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVJbWFnZVByb3h5KFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyDop6PmnpAgcXVlcnlcbiAgY29uc3QgcmVxVXJsID0gcmVxLnVybCB8fCAnJztcbiAgY29uc3QgcUlkeCA9IHJlcVVybC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxSWR4ID09PSAtMSkge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA0MDAsIHsgZXJyb3I6ICdNaXNzaW5nIHF1ZXJ5IHBhcmFtZXRlcnMnIH0pO1xuICB9XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocmVxVXJsLnNsaWNlKHFJZHggKyAxKSk7XG4gIGNvbnN0IHJhd1VybCA9IHBhcmFtcy5nZXQoJ3VybCcpO1xuICBjb25zdCB3ID0gcGFyYW1zLmdldCgndycpO1xuICBjb25zdCBxID0gcGFyYW1zLmdldCgncScpO1xuXG4gIGlmICghcmF3VXJsIHx8ICF3KSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDQwMCwge1xuICAgICAgZXJyb3I6ICdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnM6IHVybCwgdycsXG4gICAgfSk7XG4gIH1cblxuICAvLyDmoIflh4bljJYgdXJsIOWPguaVsOS4uue7neWvuSBVUkxcbiAgY29uc3QgYWJzb2x1dGVVcmwgPSByZXNvbHZlQWJzb2x1dGVVcmwocmF3VXJsLCByZXEpO1xuICBpZiAoIWFic29sdXRlVXJsKSB7XG4gICAgcmV0dXJuIHdyaXRlSnNvbihyZXMsIDUwMCwge1xuICAgICAgZXJyb3I6ICdDYW5ub3QgcmVzb2x2ZSBhYnNvbHV0ZSBVUkw6IG1pc3NpbmcgSG9zdCBoZWFkZXInLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g5Yqg6L29562+5ZCN6YWN572uXG4gIGNvbnN0IGNmZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWNmZykge1xuICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDAsIHtcbiAgICAgIGVycm9yOiAnR2F0ZXdheSBhdXRoIGNvbmZpZyBtaXNzaW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOaehOmAoCBHYXRld2F5IOivt+axgui3r+W+hFxuICBjb25zdCB1cHN0cmVhbVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB1cmw6IGFic29sdXRlVXJsLCB3IH0pO1xuICBpZiAocSkgdXBzdHJlYW1QYXJhbXMuc2V0KCdxJywgcSk7XG4gIGNvbnN0IHVwc3RyZWFtUGF0aCA9IGAvaW1hZ2Uvb3B0aW1pemU/JHt1cHN0cmVhbVBhcmFtc31gO1xuXG4gIC8vIOmAj+S8oCBJZi1Ob25lLU1hdGNoIOiuqSBHYXRld2F5IOi1sCAzMDRcbiAgY29uc3QgaWZOb25lTWF0Y2ggPSByZXEuaGVhZGVyc1snaWYtbm9uZS1tYXRjaCddO1xuICBjb25zdCB1cHN0cmVhbUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKHR5cGVvZiBpZk5vbmVNYXRjaCA9PT0gJ3N0cmluZycpIHtcbiAgICB1cHN0cmVhbUhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXSA9IGlmTm9uZU1hdGNoO1xuICB9XG4gIGNvbnN0IGFjY2VwdCA9IHJlcS5oZWFkZXJzWydhY2NlcHQnXTtcbiAgaWYgKHR5cGVvZiBhY2NlcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgdXBzdHJlYW1IZWFkZXJzWydhY2NlcHQnXSA9IGFjY2VwdDtcbiAgfVxuXG4gIGxldCB1cHN0cmVhbTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgdXBzdHJlYW0gPSBhd2FpdCBnYXRld2F5RmV0Y2goY2ZnLCB1cHN0cmVhbVBhdGgsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB1cHN0cmVhbUhlYWRlcnMsXG4gICAgICB0aW1lb3V0TXM6IEdBVEVXQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2ltYWdlLXByb3h5XSBHYXRld2F5IHRpbWVvdXQgYWZ0ZXIgJHtHQVRFV0FZX1RJTUVPVVRfTVN9bXM6ICR7YWJzb2x1dGVVcmx9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiB3cml0ZUpzb24ocmVzLCA1MDQsIHsgZXJyb3I6ICdVcHN0cmVhbSB0aW1lb3V0JyB9KTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtpbWFnZS1wcm94eV0gR2F0ZXdheSBmZXRjaCBlcnJvcjogJHtlcnIubWVzc2FnZX0gKHVybD0ke2Fic29sdXRlVXJsfSlgXG4gICAgKTtcbiAgICByZXR1cm4gd3JpdGVKc29uKHJlcywgNTAyLCB7IGVycm9yOiAnQmFkIGdhdGV3YXknIH0pO1xuICB9XG5cbiAgLy8g6YCP5Lyg54q25oCB56CBICsg55m95ZCN5Y2VIGhlYWRlclxuICByZXMuc3RhdHVzQ29kZSA9IHVwc3RyZWFtLnN0YXR1cztcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBBU1NUSFJPVUdIX0hFQURFUlMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHVwc3RyZWFtLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmVzLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMzA0IC8g5pegIGJvZHkg55u05o6l57uT5p2fXG4gIGlmICh1cHN0cmVhbS5zdGF0dXMgPT09IDMwNCB8fCAhdXBzdHJlYW0uYm9keSkge1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDmtYHlvI8gcGlwZe+8iOmBv+WFjeWkp+WbviBidWZmZXIg5Y2g5YaF5a2Y77yJXG4gIHRyeSB7XG4gICAgY29uc3Qgbm9kZVN0cmVhbSA9IFJlYWRhYmxlLmZyb21XZWIodXBzdHJlYW0uYm9keSBhcyBhbnkpO1xuICAgIG5vZGVTdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihgW2ltYWdlLXByb3h5XSBTdHJlYW0gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSByZXMuZW5kKCk7XG4gICAgfSk7XG4gICAgbm9kZVN0cmVhbS5waXBlKHJlcyk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS53YXJuKGBbaW1hZ2UtcHJveHldIFBpcGUgc2V0dXAgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICB3cml0ZUpzb24ocmVzLCA1MDIsIHsgZXJyb3I6ICdTdHJlYW0gc2V0dXAgZmFpbGVkJyB9KTtcbiAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "esa-pcg-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"next",
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
22
|
-
"runtime",
|
|
23
22
|
"README.md",
|
|
24
23
|
"LICENSE"
|
|
25
24
|
],
|
|
@@ -29,19 +28,17 @@
|
|
|
29
28
|
"test": "jest --config jest.config.js"
|
|
30
29
|
},
|
|
31
30
|
"dependencies": {
|
|
31
|
+
"@opennextjs/aws": "^3.10.4",
|
|
32
32
|
"ali-oss": "^6.23.0",
|
|
33
33
|
"commander": "^12.0.0"
|
|
34
34
|
},
|
|
35
|
-
"peerDependencies": {
|
|
36
|
-
"@opennextjs/aws": "^3.10.4"
|
|
37
|
-
},
|
|
38
35
|
"devDependencies": {
|
|
39
|
-
"@opennextjs/aws": "^3.10.4",
|
|
40
36
|
"@types/ali-oss": "^6.23.3",
|
|
41
37
|
"@types/jest": "^29.2.0",
|
|
42
38
|
"esbuild": "^0.25.4",
|
|
43
39
|
"jest": "^29.2.2",
|
|
44
40
|
"ts-jest": "^29.0.3",
|
|
45
41
|
"typescript": "~4.8.0"
|
|
46
|
-
}
|
|
42
|
+
},
|
|
43
|
+
"repository": "git@gitlab.alibaba-inc.com:edge-routine-tools/pages-cache-gateway.git"
|
|
47
44
|
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// Shipped with esa-pcg-cli. `pcg build` copies this file into
|
|
2
|
-
// <projectDir>/node_modules/.pcg/, so next.config can reference it as
|
|
3
|
-
// 'node_modules/.pcg/pcg-image-loader.js' without writing into the user's
|
|
4
|
-
// source tree and without declaring esa-pcg-cli in package.json.
|
|
5
|
-
// 图片请求走同域 /_pcg/image/optimize,由 FC 内的 wrapper 拦截后用签名 client 调 Gateway。
|
|
6
|
-
export default function pcgImageLoader({ src, width, quality }) {
|
|
7
|
-
const params = new URLSearchParams({
|
|
8
|
-
url: src,
|
|
9
|
-
w: String(width),
|
|
10
|
-
q: String(quality || 75),
|
|
11
|
-
});
|
|
12
|
-
return `/_pcg/image/optimize?${params}`;
|
|
13
|
-
}
|