467 lines
46 KiB
Plaintext
467 lines
46 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/selection/Object.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/global/icon/Triangle.vue";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/selection/KeyValuePair.vue";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/selection/Object.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createVNode as __createVNode,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode,createBlock as __createBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
|
|
function _interopVNode(vnode) {
|
|
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
|
|
const data = vnode.props['data-v-inspector']
|
|
delete vnode.props['data-v-inspector']
|
|
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
|
|
}
|
|
return vnode
|
|
}
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
/* Injection by vite-plugin-vue-inspector End */
|
|
import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { getHeaderAndSubheaderForSpeckleObject } from "/_nuxt/lib/object-sidebar/helpers.ts";
|
|
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import { useHighlightedObjectsUtilities } from "/_nuxt/lib/viewer/composables/ui.ts";
|
|
|
|
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerSelectionObject",
|
|
props: {
|
|
object: { type: Object, required: true },
|
|
root: { type: Boolean, required: false, default: false },
|
|
title: { type: String, required: false },
|
|
unfold: { type: Boolean, required: false, default: false },
|
|
debug: { type: Boolean, required: false, default: false },
|
|
modifiedSibling: { type: Boolean, required: false, default: false },
|
|
parentPath: { type: String, required: false }
|
|
},
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
const {
|
|
ui: {
|
|
diff: { result, enabled: diffEnabled }
|
|
}
|
|
} = useInjectedViewerState();
|
|
const props = __props;
|
|
const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities();
|
|
const unfold = ref(props.unfold);
|
|
const autoUnfoldKeys = ["properties", "Instance Parameters"];
|
|
const currentPath = computed(() => {
|
|
if (props.root) return "";
|
|
if (!props.parentPath) return props.title || "";
|
|
return props.parentPath ? `${props.parentPath}.${props.title || ""}` : props.title || "";
|
|
});
|
|
const isAdded = computed(() => {
|
|
if (!diffEnabled.value) return false;
|
|
return result.value?.added.findIndex(
|
|
(o) => o.model.raw.applicationId === props.object.applicationId
|
|
) !== -1;
|
|
});
|
|
const isRemoved = computed(() => {
|
|
if (!diffEnabled.value) return false;
|
|
return result.value?.removed.findIndex(
|
|
(o) => o.model.raw.applicationId === props.object.applicationId
|
|
) !== -1;
|
|
});
|
|
const isUnchanged = computed(() => {
|
|
if (!diffEnabled.value) return false;
|
|
return result.value?.unchanged.findIndex(
|
|
(o) => o.model.raw.applicationId === props.object.applicationId
|
|
) !== -1;
|
|
});
|
|
const isModifiedQuery = computed(() => {
|
|
if (!diffEnabled.value) return { modified: false };
|
|
const modifiedObjectPairs = result.value?.modified.map((pair2) => {
|
|
return [pair2[0].model.raw, pair2[1].model.raw];
|
|
});
|
|
if (!modifiedObjectPairs) return { modified: false };
|
|
const obj = props.object;
|
|
const pairedItems = modifiedObjectPairs.find(
|
|
(item) => item[0].id === obj.id || item[1].id === obj.id
|
|
);
|
|
if (!pairedItems) return { modified: false };
|
|
const pair = pairedItems[0].id === obj.id ? pairedItems[1] : pairedItems[0];
|
|
if (!pair) return { modified: false };
|
|
return {
|
|
modified: true,
|
|
pair,
|
|
isNew: pairedItems[0].id !== obj.id
|
|
};
|
|
});
|
|
const headerClasses = computed(() => {
|
|
if (props.modifiedSibling) return "text-amber-500";
|
|
if (!props.root) return "";
|
|
if (!diffEnabled.value) return "";
|
|
if (!Object.keys(props.object).includes("applicationId")) return "";
|
|
if (isAdded.value) return "text-green-500";
|
|
if (isRemoved.value) return "text-red-500";
|
|
if (isUnchanged.value) return "text-foreground-2";
|
|
return "text-amber-500";
|
|
});
|
|
const headerAndSubheader = computed(() => {
|
|
return getHeaderAndSubheaderForSpeckleObject(props.object);
|
|
});
|
|
const ignoredProps = [
|
|
"__closure",
|
|
"displayMesh",
|
|
"displayValue",
|
|
"totalChildrenCount",
|
|
"__importedUrl",
|
|
"__parents",
|
|
"bbox"
|
|
];
|
|
const keyValuePairs = computed(() => {
|
|
const kvps = [];
|
|
if (props.title === "parameters") {
|
|
const paramKeys = Object.keys(props.object);
|
|
for (const prop of paramKeys) {
|
|
const param = props.object[prop];
|
|
if (!param || typeof param !== "object" || param === null) continue;
|
|
if (!("name" in param) || typeof param.name !== "string") continue;
|
|
if (!("value" in param)) continue;
|
|
kvps.push({
|
|
key: param.name,
|
|
type: typeof param.value,
|
|
innerType: null,
|
|
arrayLength: null,
|
|
arrayPreview: null,
|
|
value: param.value
|
|
});
|
|
}
|
|
return kvps;
|
|
}
|
|
const objectKeys = Object.keys(props.object);
|
|
for (const key of objectKeys) {
|
|
if (ignoredProps.includes(key)) continue;
|
|
const type = Array.isArray(props.object[key]) ? "array" : typeof props.object[key];
|
|
let innerType = null;
|
|
let arrayLength = null;
|
|
let arrayPreview = null;
|
|
if (type === "array") {
|
|
const arr = props.object[key];
|
|
arrayLength = arr.length;
|
|
if (arr.length > 0) {
|
|
innerType = Array.isArray(arr[0]) ? "array" : typeof arr[0];
|
|
arrayPreview = arr.slice(0, 100).join(", ");
|
|
}
|
|
}
|
|
if (props.object[key] && isNameValuePair(props.object[key])) {
|
|
const { value, units } = props.object[key];
|
|
const fullPath2 = currentPath.value ? `${currentPath.value}.${key}` : key;
|
|
kvps.push({
|
|
key,
|
|
type: typeof value,
|
|
value,
|
|
units,
|
|
backendPath: fullPath2
|
|
});
|
|
continue;
|
|
}
|
|
const fullPath = currentPath.value ? `${currentPath.value}.${key}` : key;
|
|
kvps.push({
|
|
key,
|
|
type,
|
|
innerType,
|
|
arrayLength,
|
|
arrayPreview,
|
|
value: props.object[key],
|
|
backendPath: fullPath
|
|
});
|
|
}
|
|
return kvps;
|
|
});
|
|
const isNameValuePair = (obj) => {
|
|
const keys = Object.keys(obj);
|
|
return keys.includes("name") && keys.includes("value");
|
|
};
|
|
const categorisedValuePairs = computed(() => {
|
|
return {
|
|
primitives: keyValuePairs.value.filter(
|
|
(item) => item.type !== "object" && item.type !== "array" && item.value !== null
|
|
),
|
|
objects: keyValuePairs.value.filter((item) => item.type === "object" && item.value !== null).filter((item) => {
|
|
const keys = Object.keys(item.value);
|
|
const nvp = keys.includes("name") && keys.includes("value");
|
|
return !nvp;
|
|
}).sort((a, b) => a.key.toLowerCase().localeCompare(b.key.toLowerCase())),
|
|
nonPrimitiveArrays: keyValuePairs.value.filter(
|
|
(item) => item.type === "array" && item.value !== null && (item.innerType === "object" || item.innerType === "array")
|
|
),
|
|
primitiveArrays: keyValuePairs.value.filter(
|
|
(item) => item.type === "array" && item.value !== null && !(item.innerType === "object" || item.innerType === "array")
|
|
),
|
|
nulls: keyValuePairs.value.filter((item) => item.value === null)
|
|
};
|
|
});
|
|
const highlightObject = () => {
|
|
if (props.object.id && typeof props.object.id === "string") {
|
|
highlightObjects([props.object.id]);
|
|
}
|
|
};
|
|
const unhighlightObject = () => {
|
|
if (props.object.id && typeof props.object.id === "string") {
|
|
unhighlightObjects([props.object.id]);
|
|
}
|
|
};
|
|
watch(
|
|
() => props.unfold,
|
|
(newVal) => {
|
|
unfold.value = newVal;
|
|
}
|
|
);
|
|
const __returned__ = { result, diffEnabled, props, highlightObjects, unhighlightObjects, unfold, autoUnfoldKeys, currentPath, isAdded, isRemoved, isUnchanged, isModifiedQuery, headerClasses, headerAndSubheader, ignoredProps, keyValuePairs, isNameValuePair, categorisedValuePairs, highlightObject, unhighlightObject };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, openBlock as _openBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "mb-1 flex items-center",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:9:5"
|
|
};
|
|
const _hoisted_2 = {
|
|
key: 0,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:23:11"
|
|
};
|
|
const _hoisted_3 = {
|
|
key: 0,
|
|
class: "space-y-1 pl-0 py-1 pr-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:31:5"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "text-foreground-2 grid grid-cols-3 pl-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:58:9"
|
|
};
|
|
const _hoisted_5 = ["title"];
|
|
const _hoisted_6 = {
|
|
class: "col-span-2 flex w-full min-w-0 truncate text-body-3xs pl-1 text-foreground",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:65:11"
|
|
};
|
|
const _hoisted_7 = {
|
|
class: "flex-grow truncate",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:68:13"
|
|
};
|
|
const _hoisted_8 = {
|
|
class: "text-foreground-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:69:13"
|
|
};
|
|
const _hoisted_9 = {
|
|
class: "grid grid-cols-3",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:74:9"
|
|
};
|
|
const _hoisted_10 = ["title"];
|
|
const _hoisted_11 = ["title"];
|
|
const _hoisted_12 = {
|
|
class: "pl-2.5 flex-grow truncate",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:85:13"
|
|
};
|
|
const _hoisted_13 = {
|
|
class: "text-foreground-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:86:13"
|
|
};
|
|
const _hoisted_14 = {
|
|
key: 1,
|
|
class: "mt-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:91:5"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_IconTriangle = __nuxt_component_0;
|
|
const _component_ViewerSelectionKeyValuePair = __nuxt_component_1;
|
|
const _component_ViewerSelectionObject = __nuxt_component_2;
|
|
return _openBlock(), _createElementBlock(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(`${$setup.isModifiedQuery.modified && $props.root ? "outline outline-2 rounded py-1 px-1 outline-amber-500" : ""}`),
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:2:3"
|
|
},
|
|
[
|
|
_createElementVNode("div", _hoisted_1, [
|
|
_createElementVNode(
|
|
"button",
|
|
{
|
|
class: "flex h-full w-full pl-1 pr-2 py-1 items-center gap-1 rounded-[2px] bg-foundation-2",
|
|
onClick: _cache[0] || (_cache[0] = ($event) => $setup.unfold = !$setup.unfold),
|
|
onMouseenter: $setup.highlightObject,
|
|
onFocusin: $setup.highlightObject,
|
|
onMouseleave: $setup.unhighlightObject,
|
|
onFocusout: $setup.unhighlightObject,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:10:7"
|
|
},
|
|
[
|
|
_createVNode(_component_IconTriangle, {
|
|
class: _normalizeClass(`h-3 w-3 shrink-0 ${$setup.headerClasses} ${$setup.unfold ? "rotate-90" : ""}`),
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:18:9"
|
|
}, null, 8, ["class"]),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(`truncate text-body-3xs font-medium ${$setup.headerClasses}`),
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:21:9"
|
|
},
|
|
[
|
|
_createTextVNode(
|
|
_toDisplayString($props.title || $setup.headerAndSubheader.header) + " ",
|
|
1
|
|
/* TEXT */
|
|
),
|
|
($setup.props.root || $setup.props.modifiedSibling) && $setup.isModifiedQuery.modified ? (_openBlock(), _createElementBlock(
|
|
"span",
|
|
_hoisted_2,
|
|
_toDisplayString($setup.isModifiedQuery.isNew ? "(new)" : "(old)"),
|
|
1
|
|
/* TEXT */
|
|
)) : _createCommentVNode("v-if", true)
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
],
|
|
32
|
|
/* NEED_HYDRATION */
|
|
)
|
|
]),
|
|
$setup.unfold ? (_openBlock(), _createElementBlock("div", _hoisted_3, [
|
|
_createCommentVNode(" key value pair display "),
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList([
|
|
...$setup.categorisedValuePairs.primitives,
|
|
...$setup.categorisedValuePairs.nulls
|
|
], (kvp, index) => {
|
|
return _openBlock(), _createBlock(_component_ViewerSelectionKeyValuePair, {
|
|
key: index,
|
|
kvp,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:33:7"
|
|
}, null, 8, ["kvp"]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
)),
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList($setup.categorisedValuePairs.objects, (kvp, index) => {
|
|
return _openBlock(), _createElementBlock("div", {
|
|
key: index,
|
|
class: "pl-2",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:41:7"
|
|
}, [
|
|
_createVNode(_component_ViewerSelectionObject, {
|
|
object: kvp.value || {},
|
|
title: kvp.key,
|
|
unfold: $setup.autoUnfoldKeys.includes(kvp.key),
|
|
"parent-path": $setup.currentPath,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:46:9"
|
|
}, null, 8, ["object", "title", "unfold", "parent-path"])
|
|
]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
)),
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList($setup.categorisedValuePairs.nonPrimitiveArrays, (kvp, index) => {
|
|
return _openBlock(), _createElementBlock("div", {
|
|
key: index,
|
|
class: "text-body-3xs",
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:53:7"
|
|
}, [
|
|
_createElementVNode("div", _hoisted_4, [
|
|
_createElementVNode("div", {
|
|
class: "col-span-1 truncate text-body-3xs font-medium",
|
|
title: kvp.key,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:59:11"
|
|
}, _toDisplayString(kvp.key), 9, _hoisted_5),
|
|
_createElementVNode("div", _hoisted_6, [
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_7,
|
|
_toDisplayString(kvp.innerType) + " array",
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_8,
|
|
"(" + _toDisplayString(kvp.arrayLength) + ")",
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])
|
|
])
|
|
]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
)),
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList($setup.categorisedValuePairs.primitiveArrays, (kvp, index) => {
|
|
return _openBlock(), _createElementBlock("div", {
|
|
key: index,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:73:7"
|
|
}, [
|
|
_createElementVNode("div", _hoisted_9, [
|
|
_createElementVNode("div", {
|
|
class: "col-span-1 truncate text-body-3xs font-medium pl-2 text-foreground-2",
|
|
title: kvp.key,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:75:11"
|
|
}, _toDisplayString(kvp.key), 9, _hoisted_10),
|
|
_createElementVNode("div", {
|
|
class: "col-span-2 flex w-full min-w-0 truncate text-body-3xs text-foreground",
|
|
title: kvp.value,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:81:11"
|
|
}, [
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_12,
|
|
_toDisplayString(kvp.arrayPreview),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_13,
|
|
"(" + _toDisplayString(kvp.arrayLength) + ")",
|
|
1
|
|
/* TEXT */
|
|
)
|
|
], 8, _hoisted_11)
|
|
])
|
|
]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
))
|
|
])) : _createCommentVNode("v-if", true),
|
|
$setup.isModifiedQuery.modified && $setup.isModifiedQuery.pair && $props.root ? (_openBlock(), _createElementBlock("div", _hoisted_14, [
|
|
_createVNode(_component_ViewerSelectionObject, {
|
|
object: $setup.isModifiedQuery.pair,
|
|
"modified-sibling": true,
|
|
"data-v-inspector": "components/viewer/selection/Object.vue:92:7"
|
|
}, null, 8, ["object"])
|
|
])) : _createCommentVNode("v-if", true)
|
|
],
|
|
2
|
|
/* CLASS */
|
|
);
|
|
}
|
|
_sfc_main.__hmrId = "f180152d";
|
|
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 "/_nuxt/@id/__x00__plugin-vue:export-helper";
|
|
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/selection/Object.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlHQSxTQUFTLDZDQUE2QztBQUN0RCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHNDQUFzQzs7Ozs7Ozs7Ozs7Ozs7OztBQUcvQyxVQUFNO0FBQUEsTUFDSixJQUFJO0FBQUEsUUFDRixNQUFNLEVBQUUsUUFBUSxTQUFTLFlBQVk7QUFBQSxNQUN2QztBQUFBLElBQ0YsSUFBSSx1QkFBdUI7QUFFM0IsVUFBTSxRQUFRO0FBYWQsVUFBTSxFQUFFLGtCQUFrQixtQkFBbUIsSUFBSSwrQkFBK0I7QUFDaEYsVUFBTSxTQUFTLElBQUksTUFBTSxNQUFNO0FBQy9CLFVBQU0saUJBQWlCLENBQUMsY0FBYyxxQkFBcUI7QUFHM0QsVUFBTSxjQUFjLFNBQVMsTUFBTTtBQUNqQyxVQUFJLE1BQU0sS0FBTSxRQUFPO0FBQ3ZCLFVBQUksQ0FBQyxNQUFNLFdBQVksUUFBTyxNQUFNLFNBQVM7QUFDN0MsYUFBTyxNQUFNLGFBQ1QsR0FBRyxNQUFNLFVBQVUsSUFBSSxNQUFNLFNBQVMsRUFBRSxLQUN4QyxNQUFNLFNBQVM7QUFBQSxJQUNyQixDQUFDO0FBRUQsVUFBTSxVQUFVLFNBQVMsTUFBTTtBQUM3QixVQUFJLENBQUMsWUFBWSxNQUFPLFFBQU87QUFDL0IsYUFDRSxPQUFPLE9BQU8sTUFBTTtBQUFBLFFBQ2xCLENBQUMsTUFBTyxFQUFFLE1BQU0sSUFBc0Isa0JBQWtCLE1BQU0sT0FBTztBQUFBLE1BQ3ZFLE1BQU07QUFBQSxJQUVWLENBQUM7QUFFRCxVQUFNLFlBQVksU0FBUyxNQUFNO0FBQy9CLFVBQUksQ0FBQyxZQUFZLE1BQU8sUUFBTztBQUMvQixhQUNFLE9BQU8sT0FBTyxRQUFRO0FBQUEsUUFDcEIsQ0FBQyxNQUFPLEVBQUUsTUFBTSxJQUFzQixrQkFBa0IsTUFBTSxPQUFPO0FBQUEsTUFDdkUsTUFBTTtBQUFBLElBRVYsQ0FBQztBQUVELFVBQU0sY0FBYyxTQUFTLE1BQU07QUFDakMsVUFBSSxDQUFDLFlBQVksTUFBTyxRQUFPO0FBQy9CLGFBQ0UsT0FBTyxPQUFPLFVBQVU7QUFBQSxRQUN0QixDQUFDLE1BQU8sRUFBRSxNQUFNLElBQXNCLGtCQUFrQixNQUFNLE9BQU87QUFBQSxNQUN2RSxNQUFNO0FBQUEsSUFFVixDQUFDO0FBRUQsVUFBTSxrQkFBa0IsU0FBUyxNQUFNO0FBRXJDLFVBQUksQ0FBQyxZQUFZLE1BQU8sUUFBTyxFQUFFLFVBQVUsTUFBTTtBQUNqRCxZQUFNLHNCQUFzQixPQUFPLE9BQU8sU0FBUyxJQUFJLENBQUNBLFVBQVM7QUFDL0QsZUFBTyxDQUFDQSxNQUFLLENBQUMsRUFBRSxNQUFNLEtBQXNCQSxNQUFLLENBQUMsRUFBRSxNQUFNLEdBQW9CO0FBQUEsTUFDaEYsQ0FBQztBQUNELFVBQUksQ0FBQyxvQkFBcUIsUUFBTyxFQUFFLFVBQVUsTUFBTTtBQUNuRCxZQUFNLE1BQU0sTUFBTTtBQUNsQixZQUFNLGNBQWMsb0JBQW9CO0FBQUEsUUFDdEMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSTtBQUFBLE1BQ3hEO0FBQ0EsVUFBSSxDQUFDLFlBQWEsUUFBTyxFQUFFLFVBQVUsTUFBTTtBQUMzQyxZQUFNLE9BQU8sWUFBWSxDQUFDLEVBQUUsT0FBTyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDO0FBQzFFLFVBQUksQ0FBQyxLQUFNLFFBQU8sRUFBRSxVQUFVLE1BQU07QUFDcEMsYUFBTztBQUFBLFFBQ0wsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQU8sWUFBWSxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQUEsTUFDbkM7QUFBQSxJQUNGLENBQUM7QUFFRCxVQUFNLGdCQUFnQixTQUFTLE1BQU07QUFDbkMsVUFBSSxNQUFNLGdCQUFpQixRQUFPO0FBQ2xDLFVBQUksQ0FBQyxNQUFNLEtBQU0sUUFBTztBQUN4QixVQUFJLENBQUMsWUFBWSxNQUFPLFFBQU87QUFDL0IsVUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sRUFBRSxTQUFTLGVBQWUsRUFBRyxRQUFPO0FBQ2pFLFVBQUksUUFBUSxNQUFPLFFBQU87QUFDMUIsVUFBSSxVQUFVLE1BQU8sUUFBTztBQUM1QixVQUFJLFlBQVksTUFBTyxRQUFPO0FBQzlCLGFBQU87QUFBQSxJQUNULENBQUM7QUFFRCxVQUFNLHFCQUFxQixTQUFTLE1BQU07QUFDeEMsYUFBTyxzQ0FBc0MsTUFBTSxNQUFNO0FBQUEsSUFDM0QsQ0FBQztBQUVELFVBQU0sZUFBZTtBQUFBLE1BQ25CO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVBLFVBQU0sZ0JBQWdCLFNBQVMsTUFBTTtBQUNuQyxZQUFNLE9BQXVCLENBQUM7QUFHOUIsVUFBSSxNQUFNLFVBQVUsY0FBYztBQUNoQyxjQUFNLFlBQVksT0FBTyxLQUFLLE1BQU0sTUFBTTtBQUMxQyxtQkFBVyxRQUFRLFdBQVc7QUFDNUIsZ0JBQU0sUUFBUSxNQUFNLE9BQU8sSUFBSTtBQUMvQixjQUFJLENBQUMsU0FBUyxPQUFPLFVBQVUsWUFBWSxVQUFVLEtBQU07QUFDM0QsY0FBSSxFQUFFLFVBQVUsVUFBVSxPQUFPLE1BQU0sU0FBUyxTQUFVO0FBQzFELGNBQUksRUFBRSxXQUFXLE9BQVE7QUFFekIsZUFBSyxLQUFLO0FBQUEsWUFDUixLQUFLLE1BQU07QUFBQSxZQUNYLE1BQU0sT0FBTyxNQUFNO0FBQUEsWUFDbkIsV0FBVztBQUFBLFlBQ1gsYUFBYTtBQUFBLFlBQ2IsY0FBYztBQUFBLFlBQ2QsT0FBTyxNQUFNO0FBQUEsVUFDZixDQUFDO0FBQUEsUUFDSDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxhQUFhLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDM0MsaUJBQVcsT0FBTyxZQUFZO0FBQzVCLFlBQUksYUFBYSxTQUFTLEdBQUcsRUFBRztBQUVoQyxjQUFNLE9BQU8sTUFBTSxRQUFRLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxVQUFVLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFDakYsWUFBSSxZQUFZO0FBQ2hCLFlBQUksY0FBYztBQUNsQixZQUFJLGVBQWU7QUFDbkIsWUFBSSxTQUFTLFNBQVM7QUFDcEIsZ0JBQU0sTUFBTSxNQUFNLE9BQU8sR0FBRztBQUM1Qix3QkFBYyxJQUFJO0FBQ2xCLGNBQUksSUFBSSxTQUFTLEdBQUc7QUFDbEIsd0JBQVksTUFBTSxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxPQUFPLElBQUksQ0FBQztBQUUxRCwyQkFBZSxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJO0FBQUEsVUFDNUM7QUFBQSxRQUNGO0FBRUEsWUFDRSxNQUFNLE9BQU8sR0FBRyxLQUNoQixnQkFBZ0IsTUFBTSxPQUFPLEdBQUcsQ0FBNEIsR0FDNUQ7QUFFQSxnQkFBTSxFQUFFLE9BQU8sTUFBTSxJQUFJLE1BQU0sT0FBTyxHQUFHO0FBQ3pDLGdCQUFNQyxZQUFXLFlBQVksUUFBUSxHQUFHLFlBQVksS0FBSyxJQUFJLEdBQUcsS0FBSztBQUNyRSxlQUFLLEtBQUs7QUFBQSxZQUNSO0FBQUEsWUFDQSxNQUFNLE9BQU87QUFBQSxZQUNiO0FBQUEsWUFDQTtBQUFBLFlBQ0EsYUFBYUE7QUFBQSxVQUNmLENBQUM7QUFDRDtBQUFBLFFBQ0Y7QUFDQSxjQUFNLFdBQVcsWUFBWSxRQUFRLEdBQUcsWUFBWSxLQUFLLElBQUksR0FBRyxLQUFLO0FBQ3JFLGFBQUssS0FBSztBQUFBLFVBQ1I7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUEsVUFDdkIsYUFBYTtBQUFBLFFBQ2YsQ0FBQztBQUFBLE1BQ0g7QUFFQSxhQUFPO0FBQUEsSUFDVCxDQUFDO0FBRUQsVUFBTSxrQkFBa0IsQ0FBQyxRQUFpQztBQUN4RCxZQUFNLE9BQU8sT0FBTyxLQUFLLEdBQUc7QUFDNUIsYUFBTyxLQUFLLFNBQVMsTUFBTSxLQUFLLEtBQUssU0FBUyxPQUFPO0FBQUEsSUFDdkQ7QUFFQSxVQUFNLHdCQUF3QixTQUFTLE1BQU07QUFDM0MsYUFBTztBQUFBLFFBQ0wsWUFBWSxjQUFjLE1BQU07QUFBQSxVQUM5QixDQUFDLFNBQVMsS0FBSyxTQUFTLFlBQVksS0FBSyxTQUFTLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDOUU7QUFBQSxRQUNBLFNBQVMsY0FBYyxNQUNwQixPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsWUFBWSxLQUFLLFVBQVUsSUFBSSxFQUM5RCxPQUFPLENBQUMsU0FBUztBQUNoQixnQkFBTSxPQUFPLE9BQU8sS0FBSyxLQUFLLEtBQTJDO0FBQ3pFLGdCQUFNLE1BQU0sS0FBSyxTQUFTLE1BQU0sS0FBSyxLQUFLLFNBQVMsT0FBTztBQUMxRCxpQkFBTyxDQUFDO0FBQUEsUUFDVixDQUFDLEVBQ0EsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLElBQUksWUFBWSxFQUFFLGNBQWMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDO0FBQUEsUUFDeEUsb0JBQW9CLGNBQWMsTUFBTTtBQUFBLFVBQ3RDLENBQUMsU0FDQyxLQUFLLFNBQVMsV0FDZCxLQUFLLFVBQVUsU0FDZCxLQUFLLGNBQWMsWUFBWSxLQUFLLGNBQWM7QUFBQSxRQUN2RDtBQUFBLFFBQ0EsaUJBQWlCLGNBQWMsTUFBTTtBQUFBLFVBQ25DLENBQUMsU0FDQyxLQUFLLFNBQVMsV0FDZCxLQUFLLFVBQVUsUUFDZixFQUFFLEtBQUssY0FBYyxZQUFZLEtBQUssY0FBYztBQUFBLFFBQ3hEO0FBQUEsUUFDQSxPQUFPLGNBQWMsTUFBTSxPQUFPLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQ2pFO0FBQUEsSUFDRixDQUFDO0FBRUQsVUFBTSxrQkFBa0IsTUFBTTtBQUM1QixVQUFJLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sVUFBVTtBQUMxRCx5QkFBaUIsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDO0FBQUEsTUFDcEM7QUFBQSxJQUNGO0FBRUEsVUFBTSxvQkFBb0IsTUFBTTtBQUM5QixVQUFJLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sVUFBVTtBQUMxRCwyQkFBbUIsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDO0FBQUEsTUFDdEM7QUFBQSxJQUNGO0FBRUE7QUFBQSxNQUNFLE1BQU0sTUFBTTtBQUFBLE1BQ1osQ0FBQyxXQUFXO0FBQ1YsZUFBTyxRQUFRO0FBQUEsTUFDakI7QUFBQSxJQUNGOzs7Ozs7OztFQW5VUyxPQUFNO0FBQUEsRUFBeUIsb0JBQWlCOzs7O0VBZTRCLG9CQUFpQjs7OztFQU8vRSxPQUFNO0FBQUEsRUFBMkIsb0JBQWlCOzs7RUEyQjVELE9BQU07QUFBQSxFQUEwQyxvQkFBaUI7Ozs7RUFRbEUsT0FBTTtBQUFBLEVBQTZFLG9CQUFpQjs7O0VBRS9GLE9BQU07QUFBQSxFQUFxQixvQkFBaUI7OztFQUM1QyxPQUFNO0FBQUEsRUFBb0Isb0JBQWlCOzs7RUFLL0MsT0FBTTtBQUFBLEVBQW1CLG9CQUFpQjs7Ozs7RUFXdEMsT0FBTTtBQUFBLEVBQTRCLG9CQUFpQjs7O0VBQ25ELE9BQU07QUFBQSxFQUFvQixvQkFBaUI7Ozs7RUFLYSxPQUFNO0FBQUEsRUFBTyxvQkFBaUI7Ozs7Ozt1QkF6RnJHO0FBQUEsSUE0Rk07QUFBQTtBQUFBLE1BM0ZILE9BQUssbUJBQWEsdUJBQWdCLFlBQVk7TUFJM0Msb0JBQWlCO0FBQUE7O01BRXJCLG9CQXFCTSxPQXJCTixZQXFCTTtBQUFBLFFBcEJKO0FBQUEsVUFtQlM7QUFBQTtBQUFBLFlBbEJQLE9BQU07QUFBQSxZQUNMLFNBQUssc0NBQUUsZ0JBQU0sQ0FBSTtBQUFBLFlBQ2pCLGNBQVk7QUFBQSxZQUNaLFdBQVM7QUFBQSxZQUNULGNBQVk7QUFBQSxZQUNaLFlBQVU7QUFBQSxZQUFtQixvQkFBaUI7QUFBQTs7WUFFL0MsYUFFRTtBQUFBLGNBREMsT0FBSyxvQ0FBc0Isb0JBQWEsSUFBSSxnQkFBTTtBQUFBLGNBQXVCLG9CQUFpQjtBQUFBO1lBRTdGO0FBQUEsY0FPTTtBQUFBO0FBQUEsZ0JBUEEsT0FBSyxzREFBd0Msb0JBQWE7QUFBQSxnQkFBSSxvQkFBaUI7QUFBQTs7O21DQUNoRixnQkFBUywwQkFBbUIsTUFBTSxJQUFHO0FBQUEsa0JBQ3hDO0FBQUE7QUFBQTtBQUFBLGlCQUNTLGFBQU0sUUFBUSxhQUFNLG9CQUFvQix1QkFBZ0IsMEJBRGpFO0FBQUEsa0JBSU87QUFBQSxrQkFKUDtBQUFBLGtCQUlPLGlCQURGLHVCQUFnQixRQUFLO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O01BS3JCLCtCQUFYLG9CQTJETSxPQTNETixZQTJETTtBQUFBLFFBMURKO0FBQUEsMkJBQ0E7QUFBQSxVQU9FO0FBQUE7QUFBQTtBQUFBLGVBTnVDLDZCQUFzQjtBQUFBLGVBQTBCLDZCQUFzQjtBQUFBLGNBQXJHLEtBQUssVUFBSztpQ0FEcEIsYUFPRTtBQUFBLGNBRkMsS0FBSztBQUFBLGNBQ0w7QUFBQSxjQUFVLG9CQUFpQjtBQUFBOzs7OzsyQkFFOUI7QUFBQSxVQVdNO0FBQUE7QUFBQSxzQkFWbUIsNkJBQXNCLFNBQU8sQ0FBNUMsS0FBSyxVQUFLO2lDQURwQixvQkFXTTtBQUFBLGNBVEgsS0FBSztBQUFBLGNBQ04sT0FBTTtBQUFBLGNBQU8sb0JBQWlCO0FBQUE7Y0FFOUIsYUFLRTtBQUFBLGdCQUpDLFFBQVMsSUFBSSxTQUFLO0FBQUEsZ0JBQ2xCLE9BQVEsSUFBSTtBQUFBLGdCQUNaLFFBQVEsc0JBQWUsU0FBUyxJQUFJLEdBQUc7QUFBQSxnQkFDdkMsZUFBYTtBQUFBLGdCQUFhLG9CQUFpQjtBQUFBOzs7Ozs7MkJBR2hEO0FBQUEsVUFtQk07QUFBQTtBQUFBLHNCQWxCbUIsNkJBQXNCLG9CQUFrQixDQUF2RCxLQUFLLFVBQUs7aUNBRHBCLG9CQW1CTTtBQUFBLGNBakJILEtBQUs7QUFBQSxjQUNOLE9BQU07QUFBQSxjQUFnQixvQkFBaUI7QUFBQTtjQUV2QyxvQkFhTSxPQWJOLFlBYU07QUFBQSxnQkFaSixvQkFLTTtBQUFBLGtCQUpKLE9BQU07QUFBQSxrQkFDTCxPQUFRLElBQUk7QUFBQSxrQkFBZ0Isb0JBQWlCO0FBQUEsb0NBRTNDLElBQUksR0FBRztBQUFBLGdCQUVaLG9CQUtNLE9BTE4sWUFLTTtBQUFBLGtCQUZKO0FBQUEsb0JBQStIO0FBQUEsb0JBQS9IO0FBQUEsb0JBQStILGlCQUE1QixJQUFJLFNBQVMsSUFBRztBQUFBLG9CQUFNO0FBQUE7QUFBQTtBQUFBLGtCQUN6SDtBQUFBLG9CQUE0SDtBQUFBLG9CQUE1SDtBQUFBLG9CQUErRixNQUFDLGlCQUFHLElBQUksV0FBVyxJQUFHO0FBQUEsb0JBQUM7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7MkJBSTVIO0FBQUEsVUFnQk07QUFBQTtBQUFBLHNCQWhCc0IsNkJBQXNCLGlCQUFlLENBQXBELEtBQUssVUFBSztpQ0FBdkIsb0JBZ0JNO0FBQUEsY0FoQjhELEtBQUs7QUFBQSxjQUFPLG9CQUFpQjtBQUFBO2NBQy9GLG9CQWNNLE9BZE4sWUFjTTtBQUFBLGdCQWJKLG9CQUtNO0FBQUEsa0JBSkosT0FBTTtBQUFBLGtCQUNMLE9BQVEsSUFBSTtBQUFBLGtCQUFnQixvQkFBaUI7QUFBQSxvQ0FFM0MsSUFBSSxHQUFHO0FBQUEsZ0JBRVosb0JBTU07QUFBQSxrQkFMSixPQUFNO0FBQUEsa0JBQ0wsT0FBUSxJQUFJO0FBQUEsa0JBQWtCLG9CQUFpQjtBQUFBO2tCQUVoRDtBQUFBLG9CQUFtSTtBQUFBLG9CQUFuSTtBQUFBLG9CQUFtSSxpQkFBekIsSUFBSSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBQzFIO0FBQUEsb0JBQTRIO0FBQUEsb0JBQTVIO0FBQUEsb0JBQStGLE1BQUMsaUJBQUcsSUFBSSxXQUFXLElBQUc7QUFBQSxvQkFBQztBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7TUFLbkgsdUJBQWdCLFlBQVksdUJBQWdCLFFBQVEsNkJBQS9ELG9CQUVNLE9BRk4sYUFFTTtBQUFBLFFBREosYUFBZ0o7QUFBQSxVQUF4SCxRQUFRLHVCQUFnQjtBQUFBLFVBQU8sb0JBQWtCO0FBQUEsVUFBTSxvQkFBaUI7QUFBQSIsIm5hbWVzIjpbInBhaXIiLCJmdWxsUGF0aCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJPYmplY3QudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2XHJcbiAgICA6Y2xhc3M9XCJgJHtcclxuICAgICAgaXNNb2RpZmllZFF1ZXJ5Lm1vZGlmaWVkICYmIHJvb3RcclxuICAgICAgICA/ICdvdXRsaW5lIG91dGxpbmUtMiByb3VuZGVkIHB5LTEgcHgtMSBvdXRsaW5lLWFtYmVyLTUwMCdcclxuICAgICAgICA6ICcnXHJcbiAgICB9YFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZToyOjNcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0xIGZsZXggaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjk6NVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcGwtMSBwci0yIHB5LTEgaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtWzJweF0gYmctZm91bmRhdGlvbi0yXCJcclxuICAgICAgICBAY2xpY2s9XCJ1bmZvbGQgPSAhdW5mb2xkXCJcclxuICAgICAgICBAbW91c2VlbnRlcj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgICAgQGZvY3VzaW49XCJoaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICAgIEBtb3VzZWxlYXZlPVwidW5oaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICAgIEBmb2N1c291dD1cInVuaGlnaGxpZ2h0T2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjEwOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEljb25UcmlhbmdsZVxyXG4gICAgICAgICAgOmNsYXNzPVwiYGgtMyB3LTMgc2hyaW5rLTAgJHtoZWFkZXJDbGFzc2VzfSAke3VuZm9sZCA/ICdyb3RhdGUtOTAnIDogJyd9YFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZToxODo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXYgOmNsYXNzPVwiYHRydW5jYXRlIHRleHQtYm9keS0zeHMgZm9udC1tZWRpdW0gJHtoZWFkZXJDbGFzc2VzfWBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL09iamVjdC52dWU6MjE6OVwiPlxyXG4gICAgICAgICAge3sgdGl0bGUgfHwgaGVhZGVyQW5kU3ViaGVhZGVyLmhlYWRlciB9fVxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgdi1pZj1cIihwcm9wcy5yb290IHx8IHByb3BzLm1vZGlmaWVkU2libGluZykgJiYgaXNNb2RpZmllZFF1ZXJ5Lm1vZGlmaWVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjIzOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgaXNNb2RpZmllZFF1ZXJ5LmlzTmV3ID8gJyhuZXcpJyA6ICcob2xkKScgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cInVuZm9sZFwiIGNsYXNzPVwic3BhY2UteS0xIHBsLTAgcHktMSBwci0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjMxOjVcIj5cclxuICAgICAgPCEtLSBrZXkgdmFsdWUgcGFpciBkaXNwbGF5IC0tPlxyXG4gICAgICA8Vmlld2VyU2VsZWN0aW9uS2V5VmFsdWVQYWlyXHJcbiAgICAgICAgdi1mb3I9XCIoa3ZwLCBpbmRleCkgaW4gW1xyXG4gICAgICAgICAgLi4uY2F0ZWdvcmlzZWRWYWx1ZVBhaXJzLnByaW1pdGl2ZXMsXHJcbiAgICAgICAgICAuLi5jYXRlZ29yaXNlZFZhbHVlUGFpcnMubnVsbHNcclxuICAgICAgICBdXCJcclxuICAgICAgICA6a2V5PVwiaW5kZXhcIlxyXG4gICAgICAgIDprdnA9XCJrdnBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL09iamVjdC52dWU6MzM6N1wiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LWZvcj1cIihrdnAsIGluZGV4KSBpbiBjYXRlZ29yaXNlZFZhbHVlUGFpcnMub2JqZWN0c1wiXHJcbiAgICAgICAgOmtleT1cImluZGV4XCJcclxuICAgICAgICBjbGFzcz1cInBsLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL09iamVjdC52dWU6NDE6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyU2VsZWN0aW9uT2JqZWN0XHJcbiAgICAgICAgICA6b2JqZWN0PVwiKGt2cC52YWx1ZSBhcyBTcGVja2xlT2JqZWN0KSB8fCB7fVwiXHJcbiAgICAgICAgICA6dGl0bGU9XCIoa3ZwLmtleSBhcyBzdHJpbmcpXCJcclxuICAgICAgICAgIDp1bmZvbGQ9XCJhdXRvVW5mb2xkS2V5cy5pbmNsdWRlcyhrdnAua2V5KVwiXHJcbiAgICAgICAgICA6cGFyZW50LXBhdGg9XCJjdXJyZW50UGF0aFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo0Njo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtZm9yPVwiKGt2cCwgaW5kZXgpIGluIGNhdGVnb3Jpc2VkVmFsdWVQYWlycy5ub25QcmltaXRpdmVBcnJheXNcIlxyXG4gICAgICAgIDprZXk9XCJpbmRleFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjUzOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIGdyaWQgZ3JpZC1jb2xzLTMgcGwtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo1ODo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLXNwYW4tMSB0cnVuY2F0ZSB0ZXh0LWJvZHktM3hzIGZvbnQtbWVkaXVtXCJcclxuICAgICAgICAgICAgOnRpdGxlPVwiKGt2cC5rZXkgYXMgc3RyaW5nKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo1OToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGt2cC5rZXkgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImNvbC1zcGFuLTIgZmxleCB3LWZ1bGwgbWluLXctMCB0cnVuY2F0ZSB0ZXh0LWJvZHktM3hzIHBsLTEgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjY1OjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3JvdyB0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo2ODoxM1wiPnt7IGt2cC5pbm5lclR5cGUgfX0gYXJyYXk8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjY5OjEzXCI+KHt7IGt2cC5hcnJheUxlbmd0aCB9fSk8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiB2LWZvcj1cIihrdnAsIGluZGV4KSBpbiBjYXRlZ29yaXNlZFZhbHVlUGFpcnMucHJpbWl0aXZlQXJyYXlzXCIgOmtleT1cImluZGV4XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjczOjdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo3NDo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLXNwYW4tMSB0cnVuY2F0ZSB0ZXh0LWJvZHktM3hzIGZvbnQtbWVkaXVtIHBsLTIgdGV4dC1mb3JlZ3JvdW5kLTJcIlxyXG4gICAgICAgICAgICA6dGl0bGU9XCIoa3ZwLmtleSBhcyBzdHJpbmcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjc1OjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sga3ZwLmtleSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLXNwYW4tMiBmbGV4IHctZnVsbCBtaW4tdy0wIHRydW5jYXRlIHRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kXCJcclxuICAgICAgICAgICAgOnRpdGxlPVwiKGt2cC52YWx1ZSBhcyBzdHJpbmcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjgxOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTIuNSBmbGV4LWdyb3cgdHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL09iamVjdC52dWU6ODU6MTNcIj57eyBrdnAuYXJyYXlQcmV2aWV3IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vT2JqZWN0LnZ1ZTo4NjoxM1wiPih7eyBrdnAuYXJyYXlMZW5ndGggfX0pPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgdi1pZj1cImlzTW9kaWZpZWRRdWVyeS5tb2RpZmllZCAmJiBpc01vZGlmaWVkUXVlcnkucGFpciAmJiByb290XCIgY2xhc3M9XCJtdC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlOjkxOjVcIj5cclxuICAgICAgPFZpZXdlclNlbGVjdGlvbk9iamVjdCA6b2JqZWN0PVwiaXNNb2RpZmllZFF1ZXJ5LnBhaXJcIiA6bW9kaWZpZWQtc2libGluZz1cInRydWVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL09iamVjdC52dWU6OTI6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUgeyBTcGVja2xlT2JqZWN0IH0gZnJvbSAnfn4vbGliL3ZpZXdlci9oZWxwZXJzL3NjZW5lRXhwbG9yZXInXHJcbmltcG9ydCB7IGdldEhlYWRlckFuZFN1YmhlYWRlckZvclNwZWNrbGVPYmplY3QgfSBmcm9tICd+fi9saWIvb2JqZWN0LXNpZGViYXIvaGVscGVycydcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IHVzZUhpZ2hsaWdodGVkT2JqZWN0c1V0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuaW1wb3J0IHR5cGUgeyBLZXlWYWx1ZVBhaXIgfSBmcm9tICd+L2NvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi90eXBlcydcclxuXHJcbmNvbnN0IHtcclxuICB1aToge1xyXG4gICAgZGlmZjogeyByZXN1bHQsIGVuYWJsZWQ6IGRpZmZFbmFibGVkIH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIG9iamVjdDogU3BlY2tsZU9iamVjdFxyXG4gICAgcm9vdD86IGJvb2xlYW5cclxuICAgIHRpdGxlPzogc3RyaW5nXHJcbiAgICB1bmZvbGQ/OiBib29sZWFuXHJcbiAgICBkZWJ1Zz86IGJvb2xlYW5cclxuICAgIG1vZGlmaWVkU2libGluZz86IGJvb2xlYW5cclxuICAgIHBhcmVudFBhdGg/OiBzdHJpbmdcclxuICB9PigpLFxyXG4gIHsgZGVidWc6IGZhbHNlLCB1bmZvbGQ6IGZhbHNlLCByb290OiBmYWxzZSwgbW9kaWZpZWRTaWJsaW5nOiBmYWxzZSB9XHJcbilcclxuXHJcbmNvbnN0IHsgaGlnaGxpZ2h0T2JqZWN0cywgdW5oaWdobGlnaHRPYmplY3RzIH0gPSB1c2VIaWdobGlnaHRlZE9iamVjdHNVdGlsaXRpZXMoKVxyXG5jb25zdCB1bmZvbGQgPSByZWYocHJvcHMudW5mb2xkKVxyXG5jb25zdCBhdXRvVW5mb2xkS2V5cyA9IFsncHJvcGVydGllcycsICdJbnN0YW5jZSBQYXJhbWV0ZXJzJ11cclxuXHJcbi8vIENvbXB1dGUgdGhlIGN1cnJlbnQgZnVsbCBwYXRoIGZvciB0aGlzIG9iamVjdFxyXG5jb25zdCBjdXJyZW50UGF0aCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMucm9vdCkgcmV0dXJuICcnXHJcbiAgaWYgKCFwcm9wcy5wYXJlbnRQYXRoKSByZXR1cm4gcHJvcHMudGl0bGUgfHwgJydcclxuICByZXR1cm4gcHJvcHMucGFyZW50UGF0aFxyXG4gICAgPyBgJHtwcm9wcy5wYXJlbnRQYXRofS4ke3Byb3BzLnRpdGxlIHx8ICcnfWBcclxuICAgIDogcHJvcHMudGl0bGUgfHwgJydcclxufSlcclxuXHJcbmNvbnN0IGlzQWRkZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFkaWZmRW5hYmxlZC52YWx1ZSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIChcclxuICAgIHJlc3VsdC52YWx1ZT8uYWRkZWQuZmluZEluZGV4KFxyXG4gICAgICAobykgPT4gKG8ubW9kZWwucmF3IGFzIFNwZWNrbGVPYmplY3QpLmFwcGxpY2F0aW9uSWQgPT09IHByb3BzLm9iamVjdC5hcHBsaWNhdGlvbklkXHJcbiAgICApICE9PSAtMVxyXG4gIClcclxufSlcclxuXHJcbmNvbnN0IGlzUmVtb3ZlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWRpZmZFbmFibGVkLnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICByZXR1cm4gKFxyXG4gICAgcmVzdWx0LnZhbHVlPy5yZW1vdmVkLmZpbmRJbmRleChcclxuICAgICAgKG8pID0+IChvLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0KS5hcHBsaWNhdGlvbklkID09PSBwcm9wcy5vYmplY3QuYXBwbGljYXRpb25JZFxyXG4gICAgKSAhPT0gLTFcclxuICApXHJcbn0pXHJcblxyXG5jb25zdCBpc1VuY2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWRpZmZFbmFibGVkLnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICByZXR1cm4gKFxyXG4gICAgcmVzdWx0LnZhbHVlPy51bmNoYW5nZWQuZmluZEluZGV4KFxyXG4gICAgICAobykgPT4gKG8ubW9kZWwucmF3IGFzIFNwZWNrbGVPYmplY3QpLmFwcGxpY2F0aW9uSWQgPT09IHByb3BzLm9iamVjdC5hcHBsaWNhdGlvbklkXHJcbiAgICApICE9PSAtMVxyXG4gIClcclxufSlcclxuXHJcbmNvbnN0IGlzTW9kaWZpZWRRdWVyeSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAvLyBpZiAocHJvcHMubW9kaWZpZWRTaWJsaW5nKSByZXR1cm4geyBtb2RpZmllZDogZmFsc2UgfSAvLyBwcmV2ZW50IHJlY3Vyc2lvbj9cclxuICBpZiAoIWRpZmZFbmFibGVkLnZhbHVlKSByZXR1cm4geyBtb2RpZmllZDogZmFsc2UgfVxyXG4gIGNvbnN0IG1vZGlmaWVkT2JqZWN0UGFpcnMgPSByZXN1bHQudmFsdWU/Lm1vZGlmaWVkLm1hcCgocGFpcikgPT4ge1xyXG4gICAgcmV0dXJuIFtwYWlyWzBdLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0LCBwYWlyWzFdLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0XVxyXG4gIH0pXHJcbiAgaWYgKCFtb2RpZmllZE9iamVjdFBhaXJzKSByZXR1cm4geyBtb2RpZmllZDogZmFsc2UgfVxyXG4gIGNvbnN0IG9iaiA9IHByb3BzLm9iamVjdFxyXG4gIGNvbnN0IHBhaXJlZEl0ZW1zID0gbW9kaWZpZWRPYmplY3RQYWlycy5maW5kKFxyXG4gICAgKGl0ZW0pID0+IGl0ZW1bMF0uaWQgPT09IG9iai5pZCB8fCBpdGVtWzFdLmlkID09PSBvYmouaWRcclxuICApXHJcbiAgaWYgKCFwYWlyZWRJdGVtcykgcmV0dXJuIHsgbW9kaWZpZWQ6IGZhbHNlIH1cclxuICBjb25zdCBwYWlyID0gcGFpcmVkSXRlbXNbMF0uaWQgPT09IG9iai5pZCA/IHBhaXJlZEl0ZW1zWzFdIDogcGFpcmVkSXRlbXNbMF1cclxuICBpZiAoIXBhaXIpIHJldHVybiB7IG1vZGlmaWVkOiBmYWxzZSB9XHJcbiAgcmV0dXJuIHtcclxuICAgIG1vZGlmaWVkOiB0cnVlLFxyXG4gICAgcGFpcixcclxuICAgIGlzTmV3OiBwYWlyZWRJdGVtc1swXS5pZCAhPT0gb2JqLmlkXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgaGVhZGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAocHJvcHMubW9kaWZpZWRTaWJsaW5nKSByZXR1cm4gJ3RleHQtYW1iZXItNTAwJ1xyXG4gIGlmICghcHJvcHMucm9vdCkgcmV0dXJuICcnXHJcbiAgaWYgKCFkaWZmRW5hYmxlZC52YWx1ZSkgcmV0dXJuICcnXHJcbiAgaWYgKCFPYmplY3Qua2V5cyhwcm9wcy5vYmplY3QpLmluY2x1ZGVzKCdhcHBsaWNhdGlvbklkJykpIHJldHVybiAnJ1xyXG4gIGlmIChpc0FkZGVkLnZhbHVlKSByZXR1cm4gJ3RleHQtZ3JlZW4tNTAwJ1xyXG4gIGlmIChpc1JlbW92ZWQudmFsdWUpIHJldHVybiAndGV4dC1yZWQtNTAwJ1xyXG4gIGlmIChpc1VuY2hhbmdlZC52YWx1ZSkgcmV0dXJuICd0ZXh0LWZvcmVncm91bmQtMidcclxuICByZXR1cm4gJ3RleHQtYW1iZXItNTAwJ1xyXG59KVxyXG5cclxuY29uc3QgaGVhZGVyQW5kU3ViaGVhZGVyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBnZXRIZWFkZXJBbmRTdWJoZWFkZXJGb3JTcGVja2xlT2JqZWN0KHByb3BzLm9iamVjdClcclxufSlcclxuXHJcbmNvbnN0IGlnbm9yZWRQcm9wcyA9IFtcclxuICAnX19jbG9zdXJlJyxcclxuICAnZGlzcGxheU1lc2gnLFxyXG4gICdkaXNwbGF5VmFsdWUnLFxyXG4gICd0b3RhbENoaWxkcmVuQ291bnQnLFxyXG4gICdfX2ltcG9ydGVkVXJsJyxcclxuICAnX19wYXJlbnRzJyxcclxuICAnYmJveCdcclxuXVxyXG5cclxuY29uc3Qga2V5VmFsdWVQYWlycyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBrdnBzOiBLZXlWYWx1ZVBhaXJbXSA9IFtdXHJcblxyXG4gIC8vIGhhbmRsZSByZXZpdCBwYXJhbXRlcnNcclxuICBpZiAocHJvcHMudGl0bGUgPT09ICdwYXJhbWV0ZXJzJykge1xyXG4gICAgY29uc3QgcGFyYW1LZXlzID0gT2JqZWN0LmtleXMocHJvcHMub2JqZWN0KVxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHBhcmFtS2V5cykge1xyXG4gICAgICBjb25zdCBwYXJhbSA9IHByb3BzLm9iamVjdFtwcm9wXVxyXG4gICAgICBpZiAoIXBhcmFtIHx8IHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgfHwgcGFyYW0gPT09IG51bGwpIGNvbnRpbnVlXHJcbiAgICAgIGlmICghKCduYW1lJyBpbiBwYXJhbSkgfHwgdHlwZW9mIHBhcmFtLm5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZVxyXG4gICAgICBpZiAoISgndmFsdWUnIGluIHBhcmFtKSkgY29udGludWVcclxuXHJcbiAgICAgIGt2cHMucHVzaCh7XHJcbiAgICAgICAga2V5OiBwYXJhbS5uYW1lLFxyXG4gICAgICAgIHR5cGU6IHR5cGVvZiBwYXJhbS52YWx1ZSxcclxuICAgICAgICBpbm5lclR5cGU6IG51bGwsXHJcbiAgICAgICAgYXJyYXlMZW5ndGg6IG51bGwsXHJcbiAgICAgICAgYXJyYXlQcmV2aWV3OiBudWxsLFxyXG4gICAgICAgIHZhbHVlOiBwYXJhbS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGt2cHNcclxuICB9XHJcblxyXG4gIGNvbnN0IG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcy5vYmplY3QpXHJcbiAgZm9yIChjb25zdCBrZXkgb2Ygb2JqZWN0S2V5cykge1xyXG4gICAgaWYgKGlnbm9yZWRQcm9wcy5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KHByb3BzLm9iamVjdFtrZXldKSA/ICdhcnJheScgOiB0eXBlb2YgcHJvcHMub2JqZWN0W2tleV1cclxuICAgIGxldCBpbm5lclR5cGUgPSBudWxsXHJcbiAgICBsZXQgYXJyYXlMZW5ndGggPSBudWxsXHJcbiAgICBsZXQgYXJyYXlQcmV2aWV3ID0gbnVsbFxyXG4gICAgaWYgKHR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgY29uc3QgYXJyID0gcHJvcHMub2JqZWN0W2tleV0gYXMgdW5rbm93bltdXHJcbiAgICAgIGFycmF5TGVuZ3RoID0gYXJyLmxlbmd0aFxyXG4gICAgICBpZiAoYXJyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpbm5lclR5cGUgPSBBcnJheS5pc0FycmF5KGFyclswXSkgPyAnYXJyYXknIDogdHlwZW9mIGFyclswXVxyXG4gICAgICAgIC8vIFdlIHRydW5jYXRlIHRoaXMgYWJvdmUgd2l0aCBjc3MgLSBidXQgbGltaXQgdG8gMTAwIHRvIGxpbWl0IGRvbSBzaXplXHJcbiAgICAgICAgYXJyYXlQcmV2aWV3ID0gYXJyLnNsaWNlKDAsIDEwMCkuam9pbignLCAnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBwcm9wcy5vYmplY3Rba2V5XSAmJlxyXG4gICAgICBpc05hbWVWYWx1ZVBhaXIocHJvcHMub2JqZWN0W2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXHJcbiAgICApIHtcclxuICAgICAgLy8gbm90ZTogaGFuZGxlcyBuYW1lIHZhbHVlIHBhaXJzIGZyb20gZHVpMyAtXHJcbiAgICAgIGNvbnN0IHsgdmFsdWUsIHVuaXRzIH0gPSBwcm9wcy5vYmplY3Rba2V5XSBhcyB7IHZhbHVlOiBzdHJpbmc7IHVuaXRzPzogc3RyaW5nIH1cclxuICAgICAgY29uc3QgZnVsbFBhdGggPSBjdXJyZW50UGF0aC52YWx1ZSA/IGAke2N1cnJlbnRQYXRoLnZhbHVlfS4ke2tleX1gIDoga2V5XHJcbiAgICAgIGt2cHMucHVzaCh7XHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHR5cGU6IHR5cGVvZiB2YWx1ZSxcclxuICAgICAgICB2YWx1ZTogdmFsdWUgYXMgc3RyaW5nLFxyXG4gICAgICAgIHVuaXRzLFxyXG4gICAgICAgIGJhY2tlbmRQYXRoOiBmdWxsUGF0aFxyXG4gICAgICB9KVxyXG4gICAgICBjb250aW51ZVxyXG4gICAgfVxyXG4gICAgY29uc3QgZnVsbFBhdGggPSBjdXJyZW50UGF0aC52YWx1ZSA/IGAke2N1cnJlbnRQYXRoLnZhbHVlfS4ke2tleX1gIDoga2V5XHJcbiAgICBrdnBzLnB1c2goe1xyXG4gICAgICBrZXksXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIGlubmVyVHlwZSxcclxuICAgICAgYXJyYXlMZW5ndGgsXHJcbiAgICAgIGFycmF5UHJldmlldyxcclxuICAgICAgdmFsdWU6IHByb3BzLm9iamVjdFtrZXldLFxyXG4gICAgICBiYWNrZW5kUGF0aDogZnVsbFBhdGhcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4ga3Zwc1xyXG59KVxyXG5cclxuY29uc3QgaXNOYW1lVmFsdWVQYWlyID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcclxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKVxyXG4gIHJldHVybiBrZXlzLmluY2x1ZGVzKCduYW1lJykgJiYga2V5cy5pbmNsdWRlcygndmFsdWUnKVxyXG59XHJcblxyXG5jb25zdCBjYXRlZ29yaXNlZFZhbHVlUGFpcnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHByaW1pdGl2ZXM6IGtleVZhbHVlUGFpcnMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlICE9PSAnb2JqZWN0JyAmJiBpdGVtLnR5cGUgIT09ICdhcnJheScgJiYgaXRlbS52YWx1ZSAhPT0gbnVsbFxyXG4gICAgKSxcclxuICAgIG9iamVjdHM6IGtleVZhbHVlUGFpcnMudmFsdWVcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnb2JqZWN0JyAmJiBpdGVtLnZhbHVlICE9PSBudWxsKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW0udmFsdWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcclxuICAgICAgICBjb25zdCBudnAgPSBrZXlzLmluY2x1ZGVzKCduYW1lJykgJiYga2V5cy5pbmNsdWRlcygndmFsdWUnKVxyXG4gICAgICAgIHJldHVybiAhbnZwXHJcbiAgICAgIH0pIC8vIGZpbHRlcnMgb3V0IG5hbWUgdmFsdWUgcGFpcnMgLSBub3RlIG9uIG5ldyBwcm9wZXJ0aWVzIHN0cnVjdHVyZSBjb21pbmcgb3V0IG9mIERVSTNcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEua2V5LnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmtleS50b0xvd2VyQ2FzZSgpKSksXHJcbiAgICBub25QcmltaXRpdmVBcnJheXM6IGtleVZhbHVlUGFpcnMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAoaXRlbSkgPT5cclxuICAgICAgICBpdGVtLnR5cGUgPT09ICdhcnJheScgJiZcclxuICAgICAgICBpdGVtLnZhbHVlICE9PSBudWxsICYmXHJcbiAgICAgICAgKGl0ZW0uaW5uZXJUeXBlID09PSAnb2JqZWN0JyB8fCBpdGVtLmlubmVyVHlwZSA9PT0gJ2FycmF5JylcclxuICAgICksXHJcbiAgICBwcmltaXRpdmVBcnJheXM6IGtleVZhbHVlUGFpcnMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAoaXRlbSkgPT5cclxuICAgICAgICBpdGVtLnR5cGUgPT09ICdhcnJheScgJiZcclxuICAgICAgICBpdGVtLnZhbHVlICE9PSBudWxsICYmXHJcbiAgICAgICAgIShpdGVtLmlubmVyVHlwZSA9PT0gJ29iamVjdCcgfHwgaXRlbS5pbm5lclR5cGUgPT09ICdhcnJheScpXHJcbiAgICApLFxyXG4gICAgbnVsbHM6IGtleVZhbHVlUGFpcnMudmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBudWxsKVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGhpZ2hsaWdodE9iamVjdCA9ICgpID0+IHtcclxuICBpZiAocHJvcHMub2JqZWN0LmlkICYmIHR5cGVvZiBwcm9wcy5vYmplY3QuaWQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBoaWdobGlnaHRPYmplY3RzKFtwcm9wcy5vYmplY3QuaWRdKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgdW5oaWdobGlnaHRPYmplY3QgPSAoKSA9PiB7XHJcbiAgaWYgKHByb3BzLm9iamVjdC5pZCAmJiB0eXBlb2YgcHJvcHMub2JqZWN0LmlkID09PSAnc3RyaW5nJykge1xyXG4gICAgdW5oaWdobGlnaHRPYmplY3RzKFtwcm9wcy5vYmplY3QuaWRdKVxyXG4gIH1cclxufVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMudW5mb2xkLFxyXG4gIChuZXdWYWwpID0+IHtcclxuICAgIHVuZm9sZC52YWx1ZSA9IG5ld1ZhbFxyXG4gIH1cclxuKVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9PYmplY3QudnVlIn0= |