import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/selection/Sidebar.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/controls/Right.vue"; import { CommonBadge as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/VisibilityButton.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/IsolateButton.vue"; import { FormButton as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutMenu as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/selection/Object.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/Sidebar.vue"; import { default as __nuxt_component_8 } from "/_nuxt/components/viewer/comments/PortalOrDiv.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createBlock as __createBlock,createElementVNode as __createElementVNode,createVNode as __createVNode,createElementBlock as __createElementBlock } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 { onKeyStroke, useBreakpoints } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts"; import { containsAll } from "/_nuxt/lib/common/helpers/utils.ts"; import { useSelectionUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { uniqWith } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useIsSmallerOrEqualThanBreakpoint } from "/_nuxt/composables/browser.ts"; import { modelRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { TailwindBreakpoints } from "/_nuxt/lib/common/helpers/tailwind.ts"; import { Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { useId, ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => { ActionTypes2["OpenInNewTab"] = "open-in-new-tab"; return ActionTypes2; })(ActionTypes || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerSelectionSidebar", setup(__props, { expose: __expose }) { const { projectId, viewer: { metadata: { filteringState } }, ui: { diff, measurement, threads, filters }, urlHashState: { focusedThreadId } } = useInjectedViewerState(); const { objects, clearSelection } = useSelectionUtilities(); const { hideObjects, showObjects, isolateObjects, unIsolateObjects } = useFilterUtilities(); const { isSmallerOrEqualSm } = useIsSmallerOrEqualThanBreakpoint(); const breakpoints = useBreakpoints(TailwindBreakpoints); const isGreaterThanSm = breakpoints.greater("sm"); const menuId = useId(); const mp = useMixpanel(); const { showControls } = useEmbed(); const itemCount = ref(20); const sidebarOpen = ref(false); const sidebarWidth = ref(280); const showSubMenu = ref(false); const objectsUniqueByAppId = computed(() => { if (!diff.enabled.value) return objects.value; return uniqWith(objects.value, (a, b) => { return a.applicationId === b.applicationId; }); }); const shouldRenderSidebar = computed(() => { return (!isSmallerOrEqualSm.value || sidebarOpen.value) && !measurement.enabled.value; }); const objectsLimited = computed(() => { return objectsUniqueByAppId.value.slice(0, itemCount.value); }); const hiddenObjects = computed(() => filteringState.value?.hiddenObjects); const { isolatedObjectsSet } = filters; const allTargetIds = computed(() => { const ids = []; for (const obj of objects.value) { ids.push(...getTargetObjectIds(obj)); } return ids; }); const isHidden = computed(() => { if (!hiddenObjects.value) return false; return containsAll(allTargetIds.value, hiddenObjects.value); }); const isIsolated = computed(() => { if (!isolatedObjectsSet.value) return false; return containsAll(allTargetIds.value, isolatedObjectsSet.value); }); const actionsItems = computed(() => [ [ { title: allTargetIds.value.length > 1 ? "Open objects in new tab" : "Open object in new tab", id: "open-in-new-tab" /* OpenInNewTab */ } ] ]); const selectionLink = computed(() => { return modelRoute(projectId.value, allTargetIds.value.join(",")); }); const onActionChosen = (params) => { const { item } = params; switch (item.id) { case "open-in-new-tab" /* OpenInNewTab */: window.open(selectionLink.value, "_blank"); break; } }; const hideOrShowSelection = () => { if (!isHidden.value) { hideObjects(allTargetIds.value); mp.track("Viewer Action", { type: "action", name: "selection", action: "hide" }); return; } showObjects(allTargetIds.value); mp.track("Viewer Action", { type: "action", name: "selection", action: "show" }); }; const isolateOrUnisolateSelection = () => { if (isIsolated.value) { unIsolateObjects(allTargetIds.value); mp.track("Viewer Action", { type: "action", name: "selection", action: "unisolate" }); } else { isolateObjects(allTargetIds.value); mp.track("Viewer Action", { type: "action", name: "selection", action: "isolate" }); } }; const trackAndClearSelection = () => { clearSelection(); mp.track("Viewer Action", { type: "action", name: "selection", action: "clear", source: "sidebar-x-button" }); }; const onClose = () => { sidebarOpen.value = false; trackAndClearSelection(); }; const forceClose = () => { sidebarOpen.value = false; }; onKeyStroke("Escape", () => { clearSelection(); mp.track("Viewer Action", { type: "action", name: "selection", action: "clear", source: "keypress-escape" }); }); watch( [ () => objects.value.length, () => focusedThreadId.value, () => threads.openThread.newThreadEditor.value, () => isSmallerOrEqualSm.value ], ([objLen, threadId, isNewThreadEditorOpen, isSmSm]) => { if (threadId) { sidebarOpen.value = false; return; } if (isNewThreadEditorOpen && isSmSm) { sidebarOpen.value = false; return; } if (objLen !== 0 && !threadId) { sidebarOpen.value = true; } else if (objLen === 0) { sidebarOpen.value = false; } } ); __expose({ forceClose }); const __returned__ = { ActionTypes, projectId, filteringState, diff, measurement, threads, filters, focusedThreadId, objects, clearSelection, hideObjects, showObjects, isolateObjects, unIsolateObjects, isSmallerOrEqualSm, breakpoints, isGreaterThanSm, menuId, mp, showControls, itemCount, sidebarOpen, sidebarWidth, showSubMenu, objectsUniqueByAppId, shouldRenderSidebar, objectsLimited, hiddenObjects, isolatedObjectsSet, allTargetIds, isHidden, isIsolated, actionsItems, selectionLink, onActionChosen, hideOrShowSelection, isolateOrUnisolateSelection, trackAndClearSelection, onClose, forceClose, get Ellipsis() { return Ellipsis; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, normalizeClass as _normalizeClass, withModifiers as _withModifiers, renderList as _renderList, Fragment as _Fragment, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "flex items-center gap-x-2", "data-v-inspector": "components/viewer/selection/Sidebar.vue:15:9" }; const _hoisted_2 = { class: "flex gap-x-0.5 items-center", "data-v-inspector": "components/viewer/selection/Sidebar.vue:23:9" }; const _hoisted_3 = { class: "space-y-1", "data-v-inspector": "components/viewer/selection/Sidebar.vue:56:7" }; const _hoisted_4 = { key: 0, class: "mb-2", "data-v-inspector": "components/viewer/selection/Sidebar.vue:65:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerControlsRight = __nuxt_component_0; const _component_CommonBadge = __nuxt_component_1; const _component_ViewerVisibilityButton = __nuxt_component_2; const _component_ViewerIsolateButton = __nuxt_component_3; const _component_FormButton = __nuxt_component_4; const _component_LayoutMenu = __nuxt_component_5; const _component_ViewerSelectionObject = __nuxt_component_6; const _component_ViewerSidebar = __nuxt_component_7; const _component_ViewerCommentsPortalOrDiv = __nuxt_component_8; return _openBlock(), _createBlock(_component_ViewerCommentsPortalOrDiv, { class: "relative", to: "bottomPanel", "data-v-inspector": "components/viewer/selection/Sidebar.vue:2:3" }, { default: _withCtx(() => [ $setup.isGreaterThanSm && $setup.showControls ? (_openBlock(), _createBlock(_component_ViewerControlsRight, { key: 0, "sidebar-open": $setup.sidebarOpen && $setup.shouldRenderSidebar, "sidebar-width": $setup.sidebarWidth, "data-v-inspector": "components/viewer/selection/Sidebar.vue:3:5" }, null, 8, ["sidebar-open", "sidebar-width"])) : _createCommentVNode("v-if", true), $setup.shouldRenderSidebar ? (_openBlock(), _createBlock(_component_ViewerSidebar, { key: 1, open: $setup.sidebarOpen, onClose: $setup.onClose, onWidthChange: _cache[4] || (_cache[4] = ($event) => $setup.sidebarWidth = $event), "data-v-inspector": "components/viewer/selection/Sidebar.vue:8:5" }, { title: _withCtx(() => [ _createElementVNode("div", _hoisted_1, [ _cache[5] || (_cache[5] = _createElementVNode( "span", { "data-v-inspector": "components/viewer/selection/Sidebar.vue:16:11" }, "Selected", -1 /* CACHED */ )), $setup.objects.length > 1 ? (_openBlock(), _createBlock(_component_CommonBadge, { key: 0, rounded: "", "data-v-inspector": "components/viewer/selection/Sidebar.vue:17:11" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.objects.length), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true) ]) ]), actions: _withCtx(() => [ _createElementVNode("div", _hoisted_2, [ _createVNode(_component_ViewerVisibilityButton, { "is-hidden": $setup.isHidden, "force-visible": $setup.showSubMenu, onClick: $setup.hideOrShowSelection, "data-v-inspector": "components/viewer/selection/Sidebar.vue:24:11" }, null, 8, ["is-hidden", "force-visible"]), _createVNode(_component_ViewerIsolateButton, { "is-isolated": $setup.isIsolated, "force-visible": $setup.showSubMenu, onClick: $setup.isolateOrUnisolateSelection, "data-v-inspector": "components/viewer/selection/Sidebar.vue:29:11" }, null, 8, ["is-isolated", "force-visible"]), _createVNode(_component_LayoutMenu, { open: $setup.showSubMenu, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showSubMenu = $event), "menu-id": $setup.menuId, items: $setup.actionsItems, "custom-menu-items-classes": ["!w-42"], onClick: _cache[2] || (_cache[2] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/viewer/selection/Sidebar.vue:34:11" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { "hide-text": "", color: "subtle", size: "sm", "icon-left": $setup.Ellipsis, class: _normalizeClass({ "!bg-highlight-3": $setup.showSubMenu }), onClick: _cache[0] || (_cache[0] = ($event) => $setup.showSubMenu = !$setup.showSubMenu), "data-v-inspector": "components/viewer/selection/Sidebar.vue:42:13" }, null, 8, ["icon-left", "class"]) ]), _: 1 /* STABLE */ }, 8, ["open", "menu-id", "items"]) ]) ]), footer: _withCtx(() => [..._cache[6] || (_cache[6] = [ _createElementVNode( "p", { class: "text-foreground-2 text-body-3xs", "data-v-inspector": "components/viewer/selection/Sidebar.vue:72:9" }, ' Hold "shift" to select multiple objects ', -1 /* CACHED */ ) ])]), default: _withCtx(() => [ _createElementVNode("div", _hoisted_3, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.objectsLimited, (object, index) => { return _openBlock(), _createBlock(_component_ViewerSelectionObject, { key: object.id, object, root: true, unfold: index === 0 && !$setup.isSmallerOrEqualSm, "data-v-inspector": "components/viewer/selection/Sidebar.vue:57:9" }, null, 8, ["object", "unfold"]); }), 128 /* KEYED_FRAGMENT */ )) ]), $setup.itemCount <= $setup.objects.length ? (_openBlock(), _createElementBlock("div", _hoisted_4, [ _createVNode(_component_FormButton, { size: "sm", text: "", "full-width": "", onClick: _cache[3] || (_cache[3] = ($event) => $setup.itemCount += 10), "data-v-inspector": "components/viewer/selection/Sidebar.vue:66:9" }, { default: _withCtx(() => [ _createTextVNode( " View more (" + _toDisplayString($setup.objects.length - $setup.itemCount) + ") ", 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }) ])) : _createCommentVNode("v-if", true) ]), _: 1 /* STABLE */ }, 8, ["open"])) : _createCommentVNode("v-if", true) ]), _: 1 /* STABLE */ }); } _sfc_main.__hmrId = "85710cbc"; 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/Sidebar.vue"]]); //# sourceMappingURL=data:application/json;base64,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O2dDQUUxQyxNQVNFO0FBQUEsZ0JBVEYsYUFTRTtBQUFBLGtCQVJBO0FBQUEsa0JBQ0EsT0FBTTtBQUFBLGtCQUNOLE1BQUs7QUFBQSxrQkFDSixhQUFXO0FBQUEsa0JBQ1gsT0FBSztBQUFBLHVDQUF3QztBQUFBO2tCQUc3QyxTQUFLLHNDQUFFLHFCQUFXLENBQUk7QUFBQSxrQkFBYSxvQkFBaUI7QUFBQTs7Ozs7OztRQXFCbEQsUUFBTSxTQUNmLE1BRUk7QUFBQSxVQUZKO0FBQUEsWUFFSTtBQUFBO0FBQUEsY0FGRCxPQUFNO0FBQUEsY0FBa0Msb0JBQWlCO0FBQUE7WUFBK0M7QUFBQSxZQUUzRztBQUFBO0FBQUE7QUFBQTswQkFsQkYsTUFRTTtBQUFBLFVBUk4sb0JBUU0sT0FSTixZQVFNO0FBQUEsK0JBUEo7QUFBQSxjQU1FO0FBQUE7QUFBQSwwQkFMMEIsdUJBQWMsQ0FBaEMsUUFBUSxVQUFLO3FDQUR2QixhQU1FO0FBQUEsa0JBSkMsS0FBTSxPQUFPO0FBQUEsa0JBQ2I7QUFBQSxrQkFDQSxNQUFNO0FBQUEsa0JBQ04sUUFBUSxVQUFLLE1BQVc7QUFBQSxrQkFBb0Isb0JBQWlCO0FBQUE7Ozs7OztVQUd2RCxvQkFBYSxlQUFRLHdCQUFoQyxvQkFJTSxPQUpOLFlBSU07QUFBQSxZQUhKLGFBRWE7QUFBQSxjQUZELE1BQUs7QUFBQSxjQUFLO0FBQUEsY0FBSztBQUFBLGNBQVksU0FBSyxzQ0FBRSxvQkFBUztBQUFBLGNBQVEsb0JBQWlCO0FBQUE7Z0NBQStDLE1BQ2xIO0FBQUE7a0JBRGtILGlCQUNsSCxpQkFBRyxlQUFRLFNBQVMsZ0JBQVMsSUFBRztBQUFBLGtCQUM3QztBQUFBO0FBQUE7QUFBQSIsIm5hbWVzIjpbIkFjdGlvblR5cGVzIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlNpZGViYXIudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8Vmlld2VyQ29tbWVudHNQb3J0YWxPckRpdiBjbGFzcz1cInJlbGF0aXZlXCIgdG89XCJib3R0b21QYW5lbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6MjozXCI+XHJcbiAgICA8Vmlld2VyQ29udHJvbHNSaWdodFxyXG4gICAgICB2LWlmPVwiaXNHcmVhdGVyVGhhblNtICYmIHNob3dDb250cm9sc1wiXHJcbiAgICAgIDpzaWRlYmFyLW9wZW49XCJzaWRlYmFyT3BlbiAmJiBzaG91bGRSZW5kZXJTaWRlYmFyXCJcclxuICAgICAgOnNpZGViYXItd2lkdGg9XCJzaWRlYmFyV2lkdGhcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjM6NVwiXHJcbiAgICAvPlxyXG4gICAgPFZpZXdlclNpZGViYXJcclxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlclNpZGViYXJcIlxyXG4gICAgICA6b3Blbj1cInNpZGViYXJPcGVuXCJcclxuICAgICAgQGNsb3NlPVwib25DbG9zZVwiXHJcbiAgICAgIEB3aWR0aC1jaGFuZ2U9XCJzaWRlYmFyV2lkdGggPSAkZXZlbnRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjg6NVwiXHJcbiAgICA+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjdGl0bGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjE1OjlcIj5cclxuICAgICAgICAgIDxzcGFuIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6MTY6MTFcIj5TZWxlY3RlZDwvc3Bhbj5cclxuICAgICAgICAgIDxDb21tb25CYWRnZSB2LWlmPVwib2JqZWN0cy5sZW5ndGggPiAxXCIgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjE3OjExXCI+XHJcbiAgICAgICAgICAgIHt7IG9iamVjdHMubGVuZ3RoIH19XHJcbiAgICAgICAgICA8L0NvbW1vbkJhZGdlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI2FjdGlvbnM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLXgtMC41IGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6MjM6OVwiPlxyXG4gICAgICAgICAgPFZpZXdlclZpc2liaWxpdHlCdXR0b25cclxuICAgICAgICAgICAgOmlzLWhpZGRlbj1cImlzSGlkZGVuXCJcclxuICAgICAgICAgICAgOmZvcmNlLXZpc2libGU9XCJzaG93U3ViTWVudVwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cImhpZGVPclNob3dTZWxlY3Rpb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjI0OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8Vmlld2VySXNvbGF0ZUJ1dHRvblxyXG4gICAgICAgICAgICA6aXMtaXNvbGF0ZWQ9XCJpc0lzb2xhdGVkXCJcclxuICAgICAgICAgICAgOmZvcmNlLXZpc2libGU9XCJzaG93U3ViTWVudVwiXHJcbiAgICAgICAgICAgIEBjbGljaz1cImlzb2xhdGVPclVuaXNvbGF0ZVNlbGVjdGlvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6Mjk6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxMYXlvdXRNZW51XHJcbiAgICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dTdWJNZW51XCJcclxuICAgICAgICAgICAgOm1lbnUtaWQ9XCJtZW51SWRcIlxyXG4gICAgICAgICAgICA6aXRlbXM9XCJhY3Rpb25zSXRlbXNcIlxyXG4gICAgICAgICAgICA6Y3VzdG9tLW1lbnUtaXRlbXMtY2xhc3Nlcz1cIlsnIXctNDInXVwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9TaWRlYmFyLnZ1ZTozNDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgOmljb24tbGVmdD1cIkVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XHJcbiAgICAgICAgICAgICAgICAnIWJnLWhpZ2hsaWdodC0zJzogc2hvd1N1Yk1lbnVcclxuICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICBAY2xpY2s9XCJzaG93U3ViTWVudSA9ICFzaG93U3ViTWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6NDI6MTNcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWU6NTY6N1wiPlxyXG4gICAgICAgIDxWaWV3ZXJTZWxlY3Rpb25PYmplY3RcclxuICAgICAgICAgIHYtZm9yPVwiKG9iamVjdCwgaW5kZXgpIGluIG9iamVjdHNMaW1pdGVkXCJcclxuICAgICAgICAgIDprZXk9XCIob2JqZWN0LmlkIGFzIHN0cmluZylcIlxyXG4gICAgICAgICAgOm9iamVjdD1cIm9iamVjdFwiXHJcbiAgICAgICAgICA6cm9vdD1cInRydWVcIlxyXG4gICAgICAgICAgOnVuZm9sZD1cImluZGV4ID09PSAwICYmICFpc1NtYWxsZXJPckVxdWFsU21cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjU3OjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IHYtaWY9XCJpdGVtQ291bnQgPD0gb2JqZWN0cy5sZW5ndGhcIiBjbGFzcz1cIm1iLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjY1OjdcIj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiBzaXplPVwic21cIiB0ZXh0IGZ1bGwtd2lkdGggQGNsaWNrPVwiaXRlbUNvdW50ICs9IDEwXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9TaWRlYmFyLnZ1ZTo2Njo5XCI+XHJcbiAgICAgICAgICBWaWV3IG1vcmUgKHt7IG9iamVjdHMubGVuZ3RoIC0gaXRlbUNvdW50IH19KVxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cclxuICAgICAgICA8cCBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIHRleHQtYm9keS0zeHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL1NpZGViYXIudnVlOjcyOjlcIj5cclxuICAgICAgICAgIEhvbGQgXCJzaGlmdFwiIHRvIHNlbGVjdCBtdWx0aXBsZSBvYmplY3RzXHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9WaWV3ZXJTaWRlYmFyPlxyXG4gIDwvVmlld2VyQ29tbWVudHNQb3J0YWxPckRpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgb25LZXlTdHJva2UsIHVzZUJyZWFrcG9pbnRzIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xyXG5pbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0SWRzIH0gZnJvbSAnfn4vbGliL29iamVjdC1zaWRlYmFyL2hlbHBlcnMnXHJcbmltcG9ydCB7IGNvbnRhaW5zQWxsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3V0aWxzJ1xyXG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25VdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHsgdW5pcVdpdGggfSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IHVzZUlzU21hbGxlck9yRXF1YWxUaGFuQnJlYWtwb2ludCB9IGZyb20gJ35+L2NvbXBvc2FibGVzL2Jyb3dzZXInXHJcbmltcG9ydCB7IG1vZGVsUm91dGUgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgVGFpbHdpbmRCcmVha3BvaW50cyB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy90YWlsd2luZCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ35+L2xpYi9sYXlvdXQvaGVscGVycy9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBFbGxpcHNpcyB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcblxyXG5lbnVtIEFjdGlvblR5cGVzIHtcclxuICBPcGVuSW5OZXdUYWIgPSAnb3Blbi1pbi1uZXctdGFiJ1xyXG59XHJcblxyXG5jb25zdCB7XHJcbiAgcHJvamVjdElkLFxyXG4gIHZpZXdlcjoge1xyXG4gICAgbWV0YWRhdGE6IHsgZmlsdGVyaW5nU3RhdGUgfVxyXG4gIH0sXHJcbiAgdWk6IHsgZGlmZiwgbWVhc3VyZW1lbnQsIHRocmVhZHMsIGZpbHRlcnMgfSxcclxuICB1cmxIYXNoU3RhdGU6IHsgZm9jdXNlZFRocmVhZElkIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5jb25zdCB7IG9iamVjdHMsIGNsZWFyU2VsZWN0aW9uIH0gPSB1c2VTZWxlY3Rpb25VdGlsaXRpZXMoKVxyXG5jb25zdCB7IGhpZGVPYmplY3RzLCBzaG93T2JqZWN0cywgaXNvbGF0ZU9iamVjdHMsIHVuSXNvbGF0ZU9iamVjdHMgfSA9XHJcbiAgdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuXHJcbmNvbnN0IHsgaXNTbWFsbGVyT3JFcXVhbFNtIH0gPSB1c2VJc1NtYWxsZXJPckVxdWFsVGhhbkJyZWFrcG9pbnQoKVxyXG5jb25zdCBicmVha3BvaW50cyA9IHVzZUJyZWFrcG9pbnRzKFRhaWx3aW5kQnJlYWtwb2ludHMpXHJcbmNvbnN0IGlzR3JlYXRlclRoYW5TbSA9IGJyZWFrcG9pbnRzLmdyZWF0ZXIoJ3NtJylcclxuY29uc3QgbWVudUlkID0gdXNlSWQoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgeyBzaG93Q29udHJvbHMgfSA9IHVzZUVtYmVkKClcclxuXHJcbmNvbnN0IGl0ZW1Db3VudCA9IHJlZigyMClcclxuY29uc3Qgc2lkZWJhck9wZW4gPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNpZGViYXJXaWR0aCA9IHJlZigyODApXHJcbmNvbnN0IHNob3dTdWJNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3Qgb2JqZWN0c1VuaXF1ZUJ5QXBwSWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFkaWZmLmVuYWJsZWQudmFsdWUpIHJldHVybiBvYmplY3RzLnZhbHVlXHJcbiAgcmV0dXJuIHVuaXFXaXRoKG9iamVjdHMudmFsdWUsIChhLCBiKSA9PiB7XHJcbiAgICByZXR1cm4gYS5hcHBsaWNhdGlvbklkID09PSBiLmFwcGxpY2F0aW9uSWRcclxuICB9KVxyXG59KVxyXG5cclxuY29uc3Qgc2hvdWxkUmVuZGVyU2lkZWJhciA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gKCFpc1NtYWxsZXJPckVxdWFsU20udmFsdWUgfHwgc2lkZWJhck9wZW4udmFsdWUpICYmICFtZWFzdXJlbWVudC5lbmFibGVkLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBvYmplY3RzTGltaXRlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gb2JqZWN0c1VuaXF1ZUJ5QXBwSWQudmFsdWUuc2xpY2UoMCwgaXRlbUNvdW50LnZhbHVlKVxyXG59KVxyXG5cclxuY29uc3QgaGlkZGVuT2JqZWN0cyA9IGNvbXB1dGVkKCgpID0+IGZpbHRlcmluZ1N0YXRlLnZhbHVlPy5oaWRkZW5PYmplY3RzKVxyXG4vLyBVc2Ugc2luZ2xldG9uIGlzb2xhdGVkT2JqZWN0c1NldCBmcm9tIHZpZXdlciBzdGF0ZVxyXG5jb25zdCB7IGlzb2xhdGVkT2JqZWN0c1NldCB9ID0gZmlsdGVyc1xyXG5cclxuY29uc3QgYWxsVGFyZ2V0SWRzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGlkcyA9IFtdXHJcbiAgZm9yIChjb25zdCBvYmogb2Ygb2JqZWN0cy52YWx1ZSkge1xyXG4gICAgaWRzLnB1c2goLi4uZ2V0VGFyZ2V0T2JqZWN0SWRzKG9iaikpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gaWRzXHJcbn0pXHJcblxyXG5jb25zdCBpc0hpZGRlbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWhpZGRlbk9iamVjdHMudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIHJldHVybiBjb250YWluc0FsbChhbGxUYXJnZXRJZHMudmFsdWUsIGhpZGRlbk9iamVjdHMudmFsdWUpXHJcbn0pXHJcblxyXG5jb25zdCBpc0lzb2xhdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghaXNvbGF0ZWRPYmplY3RzU2V0LnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICByZXR1cm4gY29udGFpbnNBbGwoYWxsVGFyZ2V0SWRzLnZhbHVlLCBpc29sYXRlZE9iamVjdHNTZXQudmFsdWUpXHJcbn0pXHJcblxyXG5jb25zdCBhY3Rpb25zSXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IFtcclxuICBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOlxyXG4gICAgICAgIGFsbFRhcmdldElkcy52YWx1ZS5sZW5ndGggPiAxXHJcbiAgICAgICAgICA/ICdPcGVuIG9iamVjdHMgaW4gbmV3IHRhYidcclxuICAgICAgICAgIDogJ09wZW4gb2JqZWN0IGluIG5ldyB0YWInLFxyXG4gICAgICBpZDogQWN0aW9uVHlwZXMuT3BlbkluTmV3VGFiXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3Qgc2VsZWN0aW9uTGluayA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gbW9kZWxSb3V0ZShwcm9qZWN0SWQudmFsdWUsIGFsbFRhcmdldElkcy52YWx1ZS5qb2luKCcsJykpXHJcbn0pXHJcblxyXG5jb25zdCBvbkFjdGlvbkNob3NlbiA9IChwYXJhbXM6IHsgaXRlbTogTGF5b3V0TWVudUl0ZW07IGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHtcclxuICBjb25zdCB7IGl0ZW0gfSA9IHBhcmFtc1xyXG5cclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgQWN0aW9uVHlwZXMuT3BlbkluTmV3VGFiOlxyXG4gICAgICB3aW5kb3cub3BlbihzZWxlY3Rpb25MaW5rLnZhbHVlLCAnX2JsYW5rJylcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhpZGVPclNob3dTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgaWYgKCFpc0hpZGRlbi52YWx1ZSkge1xyXG4gICAgaGlkZU9iamVjdHMoYWxsVGFyZ2V0SWRzLnZhbHVlKVxyXG4gICAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgICBuYW1lOiAnc2VsZWN0aW9uJyxcclxuICAgICAgYWN0aW9uOiAnaGlkZSdcclxuICAgIH0pXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIHNob3dPYmplY3RzKGFsbFRhcmdldElkcy52YWx1ZSlcclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlbGVjdGlvbicsXHJcbiAgICBhY3Rpb246ICdzaG93J1xyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGlzb2xhdGVPclVuaXNvbGF0ZVNlbGVjdGlvbiA9ICgpID0+IHtcclxuICBpZiAoaXNJc29sYXRlZC52YWx1ZSkge1xyXG4gICAgdW5Jc29sYXRlT2JqZWN0cyhhbGxUYXJnZXRJZHMudmFsdWUpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZWxlY3Rpb24nLFxyXG4gICAgICBhY3Rpb246ICd1bmlzb2xhdGUnXHJcbiAgICB9KVxyXG4gIH0gZWxzZSB7XHJcbiAgICBpc29sYXRlT2JqZWN0cyhhbGxUYXJnZXRJZHMudmFsdWUpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZWxlY3Rpb24nLFxyXG4gICAgICBhY3Rpb246ICdpc29sYXRlJ1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRyYWNrQW5kQ2xlYXJTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgY2xlYXJTZWxlY3Rpb24oKVxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnc2VsZWN0aW9uJyxcclxuICAgIGFjdGlvbjogJ2NsZWFyJyxcclxuICAgIHNvdXJjZTogJ3NpZGViYXIteC1idXR0b24nXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3Qgb25DbG9zZSA9ICgpID0+IHtcclxuICBzaWRlYmFyT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgdHJhY2tBbmRDbGVhclNlbGVjdGlvbigpXHJcbn1cclxuXHJcbmNvbnN0IGZvcmNlQ2xvc2UgPSAoKSA9PiB7XHJcbiAgc2lkZWJhck9wZW4udmFsdWUgPSBmYWxzZVxyXG59XHJcblxyXG5vbktleVN0cm9rZSgnRXNjYXBlJywgKCkgPT4ge1xyXG4gIC8vIENsZWFyZWFuY2Ugb2YgYW55IHZpcy9pc28gc3RhdGUgY29taW5nIGZyb20gaGVyZSBzaG91bGQgaGFwcGVuIGluIGNsZWFyU2VsZWN0aW9uKClcclxuICAvLyBOb3RlOiB3ZSdyZSBub3QgdXNpbmcgdGhlIHRyYWNrQW5kQ2xlYXJTZWxlY3Rpb24gbWV0aG9kIGJlYWN1c2VcclxuICAvLyB3ZSB3YW50IHRvIHRyYWNrIHdoZXRoZXIgcGVvcGxlIHByZXNzIGJ1dHRvbnMgb3Iga2V5c1xyXG4gIGNsZWFyU2VsZWN0aW9uKClcclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlbGVjdGlvbicsXHJcbiAgICBhY3Rpb246ICdjbGVhcicsXHJcbiAgICBzb3VyY2U6ICdrZXlwcmVzcy1lc2NhcGUnXHJcbiAgfSlcclxufSlcclxuXHJcbndhdGNoKFxyXG4gIFtcclxuICAgICgpID0+IG9iamVjdHMudmFsdWUubGVuZ3RoLFxyXG4gICAgKCkgPT4gZm9jdXNlZFRocmVhZElkLnZhbHVlLFxyXG4gICAgKCkgPT4gdGhyZWFkcy5vcGVuVGhyZWFkLm5ld1RocmVhZEVkaXRvci52YWx1ZSxcclxuICAgICgpID0+IGlzU21hbGxlck9yRXF1YWxTbS52YWx1ZVxyXG4gIF0sXHJcbiAgKFtvYmpMZW4sIHRocmVhZElkLCBpc05ld1RocmVhZEVkaXRvck9wZW4sIGlzU21TbV0pID0+IHtcclxuICAgIC8vIENsb3NlIHNpZGViYXIgaWYgYSB0aHJlYWQgaXMgZm9jdXNlZFxyXG4gICAgaWYgKHRocmVhZElkKSB7XHJcbiAgICAgIHNpZGViYXJPcGVuLnZhbHVlID0gZmFsc2VcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xvc2Ugc2lkZWJhciBpZiBuZXcgdGhyZWFkIGVkaXRvciBpcyBvcGVuIGFuZCBzY3JlZW4gaXMgc21hbGxcclxuICAgIGlmIChpc05ld1RocmVhZEVkaXRvck9wZW4gJiYgaXNTbVNtKSB7XHJcbiAgICAgIHNpZGViYXJPcGVuLnZhbHVlID0gZmFsc2VcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBzaWRlYmFyIGlmIG9iamVjdHMgYXJlIHNlbGVjdGVkIGFuZCBubyB0aHJlYWQgaXMgZm9jdXNlZFxyXG4gICAgaWYgKG9iakxlbiAhPT0gMCAmJiAhdGhyZWFkSWQpIHtcclxuICAgICAgc2lkZWJhck9wZW4udmFsdWUgPSB0cnVlXHJcbiAgICB9IGVsc2UgaWYgKG9iakxlbiA9PT0gMCkge1xyXG4gICAgICBzaWRlYmFyT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcblxyXG5kZWZpbmVFeHBvc2Uoe1xyXG4gIGZvcmNlQ2xvc2VcclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vU2lkZWJhci52dWUifQ==