336 lines
32 KiB
Plaintext
336 lines
32 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/saved-views/panel/views/Group.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/saved-views/panel/views/group/Inner.vue";
|
|
import { FormButton as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { LayoutMenu as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_3 } from "/_nuxt/components/presentation/ShareDialog.vue";
|
|
import { LayoutDisclosure as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createVNode as __createVNode,createBlock as __createBlock,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
/* Injection by vite-plugin-vue-inspector End */
|
|
import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { StringEnum, throwUncoveredError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { useMutationLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { Ellipsis, Plus, Play } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { ToastNotificationType } from "/_nuxt/lib/common/composables/toast.ts";
|
|
import {
|
|
useCreateSavedView,
|
|
useUpdateSavedViewGroup
|
|
} from "/_nuxt/lib/viewer/composables/savedViews/management.ts";
|
|
import { useDraggableViewTargetGroup } from "/_nuxt/lib/viewer/composables/savedViews/ui.ts";
|
|
import { presentationRoute } from "/_nuxt/lib/common/helpers/route.ts";
|
|
|
|
import { useSmartTooltipDelay } from "/_nuxt/composables/tooltips.ts";
|
|
import { ref, computed, useId } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useGlobalToast } from "/_nuxt/composables/globals.ts";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerSavedViewsPanelViewsGroup",
|
|
props: /* @__PURE__ */ _mergeModels({
|
|
project: { type: Object, required: true },
|
|
group: { type: Object, required: true },
|
|
viewsType: { type: null, required: true },
|
|
search: { type: String, required: false }
|
|
}, {
|
|
"open": { type: Boolean },
|
|
"openModifiers": {},
|
|
"renameMode": { type: Boolean },
|
|
"renameModeModifiers": {}
|
|
}),
|
|
emits: /* @__PURE__ */ _mergeModels(["delete-group", "rename-group"], ["update:open", "update:renameMode"]),
|
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
__expose();
|
|
const { getTooltipProps } = useSmartTooltipDelay();
|
|
const MenuItems = StringEnum(["Delete", "Share", "Rename"]);
|
|
graphql(`
|
|
fragment ViewerSavedViewsPanelViewsGroup_Project on Project {
|
|
id
|
|
permissions {
|
|
canCreateSavedView {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
workspace {
|
|
id
|
|
hasAccessToFeature(featureName: presentations)
|
|
}
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment ViewerSavedViewsPanelViewsGroup_SavedViewGroup on SavedViewGroup {
|
|
id
|
|
isUngroupedViewsGroup
|
|
resourceIds
|
|
title
|
|
permissions {
|
|
canUpdate {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
...ViewerSavedViewsPanelViewsGroupInner_SavedViewGroup
|
|
...ViewerSavedViewsPanelViewsGroupDeleteDialog_SavedViewGroup
|
|
...UseUpdateSavedViewGroup_SavedViewGroup
|
|
...UseDraggableViewTargetGroup_SavedViewGroup
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment ViewerSavedViewsPanelViewsGroup_SavedViewGroup_Paginated on SavedViewGroup {
|
|
id
|
|
views(input: $savedViewsInput) {
|
|
cursor
|
|
totalCount
|
|
items {
|
|
id
|
|
...ViewerSavedViewsPanelView_SavedView
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const emit = __emit;
|
|
const props = __props;
|
|
const open = _useModel(__props, "open");
|
|
const viewCount = ref(0);
|
|
const { triggerNotification } = useGlobalToast();
|
|
const isLoading = useMutationLoading();
|
|
const createView = useCreateSavedView();
|
|
const updateGroup = useUpdateSavedViewGroup();
|
|
const { on, classes: dropZoneClasses } = useDraggableViewTargetGroup({
|
|
group: computed(() => props.group),
|
|
onMoved: () => {
|
|
if (!open.value) {
|
|
open.value = true;
|
|
}
|
|
},
|
|
isGroupOpen: computed(() => !!open.value),
|
|
viewCount
|
|
});
|
|
const menuId = useId();
|
|
const renameMode = _useModel(__props, "renameMode");
|
|
const showMenu = ref(false);
|
|
const showShareDialog = ref(false);
|
|
const isUngroupedGroup = computed(() => props.group.isUngroupedViewsGroup);
|
|
const canUpdate = computed(() => props.group.permissions.canUpdate);
|
|
const canCreateView = computed(() => props.project.permissions.canCreateSavedView);
|
|
const menuItems = computed(() => {
|
|
const items = [];
|
|
items.push([
|
|
{
|
|
id: MenuItems.Rename,
|
|
title: "Rename group",
|
|
disabled: !canUpdate.value?.authorized || isLoading.value,
|
|
disabledTooltip: canUpdate.value.errorMessage
|
|
},
|
|
{
|
|
id: MenuItems.Share,
|
|
title: "Share presentation...",
|
|
disabled: isLoading.value,
|
|
disabledTooltip: canUpdate.value.errorMessage
|
|
},
|
|
{
|
|
id: MenuItems.Delete,
|
|
title: "Delete group...",
|
|
disabled: !canUpdate.value?.authorized || isLoading.value,
|
|
disabledTooltip: canUpdate.value.errorMessage
|
|
}
|
|
]);
|
|
return items;
|
|
});
|
|
const onActionChosen = async (item) => {
|
|
switch (item.id) {
|
|
case MenuItems.Delete:
|
|
emit("delete-group", props.group);
|
|
break;
|
|
case MenuItems.Rename:
|
|
emit("rename-group", props.group);
|
|
break;
|
|
case MenuItems.Share:
|
|
showShareDialog.value = true;
|
|
break;
|
|
default:
|
|
throwUncoveredError(item.id);
|
|
}
|
|
};
|
|
const onPresentGroup = () => {
|
|
window.open(presentationRoute(props.project.id, props.group.id), "_blank");
|
|
};
|
|
const onAddGroupView = async () => {
|
|
await createView({
|
|
groupId: props.group.id
|
|
});
|
|
open.value = true;
|
|
};
|
|
const onRename = async (newName) => {
|
|
if (!newName.trim() || newName.length > 255) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Name must be between 1 and 255 characters long"
|
|
});
|
|
renameMode.value = false;
|
|
return;
|
|
}
|
|
if (props.group.title === newName) {
|
|
renameMode.value = false;
|
|
return;
|
|
}
|
|
const res = await updateGroup({
|
|
group: props.group,
|
|
update: {
|
|
name: newName
|
|
}
|
|
});
|
|
if (res?.id) {
|
|
renameMode.value = false;
|
|
}
|
|
};
|
|
const __returned__ = { getTooltipProps, MenuItems, emit, props, open, viewCount, triggerNotification, isLoading, createView, updateGroup, on, dropZoneClasses, menuId, renameMode, showMenu, showShareDialog, isUngroupedGroup, canUpdate, canCreateView, menuItems, onActionChosen, onPresentGroup, onAddGroupView, onRename, get Ellipsis() {
|
|
return Ellipsis;
|
|
}, get Plus() {
|
|
return Plus;
|
|
}, get Play() {
|
|
return Play;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, withModifiers as _withModifiers, normalizeClass as _normalizeClass, toHandlers as _toHandlers, mergeProps as _mergeProps } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
key: 1,
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:43:9"
|
|
};
|
|
const _hoisted_2 = { "data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:53:9" };
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_ViewerSavedViewsPanelViewsGroupInner = __nuxt_component_0;
|
|
const _component_FormButton = __nuxt_component_1;
|
|
const _component_LayoutMenu = __nuxt_component_2;
|
|
const _component_PresentationShareDialog = __nuxt_component_3;
|
|
const _component_LayoutDisclosure = __nuxt_component_4;
|
|
const _directive_tippy = _resolveDirective("tippy");
|
|
return _openBlock(), _createBlock(_component_LayoutDisclosure, _mergeProps({
|
|
open: $setup.open,
|
|
"onUpdate:open": _cache[6] || (_cache[6] = ($event) => $setup.open = $event),
|
|
"edit-title": $setup.renameMode,
|
|
"onUpdate:editTitle": _cache[7] || (_cache[7] = ($event) => $setup.renameMode = $event),
|
|
color: "subtle",
|
|
title: $props.group.title,
|
|
"lazy-load": "",
|
|
class: $setup.dropZoneClasses,
|
|
"onUpdate:title": $setup.onRename
|
|
}, _toHandlers($setup.on), { "data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:3:3" }), {
|
|
"title-actions": _withCtx(() => [
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(["flex gap-0.5 items-center lg:group-hover/disclosure:opacity-100", { "lg:opacity-0": !$setup.showMenu }]),
|
|
onClick: _cache[4] || (_cache[4] = _withModifiers(() => {
|
|
}, ["stop"])),
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:20:7"
|
|
},
|
|
[
|
|
!$setup.isUngroupedGroup ? (_openBlock(), _createBlock(_component_LayoutMenu, {
|
|
key: 0,
|
|
open: $setup.showMenu,
|
|
"onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showMenu = $event),
|
|
items: $setup.menuItems,
|
|
"menu-id": $setup.menuId,
|
|
"mount-menu-on-body": "",
|
|
"show-ticks": "right",
|
|
onChosen: _cache[3] || (_cache[3] = ({ item: actionItem }) => $setup.onActionChosen(actionItem)),
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:25:9"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_FormButton, {
|
|
name: "viewActions",
|
|
size: "sm",
|
|
color: "subtle",
|
|
"icon-left": $setup.Ellipsis,
|
|
"hide-text": "",
|
|
onClick: _cache[1] || (_cache[1] = ($event) => $setup.showMenu = !$setup.showMenu),
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:34:11"
|
|
}, null, 8, ["icon-left"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["open", "items", "menu-id"])) : _createCommentVNode("v-if", true),
|
|
!$setup.isUngroupedGroup ? _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createVNode(_component_FormButton, {
|
|
size: "sm",
|
|
color: "subtle",
|
|
"icon-left": $setup.Play,
|
|
"hide-text": "",
|
|
name: "presentGroup",
|
|
onClick: $setup.onPresentGroup,
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:44:11"
|
|
}, null, 8, ["icon-left"])
|
|
])), [
|
|
[_directive_tippy, $setup.getTooltipProps("Present")]
|
|
]) : _createCommentVNode("v-if", true),
|
|
_withDirectives((_openBlock(), _createElementBlock("div", _hoisted_2, [
|
|
_withDirectives(_createVNode(_component_FormButton, {
|
|
size: "sm",
|
|
color: "subtle",
|
|
"icon-left": $setup.Plus,
|
|
"hide-text": "",
|
|
name: "addGroupView",
|
|
disabled: !$setup.canCreateView.authorized || $setup.isLoading,
|
|
onClick: $setup.onAddGroupView,
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:54:11"
|
|
}, null, 8, ["icon-left", "disabled"]), [
|
|
[_directive_tippy, $setup.getTooltipProps("Create view")]
|
|
])
|
|
])), [
|
|
[_directive_tippy, $setup.canCreateView?.errorMessage]
|
|
])
|
|
],
|
|
2
|
|
/* CLASS */
|
|
),
|
|
_createVNode(_component_PresentationShareDialog, {
|
|
open: $setup.showShareDialog,
|
|
"onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showShareDialog = $event),
|
|
"project-id": $props.project.id,
|
|
"presentation-id": $props.group.id,
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:67:7"
|
|
}, null, 8, ["open", "project-id", "presentation-id"])
|
|
]),
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_ViewerSavedViewsPanelViewsGroupInner, {
|
|
group: $props.group,
|
|
search: $props.search,
|
|
"views-type": $props.viewsType,
|
|
onViewCountUpdated: _cache[0] || (_cache[0] = (count) => $setup.viewCount = count),
|
|
"data-v-inspector": "components/viewer/saved-views/panel/views/Group.vue:13:5"
|
|
}, null, 8, ["group", "search", "views-type"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 16, ["open", "edit-title", "title", "class"]);
|
|
}
|
|
_sfc_main.__hmrId = "a6d80b0a";
|
|
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/saved-views/panel/views/Group.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkVBLFNBQVMsWUFBWSwyQkFBa0Q7QUFFdkUsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxVQUFVLE1BQU0sWUFBWTtBQUNyQyxTQUFTLGVBQWU7QUFPeEIsU0FBUyw2QkFBNkI7QUFDdEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWxDLFVBQU0sRUFBRSxnQkFBZ0IsSUFBSSxxQkFBcUI7QUFFakQsVUFBTSxZQUFZLFdBQVcsQ0FBQyxVQUFVLFNBQVMsUUFBUSxDQUFDO0FBRzFELFlBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxDQWFQO0FBRUQsWUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBZ0JQO0FBRUQsWUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxDQVlQO0FBRUQsVUFBTSxPQUFPO0FBT2IsVUFBTSxRQUFRO0FBT2QsVUFBTSxPQUFPLFVBQW9CLFNBQUMsTUFBTTtBQUN4QyxVQUFNLFlBQVksSUFBSSxDQUFDO0FBRXZCLFVBQU0sRUFBRSxvQkFBb0IsSUFBSSxlQUFlO0FBQy9DLFVBQU0sWUFBWSxtQkFBbUI7QUFDckMsVUFBTSxhQUFhLG1CQUFtQjtBQUN0QyxVQUFNLGNBQWMsd0JBQXdCO0FBQzVDLFVBQU0sRUFBRSxJQUFJLFNBQVMsZ0JBQWdCLElBQUksNEJBQTRCO0FBQUEsTUFDbkUsT0FBTyxTQUFTLE1BQU0sTUFBTSxLQUFLO0FBQUEsTUFDakMsU0FBUyxNQUFNO0FBRWIsWUFBSSxDQUFDLEtBQUssT0FBTztBQUNmLGVBQUssUUFBUTtBQUFBLFFBQ2Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxhQUFhLFNBQVMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLO0FBQUEsTUFDeEM7QUFBQSxJQUNGLENBQUM7QUFDRCxVQUFNLFNBQVMsTUFBTTtBQUVyQixVQUFNLGFBQWEsVUFBb0IsU0FBQyxZQUFZO0FBRXBELFVBQU0sV0FBVyxJQUFJLEtBQUs7QUFDMUIsVUFBTSxrQkFBa0IsSUFBSSxLQUFLO0FBRWpDLFVBQU0sbUJBQW1CLFNBQVMsTUFBTSxNQUFNLE1BQU0scUJBQXFCO0FBQ3pFLFVBQU0sWUFBWSxTQUFTLE1BQU0sTUFBTSxNQUFNLFlBQVksU0FBUztBQUNsRSxVQUFNLGdCQUFnQixTQUFTLE1BQU0sTUFBTSxRQUFRLFlBQVksa0JBQWtCO0FBRWpGLFVBQU0sWUFBWSxTQUFTLE1BQXFDO0FBQzlELFlBQU0sUUFBdUMsQ0FBQztBQUU5QyxZQUFNLEtBQUs7QUFBQSxRQUNUO0FBQUEsVUFDRSxJQUFJLFVBQVU7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLFVBQVUsQ0FBQyxVQUFVLE9BQU8sY0FBYyxVQUFVO0FBQUEsVUFDcEQsaUJBQWlCLFVBQVUsTUFBTTtBQUFBLFFBQ25DO0FBQUEsUUFDQTtBQUFBLFVBQ0UsSUFBSSxVQUFVO0FBQUEsVUFDZCxPQUFPO0FBQUEsVUFDUCxVQUFVLFVBQVU7QUFBQSxVQUNwQixpQkFBaUIsVUFBVSxNQUFNO0FBQUEsUUFDbkM7QUFBQSxRQUNBO0FBQUEsVUFDRSxJQUFJLFVBQVU7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLFVBQVUsQ0FBQyxVQUFVLE9BQU8sY0FBYyxVQUFVO0FBQUEsVUFDcEQsaUJBQWlCLFVBQVUsTUFBTTtBQUFBLFFBQ25DO0FBQUEsTUFDRixDQUFDO0FBRUQsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUVELFVBQU0saUJBQWlCLE9BQU8sU0FBb0M7QUFDaEUsY0FBUSxLQUFLLElBQUk7QUFBQSxRQUNmLEtBQUssVUFBVTtBQUNiLGVBQUssZ0JBQWdCLE1BQU0sS0FBSztBQUNoQztBQUFBLFFBQ0YsS0FBSyxVQUFVO0FBQ2IsZUFBSyxnQkFBZ0IsTUFBTSxLQUFLO0FBQ2hDO0FBQUEsUUFDRixLQUFLLFVBQVU7QUFDYiwwQkFBZ0IsUUFBUTtBQUN4QjtBQUFBLFFBQ0Y7QUFDRSw4QkFBb0IsS0FBSyxFQUFFO0FBQUEsTUFDL0I7QUFBQSxJQUNGO0FBRUEsVUFBTSxpQkFBaUIsTUFBTTtBQUMzQixhQUFPLEtBQUssa0JBQWtCLE1BQU0sUUFBUSxJQUFJLE1BQU0sTUFBTSxFQUFFLEdBQUcsUUFBUTtBQUFBLElBQzNFO0FBRUEsVUFBTSxpQkFBaUIsWUFBWTtBQUNqQyxZQUFNLFdBQVc7QUFBQSxRQUNmLFNBQVMsTUFBTSxNQUFNO0FBQUEsTUFDdkIsQ0FBQztBQUNELFdBQUssUUFBUTtBQUFBLElBQ2Y7QUFFQSxVQUFNLFdBQVcsT0FBTyxZQUFvQjtBQUMxQyxVQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssUUFBUSxTQUFTLEtBQUs7QUFDM0MsNEJBQW9CO0FBQUEsVUFDbEIsTUFBTSxzQkFBc0I7QUFBQSxVQUM1QixPQUFPO0FBQUEsUUFDVCxDQUFDO0FBQ0QsbUJBQVcsUUFBUTtBQUNuQjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLE1BQU0sTUFBTSxVQUFVLFNBQVM7QUFDakMsbUJBQVcsUUFBUTtBQUNuQjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLE1BQU0sTUFBTSxZQUFZO0FBQUEsUUFDNUIsT0FBTyxNQUFNO0FBQUEsUUFDYixRQUFRO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksS0FBSyxJQUFJO0FBQ1gsbUJBQVcsUUFBUTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjs7Ozs7Ozs7Ozs7Ozs7O0VBbE8yRSxvQkFBaUI7O3FCQVV6QyxvQkFBaUIsMkRBQTBEOzs7Ozs7Ozt1QkFsRDVILGFBc0VtQiw2QkF0RW5CLFlBc0VtQjtBQUFBLElBckVULE1BQU07QUFBQSx5RUFBSTtBQUFBLElBQ1YsY0FBWTtBQUFBLG9GQUFVO0FBQUEsSUFDOUIsT0FBTTtBQUFBLElBQ0wsT0FBTyxhQUFNO0FBQUEsSUFDZDtBQUFBLElBQ0MsT0FBTztBQUFBLElBQ1Asa0JBQWM7QUFBQSxLQUNmLFlBQVMsT0FBSCxFQUFFLEtBQUUsb0JBQWlCLDBEQUF5RDtBQUFBLElBUXpFLGlCQUFhLFNBQ3RCLE1BNkNNO0FBQUEsTUE3Q047QUFBQSxRQTZDTTtBQUFBO0FBQUEsVUE1Q0osT0FBSyxpQkFBQyxtRUFBaUUsbUJBQzVDLGdCQUFRO0FBQUEsVUFDbEMsU0FBSyx5Q0FBTjtBQUFBLGFBQVc7QUFBQSxVQUFDLG9CQUFpQjtBQUFBOztXQUdwQix5Q0FEVCxhQWlCYTtBQUFBO1lBZkgsTUFBTTtBQUFBLHFGQUFRO0FBQUEsWUFDckIsT0FBTztBQUFBLFlBQ1AsV0FBUztBQUFBLFlBQ1Y7QUFBQSxZQUNBLGNBQVc7QUFBQSxZQUNWLFVBQU0sbUNBQVcsV0FBVSxNQUFPLHNCQUFlLFVBQVU7QUFBQSxZQUFHLG9CQUFpQjtBQUFBOzhCQUVoRixNQU9FO0FBQUEsY0FQRixhQU9FO0FBQUEsZ0JBTkEsTUFBSztBQUFBLGdCQUNMLE1BQUs7QUFBQSxnQkFDTCxPQUFNO0FBQUEsZ0JBQ0wsYUFBVztBQUFBLGdCQUNaO0FBQUEsZ0JBQ0MsU0FBSyxzQ0FBRSxrQkFBUSxDQUFJO0FBQUEsZ0JBQVUsb0JBQWlCO0FBQUE7Ozs7O1dBR3ZDLHlEQUFaLG9CQVNNLE9BVE4sWUFTTTtBQUFBLFlBUkosYUFPRTtBQUFBLGNBTkEsTUFBSztBQUFBLGNBQ0wsT0FBTTtBQUFBLGNBQ0wsYUFBVztBQUFBLGNBQ1o7QUFBQSxjQUNBLE1BQUs7QUFBQSxjQUNKLFNBQU87QUFBQSxjQUFnQixvQkFBaUI7QUFBQTs7K0JBUE4sdUJBQWU7QUFBQTt5Q0FVdEQsb0JBV00sT0FYTixZQVdNO0FBQUEsNEJBVkosYUFTRTtBQUFBLGNBUEEsTUFBSztBQUFBLGNBQ0wsT0FBTTtBQUFBLGNBQ0wsYUFBVztBQUFBLGNBQ1o7QUFBQSxjQUNBLE1BQUs7QUFBQSxjQUNKLFVBQVEsQ0FBRyxxQkFBYyxjQUFjO0FBQUEsY0FDdkMsU0FBTztBQUFBLGNBQWdCLG9CQUFpQjtBQUFBO2lDQVBoQyx1QkFBZTtBQUFBOzsrQkFGZCxzQkFBZSxZQUFZO0FBQUE7Ozs7O01BYzNDLGFBSUU7QUFBQSxRQUhRLE1BQU07QUFBQSx3RkFBZTtBQUFBLFFBQzVCLGNBQVksZUFBUTtBQUFBLFFBQ3BCLG1CQUFpQixhQUFNO0FBQUEsUUFBSSxvQkFBaUI7QUFBQTs7c0JBekRqRCxNQUtFO0FBQUEsTUFMRixhQUtFO0FBQUEsUUFKQyxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixjQUFZO0FBQUEsUUFDWixvQkFBa0IsMkJBQUcsVUFBVyxtQkFBWTtBQUFBLFFBQVEsb0JBQWlCO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIkdyb3VwLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPExheW91dERpc2Nsb3N1cmVcclxuICAgIHYtbW9kZWw6b3Blbj1cIm9wZW5cIlxyXG4gICAgdi1tb2RlbDplZGl0LXRpdGxlPVwicmVuYW1lTW9kZVwiXHJcbiAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICA6dGl0bGU9XCJncm91cC50aXRsZVwiXHJcbiAgICBsYXp5LWxvYWRcclxuICAgIDpjbGFzcz1cImRyb3Bab25lQ2xhc3Nlc1wiXHJcbiAgICBAdXBkYXRlOnRpdGxlPVwib25SZW5hbWVcIlxyXG4gICAgdi1vbj1cIm9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL3ZpZXdzL0dyb3VwLnZ1ZTozOjNcIlxyXG4gID5cclxuICAgIDxWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3c0dyb3VwSW5uZXJcclxuICAgICAgOmdyb3VwPVwiZ3JvdXBcIlxyXG4gICAgICA6c2VhcmNoPVwic2VhcmNoXCJcclxuICAgICAgOnZpZXdzLXR5cGU9XCJ2aWV3c1R5cGVcIlxyXG4gICAgICBAdmlldy1jb3VudC11cGRhdGVkPVwiKGNvdW50KSA9PiAodmlld0NvdW50ID0gY291bnQpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL3ZpZXdzL0dyb3VwLnZ1ZToxMzo1XCJcclxuICAgIC8+XHJcbiAgICA8dGVtcGxhdGUgI3RpdGxlLWFjdGlvbnM+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZsZXggZ2FwLTAuNSBpdGVtcy1jZW50ZXIgbGc6Z3JvdXAtaG92ZXIvZGlzY2xvc3VyZTpvcGFjaXR5LTEwMFwiXHJcbiAgICAgICAgOmNsYXNzPVwieyAnbGc6b3BhY2l0eS0wJzogIXNob3dNZW51IH1cIlxyXG4gICAgICAgIEBjbGljay5zdG9wIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC92aWV3cy9Hcm91cC52dWU6MjA6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8TGF5b3V0TWVudVxyXG4gICAgICAgICAgdi1pZj1cIiFpc1VuZ3JvdXBlZEdyb3VwXCJcclxuICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNZW51XCJcclxuICAgICAgICAgIDppdGVtcz1cIm1lbnVJdGVtc1wiXHJcbiAgICAgICAgICA6bWVudS1pZD1cIm1lbnVJZFwiXHJcbiAgICAgICAgICBtb3VudC1tZW51LW9uLWJvZHlcclxuICAgICAgICAgIHNob3ctdGlja3M9XCJyaWdodFwiXHJcbiAgICAgICAgICBAY2hvc2VuPVwiKHsgaXRlbTogYWN0aW9uSXRlbSB9KSA9PiBvbkFjdGlvbkNob3NlbihhY3Rpb25JdGVtKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC92aWV3cy9Hcm91cC52dWU6MjU6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgbmFtZT1cInZpZXdBY3Rpb25zXCJcclxuICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgICAgQGNsaWNrPVwic2hvd01lbnUgPSAhc2hvd01lbnVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvdmlld3MvR3JvdXAudnVlOjM0OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgIDxkaXYgdi1pZj1cIiFpc1VuZ3JvdXBlZEdyb3VwXCIgdi10aXBweT1cImdldFRvb2x0aXBQcm9wcygnUHJlc2VudCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL3ZpZXdzL0dyb3VwLnZ1ZTo0Mzo5XCI+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgIDppY29uLWxlZnQ9XCJQbGF5XCJcclxuICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgIG5hbWU9XCJwcmVzZW50R3JvdXBcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJvblByZXNlbnRHcm91cFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC92aWV3cy9Hcm91cC52dWU6NDQ6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IHYtdGlwcHk9XCJjYW5DcmVhdGVWaWV3Py5lcnJvck1lc3NhZ2VcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvdmlld3MvR3JvdXAudnVlOjUzOjlcIj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJnZXRUb29sdGlwUHJvcHMoJ0NyZWF0ZSB2aWV3JylcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgIDppY29uLWxlZnQ9XCJQbHVzXCJcclxuICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgIG5hbWU9XCJhZGRHcm91cFZpZXdcIlxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCIhY2FuQ3JlYXRlVmlldy5hdXRob3JpemVkIHx8IGlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgIEBjbGljaz1cIm9uQWRkR3JvdXBWaWV3XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL3ZpZXdzL0dyb3VwLnZ1ZTo1NDoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxQcmVzZW50YXRpb25TaGFyZURpYWxvZ1xyXG4gICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dTaGFyZURpYWxvZ1wiXHJcbiAgICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgICA6cHJlc2VudGF0aW9uLWlkPVwiZ3JvdXAuaWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvdmlld3MvR3JvdXAudnVlOjY3OjdcIlxyXG4gICAgICAvPlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICA8L0xheW91dERpc2Nsb3N1cmU+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IFN0cmluZ0VudW0sIHRocm93VW5jb3ZlcmVkRXJyb3IsIHR5cGUgU3RyaW5nRW51bVZhbHVlcyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IHVzZU11dGF0aW9uTG9hZGluZyB9IGZyb20gJ0B2dWUvYXBvbGxvLWNvbXBvc2FibGUnXHJcbmltcG9ydCB7IEVsbGlwc2lzLCBQbHVzLCBQbGF5IH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB0eXBlIHtcclxuICBVc2VVcGRhdGVTYXZlZFZpZXdHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50LFxyXG4gIFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBfUHJvamVjdEZyYWdtZW50LFxyXG4gIFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBfU2F2ZWRWaWV3R3JvdXBGcmFnbWVudCxcclxuICBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3c0dyb3VwRGVsZXRlRGlhbG9nX1NhdmVkVmlld0dyb3VwRnJhZ21lbnRcclxufSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvdG9hc3QnXHJcbmltcG9ydCB7XHJcbiAgdXNlQ3JlYXRlU2F2ZWRWaWV3LFxyXG4gIHVzZVVwZGF0ZVNhdmVkVmlld0dyb3VwXHJcbn0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NhdmVkVmlld3MvbWFuYWdlbWVudCdcclxuaW1wb3J0IHR5cGUgeyBWaWV3c1R5cGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zYXZlZFZpZXdzJ1xyXG5pbXBvcnQgeyB1c2VEcmFnZ2FibGVWaWV3VGFyZ2V0R3JvdXAgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2F2ZWRWaWV3cy91aSdcclxuaW1wb3J0IHsgcHJlc2VudGF0aW9uUm91dGUgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuXHJcbmNvbnN0IHsgZ2V0VG9vbHRpcFByb3BzIH0gPSB1c2VTbWFydFRvb2x0aXBEZWxheSgpXHJcblxyXG5jb25zdCBNZW51SXRlbXMgPSBTdHJpbmdFbnVtKFsnRGVsZXRlJywgJ1NoYXJlJywgJ1JlbmFtZSddKVxyXG50eXBlIE1lbnVJdGVtcyA9IFN0cmluZ0VudW1WYWx1ZXM8dHlwZW9mIE1lbnVJdGVtcz5cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBfUHJvamVjdCBvbiBQcm9qZWN0IHtcclxuICAgIGlkXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhbkNyZWF0ZVNhdmVkVmlldyB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB3b3Jrc3BhY2Uge1xyXG4gICAgICBpZFxyXG4gICAgICBoYXNBY2Nlc3NUb0ZlYXR1cmUoZmVhdHVyZU5hbWU6IHByZXNlbnRhdGlvbnMpXHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cF9TYXZlZFZpZXdHcm91cCBvbiBTYXZlZFZpZXdHcm91cCB7XHJcbiAgICBpZFxyXG4gICAgaXNVbmdyb3VwZWRWaWV3c0dyb3VwXHJcbiAgICByZXNvdXJjZUlkc1xyXG4gICAgdGl0bGVcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuVXBkYXRlIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBJbm5lcl9TYXZlZFZpZXdHcm91cFxyXG4gICAgLi4uVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cERlbGV0ZURpYWxvZ19TYXZlZFZpZXdHcm91cFxyXG4gICAgLi4uVXNlVXBkYXRlU2F2ZWRWaWV3R3JvdXBfU2F2ZWRWaWV3R3JvdXBcclxuICAgIC4uLlVzZURyYWdnYWJsZVZpZXdUYXJnZXRHcm91cF9TYXZlZFZpZXdHcm91cFxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBfU2F2ZWRWaWV3R3JvdXBfUGFnaW5hdGVkIG9uIFNhdmVkVmlld0dyb3VwIHtcclxuICAgIGlkXHJcbiAgICB2aWV3cyhpbnB1dDogJHNhdmVkVmlld3NJbnB1dCkge1xyXG4gICAgICBjdXJzb3JcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgICBpdGVtcyB7XHJcbiAgICAgICAgaWRcclxuICAgICAgICAuLi5WaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3X1NhdmVkVmlld1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAnZGVsZXRlLWdyb3VwJzogW1xyXG4gICAgZ3JvdXA6IFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBEZWxldGVEaWFsb2dfU2F2ZWRWaWV3R3JvdXBGcmFnbWVudFxyXG4gIF1cclxuICAncmVuYW1lLWdyb3VwJzogW2dyb3VwOiBVc2VVcGRhdGVTYXZlZFZpZXdHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50XVxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBwcm9qZWN0OiBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3c0dyb3VwX1Byb2plY3RGcmFnbWVudFxyXG4gIGdyb3VwOiBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3c0dyb3VwX1NhdmVkVmlld0dyb3VwRnJhZ21lbnRcclxuICB2aWV3c1R5cGU6IFZpZXdzVHlwZVxyXG4gIHNlYXJjaD86IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCBvcGVuID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ29wZW4nKVxyXG5jb25zdCB2aWV3Q291bnQgPSByZWYoMClcclxuXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5jb25zdCBpc0xvYWRpbmcgPSB1c2VNdXRhdGlvbkxvYWRpbmcoKVxyXG5jb25zdCBjcmVhdGVWaWV3ID0gdXNlQ3JlYXRlU2F2ZWRWaWV3KClcclxuY29uc3QgdXBkYXRlR3JvdXAgPSB1c2VVcGRhdGVTYXZlZFZpZXdHcm91cCgpXHJcbmNvbnN0IHsgb24sIGNsYXNzZXM6IGRyb3Bab25lQ2xhc3NlcyB9ID0gdXNlRHJhZ2dhYmxlVmlld1RhcmdldEdyb3VwKHtcclxuICBncm91cDogY29tcHV0ZWQoKCkgPT4gcHJvcHMuZ3JvdXApLFxyXG4gIG9uTW92ZWQ6ICgpID0+IHtcclxuICAgIC8vIEF1dG8tb3BlbiB0aGUgZ3JvdXAgaWYgaXQgd2FzIGNsb3NlZFxyXG4gICAgaWYgKCFvcGVuLnZhbHVlKSB7XHJcbiAgICAgIG9wZW4udmFsdWUgPSB0cnVlXHJcbiAgICB9XHJcbiAgfSxcclxuICBpc0dyb3VwT3BlbjogY29tcHV0ZWQoKCkgPT4gISFvcGVuLnZhbHVlKSxcclxuICB2aWV3Q291bnRcclxufSlcclxuY29uc3QgbWVudUlkID0gdXNlSWQoKVxyXG5cclxuY29uc3QgcmVuYW1lTW9kZSA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdyZW5hbWVNb2RlJylcclxuXHJcbmNvbnN0IHNob3dNZW51ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBzaG93U2hhcmVEaWFsb2cgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBpc1VuZ3JvdXBlZEdyb3VwID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMuZ3JvdXAuaXNVbmdyb3VwZWRWaWV3c0dyb3VwKVxyXG5jb25zdCBjYW5VcGRhdGUgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5ncm91cC5wZXJtaXNzaW9ucy5jYW5VcGRhdGUpXHJcbmNvbnN0IGNhbkNyZWF0ZVZpZXcgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5wcm9qZWN0LnBlcm1pc3Npb25zLmNhbkNyZWF0ZVNhdmVkVmlldylcclxuXHJcbmNvbnN0IG1lbnVJdGVtcyA9IGNvbXB1dGVkKCgpOiBMYXlvdXRNZW51SXRlbTxNZW51SXRlbXM+W11bXSA9PiB7XHJcbiAgY29uc3QgaXRlbXM6IExheW91dE1lbnVJdGVtPE1lbnVJdGVtcz5bXVtdID0gW11cclxuXHJcbiAgaXRlbXMucHVzaChbXHJcbiAgICB7XHJcbiAgICAgIGlkOiBNZW51SXRlbXMuUmVuYW1lLFxyXG4gICAgICB0aXRsZTogJ1JlbmFtZSBncm91cCcsXHJcbiAgICAgIGRpc2FibGVkOiAhY2FuVXBkYXRlLnZhbHVlPy5hdXRob3JpemVkIHx8IGlzTG9hZGluZy52YWx1ZSxcclxuICAgICAgZGlzYWJsZWRUb29sdGlwOiBjYW5VcGRhdGUudmFsdWUuZXJyb3JNZXNzYWdlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogTWVudUl0ZW1zLlNoYXJlLFxyXG4gICAgICB0aXRsZTogJ1NoYXJlIHByZXNlbnRhdGlvbi4uLicsXHJcbiAgICAgIGRpc2FibGVkOiBpc0xvYWRpbmcudmFsdWUsXHJcbiAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuVXBkYXRlLnZhbHVlLmVycm9yTWVzc2FnZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaWQ6IE1lbnVJdGVtcy5EZWxldGUsXHJcbiAgICAgIHRpdGxlOiAnRGVsZXRlIGdyb3VwLi4uJyxcclxuICAgICAgZGlzYWJsZWQ6ICFjYW5VcGRhdGUudmFsdWU/LmF1dGhvcml6ZWQgfHwgaXNMb2FkaW5nLnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6IGNhblVwZGF0ZS52YWx1ZS5lcnJvck1lc3NhZ2VcclxuICAgIH1cclxuICBdKVxyXG5cclxuICByZXR1cm4gaXRlbXNcclxufSlcclxuXHJcbmNvbnN0IG9uQWN0aW9uQ2hvc2VuID0gYXN5bmMgKGl0ZW06IExheW91dE1lbnVJdGVtPE1lbnVJdGVtcz4pID0+IHtcclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgTWVudUl0ZW1zLkRlbGV0ZTpcclxuICAgICAgZW1pdCgnZGVsZXRlLWdyb3VwJywgcHJvcHMuZ3JvdXApXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIE1lbnVJdGVtcy5SZW5hbWU6XHJcbiAgICAgIGVtaXQoJ3JlbmFtZS1ncm91cCcsIHByb3BzLmdyb3VwKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBNZW51SXRlbXMuU2hhcmU6XHJcbiAgICAgIHNob3dTaGFyZURpYWxvZy52YWx1ZSA9IHRydWVcclxuICAgICAgYnJlYWtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93VW5jb3ZlcmVkRXJyb3IoaXRlbS5pZClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uUHJlc2VudEdyb3VwID0gKCkgPT4ge1xyXG4gIHdpbmRvdy5vcGVuKHByZXNlbnRhdGlvblJvdXRlKHByb3BzLnByb2plY3QuaWQsIHByb3BzLmdyb3VwLmlkKSwgJ19ibGFuaycpXHJcbn1cclxuXHJcbmNvbnN0IG9uQWRkR3JvdXBWaWV3ID0gYXN5bmMgKCkgPT4ge1xyXG4gIGF3YWl0IGNyZWF0ZVZpZXcoe1xyXG4gICAgZ3JvdXBJZDogcHJvcHMuZ3JvdXAuaWRcclxuICB9KVxyXG4gIG9wZW4udmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbmNvbnN0IG9uUmVuYW1lID0gYXN5bmMgKG5ld05hbWU6IHN0cmluZykgPT4ge1xyXG4gIGlmICghbmV3TmFtZS50cmltKCkgfHwgbmV3TmFtZS5sZW5ndGggPiAyNTUpIHtcclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICB0aXRsZTogJ05hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzIGxvbmcnXHJcbiAgICB9KVxyXG4gICAgcmVuYW1lTW9kZS52YWx1ZSA9IGZhbHNlXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGlmIChwcm9wcy5ncm91cC50aXRsZSA9PT0gbmV3TmFtZSkge1xyXG4gICAgcmVuYW1lTW9kZS52YWx1ZSA9IGZhbHNlXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlcyA9IGF3YWl0IHVwZGF0ZUdyb3VwKHtcclxuICAgIGdyb3VwOiBwcm9wcy5ncm91cCxcclxuICAgIHVwZGF0ZToge1xyXG4gICAgICBuYW1lOiBuZXdOYW1lXHJcbiAgICB9XHJcbiAgfSlcclxuICBpZiAocmVzPy5pZCkge1xyXG4gICAgcmVuYW1lTW9kZS52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvdmlld3MvR3JvdXAudnVlIn0= |