438 lines
43 KiB
Plaintext
438 lines
43 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/components/SettingsPanel.vue");import { defineComponent as _defineComponent } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
import { computed, reactive, ref } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
import { agentSettings } from "/mock.ts";
|
||
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
||
__name: "SettingsPanel",
|
||
props: {
|
||
view: { type: String, required: true }
|
||
},
|
||
emits: ["back"],
|
||
setup(__props, { expose: __expose }) {
|
||
__expose();
|
||
const props = __props;
|
||
const titleMap = {
|
||
features: "功能开关",
|
||
api: "大模型 API 设置",
|
||
workflow: "日常工作流管理"
|
||
};
|
||
const title = computed(() => titleMap[props.view] ?? "设置");
|
||
const features = agentSettings;
|
||
const providers = [
|
||
{
|
||
key: "qianfan_v2",
|
||
label: "文心千帆 v2",
|
||
description: "Bearer Token 方式,推荐使用",
|
||
fields: [
|
||
{ key: "baseUrl", label: "Base URL", type: "text", default: "https://qianfan.baidubce.com/v2/chat/completions" },
|
||
{ key: "authorization", label: "Authorization", type: "text", default: "Bearer bce-v3/ALTAK-t6cEDUmPPSmoYJbGUPj2f/c136be53cb9d69e2990dad6030c9e19b1708b284" },
|
||
{ key: "model", label: "模型", type: "text", default: "deepseek-v3.2" },
|
||
{ key: "temperature", label: "Temperature", type: "number", default: 0.934, step: 0.01 }
|
||
]
|
||
},
|
||
{
|
||
key: "openai",
|
||
label: "OpenAI 兼容(OpenAPI)",
|
||
description: "支持 OpenAI 及兼容服务(DeepSeek、通义、智谱等)",
|
||
fields: [
|
||
{ key: "baseUrl", label: "Base URL", type: "text", default: "https://api.openai.com/v1", placeholder: "https://api.openai.com/v1" },
|
||
{ key: "apiKey", label: "API Key", type: "password", default: "", placeholder: "sk-..." },
|
||
{ key: "model", label: "模型", type: "text", default: "gpt-4o-mini", placeholder: "gpt-4o-mini" },
|
||
{ key: "temperature", label: "Temperature", type: "number", default: 0.7, step: 0.01 }
|
||
]
|
||
}
|
||
];
|
||
const selectedProvider = ref("qianfan_v2");
|
||
const currentProvider = computed(() => providers.find((p) => p.key === selectedProvider.value));
|
||
const apiForm = reactive({});
|
||
const saving = ref(false);
|
||
const testResult = ref("");
|
||
const testOk = ref(false);
|
||
function fillDefaults() {
|
||
Object.keys(apiForm).forEach((k) => delete apiForm[k]);
|
||
for (const f of currentProvider.value.fields) {
|
||
apiForm[f.key] = f.default;
|
||
}
|
||
}
|
||
fillDefaults();
|
||
function onProviderChange() {
|
||
fillDefaults();
|
||
testResult.value = "";
|
||
}
|
||
async function testApi() {
|
||
const provider = selectedProvider.value;
|
||
const baseUrl = String(apiForm.baseUrl || "");
|
||
const model = String(apiForm.model || "");
|
||
const temperature = Number(apiForm.temperature ?? 0.7);
|
||
let url = baseUrl;
|
||
let headers = { "Content-Type": "application/json" };
|
||
const body = {
|
||
model,
|
||
messages: [{ role: "user", content: '你好,请只回复"连接成功"四个字' }],
|
||
temperature,
|
||
stream: false
|
||
};
|
||
if (provider === "qianfan_v2") {
|
||
headers["Authorization"] = String(apiForm.authorization || "");
|
||
} else {
|
||
if (!baseUrl.endsWith("/chat/completions")) {
|
||
url = baseUrl.replace(/\/$/, "") + "/chat/completions";
|
||
}
|
||
headers["Authorization"] = "Bearer " + String(apiForm.apiKey || "");
|
||
}
|
||
try {
|
||
const res = await fetch(url, {
|
||
method: "POST",
|
||
headers,
|
||
body: JSON.stringify(body)
|
||
});
|
||
const data = await res.json();
|
||
if (!res.ok) {
|
||
testResult.value = `✗ 保存失败,连通性测试未通过:HTTP ${res.status} ${data?.error?.message || res.statusText}`;
|
||
return false;
|
||
}
|
||
const content = data?.choices?.[0]?.message?.content;
|
||
if (content) {
|
||
return true;
|
||
}
|
||
testResult.value = `✗ 保存失败,响应格式异常:${JSON.stringify(data).slice(0, 120)}`;
|
||
return false;
|
||
} catch (e) {
|
||
testResult.value = `✗ 保存失败,请求异常:${e?.message || String(e)}(可能是 CORS 或网络问题)`;
|
||
return false;
|
||
}
|
||
}
|
||
async function saveAndTest() {
|
||
saving.value = true;
|
||
testResult.value = "";
|
||
testOk.value = false;
|
||
const ok = await testApi();
|
||
if (ok) {
|
||
const providerLabel = currentProvider.value?.label ?? selectedProvider.value;
|
||
const model = String(apiForm.model || "");
|
||
const name = `${providerLabel} · ${model}`;
|
||
try {
|
||
const saved = await window.electronAPI.callAgent("llm:save", {
|
||
name,
|
||
provider: selectedProvider.value,
|
||
config: { ...apiForm }
|
||
});
|
||
testOk.value = true;
|
||
testResult.value = `✓ 连通性测试通过,配置「${name}」已存储到 agent-core (ID: ${saved.id.slice(0, 8)})`;
|
||
} catch (e) {
|
||
testResult.value = `✗ 存储失败:${e?.message || String(e)}`;
|
||
}
|
||
}
|
||
saving.value = false;
|
||
}
|
||
const workflows = ref([
|
||
{ id: 1, name: "每日经营数据汇总", desc: "每日 09:00 自动汇总前一日经营数据并生成报表", enabled: true },
|
||
{ id: 2, name: "门店巡检提醒", desc: "每周一 10:00 推送巡检任务到负责人", enabled: true },
|
||
{ id: 3, name: "员工排班自动优化", desc: "根据客流预测自动调整排班建议", enabled: false },
|
||
{ id: 4, name: "订单异常预警", desc: "实时监控订单退款率,超阈值自动告警", enabled: true }
|
||
]);
|
||
function addWorkflow() {
|
||
const name = prompt("请输入工作流名称:");
|
||
if (name) {
|
||
workflows.value.push({ id: Date.now(), name, desc: "新建的工作流", enabled: false });
|
||
}
|
||
}
|
||
const __returned__ = { props, titleMap, title, features, providers, selectedProvider, currentProvider, apiForm, saving, testResult, testOk, fillDefaults, onProviderChange, testApi, saveAndTest, workflows, addWorkflow };
|
||
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
||
return __returned__;
|
||
}
|
||
});
|
||
import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelSelect as _vModelSelect, withDirectives as _withDirectives, vModelDynamic as _vModelDynamic, vModelText as _vModelText, normalizeClass as _normalizeClass } from "/@fs/D:/dndClaw/agent-console/node_modules/.vite/deps/vue.js?v=4266a811";
|
||
const _hoisted_1 = { class: "settings" };
|
||
const _hoisted_2 = { class: "header" };
|
||
const _hoisted_3 = { class: "page-title" };
|
||
const _hoisted_4 = { class: "body" };
|
||
const _hoisted_5 = {
|
||
key: 0,
|
||
class: "card"
|
||
};
|
||
const _hoisted_6 = { class: "switch-label-text" };
|
||
const _hoisted_7 = ["checked", "onChange"];
|
||
const _hoisted_8 = { class: "card" };
|
||
const _hoisted_9 = { class: "form-group" };
|
||
const _hoisted_10 = ["value"];
|
||
const _hoisted_11 = { class: "hint" };
|
||
const _hoisted_12 = ["onUpdate:modelValue", "type", "placeholder"];
|
||
const _hoisted_13 = ["onUpdate:modelValue", "step"];
|
||
const _hoisted_14 = ["onUpdate:modelValue"];
|
||
const _hoisted_15 = ["value"];
|
||
const _hoisted_16 = { class: "btn-row" };
|
||
const _hoisted_17 = ["disabled"];
|
||
const _hoisted_18 = { class: "card" };
|
||
const _hoisted_19 = { class: "wf-info" };
|
||
const _hoisted_20 = { class: "wf-name" };
|
||
const _hoisted_21 = { class: "wf-desc" };
|
||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||
return _openBlock(), _createElementBlock("section", _hoisted_1, [
|
||
_createCommentVNode(" 顶部 "),
|
||
_createElementVNode("header", _hoisted_2, [
|
||
_createElementVNode("button", {
|
||
class: "back-btn",
|
||
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("back"))
|
||
}, "← 返回对话"),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_3,
|
||
_toDisplayString($setup.title),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createElementVNode("div", _hoisted_4, [
|
||
_createCommentVNode(" 功能开关 "),
|
||
$props.view === "features" ? (_openBlock(), _createElementBlock("div", _hoisted_5, [
|
||
_cache[2] || (_cache[2] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"智能体行为",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.features, (s) => {
|
||
return _openBlock(), _createElementBlock("label", {
|
||
key: s.key,
|
||
class: "switch-row"
|
||
}, [
|
||
_createElementVNode(
|
||
"span",
|
||
_hoisted_6,
|
||
_toDisplayString(s.label),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
_createElementVNode("input", {
|
||
type: "checkbox",
|
||
checked: s.value,
|
||
onChange: ($event) => s.value = $event.target.checked
|
||
}, null, 40, _hoisted_7)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
])) : $props.view === "api" ? (_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
{ key: 1 },
|
||
[
|
||
_createCommentVNode(" 大模型 API 设置 "),
|
||
_createElementVNode("div", _hoisted_8, [
|
||
_cache[4] || (_cache[4] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"大模型 API 设置",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_createCommentVNode(" 接入方式选择 "),
|
||
_createElementVNode("div", _hoisted_9, [
|
||
_cache[3] || (_cache[3] = _createElementVNode(
|
||
"label",
|
||
null,
|
||
"接入方式",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_withDirectives(_createElementVNode(
|
||
"select",
|
||
{
|
||
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.selectedProvider = $event),
|
||
onChange: $setup.onProviderChange
|
||
},
|
||
[
|
||
(_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.providers, (p) => {
|
||
return _createElementVNode("option", {
|
||
key: p.key,
|
||
value: p.key
|
||
}, _toDisplayString(p.label), 9, _hoisted_10);
|
||
}),
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
))
|
||
],
|
||
544
|
||
/* NEED_HYDRATION, NEED_PATCH */
|
||
), [
|
||
[_vModelSelect, $setup.selectedProvider]
|
||
]),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_11,
|
||
_toDisplayString($setup.currentProvider?.description),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createCommentVNode(" 动态字段 "),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.currentProvider?.fields, (f) => {
|
||
return _openBlock(), _createElementBlock("div", {
|
||
key: f.key,
|
||
class: "form-group"
|
||
}, [
|
||
_createElementVNode(
|
||
"label",
|
||
null,
|
||
_toDisplayString(f.label),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
f.type === "text" || f.type === "password" ? _withDirectives((_openBlock(), _createElementBlock("input", {
|
||
key: 0,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event,
|
||
type: f.type,
|
||
placeholder: f.placeholder
|
||
}, null, 8, _hoisted_12)), [
|
||
[_vModelDynamic, $setup.apiForm[f.key]]
|
||
]) : f.type === "number" ? _withDirectives((_openBlock(), _createElementBlock("input", {
|
||
key: 1,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event,
|
||
type: "number",
|
||
step: f.step ?? 0.01
|
||
}, null, 8, _hoisted_13)), [
|
||
[
|
||
_vModelText,
|
||
$setup.apiForm[f.key],
|
||
void 0,
|
||
{ number: true }
|
||
]
|
||
]) : f.type === "select" ? _withDirectives((_openBlock(), _createElementBlock("select", {
|
||
key: 2,
|
||
"onUpdate:modelValue": ($event) => $setup.apiForm[f.key] = $event
|
||
}, [
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList(f.options, (opt) => {
|
||
return _openBlock(), _createElementBlock("option", {
|
||
key: opt,
|
||
value: opt
|
||
}, _toDisplayString(opt), 9, _hoisted_15);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
], 8, _hoisted_14)), [
|
||
[_vModelSelect, $setup.apiForm[f.key]]
|
||
]) : _createCommentVNode("v-if", true)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
)),
|
||
_createElementVNode("div", _hoisted_16, [
|
||
_createElementVNode("button", {
|
||
class: "save-btn",
|
||
disabled: $setup.saving,
|
||
onClick: $setup.saveAndTest
|
||
}, _toDisplayString($setup.saving ? "测试中…" : "测试并保存"), 9, _hoisted_17)
|
||
]),
|
||
$setup.testResult ? (_openBlock(), _createElementBlock(
|
||
"div",
|
||
{
|
||
key: 0,
|
||
class: _normalizeClass(["test-result", $setup.testOk ? "ok" : "err"])
|
||
},
|
||
_toDisplayString($setup.testResult),
|
||
3
|
||
/* TEXT, CLASS */
|
||
)) : _createCommentVNode("v-if", true)
|
||
])
|
||
],
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
)) : $props.view === "workflow" ? (_openBlock(), _createElementBlock(
|
||
_Fragment,
|
||
{ key: 2 },
|
||
[
|
||
_createCommentVNode(" 日常工作流管理 "),
|
||
_createElementVNode("div", _hoisted_18, [
|
||
_createElementVNode("div", { class: "card-head" }, [
|
||
_cache[5] || (_cache[5] = _createElementVNode(
|
||
"div",
|
||
{ class: "card-title" },
|
||
"工作流列表",
|
||
-1
|
||
/* CACHED */
|
||
)),
|
||
_createElementVNode("button", {
|
||
class: "add-btn",
|
||
onClick: $setup.addWorkflow
|
||
}, "+ 新建")
|
||
]),
|
||
(_openBlock(true), _createElementBlock(
|
||
_Fragment,
|
||
null,
|
||
_renderList($setup.workflows, (w) => {
|
||
return _openBlock(), _createElementBlock("div", {
|
||
key: w.id,
|
||
class: "workflow-item"
|
||
}, [
|
||
_createElementVNode("div", _hoisted_19, [
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_20,
|
||
_toDisplayString(w.name),
|
||
1
|
||
/* TEXT */
|
||
),
|
||
_createElementVNode(
|
||
"div",
|
||
_hoisted_21,
|
||
_toDisplayString(w.desc),
|
||
1
|
||
/* TEXT */
|
||
)
|
||
]),
|
||
_createElementVNode(
|
||
"div",
|
||
{
|
||
class: _normalizeClass(["wf-status", w.enabled ? "on" : "off"])
|
||
},
|
||
_toDisplayString(w.enabled ? "已启用" : "已停用"),
|
||
3
|
||
/* TEXT, CLASS */
|
||
)
|
||
]);
|
||
}),
|
||
128
|
||
/* KEYED_FRAGMENT */
|
||
))
|
||
])
|
||
],
|
||
64
|
||
/* STABLE_FRAGMENT */
|
||
)) : _createCommentVNode("v-if", true)
|
||
])
|
||
]);
|
||
}
|
||
import "/components/SettingsPanel.vue?vue&type=style&index=0&scoped=b65b5cd7&lang.css";
|
||
_sfc_main.__hmrId = "b65b5cd7";
|
||
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
|
||
import.meta.hot.on("file-changed", ({ file }) => {
|
||
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
|
||
});
|
||
import.meta.hot.accept((mod) => {
|
||
if (!mod) return;
|
||
const { default: updated, _rerender_only } = mod;
|
||
if (_rerender_only) {
|
||
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
|
||
} else {
|
||
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
|
||
}
|
||
});
|
||
import _export_sfc from "/@id/__x00__plugin-vue:export-helper";
|
||
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-b65b5cd7"], ["__file", "D:/dndClaw/agent-console/src/renderer/components/SettingsPanel.vue"]]);
|
||
|
||
//# sourceMappingURL=data:application/json;base64,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QTtBQUFBO0FBQUE7a0JBRWhDO0FBQUEsb0JBRU07QUFBQTtBQUFBLHNCQUZELE9BQUssaUJBQUMsYUFBb0IsRUFBRSxVQUFPO0FBQUE7cUNBQ25DLEVBQUUsVUFBTztBQUFBO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJTZXR0aW5nc1BhbmVsLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxzZWN0aW9uIGNsYXNzPVwic2V0dGluZ3NcIj5cbiAgICA8IS0tIOmhtumDqCAtLT5cbiAgICA8aGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYmFjay1idG5cIiBAY2xpY2s9XCIkZW1pdCgnYmFjaycpXCI+4oaQIOi/lOWbnuWvueivnTwvYnV0dG9uPlxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2UtdGl0bGVcIj57eyB0aXRsZSB9fTwvZGl2PlxuICAgIDwvaGVhZGVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAgICAgIDwhLS0g5Yqf6IO95byA5YWzIC0tPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ2aWV3ID09PSAnZmVhdHVyZXMnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIj7mmbrog73kvZPooYzkuLo8L2Rpdj5cbiAgICAgICAgICA8bGFiZWwgdi1mb3I9XCJzIGluIGZlYXR1cmVzXCIgOmtleT1cInMua2V5XCIgY2xhc3M9XCJzd2l0Y2gtcm93XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN3aXRjaC1sYWJlbC10ZXh0XCI+e3sgcy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICA6Y2hlY2tlZD1cInMudmFsdWVcIlxuICAgICAgICAgICAgICBAY2hhbmdlPVwicy52YWx1ZSA9ICgkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgIDwhLS0g5aSn5qih5Z6LIEFQSSDorr7nva4gLS0+XG4gICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwidmlldyA9PT0gJ2FwaSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPuWkp+aooeWeiyBBUEkg6K6+572uPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIOaOpeWFpeaWueW8j+mAieaLqSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsPuaOpeWFpeaWueW8jzwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IHYtbW9kZWw9XCJzZWxlY3RlZFByb3ZpZGVyXCIgQGNoYW5nZT1cIm9uUHJvdmlkZXJDaGFuZ2VcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cInAgaW4gcHJvdmlkZXJzXCIgOmtleT1cInAua2V5XCIgOnZhbHVlPVwicC5rZXlcIj5cbiAgICAgICAgICAgICAgICB7eyBwLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludFwiPnt7IGN1cnJlbnRQcm92aWRlcj8uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0g5Yqo5oCB5a2X5q61IC0tPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cImYgaW4gY3VycmVudFByb3ZpZGVyPy5maWVsZHNcIiA6a2V5PVwiZi5rZXlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyBmLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdi1pZj1cImYudHlwZSA9PT0gJ3RleHQnIHx8IGYudHlwZSA9PT0gJ3Bhc3N3b3JkJ1wiXG4gICAgICAgICAgICAgICAgdi1tb2RlbD1cImFwaUZvcm1bZi5rZXldXCJcbiAgICAgICAgICAgICAgICA6dHlwZT1cImYudHlwZVwiXG4gICAgICAgICAgICAgICAgOnBsYWNlaG9sZGVyPVwiZi5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cImYudHlwZSA9PT0gJ251bWJlcidcIlxuICAgICAgICAgICAgICAgIHYtbW9kZWwubnVtYmVyPVwiYXBpRm9ybVtmLmtleV1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIDpzdGVwPVwiZi5zdGVwID8/IDAuMDFcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c2VsZWN0IHYtZWxzZS1pZj1cImYudHlwZSA9PT0gJ3NlbGVjdCdcIiB2LW1vZGVsPVwiYXBpRm9ybVtmLmtleV1cIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHYtZm9yPVwib3B0IGluIGYub3B0aW9uc1wiIDprZXk9XCJvcHRcIiA6dmFsdWU9XCJvcHRcIj57eyBvcHQgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1yb3dcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYXZlLWJ0blwiIDpkaXNhYmxlZD1cInNhdmluZ1wiIEBjbGljaz1cInNhdmVBbmRUZXN0XCI+XG4gICAgICAgICAgICAgIHt7IHNhdmluZyA/ICfmtYvor5XkuK3igKYnIDogJ+a1i+ivleW5tuS/neWtmCcgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgdi1pZj1cInRlc3RSZXN1bHRcIiBjbGFzcz1cInRlc3QtcmVzdWx0XCIgOmNsYXNzPVwidGVzdE9rID8gJ29rJyA6ICdlcnInXCI+XG4gICAgICAgICAgICB7eyB0ZXN0UmVzdWx0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgPCEtLSDml6XluLjlt6XkvZzmtYHnrqHnkIYgLS0+XG4gICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwidmlldyA9PT0gJ3dvcmtmbG93J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCI+5bel5L2c5rWB5YiX6KGoPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIEBjbGljaz1cImFkZFdvcmtmbG93XCI+77yLIOaWsOW7ujwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgdi1mb3I9XCJ3IGluIHdvcmtmbG93c1wiIDprZXk9XCJ3LmlkXCIgY2xhc3M9XCJ3b3JrZmxvdy1pdGVtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2YtaW5mb1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2YtbmFtZVwiPnt7IHcubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2YtZGVzY1wiPnt7IHcuZGVzYyB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Ytc3RhdHVzXCIgOmNsYXNzPVwidy5lbmFibGVkID8gJ29uJyA6ICdvZmYnXCI+XG4gICAgICAgICAgICAgIHt7IHcuZW5hYmxlZCA/ICflt7LlkK/nlKgnIDogJ+W3suWBnOeUqCcgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgcmVhY3RpdmUsIHJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGFnZW50U2V0dGluZ3MgfSBmcm9tICcuLi9tb2NrJ1xuaW1wb3J0IHR5cGUgeyBWaWV3VHlwZSB9IGZyb20gJy4uL3R5cGVzJ1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHsgdmlldzogVmlld1R5cGUgfT4oKVxuZGVmaW5lRW1pdHM8eyAoZTogJ2JhY2snKTogdm9pZCB9PigpXG5cbmNvbnN0IHRpdGxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBmZWF0dXJlczogJ+WKn+iDveW8gOWFsycsXG4gIGFwaTogJ+Wkp+aooeWeiyBBUEkg6K6+572uJyxcbiAgd29ya2Zsb3c6ICfml6XluLjlt6XkvZzmtYHnrqHnkIYnXG59XG5jb25zdCB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHRpdGxlTWFwW3Byb3BzLnZpZXddID8/ICforr7nva4nKVxuXG4vLyDlip/og73lvIDlhbNcbmNvbnN0IGZlYXR1cmVzID0gYWdlbnRTZXR0aW5nc1xuXG4vKiA9PT09PT0g5aSn5qih5Z6LIEFQSSDphY3nva7vvJrlj6/mianlsZUgUHJvdmlkZXIg57uT5p6EID09PT09PSAqL1xuaW50ZXJmYWNlIEZpZWxkRGVmIHtcbiAga2V5OiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICB0eXBlOiAndGV4dCcgfCAncGFzc3dvcmQnIHwgJ251bWJlcicgfCAnc2VsZWN0J1xuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBvcHRpb25zPzogc3RyaW5nW11cbiAgc3RlcD86IG51bWJlclxuICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFByb3ZpZGVyRGVmIHtcbiAga2V5OiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGZpZWxkczogRmllbGREZWZbXVxufVxuXG4vLyDmlrDlop7mqKHlnovmjqXlhaXvvJrlnKjmraTmlbDnu4Tmt7vliqDkuIDkuKogUHJvdmlkZXJEZWYg5Y2z5Y+vXG5jb25zdCBwcm92aWRlcnM6IFByb3ZpZGVyRGVmW10gPSBbXG4gIHtcbiAgICBrZXk6ICdxaWFuZmFuX3YyJyxcbiAgICBsYWJlbDogJ+aWh+W/g+WNg+W4hiB2MicsXG4gICAgZGVzY3JpcHRpb246ICdCZWFyZXIgVG9rZW4g5pa55byP77yM5o6o6I2Q5L2/55SoJyxcbiAgICBmaWVsZHM6IFtcbiAgICAgIHsga2V5OiAnYmFzZVVybCcsIGxhYmVsOiAnQmFzZSBVUkwnLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdodHRwczovL3FpYW5mYW4uYmFpZHViY2UuY29tL3YyL2NoYXQvY29tcGxldGlvbnMnIH0sXG4gICAgICB7IGtleTogJ2F1dGhvcml6YXRpb24nLCBsYWJlbDogJ0F1dGhvcml6YXRpb24nLCB0eXBlOiAndGV4dCcsIGRlZmF1bHQ6ICdCZWFyZXIgYmNlLXYzL0FMVEFLLXQ2Y0VEVW1QUFNtb1lKYkdVUGoyZi9jMTM2YmU1M2NiOWQ2OWUyOTkwZGFkNjAzMGM5ZTE5YjE3MDhiMjg0JyB9LFxuICAgICAgeyBrZXk6ICdtb2RlbCcsIGxhYmVsOiAn5qih5Z6LJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnZGVlcHNlZWstdjMuMicgfSxcbiAgICAgIHsga2V5OiAndGVtcGVyYXR1cmUnLCBsYWJlbDogJ1RlbXBlcmF0dXJlJywgdHlwZTogJ251bWJlcicsIGRlZmF1bHQ6IDAuOTM0LCBzdGVwOiAwLjAxIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdvcGVuYWknLFxuICAgIGxhYmVsOiAnT3BlbkFJIOWFvOWuue+8iE9wZW5BUEnvvIknLFxuICAgIGRlc2NyaXB0aW9uOiAn5pSv5oyBIE9wZW5BSSDlj4rlhbzlrrnmnI3liqHvvIhEZWVwU2Vla+OAgemAmuS5ieOAgeaZuuiwseetie+8iScsXG4gICAgZmllbGRzOiBbXG4gICAgICB7IGtleTogJ2Jhc2VVcmwnLCBsYWJlbDogJ0Jhc2UgVVJMJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MScsIHBsYWNlaG9sZGVyOiAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MScgfSxcbiAgICAgIHsga2V5OiAnYXBpS2V5JywgbGFiZWw6ICdBUEkgS2V5JywgdHlwZTogJ3Bhc3N3b3JkJywgZGVmYXVsdDogJycsIHBsYWNlaG9sZGVyOiAnc2stLi4uJyB9LFxuICAgICAgeyBrZXk6ICdtb2RlbCcsIGxhYmVsOiAn5qih5Z6LJywgdHlwZTogJ3RleHQnLCBkZWZhdWx0OiAnZ3B0LTRvLW1pbmknLCBwbGFjZWhvbGRlcjogJ2dwdC00by1taW5pJyB9LFxuICAgICAgeyBrZXk6ICd0ZW1wZXJhdHVyZScsIGxhYmVsOiAnVGVtcGVyYXR1cmUnLCB0eXBlOiAnbnVtYmVyJywgZGVmYXVsdDogMC43LCBzdGVwOiAwLjAxIH1cbiAgICBdXG4gIH1cbl1cblxuY29uc3Qgc2VsZWN0ZWRQcm92aWRlciA9IHJlZigncWlhbmZhbl92MicpXG5jb25zdCBjdXJyZW50UHJvdmlkZXIgPSBjb21wdXRlZCgoKSA9PiBwcm92aWRlcnMuZmluZCgocCkgPT4gcC5rZXkgPT09IHNlbGVjdGVkUHJvdmlkZXIudmFsdWUpKVxuXG5jb25zdCBhcGlGb3JtID0gcmVhY3RpdmU8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4oe30pXG5jb25zdCBzYXZpbmcgPSByZWYoZmFsc2UpXG5jb25zdCB0ZXN0UmVzdWx0ID0gcmVmKCcnKVxuY29uc3QgdGVzdE9rID0gcmVmKGZhbHNlKVxuXG5mdW5jdGlvbiBmaWxsRGVmYXVsdHMoKSB7XG4gIE9iamVjdC5rZXlzKGFwaUZvcm0pLmZvckVhY2goKGspID0+IGRlbGV0ZSBhcGlGb3JtW2tdKVxuICBmb3IgKGNvbnN0IGYgb2YgY3VycmVudFByb3ZpZGVyLnZhbHVlIS5maWVsZHMpIHtcbiAgICBhcGlGb3JtW2Yua2V5XSA9IGYuZGVmYXVsdFxuICB9XG59XG5maWxsRGVmYXVsdHMoKVxuXG5mdW5jdGlvbiBvblByb3ZpZGVyQ2hhbmdlKCkge1xuICBmaWxsRGVmYXVsdHMoKVxuICB0ZXN0UmVzdWx0LnZhbHVlID0gJydcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdEFwaSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHJvdmlkZXIgPSBzZWxlY3RlZFByb3ZpZGVyLnZhbHVlXG4gIGNvbnN0IGJhc2VVcmwgPSBTdHJpbmcoYXBpRm9ybS5iYXNlVXJsIHx8ICcnKVxuICBjb25zdCBtb2RlbCA9IFN0cmluZyhhcGlGb3JtLm1vZGVsIHx8ICcnKVxuICBjb25zdCB0ZW1wZXJhdHVyZSA9IE51bWJlcihhcGlGb3JtLnRlbXBlcmF0dXJlID8/IDAuNylcblxuICBsZXQgdXJsID0gYmFzZVVybFxuICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsLFxuICAgIG1lc3NhZ2VzOiBbeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6ICfkvaDlpb3vvIzor7flj6rlm57lpI1cIui/nuaOpeaIkOWKn1wi5Zub5Liq5a2XJyB9XSxcbiAgICB0ZW1wZXJhdHVyZSxcbiAgICBzdHJlYW06IGZhbHNlXG4gIH1cblxuICBpZiAocHJvdmlkZXIgPT09ICdxaWFuZmFuX3YyJykge1xuICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IFN0cmluZyhhcGlGb3JtLmF1dGhvcml6YXRpb24gfHwgJycpXG4gIH0gZWxzZSB7XG4gICAgaWYgKCFiYXNlVXJsLmVuZHNXaXRoKCcvY2hhdC9jb21wbGV0aW9ucycpKSB7XG4gICAgICB1cmwgPSBiYXNlVXJsLnJlcGxhY2UoL1xcLyQvLCAnJykgKyAnL2NoYXQvY29tcGxldGlvbnMnXG4gICAgfVxuICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICdCZWFyZXIgJyArIFN0cmluZyhhcGlGb3JtLmFwaUtleSB8fCAnJylcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH0pXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0ZXN0UmVzdWx0LnZhbHVlID0gYOKclyDkv53lrZjlpLHotKXvvIzov57pgJrmgKfmtYvor5XmnKrpgJrov4fvvJpIVFRQICR7cmVzLnN0YXR1c30gJHtkYXRhPy5lcnJvcj8ubWVzc2FnZSB8fCByZXMuc3RhdHVzVGV4dH1gXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZGF0YT8uY2hvaWNlcz8uWzBdPy5tZXNzYWdlPy5jb250ZW50XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOS/neWtmOWksei0pe+8jOWTjeW6lOagvOW8j+W8guW4uO+8miR7SlNPTi5zdHJpbmdpZnkoZGF0YSkuc2xpY2UoMCwgMTIwKX1gXG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRlc3RSZXN1bHQudmFsdWUgPSBg4pyXIOS/neWtmOWksei0pe+8jOivt+axguW8guW4uO+8miR7ZT8ubWVzc2FnZSB8fCBTdHJpbmcoZSl977yI5Y+v6IO95pivIENPUlMg5oiW572R57uc6Zeu6aKY77yJYFxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICog5rWL6K+V6YCa6L+H5ZCO77yM6YCa6L+HIElQQyDlsIbphY3nva7lrZjlgqjliLAgYWdlbnQtY29yZe+8iFNRTGl0Ze+8iVxuICogYWdlbnQtY29yZSDkvJroh6rliqjljrvph43vvIjlkIzlkI0gKyDlkIwgcHJvdmlkZXIg5YiZ5pu05paw77yJXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVBbmRUZXN0KCkge1xuICBzYXZpbmcudmFsdWUgPSB0cnVlXG4gIHRlc3RSZXN1bHQudmFsdWUgPSAnJ1xuICB0ZXN0T2sudmFsdWUgPSBmYWxzZVxuXG4gIGNvbnN0IG9rID0gYXdhaXQgdGVzdEFwaSgpXG4gIGlmIChvaykge1xuICAgIGNvbnN0IHByb3ZpZGVyTGFiZWwgPSBjdXJyZW50UHJvdmlkZXIudmFsdWU/LmxhYmVsID8/IHNlbGVjdGVkUHJvdmlkZXIudmFsdWVcbiAgICBjb25zdCBtb2RlbCA9IFN0cmluZyhhcGlGb3JtLm1vZGVsIHx8ICcnKVxuICAgIGNvbnN0IG5hbWUgPSBgJHtwcm92aWRlckxhYmVsfSDCtyAke21vZGVsfWBcblxuICAgIHRyeSB7XG4gICAgICAvLyDosIPnlKggYWdlbnQtY29yZSDkv53lrZjliLAgU1FMaXRlXG4gICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHdpbmRvdy5lbGVjdHJvbkFQSS5jYWxsQWdlbnQoJ2xsbTpzYXZlJywge1xuICAgICAgICBuYW1lLFxuICAgICAgICBwcm92aWRlcjogc2VsZWN0ZWRQcm92aWRlci52YWx1ZSxcbiAgICAgICAgY29uZmlnOiB7IC4uLmFwaUZvcm0gfVxuICAgICAgfSlcblxuICAgICAgdGVzdE9rLnZhbHVlID0gdHJ1ZVxuICAgICAgdGVzdFJlc3VsdC52YWx1ZSA9IGDinJMg6L+e6YCa5oCn5rWL6K+V6YCa6L+H77yM6YWN572u44CMJHtuYW1lfeOAjeW3suWtmOWCqOWIsCBhZ2VudC1jb3JlIChJRDogJHtzYXZlZC5pZC5zbGljZSgwLCA4KX0pYFxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGVzdFJlc3VsdC52YWx1ZSA9IGDinJcg5a2Y5YKo5aSx6LSl77yaJHtlPy5tZXNzYWdlIHx8IFN0cmluZyhlKX1gXG4gICAgfVxuICB9XG4gIHNhdmluZy52YWx1ZSA9IGZhbHNlXG59XG5cbi8qID09PT09PSDlt6XkvZzmtYEgPT09PT09ICovXG5jb25zdCB3b3JrZmxvd3MgPSByZWYoW1xuICB7IGlkOiAxLCBuYW1lOiAn5q+P5pel57uP6JCl5pWw5o2u5rGH5oC7JywgZGVzYzogJ+avj+aXpSAwOTowMCDoh6rliqjmsYfmgLvliY3kuIDml6Xnu4/okKXmlbDmja7lubbnlJ/miJDmiqXooagnLCBlbmFibGVkOiB0cnVlIH0sXG4gIHsgaWQ6IDIsIG5hbWU6ICfpl6jlupflt6Hmo4Dmj5DphpInLCBkZXNjOiAn5q+P5ZGo5LiAIDEwOjAwIOaOqOmAgeW3oeajgOS7u+WKoeWIsOi0n+i0o+S6uicsIGVuYWJsZWQ6IHRydWUgfSxcbiAgeyBpZDogMywgbmFtZTogJ+WRmOW3peaOkuePreiHquWKqOS8mOWMlicsIGRlc2M6ICfmoLnmja7lrqLmtYHpooTmtYvoh6rliqjosIPmlbTmjpLnj63lu7rorq4nLCBlbmFibGVkOiBmYWxzZSB9LFxuICB7IGlkOiA0LCBuYW1lOiAn6K6i5Y2V5byC5bi46aKE6K2mJywgZGVzYzogJ+WunuaXtuebkeaOp+iuouWNlemAgOasvueOh++8jOi2hemYiOWAvOiHquWKqOWRiuitpicsIGVuYWJsZWQ6IHRydWUgfVxuXSlcbmZ1bmN0aW9uIGFkZFdvcmtmbG93KCkge1xuICBjb25zdCBuYW1lID0gcHJvbXB0KCfor7fovpPlhaXlt6XkvZzmtYHlkI3np7DvvJonKVxuICBpZiAobmFtZSkge1xuICAgIHdvcmtmbG93cy52YWx1ZS5wdXNoKHsgaWQ6IERhdGUubm93KCksIG5hbWUsIGRlc2M6ICfmlrDlu7rnmoTlt6XkvZzmtYEnLCBlbmFibGVkOiBmYWxzZSB9KVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIHNjb3BlZD5cbi5zZXR0aW5ncyB7XG4gIGZsZXg6IDE7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLXBhbmVsKTtcbiAgbWluLXdpZHRoOiAwO1xufVxuLmhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTZweDtcbiAgcGFkZGluZzogMTRweCAyMHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbn1cbi5iYWNrLWJ0biB7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogNHB4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cbi5iYWNrLWJ0bjpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWJnLWhvdmVyKTtcbn1cbi5wYWdlLXRpdGxlIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgZm9udC1zaXplOiAxNXB4O1xufVxuLmJvZHkge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBwYWRkaW5nOiAyNHB4O1xufVxuLmNhcmQge1xuICBtYXgtd2lkdGg6IDYwMHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zaWRlYmFyKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgcGFkZGluZzogMjBweDtcbn1cbi5jYXJkLWhlYWQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG4uY2FyZC10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbWFyZ2luLWJvdHRvbTogMTRweDtcbn1cbi5zd2l0Y2gtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAxMHB4IDA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xufVxuLnN3aXRjaC1yb3c6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG4uc3dpdGNoLWxhYmVsLXRleHQge1xuICBmb250LXNpemU6IDEzcHg7XG59XG4uc3dpdGNoLXJvdyBpbnB1dCB7XG4gIGFjY2VudC1jb2xvcjogdmFyKC0tcHJpbWFyeSk7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG59XG4uZm9ybS1ncm91cCB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNnB4O1xufVxuLmZvcm0tZ3JvdXAgbGFiZWwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbi5mb3JtLWdyb3VwIGlucHV0LFxuLmZvcm0tZ3JvdXAgc2VsZWN0IHtcbiAgcGFkZGluZzogOXB4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctaW5wdXQpO1xuICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLmZvcm0tZ3JvdXAgaW5wdXQ6Zm9jdXMsXG4uZm9ybS1ncm91cCBzZWxlY3Q6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpO1xuICBvdXRsaW5lOiBub25lO1xufVxuLmhpbnQge1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbn1cbi5idG4tcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG4uc2F2ZS1idG4ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTtcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDlweCAyMHB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cbi5zYXZlLWJ0bjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNjtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi50ZXN0LXJlc3VsdCB7XG4gIG1hcmdpbi10b3A6IDEycHg7XG4gIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjY7XG59XG4udGVzdC1yZXN1bHQub2sge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAyMTcsIDEwMCwgMC4xMik7XG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7XG59XG4udGVzdC1yZXN1bHQuZXJyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyMjEsIDgyLCA3NywgMC4xKTtcbiAgY29sb3I6IHZhcigtLWRhbmdlcik7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRhbmdlcik7XG59XG4uYWRkLWJ0biB7XG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLndvcmtmbG93LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDEycHggMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG59XG4ud29ya2Zsb3ctaXRlbTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbi53Zi1uYW1lIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogNTAwO1xufVxuLndmLWRlc2Mge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgbWFyZ2luLXRvcDogM3B4O1xufVxuLndmLXN0YXR1cyB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgcGFkZGluZzogM3B4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDk5cHg7XG59XG4ud2Ytc3RhdHVzLm9uIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcyk7XG4gIGNvbG9yOiAjZmZmO1xufVxuLndmLXN0YXR1cy5vZmYge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgY29sb3I6ICNmZmY7XG59XG48L3N0eWxlPlxuIl0sImZpbGUiOiJEOi9kbmRDbGF3L2FnZW50LWNvbnNvbGUvc3JjL3JlbmRlcmVyL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC52dWUifQ== |