import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/saved-views/panel/Groups.vue");import { CommonLoadingIcon as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/saved-views/panel/views/EmptyState.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/saved-views/panel/views/Group.vue"; import { InfiniteLoading as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/saved-views/panel/view/EditDialog.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/saved-views/panel/view/MoveDialog.vue"; import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/saved-views/panel/view/DeleteDialog.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/saved-views/panel/views/group/DeleteDialog.vue"; import { default as __nuxt_component_8 } from "/_nuxt/components/project/model-page/dialog/embed/Embed.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createElementBlock as __createElementBlock,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 _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 { omit } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { usePaginatedQuery } from "/_nuxt/lib/common/composables/graphql.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { viewsTypeToFilters } from "/_nuxt/lib/viewer/helpers/savedViews.ts"; import { useEventBus } from "/_nuxt/composables/globals.ts"; import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { ViewerEventBusKeys } from "/_nuxt/utils/globals.ts"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerSavedViewsPanelGroups", props: { viewsType: { type: null, required: true }, search: { type: String, required: false } }, setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ViewerSavedViewsPanelGroups_Project on Project { id savedViewGroups(input: $savedViewGroupsInput) { totalCount cursor items { id ...ViewerSavedViewsPanelViewsGroup_SavedViewGroup } } ...ViewerSavedViewsPanelViewsGroup_Project } `); const paginableGroupsQuery = graphql(` query ViewerSavedViewsPanelGroups_SavedViewGroups( $projectId: String! $savedViewGroupsInput: SavedViewGroupsInput! ) { project(id: $projectId) { id ...ViewerSavedViewsPanelGroups_Project } } `); const props = __props; const { projectId, resources: { request: { resourceIdString }, response: { project: mainProject } }, ui: { savedViews: { openedGroupState } } } = useInjectedViewerState(); const eventBus = useEventBus(); const viewBeingEdited = ref(); const viewBeingMoved = ref(); const viewBeingDeleted = ref(); const groupBeingDeleted = ref(); const groupBeingRenamed = ref(); const viewBeingEmbedded = ref(); const { identifier, onInfiniteLoad, query: { result }, isVeryFirstLoading } = usePaginatedQuery({ query: paginableGroupsQuery, baseVariables: computed(() => ({ projectId: projectId.value, savedViewGroupsInput: { resourceIdString: resourceIdString.value, cursor: null, search: props.search?.trim() || null, ...viewsTypeToFilters(props.viewsType) } })), resolveKey: (vars) => ({ projectId: vars.projectId, savedViewGroupsInput: omit(vars.savedViewGroupsInput, ["cursor"]) }), resolveCurrentResult: (res) => res?.project.savedViewGroups, resolveNextPageVariables: (baseVars, cursor) => ({ ...baseVars, savedViewGroupsInput: { ...baseVars.savedViewGroupsInput, cursor } }), resolveCursorFromVariables: (vars) => vars.savedViewGroupsInput.cursor }); const hasGroups = computed( () => (result.value?.project.savedViewGroups.items.length || 0) > 0 ); const isSearch = computed(() => (props.search || "").trim().length > 0); const emptyStateType = computed(() => isSearch.value ? "search" : "base"); const project = computed(() => result.value?.project); const groups = computed(() => project.value?.savedViewGroups.items || []); const showEditDialog = computed({ get: () => !!viewBeingEdited.value, set: (value) => { if (!value) { viewBeingEdited.value = void 0; } } }); const showMoveDialog = computed({ get: () => !!viewBeingMoved.value, set: (value) => { if (!value) { viewBeingMoved.value = void 0; } } }); const showDeleteDialog = computed({ get: () => !!viewBeingDeleted.value, set: (value) => { if (!value) { viewBeingDeleted.value = void 0; } } }); const showGroupDeleteDialog = computed({ get: () => !!groupBeingDeleted.value, set: (value) => { if (!value) { groupBeingDeleted.value = void 0; } } }); const showViewEmbedDialog = computed({ get: () => !!viewBeingEmbedded.value, set: (value) => { if (!value) { viewBeingEmbedded.value = void 0; } } }); const isGroupInRenameMode = (group) => { return group.id === groupBeingRenamed.value?.id; }; const isGroupSelected = (group) => { return openedGroupState.value.get(group.id); }; const onIsSelectedChange = (value, group) => { if (value) { openedGroupState.value.set(group.id, true); } else { openedGroupState.value.delete(group.id); } }; watch( groups, (newGroups) => { if (newGroups.length) { const selectableGroupId = newGroups[0].id; if (selectableGroupId) { openedGroupState.value.set(selectableGroupId, true); } } }, { immediate: true } ); eventBus.on(ViewerEventBusKeys.MarkSavedViewForEdit, ({ type, view }) => { if (type === "edit") { viewBeingEdited.value = view; } else if (type === "move") { viewBeingMoved.value = view; } else if (type === "delete") { viewBeingDeleted.value = view; } }); eventBus.on(ViewerEventBusKeys.MarkSavedViewForEmbed, ({ view }) => { viewBeingEmbedded.value = view; }); const onMoveSuccess = (groupId) => { openedGroupState.value.set(groupId, true); }; const __returned__ = { paginableGroupsQuery, props, projectId, resourceIdString, mainProject, openedGroupState, eventBus, viewBeingEdited, viewBeingMoved, viewBeingDeleted, groupBeingDeleted, groupBeingRenamed, viewBeingEmbedded, identifier, onInfiniteLoad, result, isVeryFirstLoading, hasGroups, isSearch, emptyStateType, project, groups, showEditDialog, showMoveDialog, showDeleteDialog, showGroupDeleteDialog, showViewEmbedDialog, isGroupInRenameMode, isGroupSelected, onIsSelectedChange, onMoveSuccess }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { key: 0, class: "flex justify-center", "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:2:3" }; const _hoisted_2 = { key: 1, class: "", "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:5:3" }; const _hoisted_3 = { key: 1, class: "p-2 pt-2", "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:10:5" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_CommonLoadingIcon = __nuxt_component_0; const _component_ViewerSavedViewsPanelViewsEmptyState = __nuxt_component_1; const _component_ViewerSavedViewsPanelViewsGroup = __nuxt_component_2; const _component_InfiniteLoading = __nuxt_component_3; const _component_ViewerSavedViewsPanelViewEditDialog = __nuxt_component_4; const _component_ViewerSavedViewsPanelViewMoveDialog = __nuxt_component_5; const _component_ViewerSavedViewsPanelViewDeleteDialog = __nuxt_component_6; const _component_ViewerSavedViewsPanelViewsGroupDeleteDialog = __nuxt_component_7; const _component_ProjectModelPageDialogEmbed = __nuxt_component_8; return $setup.isVeryFirstLoading ? (_openBlock(), _createElementBlock("div", _hoisted_1, [ _createVNode(_component_CommonLoadingIcon, { class: "m-16", "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:3:5" }) ])) : (_openBlock(), _createElementBlock("div", _hoisted_2, [ !$setup.hasGroups || !$setup.project ? (_openBlock(), _createBlock(_component_ViewerSavedViewsPanelViewsEmptyState, { key: 0, type: $setup.emptyStateType, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:6:5" }, null, 8, ["type"])) : (_openBlock(), _createElementBlock("div", _hoisted_3, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.groups, (group) => { return _openBlock(), _createBlock(_component_ViewerSavedViewsPanelViewsGroup, { key: group.id, "views-type": $props.viewsType, group, project: $setup.project, search: $props.search, open: $setup.isGroupSelected(group), "rename-mode": $setup.isGroupInRenameMode(group), "onUpdate:open": (value) => $setup.onIsSelectedChange(value, group), "onUpdate:renameMode": (value) => $setup.groupBeingRenamed = value ? group : void 0, onDeleteGroup: _cache[0] || (_cache[0] = ($event) => $setup.groupBeingDeleted = $event), onRenameGroup: _cache[1] || (_cache[1] = ($event) => $setup.groupBeingRenamed = $event), "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:11:7" }, null, 8, ["views-type", "group", "project", "search", "open", "rename-mode", "onUpdate:open", "onUpdate:renameMode"]); }), 128 /* KEYED_FRAGMENT */ )), $setup.groups.length ? (_openBlock(), _createBlock(_component_InfiniteLoading, { key: 0, settings: { identifier: $setup.identifier }, "hide-when-complete": "", onInfinite: $setup.onInfiniteLoad, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:25:7" }, null, 8, ["settings", "onInfinite"])) : _createCommentVNode("v-if", true) ])), _createVNode(_component_ViewerSavedViewsPanelViewEditDialog, { open: $setup.showEditDialog, "onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showEditDialog = $event), view: $setup.viewBeingEdited, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:32:5" }, null, 8, ["open", "view"]), _createVNode(_component_ViewerSavedViewsPanelViewMoveDialog, { open: $setup.showMoveDialog, "onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showMoveDialog = $event), view: $setup.viewBeingMoved, onSuccess: $setup.onMoveSuccess, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:36:5" }, null, 8, ["open", "view"]), _createVNode(_component_ViewerSavedViewsPanelViewDeleteDialog, { open: $setup.showDeleteDialog, "onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showDeleteDialog = $event), view: $setup.viewBeingDeleted, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:41:5" }, null, 8, ["open", "view"]), _createVNode(_component_ViewerSavedViewsPanelViewsGroupDeleteDialog, { open: $setup.showGroupDeleteDialog, "onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showGroupDeleteDialog = $event), group: $setup.groupBeingDeleted, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:45:5" }, null, 8, ["open", "group"]), $setup.mainProject ? (_openBlock(), _createBlock(_component_ProjectModelPageDialogEmbed, { key: 2, open: $setup.showViewEmbedDialog, "onUpdate:open": _cache[6] || (_cache[6] = ($event) => $setup.showViewEmbedDialog = $event), view: $setup.viewBeingEmbedded, project: $setup.mainProject, "data-v-inspector": "components/viewer/saved-views/panel/Groups.vue:49:5" }, null, 8, ["open", "view", "project"])) : _createCommentVNode("v-if", true) ])); } _sfc_main.__hmrId = "05d4a7d6"; 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/Groups.vue"]]); //# sourceMappingURL=data:application/json;base64,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dXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IHYtaWY9XCJpc1ZlcnlGaXJzdExvYWRpbmdcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvR3JvdXBzLnZ1ZToyOjNcIj5cclxuICAgIDxDb21tb25Mb2FkaW5nSWNvbiBjbGFzcz1cIm0tMTZcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvR3JvdXBzLnZ1ZTozOjVcIiAvPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgdi1lbHNlIGNsYXNzPVwiXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL0dyb3Vwcy52dWU6NTozXCI+XHJcbiAgICA8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NFbXB0eVN0YXRlXHJcbiAgICAgIHYtaWY9XCIhaGFzR3JvdXBzIHx8ICFwcm9qZWN0XCJcclxuICAgICAgOnR5cGU9XCJlbXB0eVN0YXRlVHlwZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjY6NVwiXHJcbiAgICAvPlxyXG4gICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJwLTIgcHQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjEwOjVcIj5cclxuICAgICAgPFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBcclxuICAgICAgICB2LWZvcj1cImdyb3VwIGluIGdyb3Vwc1wiXHJcbiAgICAgICAgOmtleT1cImdyb3VwLmlkXCJcclxuICAgICAgICA6dmlld3MtdHlwZT1cInZpZXdzVHlwZVwiXHJcbiAgICAgICAgOmdyb3VwPVwiZ3JvdXBcIlxyXG4gICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgICAgOnNlYXJjaD1cInNlYXJjaFwiXHJcbiAgICAgICAgOm9wZW49XCJpc0dyb3VwU2VsZWN0ZWQoZ3JvdXApXCJcclxuICAgICAgICA6cmVuYW1lLW1vZGU9XCJpc0dyb3VwSW5SZW5hbWVNb2RlKGdyb3VwKVwiXHJcbiAgICAgICAgQHVwZGF0ZTpvcGVuPVwiKHZhbHVlKSA9PiBvbklzU2VsZWN0ZWRDaGFuZ2UodmFsdWUsIGdyb3VwKVwiXHJcbiAgICAgICAgQHVwZGF0ZTpyZW5hbWUtbW9kZT1cIih2YWx1ZSkgPT4gKGdyb3VwQmVpbmdSZW5hbWVkID0gdmFsdWUgPyBncm91cCA6IHVuZGVmaW5lZClcIlxyXG4gICAgICAgIEBkZWxldGUtZ3JvdXA9XCIoJGV2ZW50KSA9PiAoZ3JvdXBCZWluZ0RlbGV0ZWQgPSAkZXZlbnQpXCJcclxuICAgICAgICBAcmVuYW1lLWdyb3VwPVwiKCRldmVudCkgPT4gKGdyb3VwQmVpbmdSZW5hbWVkID0gJGV2ZW50KVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjExOjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgdi1pZj1cImdyb3Vwcy5sZW5ndGhcIlxyXG4gICAgICAgIDpzZXR0aW5ncz1cInsgaWRlbnRpZmllciB9XCJcclxuICAgICAgICBoaWRlLXdoZW4tY29tcGxldGVcclxuICAgICAgICBAaW5maW5pdGU9XCJvbkluZmluaXRlTG9hZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjI1OjdcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld0VkaXREaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0VkaXREaWFsb2dcIlxyXG4gICAgICA6dmlldz1cInZpZXdCZWluZ0VkaXRlZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjMyOjVcIlxyXG4gICAgLz5cclxuICAgIDxWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3TW92ZURpYWxvZ1xyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93TW92ZURpYWxvZ1wiXHJcbiAgICAgIDp2aWV3PVwidmlld0JlaW5nTW92ZWRcIlxyXG4gICAgICBAc3VjY2Vzcz1cIm9uTW92ZVN1Y2Nlc3NcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvR3JvdXBzLnZ1ZTozNjo1XCJcclxuICAgIC8+XHJcbiAgICA8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld0RlbGV0ZURpYWxvZ1xyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93RGVsZXRlRGlhbG9nXCJcclxuICAgICAgOnZpZXc9XCJ2aWV3QmVpbmdEZWxldGVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL3BhbmVsL0dyb3Vwcy52dWU6NDE6NVwiXHJcbiAgICAvPlxyXG4gICAgPFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBEZWxldGVEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0dyb3VwRGVsZXRlRGlhbG9nXCJcclxuICAgICAgOmdyb3VwPVwiZ3JvdXBCZWluZ0RlbGV0ZWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvR3JvdXBzLnZ1ZTo0NTo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdE1vZGVsUGFnZURpYWxvZ0VtYmVkXHJcbiAgICAgIHYtaWY9XCJtYWluUHJvamVjdFwiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dWaWV3RW1iZWREaWFsb2dcIlxyXG4gICAgICA6dmlldz1cInZpZXdCZWluZ0VtYmVkZGVkXCJcclxuICAgICAgOnByb2plY3Q9XCJtYWluUHJvamVjdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9wYW5lbC9Hcm91cHMudnVlOjQ5OjVcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaC1lcydcclxuaW1wb3J0IHsgdXNlUGFnaW5hdGVkUXVlcnkgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvZ3JhcGhxbCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRm9ybVNlbGVjdFNhdmVkVmlld19TYXZlZFZpZXdGcmFnbWVudCxcclxuICBVc2VVcGRhdGVTYXZlZFZpZXdHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50LFxyXG4gIFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdEZWxldGVEaWFsb2dfU2F2ZWRWaWV3RnJhZ21lbnQsXHJcbiAgVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld0VkaXREaWFsb2dfU2F2ZWRWaWV3RnJhZ21lbnQsXHJcbiAgVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld01vdmVEaWFsb2dfU2F2ZWRWaWV3RnJhZ21lbnQsXHJcbiAgVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50LFxyXG4gIFZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBEZWxldGVEaWFsb2dfU2F2ZWRWaWV3R3JvdXBGcmFnbWVudFxyXG59IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB0eXBlIHsgVmlld3NUeXBlIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2F2ZWRWaWV3cydcclxuaW1wb3J0IHsgdmlld3NUeXBlVG9GaWx0ZXJzIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2F2ZWRWaWV3cydcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlclNhdmVkVmlld3NQYW5lbEdyb3Vwc19Qcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIHNhdmVkVmlld0dyb3VwcyhpbnB1dDogJHNhdmVkVmlld0dyb3Vwc0lucHV0KSB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgICAgY3Vyc29yXHJcbiAgICAgIGl0ZW1zIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIC4uLlZpZXdlclNhdmVkVmlld3NQYW5lbFZpZXdzR3JvdXBfU2F2ZWRWaWV3R3JvdXBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLi4uVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cF9Qcm9qZWN0XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcGFnaW5hYmxlR3JvdXBzUXVlcnkgPSBncmFwaHFsKGBcclxuICBxdWVyeSBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxHcm91cHNfU2F2ZWRWaWV3R3JvdXBzKFxyXG4gICAgJHByb2plY3RJZDogU3RyaW5nIVxyXG4gICAgJHNhdmVkVmlld0dyb3Vwc0lucHV0OiBTYXZlZFZpZXdHcm91cHNJbnB1dCFcclxuICApIHtcclxuICAgIHByb2plY3QoaWQ6ICRwcm9qZWN0SWQpIHtcclxuICAgICAgaWRcclxuICAgICAgLi4uVmlld2VyU2F2ZWRWaWV3c1BhbmVsR3JvdXBzX1Byb2plY3RcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICB2aWV3c1R5cGU6IFZpZXdzVHlwZVxyXG4gIHNlYXJjaD86IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7XHJcbiAgcHJvamVjdElkLFxyXG4gIHJlc291cmNlczoge1xyXG4gICAgcmVxdWVzdDogeyByZXNvdXJjZUlkU3RyaW5nIH0sXHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0OiBtYWluUHJvamVjdCB9XHJcbiAgfSxcclxuICB1aToge1xyXG4gICAgc2F2ZWRWaWV3czogeyBvcGVuZWRHcm91cFN0YXRlIH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuY29uc3QgZXZlbnRCdXMgPSB1c2VFdmVudEJ1cygpXHJcblxyXG5jb25zdCB2aWV3QmVpbmdFZGl0ZWQgPSByZWY8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld0VkaXREaWFsb2dfU2F2ZWRWaWV3RnJhZ21lbnQ+KClcclxuY29uc3Qgdmlld0JlaW5nTW92ZWQgPSByZWY8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld01vdmVEaWFsb2dfU2F2ZWRWaWV3RnJhZ21lbnQ+KClcclxuY29uc3Qgdmlld0JlaW5nRGVsZXRlZCA9IHJlZjxWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3RGVsZXRlRGlhbG9nX1NhdmVkVmlld0ZyYWdtZW50PigpXHJcbmNvbnN0IGdyb3VwQmVpbmdEZWxldGVkID1cclxuICByZWY8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cERlbGV0ZURpYWxvZ19TYXZlZFZpZXdHcm91cEZyYWdtZW50PigpXHJcbmNvbnN0IGdyb3VwQmVpbmdSZW5hbWVkID0gcmVmPFVzZVVwZGF0ZVNhdmVkVmlld0dyb3VwX1NhdmVkVmlld0dyb3VwRnJhZ21lbnQ+KClcclxuY29uc3Qgdmlld0JlaW5nRW1iZWRkZWQgPSByZWY8Rm9ybVNlbGVjdFNhdmVkVmlld19TYXZlZFZpZXdGcmFnbWVudD4oKVxyXG5cclxuY29uc3Qge1xyXG4gIGlkZW50aWZpZXIsXHJcbiAgb25JbmZpbml0ZUxvYWQsXHJcbiAgcXVlcnk6IHsgcmVzdWx0IH0sXHJcbiAgaXNWZXJ5Rmlyc3RMb2FkaW5nXHJcbn0gPSB1c2VQYWdpbmF0ZWRRdWVyeSh7XHJcbiAgcXVlcnk6IHBhZ2luYWJsZUdyb3Vwc1F1ZXJ5LFxyXG4gIGJhc2VWYXJpYWJsZXM6IGNvbXB1dGVkKCgpID0+ICh7XHJcbiAgICBwcm9qZWN0SWQ6IHByb2plY3RJZC52YWx1ZSxcclxuICAgIHNhdmVkVmlld0dyb3Vwc0lucHV0OiB7XHJcbiAgICAgIHJlc291cmNlSWRTdHJpbmc6IHJlc291cmNlSWRTdHJpbmcudmFsdWUsXHJcbiAgICAgIGN1cnNvcjogbnVsbCBhcyBudWxsIHwgc3RyaW5nLFxyXG4gICAgICBzZWFyY2g6IHByb3BzLnNlYXJjaD8udHJpbSgpIHx8IG51bGwsXHJcbiAgICAgIC4uLnZpZXdzVHlwZVRvRmlsdGVycyhwcm9wcy52aWV3c1R5cGUpXHJcbiAgICB9XHJcbiAgfSkpLFxyXG4gIHJlc29sdmVLZXk6ICh2YXJzKSA9PiAoe1xyXG4gICAgcHJvamVjdElkOiB2YXJzLnByb2plY3RJZCxcclxuICAgIHNhdmVkVmlld0dyb3Vwc0lucHV0OiBvbWl0KHZhcnMuc2F2ZWRWaWV3R3JvdXBzSW5wdXQsIFsnY3Vyc29yJ10pXHJcbiAgfSksXHJcbiAgcmVzb2x2ZUN1cnJlbnRSZXN1bHQ6IChyZXMpID0+IHJlcz8ucHJvamVjdC5zYXZlZFZpZXdHcm91cHMsXHJcbiAgcmVzb2x2ZU5leHRQYWdlVmFyaWFibGVzOiAoYmFzZVZhcnMsIGN1cnNvcikgPT4gKHtcclxuICAgIC4uLmJhc2VWYXJzLFxyXG4gICAgc2F2ZWRWaWV3R3JvdXBzSW5wdXQ6IHtcclxuICAgICAgLi4uYmFzZVZhcnMuc2F2ZWRWaWV3R3JvdXBzSW5wdXQsXHJcbiAgICAgIGN1cnNvclxyXG4gICAgfVxyXG4gIH0pLFxyXG4gIHJlc29sdmVDdXJzb3JGcm9tVmFyaWFibGVzOiAodmFycykgPT4gdmFycy5zYXZlZFZpZXdHcm91cHNJbnB1dC5jdXJzb3JcclxufSlcclxuXHJcbmNvbnN0IGhhc0dyb3VwcyA9IGNvbXB1dGVkKFxyXG4gICgpID0+IChyZXN1bHQudmFsdWU/LnByb2plY3Quc2F2ZWRWaWV3R3JvdXBzLml0ZW1zLmxlbmd0aCB8fCAwKSA+IDBcclxuKVxyXG5jb25zdCBpc1NlYXJjaCA9IGNvbXB1dGVkKCgpID0+IChwcm9wcy5zZWFyY2ggfHwgJycpLnRyaW0oKS5sZW5ndGggPiAwKVxyXG5jb25zdCBlbXB0eVN0YXRlVHlwZSA9IGNvbXB1dGVkKCgpID0+IChpc1NlYXJjaC52YWx1ZSA/ICdzZWFyY2gnIDogJ2Jhc2UnKSlcclxuXHJcbmNvbnN0IHByb2plY3QgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LnByb2plY3QpXHJcbmNvbnN0IGdyb3VwcyA9IGNvbXB1dGVkKCgpID0+IHByb2plY3QudmFsdWU/LnNhdmVkVmlld0dyb3Vwcy5pdGVtcyB8fCBbXSlcclxuXHJcbmNvbnN0IHNob3dFZGl0RGlhbG9nID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gISF2aWV3QmVpbmdFZGl0ZWQudmFsdWUsXHJcbiAgc2V0OiAodmFsdWUpID0+IHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdmlld0JlaW5nRWRpdGVkLnZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2hvd01vdmVEaWFsb2cgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiAhIXZpZXdCZWluZ01vdmVkLnZhbHVlLFxyXG4gIHNldDogKHZhbHVlKSA9PiB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHZpZXdCZWluZ01vdmVkLnZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2hvd0RlbGV0ZURpYWxvZyA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+ICEhdmlld0JlaW5nRGVsZXRlZC52YWx1ZSxcclxuICBzZXQ6ICh2YWx1ZSkgPT4ge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICB2aWV3QmVpbmdEZWxldGVkLnZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2hvd0dyb3VwRGVsZXRlRGlhbG9nID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gISFncm91cEJlaW5nRGVsZXRlZC52YWx1ZSxcclxuICBzZXQ6ICh2YWx1ZSkgPT4ge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICBncm91cEJlaW5nRGVsZXRlZC52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHNob3dWaWV3RW1iZWREaWFsb2cgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiAhIXZpZXdCZWluZ0VtYmVkZGVkLnZhbHVlLFxyXG4gIHNldDogKHZhbHVlKSA9PiB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHZpZXdCZWluZ0VtYmVkZGVkLnZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgaXNHcm91cEluUmVuYW1lTW9kZSA9IChcclxuICBncm91cDogVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50XHJcbikgPT4ge1xyXG4gIHJldHVybiBncm91cC5pZCA9PT0gZ3JvdXBCZWluZ1JlbmFtZWQudmFsdWU/LmlkXHJcbn1cclxuXHJcbmNvbnN0IGlzR3JvdXBTZWxlY3RlZCA9IChcclxuICBncm91cDogVmlld2VyU2F2ZWRWaWV3c1BhbmVsVmlld3NHcm91cF9TYXZlZFZpZXdHcm91cEZyYWdtZW50XHJcbikgPT4ge1xyXG4gIHJldHVybiBvcGVuZWRHcm91cFN0YXRlLnZhbHVlLmdldChncm91cC5pZClcclxufVxyXG5cclxuY29uc3Qgb25Jc1NlbGVjdGVkQ2hhbmdlID0gKFxyXG4gIHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxyXG4gIGdyb3VwOiBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3c0dyb3VwX1NhdmVkVmlld0dyb3VwRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgaWYgKHZhbHVlKSB7XHJcbiAgICBvcGVuZWRHcm91cFN0YXRlLnZhbHVlLnNldChncm91cC5pZCwgdHJ1ZSlcclxuICB9IGVsc2Uge1xyXG4gICAgb3BlbmVkR3JvdXBTdGF0ZS52YWx1ZS5kZWxldGUoZ3JvdXAuaWQpXHJcbiAgfVxyXG59XHJcblxyXG53YXRjaChcclxuICBncm91cHMsXHJcbiAgKG5ld0dyb3VwcykgPT4ge1xyXG4gICAgaWYgKG5ld0dyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgLy8gZmlyc3QgZ3JvdXAgc2hvdWxkIGJlIHNlbGVjdGVkXHJcbiAgICAgIGNvbnN0IHNlbGVjdGFibGVHcm91cElkID0gbmV3R3JvdXBzWzBdLmlkXHJcbiAgICAgIGlmIChzZWxlY3RhYmxlR3JvdXBJZCkge1xyXG4gICAgICAgIG9wZW5lZEdyb3VwU3RhdGUudmFsdWUuc2V0KHNlbGVjdGFibGVHcm91cElkLCB0cnVlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbilcclxuXHJcbmV2ZW50QnVzLm9uKFZpZXdlckV2ZW50QnVzS2V5cy5NYXJrU2F2ZWRWaWV3Rm9yRWRpdCwgKHsgdHlwZSwgdmlldyB9KSA9PiB7XHJcbiAgaWYgKHR5cGUgPT09ICdlZGl0Jykge1xyXG4gICAgdmlld0JlaW5nRWRpdGVkLnZhbHVlID0gdmlld1xyXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdmUnKSB7XHJcbiAgICB2aWV3QmVpbmdNb3ZlZC52YWx1ZSA9IHZpZXdcclxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICB2aWV3QmVpbmdEZWxldGVkLnZhbHVlID0gdmlld1xyXG4gIH1cclxufSlcclxuXHJcbmV2ZW50QnVzLm9uKFZpZXdlckV2ZW50QnVzS2V5cy5NYXJrU2F2ZWRWaWV3Rm9yRW1iZWQsICh7IHZpZXcgfSkgPT4ge1xyXG4gIHZpZXdCZWluZ0VtYmVkZGVkLnZhbHVlID0gdmlld1xyXG59KVxyXG5cclxuY29uc3Qgb25Nb3ZlU3VjY2VzcyA9IChncm91cElkOiBzdHJpbmcpID0+IHtcclxuICBvcGVuZWRHcm91cFN0YXRlLnZhbHVlLnNldChncm91cElkLCB0cnVlKVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvcGFuZWwvR3JvdXBzLnZ1ZSJ9