const __vite_ssr_import_0__ = await __vite_ssr_import__("claude-code/testing", {"importedNames":["expect","mock","test"]}); const setup = (on, kv) => { const ctl = { complete: () => ({ isAnswered: false, reason: "aborted" }), usage: { rateLimits: [], context: {} }, submitted: [] }; if (kv) { // 自備 store 以便檢查寫入內容。 on("store.get", (_$, e) => ({ value: kv.get(e.key) })); on("store.set", (_$, e) => (kv.set(e.key, e.value), { value: undefined })); } else __vite_ssr_import_0__.mock.store(on); ctl.clock = __vite_ssr_import_0__.mock.clock(on, { now: Date.parse("2026-10-15T08:00:00Z") }); on("ui.log", () => ({ value: undefined })); on("command.register", () => ({ value: { name: "x" } })); on("session.start", () => ({ cwd: "/tmp" })); on("command.run", () => ({ text: "" })); on("prompt.compose", () => ({ sections: [] })); on("prompt.submit", (_$, e) => (ctl.submitted.push(e.text), { text: e.text })); on("model.complete", (_$, e) => ({ value: ctl.complete(e) })); on("session.usage", () => ({ value: ctl.usage })); on("turn.step", async function* (_$, e) { ctl.seen = e; return { turnId: e.turnId, index: 0, answer: "", toolUses: [], stopReason: null, usage: null }; }); return ctl; }; const start = async ($, slug = "sao-asuna") => { await $.session.start({ source: "startup", cwd: "/tmp" }); await $.command.run({ command: slug, args: "" }); }; const affinity = async ($) => { const r = await $.command.run({ command: "anima-affinity", args: "" }); return Number(/好感度 (\d+)/.exec(r.text)?.[1]); }; const submit = ($, text) => $.prompt.submit({ text }); const step = async ($, model) => { const s = $.turn.step({ turnId: "t", index: 0, model, messageCount: 1 }); for await (const _ of s) void _; }; const usage = { input_tokens: 1, output_tokens: 1 }; const route = (model, tone = "neutral") => ({ isAnswered: true, usage, text: `{"difficulty":9,"model":"${model}","effort":"high","tone":"${tone}","ack":"好,我來看看。"}` }); const row = (text) => ({ message: { type: "assistant", role: "assistant", content: [{ type: "text", text }] }, door: "response", origin: { kind: "model", model: "m" }, uuid: "u" }); (0,__vite_ssr_import_0__.test)("輸入由 Haiku 一次分類,並依分類覆寫 turn.step 的模型與思考程度", async ($, on) => { const ctl = setup(on); const asked = []; ctl.complete = (e) => (asked.push(e.model), route("opus")); await start($); await submit($, "請重構整個模組"); await step($, "sonnet"); (0,__vite_ssr_import_0__.expect)(asked).toEqual(["haiku"]); (0,__vite_ssr_import_0__.expect)(ctl.seen.model).toBe("opus"); (0,__vite_ssr_import_0__.expect)(ctl.seen.effort).toBe("high"); }); (0,__vite_ssr_import_0__.test)("額度低於門檻自動降一級", async ($, on) => { const ctl = setup(on); ctl.complete = () => route("opus"); ctl.usage = { rateLimits: [{ kind: "five_hour", percentUsed: 95 }], context: {} }; await start($); await submit($, "x"); await step($, "opus"); (0,__vite_ssr_import_0__.expect)(ctl.seen.model).toBe("sonnet"); }); (0,__vite_ssr_import_0__.test)("手動鎖定模型與思考程度", { options: { lockModel: "haiku", lockEffort: "low" } }, async ($, on) => { const ctl = setup(on); ctl.complete = () => route("opus"); await start($); await submit($, "x"); await step($, "opus"); (0,__vite_ssr_import_0__.expect)([ctl.seen.model, ctl.seen.effort]).toEqual(["haiku", "low"]); }); (0,__vite_ssr_import_0__.test)("回覆改寫:保留程式碼、路徑、URL、數字;前綴只加在開頭一次", async ($, on) => { const ctl = setup(on); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt).replace("完成了", "做好囉") }); await start($); const src = "完成了,改了 `npm test` 與 /src/a/b.ts,見 https://x.dev/a,共 42 處。"; const r1 = await $.session.append(row(src)); (0,__vite_ssr_import_0__.expect)(r1.message.content[0].text).toBe("亞絲娜 > 做好囉,改了 `npm test` 與 /src/a/b.ts,見 https://x.dev/a,共 42 處。"); const r2 = await $.session.append(row("第二段 7")); (0,__vite_ssr_import_0__.expect)(r2.message.content[0].text.startsWith("亞絲娜 >")).toBe(false); }); (0,__vite_ssr_import_0__.test)("改寫失敗或遺失佔位符時顯示原文", async ($, on) => { const ctl = setup(on); await start($); const r1 = await $.session.append(row("原文 `x` 3")); (0,__vite_ssr_import_0__.expect)(r1.message.content[0].text).toBe("亞絲娜 > 原文 `x` 3"); ctl.complete = () => ({ isAnswered: true, usage, text: "丟了佔位符" }); const r2 = await $.session.append(row("原文 `y` 5")); (0,__vite_ssr_import_0__.expect)(r2.message.content[0].text).toBe("原文 `y` 5"); }); (0,__vite_ssr_import_0__.test)("改寫模型:長回覆用 Sonnet,一般回覆用 Haiku", async ($, on) => { const ctl = setup(on); const asked = []; ctl.complete = (e) => (asked.push(e.model), { isAnswered: true, usage, text: String(e.prompt) }); await start($); await $.session.append(row("短回覆")); await $.session.append(row("長".repeat(1300))); (0,__vite_ssr_import_0__.expect)(asked).toEqual(["haiku", "sonnet"]); }); (0,__vite_ssr_import_0__.test)("longReply 可調整長回覆門檻", { options: { longReply: 10 } }, async ($, on) => { const ctl = setup(on); const asked = []; ctl.complete = (e) => (asked.push(e.model), { isAnswered: true, usage, text: String(e.prompt) }); await start($); await $.session.append(row("十一個字的回覆內容喔喔")); await $.session.append(row("短")); (0,__vite_ssr_import_0__.expect)(asked).toEqual(["sonnet", "haiku"]); }); (0,__vite_ssr_import_0__.test)("改寫逾時、額度不足或拋錯時直接顯示原文", async ($, on) => { const ctl = setup(on); await start($); ctl.complete = () => ({ isAnswered: false, reason: "timeout" }); const r1 = await $.session.append(row("逾時 1")); (0,__vite_ssr_import_0__.expect)(r1.message.content[0].text).toBe("亞絲娜 > 逾時 1"); ctl.complete = () => ({ isAnswered: false, reason: "rate_limited" }); const r2 = await $.session.append(row("額度 2")); (0,__vite_ssr_import_0__.expect)(r2.message.content[0].text).toBe("額度 2"); ctl.complete = () => { throw new Error("quota"); }; const r3 = await $.session.append(row("拋錯 3")); (0,__vite_ssr_import_0__.expect)(r3.message.content[0].text).toBe("拋錯 3"); }); (0,__vite_ssr_import_0__.test)("改寫逾時設定傳給模型呼叫", { options: { rewriteTimeoutSec: 5 } }, async ($, on) => { const ctl = setup(on); let timeout = 0; ctl.complete = (e) => (timeout = e.timeoutMs, { isAnswered: false, reason: "timeout" }); await start($); await $.session.append(row("x")); (0,__vite_ssr_import_0__.expect)(timeout).toBe(5e3); }); const rawLog = (kv) => (kv.get("rawlog") ?? []).map((x) => x.raw); (0,__vite_ssr_import_0__.test)("原文 log 預設寫入,改寫失敗時不寫", async ($, on) => { const kv = new Map(); const ctl = setup(on, kv); await start($); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt) }); await $.session.append(row("原文甲")); ctl.complete = () => ({ isAnswered: false, reason: "timeout" }); await $.session.append(row("原文乙")); (0,__vite_ssr_import_0__.expect)(rawLog(kv)).toEqual(["原文甲"]); }); (0,__vite_ssr_import_0__.test)("在 /config 關閉原文 log 時不寫入", { options: { rawLog: false } }, async ($, on) => { const kv = new Map(); const ctl = setup(on, kv); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt) }); await start($); const r = await $.session.append(row("原文丙")); (0,__vite_ssr_import_0__.expect)(r.message.content[0].text).toBe("亞絲娜 > 原文丙"); (0,__vite_ssr_import_0__.expect)(rawLog(kv)).toEqual([]); }); (0,__vite_ssr_import_0__.test)("前綴只加在整則回覆開頭一次,多段文字區塊與多次寫入都不重複", async ($, on) => { const ctl = setup(on); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt) }); await start($); const multi = { message: { type: "assistant", role: "assistant", content: [ { type: "text", text: "第一段" }, { type: "tool_use", id: "t", name: "x", input: {} }, { type: "text", text: "第二段" } ] }, door: "response", origin: { kind: "model", model: "m" }, uuid: "u" }; const r = await $.session.append(multi); (0,__vite_ssr_import_0__.expect)(r.message.content[0].text).toBe("亞絲娜 > 第一段"); (0,__vite_ssr_import_0__.expect)(r.message.content[2].text).toBe("第二段"); const r2 = await $.session.append(row("同一回覆後續")); (0,__vite_ssr_import_0__.expect)(r2.message.content[0].text).toBe("同一回覆後續"); }); (0,__vite_ssr_import_0__.test)("新的使用者輸入後,下一則回覆重新加前綴", async ($, on) => { const ctl = setup(on); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt) }); await start($); await $.session.append(row("第一則")); ctl.complete = () => route("haiku"); await submit($, "再問一次"); ctl.complete = (e) => ({ isAnswered: true, usage, text: String(e.prompt) }); const r = await $.session.append(row("第二則")); (0,__vite_ssr_import_0__.expect)(r.message.content[0].text).toBe("亞絲娜 > 第二則"); }); (0,__vite_ssr_import_0__.test)("好感度:由 0 開始,每日首次互動加分且有每日上限", async ($, on) => { const ctl = setup(on); ctl.complete = () => route("haiku", "praise"); await start($); (0,__vite_ssr_import_0__.expect)(await affinity($)).toBe(0); await submit($, "謝謝你,做得很好"); const n = await affinity($); (0,__vite_ssr_import_0__.expect)(n > 0 && n <= 5).toBe(true); }); (0,__vite_ssr_import_0__.test)("關閉好感度時不記錄", { options: { affinity: false } }, async ($, on) => { const ctl = setup(on); ctl.complete = () => route("haiku", "praise"); await start($); await submit($, "謝謝"); (0,__vite_ssr_import_0__.expect)(await affinity($)).toBe(0); }); const personaText = async ($) => { const res = await $.prompt.compose({ model: "m", promptModel: "m", surfaces: [], tools: [], outputStyle: null, traits: [] }); return res.sections.find((s) => s.id === "jsc-anima:persona")?.text ?? ""; }; (0,__vite_ssr_import_0__.test)("好感度被責罵扣分但不跨階段掉落;可手動設定與重置", async ($, on) => { const ctl = setup(on); ctl.complete = () => route("haiku", "scold"); await start($); await $.command.run({ command: "anima-affinity", args: "20" }); await submit($, "你好笨"); (0,__vite_ssr_import_0__.expect)(await affinity($) >= 20).toBe(true); await $.command.run({ command: "anima-affinity", args: "reset" }); (0,__vite_ssr_import_0__.expect)(await affinity($)).toBe(0); }); (0,__vite_ssr_import_0__.test)("好感度階段反映在語氣,且不使用情緒勒索", async ($, on) => { setup(on); await start($); const t0 = await personaText($); (0,__vite_ssr_import_0__.expect)(t0.includes("生疏")).toBe(true); (0,__vite_ssr_import_0__.expect)(t0.includes("不使用愧疚感或情緒勒索")).toBe(true); await $.command.run({ command: "anima-affinity", args: "85" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("特別的存在")).toBe(true); }); (0,__vite_ssr_import_0__.test)("未成年角色維持友情,即使好感度最高且開啟戀愛式依賴", { options: { romance: true } }, async ($, on) => { setup(on); await start($, "sao-suguha"); await $.command.run({ command: "anima-affinity", args: "100" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("關係定位:友情")).toBe(true); }); // 以 fs 事件邊界提供角色包(characters/index.json),讓外掛自行載入成年角色。 const packs = (on, list) => { const files = new Map(); files.set("index.json", JSON.stringify({ packs: list.map((p) => ({ work: "tw", workName: "測試作品", slug: p.slug })) })); for (const p of list) { files.set(`tw/${p.slug}.json`, JSON.stringify({ work: "tw", slug: p.slug, name: "成年測試", persona: { selfRef: "我", address: "你", tone: "平穩", catchphrase: "好", values: "可靠", taboos: "無" }, axes: { gentle: 5, tsundere: 5, lively: 5, formal: 5, talkative: 5, humor: 5, proactive: 5, expressive: 5 }, anime: { moe: "", speech: "", emotions: "", kaomoji: "", themeColor: "cyan" }, timeline: [{ chapter: "第1章", age: 17, relationships: [] }, { chapter: "第2章", age: 20, relationships: p.romance ? [{ with: p.romance, kind: "romantic" }] : [] }] })); }; const key = (path) => path.replace(/^.*\/characters\//, ""); on("fs.exists", (_$, e) => ({ value: files.has(key(e.path)) })); on("fs.read", (_$, e) => ({ value: files.get(key(e.path)) ?? "" })); }; (0,__vite_ssr_import_0__.test)("成年且原作有戀愛關係:關係移轉給使用者,原戀人退為過去的重要人物", async ($, on) => { setup(on); packs(on, [{ slug: "lover", romance: "桐人" }]); await start($, "tw-lover"); const t = await personaText($); (0,__vite_ssr_import_0__.expect)(t.includes("已移轉給使用者")).toBe(true); (0,__vite_ssr_import_0__.expect)(t.includes("桐人")).toBe(true); (0,__vite_ssr_import_0__.expect)(t.includes("過去的重要人物")).toBe(true); }); (0,__vite_ssr_import_0__.test)("成年但原作無戀愛關係:需最高階段且明確開啟才進入戀愛式依賴", async ($, on) => { setup(on); packs(on, [{ slug: "plain" }]); await start($, "tw-plain"); await $.command.run({ command: "anima-affinity", args: "100" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("戀愛式依賴")).toBe(false); }); (0,__vite_ssr_import_0__.test)("成年無戀愛、最高階段但未在 /config 開啟:維持夥伴關係", { options: { romance: false } }, async ($, on) => { setup(on); packs(on, [{ slug: "plain" }]); await start($, "tw-plain"); await $.command.run({ command: "anima-affinity", args: "100" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("夥伴與朋友")).toBe(true); }); (0,__vite_ssr_import_0__.test)("成年無戀愛、已開啟但好感度未達最高階段:不進入戀愛式依賴", { options: { romance: true } }, async ($, on) => { setup(on); packs(on, [{ slug: "plain" }]); await start($, "tw-plain"); await $.command.run({ command: "anima-affinity", args: "79" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("戀愛式依賴")).toBe(false); }); (0,__vite_ssr_import_0__.test)("成年無戀愛、最高階段且已開啟:進入戀愛式依賴", { options: { romance: true } }, async ($, on) => { setup(on); packs(on, [{ slug: "plain" }]); await start($, "tw-plain"); await $.command.run({ command: "anima-affinity", args: "80" }); (0,__vite_ssr_import_0__.expect)((await personaText($)).includes("戀愛式依賴")).toBe(true); }); (0,__vite_ssr_import_0__.test)("長期不互動好感度緩慢下降,但不跨階段掉落", async ($, on) => { const ctl = setup(on); ctl.complete = () => route("haiku"); await start($); await submit($, "你好"); await $.command.run({ command: "anima-affinity", args: "45" }); await ctl.clock.advance(30 * 864e5); await submit($, "我回來了"); const n = await affinity($); (0,__vite_ssr_import_0__.expect)(n < 45).toBe(true); (0,__vite_ssr_import_0__.expect)(n >= 40).toBe(true); }); (0,__vite_ssr_import_0__.test)("個性軸影響扣分倍率:傲嬌角色掉得比溫柔角色多", async ($, on) => { const ctl = setup(on); ctl.complete = () => route("haiku"); packs(on, [{ slug: "plain" }]); const run = async (slug) => { await start($, slug); await submit($, "你好"); await $.command.run({ command: "anima-affinity", args: "70" }); await ctl.clock.advance(8 * 864e5); await submit($, "我回來了"); return affinity($); }; const proud = await run("tw-plain"); const calm = await run("sao-suguha"); (0,__vite_ssr_import_0__.expect)(proud < calm).toBe(true); }); const workRoute = (model, work) => ({ isAnswered: true, usage, text: `{"difficulty":8,"model":"${model}","effort":"high","tone":"neutral","ack":"好,我來處理。","work":${work}}` }); (0,__vite_ssr_import_0__.test)("需要動手的要求交給背景工作線,對話線改用 Haiku", async ($, on) => { const ctl = setup(on); const spawned = []; on("agent.spawn", (_$, e) => (spawned.push(e), { model: e.model, agentId: "a1" })); ctl.complete = () => workRoute("opus", true); await start($); await submit($, "幫我重構 src 目錄"); (0,__vite_ssr_import_0__.expect)(spawned.length).toBe(1); (0,__vite_ssr_import_0__.expect)(spawned[0].model).toBe("opus"); await step($, "main"); (0,__vite_ssr_import_0__.expect)(ctl.seen.model).toBe("haiku"); const sys = await $.prompt.compose({ model: "m", promptModel: "m", surfaces: [], tools: [], outputStyle: null, traits: [] }); (0,__vite_ssr_import_0__.expect)(sys.sections.find((s) => s.id === "jsc-anima:persona")?.text).toContain("背景工作線"); }); (0,__vite_ssr_import_0__.test)("work 為 false 或關閉背景工作線時不派工", async ($, on) => { const ctl = setup(on); let n = 0; on("agent.spawn", () => (n++, { model: "m", agentId: "a" })); ctl.complete = () => workRoute("sonnet", false); await start($); await submit($, "你好"); (0,__vite_ssr_import_0__.expect)(n).toBe(0); }); //# sourceMappingSource=vite-generated //# sourceMappingURL=data:application/json;base64,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TyxJQUFJLFNBQVMsTUFBTSxNQUFXLEVBQUUsT0FBTyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTztBQUM3RixDQUFDO0FBRUQsK0JBQUssNkJBQTZCLE9BQU8sR0FBRyxPQUFPO0NBQ2pELE1BQU0sTUFBTSxNQUFNLEVBQUU7Q0FDcEIsSUFBSSxJQUFJO0NBQ1IsR0FBRyxzQkFBc0IsS0FBSztFQUFFLE9BQU87RUFBSyxTQUFTO0NBQUksRUFBVztDQUNwRSxJQUFJLGlCQUFpQixVQUFVLFVBQVUsS0FBSztDQUM5QyxNQUFNLE1BQU0sQ0FBQztDQUNiLE1BQU0sT0FBTyxHQUFHLElBQUk7Q0FDcEIsaUNBQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2xCLENBQUMiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInJvdXRpbmcudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBlY3QsIG1vY2ssIHRlc3QgfSBmcm9tICdjbGF1ZGUtY29kZS90ZXN0aW5nJ1xuXG50eXBlIEN0bCA9IHsgY29tcGxldGU6IChlOiBhbnkpID0+IHVua25vd247IHVzYWdlOiB1bmtub3duOyBzZWVuPzogYW55OyBzdWJtaXR0ZWQ6IHN0cmluZ1tdOyBjbG9jaz86IGFueSB9XG5cbmNvbnN0IHNldHVwID0gKG9uOiBhbnksIGt2PzogTWFwPHN0cmluZywgdW5rbm93bj4pOiBDdGwgPT4ge1xuICBjb25zdCBjdGw6IEN0bCA9IHsgY29tcGxldGU6ICgpID0+ICh7IGlzQW5zd2VyZWQ6IGZhbHNlLCByZWFzb246ICdhYm9ydGVkJyB9KSwgdXNhZ2U6IHsgcmF0ZUxpbWl0czogW10sIGNvbnRleHQ6IHt9IH0sIHN1Ym1pdHRlZDogW10gfVxuICBpZiAoa3YpIHtcbiAgICAvLyDoh6rlgpkgc3RvcmUg5Lul5L6/5qqi5p+l5a+r5YWl5YWn5a6544CCXG4gICAgb24oJ3N0b3JlLmdldCcsIChfJDogYW55LCBlOiBhbnkpID0+ICh7IHZhbHVlOiBrdi5nZXQoZS5rZXkpIH0pIGFzIG5ldmVyKVxuICAgIG9uKCdzdG9yZS5zZXQnLCAoXyQ6IGFueSwgZTogYW55KSA9PiAoa3Yuc2V0KGUua2V5LCBlLnZhbHVlKSwgeyB2YWx1ZTogdW5kZWZpbmVkIH0pIGFzIG5ldmVyKVxuICB9IGVsc2UgbW9jay5zdG9yZShvbilcbiAgY3RsLmNsb2NrID0gbW9jay5jbG9jayhvbiwgeyBub3c6IERhdGUucGFyc2UoJzIwMjYtMTAtMTVUMDg6MDA6MDBaJykgfSlcbiAgb24oJ3VpLmxvZycsICgpID0+ICh7IHZhbHVlOiB1bmRlZmluZWQgfSkgYXMgbmV2ZXIpXG4gIG9uKCdjb21tYW5kLnJlZ2lzdGVyJywgKCkgPT4gKHsgdmFsdWU6IHsgbmFtZTogJ3gnIH0gfSkgYXMgbmV2ZXIpXG4gIG9uKCdzZXNzaW9uLnN0YXJ0JywgKCkgPT4gKHsgY3dkOiAnL3RtcCcgfSkgYXMgbmV2ZXIpXG4gIG9uKCdjb21tYW5kLnJ1bicsICgpID0+ICh7IHRleHQ6ICcnIH0pKVxuICBvbigncHJvbXB0LmNvbXBvc2UnLCAoKSA9PiAoeyBzZWN0aW9uczogW10gfSkpXG4gIG9uKCdwcm9tcHQuc3VibWl0JywgKF8kOiBhbnksIGU6IGFueSkgPT4gKGN0bC5zdWJtaXR0ZWQucHVzaChlLnRleHQpLCB7IHRleHQ6IGUudGV4dCB9KSBhcyBuZXZlcilcbiAgb24oJ21vZGVsLmNvbXBsZXRlJywgKF8kOiBhbnksIGU6IGFueSkgPT4gKHsgdmFsdWU6IGN0bC5jb21wbGV0ZShlKSB9KSBhcyBuZXZlcilcbiAgb24oJ3Nlc3Npb24udXNhZ2UnLCAoKSA9PiAoeyB2YWx1ZTogY3RsLnVzYWdlIH0pIGFzIG5ldmVyKVxuICBvbigndHVybi5zdGVwJywgYXN5bmMgZnVuY3Rpb24qIChfJDogYW55LCBlOiBhbnkpIHtcbiAgICBjdGwuc2VlbiA9IGVcbiAgICByZXR1cm4geyB0dXJuSWQ6IGUudHVybklkLCBpbmRleDogMCwgYW5zd2VyOiAnJywgdG9vbFVzZXM6IFtdLCBzdG9wUmVhc29uOiBudWxsLCB1c2FnZTogbnVsbCB9IGFzIG5ldmVyXG4gIH0pXG4gIHJldHVybiBjdGxcbn1cblxuY29uc3Qgc3RhcnQgPSBhc3luYyAoJDogYW55LCBzbHVnID0gJ3Nhby1hc3VuYScpID0+IHtcbiAgYXdhaXQgJC5zZXNzaW9uLnN0YXJ0KHsgc291cmNlOiAnc3RhcnR1cCcsIGN3ZDogJy90bXAnIH0gYXMgbmV2ZXIpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiBzbHVnLCBhcmdzOiAnJyB9IGFzIG5ldmVyKVxufVxuXG5jb25zdCBhZmZpbml0eSA9IGFzeW5jICgkOiBhbnkpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCByOiBhbnkgPSBhd2FpdCAkLmNvbW1hbmQucnVuKHsgY29tbWFuZDogJ2FuaW1hLWFmZmluaXR5JywgYXJnczogJycgfSBhcyBuZXZlcilcbiAgcmV0dXJuIE51bWJlcigv5aW95oSf5bqmIChcXGQrKS8uZXhlYyhyLnRleHQpPy5bMV0pXG59XG5cbmNvbnN0IHN1Ym1pdCA9ICgkOiBhbnksIHRleHQ6IHN0cmluZykgPT4gJC5wcm9tcHQuc3VibWl0KHsgdGV4dCB9IGFzIG5ldmVyKVxuY29uc3Qgc3RlcCA9IGFzeW5jICgkOiBhbnksIG1vZGVsOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcyA9ICQudHVybi5zdGVwKHsgdHVybklkOiAndCcsIGluZGV4OiAwLCBtb2RlbCwgbWVzc2FnZUNvdW50OiAxIH0gYXMgbmV2ZXIpXG4gIGZvciBhd2FpdCAoY29uc3QgXyBvZiBzKSB2b2lkIF9cbn1cbmNvbnN0IHVzYWdlID0geyBpbnB1dF90b2tlbnM6IDEsIG91dHB1dF90b2tlbnM6IDEgfVxuY29uc3Qgcm91dGUgPSAobW9kZWw6IHN0cmluZywgdG9uZSA9ICduZXV0cmFsJykgPT4gKHsgaXNBbnN3ZXJlZDogdHJ1ZSwgdXNhZ2UsIHRleHQ6IGB7XCJkaWZmaWN1bHR5XCI6OSxcIm1vZGVsXCI6XCIke21vZGVsfVwiLFwiZWZmb3J0XCI6XCJoaWdoXCIsXCJ0b25lXCI6XCIke3RvbmV9XCIsXCJhY2tcIjpcIuWlve+8jOaIkeS+hueci+eci+OAglwifWAgfSlcbmNvbnN0IHJvdyA9ICh0ZXh0OiBzdHJpbmcpID0+ICh7IG1lc3NhZ2U6IHsgdHlwZTogJ2Fzc2lzdGFudCcsIHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQgfV0gfSwgZG9vcjogJ3Jlc3BvbnNlJywgb3JpZ2luOiB7IGtpbmQ6ICdtb2RlbCcsIG1vZGVsOiAnbScgfSwgdXVpZDogJ3UnIH0pIGFzIG5ldmVyXG5cbnRlc3QoJ+i8uOWFpeeUsSBIYWlrdSDkuIDmrKHliIbpoZ7vvIzkuKbkvp3liIbpoZ7opoblr6sgdHVybi5zdGVwIOeahOaooeWei+iIh+aAneiAg+eoi+W6picsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBjdGwgPSBzZXR1cChvbilcbiAgY29uc3QgYXNrZWQ6IHN0cmluZ1tdID0gW11cbiAgY3RsLmNvbXBsZXRlID0gZSA9PiAoYXNrZWQucHVzaChlLm1vZGVsKSwgcm91dGUoJ29wdXMnKSlcbiAgYXdhaXQgc3RhcnQoJClcbiAgYXdhaXQgc3VibWl0KCQsICfoq4vph43mp4vmlbTlgIvmqKHntYQnKVxuICBhd2FpdCBzdGVwKCQsICdzb25uZXQnKVxuICBleHBlY3QoYXNrZWQpLnRvRXF1YWwoWydoYWlrdSddKVxuICBleHBlY3QoY3RsLnNlZW4ubW9kZWwpLnRvQmUoJ29wdXMnKVxuICBleHBlY3QoY3RsLnNlZW4uZWZmb3J0KS50b0JlKCdoaWdoJylcbn0pXG5cbnRlc3QoJ+mhjeW6puS9juaWvOmWgOaqu+iHquWLlemZjeS4gOe0micsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBjdGwgPSBzZXR1cChvbilcbiAgY3RsLmNvbXBsZXRlID0gKCkgPT4gcm91dGUoJ29wdXMnKVxuICBjdGwudXNhZ2UgPSB7IHJhdGVMaW1pdHM6IFt7IGtpbmQ6ICdmaXZlX2hvdXInLCBwZXJjZW50VXNlZDogOTUgfV0sIGNvbnRleHQ6IHt9IH1cbiAgYXdhaXQgc3RhcnQoJClcbiAgYXdhaXQgc3VibWl0KCQsICd4JylcbiAgYXdhaXQgc3RlcCgkLCAnb3B1cycpXG4gIGV4cGVjdChjdGwuc2Vlbi5tb2RlbCkudG9CZSgnc29ubmV0Jylcbn0pXG5cbnRlc3QoJ+aJi+WLlemOluWumuaooeWei+iIh+aAneiAg+eoi+W6picsIHsgb3B0aW9uczogeyBsb2NrTW9kZWw6ICdoYWlrdScsIGxvY2tFZmZvcnQ6ICdsb3cnIH0gfSwgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBjdGwuY29tcGxldGUgPSAoKSA9PiByb3V0ZSgnb3B1cycpXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0IHN1Ym1pdCgkLCAneCcpXG4gIGF3YWl0IHN0ZXAoJCwgJ29wdXMnKVxuICBleHBlY3QoW2N0bC5zZWVuLm1vZGVsLCBjdGwuc2Vlbi5lZmZvcnRdKS50b0VxdWFsKFsnaGFpa3UnLCAnbG93J10pXG59KVxuXG50ZXN0KCflm57opobmlLnlr6vvvJrkv53nlZnnqIvlvI/norzjgIHot6/lvpHjgIFVUkzjgIHmlbjlrZfvvJvliY3ntrTlj6rliqDlnKjplovpoK3kuIDmrKEnLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGN0bC5jb21wbGV0ZSA9IGUgPT4gKHsgaXNBbnN3ZXJlZDogdHJ1ZSwgdXNhZ2UsIHRleHQ6IFN0cmluZyhlLnByb21wdCkucmVwbGFjZSgn5a6M5oiQ5LqGJywgJ+WBmuWlveWbiScpIH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGNvbnN0IHNyYyA9ICflrozmiJDkuobvvIzmlLnkuoYgYG5wbSB0ZXN0YCDoiIcgL3NyYy9hL2IudHPvvIzoposgaHR0cHM6Ly94LmRldi9h77yM5YWxIDQyIOiZleOAgidcbiAgY29uc3QgcjE6IGFueSA9IGF3YWl0ICQuc2Vzc2lvbi5hcHBlbmQocm93KHNyYykpXG4gIGV4cGVjdChyMS5tZXNzYWdlLmNvbnRlbnRbMF0udGV4dCkudG9CZSgn5Lqe57Wy5aicID4g5YGa5aW95ZuJ77yM5pS55LqGIGBucG0gdGVzdGAg6IiHIC9zcmMvYS9iLnRz77yM6KaLIGh0dHBzOi8veC5kZXYvYe+8jOWFsSA0MiDomZXjgIInKVxuICBjb25zdCByMjogYW55ID0gYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+esrOS6jOautSA3JykpXG4gIGV4cGVjdChyMi5tZXNzYWdlLmNvbnRlbnRbMF0udGV4dC5zdGFydHNXaXRoKCfkup7ntbLlqJwgPicpKS50b0JlKGZhbHNlKVxufSlcblxudGVzdCgn5pS55a+r5aSx5pWX5oiW6YG65aSx5L2U5L2N56ym5pmC6aGv56S65Y6f5paHJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBhd2FpdCBzdGFydCgkKVxuICBjb25zdCByMTogYW55ID0gYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+WOn+aWhyBgeGAgMycpKVxuICBleHBlY3QocjEubWVzc2FnZS5jb250ZW50WzBdLnRleHQpLnRvQmUoJ+S6nue1suWonCA+IOWOn+aWhyBgeGAgMycpXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+ICh7IGlzQW5zd2VyZWQ6IHRydWUsIHVzYWdlLCB0ZXh0OiAn5Lif5LqG5L2U5L2N56ymJyB9KVxuICBjb25zdCByMjogYW55ID0gYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+WOn+aWhyBgeWAgNScpKVxuICBleHBlY3QocjIubWVzc2FnZS5jb250ZW50WzBdLnRleHQpLnRvQmUoJ+WOn+aWhyBgeWAgNScpXG59KVxuXG50ZXN0KCfmlLnlr6vmqKHlnovvvJrplbflm57opobnlKggU29ubmV077yM5LiA6Iis5Zue6KaG55SoIEhhaWt1JywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBjb25zdCBhc2tlZDogc3RyaW5nW10gPSBbXVxuICBjdGwuY29tcGxldGUgPSBlID0+IChhc2tlZC5wdXNoKGUubW9kZWwpLCB7IGlzQW5zd2VyZWQ6IHRydWUsIHVzYWdlLCB0ZXh0OiBTdHJpbmcoZS5wcm9tcHQpIH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0ICQuc2Vzc2lvbi5hcHBlbmQocm93KCfnn63lm57opoYnKSlcbiAgYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+mVtycucmVwZWF0KDEzMDApKSlcbiAgZXhwZWN0KGFza2VkKS50b0VxdWFsKFsnaGFpa3UnLCAnc29ubmV0J10pXG59KVxuXG50ZXN0KCdsb25nUmVwbHkg5Y+v6Kq/5pW06ZW35Zue6KaG6ZaA5qq7JywgeyBvcHRpb25zOiB7IGxvbmdSZXBseTogMTAgfSB9LCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGNvbnN0IGFza2VkOiBzdHJpbmdbXSA9IFtdXG4gIGN0bC5jb21wbGV0ZSA9IGUgPT4gKGFza2VkLnB1c2goZS5tb2RlbCksIHsgaXNBbnN3ZXJlZDogdHJ1ZSwgdXNhZ2UsIHRleHQ6IFN0cmluZyhlLnByb21wdCkgfSlcbiAgYXdhaXQgc3RhcnQoJClcbiAgYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+WNgeS4gOWAi+Wtl+eahOWbnuimhuWFp+WuueWWlOWWlCcpKVxuICBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn55+tJykpXG4gIGV4cGVjdChhc2tlZCkudG9FcXVhbChbJ3Nvbm5ldCcsICdoYWlrdSddKVxufSlcblxudGVzdCgn5pS55a+r6YC+5pmC44CB6aGN5bqm5LiN6Laz5oiW5ouL6Yyv5pmC55u05o6l6aGv56S65Y6f5paHJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBhd2FpdCBzdGFydCgkKVxuICBjdGwuY29tcGxldGUgPSAoKSA9PiAoeyBpc0Fuc3dlcmVkOiBmYWxzZSwgcmVhc29uOiAndGltZW91dCcgfSlcbiAgY29uc3QgcjE6IGFueSA9IGF3YWl0ICQuc2Vzc2lvbi5hcHBlbmQocm93KCfpgL7mmYIgMScpKVxuICBleHBlY3QocjEubWVzc2FnZS5jb250ZW50WzBdLnRleHQpLnRvQmUoJ+S6nue1suWonCA+IOmAvuaZgiAxJylcbiAgY3RsLmNvbXBsZXRlID0gKCkgPT4gKHsgaXNBbnN3ZXJlZDogZmFsc2UsIHJlYXNvbjogJ3JhdGVfbGltaXRlZCcgfSlcbiAgY29uc3QgcjI6IGFueSA9IGF3YWl0ICQuc2Vzc2lvbi5hcHBlbmQocm93KCfpoY3luqYgMicpKVxuICBleHBlY3QocjIubWVzc2FnZS5jb250ZW50WzBdLnRleHQpLnRvQmUoJ+mhjeW6piAyJylcbiAgY3RsLmNvbXBsZXRlID0gKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoJ3F1b3RhJykgfVxuICBjb25zdCByMzogYW55ID0gYXdhaXQgJC5zZXNzaW9uLmFwcGVuZChyb3coJ+aLi+mMryAzJykpXG4gIGV4cGVjdChyMy5tZXNzYWdlLmNvbnRlbnRbMF0udGV4dCkudG9CZSgn5ouL6YyvIDMnKVxufSlcblxudGVzdCgn5pS55a+r6YC+5pmC6Kit5a6a5YKz57Wm5qih5Z6L5ZG85Y+rJywgeyBvcHRpb25zOiB7IHJld3JpdGVUaW1lb3V0U2VjOiA1IH0gfSwgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBsZXQgdGltZW91dCA9IDBcbiAgY3RsLmNvbXBsZXRlID0gZSA9PiAodGltZW91dCA9IGUudGltZW91dE1zLCB7IGlzQW5zd2VyZWQ6IGZhbHNlLCByZWFzb246ICd0aW1lb3V0JyB9KVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygneCcpKVxuICBleHBlY3QodGltZW91dCkudG9CZSg1MDAwKVxufSlcblxuY29uc3QgcmF3TG9nID0gKGt2OiBNYXA8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdID0+ICgoa3YuZ2V0KCdyYXdsb2cnKSBhcyB7IHJhdzogc3RyaW5nIH1bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcCh4ID0+IHgucmF3KVxuXG50ZXN0KCfljp/mlocgbG9nIOmgkOioreWvq+WFpe+8jOaUueWvq+WkseaVl+aZguS4jeWvqycsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBrdiA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpXG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uLCBrdilcbiAgYXdhaXQgc3RhcnQoJClcbiAgY3RsLmNvbXBsZXRlID0gZSA9PiAoeyBpc0Fuc3dlcmVkOiB0cnVlLCB1c2FnZSwgdGV4dDogU3RyaW5nKGUucHJvbXB0KSB9KVxuICBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn5Y6f5paH55SyJykpXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+ICh7IGlzQW5zd2VyZWQ6IGZhbHNlLCByZWFzb246ICd0aW1lb3V0JyB9KVxuICBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn5Y6f5paH5LmZJykpXG4gIGV4cGVjdChyYXdMb2coa3YpKS50b0VxdWFsKFsn5Y6f5paH55SyJ10pXG59KVxuXG50ZXN0KCflnKggL2NvbmZpZyDpl5zplonljp/mlocgbG9nIOaZguS4jeWvq+WFpScsIHsgb3B0aW9uczogeyByYXdMb2c6IGZhbHNlIH0gfSwgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGt2ID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KClcbiAgY29uc3QgY3RsID0gc2V0dXAob24sIGt2KVxuICBjdGwuY29tcGxldGUgPSBlID0+ICh7IGlzQW5zd2VyZWQ6IHRydWUsIHVzYWdlLCB0ZXh0OiBTdHJpbmcoZS5wcm9tcHQpIH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGNvbnN0IHI6IGFueSA9IGF3YWl0ICQuc2Vzc2lvbi5hcHBlbmQocm93KCfljp/mlofkuJknKSlcbiAgZXhwZWN0KHIubWVzc2FnZS5jb250ZW50WzBdLnRleHQpLnRvQmUoJ+S6nue1suWonCA+IOWOn+aWh+S4mScpXG4gIGV4cGVjdChyYXdMb2coa3YpKS50b0VxdWFsKFtdKVxufSlcblxudGVzdCgn5YmN57a05Y+q5Yqg5Zyo5pW05YmH5Zue6KaG6ZaL6aCt5LiA5qyh77yM5aSa5q615paH5a2X5Y2A5aGK6IiH5aSa5qyh5a+r5YWl6YO95LiN6YeN6KSHJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBjdGwuY29tcGxldGUgPSBlID0+ICh7IGlzQW5zd2VyZWQ6IHRydWUsIHVzYWdlLCB0ZXh0OiBTdHJpbmcoZS5wcm9tcHQpIH0pXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGNvbnN0IG11bHRpID0geyBtZXNzYWdlOiB7IHR5cGU6ICdhc3Npc3RhbnQnLCByb2xlOiAnYXNzaXN0YW50JywgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiAn56ys5LiA5q61JyB9LCB7IHR5cGU6ICd0b29sX3VzZScsIGlkOiAndCcsIG5hbWU6ICd4JywgaW5wdXQ6IHt9IH0sIHsgdHlwZTogJ3RleHQnLCB0ZXh0OiAn56ys5LqM5q61JyB9XSB9LCBkb29yOiAncmVzcG9uc2UnLCBvcmlnaW46IHsga2luZDogJ21vZGVsJywgbW9kZWw6ICdtJyB9LCB1dWlkOiAndScgfSBhcyBuZXZlclxuICBjb25zdCByOiBhbnkgPSBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKG11bHRpKVxuICBleHBlY3Qoci5tZXNzYWdlLmNvbnRlbnRbMF0udGV4dCkudG9CZSgn5Lqe57Wy5aicID4g56ys5LiA5q61JylcbiAgZXhwZWN0KHIubWVzc2FnZS5jb250ZW50WzJdLnRleHQpLnRvQmUoJ+esrOS6jOautScpXG4gIGNvbnN0IHIyOiBhbnkgPSBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn5ZCM5LiA5Zue6KaG5b6M57qMJykpXG4gIGV4cGVjdChyMi5tZXNzYWdlLmNvbnRlbnRbMF0udGV4dCkudG9CZSgn5ZCM5LiA5Zue6KaG5b6M57qMJylcbn0pXG5cbnRlc3QoJ+aWsOeahOS9v+eUqOiAhei8uOWFpeW+jO+8jOS4i+S4gOWJh+WbnuimhumHjeaWsOWKoOWJjee2tCcsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBjdGwgPSBzZXR1cChvbilcbiAgY3RsLmNvbXBsZXRlID0gZSA9PiAoeyBpc0Fuc3dlcmVkOiB0cnVlLCB1c2FnZSwgdGV4dDogU3RyaW5nKGUucHJvbXB0KSB9KVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn56ys5LiA5YmHJykpXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHJvdXRlKCdoYWlrdScpXG4gIGF3YWl0IHN1Ym1pdCgkLCAn5YaN5ZWP5LiA5qyhJylcbiAgY3RsLmNvbXBsZXRlID0gZSA9PiAoeyBpc0Fuc3dlcmVkOiB0cnVlLCB1c2FnZSwgdGV4dDogU3RyaW5nKGUucHJvbXB0KSB9KVxuICBjb25zdCByOiBhbnkgPSBhd2FpdCAkLnNlc3Npb24uYXBwZW5kKHJvdygn56ys5LqM5YmHJykpXG4gIGV4cGVjdChyLm1lc3NhZ2UuY29udGVudFswXS50ZXh0KS50b0JlKCfkup7ntbLlqJwgPiDnrKzkuozliYcnKVxufSlcblxudGVzdCgn5aW95oSf5bqm77ya55SxIDAg6ZaL5aeL77yM5q+P5pel6aaW5qyh5LqS5YuV5Yqg5YiG5LiU5pyJ5q+P5pel5LiK6ZmQJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBjdGwuY29tcGxldGUgPSAoKSA9PiByb3V0ZSgnaGFpa3UnLCAncHJhaXNlJylcbiAgYXdhaXQgc3RhcnQoJClcbiAgZXhwZWN0KGF3YWl0IGFmZmluaXR5KCQpKS50b0JlKDApXG4gIGF3YWl0IHN1Ym1pdCgkLCAn6Kyd6Kyd5L2g77yM5YGa5b6X5b6I5aW9JylcbiAgY29uc3QgbiA9IGF3YWl0IGFmZmluaXR5KCQpXG4gIGV4cGVjdChuID4gMCAmJiBuIDw9IDUpLnRvQmUodHJ1ZSlcbn0pXG5cbnRlc3QoJ+mXnOmWieWlveaEn+W6puaZguS4jeiomOmMhCcsIHsgb3B0aW9uczogeyBhZmZpbml0eTogZmFsc2UgfSB9LCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHJvdXRlKCdoYWlrdScsICdwcmFpc2UnKVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCBzdWJtaXQoJCwgJ+isneisnScpXG4gIGV4cGVjdChhd2FpdCBhZmZpbml0eSgkKSkudG9CZSgwKVxufSlcblxuY29uc3QgcGVyc29uYVRleHQgPSBhc3luYyAoJDogYW55KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCAkLnByb21wdC5jb21wb3NlKHsgbW9kZWw6ICdtJywgcHJvbXB0TW9kZWw6ICdtJywgc3VyZmFjZXM6IFtdLCB0b29sczogW10sIG91dHB1dFN0eWxlOiBudWxsLCB0cmFpdHM6IFtdIH0gYXMgbmV2ZXIpXG4gIHJldHVybiByZXMuc2VjdGlvbnMuZmluZCgoczogYW55KSA9PiBzLmlkID09PSAnanNjLWFuaW1hOnBlcnNvbmEnKT8udGV4dCA/PyAnJ1xufVxuXG50ZXN0KCflpb3mhJ/luqbooqvosqznvbXmiaPliIbkvYbkuI3ot6jpmo7mrrXmjonokL3vvJvlj6/miYvli5XoqK3lrproiIfph43nva4nLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHJvdXRlKCdoYWlrdScsICdzY29sZCcpXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiAnYW5pbWEtYWZmaW5pdHknLCBhcmdzOiAnMjAnIH0gYXMgbmV2ZXIpXG4gIGF3YWl0IHN1Ym1pdCgkLCAn5L2g5aW956yoJylcbiAgZXhwZWN0KGF3YWl0IGFmZmluaXR5KCQpID49IDIwKS50b0JlKHRydWUpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiAnYW5pbWEtYWZmaW5pdHknLCBhcmdzOiAncmVzZXQnIH0gYXMgbmV2ZXIpXG4gIGV4cGVjdChhd2FpdCBhZmZpbml0eSgkKSkudG9CZSgwKVxufSlcblxudGVzdCgn5aW95oSf5bqm6ZqO5q615Y+N5pig5Zyo6Kqe5rCj77yM5LiU5LiN5L2/55So5oOF57eS5YuS57SiJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIHNldHVwKG9uKVxuICBhd2FpdCBzdGFydCgkKVxuICBjb25zdCB0MCA9IGF3YWl0IHBlcnNvbmFUZXh0KCQpXG4gIGV4cGVjdCh0MC5pbmNsdWRlcygn55Sf55aPJykpLnRvQmUodHJ1ZSlcbiAgZXhwZWN0KHQwLmluY2x1ZGVzKCfkuI3kvb/nlKjmhKfnlprmhJ/miJbmg4Xnt5Lli5LntKInKSkudG9CZSh0cnVlKVxuICBhd2FpdCAkLmNvbW1hbmQucnVuKHsgY29tbWFuZDogJ2FuaW1hLWFmZmluaXR5JywgYXJnczogJzg1JyB9IGFzIG5ldmVyKVxuICBleHBlY3QoKGF3YWl0IHBlcnNvbmFUZXh0KCQpKS5pbmNsdWRlcygn54m55Yil55qE5a2Y5ZyoJykpLnRvQmUodHJ1ZSlcbn0pXG5cbnRlc3QoJ+acquaIkOW5tOinkuiJsue2reaMgeWPi+aDhe+8jOWNs+S9v+WlveaEn+W6puacgOmrmOS4lOmWi+WVn+aIgOaEm+W8j+S+neiztCcsIHsgb3B0aW9uczogeyByb21hbmNlOiB0cnVlIH0gfSwgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIHNldHVwKG9uKVxuICBhd2FpdCBzdGFydCgkLCAnc2FvLXN1Z3VoYScpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiAnYW5pbWEtYWZmaW5pdHknLCBhcmdzOiAnMTAwJyB9IGFzIG5ldmVyKVxuICBleHBlY3QoKGF3YWl0IHBlcnNvbmFUZXh0KCQpKS5pbmNsdWRlcygn6Zec5L+C5a6a5L2N77ya5Y+L5oOFJykpLnRvQmUodHJ1ZSlcbn0pXG5cbi8vIOS7pSBmcyDkuovku7bpgornlYzmj5Dkvpvop5LoibLljIXvvIhjaGFyYWN0ZXJzL2luZGV4Lmpzb27vvInvvIzorpPlpJbmjpvoh6rooYzovInlhaXmiJDlubTop5LoibLjgIJcbmNvbnN0IHBhY2tzID0gKG9uOiBhbnksIGxpc3Q6IHsgc2x1Zzogc3RyaW5nOyByb21hbmNlPzogc3RyaW5nIH1bXSkgPT4ge1xuICBjb25zdCBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZmlsZXMuc2V0KCdpbmRleC5qc29uJywgSlNPTi5zdHJpbmdpZnkoeyBwYWNrczogbGlzdC5tYXAocCA9PiAoeyB3b3JrOiAndHcnLCB3b3JrTmFtZTogJ+a4rOippuS9nOWTgScsIHNsdWc6IHAuc2x1ZyB9KSkgfSkpXG4gIGZvciAoY29uc3QgcCBvZiBsaXN0KSB7XG4gICAgZmlsZXMuc2V0KFxuICAgICAgYHR3LyR7cC5zbHVnfS5qc29uYCxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgd29yazogJ3R3JyxcbiAgICAgICAgc2x1ZzogcC5zbHVnLFxuICAgICAgICBuYW1lOiAn5oiQ5bm05ris6KmmJyxcbiAgICAgICAgcGVyc29uYTogeyBzZWxmUmVmOiAn5oiRJywgYWRkcmVzczogJ+S9oCcsIHRvbmU6ICflubPnqaknLCBjYXRjaHBocmFzZTogJ+WlvScsIHZhbHVlczogJ+WPr+mdoCcsIHRhYm9vczogJ+eEoScgfSxcbiAgICAgICAgYXhlczogeyBnZW50bGU6IDUsIHRzdW5kZXJlOiA1LCBsaXZlbHk6IDUsIGZvcm1hbDogNSwgdGFsa2F0aXZlOiA1LCBodW1vcjogNSwgcHJvYWN0aXZlOiA1LCBleHByZXNzaXZlOiA1IH0sXG4gICAgICAgIGFuaW1lOiB7IG1vZTogJycsIHNwZWVjaDogJycsIGVtb3Rpb25zOiAnJywga2FvbW9qaTogJycsIHRoZW1lQ29sb3I6ICdjeWFuJyB9LFxuICAgICAgICB0aW1lbGluZTogW1xuICAgICAgICAgIHsgY2hhcHRlcjogJ+esrDHnq6AnLCBhZ2U6IDE3LCByZWxhdGlvbnNoaXBzOiBbXSB9LFxuICAgICAgICAgIHsgY2hhcHRlcjogJ+esrDLnq6AnLCBhZ2U6IDIwLCByZWxhdGlvbnNoaXBzOiBwLnJvbWFuY2UgPyBbeyB3aXRoOiBwLnJvbWFuY2UsIGtpbmQ6ICdyb21hbnRpYycgfV0gOiBbXSB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKVxuICB9XG4gIGNvbnN0IGtleSA9IChwYXRoOiBzdHJpbmcpID0+IHBhdGgucmVwbGFjZSgvXi4qXFwvY2hhcmFjdGVyc1xcLy8sICcnKVxuICBvbignZnMuZXhpc3RzJywgKF8kOiBhbnksIGU6IGFueSkgPT4gKHsgdmFsdWU6IGZpbGVzLmhhcyhrZXkoZS5wYXRoKSkgfSkgYXMgbmV2ZXIpXG4gIG9uKCdmcy5yZWFkJywgKF8kOiBhbnksIGU6IGFueSkgPT4gKHsgdmFsdWU6IGZpbGVzLmdldChrZXkoZS5wYXRoKSkgPz8gJycgfSkgYXMgbmV2ZXIpXG59XG5cbnRlc3QoJ+aIkOW5tOS4lOWOn+S9nOacieaIgOaEm+mXnOS/gu+8mumXnOS/guenu+i9iee1puS9v+eUqOiAhe+8jOWOn+aIgOS6uumAgOeCuumBjuWOu+eahOmHjeimgeS6uueJqScsIGFzeW5jICgkLCBvbikgPT4ge1xuICBzZXR1cChvbilcbiAgcGFja3Mob24sIFt7IHNsdWc6ICdsb3ZlcicsIHJvbWFuY2U6ICfmoZDkuronIH1dKVxuICBhd2FpdCBzdGFydCgkLCAndHctbG92ZXInKVxuICBjb25zdCB0ID0gYXdhaXQgcGVyc29uYVRleHQoJClcbiAgZXhwZWN0KHQuaW5jbHVkZXMoJ+W3suenu+i9iee1puS9v+eUqOiAhScpKS50b0JlKHRydWUpXG4gIGV4cGVjdCh0LmluY2x1ZGVzKCfmoZDkuronKSkudG9CZSh0cnVlKVxuICBleHBlY3QodC5pbmNsdWRlcygn6YGO5Y6755qE6YeN6KaB5Lq654mpJykpLnRvQmUodHJ1ZSlcbn0pXG5cbnRlc3QoJ+aIkOW5tOS9huWOn+S9nOeEoeaIgOaEm+mXnOS/gu+8mumcgOacgOmrmOmajuauteS4lOaYjueiuumWi+WVn+aJjemAsuWFpeaIgOaEm+W8j+S+neiztCcsIGFzeW5jICgkLCBvbikgPT4ge1xuICBzZXR1cChvbilcbiAgcGFja3Mob24sIFt7IHNsdWc6ICdwbGFpbicgfV0pXG4gIGF3YWl0IHN0YXJ0KCQsICd0dy1wbGFpbicpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiAnYW5pbWEtYWZmaW5pdHknLCBhcmdzOiAnMTAwJyB9IGFzIG5ldmVyKVxuICBleHBlY3QoKGF3YWl0IHBlcnNvbmFUZXh0KCQpKS5pbmNsdWRlcygn5oiA5oSb5byP5L6d6LO0JykpLnRvQmUoZmFsc2UpXG59KVxuXG50ZXN0KCfmiJDlubTnhKHmiIDmhJvjgIHmnIDpq5jpmo7mrrXkvYbmnKrlnKggL2NvbmZpZyDplovllZ/vvJrntq3mjIHlpKXkvLTpl5zkv4InLCB7IG9wdGlvbnM6IHsgcm9tYW5jZTogZmFsc2UgfSB9LCBhc3luYyAoJCwgb24pID0+IHtcbiAgc2V0dXAob24pXG4gIHBhY2tzKG9uLCBbeyBzbHVnOiAncGxhaW4nIH1dKVxuICBhd2FpdCBzdGFydCgkLCAndHctcGxhaW4nKVxuICBhd2FpdCAkLmNvbW1hbmQucnVuKHsgY29tbWFuZDogJ2FuaW1hLWFmZmluaXR5JywgYXJnczogJzEwMCcgfSBhcyBuZXZlcilcbiAgZXhwZWN0KChhd2FpdCBwZXJzb25hVGV4dCgkKSkuaW5jbHVkZXMoJ+WkpeS8tOiIh+aci+WPiycpKS50b0JlKHRydWUpXG59KVxuXG50ZXN0KCfmiJDlubTnhKHmiIDmhJvjgIHlt7LplovllZ/kvYblpb3mhJ/luqbmnKrpgZTmnIDpq5jpmo7mrrXvvJrkuI3pgLLlhaXmiIDmhJvlvI/kvp3os7QnLCB7IG9wdGlvbnM6IHsgcm9tYW5jZTogdHJ1ZSB9IH0sIGFzeW5jICgkLCBvbikgPT4ge1xuICBzZXR1cChvbilcbiAgcGFja3Mob24sIFt7IHNsdWc6ICdwbGFpbicgfV0pXG4gIGF3YWl0IHN0YXJ0KCQsICd0dy1wbGFpbicpXG4gIGF3YWl0ICQuY29tbWFuZC5ydW4oeyBjb21tYW5kOiAnYW5pbWEtYWZmaW5pdHknLCBhcmdzOiAnNzknIH0gYXMgbmV2ZXIpXG4gIGV4cGVjdCgoYXdhaXQgcGVyc29uYVRleHQoJCkpLmluY2x1ZGVzKCfmiIDmhJvlvI/kvp3os7QnKSkudG9CZShmYWxzZSlcbn0pXG5cbnRlc3QoJ+aIkOW5tOeEoeaIgOaEm+OAgeacgOmrmOmajuauteS4lOW3sumWi+WVn++8mumAsuWFpeaIgOaEm+W8j+S+neiztCcsIHsgb3B0aW9uczogeyByb21hbmNlOiB0cnVlIH0gfSwgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIHNldHVwKG9uKVxuICBwYWNrcyhvbiwgW3sgc2x1ZzogJ3BsYWluJyB9XSlcbiAgYXdhaXQgc3RhcnQoJCwgJ3R3LXBsYWluJylcbiAgYXdhaXQgJC5jb21tYW5kLnJ1bih7IGNvbW1hbmQ6ICdhbmltYS1hZmZpbml0eScsIGFyZ3M6ICc4MCcgfSBhcyBuZXZlcilcbiAgZXhwZWN0KChhd2FpdCBwZXJzb25hVGV4dCgkKSkuaW5jbHVkZXMoJ+aIgOaEm+W8j+S+neiztCcpKS50b0JlKHRydWUpXG59KVxuXG50ZXN0KCfplbfmnJ/kuI3kupLli5Xlpb3mhJ/luqbnt6nmhaLkuIvpmY3vvIzkvYbkuI3ot6jpmo7mrrXmjonokL0nLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHJvdXRlKCdoYWlrdScpXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0IHN1Ym1pdCgkLCAn5L2g5aW9JylcbiAgYXdhaXQgJC5jb21tYW5kLnJ1bih7IGNvbW1hbmQ6ICdhbmltYS1hZmZpbml0eScsIGFyZ3M6ICc0NScgfSBhcyBuZXZlcilcbiAgYXdhaXQgY3RsLmNsb2NrLmFkdmFuY2UoMzAgKiA4Nl80MDBfMDAwKVxuICBhd2FpdCBzdWJtaXQoJCwgJ+aIkeWbnuS+huS6hicpXG4gIGNvbnN0IG4gPSBhd2FpdCBhZmZpbml0eSgkKVxuICBleHBlY3QobiA8IDQ1KS50b0JlKHRydWUpXG4gIGV4cGVjdChuID49IDQwKS50b0JlKHRydWUpXG59KVxuXG50ZXN0KCflgIvmgKfou7jlvbHpn7/miaPliIblgI3njofvvJrlgrLlrIzop5LoibLmjonlvpfmr5Tmuqvmn5Top5LoibLlpJonLCBhc3luYyAoJCwgb24pID0+IHtcbiAgY29uc3QgY3RsID0gc2V0dXAob24pXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHJvdXRlKCdoYWlrdScpXG4gIHBhY2tzKG9uLCBbeyBzbHVnOiAncGxhaW4nIH1dKVxuICBjb25zdCBydW4gPSBhc3luYyAoc2x1Zzogc3RyaW5nKSA9PiB7XG4gICAgYXdhaXQgc3RhcnQoJCwgc2x1ZylcbiAgICBhd2FpdCBzdWJtaXQoJCwgJ+S9oOWlvScpXG4gICAgYXdhaXQgJC5jb21tYW5kLnJ1bih7IGNvbW1hbmQ6ICdhbmltYS1hZmZpbml0eScsIGFyZ3M6ICc3MCcgfSBhcyBuZXZlcilcbiAgICBhd2FpdCBjdGwuY2xvY2suYWR2YW5jZSg4ICogODZfNDAwXzAwMClcbiAgICBhd2FpdCBzdWJtaXQoJCwgJ+aIkeWbnuS+huS6hicpXG4gICAgcmV0dXJuIGFmZmluaXR5KCQpXG4gIH1cbiAgY29uc3QgcHJvdWQgPSBhd2FpdCBydW4oJ3R3LXBsYWluJylcbiAgY29uc3QgY2FsbSA9IGF3YWl0IHJ1bignc2FvLXN1Z3VoYScpXG4gIGV4cGVjdChwcm91ZCA8IGNhbG0pLnRvQmUodHJ1ZSlcbn0pXG5cbmNvbnN0IHdvcmtSb3V0ZSA9IChtb2RlbDogc3RyaW5nLCB3b3JrOiBib29sZWFuKSA9PiAoeyBpc0Fuc3dlcmVkOiB0cnVlLCB1c2FnZSwgdGV4dDogYHtcImRpZmZpY3VsdHlcIjo4LFwibW9kZWxcIjpcIiR7bW9kZWx9XCIsXCJlZmZvcnRcIjpcImhpZ2hcIixcInRvbmVcIjpcIm5ldXRyYWxcIixcImFja1wiOlwi5aW977yM5oiR5L6G6JmV55CG44CCXCIsXCJ3b3JrXCI6JHt3b3JrfX1gIH0pXG5cbnRlc3QoJ+mcgOimgeWLleaJi+eahOimgeaxguS6pOe1puiDjOaZr+W3peS9nOe3mu+8jOWwjeipsee3muaUueeUqCBIYWlrdScsIGFzeW5jICgkLCBvbikgPT4ge1xuICBjb25zdCBjdGwgPSBzZXR1cChvbilcbiAgY29uc3Qgc3Bhd25lZDogYW55W10gPSBbXVxuICBvbignYWdlbnQuc3Bhd24nLCAoXyQ6IGFueSwgZTogYW55KSA9PiAoc3Bhd25lZC5wdXNoKGUpLCB7IG1vZGVsOiBlLm1vZGVsLCBhZ2VudElkOiAnYTEnIH0pIGFzIG5ldmVyKVxuICBjdGwuY29tcGxldGUgPSAoKSA9PiB3b3JrUm91dGUoJ29wdXMnLCB0cnVlKVxuICBhd2FpdCBzdGFydCgkKVxuICBhd2FpdCBzdWJtaXQoJCwgJ+W5q+aIkemHjeaniyBzcmMg55uu6YyEJylcbiAgZXhwZWN0KHNwYXduZWQubGVuZ3RoKS50b0JlKDEpXG4gIGV4cGVjdChzcGF3bmVkWzBdLm1vZGVsKS50b0JlKCdvcHVzJylcbiAgYXdhaXQgc3RlcCgkLCAnbWFpbicpXG4gIGV4cGVjdChjdGwuc2Vlbi5tb2RlbCkudG9CZSgnaGFpa3UnKVxuICBjb25zdCBzeXMgPSBhd2FpdCAkLnByb21wdC5jb21wb3NlKHsgbW9kZWw6ICdtJywgcHJvbXB0TW9kZWw6ICdtJywgc3VyZmFjZXM6IFtdLCB0b29sczogW10sIG91dHB1dFN0eWxlOiBudWxsLCB0cmFpdHM6IFtdIH0gYXMgbmV2ZXIpXG4gIGV4cGVjdChzeXMuc2VjdGlvbnMuZmluZCgoczogYW55KSA9PiBzLmlkID09PSAnanNjLWFuaW1hOnBlcnNvbmEnKT8udGV4dCkudG9Db250YWluKCfog4zmma/lt6XkvZznt5onKVxufSlcblxudGVzdCgnd29yayDngrogZmFsc2Ug5oiW6Zec6ZaJ6IOM5pmv5bel5L2c57ea5pmC5LiN5rS+5belJywgYXN5bmMgKCQsIG9uKSA9PiB7XG4gIGNvbnN0IGN0bCA9IHNldHVwKG9uKVxuICBsZXQgbiA9IDBcbiAgb24oJ2FnZW50LnNwYXduJywgKCkgPT4gKG4rKywgeyBtb2RlbDogJ20nLCBhZ2VudElkOiAnYScgfSkgYXMgbmV2ZXIpXG4gIGN0bC5jb21wbGV0ZSA9ICgpID0+IHdvcmtSb3V0ZSgnc29ubmV0JywgZmFsc2UpXG4gIGF3YWl0IHN0YXJ0KCQpXG4gIGF3YWl0IHN1Ym1pdCgkLCAn5L2g5aW9JylcbiAgZXhwZWN0KG4pLnRvQmUoMClcbn0pXG4iXSwiZmlsZSI6Ii9ob29rcy9yb3V0aW5nLnRlc3QudHMifQ== //# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvcm9vdC9qc2MtYW5pbWEvaG9va3Mvcm91dGluZy50ZXN0LnRzIiwiL2hvb2tzL3JvdXRpbmcudGVzdC50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiXSxbXSxbIjgiXSx7fSwiY2xhdWRlLWNvZGUvdGVzdGluZyJd