@astris-labs/cli 0.1.3 → 0.2.0

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/src/main.mjs CHANGED
@@ -4,7 +4,9 @@ import { createInterface } from "node:readline";
4
4
  import { Writable } from "node:stream";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { DEFAULT_BASE_URL } from "./client.mjs";
7
- import { accountExport, app, compose, database, deploy, diagnose, domains, env, list, login, logout, logs, next, plans, preflight, restart, rollback, status, storage, usage, whoami } from "./commands.mjs";
7
+ import { mcp } from "./mcp-bridge.mjs";
8
+ import { newProject } from "./new.mjs";
9
+ import { accountExport, app, billing, compose, database, deploy, diagnose, domains, env, list, login, logout, logs, next, plans, preflight, project, restart, rollback, status, storage, usage, whoami } from "./commands.mjs";
8
10
 
9
11
  const PROMPT = "Paste your Astris API key: ";
10
12
 
@@ -54,8 +56,10 @@ const handlers = new Map([
54
56
  ["restart", restart],
55
57
  ["logs", logs],
56
58
  ["list", list],
59
+ ["project", project],
57
60
  ["usage", usage],
58
61
  ["plans", plans],
62
+ ["billing", billing],
59
63
  ["whoami", whoami],
60
64
  ["next", next],
61
65
  ["rollback", rollback],
@@ -64,6 +68,8 @@ const handlers = new Map([
64
68
  ["app", app],
65
69
  ["preflight", preflight],
66
70
  ["export", accountExport],
71
+ ["mcp", mcp],
72
+ ["new", newProject],
67
73
  ]);
68
74
 
69
75
  export const COMMANDS = [...handlers.keys()];
@@ -92,6 +98,7 @@ async function readStdin() {
92
98
 
93
99
  if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
94
100
  const isEnvWithoutNames = process.argv[2] === "env" && !process.argv.slice(3).includes("--names");
101
+ const isMcp = process.argv[2] === "mcp";
95
102
  const stdin = (isEnvWithoutNames || process.argv[2] === "login") && !process.stdin.isTTY ? await readStdin() : "";
96
103
  const io = {
97
104
  env: process.env,
@@ -100,7 +107,10 @@ if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToP
100
107
  stdin,
101
108
  stdout: process.stdout,
102
109
  stderr: process.stderr,
110
+ cwd: process.cwd(),
111
+ templatesFile: fileURLToPath(new URL("../templates.json", import.meta.url)),
103
112
  };
113
+ if (isMcp) io.stdin = process.stdin;
104
114
  if (process.argv[2] === "login" && process.stdin.isTTY) io.readSecret = readSecret;
105
115
  const code = await main(process.argv, io);
106
116
  process.exit(code);
@@ -0,0 +1,186 @@
1
+ import { createInterface } from "node:readline";
2
+ import { DEFAULT_BASE_URL, redact } from "./client.mjs";
3
+ import { readApiKey } from "./key.mjs";
4
+
5
+ // The SDK server answers 406 to a POST that does not list both media types.
6
+ const MCP_ACCEPT = "application/json, text/event-stream";
7
+
8
+ export async function mcp(_args, io) {
9
+ let key;
10
+ try {
11
+ key = readApiKey(io.env);
12
+ } catch {
13
+ io.stderr.write("Run astris login.\n");
14
+ return { exitCode: 1 };
15
+ }
16
+
17
+ const rl = createInterface({ input: io.stdin, crlfDelay: Infinity });
18
+ let readFailed = false;
19
+ const onReadError = () => {
20
+ readFailed = true;
21
+ rl.close();
22
+ };
23
+ io.stdin.on("error", onReadError);
24
+ rl.on("error", onReadError);
25
+
26
+ try {
27
+ for await (const line of rl) {
28
+ if (line.trim() === "") {
29
+ continue;
30
+ }
31
+
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(line);
35
+ } catch {
36
+ io.stdout.write(
37
+ redact(
38
+ JSON.stringify({
39
+ jsonrpc: "2.0",
40
+ id: null,
41
+ error: { code: -32700, message: "Parse error" },
42
+ }) + "\n",
43
+ key,
44
+ ),
45
+ );
46
+ continue;
47
+ }
48
+
49
+ const isPlainObject = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed);
50
+ const isNotification = isPlainObject && !Object.hasOwn(parsed, "id");
51
+
52
+ if (isNotification) {
53
+ try {
54
+ const response = await io.fetchImpl(DEFAULT_BASE_URL + "/mcp", {
55
+ method: "POST",
56
+ redirect: "manual",
57
+ headers: {
58
+ Authorization: "Bearer " + key,
59
+ "content-type": "application/json",
60
+ accept: MCP_ACCEPT,
61
+ },
62
+ body: line,
63
+ });
64
+
65
+ if (response.status === 401) {
66
+ io.stderr.write("Run astris login.\n");
67
+ } else if (response.status !== 202) {
68
+ io.stderr.write("A notification was refused.\n");
69
+ }
70
+ } catch {
71
+ io.stderr.write("The request failed.\n");
72
+ }
73
+ continue;
74
+ }
75
+
76
+ const requestId =
77
+ isPlainObject &&
78
+ (typeof parsed.id === "string" || typeof parsed.id === "number" || parsed.id === null)
79
+ ? parsed.id
80
+ : null;
81
+
82
+ try {
83
+ const response = await io.fetchImpl(DEFAULT_BASE_URL + "/mcp", {
84
+ method: "POST",
85
+ redirect: "manual",
86
+ headers: {
87
+ Authorization: "Bearer " + key,
88
+ "content-type": "application/json",
89
+ accept: MCP_ACCEPT,
90
+ },
91
+ body: line,
92
+ });
93
+
94
+ // The server answers JSON. A stream could stay open, so refuse it before reading the body.
95
+ if ((response.headers.get("content-type") ?? "").toLowerCase().includes("text/event-stream")) {
96
+ await response.body?.cancel();
97
+ io.stdout.write(
98
+ redact(
99
+ JSON.stringify({
100
+ jsonrpc: "2.0",
101
+ id: requestId,
102
+ error: { code: -32603, message: "Internal error" },
103
+ }) + "\n",
104
+ key,
105
+ ),
106
+ );
107
+ io.stderr.write("The request failed.\n");
108
+ continue;
109
+ }
110
+
111
+ const text = await response.text();
112
+
113
+ if (response.status === 401) {
114
+ io.stderr.write("Run astris login.\n");
115
+ if (text !== "") {
116
+ try {
117
+ const parsed_body = JSON.parse(text);
118
+ if (typeof parsed_body === "object" && parsed_body !== null) {
119
+ io.stdout.write(redact(JSON.stringify(parsed_body) + "\n", key));
120
+ continue;
121
+ }
122
+ } catch {
123
+ // Fall through to synthesized error
124
+ }
125
+ }
126
+ io.stdout.write(
127
+ redact(
128
+ JSON.stringify({
129
+ jsonrpc: "2.0",
130
+ id: requestId,
131
+ error: { code: -32001, message: "Unauthorized" },
132
+ }) + "\n",
133
+ key,
134
+ ),
135
+ );
136
+ continue;
137
+ }
138
+
139
+ if (text !== "") {
140
+ try {
141
+ const parsed_body = JSON.parse(text);
142
+ io.stdout.write(redact(JSON.stringify(parsed_body) + "\n", key));
143
+ continue;
144
+ } catch {
145
+ // Fall through to error handling
146
+ }
147
+ }
148
+
149
+ io.stdout.write(
150
+ redact(
151
+ JSON.stringify({
152
+ jsonrpc: "2.0",
153
+ id: requestId,
154
+ error: { code: -32603, message: "Internal error" },
155
+ }) + "\n",
156
+ key,
157
+ ),
158
+ );
159
+ io.stderr.write("The request failed.\n");
160
+ } catch {
161
+ io.stdout.write(
162
+ redact(
163
+ JSON.stringify({
164
+ jsonrpc: "2.0",
165
+ id: requestId,
166
+ error: { code: -32603, message: "Internal error" },
167
+ }) + "\n",
168
+ key,
169
+ ),
170
+ );
171
+ io.stderr.write("The request failed.\n");
172
+ }
173
+ }
174
+ } catch {
175
+ readFailed = true;
176
+ } finally {
177
+ io.stdin.removeListener("error", onReadError);
178
+ rl.removeListener("error", onReadError);
179
+ rl.close();
180
+ }
181
+
182
+ if (readFailed) {
183
+ io.stderr.write("Could not read the next line.\n");
184
+ }
185
+ return { exitCode: 0 };
186
+ }
package/src/new.mjs ADDED
@@ -0,0 +1,159 @@
1
+ import { lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const SENTENCE = {
6
+ refused: "Those arguments were refused. Check the flags and send them again.",
7
+ notEmpty: "That directory is not empty. Choose a new or empty directory.",
8
+ noBundle: "This install has no templates. Run the CLI from npm: npx @astris-labs/cli new <template>.",
9
+ damaged: "The templates in this install are damaged. Install the CLI again.",
10
+ };
11
+
12
+ const NAME = /^[a-z0-9][a-z0-9-]*$/;
13
+
14
+ // One row per template on main: the database it needs (or null) and the
15
+ // apps it deploys, each with its name and its extra deploy flags. A new
16
+ // template adds its row here (T-556).
17
+ const DOCKERFILE = " --build dockerfile --dockerfile Dockerfile";
18
+ export const NEXT_STEPS = new Map([
19
+ ["fastapi-postgres", { database: "postgres", apps: [{ name: "<name>", flags: "" }] }],
20
+ ["go-dockerfile", { database: null, apps: [{ name: "<name>", flags: DOCKERFILE }] }],
21
+ ["nextjs-postgres", { database: "postgres", apps: [{ name: "<name>", flags: DOCKERFILE }] }],
22
+ [
23
+ "node-worker-cron",
24
+ {
25
+ database: "postgres",
26
+ apps: [
27
+ { name: "<name>-worker", id: "<worker app id>", flags: ' --kind worker --command "node worker.mjs"' },
28
+ { name: "<name>-cron", id: "<cron app id>", flags: ' --kind cron --command "node heartbeat.mjs" --schedule "*/5 * * * *"' },
29
+ ],
30
+ },
31
+ ],
32
+ ]);
33
+
34
+ // Reads templates/<name>/ into { name: { files: [{ path, exec, body }] } },
35
+ // bodies in base64. npm drops nested .gitignore and .npmrc files from a
36
+ // tarball, so the templates travel as this one JSON file (T-556).
37
+ export function bundleTemplates(dir) {
38
+ let names;
39
+ try {
40
+ names = readdirSync(dir).sort();
41
+ } catch {
42
+ throw new Error(`templates folder not found: ${dir}`);
43
+ }
44
+ const bundle = {};
45
+ for (const name of names) {
46
+ if (!lstatSync(path.join(dir, name)).isDirectory()) throw new Error(`not a directory: ${name}`);
47
+ const files = [];
48
+ const walk = (rel) => {
49
+ for (const entry of readdirSync(path.join(dir, name, rel)).sort()) {
50
+ const relPath = rel === "" ? entry : `${rel}/${entry}`;
51
+ const st = lstatSync(path.join(dir, name, relPath));
52
+ if (st.isDirectory()) walk(relPath);
53
+ else if (st.isFile()) files.push({ path: relPath, exec: (st.mode & 0o111) !== 0, body: readFileSync(path.join(dir, name, relPath)).toString("base64") });
54
+ else throw new Error(`not a file or a directory: ${name}/${relPath}`);
55
+ }
56
+ };
57
+ walk("");
58
+ bundle[name] = { files };
59
+ }
60
+ return bundle;
61
+ }
62
+
63
+ function safePath(value) {
64
+ if (typeof value !== "string" || value === "" || value.includes("\\") || value.startsWith("/") || /^[A-Za-z]:/.test(value)) return false;
65
+ return value.split("/").every((segment) => segment !== "" && segment !== "." && segment !== "..");
66
+ }
67
+
68
+ function validFiles(template) {
69
+ const files = template?.files;
70
+ if (!Array.isArray(files)) return null;
71
+ const seen = new Set();
72
+ for (const file of files) {
73
+ if (!safePath(file?.path) || typeof file.body !== "string" || typeof file.exec !== "boolean") return null;
74
+ seen.add(file.path);
75
+ }
76
+ // Two entries that clash (the same path twice, or "a" beside "a/b") would
77
+ // fail half way through the writes, so they are refused before the first.
78
+ if (seen.size !== files.length) return null;
79
+ for (const file of files) {
80
+ const parts = file.path.split("/");
81
+ for (let i = 1; i < parts.length; i++) if (seen.has(parts.slice(0, i).join("/"))) return null;
82
+ }
83
+ return files;
84
+ }
85
+
86
+ function nextSteps(name) {
87
+ const row = NEXT_STEPS.get(name) ?? { database: null, apps: [{ name: "<name>", flags: "" }] };
88
+ const lines = ["Next:", "1. Push this folder to a Git repository of your own."];
89
+ for (const app of row.apps) {
90
+ lines.push(`${lines.length}. astris deploy --project <project name> --name ${app.name} --git-url <repository URL> --branch main${app.flags}`);
91
+ }
92
+ if (row.database !== null) {
93
+ lines.push(`${lines.length}. astris database create --project <project id> --kind ${row.database} --name <name>-db`, " Build DATABASE_URL from its answer. Astris shows the password only once.");
94
+ for (const app of row.apps) {
95
+ const id = app.id ?? "<app id>";
96
+ lines.push(`${lines.length - 1}. Set DATABASE_URL with astris env --app ${id}, then run astris deploy --app ${id}.`);
97
+ }
98
+ lines.push(" astris env replaces every variable on the app, so send all of them in one call.");
99
+ }
100
+ return lines.join("\n");
101
+ }
102
+
103
+ function refuse(io, sentence) {
104
+ io.stderr.write(`${sentence}\n`);
105
+ return { exitCode: 1 };
106
+ }
107
+
108
+ // astris new <template> [dir]: writes one bundled template into a new or
109
+ // empty directory. Local only: no key, no request.
110
+ export async function newProject(args, io) {
111
+ if (args.length > 2 || args.some((word) => word.startsWith("-"))) return refuse(io, SENTENCE.refused);
112
+ let bundle;
113
+ try {
114
+ bundle = JSON.parse(readFileSync(io.templatesFile, "utf8"));
115
+ } catch (error) {
116
+ return refuse(io, error?.code === "ENOENT" ? SENTENCE.noBundle : SENTENCE.damaged);
117
+ }
118
+ if (bundle === null || typeof bundle !== "object" || Array.isArray(bundle)) return refuse(io, SENTENCE.damaged);
119
+ const names = Object.keys(bundle).filter((key) => NAME.test(key)).sort();
120
+ const [name, dirArg] = args;
121
+ if (name === undefined || !NAME.test(name) || !Object.hasOwn(bundle, name)) {
122
+ return refuse(io, `Name one of these templates: ${names.join(", ")}.`);
123
+ }
124
+ const files = validFiles(bundle[name]);
125
+ if (files === null) return refuse(io, SENTENCE.damaged);
126
+
127
+ const shown = dirArg ?? name;
128
+ const target = path.resolve(io.cwd ?? process.cwd(), shown);
129
+ let st = null;
130
+ try {
131
+ st = lstatSync(target);
132
+ } catch {
133
+ st = null;
134
+ }
135
+ if (st !== null && (!st.isDirectory() || readdirSync(target).length > 0)) return refuse(io, SENTENCE.notEmpty);
136
+ mkdirSync(target, { recursive: true });
137
+ for (const file of files) {
138
+ const dest = path.join(target, ...file.path.split("/"));
139
+ mkdirSync(path.dirname(dest), { recursive: true });
140
+ writeFileSync(dest, Buffer.from(file.body, "base64"), { flag: "wx", mode: file.exec ? 0o755 : 0o644 });
141
+ }
142
+ io.stdout.write(`Wrote ${files.length} files to ${shown}.\n${nextSteps(name)}\n`);
143
+ return { exitCode: 0 };
144
+ }
145
+
146
+ // npm runs these from cli/: prepack "node src/new.mjs --bundle", postpack
147
+ // "node src/new.mjs --unbundle".
148
+ if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
149
+ const cliDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
150
+ const out = path.join(cliDir, "templates.json");
151
+ if (process.argv[2] === "--bundle") {
152
+ writeFileSync(out, JSON.stringify(bundleTemplates(path.join(cliDir, "..", "templates"))));
153
+ } else if (process.argv[2] === "--unbundle") {
154
+ rmSync(out, { force: true });
155
+ } else {
156
+ process.stderr.write("Use --bundle or --unbundle.\n");
157
+ process.exit(1);
158
+ }
159
+ }
package/templates.json ADDED
@@ -0,0 +1 @@
1
+ {"fastapi-postgres":{"files":[{"path":".env.example","exec":false,"body":"IyBTZXQgdGhpcyBvbiB0aGUgYXBwIHdpdGggdGhlIGVudiB0b29sLiBOZXZlciBjb21taXQgYSB2YWx1ZS4KREFUQUJBU0VfVVJMPQo="},{"path":".gitignore","exec":false,"body":"LmVudgpfX3B5Y2FjaGVfXy8KLnZlbnYvCg=="},{"path":".python-version","exec":false,"body":"My4xMgo="},{"path":"README.md","exec":false,"body":"IyBGYXN0QVBJICsgUG9zdGdyZXMgc3RhcnRlcgoKQSBzbWFsbCBGYXN0QVBJIGFwcCB3aXRoIG9uZSBQb3N0Z3JlcyB0YWJsZSwgYG5vdGVzYC4gSXQgaGFzIHRocmVlIHJvdXRlczogYEdFVCAvaGVhbHRoYCwgYEdFVCAvbm90ZXNgLCBhbmQgYFBPU1QgL25vdGVzYCB3aXRoIGB7ImJvZHkiOiAiLi4uIn1gLgoKIyMgRGVwbG95IG9uIEFzdHJpcwoKR2l2ZSB0aGVzZSBzdGVwcyB0byB5b3VyIEFJIGNvZGluZyB0b29sLiBJdCBydW5zIHRoZW0gd2l0aCB0aGUgQXN0cmlzIE1DUC4KCjEuIERlcGxveSB0aGUgR2l0IFVSTCBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBubyBgYnVpbGRgIGFuZCB3aXRoIGBwb3J0YCAzMDAwLiBLZWVwIHRoZSBgYXBwX2lkYCB0aGF0IHRoZSBhbnN3ZXIgZ2l2ZXMuCjIuIENyZWF0ZSBhIFBvc3RncmVzIGRhdGFiYXNlIGluIHRoZSBzYW1lIHByb2plY3QuIEtlZXAgdGhlIGhvc3QsIHBvcnQsIHVzZXIsIHBhc3N3b3JkIGFuZCBkYXRhYmFzZSBuYW1lIGZyb20gdGhlIGFuc3dlci4gQXN0cmlzIHNob3dzIHRoZSBwYXNzd29yZCBvbmx5IG9uY2UuCjMuIFNldCBgREFUQUJBU0VfVVJMYCBvbiB0aGUgYXBwIHdpdGggYGVudmA6IGBwb3N0Z3Jlc3FsOi8vPHVzZXI+OjxwYXNzd29yZD5APGhvc3Q+Ojxwb3J0Pi88ZGF0YWJhc2U+YC4gYGVudmAgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gc2VuZCBhbnkgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBzYW1lIGNhbGwuCjQuIERlcGxveSB0aGUgc2FtZSBgYXBwX2lkYCBhZ2Fpbi4gVGhlbiBjaGVjayBgc3RhdHVzYCB1bnRpbCBpdCBzaG93cyB0aGF0IHRoZSBkZXBsb3kgaXMgZG9uZS4KNS4gQmluZCBhIGRvbWFpbiBhbmQgb3BlbiBgaHR0cHM6Ly88aG9zdG5hbWU+L2hlYWx0aGAuIFRoZSBhbnN3ZXIgaXMgYHsic3RhdHVzIjogIm9rIiwgImRhdGFiYXNlIjogIm9rIn1gLgoKS2VlcCB0aGUgcGFzc3dvcmQgb3V0IG9mIHlvdXIgZmlsZXMgYW5kIGNvbW1pdHMuIEl0IGJlbG9uZ3Mgb25seSBpbiB0aGUgYXBwJ3MgdmFyaWFibGVzLgoKIyMgUnVuIGl0IG9uIHlvdXIgY29tcHV0ZXIKClNldCBgREFUQUJBU0VfVVJMYCB0byBhIFBvc3RncmVzIGRhdGFiYXNlIHRoYXQgeW91IHJ1bi4gVGhlbiBydW4gYHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHRgIGFuZCBgcHl0aG9uIG1haW4ucHlgLiBUaGUgYXBwIGxpc3RlbnMgb24gZXZlcnkgaW50ZXJmYWNlLCBvbiB0aGUgcG9ydCBpbiBgUE9SVGAsIG9yIG9uIDMwMDAgd2hlbiBgUE9SVGAgaXMgbm90IHNldC4gVW50aWwgYERBVEFCQVNFX1VSTGAgaXMgc2V0LCBgL2hlYWx0aGAgYW5zd2VycyB3aXRoIHN0YXR1cyA1MDMuCgpUbyBjaGFuZ2UgYSBkZXBlbmRlbmN5LCBlZGl0IGByZXF1aXJlbWVudHMuaW5gLCB0aGVuIHJ1biBgdXYgcGlwIGNvbXBpbGUgcmVxdWlyZW1lbnRzLmluIC0tcHl0aG9uLXZlcnNpb24gMy4xMiAtbyByZXF1aXJlbWVudHMudHh0YC4K"},{"path":"main.py","exec":false,"body":"aW1wb3J0IG9zCmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKCmltcG9ydCBwc3ljb3BnCmltcG9ydCB1dmljb3JuCmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbgpmcm9tIGZhc3RhcGkucmVzcG9uc2VzIGltcG9ydCBKU09OUmVzcG9uc2UKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCgphcHAgPSBGYXN0QVBJKCkKCkNSRUFURV9UQUJMRSA9ICIiIgpDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBub3RlcyAoCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksCiAgICBib2R5IFRFWFQgTk9UIE5VTEwsCiAgICBjcmVhdGVkX2F0IFRJTUVTVEFNUFRaIE5PVCBOVUxMIERFRkFVTFQgbm93KCkKKQoiIiIKCgpjbGFzcyBOb3RlSW4oQmFzZU1vZGVsKToKICAgIGJvZHk6IHN0cgoKCkBjb250ZXh0bWFuYWdlcgpkZWYgY29ubmVjdCgpOgogICAgIyBSZWFkIHBlciByZXF1ZXN0LCBub3QgYXQgaW1wb3J0OiB0aGUgZmlyc3QgZGVwbG95IHJ1bnMgYmVmb3JlIERBVEFCQVNFX1VSTCBpcyBzZXQuCiAgICB1cmwgPSBvcy5lbnZpcm9uLmdldCgiREFUQUJBU0VfVVJMIikKICAgIGlmIG5vdCB1cmw6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iREFUQUJBU0VfVVJMIGlzIG5vdCBzZXQiKQogICAgdHJ5OgogICAgICAgIGNvbm4gPSBwc3ljb3BnLmNvbm5lY3QodXJsLCBjb25uZWN0X3RpbWVvdXQ9NSkKICAgIGV4Y2VwdCBwc3ljb3BnLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iZGF0YWJhc2UgdW5yZWFjaGFibGUiKSBmcm9tIE5vbmUKICAgIHdpdGggY29ubjoKICAgICAgICBjb25uLmV4ZWN1dGUoQ1JFQVRFX1RBQkxFKQogICAgICAgIHlpZWxkIGNvbm4KCgpAYXBwLmdldCgiL2hlYWx0aCIpCmRlZiBoZWFsdGgoKToKICAgIGlmIG5vdCBvcy5lbnZpcm9uLmdldCgiREFUQUJBU0VfVVJMIik6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7InN0YXR1cyI6ICJlcnJvciIsICJkYXRhYmFzZSI6ICJub3QgY29uZmlndXJlZCJ9LCBzdGF0dXNfY29kZT01MDMpCiAgICB0cnk6CiAgICAgICAgd2l0aCBjb25uZWN0KCkgYXMgY29ubjoKICAgICAgICAgICAgY29ubi5leGVjdXRlKCJTRUxFQ1QgMSIpCiAgICBleGNlcHQgKEhUVFBFeGNlcHRpb24sIHBzeWNvcGcuRXJyb3IpOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeyJzdGF0dXMiOiAiZXJyb3IiLCAiZGF0YWJhc2UiOiAidW5yZWFjaGFibGUifSwgc3RhdHVzX2NvZGU9NTAzKQogICAgcmV0dXJuIHsic3RhdHVzIjogIm9rIiwgImRhdGFiYXNlIjogIm9rIn0KCgpAYXBwLmdldCgiL25vdGVzIikKZGVmIGxpc3Rfbm90ZXMoKToKICAgIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUIGlkLCBib2R5LCBjcmVhdGVkX2F0IEZST00gbm90ZXMgT1JERVIgQlkgaWQiKS5mZXRjaGFsbCgpCiAgICByZXR1cm4gW3siaWQiOiByWzBdLCAiYm9keSI6IHJbMV0sICJjcmVhdGVkX2F0IjogclsyXS5pc29mb3JtYXQoKX0gZm9yIHIgaW4gcm93c10KCgpAYXBwLnBvc3QoIi9ub3RlcyIsIHN0YXR1c19jb2RlPTIwMSkKZGVmIGNyZWF0ZV9ub3RlKG5vdGU6IE5vdGVJbik6CiAgICB3aXRoIGNvbm5lY3QoKSBhcyBjb25uOgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIklOU0VSVCBJTlRPIG5vdGVzIChib2R5KSBWQUxVRVMgKCVzKSBSRVRVUk5JTkcgaWQsIGJvZHksIGNyZWF0ZWRfYXQiLAogICAgICAgICAgICAobm90ZS5ib2R5LCksCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICByZXR1cm4geyJpZCI6IHJvd1swXSwgImJvZHkiOiByb3dbMV0sICJjcmVhdGVkX2F0Ijogcm93WzJdLmlzb2Zvcm1hdCgpfQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB1dmljb3JuLnJ1bihhcHAsIGhvc3Q9IjAuMC4wLjAiLCBwb3J0PWludChvcy5lbnZpcm9uLmdldCgiUE9SVCIsICIzMDAwIikpKQo="},{"path":"requirements.in","exec":false,"body":"ZmFzdGFwaQp1dmljb3JuCnBzeWNvcGdbYmluYXJ5XQo="},{"path":"requirements.txt","exec":false,"body":"IyBMb2NrZmlsZS4gUmVnZW5lcmF0ZSB3aXRoOiB1diBwaXAgY29tcGlsZSByZXF1aXJlbWVudHMuaW4gLS1weXRob24tdmVyc2lvbiAzLjEyIC1vIHJlcXVpcmVtZW50cy50eHQKYW5ub3RhdGVkLWRvYz09MC4wLjUKICAgICMgdmlhIGZhc3RhcGkKYW5ub3RhdGVkLXR5cGVzPT0wLjguMAogICAgIyB2aWEgcHlkYW50aWMKYW55aW89PTQuMTUuMQogICAgIyB2aWEgc3RhcmxldHRlCmNsaWNrPT04LjUuMAogICAgIyB2aWEgdXZpY29ybgpmYXN0YXBpPT0wLjE2MS4xCiAgICAjIHZpYSAtciByZXF1aXJlbWVudHMuaW4KaDExPT0wLjE2LjAKICAgICMgdmlhIHV2aWNvcm4KaWRuYT09My4yMAogICAgIyB2aWEgYW55aW8Kb3BlbnRlbGVtZXRyeS1hcGk9PTEuNDUuMQogICAgIyB2aWEgZmFzdGFwaQpwc3ljb3BnPT0zLjMuNgogICAgIyB2aWEgLXIgcmVxdWlyZW1lbnRzLmluCnBzeWNvcGctYmluYXJ5PT0zLjMuNgogICAgIyB2aWEgcHN5Y29wZwpweWRhbnRpYz09Mi4xNC4xCiAgICAjIHZpYSBmYXN0YXBpCnB5ZGFudGljLWNvcmU9PTIuNTAuMQogICAgIyB2aWEgcHlkYW50aWMKc3RhcmxldHRlPT0xLjkuMAogICAgIyB2aWEgZmFzdGFwaQp0eXBpbmctZXh0ZW5zaW9ucz09NC4xNi4wCiAgICAjIHZpYQogICAgIyAgIGFueWlvCiAgICAjICAgZmFzdGFwaQogICAgIyAgIG9wZW50ZWxlbWV0cnktYXBpCiAgICAjICAgcHN5Y29wZwogICAgIyAgIHB5ZGFudGljCiAgICAjICAgcHlkYW50aWMtY29yZQogICAgIyAgIHN0YXJsZXR0ZQogICAgIyAgIHR5cGluZy1pbnNwZWN0aW9uCnR5cGluZy1pbnNwZWN0aW9uPT0wLjQuNAogICAgIyB2aWEKICAgICMgICBmYXN0YXBpCiAgICAjICAgcHlkYW50aWMKdXZpY29ybj09MC41NC4wCiAgICAjIHZpYSAtciByZXF1aXJlbWVudHMuaW4K"}]},"go-dockerfile":{"files":[{"path":"Dockerfile","exec":false,"body":"IyBCdWlsZCBzdGFnZTogY29tcGlsZSBhIHN0YXRpYyBiaW5hcnkgd2l0aCB0aGUgR28gdG9vbGNoYWluLgpGUk9NIGdvbGFuZzoxLjI0LWFscGluZSBBUyBidWlsZApXT1JLRElSIC9zcmMKIyBUaGUgd2hvbGUgbW9kdWxlLCBzbyBwYWNrYWdlcyBpbiBzdWJmb2xkZXJzIGJ1aWxkIHRvby4gV2hlbiB0aGUgbW9kdWxlIGdldHMKIyBhIGRlcGVuZGVuY3ksIGdvLnN1bSBjb21lcyB3aXRoIGl0LgpDT1BZIC4gLgpSVU4gQ0dPX0VOQUJMRUQ9MCBnbyBidWlsZCAtdHJpbXBhdGggLWxkZmxhZ3M9Ii1zIC13IiAtbyAvb3V0L3NlcnZlciAuCgojIFJ1biBzdGFnZTogbm8gc2hlbGwsIG5vIHBhY2thZ2UgbWFuYWdlciwgYSBub24tcm9vdCB1c2VyLgpGUk9NIGdjci5pby9kaXN0cm9sZXNzL3N0YXRpYy1kZWJpYW4xMjpub25yb290CkNPUFkgLS1mcm9tPWJ1aWxkIC9vdXQvc2VydmVyIC9zZXJ2ZXIKVVNFUiA2NTUzMjo2NTUzMgpFWFBPU0UgMzAwMApFTlRSWVBPSU5UIFsiL3NlcnZlciJdCg=="},{"path":"README.md","exec":false,"body":"IyBHbyB3ZWIgc2VydmljZSAoRG9ja2VyZmlsZSkKCkEgc21hbGwgR28gd2ViIHNlcnZpY2UgdGhhdCBBc3RyaXMgYnVpbGRzIGZyb20gaXRzIG93biBEb2NrZXJmaWxlLiBJdCByZWFkcyBgUE9SVGAsIGxpc3RlbnMgb24gZXZlcnkgaW50ZXJmYWNlLCBhbmQgYW5zd2VycyBgR0VUIC9oZWFsdGhgIHdpdGggYHsib2siOnRydWV9YC4gVGhlIGltYWdlIHJ1bnMgYXMgYSBub24tcm9vdCB1c2VyLgoKU3RlcHMgZm9yIHlvdXIgY29kaW5nIGFnZW50OgoKMS4gQ29weSB0aGlzIGZvbGRlciB0byB0aGUgcm9vdCBvZiBhIG5ldyBHaXQgcmVwb3NpdG9yeSBvZiB5b3VyIG93biwgYW5kIHB1c2ggaXQgdG8gR2l0SHViLgoyLiBEZXBsb3kgaXQgd2l0aCB0aGUgQXN0cmlzIGBkZXBsb3lgIHRvb2w6IHlvdXIgcHJvamVjdCBuYW1lLCBhbiBhcHAgbmFtZSwgdGhlIHJlcG9zaXRvcnkncyBgZ2l0X3VybGAsIGl0cyBgYnJhbmNoYCwgYGJ1aWxkX3BhdGhgIGAiLyJgLCBgYnVpbGRgIGAiZG9ja2VyZmlsZSJgLCBgZG9ja2VyZmlsZWAgYCJEb2NrZXJmaWxlImAsIGFuZCBgd2FpdGAgYHRydWVgLgozLiBJZiB5b3UgcGFzcyBhIGBwb3J0YCBvdGhlciB0aGFuIDMwMDAsIHNldCB0aGUgdmFyaWFibGUgYFBPUlRgIHRvIHRoZSBzYW1lIG51bWJlciB3aXRoIHRoZSBgZW52YCB0b29sLCB0aGVuIGRlcGxveSBhZ2Fpbi4gYGVudmAgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gc2VuZCBhbnkgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBzYW1lIGNhbGwuCjQuIE9wZW4gYGh0dHBzOi8vPGFwcD4uYXN0cmlzLmxpdmUvaGVhbHRoYCBhbmQgY2hlY2sgdGhhdCBpdCBhbnN3ZXJzIGB7Im9rIjp0cnVlfWAuCjUuIEFkZCB5b3VyIG93biByb3V0ZXMgaW4gYG1haW4uZ29gLCBjb21taXQsIHB1c2gsIGFuZCBkZXBsb3kgYWdhaW4gd2l0aCB0aGUgYXBwJ3MgYGFwcF9pZGAuCgpUaGUgbW9kdWxlIGhhcyBubyBkZXBlbmRlbmNpZXMuIFdoZW4geW91IGFkZCBvbmUsIHJ1biBgZ28gbW9kIHRpZHlgIGFuZCBjb21taXQgdGhlIGBnby5zdW1gIGZpbGUgaXQgd3JpdGVzLiBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhlIHdob2xlIGZvbGRlciwgc28gYGdvLnN1bWAgcmVhY2hlcyB0aGUgYnVpbGQgd2l0aCBubyBjaGFuZ2UgdG8gdGhlIERvY2tlcmZpbGUuCg=="},{"path":"go.mod","exec":false,"body":"bW9kdWxlIGV4YW1wbGUuY29tL2dvLWRvY2tlcmZpbGUKCmdvIDEuMjQK"},{"path":"main.go","exec":false,"body":"Ly8gQSBtaW5pbWFsIHdlYiBzZXJ2aWNlIGZvciBBc3RyaXM6IGl0IHJlYWRzIFBPUlQsIGJpbmRzIDAuMC4wLjAgYW5kIGFuc3dlcnMKLy8gR0VUIC9oZWFsdGguCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKCSJsb2ciCgkibmV0IgoJIm5ldC9odHRwIgoJIm9zIgoJInRpbWUiCikKCmZ1bmMgbWFpbigpIHsKCXBvcnQgOj0gb3MuR2V0ZW52KCJQT1JUIikKCWlmIHBvcnQgPT0gIiIgewoJCXBvcnQgPSAiMzAwMCIKCX0KCgltdXggOj0gaHR0cC5OZXdTZXJ2ZU11eCgpCgltdXguSGFuZGxlRnVuYygiR0VUIC9oZWFsdGgiLCBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CgkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIikKCQlfLCBfID0gdy5Xcml0ZShbXWJ5dGUoYHsib2siOnRydWV9YCkpCgl9KQoJbXV4LkhhbmRsZUZ1bmMoIkdFVCAveyR9IiwgZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJCXcuSGVhZGVyKCkuU2V0KCJDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIpCgkJXywgXyA9IHcuV3JpdGUoW11ieXRlKCJIZWxsbyBmcm9tIEFzdHJpcy5cbiIpKQoJfSkKCglzZXJ2ZXIgOj0gJmh0dHAuU2VydmVyewoJCUFkZHI6ICAgICAgICAgICAgICBuZXQuSm9pbkhvc3RQb3J0KCIwLjAuMC4wIiwgcG9ydCksCgkJSGFuZGxlcjogICAgICAgICAgIG11eCwKCQlSZWFkSGVhZGVyVGltZW91dDogMTAgKiB0aW1lLlNlY29uZCwKCX0KCWxvZy5QcmludGYoImxpc3RlbmluZyBvbiAlcyIsIHNlcnZlci5BZGRyKQoJbG9nLkZhdGFsKHNlcnZlci5MaXN0ZW5BbmRTZXJ2ZSgpKQp9Cg=="}]},"nextjs-postgres":{"files":[{"path":".dockerignore","exec":false,"body":"LmdpdApub2RlX21vZHVsZXMKLm5leHQKLmVudgouZW52LioK"},{"path":".env.example","exec":false,"body":"REFUQUJBU0VfVVJMPQo="},{"path":".gitignore","exec":false,"body":"bm9kZV9tb2R1bGVzCi5uZXh0Ci5lbnYKLmVudi4qCiEuZW52LmV4YW1wbGUK"},{"path":"Dockerfile","exec":false,"body":"RlJPTSBub2RlOjIyLWJvb2t3b3JtLXNsaW0gQVMgYnVpbGRlcgpXT1JLRElSIC9hcHAKQ09QWSBwYWNrYWdlLmpzb24gcG5wbS1sb2NrLnlhbWwgLi8KUlVOIGNvcmVwYWNrIHBucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZQpDT1BZIC4gLgpSVU4gbWtkaXIgLXAgcHVibGljClJVTiBjb3JlcGFjayBwbnBtIHJ1biBidWlsZAoKRlJPTSBub2RlOjIyLWJvb2t3b3JtLXNsaW0KV09SS0RJUiAvYXBwCkVOViBOT0RFX0VOVj1wcm9kdWN0aW9uCkVOViBIT1NUTkFNRT0wLjAuMC4wCkVOViBQT1JUPTMwMDAKQ09QWSAtLWZyb209YnVpbGRlciAtLWNob3duPW5vZGU6bm9kZSAvYXBwLy5uZXh0L3N0YW5kYWxvbmUgLi8KQ09QWSAtLWZyb209YnVpbGRlciAtLWNob3duPW5vZGU6bm9kZSAvYXBwLy5uZXh0L3N0YXRpYyAuLy5uZXh0L3N0YXRpYwpDT1BZIC0tZnJvbT1idWlsZGVyIC0tY2hvd249bm9kZTpub2RlIC9hcHAvcHVibGljIC4vcHVibGljClVTRVIgbm9kZQpFWFBPU0UgMzAwMApDTUQgWyJub2RlIiwgInNlcnZlci5qcyJdCg=="},{"path":"README.md","exec":false,"body":"IyBOZXh0LmpzICsgUG9zdGdyZXMgc3RhcnRlcgoKQSBzbWFsbCBOZXh0LmpzIGFwcCB3aXRoIG9uZSBQb3N0Z3JlcyB0YWJsZS4gRWFjaCB2aXNpdCB0byB0aGUgaG9tZSBwYWdlIGFkZHMgYSByb3cgYW5kIHNob3dzIHRoZSBjb3VudC4gYC9oZWFsdGhgIGFuc3dlcnMgYHsib2siOnRydWV9YCBhbmQgZG9lcyBub3QgdXNlIHRoZSBkYXRhYmFzZS4KCiMjIERlcGxveSBvbiBBc3RyaXMKCkFzayB5b3VyIGNvZGluZyBhZ2VudCB0byBydW4gdGhlc2Ugc3RlcHMgd2l0aCB0aGUgQXN0cmlzIE1DUC4KCjEuIENyZWF0ZSBhIFBvc3RncmVzIGRhdGFiYXNlIHdpdGggdGhlIGBkYXRhYmFzZWAgdG9vbDogYGFjdGlvbmAgY3JlYXRlLCBga2luZGAgcG9zdGdyZXMsIHlvdXIgcHJvamVjdCBuYW1lIGFuZCBhIGRhdGFiYXNlIG5hbWUuIEtlZXAgdGhlIGFuc3dlciwgYmVjYXVzZSBBc3RyaXMgc2hvd3MgdGhlIHBhc3N3b3JkIG9ubHkgb25jZS4KMi4gRGVwbG95IHRoZSBhcHAgd2l0aCB0aGUgYGRlcGxveWAgdG9vbDogYGdpdF91cmxgIGh0dHBzOi8vZ2l0aHViLmNvbS9hc3RyaXMtbGFicy90ZW1wbGF0ZS1uZXh0anMtcG9zdGdyZXMsIGBicmFuY2hgIG1haW4sIGBidWlsZGAgZG9ja2VyZmlsZSwgYGRvY2tlcmZpbGVgIERvY2tlcmZpbGUsIHRoZSBzYW1lIHByb2plY3QgYW5kIGFuIGFwcCBuYW1lLgozLiBTZXQgYERBVEFCQVNFX1VSTGAgd2l0aCB0aGUgYGVudmAgdG9vbC4gQnVpbGQgaXQgZnJvbSB0aGUgZGF0YWJhc2UgYW5zd2VyOiBgcG9zdGdyZXM6Ly88dXNlcj46PHBhc3N3b3JkPkA8aG9zdD46PHBvcnQ+LzxkYXRhYmFzZT5gLiBgZW52YCByZXBsYWNlcyBldmVyeSB2YXJpYWJsZSBvbiB0aGUgYXBwLCBzbyBzZW5kIGFueSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgY2FsbC4KNC4gUmVzdGFydCB0aGUgYXBwIHdpdGggdGhlIGByZXN0YXJ0YCB0b29sLCBzbyB0aGF0IGl0IHJlYWRzIHRoZSBuZXcgdmFyaWFibGUuCjUuIEJpbmQgYW4gYWRkcmVzcyB3aXRoIHRoZSBgZG9tYWluc2AgdG9vbCwgdGhlbiBvcGVuIGl0LgoKS2VlcCB0aGUgcGFzc3dvcmQgb3V0IG9mIHlvdXIgZmlsZXMgYW5kIGNvbW1pdHMuIEl0IGJlbG9uZ3Mgb25seSBpbiB0aGUgYXBwJ3MgdmFyaWFibGVzLgoKIyMgUnVuIGl0IG9uIHlvdXIgY29tcHV0ZXIKClNldCBgREFUQUJBU0VfVVJMYCB0byBhIFBvc3RncmVzIGRhdGFiYXNlIHRoYXQgeW91IHJ1biwgdGhlbiBydW4gYHBucG0gaW5zdGFsbGAgYW5kIGBwbnBtIGRldmAuCg=="},{"path":"app/health/route.js","exec":false,"body":"Ly8gQW5zd2VycyB3aXRob3V0IHRoZSBkYXRhYmFzZSwgc28gYSBkZXBsb3kgaXMgaGVhbHRoeSBiZWZvcmUgREFUQUJBU0VfVVJMIGlzIHNldC4KZXhwb3J0IGNvbnN0IGR5bmFtaWMgPSAiZm9yY2UtZHluYW1pYyI7CgpleHBvcnQgZnVuY3Rpb24gR0VUKCkgewogIHJldHVybiBSZXNwb25zZS5qc29uKHsgb2s6IHRydWUgfSk7Cn0K"},{"path":"app/layout.js","exec":false,"body":"ZXhwb3J0IGNvbnN0IG1ldGFkYXRhID0geyB0aXRsZTogIk5leHQuanMgKyBQb3N0Z3JlcyBvbiBBc3RyaXMiIH07CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBSb290TGF5b3V0KHsgY2hpbGRyZW4gfSkgewogIHJldHVybiAoCiAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICAgIDxib2R5PntjaGlsZHJlbn08L2JvZHk+CiAgICA8L2h0bWw+CiAgKTsKfQo="},{"path":"app/page.js","exec":false,"body":"aW1wb3J0IHsgZ2V0UG9vbCB9IGZyb20gIi4uL2xpYi9kYiI7CmltcG9ydCB7IHJlY29yZFZpc2l0IH0gZnJvbSAiLi4vbGliL3Zpc2l0cyI7CgpleHBvcnQgY29uc3QgZHluYW1pYyA9ICJmb3JjZS1keW5hbWljIjsKCmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIEhvbWUoKSB7CiAgaWYgKCFwcm9jZXNzLmVudi5EQVRBQkFTRV9VUkwpIHsKICAgIHJldHVybiAoCiAgICAgIDxtYWluPgogICAgICAgIDxoMT5OZXh0LmpzICsgUG9zdGdyZXMgb24gQXN0cmlzPC9oMT4KICAgICAgICA8cD5TZXQgREFUQUJBU0VfVVJMIG9uIHRoaXMgYXBwLCB0aGVuIHJlc3RhcnQgaXQuPC9wPgogICAgICA8L21haW4+CiAgICApOwogIH0KICBjb25zdCBjb3VudCA9IGF3YWl0IHJlY29yZFZpc2l0KGdldFBvb2woKSk7CiAgcmV0dXJuICgKICAgIDxtYWluPgogICAgICA8aDE+TmV4dC5qcyArIFBvc3RncmVzIG9uIEFzdHJpczwvaDE+CiAgICAgIDxwPlZpc2l0czoge2NvdW50fTwvcD4KICAgIDwvbWFpbj4KICApOwp9Cg=="},{"path":"lib/db.js","exec":false,"body":"aW1wb3J0IHBnIGZyb20gInBnIjsKCi8vIE9uZSBwb29sIHBlciBzZXJ2ZXIgcHJvY2Vzcy4gREFUQUJBU0VfVVJMIGlzIHJlYWQgb24gdGhlIGZpcnN0IHF1ZXJ5LCBzbyB0aGUKLy8gYnVpbGQgYW5kIC9oZWFsdGggcnVuIHdpdGhvdXQgaXQuCmxldCBwb29sOwoKZXhwb3J0IGNvbnN0IGdldFBvb2wgPSAoKSA9PiB7CiAgcG9vbCA/Pz0gbmV3IHBnLlBvb2woeyBjb25uZWN0aW9uU3RyaW5nOiBwcm9jZXNzLmVudi5EQVRBQkFTRV9VUkwsIG1heDogNSB9KTsKICByZXR1cm4gcG9vbDsKfTsK"},{"path":"lib/visits.js","exec":false,"body":"Ly8gUmVjb3JkcyBvbmUgdmlzaXQgYW5kIHJldHVybnMgaG93IG1hbnkgdGhlcmUgYXJlLiBgZGJgIGlzIGFueXRoaW5nIHdpdGgKLy8gcXVlcnkoc3FsLCBwYXJhbXMpIHRoYXQgYW5zd2VycyB7IHJvd3MgfTogYSBwZyBQb29sIG9yIGEgUEdsaXRlIGNsaWVudC4KZXhwb3J0IGNvbnN0IHJlY29yZFZpc2l0ID0gYXN5bmMgKGRiKSA9PiB7CiAgYXdhaXQgZGIucXVlcnkoCiAgICAiY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgdmlzaXRzIChpZCBzZXJpYWwgcHJpbWFyeSBrZXksIHZpc2l0ZWRfYXQgdGltZXN0YW1wdHogbm90IG51bGwgZGVmYXVsdCBub3coKSkiLAogICk7CiAgYXdhaXQgZGIucXVlcnkoImluc2VydCBpbnRvIHZpc2l0cyBkZWZhdWx0IHZhbHVlcyIpOwogIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgZGIucXVlcnkoInNlbGVjdCBjb3VudCgqKTo6aW50IGFzIGNvdW50IGZyb20gdmlzaXRzIik7CiAgcmV0dXJuIHJvd3NbMF0uY291bnQ7Cn07Cg=="},{"path":"next.config.mjs","exec":false,"body":"LyoqIEB0eXBlIHtpbXBvcnQoIm5leHQiKS5OZXh0Q29uZmlnfSAqLwpjb25zdCBuZXh0Q29uZmlnID0geyBvdXRwdXQ6ICJzdGFuZGFsb25lIiB9OwoKZXhwb3J0IGRlZmF1bHQgbmV4dENvbmZpZzsK"},{"path":"package.json","exec":false,"body":"ewogICJuYW1lIjogIm5leHRqcy1wb3N0Z3JlcyIsCiAgInZlcnNpb24iOiAiMC4xLjAiLAogICJwcml2YXRlIjogdHJ1ZSwKICAic2NyaXB0cyI6IHsKICAgICJkZXYiOiAibmV4dCBkZXYiLAogICAgImJ1aWxkIjogIm5leHQgYnVpbGQiLAogICAgInN0YXJ0IjogIm5leHQgc3RhcnQgLUggMC4wLjAuMCIKICB9LAogICJkZXBlbmRlbmNpZXMiOiB7CiAgICAibmV4dCI6ICIxNi40LjEiLAogICAgInBnIjogIjguMjMuMCIsCiAgICAicmVhY3QiOiAiMTkuMy4wIiwKICAgICJyZWFjdC1kb20iOiAiMTkuMy4wIgogIH0sCiAgImVuZ2luZXMiOiB7CiAgICAibm9kZSI6ICI+PTIyIgogIH0sCiAgInBhY2thZ2VNYW5hZ2VyIjogInBucG1AMTAuMzMuMyIKfQo="},{"path":"pnpm-lock.yaml","exec":false,"body":"bG9ja2ZpbGVWZXJzaW9uOiAnOS4wJwoKc2V0dGluZ3M6CiAgYXV0b0luc3RhbGxQZWVyczogdHJ1ZQogIGV4Y2x1ZGVMaW5rc0Zyb21Mb2NrZmlsZTogZmFsc2UKCmltcG9ydGVyczoKCiAgLjoKICAgIGRlcGVuZGVuY2llczoKICAgICAgbmV4dDoKICAgICAgICBzcGVjaWZpZXI6IDE2LjQuMQogICAgICAgIHZlcnNpb246IDE2LjQuMShyZWFjdC1kb21AMTkuMy4wKHJlYWN0QDE5LjMuMCkpKHJlYWN0QDE5LjMuMCkKICAgICAgcGc6CiAgICAgICAgc3BlY2lmaWVyOiA4LjIzLjAKICAgICAgICB2ZXJzaW9uOiA4LjIzLjAKICAgICAgcmVhY3Q6CiAgICAgICAgc3BlY2lmaWVyOiAxOS4zLjAKICAgICAgICB2ZXJzaW9uOiAxOS4zLjAKICAgICAgcmVhY3QtZG9tOgogICAgICAgIHNwZWNpZmllcjogMTkuMy4wCiAgICAgICAgdmVyc2lvbjogMTkuMy4wKHJlYWN0QDE5LjMuMCkKCnBhY2thZ2VzOgoKICAnQGVtbmFwaS9ydW50aW1lQDEuMTEuMyc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWHo0VHB5a2k3WHlycGJVSzFqUjFBaGRBZGFYeWhoWTRsWjNuZUxvZG1ocHVXZnkyUEFRTjVCNDZzQWlVNGxpT1hHTGtIeXBuL3FVK2p2ZldTQ1lZTEE9PX0KCiAgJ0BpbWcvY29sb3VyQDEuMS4wJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1UZDc2cTdqNTdvL3RMVmRnUzc0NmNZQVJmU3l4azhpRWZSeGV3TDloNE9NelloYlc0VEFjcHBsMG1UNGV5cVhkZGg2TC9qd29NNzVtbzdpeGEvcENlUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTE4J30KCiAgJ0BpbWcvc2hhcnAtZGFyd2luLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItUVJVbEZRMFd4dmRXeXFxRy9XdEkzaXVwZkQ1ckJ6bUNIWFNkUHNZOTFzQXRWdFRvN1E0Y2I2ek9jY1ozZ3FFcWtyMGYxQXMxZWhMcW1FcERzUmYrbGc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2Rhcndpbl0KCiAgJ0BpbWcvc2hhcnAtZGFyd2luLXg2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLStCUjI1NVJoRGxweWdVcE9jL0pkdDFuVDZEUTNYRy9FUm81d2JjZE9mNVEzMjBkS3RQQ0tQTFIxTEpzOVZHWFJhTWE4bDF1VWEwdGtDTk9YaUF4WlV3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQGltZy9zaGFycC1mcmVlYnNkLXdhc20zMkAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVkvejkxbkVaNHVJQlg1WDNuZlRvdmpVOWxITktGWWJMMmxwSENMVk5tWFFLMDNWSVp2WEJCdDBLeGJQR3AyU2RHU0YrMm1RVTRlK2hRYVdPdDg2aUF3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIG9zOiBbZnJlZWJzZF0KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4tYXJtNjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTVSODluQllpUmRVbFNXSnhQaE8rR1Z0YVh6WFN4S25SdS94cU1uM0tUQTNMOUVCOU95L1ArTm4yZjJ2bGhQdVVkeS9adXNiMkRhcmJ5VHBHQ2ZFRHV3PT19CiAgICBjcHU6IFthcm02NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWlSMk9LSDgweWkwVStkVXBseWgzL3hkcEZ2cHM2WWtDd3NYZW5JSnhxeFIxdjlvK3h0S1RHYlM5SDdjcHMrMlZ4amM4QjFqOTZwNzVObVRHaklodHBRPT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2Rhcndpbl0KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm02NEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWTNkZ1gvNmxFMlFoUWIrR3h5MFdaeGZnOU1FbS9KQmphbVpwUzJJa2xQN3hJUW9LTjRoekFtN0tjTVZHdGFWRHQzbmVFOU9LQkM3dkFmb25BL0xyMUE9PX0KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm1AMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxtUnRUc09IdXZNMit3bE8yRGIzN2R4NU1pWmhCMEZ2U3VuY2l3NDhZamRPa1p6OUtBaVJibTh1amVNT0ExSU5xbWVpNU5hcEZ4WUVLMUQxWlNpZG13PT19CiAgICBjcHU6IFthcm1dCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXBwYzY0QDEuMy40JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1MZTZib0I4VGFpME5pcytnSXhJcEt4NjhVRFZWSXFkUjhUaW41WWYxejJMSkpRTERKdkNEUnFSdStqQzJxQ29EK2VJb21vbm1Pd0I0c21CUnhmVnBZUT09fQogICAgY3B1OiBbcHBjNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWFIa2tJRUhQUmRRRWVnSk4yME1MbUd0eFlEOVIyd1FyM0N3cGRkbnU1K1lLTXQ2VXpheDdTOWg1Z3BaVG84d3lyR3VaU2xmUTYzT2V2TDVtVHlPQzdRPT19CiAgICBjcHU6IFtyaXNjdjY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcmEvbUI2TWlrRVNEVU83WWcrTWk5NWJGQmI5R3NPYlVSdWhuT3YzT3FrbmpHZTlzWnJHOHRDZTlxMHhTSUdydExndmd3MGdLbkZXY0s0YmxTZ1FPdVE9PX0KICAgIGNwdTogW3MzOTB4XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUdKLy9TU1hibndTRGVzMDJ1bUIzbkRKTEZjUXp3OGExOFY4ZnlocXI2dFY1MTV0T0VNZEltamp4ajFBb2FmTVJ6NTZGM1BIZ2Z0bmoxUUVLU1Uxemt3PT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItaHZ1bEZ3dGpVY2Fnc2lzNkJCeEh3R0Z3V29OWmpnWW1VTEdWclpjeWZOYmpBOGhLSUxiUnhHZzE1Lzd3NUhEeVhIWFVvcy9qNmJhQVdxbkN5UTJEV0E9PX0KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFttdXNsXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTZ6WEtlRS9wMzlJMUFtQTNjSkczNWV5QkdOcU5kZExuVVhqaHdCbnNHakZQV3FmNVZLa0RCRXFhRWtQRG9URXRreHdpMnZ2OFRjcjJtRHlQNFNvN0ZnPT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLWxpbnV4LWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItTFlWeDVKVHNPTTJDQnpteHJlaCtubDY0LzNINlhiMDlpU0xrbnFINDd6MlQyREZGeERlRkxQNXk0ZEp3ZTZIN3VHUWxIUHlFRXRJcXlvM0RZc1J3ZFE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1hcm1AMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1MRWFYSzJXZFhWSzV5a2N3MGJ1V3lQTXNtTExMMnZwSExENnlyTlNXK0pHRUwzQlpQQTR0cEtONmlhTWM0QXhUVEFvYVgvc1Uxck9MNTFsY0l6NDhaUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFthcm1dCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1wcGM2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVFWeEFBcThldlZSSTlpYTJ2cWd3cm1XdWNuNURmditKZFd6ajc1cEQ4b21ITFBTUDdmOHAyME84anh6akNjdUNFUUVPdFlPWlVtWDFoa2laMGtkZXZBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3BwYzY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXgtcmlzY3Y2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUx0ZHJlWGd1YWF2S09EUElmeko0a2ZmeDdVTnQxb213dEswcmNoNEVCYmJTVFhQbnhXbVlTYXlYZExKdzBmSnpROTdrSHQxZ0wveWg0dHZVK25DeVJRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3Jpc2N2NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1zMzkweEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVVaYXNUT0ZpWXpvdFRzR09DdTQyQmZVelA2VHU2RG8vOTQ3aVJtMVJzTEt2bGxseHdHY240Uk4yN0xpYkdXY2VpeDRZK1BtdzNqc25UY0NRSWdXanFBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3MzOTB4XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXgteDY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItU3hGdExUZUpJbmhBQTlRODM2a3V4MnZaTmVPQlFFeDY1OHF2YmJvWlNjcjB3SUFSeW0zSWNHbVc3S3BWRDVzYlZnME9qeSt1ZEZRZGF5WUlaeW9Ob2c9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbeDY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXhtdXNsLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItOUhiTWNsbUkxemxOa0ZSczN6OS9lQnREamZEMHNHbHJYMXo2YjFxd21pRlk1RWxETGg0QkMwTFBCZFZwN3oxRFhGaUtsSWN6bmYrWmxzdVp6THhRcWc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLWxpbnV4bXVzbC14NjRAMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi00S09waHFCMDM1SHJWZHFMWmZDZ016ekVSclFra3pPd1JobDRPQWtSTzFZQ2xkYmFGanlTWE1hSzUzNE1vMFYrTG5kbmxKaytzYlV5TGVVMFVMeUQxQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLXdhc20zMkAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVB0c2dhMXN1NHRReCtMTEYxRUNTOVU2bno1a21yWEtvNlhWYnRSNDhLZTNaUnh4Z2FXQnU3SUR0RWUxcXVvOGhpdXB3bTZXRnF4VmxYYVNmN0lJTkdRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KCiAgJ0BpbWcvc2hhcnAtd2ViY29udGFpbmVycy13YXNtMzJAMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1oZmhGL0Ztb1F5VFVrQTBiSUtGT3R3NTM2QlFTZUJNZTZCRjZReVdsclB4VDc1NCtURkxhWjdzS0tUZnZ2TTB5SmdLZ2FZVHduRkNJWi9HdUR3NVNVQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFt3YXNtMzJdCgogICdAaW1nL3NoYXJwLXdpbjMyLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWDR0N2crN1pBNURLYmxDQkVYR2pVcXFlbWo0dmN6SU5HLzV2aUZ3QUw4aDROM3FZZXlqd2RDdlJMSGk0RWRPVUkrMlo3VUZscDFWTStwL0F1RXRtNlE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW3dpbjMyXQoKICAnQGltZy9zaGFycC13aW4zMi1pYTMyQDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItNVptODJMb0JjNDNuaHdOeWJabEc3WTFLTy8vWmhzbjMwNmZRbDI5Wk91U3RITEdUbzNCV0w4M3EzY3puWDBwb3hTQU11WUwxT24vQkhCeGtCZUtyNkE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiBeMjAuOS4wfQogICAgY3B1OiBbaWEzMl0KICAgIG9zOiBbd2luMzJdCgogICdAaW1nL3NoYXJwLXdpbjMyLXg2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXg3NmVIMHZFaUhsY01RdThZOEllbm50YUFDdGRkcFQ2VzB3bVh0V3JuS2NuS0k3TUU1RGRncWhBRDZTRVdPRWwxdjJ6RHZrWkRoRkE5S25VUndwZnFnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbd2luMzJdCgogICdAbmV4dC9lbnZAMTYuNC4xJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01c1VVcnJTdnMvMi8yTG5Mb2VzeWJNR3gxMkV0UEI0NmZkWjZSaEF3MFhER1NQeFUyTEZ5UUJCN3l1RWlPRkZKUEttQlk2K3EyalRyMS9BTWJucDAvZz09fQoKICAnQG5leHQvc3djLWRhcndpbi1hcm02NEAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVUraFE1R2ozZnB6ZjRmdmVUSUYzZHBVRlloYVNXOHZIaGRBbmJpSW9telh6Zzdib3JlWUZnQnFwcmVwWEZ0VzRzdythVHR0aU5tZzBnZXcvaUZOaGJnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtkYXJ3aW5dCgogICdAbmV4dC9zd2MtZGFyd2luLXg2NEAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLS9ocUMzVjFYTFVqaE1BU2YvV3JpZEtkTzlGWG9FZ04zSEJXbXRLYmowME1QZ25sdHV0ZnJhV0ozYllUcENSSWdFSXBiakp5T1ZMcFlnQWhoL0JrZGNRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudUAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUdIem5jSGJjYVM5Zzk1a2N2VE50S1FXM2FDTG9SK3hjM0ptN3Fya3BrMVIrRDJCak1ISVB5dlFHUlBLQ2RNWDk1QnNILzQyMWpCVUswNnE5dEV3emp3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsQDE2LjQuMSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItMVN1SnlEeFcvUFI5ZEhKYXQvWlJnY1lMaHVTWisxcHNQNERsS2IydEtJdVhianlncXBMckpXUlNxK29uWlFCdjhMY21VNjdFSXJtYjZjM1hUYUpManc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAbmV4dC9zd2MtbGludXgteDY0LWdudUAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUlzdG5nMWhNR3A5VEdPNGxVcWVLTGQ3ME1QTi9PT2t1Y1ZUUDJObWorZ0xrd0JnbVBxVXc4Q0pZQkNDN25ibC9CLzIzYkJDY2pDSTVIc2g2aGF6QzFBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbbGludXhdCiAgICBsaWJjOiBbZ2xpYmNdCgogICdAbmV4dC9zd2MtbGludXgteDY0LW11c2xAMTYuNC4xJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1hU0M5d01OaVpSUkZWcFBrUFdCelJ3TFF4SUdtL0NpUWNYeUZGMVhOY2dvZGIrdU14ZGs3YVNTR0dwRFhDYm52WmRmNGl0akh4cE9kNWg3aTd6YWlZdz09fQogICAgZW5naW5lczoge25vZGU6ICc+PSAxMCd9CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAbmV4dC9zd2Mtd2luMzItYXJtNjQtbXN2Y0AxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXQvbXl2d0ZEbHlwTVVqUnZiQmY4cUxQeXVhQjBpWFlZZEJ0d010NkRNNmYrNjB3dEdyNGJTWWhvbGRQcU5lVjVWVVhaaHJwTXdmemE4MjlrbWhTM2lBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFt3aW4zMl0KCiAgJ0BuZXh0L3N3Yy13aW4zMi14NjQtbXN2Y0AxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTZJQ3FQbzlhd0NrcnRZTlBod2t4MXVVN3JsRldyWlJySWJvREhTMkxVK2p2MDg4VUJZUXRtSjI1aDZwQ3AyNy8rRlpqRjZCUTRUZTRFcnVneU1ldUJnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbd2luMzJdCgogICdAc3djL2hlbHBlcnNAMC41LjIzJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01bFNzTU9UWFVSZVBnbERmdnVBUVVxa0dlazlIZzJra3NPWWF5Mm0wK1hSKytiMk5XWUwvNHNXeXV2VkJJczhvS25KYXhrZGk5d2hhTC9zcU4xM2Fmdz09fQoKICBiYXNlbGluZS1icm93c2VyLW1hcHBpbmdAMi4xMS4zMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1iMGs3d1hsV2pwdUwvVXhiL3BZbHBqWTBlajVCakFtdXJ0UFVrM2VSR3Vsb0k0eWpLMzJtOFRpS1VRODFsMXB0Y0xqS1MvS0gyK3VxSW9sWnRpMXg0UT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTYuMC4wJ30KICAgIGhhc0JpbjogdHJ1ZQoKICBjYW5pdXNlLWxpdGVAMS4wLjMwMDAxODE5OgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxGVXFJSUF3cHpzSXVldm5LbnNSOXFuU3RCY2d6UFNoVFg2MWxCd045dUZra2Y4bzh6TGllYkVqYlc4QVl0WmlGKzFZS0RXZmR0L3BXRHRNdUc4WHdnPT19CgogIGNsaWVudC1vbmx5QDAuMC4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUlWM091MGpTTXpacmQzcFo0OG5Ma1Q5REE3QWcxcG5QemFpUWhwVzdjM1JiY3FxenZ6elZ1K0w4Z2ZxTXAvOElNMk1RdFNpcWFDeHJyY2Z1OEk4ck1BPT19CgogIGRldGVjdC1saWJjQDIuMS4yOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUJ0ajJCT09PODNvM1d5SDU5ZThNZ1hzeEVRVmNhcmtVT3BFWXJ1YkIwdXJ3bk4xMHlRMzY0cnNpQnlVMTFuWmxxV1labTA1aS9vZjdpbzRtemloQnRRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49OCd9CgogIG5hbm9pZEAzLjMuMjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItdUtkZzJHM0dOQ0tRbjlieVlPcHhiR3FyVDJmR081S1J0NUovOGIzcG9rOHJUNnF4R1dGNmh4TXlKaUVZdEFmK0ZWeVl1RDloUmFEcVg1dVBGWUo0WlE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiBeMTAgfHwgXjEyIHx8IF4xMy43IHx8IF4xNCB8fCA+PTE1LjAuMX0KICAgIGhhc0JpbjogdHJ1ZQoKICBuZXh0QDE2LjQuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi11YzY1N1Y2MkUzNGZPSTZXNU50RzlJendzUGNtczBaNjBncnoyTUpHdGdsZ0QrcFRGbk50NFl3MlB6YVU2MjJ0Zlg0dmhyRGdMWnppY0UyWWxoSTIwUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBoYXNCaW46IHRydWUKICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgICdAb3BlbnRlbGVtZXRyeS9hcGknOiBeMS4xLjAKICAgICAgJ0BwbGF5d3JpZ2h0L3Rlc3QnOiBeMS41MS4xCiAgICAgIGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcjogJyonCiAgICAgIHJlYWN0OiBeMTguMi4wIHx8IDE5LjAuMC1yYy1kZTY4ZDJmNC0yMDI0MTIwNCB8fCBeMTkuMC4wCiAgICAgIHJlYWN0LWRvbTogXjE4LjIuMCB8fCAxOS4wLjAtcmMtZGU2OGQyZjQtMjAyNDEyMDQgfHwgXjE5LjAuMAogICAgICBzYXNzOiBeMS4zLjAKICAgIHBlZXJEZXBlbmRlbmNpZXNNZXRhOgogICAgICAnQG9wZW50ZWxlbWV0cnkvYXBpJzoKICAgICAgICBvcHRpb25hbDogdHJ1ZQogICAgICAnQHBsYXl3cmlnaHQvdGVzdCc6CiAgICAgICAgb3B0aW9uYWw6IHRydWUKICAgICAgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCiAgICAgIHNhc3M6CiAgICAgICAgb3B0aW9uYWw6IHRydWUKCiAgcGctY2xvdWRmbGFyZUAxLjQuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi02UFFic0ZXWmNwOUVtSkV3eTVjR1EyTGErQU1XcFA0NmxnYmI4WCtVL1hzSElVd2VZRE5DcGV1S2NrNVJ4TDJNZFZGaTdrcmJiRWk1blg0Wmg3SmhyUT09fQoKICBwZy1jb25uZWN0aW9uLXN0cmluZ0AyLjE0LjE6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcVIza0dOUEJMcENOdHowZXZiS0EwWS9NUkZYd1NTZFQrcFRKdllwL2JYVGNSZVpidlgxa3pGMEl5VGMxUW54cUY3QVpiT2VCaE5MOFI1bVlRWlYvTUE9PX0KCiAgcGctaW50OEAxLjAuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1XQ3RhYlM2dDNjOFNrcERCVWxiMWtqT3M3bDY2eHNHZEtwSVBac2c0d1IrQjMrdTlVQXVtMm9kU3NGOXRudnhnODBoNFp4TFdNeTRwUmpPc0ZJcVFwdz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQuMC4wJ30KCiAgcGctcG9vbEAzLjE0LjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItZ0t0UGtGZFFQVTNEa3Nvb1ZMaTlMc2paeHJzQlVaSXBhKzdhVngrTFY1cE5oMEt6UDRabGV1ZDJwbytDb25yeGJ1WEdCSjZIZmVyNmhkZ3BJQnBCYXc9PX0KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHBnOiAnPj04LjAnCgogIHBnLXByb3RvY29sQDEuMTYuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1wOVZPRk1pSEIvWmJKQVRldGJnKzk5UHhzc1RWU1FSbnl1UFNRNjdtTjErMUtCT2paYVo4M1pRemx0bnhQaEp3U3NDM253VmpKMTBEVkpsZXJiRnpMZz09fQoKICBwZy10eXBlc0AyLjIuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1xVEFBbHJFc2w4czRPaUVRWTY5d0R2Y01JZFFONndkejVvalFpT3k2WVJNdXlueGVuT04wTzVvQ3BKSTZsc2hjNnNjZ0FZOHF2SjJPbi9wK0NYWTBHQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQnfQoKICBwZ0A4LjIzLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItSXAyRVFDbmdvd0pMR09mQ3drRmhQWFU3L2xqbGhuNlJ4bG15NFhZZkwyWSt2eVJNNTkrOHVSMnhxUldLZFltYlhteENGT0FtS3hCdVNVQ2RGMzRxTGc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTYuMC4wJ30KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHBnLW5hdGl2ZTogJz49My4wLjEnCiAgICBwZWVyRGVwZW5kZW5jaWVzTWV0YToKICAgICAgcGctbmF0aXZlOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHBncGFzc0AxLjAuNToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1GZFc5ci9qUVpoU2VvaHMxWjNzSTF5eEZRTkZ2TWNubWZ1ajRXQk1VVHhPckF5TE1hVGNFMWFBTUJpVGxiTU5hWHZCQ1F1VmkwUjdoZDh1ZERTUDd1Zz09fQoKICBwaWNvY29sb3JzQDEuMS4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXhjZUgyc25odGI1TTlsaXFEc21FdzU2bGUzNzZtVFprRVgvakViL1J4TkZ5ZWdOdWw3ZU5zbENYUDlGRGovTGN1MFg4S0V5TWNlUDJudHBhSHJERVZBPT19CgogIHBvc3Rjc3NAOC41LjIzOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWc1MDU4NnpyNGJabXdGaVRsZmxNdThFMGJEVGI1STVnZXJ0Z3dBS21zZFVsVFFJaFp0dW56VWxEMVdTendjVldQb0FWcHNyQTZ2bGZDRDdvWHZSd2dnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogXjEwIHx8IF4xMiB8fCA+PTE0fQoKICBwb3N0Z3Jlcy1hcnJheUAyLjAuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1WcFpyVXFVNUE2OWVReVcyYzVDQTFqdExlY0NzTjJVL2JENlZpbHJGRFdxNSs1VUlFVk83bmF6UzNURWNIZjF6dVBZTy9zcUd2VXZXNjJnODZSWFp1QT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQnfQoKICBwb3N0Z3Jlcy1ieXRlYUAxLjAuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01KzVIcVhuc1pQRTY1SUpaU01rWnRVUkFSWmVsZWwyb1hVRU84ckg4M1ZTL2h4SDV2djF1SHF1UGc1d1pzOHlNQWZkdjk3MUlVK2tjUFVjemk3TlZCUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHBvc3RncmVzLWRhdGVAMS4wLjc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItc3VEbWpMVlFnNzhuTUsyVVo0NTRoQUcrT0FXK0hRUFo2bisrVE5EVVgrTDArdVVsTHl3bm94SktEb3U1MVptK3pUQ2pyQ2wwTnE2SjlDNWhQOXZLL1E9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0wLjEwLjAnfQoKICBwb3N0Z3Jlcy1pbnRlcnZhbEAxLjIuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi05WmhYS00vcnczNTBOMW92dVdIYkd4bkdoL1NOSjRjbnhIaU0wcnhFNFZONDF3c2c4UDh6V245aHYvYnVLMDBSUDRXdmxPeXIvUkJEaXB0eXhWYmtaUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHJlYWN0LWRvbUAxOS4zLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItSkRrOGRnaWY1MU9qRm9ERTcwK09UOUlDeVlyKzY5SGxtaWhOd3AxK05zZmJuYTN0NXNJaUNhOVpKa3REbVE0LzFiL3JuMjZoSUFSMnVZWERNcjVyMFE9PX0KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHJlYWN0OiBeMTkuMy4wCgogIHJlYWN0QDE5LjMuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1FOExVY2J0Qld0MjBiYmwyWW9IZng0WkRCZHhWVGZPS3RDWm45Y0RTSjRsNi9udW9BcGNwSUJjajQ3dDJ3Wm9WWDhnMlpIdU1IYmlTaGdDUjFUNVNvZz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHNjaGVkdWxlckAwLjI4LjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItanVvcmZDbUlrSXc4dFQrcDVCWFNtNlBKalFGL3ljRVltS3l6VVJDSXQvUmFaSWhMK1B1bGJROVl1MnoxSGRPSkRkcURUbHhBMSt4S0JtSFhKc2N6QXc9PX0KCiAgc2VtdmVyQDcuOC41OgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVk3L0tEc2I4TGpvb1pwd2FxR3l1bE82RFFsa3NnQ25jY2hIR2src1pJWTRTQnZVb2NNQkVGSDVVcjFmSTRkVitKdmwwdzZjanZ1Y2FJaTQwcHVSaW9BPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MTAnfQogICAgaGFzQmluOiB0cnVlCgogIHNoYXJwQDAuMzUuNToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1Zd240T256R3VrcDdDRE1ycDA4UlE1MFlLbXV3RzQ3YnJaZ0lWUFR2QmFhQWZRbFJseWdyUnFTcnhkQ2lMOU0rTGx6TEJpSjY4SVIxUXF2ekh5akM3Zz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBwZWVyRGVwZW5kZW5jaWVzOgogICAgICAnQHR5cGVzL25vZGUnOiAnKicKICAgIHBlZXJEZXBlbmRlbmNpZXNNZXRhOgogICAgICAnQHR5cGVzL25vZGUnOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHNvdXJjZS1tYXAtanNAMS4yLjI6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItS0dqLzhZNDN4MzVhWlZEdHQrSjRtSzFob0xHSFVMTVlmU2tPREpOUWpOREMzb1cxUHFQb3hNd28wcExVc1dNL1VFR3pPTi9OeGVIeXdFZk5YTlAzVnc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0wLjEwLjAnfQoKICBzcGxpdDJANC4yLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItVWNqY0pPV2tuck5rRjZQTFg4M3FjSE02S0hnVktOa1Y2Mlk4YTV1WURWdjl5ZEdRVndBSE1LcUhkSmplMVZUV3BsakcwV1lwQ0RockNkQU9ZSDRUV2c9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTAueCd9CgogIHN0eWxlZC1qc3hANS4xLjY6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcVNWeURUZU1vdGR2UVlvSFdMTkd3UkZKSEMraStadmRCUllvc09GZ0MrV2cxdng0ZnJOMi9SRy9OQTdTWXFxdktOTGYzOVAyTFNSQTJwdTZuMFhZWkE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTIuMC4wJ30KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgICdAYmFiZWwvY29yZSc6ICcqJwogICAgICBiYWJlbC1wbHVnaW4tbWFjcm9zOiAnKicKICAgICAgcmVhY3Q6ICc+PSAxNi44LjAgfHwgMTcueC54IHx8IF4xOC4wLjAtMCB8fCBeMTkuMC4wLTAnCiAgICBwZWVyRGVwZW5kZW5jaWVzTWV0YToKICAgICAgJ0BiYWJlbC9jb3JlJzoKICAgICAgICBvcHRpb25hbDogdHJ1ZQogICAgICBiYWJlbC1wbHVnaW4tbWFjcm9zOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHRzbGliQDIuOC4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLW9KRnU5NEhRYitLVmR1U1VRTDd3bnBtcW5mbUxzT0EvbkFoNmI2RUgwd0NFb0swL21QZVhVNmMzd0tEVjgzTWtPdUhQUkh0U1hLS1U5OUlCYXpTLzJ3PT19CgogIHh0ZW5kQDQuMC4yOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxLWVUxaUFYSlhVZ0FYbjlVUmppdStNV2h5VVhIc3ZmcDdtY3VZbTlkU1VLSzAvQ2p0clV3RkF4RDgyL21DV2J0THNHakZJYWQwd0lzb2Q0enJUQUVRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MC40J30KCnNuYXBzaG90czoKCiAgJ0BlbW5hcGkvcnVudGltZUAxLjExLjMnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICB0c2xpYjogMi44LjEKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL2NvbG91ckAxLjEuMCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1kYXJ3aW4tYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi1hcm02NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1kYXJ3aW4teDY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4teDY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWZyZWVic2Qtd2FzbTMyQDAuMzUuNSc6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgICdAaW1nL3NoYXJwLXdhc20zMic6IDAuMzUuNQogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4tYXJtNjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4teDY0QDEuMy40JzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtNjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm1AMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1wcGM2NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXg2NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC14NjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGludXgtYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LWFybTY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LWFybUAwLjM1LjUnOgogICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtJzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LXBwYzY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1wcGM2NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eC1yaXNjdjY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1yaXNjdjY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LXMzOTB4QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eC14NjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXg2NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eG11c2wtYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eG11c2wteDY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eG11c2wteDY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLXdhc20zMkAwLjM1LjUnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICAnQGVtbmFwaS9ydW50aW1lJzogMS4xMS4zCiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13ZWJjb250YWluZXJzLXdhc20zMkAwLjM1LjUnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC13YXNtMzInOiAwLjM1LjUKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLXdpbjMyLWFybTY0QDAuMzUuNSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13aW4zMi1pYTMyQDAuMzUuNSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13aW4zMi14NjRAMC4zNS41JzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9lbnZAMTYuNC4xJzoge30KCiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjRAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2MtZGFyd2luLXg2NEAxNi40LjEnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnVAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbEAxNi40LjEnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251QDE2LjQuMSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsQDE2LjQuMSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmNAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2Mtd2luMzIteDY0LW1zdmNAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAc3djL2hlbHBlcnNAMC41LjIzJzoKICAgIGRlcGVuZGVuY2llczoKICAgICAgdHNsaWI6IDIuOC4xCgogIGJhc2VsaW5lLWJyb3dzZXItbWFwcGluZ0AyLjExLjMxOiB7fQoKICBjYW5pdXNlLWxpdGVAMS4wLjMwMDAxODE5OiB7fQoKICBjbGllbnQtb25seUAwLjAuMToge30KCiAgZGV0ZWN0LWxpYmNAMi4xLjI6CiAgICBvcHRpb25hbDogdHJ1ZQoKICBuYW5vaWRAMy4zLjIwOiB7fQoKICBuZXh0QDE2LjQuMShyZWFjdC1kb21AMTkuMy4wKHJlYWN0QDE5LjMuMCkpKHJlYWN0QDE5LjMuMCk6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgICdAbmV4dC9lbnYnOiAxNi40LjEKICAgICAgJ0Bzd2MvaGVscGVycyc6IDAuNS4yMwogICAgICBiYXNlbGluZS1icm93c2VyLW1hcHBpbmc6IDIuMTEuMzEKICAgICAgY2FuaXVzZS1saXRlOiAxLjAuMzAwMDE4MTkKICAgICAgcG9zdGNzczogOC41LjIzCiAgICAgIHJlYWN0OiAxOS4zLjAKICAgICAgcmVhY3QtZG9tOiAxOS4zLjAocmVhY3RAMTkuMy4wKQogICAgICBzdHlsZWQtanN4OiA1LjEuNihyZWFjdEAxOS4zLjApCiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JzogMTYuNC4xCiAgICAgICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JzogMTYuNC4xCiAgICAgICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCc6IDE2LjQuMQogICAgICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCc6IDE2LjQuMQogICAgICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmMnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy13aW4zMi14NjQtbXN2Yyc6IDE2LjQuMQogICAgICBzaGFycDogMC4zNS41CiAgICB0cmFuc2l0aXZlUGVlckRlcGVuZGVuY2llczoKICAgICAgLSAnQGJhYmVsL2NvcmUnCiAgICAgIC0gJ0B0eXBlcy9ub2RlJwogICAgICAtIGJhYmVsLXBsdWdpbi1tYWNyb3MKCiAgcGctY2xvdWRmbGFyZUAxLjQuMToKICAgIG9wdGlvbmFsOiB0cnVlCgogIHBnLWNvbm5lY3Rpb24tc3RyaW5nQDIuMTQuMToge30KCiAgcGctaW50OEAxLjAuMToge30KCiAgcGctcG9vbEAzLjE0LjAocGdAOC4yMy4wKToKICAgIGRlcGVuZGVuY2llczoKICAgICAgcGc6IDguMjMuMAoKICBwZy1wcm90b2NvbEAxLjE2LjE6IHt9CgogIHBnLXR5cGVzQDIuMi4wOgogICAgZGVwZW5kZW5jaWVzOgogICAgICBwZy1pbnQ4OiAxLjAuMQogICAgICBwb3N0Z3Jlcy1hcnJheTogMi4wLjAKICAgICAgcG9zdGdyZXMtYnl0ZWE6IDEuMC4xCiAgICAgIHBvc3RncmVzLWRhdGU6IDEuMC43CiAgICAgIHBvc3RncmVzLWludGVydmFsOiAxLjIuMAoKICBwZ0A4LjIzLjA6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgIHBnLWNvbm5lY3Rpb24tc3RyaW5nOiAyLjE0LjEKICAgICAgcGctcG9vbDogMy4xNC4wKHBnQDguMjMuMCkKICAgICAgcGctcHJvdG9jb2w6IDEuMTYuMQogICAgICBwZy10eXBlczogMi4yLjAKICAgICAgcGdwYXNzOiAxLjAuNQogICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6CiAgICAgIHBnLWNsb3VkZmxhcmU6IDEuNC4xCgogIHBncGFzc0AxLjAuNToKICAgIGRlcGVuZGVuY2llczoKICAgICAgc3BsaXQyOiA0LjIuMAoKICBwaWNvY29sb3JzQDEuMS4xOiB7fQoKICBwb3N0Y3NzQDguNS4yMzoKICAgIGRlcGVuZGVuY2llczoKICAgICAgbmFub2lkOiAzLjMuMjAKICAgICAgcGljb2NvbG9yczogMS4xLjEKICAgICAgc291cmNlLW1hcC1qczogMS4yLjIKCiAgcG9zdGdyZXMtYXJyYXlAMi4wLjA6IHt9CgogIHBvc3RncmVzLWJ5dGVhQDEuMC4xOiB7fQoKICBwb3N0Z3Jlcy1kYXRlQDEuMC43OiB7fQoKICBwb3N0Z3Jlcy1pbnRlcnZhbEAxLjIuMDoKICAgIGRlcGVuZGVuY2llczoKICAgICAgeHRlbmQ6IDQuMC4yCgogIHJlYWN0LWRvbUAxOS4zLjAocmVhY3RAMTkuMy4wKToKICAgIGRlcGVuZGVuY2llczoKICAgICAgcmVhY3Q6IDE5LjMuMAogICAgICBzY2hlZHVsZXI6IDAuMjguMAoKICByZWFjdEAxOS4zLjA6IHt9CgogIHNjaGVkdWxlckAwLjI4LjA6IHt9CgogIHNlbXZlckA3LjguNToKICAgIG9wdGlvbmFsOiB0cnVlCgogIHNoYXJwQDAuMzUuNToKICAgIGRlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvY29sb3VyJzogMS4xLjAKICAgICAgZGV0ZWN0LWxpYmM6IDIuMS4yCiAgICAgIHNlbXZlcjogNy44LjUKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1kYXJ3aW4tYXJtNjQnOiAwLjM1LjUKICAgICAgJ0BpbWcvc2hhcnAtZGFyd2luLXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1mcmVlYnNkLXdhc20zMic6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtZGFyd2luLXg2NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtJzogMS4zLjQKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtcHBjNjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXMzOTB4JzogMS4zLjQKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC14NjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXhtdXNsLXg2NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LWFybSc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1hcm02NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1wcGM2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1yaXNjdjY0JzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LXMzOTB4JzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eG11c2wtYXJtNjQnOiAwLjM1LjUKICAgICAgJ0BpbWcvc2hhcnAtbGludXhtdXNsLXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13ZWJjb250YWluZXJzLXdhc20zMic6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13aW4zMi1hcm02NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13aW4zMi1pYTMyJzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLXdpbjMyLXg2NCc6IDAuMzUuNQogICAgb3B0aW9uYWw6IHRydWUKCiAgc291cmNlLW1hcC1qc0AxLjIuMjoge30KCiAgc3BsaXQyQDQuMi4wOiB7fQoKICBzdHlsZWQtanN4QDUuMS42KHJlYWN0QDE5LjMuMCk6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgIGNsaWVudC1vbmx5OiAwLjAuMQogICAgICByZWFjdDogMTkuMy4wCgogIHRzbGliQDIuOC4xOiB7fQoKICB4dGVuZEA0LjAuMjoge30K"}]},"node-worker-cron":{"files":[{"path":".env.example","exec":false,"body":"REFUQUJBU0VfVVJMPQo="},{"path":"README.md","exec":false,"body":"IyBOb2RlIHdvcmtlciBhbmQgY3JvbiBqb2IKClR3byBzbWFsbCBhcHBzIHRoYXQgcnVuIGJlc2lkZSB5b3VyIHdlYiBhcHAgYW5kIHNoYXJlIGl0cyBQb3N0Z3JlcyBkYXRhYmFzZS4gVGhlIHdvcmtlciB0YWtlcyBqb2JzIGZyb20gYSBgam9ic2AgdGFibGUsIG9uZSBhdCBhIHRpbWUuIFRoZSBjcm9uIGpvYiB3cml0ZXMgYSByb3cgdG8gYSBgaGVhcnRiZWF0c2AgdGFibGUgb24gdGhlIHNjaGVkdWxlIGluIHN0ZXAgMy4KCk5laXRoZXIgYXBwIGhhcyBhIHB1YmxpYyBhZGRyZXNzIG9yIG9wZW5zIGEgcG9ydC4gRWFjaCBhcHAgY3JlYXRlcyBpdHMgdGFibGUgb24gaXRzIGZpcnN0IHJ1bi4KCiMjIERlcGxveSB3aXRoIHRoZSBBc3RyaXMgTUNQCgpDb3B5IHRoZXNlIGZpbGVzIHRvIHRoZSByb290IG9mIHlvdXIgb3duIHJlcG9zaXRvcnkgYW5kIHB1c2ggaXQuIEluIHRoZSBjYWxscyBiZWxvdywgcmVwbGFjZSBgT1dORVIvUkVQT2Agd2l0aCB0aGF0IHJlcG9zaXRvcnkuIElmIHRoZSBmaWxlcyBhcmUgaW4gYSBzdWJmb2xkZXIsIGFkZCBgImJ1aWxkX3BhdGgiOiAiLzxzdWJmb2xkZXI+ImAgdG8gYm90aCBkZXBsb3kgY2FsbHMuCgoxLiBDcmVhdGUgdGhlIGRhdGFiYXNlLiBJZiB5b3VyIHdlYiBhcHAgYWxyZWFkeSBoYXMgb25lLCBza2lwIHRoaXMgc3RlcCBhbmQgdXNlIHRoYXQgZGF0YWJhc2UuCgpgYGBqc29uCnsidG9vbCI6ICJkYXRhYmFzZSIsICJhcmd1bWVudHMiOiB7ImFjdGlvbiI6ICJjcmVhdGUiLCAicHJvamVjdCI6ICJteS1wcm9qZWN0IiwgIm5hbWUiOiAibWFpbi1kYiIsICJraW5kIjogInBvc3RncmVzIn19CmBgYAoKQnVpbGQgYERBVEFCQVNFX1VSTGAgZnJvbSB0aGUgcmVzdWx0OiBgcG9zdGdyZXM6Ly88dXNlcj46PHBhc3N3b3JkPkA8aG9zdD46PHBvcnQ+LzxkYXRhYmFzZT5gLiBBc3RyaXMgc2hvd3MgdGhlIHBhc3N3b3JkIG9ubHkgaW4gdGhpcyByZXN1bHQsIHNvIGtlZXAgaXQgbm93LgoKMi4gRGVwbG95IHRoZSB3b3JrZXIuCgpgYGBqc29uCnsidG9vbCI6ICJkZXBsb3kiLCAiYXJndW1lbnRzIjogeyJwcm9qZWN0IjogIm15LXByb2plY3QiLCAibmFtZSI6ICJqb2JzLXdvcmtlciIsICJnaXRfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9PV05FUi9SRVBPIiwgImJyYW5jaCI6ICJtYWluIiwgImtpbmQiOiAid29ya2VyIiwgImNvbW1hbmQiOiAibm9kZSB3b3JrZXIubWpzIn19CmBgYAoKMy4gRGVwbG95IHRoZSBjcm9uIGpvYi4gVGhlIHNjaGVkdWxlIGhhcyBmaXZlIGZpZWxkcy4KCmBgYGpzb24KeyJ0b29sIjogImRlcGxveSIsICJhcmd1bWVudHMiOiB7InByb2plY3QiOiAibXktcHJvamVjdCIsICJuYW1lIjogImpvYnMtY3JvbiIsICJnaXRfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9PV05FUi9SRVBPIiwgImJyYW5jaCI6ICJtYWluIiwgImtpbmQiOiAiY3JvbiIsICJjb21tYW5kIjogIm5vZGUgaGVhcnRiZWF0Lm1qcyIsICJzY2hlZHVsZSI6ICIqLzUgKiAqICogKiJ9fQpgYGAKCjQuIFNldCBgREFUQUJBU0VfVVJMYCBvbiB0aGUgd29ya2VyLCB3aXRoIHRoZSBhcHAgaWQgdGhhdCBzdGVwIDIgcmV0dXJucy4gVGhlIGBlbnZgIGNhbGwgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gaWYgdGhlIGFwcCBoYXMgb3RoZXIgdmFyaWFibGVzLCBzZW5kIHRoZW0gaW4gdGhlIHNhbWUgY2FsbC4gVGhlbiBkZXBsb3kgdGhlIHdvcmtlciBhZ2FpbiwgYmVjYXVzZSBhIG5ldyB2YWx1ZSBhcHBsaWVzIG9ubHkgYXQgdGhlIG5leHQgZGVwbG95LgoKYGBganNvbgp7InRvb2wiOiAiZW52IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIldPUktFUl9BUFBfSUQiLCAidmFyaWFibGVzIjogeyJEQVRBQkFTRV9VUkwiOiAicG9zdGdyZXM6Ly9VU0VSOlBBU1NXT1JEQEhPU1Q6NTQzMi9EQVRBQkFTRSJ9fX0KYGBgCgpgYGBqc29uCnsidG9vbCI6ICJkZXBsb3kiLCAiYXJndW1lbnRzIjogeyJhcHBfaWQiOiAiV09SS0VSX0FQUF9JRCJ9fQpgYGAKCjUuIERvIHRoZSBzYW1lIGZvciB0aGUgY3JvbiBqb2IsIHdpdGggdGhlIGFwcCBpZCB0aGF0IHN0ZXAgMyByZXR1cm5zLgoKYGBganNvbgp7InRvb2wiOiAiZW52IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIkNST05fQVBQX0lEIiwgInZhcmlhYmxlcyI6IHsiREFUQUJBU0VfVVJMIjogInBvc3RncmVzOi8vVVNFUjpQQVNTV09SREBIT1NUOjU0MzIvREFUQUJBU0UifX19CmBgYAoKYGBganNvbgp7InRvb2wiOiAiZGVwbG95IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIkNST05fQVBQX0lEIn19CmBgYAoKNi4gSWYgeW91ciB3ZWIgYXBwIGRvZXMgbm90IGhhdmUgYERBVEFCQVNFX1VSTGAgeWV0LCBzZXQgdGhlIHNhbWUgdmFsdWUgb24gaXQuIFNlbmQgYWxsIG9mIGl0cyBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgYGVudmAgY2FsbCwgdGhlbiBkZXBsb3kgaXQgYWdhaW4uCgojIyBRdWV1ZSBhIGpvYiBmcm9tIHlvdXIgd2ViIGFwcAoKYGBgc3FsCklOU0VSVCBJTlRPIGpvYnMgKGtpbmQsIHBheWxvYWQpIFZBTFVFUyAoJ3NlbmQtd2VsY29tZS1lbWFpbCcsICd7InVzZXJfaWQiOiA0Mn0nKTsKYGBgCgpUaGUgd29ya2VyIG1hcmtzIHRoZSBqb2IgYHJ1bm5pbmdgLCB0aGVuIGBkb25lYC4gSWYgdGhlIGpvYiBmYWlscywgdGhlIHdvcmtlciBtYXJrcyBpdCBgZmFpbGVkYCBhbmQgc3RvcmVzIHRoZSBlcnJvci4gUHV0IHlvdXIgb3duIHdvcmsgaW4gdGhlIGBoYW5kbGVgIGZ1bmN0aW9uIGluIGB3b3JrZXIubWpzYC4KCiMjIFdoYXQgcnVucyB3aGVyZQoKLSBgd29ya2VyLm1qc2AgaXMgdGhlIHByb2Nlc3Mgb2YgdGhlIHdvcmtlciBhcHAuCi0gYGhlYXJ0YmVhdC5tanNgIGlzIHRoZSBjcm9uIGNvbW1hbmQuIEl0IHJ1bnMgb24gdGhlIHNjaGVkdWxlLCBpbnNpZGUgdGhlIGNvbnRhaW5lciBvZiB0aGUgY3JvbiBhcHAuCi0gYGtlZXBhbGl2ZS5tanNgIGlzIHRoZSBzdGFydCBvZiB0aGUgY3JvbiBhcHAuIEl0IG9ubHkga2VlcHMgdGhlIGNvbnRhaW5lciBydW5uaW5nLCBzbyB0aGF0IHRoZSBzY2hlZHVsZSBjYW4gcnVuIGluc2lkZSBpdC4KLSBgc3FsLm1qc2AgaG9sZHMgZXZlcnkgU1FMIHN0YXRlbWVudC4K"},{"path":"heartbeat.mjs","exec":false,"body":"Ly8gVGhlIGNyb24gY29tbWFuZDogd3JpdGVzIG9uZSBoZWFydGJlYXRzIHJvdywgdGhlbiBleGl0cy4KaW1wb3J0IHBnIGZyb20gInBnIjsKaW1wb3J0IHsgSEVBUlRCRUFULCBTQ0hFTUEgfSBmcm9tICIuL3NxbC5tanMiOwoKY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuREFUQUJBU0VfVVJMOwppZiAoIXVybCkgewogIGNvbnNvbGUuZXJyb3IoIkRBVEFCQVNFX1VSTCBpcyBub3Qgc2V0LiBTZXQgaXQgb24gdGhpcyBhcHAsIHRoZW4gZGVwbG95IGFnYWluLiIpOwogIHByb2Nlc3MuZXhpdCgxKTsKfQoKY29uc3QgY2xpZW50ID0gbmV3IHBnLkNsaWVudCh7IGNvbm5lY3Rpb25TdHJpbmc6IHVybCB9KTsKYXdhaXQgY2xpZW50LmNvbm5lY3QoKTsKdHJ5IHsKICBhd2FpdCBjbGllbnQucXVlcnkoU0NIRU1BKTsKICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IGNsaWVudC5xdWVyeShIRUFSVEJFQVQpOwogIGNvbnNvbGUubG9nKGBoZWFydGJlYXQgJHtyb3dzWzBdLmlkfSBhdCAke3Jvd3NbMF0uYXQudG9JU09TdHJpbmcoKX1gKTsKfSBmaW5hbGx5IHsKICBhd2FpdCBjbGllbnQuZW5kKCk7Cn0K"},{"path":"keepalive.mjs","exec":false,"body":"Ly8gVGhlIGNyb24gYXBwJ3Mgc3RhcnQuIFRoZSBzY2hlZHVsZSBydW5zIGl0cyBjb21tYW5kIGluc2lkZSB0aGlzIHJ1bm5pbmcKLy8gY29udGFpbmVyLCBzbyB0aGUgY29udGFpbmVyIG11c3Qgc3RheSB1cC4gVGhpcyBkb2VzIG5vIHdvcmsgYW5kIG9wZW5zIG5vIHBvcnQuCmNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge30sIDEgPDwgMzApOwpwcm9jZXNzLm9uKCJTSUdURVJNIiwgKCkgPT4gewogIGNsZWFySW50ZXJ2YWwodGltZXIpOwogIHByb2Nlc3MuZXhpdCgwKTsKfSk7CmNvbnNvbGUubG9nKCJ3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGUiKTsK"},{"path":"package-lock.json","exec":false,"body":"ewogICJuYW1lIjogIm5vZGUtd29ya2VyLWNyb24iLAogICJsb2NrZmlsZVZlcnNpb24iOiAzLAogICJyZXF1aXJlcyI6IHRydWUsCiAgInBhY2thZ2VzIjogewogICAgIiI6IHsKICAgICAgIm5hbWUiOiAibm9kZS13b3JrZXItY3JvbiIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInBnIjogIl44LjEzLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIjIyIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZyI6IHsKICAgICAgInZlcnNpb24iOiAiOC4yMy4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BnLy0vcGctOC4yMy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFMOTZBSEFOdFdqUExET0xxbmh4K25ncDkrVUs3RVRFVThWSnJEQ0d2c1NTaS9tR0xjV1lzUzZIZXJnN2xtYUJKZTR1d3JmcXNhN2dURUZhU2l6RG9RPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZy1jb25uZWN0aW9uLXN0cmluZyI6ICJeMi4xNC4xIiwKICAgICAgICAicGctcG9vbCI6ICJeMy4xNC4wIiwKICAgICAgICAicGctcHJvdG9jb2wiOiAiXjEuMTYuMSIsCiAgICAgICAgInBnLXR5cGVzIjogIjIuMi4wIiwKICAgICAgICAicGdwYXNzIjogIjEuMC41IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAxNi4wLjAiCiAgICAgIH0sCiAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyI6IHsKICAgICAgICAicGctY2xvdWRmbGFyZSI6ICJeMS40LjEiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZy1uYXRpdmUiOiAiPj0zLjAuMSIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXNNZXRhIjogewogICAgICAgICJwZy1uYXRpdmUiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZy1jbG91ZGZsYXJlIjogewogICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1jbG91ZGZsYXJlLy0vcGctY2xvdWRmbGFyZS0xLjQuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UFFic0ZXWmNwOUVtSkV3eTVjR1EyTGErQU1XcFA0NmxnYmI4WCtVL1hzSElVd2VZRE5DcGV1S2NrNVJ4TDJNZFZGaTdrcmJiRWk1blg0Wmg3SmhyUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctY29ubmVjdGlvbi1zdHJpbmciOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMTQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1jb25uZWN0aW9uLXN0cmluZy8tL3BnLWNvbm5lY3Rpb24tc3RyaW5nLTIuMTQuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xUjNrR05QQkxwQ050ejBldmJLQTBZL01SRlh3U1NkVCtwVEp2WXAvYlhUY1JlWmJ2WDFrekYwSXlUYzFRbnhxRjdBWmJPZUJoTkw4UjVtWVFaVi9NQT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctaW50OCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGctaW50OC8tL3BnLWludDgtMS4wLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItV0N0YWJTNnQzYzhTa3BEQlVsYjFrak9zN2w2NnhzR2RLcElQWnNnNHdSK0IzK3U5VUF1bTJvZFNzRjl0bnZ4ZzgwaDRaeExXTXk0cFJqT3NGSXFRcHc9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NC4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3BnLXBvb2wiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMTQuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1wb29sLy0vcGctcG9vbC0zLjE0LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0t0UGtGZFFQVTNEa3Nvb1ZMaTlMc2paeHJzQlVaSXBhKzdhVngrTFY1cE5oMEt6UDRabGV1ZDJwbytDb25yeGJ1WEdCSjZIZmVyNmhkZ3BJQnBCYXc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZyI6ICI+PTguMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctcHJvdG9jb2wiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1wcm90b2NvbC8tL3BnLXByb3RvY29sLTEuMTYuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wOVZPRk1pSEIvWmJKQVRldGJnKzk5UHhzc1RWU1FSbnl1UFNRNjdtTjErMUtCT2paYVo4M1pRemx0bnhQaEp3U3NDM253VmpKMTBEVkpsZXJiRnpMZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctdHlwZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BnLXR5cGVzLy0vcGctdHlwZXMtMi4yLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVRBQWxyRXNsOHM0T2lFUVk2OXdEdmNNSWRRTjZ3ZHo1b2pRaU95NllSTXV5bnhlbk9OME81b0NwSkk2bHNoYzZzY2dBWThxdkoyT24vcCtDWFkwR0E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInBnLWludDgiOiAiMS4wLjEiLAogICAgICAgICJwb3N0Z3Jlcy1hcnJheSI6ICJ+Mi4wLjAiLAogICAgICAgICJwb3N0Z3Jlcy1ieXRlYSI6ICJ+MS4wLjAiLAogICAgICAgICJwb3N0Z3Jlcy1kYXRlIjogIn4xLjAuNCIsCiAgICAgICAgInBvc3RncmVzLWludGVydmFsIjogIl4xLjEuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj00IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZ3Bhc3MiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BncGFzcy8tL3BncGFzcy0xLjAuNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GZFc5ci9qUVpoU2VvaHMxWjNzSTF5eEZRTkZ2TWNubWZ1ajRXQk1VVHhPckF5TE1hVGNFMWFBTUJpVGxiTU5hWHZCQ1F1VmkwUjdoZDh1ZERTUDd1Zz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAic3BsaXQyIjogIl40LjEuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcG9zdGdyZXMtYXJyYXkiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc3RncmVzLWFycmF5Ly0vcG9zdGdyZXMtYXJyYXktMi4wLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVnBaclVxVTVBNjllUXlXMmM1Q0ExanRMZWNDc04yVS9iRDZWaWxyRkRXcTUrNVVJRVZPN25helMzVEVjSGYxenVQWU8vc3FHdlV2VzYyZzg2UlhadUE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcG9zdGdyZXMtYnl0ZWEiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc3RncmVzLWJ5dGVhLy0vcG9zdGdyZXMtYnl0ZWEtMS4wLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNSs1SHFYbnNaUEU2NUlKWlNNa1p0VVJBUlplbGVsMm9YVUVPOHJIODNWUy9oeEg1dnYxdUhxdVBnNXdaczh5TUFmZHY5NzFJVStrY1BVY3ppN05WQlE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wb3N0Z3Jlcy1kYXRlIjogewogICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wb3N0Z3Jlcy1kYXRlLy0vcG9zdGdyZXMtZGF0ZS0xLjAuNy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zdURtakxWUWc3OG5NSzJVWjQ1NGhBRytPQVcrSFFQWjZuKytUTkRVWCtMMCt1VWxMeXdub3hKS0RvdTUxWm0relRDanJDbDBOcTZKOUM1aFA5dksvUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjEwLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3Bvc3RncmVzLWludGVydmFsIjogewogICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wb3N0Z3Jlcy1pbnRlcnZhbC8tL3Bvc3RncmVzLWludGVydmFsLTEuMi4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTlaaFhLTS9ydzM1ME4xb3Z1V0hiR3huR2gvU05KNGNueEhpTTByeEU0Vk40MXdzZzhQOHpXbjlodi9idUswMFJQNFd2bE95ci9SQkRpcHR5eFZia1pRPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9zcGxpdDIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Mi8tL3NwbGl0Mi00LjIuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VY2pjSk9Xa25yTmtGNlBMWDgzcWNITTZLSGdWS05rVjYyWThhNXVZRFZ2OXlkR1FWd0FITUtxSGRKamUxVlRXcGxqRzBXWXBDRGhyQ2RBT1lINFRXZz09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTAueCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMveHRlbmQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTEtZVTFpQVhKWFVnQVhuOVVSaml1K01XaHlVWEhzdmZwN21jdVltOWRTVUtLMC9DanRyVXdGQXhEODIvbUNXYnRMc0dqRklhZDB3SXNvZDR6clRBRVE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC40IgogICAgICB9CiAgICB9CiAgfQp9Cg=="},{"path":"package.json","exec":false,"body":"ewogICJuYW1lIjogIm5vZGUtd29ya2VyLWNyb24iLAogICJwcml2YXRlIjogdHJ1ZSwKICAidHlwZSI6ICJtb2R1bGUiLAogICJlbmdpbmVzIjogewogICAgIm5vZGUiOiAiMjIiCiAgfSwKICAic2NyaXB0cyI6IHsKICAgICJzdGFydCI6ICJub2RlIGtlZXBhbGl2ZS5tanMiCiAgfSwKICAiZGVwZW5kZW5jaWVzIjogewogICAgInBnIjogIl44LjEzLjAiCiAgfQp9Cg=="},{"path":"sql.mjs","exec":false,"body":"Ly8gU1FMIG9ubHksIHNvIGVhY2ggc3RhdGVtZW50IGNhbiBiZSByZWFkIGFuZCB0ZXN0ZWQgd2l0aG91dCBhIGRhdGFiYXNlIGRyaXZlci4KCi8vIEJvdGggdGFibGVzIGFyZSBjcmVhdGVkIGlmIG1pc3NpbmcsIHNvIGV2ZXJ5IHByb2Nlc3MgY2FuIHJ1biB0aGlzIGF0IHN0YXJ0LgpleHBvcnQgY29uc3QgU0NIRU1BID0gYApDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBqb2JzICgKICBpZCBiaWdzZXJpYWwgUFJJTUFSWSBLRVksCiAga2luZCB0ZXh0IE5PVCBOVUxMLAogIHBheWxvYWQganNvbmIgTk9UIE5VTEwgREVGQVVMVCAne30nOjpqc29uYiwKICBzdGF0dXMgdGV4dCBOT1QgTlVMTCBERUZBVUxUICdxdWV1ZWQnLAogIGNyZWF0ZWRfYXQgdGltZXN0YW1wdHogTk9UIE5VTEwgREVGQVVMVCBub3coKSwKICBzdGFydGVkX2F0IHRpbWVzdGFtcHR6LAogIGZpbmlzaGVkX2F0IHRpbWVzdGFtcHR6LAogIGVycm9yIHRleHQKKTsKQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgam9ic19xdWV1ZWQgT04gam9icyAoY3JlYXRlZF9hdCkgV0hFUkUgc3RhdHVzID0gJ3F1ZXVlZCc7CkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGhlYXJ0YmVhdHMgKAogIGlkIGJpZ3NlcmlhbCBQUklNQVJZIEtFWSwKICBhdCB0aW1lc3RhbXB0eiBOT1QgTlVMTCBERUZBVUxUIG5vdygpCik7CmA7CgovLyBUYWtlcyB0aGUgb2xkZXN0IHF1ZXVlZCBqb2IgYW5kIG1hcmtzIGl0IHJ1bm5pbmcuIFNLSVAgTE9DS0VEIGxldHMgc2V2ZXJhbAovLyB3b3JrZXJzIHJ1biBhdCBvbmNlIHdpdGhvdXQgdGFraW5nIHRoZSBzYW1lIGpvYi4KZXhwb3J0IGNvbnN0IENMQUlNID0gYApVUERBVEUgam9icyBTRVQgc3RhdHVzID0gJ3J1bm5pbmcnLCBzdGFydGVkX2F0ID0gbm93KCkKV0hFUkUgaWQgPSAoCiAgU0VMRUNUIGlkIEZST00gam9icyBXSEVSRSBzdGF0dXMgPSAncXVldWVkJwogIE9SREVSIEJZIGNyZWF0ZWRfYXQsIGlkCiAgRk9SIFVQREFURSBTS0lQIExPQ0tFRAogIExJTUlUIDEKKQpSRVRVUk5JTkcgaWQsIGtpbmQsIHBheWxvYWQKYDsKCi8vICQxIGpvYiBpZCwgJDIgJ2RvbmUnIG9yICdmYWlsZWQnLCAkMyBlcnJvciB0ZXh0IG9yIG51bGwuCmV4cG9ydCBjb25zdCBGSU5JU0ggPSBgClVQREFURSBqb2JzIFNFVCBzdGF0dXMgPSAkMiwgZmluaXNoZWRfYXQgPSBub3coKSwgZXJyb3IgPSAkMyBXSEVSRSBpZCA9ICQxCmA7CgpleHBvcnQgY29uc3QgSEVBUlRCRUFUID0gYElOU0VSVCBJTlRPIGhlYXJ0YmVhdHMgREVGQVVMVCBWQUxVRVMgUkVUVVJOSU5HIGlkLCBhdGA7Cg=="},{"path":"worker.mjs","exec":false,"body":"Ly8gVGhlIHdvcmtlciBhcHAncyBwcm9jZXNzOiB0YWtlcyBqb2JzIGZyb20gdGhlIGpvYnMgdGFibGUgb25lIGF0IGEgdGltZS4KLy8gSXQgb3BlbnMgbm8gcG9ydDsgQXN0cmlzIGdpdmVzIGEgd29ya2VyIGFwcCBubyBwdWJsaWMgYWRkcmVzcy4KaW1wb3J0IHBnIGZyb20gInBnIjsKaW1wb3J0IHsgQ0xBSU0sIEZJTklTSCwgU0NIRU1BIH0gZnJvbSAiLi9zcWwubWpzIjsKCmNvbnN0IHVybCA9IHByb2Nlc3MuZW52LkRBVEFCQVNFX1VSTDsKaWYgKCF1cmwpIHsKICBjb25zb2xlLmVycm9yKCJEQVRBQkFTRV9VUkwgaXMgbm90IHNldC4gU2V0IGl0IG9uIHRoaXMgYXBwLCB0aGVuIGRlcGxveSBhZ2Fpbi4iKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCmNvbnN0IHBvb2wgPSBuZXcgcGcuUG9vbCh7IGNvbm5lY3Rpb25TdHJpbmc6IHVybCwgbWF4OiAyIH0pOwovLyBBbiBpZGxlIGNvbm5lY3Rpb24gdGhhdCBkcm9wcyBpcyByZXBvcnRlZCBoZXJlOyB0aGUgbmV4dCBxdWVyeSBvcGVucyBhIG5ldyBvbmUuCnBvb2wub24oImVycm9yIiwgKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKCJ3b3JrZXI6IiwgU3RyaW5nKGVycm9yKSkpOwpsZXQgc3RvcHBpbmcgPSBmYWxzZTsKcHJvY2Vzcy5vbigiU0lHVEVSTSIsICgpID0+IHsKICBzdG9wcGluZyA9IHRydWU7Cn0pOwoKY29uc3Qgc2xlZXAgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7CgovLyBQdXQgeW91ciBvd24gd29yayBoZXJlLCBvbmUgYnJhbmNoIHBlciBqb2Iga2luZC4KY29uc3QgaGFuZGxlID0gYXN5bmMgKGpvYikgPT4gewogIGNvbnNvbGUubG9nKGBqb2IgJHtqb2IuaWR9ICR7am9iLmtpbmR9YCwgSlNPTi5zdHJpbmdpZnkoam9iLnBheWxvYWQpKTsKfTsKCmF3YWl0IHBvb2wucXVlcnkoU0NIRU1BKTsKY29uc29sZS5sb2coIndvcmtlciBzdGFydGVkIik7Ci8vIEEgam9iIHdob3NlIHdvcmtlciBzdG9wcGVkIG1pZC1qb2Igc3RheXMgJ3J1bm5pbmcnLiBUbyBydW4gaXQgYWdhaW4sIHB1dCBpdAovLyBiYWNrIGJ5IGlkIG9uY2UgeW91IGtub3cgbm8gd29ya2VyIHN0aWxsIHJ1bnMgaXQ6Ci8vIFVQREFURSBqb2JzIFNFVCBzdGF0dXMgPSAncXVldWVkJyBXSEVSRSBpZCA9IDxpZD4gQU5EIHN0YXR1cyA9ICdydW5uaW5nJzsKY29uc3Qgc3RlcCA9IGFzeW5jICgpID0+IHsKICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHBvb2wucXVlcnkoQ0xBSU0pOwogIGNvbnN0IGpvYiA9IHJvd3NbMF07CiAgaWYgKCFqb2IpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgYXdhaXQgaGFuZGxlKGpvYik7CiAgICBhd2FpdCBwb29sLnF1ZXJ5KEZJTklTSCwgW2pvYi5pZCwgImRvbmUiLCBudWxsXSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGF3YWl0IHBvb2wucXVlcnkoRklOSVNILCBbam9iLmlkLCAiZmFpbGVkIiwgU3RyaW5nKGVycm9yKS5zbGljZSgwLCAxMDAwKV0pOwogIH0KICByZXR1cm4gdHJ1ZTsKfTsKCndoaWxlICghc3RvcHBpbmcpIHsKICB0cnkgewogICAgaWYgKCEoYXdhaXQgc3RlcCgpKSkgYXdhaXQgc2xlZXAoMjAwMCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIC8vIEEgbG9zdCBkYXRhYmFzZSBjb25uZWN0aW9uOiB3YWl0LCB0aGVuIHRyeSBhZ2Fpbi4KICAgIGNvbnNvbGUuZXJyb3IoIndvcmtlcjoiLCBTdHJpbmcoZXJyb3IpKTsKICAgIGF3YWl0IHNsZWVwKDUwMDApOwogIH0KfQphd2FpdCBwb29sLmVuZCgpOwpjb25zb2xlLmxvZygid29ya2VyIHN0b3BwZWQiKTsK"}]}}