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=