Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_00016b
T

340 lines
33 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/versions/Card.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/preview/Image.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/resources/VersionCard.vue";
import { FormButton 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/project/model-page/dialog/Delete.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createBlock as __createBlock,createElementVNode as __createElementVNode,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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...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 __vite__cjsImport7_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport7_dayjs.__esModule ? __vite__cjsImport7_dayjs.default : __vite__cjsImport7_dayjs;
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import {
useInjectedViewerLoadedResources,
useInjectedViewerRequestedResources,
useInjectedViewerState
} from "/_nuxt/lib/viewer/composables/setup.ts";
import {
useDiffUtilities,
useHighlightedObjectsUtilities
} from "/_nuxt/lib/viewer/composables/ui.ts";
import { useDateFormatters } from "/_nuxt/composables/dates.ts";
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerModelsVersionsCard",
props: {
model: { type: null, required: true },
versionId: { type: String, required: true },
last: { type: Boolean, required: true },
initiallyExpanded: { type: Boolean, required: false }
},
setup(__props, { expose: __expose }) {
__expose();
const props = __props;
const { switchModelToVersion } = useInjectedViewerRequestedResources();
const { loadMoreVersions } = useInjectedViewerLoadedResources();
const { diffModelVersions } = useDiffUtilities();
const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities();
const {
resources: {
response: { project }
}
} = useInjectedViewerState();
const { formattedRelativeDate, formattedFullDate } = useDateFormatters();
const showVersions = ref(!!props.initiallyExpanded);
const showDeleteDialog = ref(false);
const versionsToDelete = ref([]);
graphql(`
fragment ViewerModelVersionCardItem on Version {
id
message
referencedObject
sourceApplication
createdAt
previewUrl
authorUser {
...LimitedUserAvatar
}
}
`);
const modelId = computed(() => props.model.id);
const versions = computed(() => [
...props.model.loadedVersion.items,
...props.model.versions.items
]);
const showLoadMore = computed(() => {
const totalCount = props.model.versions.totalCount;
const currentCount = versions.value.length;
return currentCount < totalCount;
});
const loadedVersion = computed(
() => versions.value.find((v) => v.id === props.versionId)
);
const createdAt = computed(() => loadedVersion.value?.createdAt);
const createdAtFormatted = computed(() => {
return {
full: formattedFullDate(createdAt.value),
relative: formattedRelativeDate(createdAt.value, { capitalize: true })
};
});
const latestVersion = computed(() => {
return versions.value.slice().sort((a, b) => dayjs(a.createdAt).isBefore(dayjs(b.createdAt)) ? 1 : -1)[0];
});
const isLatest = computed(() => loadedVersion.value?.id === latestVersion.value.id);
const latestVersionId = computed(() => latestVersion.value.id);
const modelName = computed(() => {
const parts = props.model.name.split("/");
return {
subheader: parts.length > 1 ? parts.slice(0, -1).join("/") : null,
header: parts[parts.length - 1]
};
});
async function handleVersionChange(versionId) {
await switchModelToVersion(props.model.id, versionId);
}
const onLoadMore = async () => {
await loadMoreVersions(props.model.id);
};
async function handleViewChanges(version) {
if (!loadedVersion.value?.id) return;
await diffModelVersions(modelId.value, loadedVersion.value.id, version.id);
}
const highlightObject = () => {
const refObject = props.model.loadedVersion.items[0]?.referencedObject;
if (refObject && typeof refObject === "string") highlightObjects([refObject]);
};
const unhighlightObject = () => {
const refObject = props.model.loadedVersion.items[0]?.referencedObject;
if (refObject && typeof refObject === "string") unhighlightObjects([refObject]);
};
const handleRemoveVersion = (versionId) => {
const versionToDelete = versions.value.find((v) => v.id === versionId);
if (versionToDelete) {
versionsToDelete.value = [
{ id: versionToDelete.id, message: versionToDelete.message }
];
showDeleteDialog.value = true;
}
};
const onVersionDeleted = () => {
loadMoreVersions(props.model.id);
};
watch(showDeleteDialog, (isOpen) => {
if (!isOpen) {
versionsToDelete.value = [];
}
});
const __returned__ = { props, switchModelToVersion, loadMoreVersions, diffModelVersions, highlightObjects, unhighlightObjects, project, formattedRelativeDate, formattedFullDate, showVersions, showDeleteDialog, versionsToDelete, modelId, versions, showLoadMore, loadedVersion, createdAt, createdAtFormatted, latestVersion, isLatest, latestVersionId, modelName, handleVersionChange, onLoadMore, handleViewChanges, highlightObject, unhighlightObject, handleRemoveVersion, onVersionDeleted };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, withCtx as _withCtx, vShow as _vShow, normalizeClass as _normalizeClass } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "h-12 w-12 rounded-md overflow-hidden border border-outline-3 mr-3 shrink-0",
"data-v-inspector": "components/viewer/models/versions/Card.vue:19:7"
};
const _hoisted_2 = {
class: "flex flex-col",
"data-v-inspector": "components/viewer/models/versions/Card.vue:27:7"
};
const _hoisted_3 = {
class: "text-foreground text-body-2xs font-medium",
"data-v-inspector": "components/viewer/models/versions/Card.vue:28:9"
};
const _hoisted_4 = {
key: 0,
class: "text-body-3xs text-foreground",
"data-v-inspector": "components/viewer/models/versions/Card.vue:34:9"
};
const _hoisted_5 = {
class: "text-body-3xs text-foreground-2",
"data-v-inspector": "components/viewer/models/versions/Card.vue:37:9"
};
const _hoisted_6 = {
class: "text-foreground-2 text-body-3xs font-medium ml-auto pr-3",
"data-v-inspector": "components/viewer/models/versions/Card.vue:41:7"
};
const _hoisted_7 = {
class: "flex-col",
"data-v-inspector": "components/viewer/models/versions/Card.vue:47:5"
};
const _hoisted_8 = {
key: 0,
class: "mt-4 pr-2 py-2 -ml-3",
"data-v-inspector": "components/viewer/models/versions/Card.vue:63:7"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ViewerExpansionTriangle = __nuxt_component_0;
const _component_PreviewImage = __nuxt_component_1;
const _component_ViewerResourcesVersionCard = __nuxt_component_2;
const _component_FormButton = __nuxt_component_3;
const _component_ProjectModelPageDialogDelete = __nuxt_component_4;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createElementBlock(
"div",
{
class: _normalizeClass(["relative", $setup.showVersions ? "border-b border-outline-3" : ""]),
"data-v-inspector": "components/viewer/models/versions/Card.vue:4:3"
},
[
_createCommentVNode(" Model Header - Sticky "),
_createElementVNode(
"div",
{
class: "group sticky top-0 z-20 bg-foundation cursor-pointer flex items-center h-16 pr-0.5 border-b border-outline-3 hover:bg-highlight-1",
onClick: _cache[1] || (_cache[1] = ($event) => $setup.showVersions = !$setup.showVersions),
onMouseenter: $setup.highlightObject,
onMouseleave: $setup.unhighlightObject,
onFocusin: $setup.highlightObject,
onFocusout: $setup.unhighlightObject,
"data-v-inspector": "components/viewer/models/versions/Card.vue:6:5"
},
[
_createVNode(_component_ViewerExpansionTriangle, {
class: "h-8",
"is-expanded": $setup.showVersions,
onClick: _cache[0] || (_cache[0] = ($event) => $setup.showVersions = !$setup.showVersions),
"data-v-inspector": "components/viewer/models/versions/Card.vue:14:7"
}, null, 8, ["is-expanded"]),
_createElementVNode("div", _hoisted_1, [
$setup.loadedVersion?.previewUrl ? (_openBlock(), _createBlock(_component_PreviewImage, {
key: 0,
"preview-url": $setup.loadedVersion?.previewUrl,
"data-v-inspector": "components/viewer/models/versions/Card.vue:22:9"
}, null, 8, ["preview-url"])) : _createCommentVNode("v-if", true)
]),
_createElementVNode("div", _hoisted_2, [
_withDirectives((_openBlock(), _createElementBlock("span", _hoisted_3, [
_createTextVNode(
_toDisplayString($setup.modelName.header),
1
/* TEXT */
)
])), [
[_directive_tippy, $setup.modelName.subheader ? $props.model.name : null]
]),
$setup.isLatest ? (_openBlock(), _createElementBlock("span", _hoisted_4, " Latest version ")) : _createCommentVNode("v-if", true),
_withDirectives((_openBlock(), _createElementBlock("span", _hoisted_5, [
_createTextVNode(
_toDisplayString($setup.createdAtFormatted.relative),
1
/* TEXT */
)
])), [
[_directive_tippy, $setup.createdAtFormatted.full]
])
]),
_createElementVNode(
"span",
_hoisted_6,
_toDisplayString($props.model.versions?.totalCount),
1
/* TEXT */
)
],
32
/* NEED_HYDRATION */
),
_createCommentVNode(" Version List "),
_withDirectives(_createElementVNode(
"div",
_hoisted_7,
[
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.props.model.versions.items, (version, index) => {
return _openBlock(), _createBlock(_component_ViewerResourcesVersionCard, {
key: version.id,
"model-id": $setup.modelId,
version,
"is-latest-version": version.id === $setup.latestVersionId,
"is-loaded-version": version.id === $setup.loadedVersion?.id,
last: index === $setup.props.model.versions.totalCount - 1,
"last-loaded": index === $setup.props.model.versions.items.length - 1,
clickable: version.id !== $setup.loadedVersion?.id,
"total-versions": $setup.props.model.versions.totalCount,
onChangeVersion: $setup.handleVersionChange,
onViewChanges: $setup.handleViewChanges,
onRemoveVersion: $setup.handleRemoveVersion,
"data-v-inspector": "components/viewer/models/versions/Card.vue:48:7"
}, null, 8, ["model-id", "version", "is-latest-version", "is-loaded-version", "last", "last-loaded", "clickable", "total-versions"]);
}),
128
/* KEYED_FRAGMENT */
)),
$setup.showLoadMore ? (_openBlock(), _createElementBlock("div", _hoisted_8, [
_createVNode(_component_FormButton, {
"full-width": "",
size: "sm",
text: "",
color: "subtle",
disabled: !$setup.showLoadMore,
onClick: $setup.onLoadMore,
"data-v-inspector": "components/viewer/models/versions/Card.vue:64:9"
}, {
default: _withCtx(() => [..._cache[3] || (_cache[3] = [
_createTextVNode(
" View older versions ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["disabled"])
])) : _createCommentVNode("v-if", true)
],
512
/* NEED_PATCH */
), [
[_vShow, $setup.showVersions]
]),
_createCommentVNode(" Version Delete Dialog "),
$setup.project?.id ? (_openBlock(), _createBlock(_component_ProjectModelPageDialogDelete, {
key: 0,
open: $setup.showDeleteDialog,
"onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showDeleteDialog = $event),
"project-id": $setup.project.id,
"model-id": $props.model.id,
versions: $setup.versionsToDelete,
onDeleted: $setup.onVersionDeleted,
"data-v-inspector": "components/viewer/models/versions/Card.vue:78:5"
}, null, 8, ["open", "project-id", "model-id", "versions"])) : _createCommentVNode("v-if", true)
],
2
/* CLASS */
);
}
_sfc_main.__hmrId = "578d1ed2";
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/models/versions/Card.vue"]]);
//# sourceMappingURL=data:application/json;base64,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Y2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiIDpjbGFzcz1cInNob3dWZXJzaW9ucyA/ICdib3JkZXItYiBib3JkZXItb3V0bGluZS0zJyA6ICcnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo0OjNcIj5cclxuICAgIDwhLS0gTW9kZWwgSGVhZGVyIC0gU3RpY2t5IC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImdyb3VwIHN0aWNreSB0b3AtMCB6LTIwIGJnLWZvdW5kYXRpb24gY3Vyc29yLXBvaW50ZXIgZmxleCBpdGVtcy1jZW50ZXIgaC0xNiBwci0wLjUgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMyBob3ZlcjpiZy1oaWdobGlnaHQtMVwiXHJcbiAgICAgIEBjbGljaz1cInNob3dWZXJzaW9ucyA9ICFzaG93VmVyc2lvbnNcIlxyXG4gICAgICBAbW91c2VlbnRlcj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgIEBtb3VzZWxlYXZlPVwidW5oaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICBAZm9jdXNpbj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgIEBmb2N1c291dD1cInVuaGlnaGxpZ2h0T2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo2OjVcIlxyXG4gICAgPlxyXG4gICAgICA8Vmlld2VyRXhwYW5zaW9uVHJpYW5nbGVcclxuICAgICAgICBjbGFzcz1cImgtOFwiXHJcbiAgICAgICAgOmlzLWV4cGFuZGVkPVwic2hvd1ZlcnNpb25zXCJcclxuICAgICAgICBAY2xpY2s9XCJzaG93VmVyc2lvbnMgPSAhc2hvd1ZlcnNpb25zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZToxNDo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaC0xMiB3LTEyIHJvdW5kZWQtbWQgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlciBib3JkZXItb3V0bGluZS0zIG1yLTMgc2hyaW5rLTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjE5OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPFByZXZpZXdJbWFnZVxyXG4gICAgICAgICAgdi1pZj1cImxvYWRlZFZlcnNpb24/LnByZXZpZXdVcmxcIlxyXG4gICAgICAgICAgOnByZXZpZXctdXJsPVwibG9hZGVkVmVyc2lvbj8ucHJldmlld1VybFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6MjI6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZToyNzo3XCI+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIHYtdGlwcHk9XCJtb2RlbE5hbWUuc3ViaGVhZGVyID8gbW9kZWwubmFtZSA6IG51bGxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgdGV4dC1ib2R5LTJ4cyBmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6Mjg6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgbW9kZWxOYW1lLmhlYWRlciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiB2LWlmPVwiaXNMYXRlc3RcIiBjbGFzcz1cInRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTozNDo5XCI+XHJcbiAgICAgICAgICBMYXRlc3QgdmVyc2lvblxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiB2LXRpcHB5PVwiY3JlYXRlZEF0Rm9ybWF0dGVkLmZ1bGxcIiBjbGFzcz1cInRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjM3OjlcIj5cclxuICAgICAgICAgIHt7IGNyZWF0ZWRBdEZvcm1hdHRlZC5yZWxhdGl2ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTIgdGV4dC1ib2R5LTN4cyBmb250LW1lZGl1bSBtbC1hdXRvIHByLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjQxOjdcIj5cclxuICAgICAgICB7eyBtb2RlbC52ZXJzaW9ucz8udG90YWxDb3VudCB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFZlcnNpb24gTGlzdCAtLT5cclxuICAgIDxkaXYgdi1zaG93PVwic2hvd1ZlcnNpb25zXCIgY2xhc3M9XCJmbGV4LWNvbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWU6NDc6NVwiPlxyXG4gICAgICA8Vmlld2VyUmVzb3VyY2VzVmVyc2lvbkNhcmRcclxuICAgICAgICB2LWZvcj1cIih2ZXJzaW9uLCBpbmRleCkgaW4gcHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXNcIlxyXG4gICAgICAgIDprZXk9XCJ2ZXJzaW9uLmlkXCJcclxuICAgICAgICA6bW9kZWwtaWQ9XCJtb2RlbElkXCJcclxuICAgICAgICA6dmVyc2lvbj1cInZlcnNpb25cIlxyXG4gICAgICAgIDppcy1sYXRlc3QtdmVyc2lvbj1cInZlcnNpb24uaWQgPT09IGxhdGVzdFZlcnNpb25JZFwiXHJcbiAgICAgICAgOmlzLWxvYWRlZC12ZXJzaW9uPVwidmVyc2lvbi5pZCA9PT0gbG9hZGVkVmVyc2lvbj8uaWRcIlxyXG4gICAgICAgIDpsYXN0PVwiaW5kZXggPT09IHByb3BzLm1vZGVsLnZlcnNpb25zLnRvdGFsQ291bnQgLSAxXCJcclxuICAgICAgICA6bGFzdC1sb2FkZWQ9XCJpbmRleCA9PT0gcHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXMubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgOmNsaWNrYWJsZT1cInZlcnNpb24uaWQgIT09IGxvYWRlZFZlcnNpb24/LmlkXCJcclxuICAgICAgICA6dG90YWwtdmVyc2lvbnM9XCJwcm9wcy5tb2RlbC52ZXJzaW9ucy50b3RhbENvdW50XCJcclxuICAgICAgICBAY2hhbmdlLXZlcnNpb249XCJoYW5kbGVWZXJzaW9uQ2hhbmdlXCJcclxuICAgICAgICBAdmlldy1jaGFuZ2VzPVwiaGFuZGxlVmlld0NoYW5nZXNcIlxyXG4gICAgICAgIEByZW1vdmUtdmVyc2lvbj1cImhhbmRsZVJlbW92ZVZlcnNpb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjQ4OjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2IHYtaWY9XCJzaG93TG9hZE1vcmVcIiBjbGFzcz1cIm10LTQgcHItMiBweS0yIC1tbC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo2Mzo3XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICB0ZXh0XHJcbiAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCIhc2hvd0xvYWRNb3JlXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uTG9hZE1vcmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL3ZlcnNpb25zL0NhcmQudnVlOjY0OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIFZpZXcgb2xkZXIgdmVyc2lvbnNcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBWZXJzaW9uIERlbGV0ZSBEaWFsb2cgLS0+XHJcbiAgICA8UHJvamVjdE1vZGVsUGFnZURpYWxvZ0RlbGV0ZVxyXG4gICAgICB2LWlmPVwicHJvamVjdD8uaWRcIlxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93RGVsZXRlRGlhbG9nXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgOm1vZGVsLWlkPVwibW9kZWwuaWRcIlxyXG4gICAgICA6dmVyc2lvbnM9XCJ2ZXJzaW9uc1RvRGVsZXRlXCJcclxuICAgICAgQGRlbGV0ZWQ9XCJvblZlcnNpb25EZWxldGVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy92ZXJzaW9ucy9DYXJkLnZ1ZTo3ODo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB0eXBlIHtcclxuICBWaWV3ZXJMb2FkZWRSZXNvdXJjZXNRdWVyeSxcclxuICBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50XHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQge1xyXG4gIHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyUmVxdWVzdGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQge1xyXG4gIHVzZURpZmZVdGlsaXRpZXMsXHJcbiAgdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuXHJcbnR5cGUgTW9kZWxJdGVtID0gTm9uTnVsbGFibGU8R2V0PFZpZXdlckxvYWRlZFJlc291cmNlc1F1ZXJ5LCAncHJvamVjdC5tb2RlbHMuaXRlbXNbMF0nPj5cclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIG1vZGVsOiBNb2RlbEl0ZW1cclxuICB2ZXJzaW9uSWQ6IHN0cmluZ1xyXG4gIGxhc3Q6IGJvb2xlYW5cclxuICBpbml0aWFsbHlFeHBhbmRlZD86IGJvb2xlYW5cclxufT4oKVxyXG5cclxuY29uc3QgeyBzd2l0Y2hNb2RlbFRvVmVyc2lvbiB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJSZXF1ZXN0ZWRSZXNvdXJjZXMoKVxyXG5jb25zdCB7IGxvYWRNb3JlVmVyc2lvbnMgfSA9IHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzKClcclxuY29uc3QgeyBkaWZmTW9kZWxWZXJzaW9ucyB9ID0gdXNlRGlmZlV0aWxpdGllcygpXHJcbmNvbnN0IHsgaGlnaGxpZ2h0T2JqZWN0cywgdW5oaWdobGlnaHRPYmplY3RzIH0gPSB1c2VIaWdobGlnaHRlZE9iamVjdHNVdGlsaXRpZXMoKVxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0IH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuY29uc3QgeyBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUsIGZvcm1hdHRlZEZ1bGxEYXRlIH0gPSB1c2VEYXRlRm9ybWF0dGVycygpXHJcblxyXG5jb25zdCBzaG93VmVyc2lvbnMgPSByZWYoISFwcm9wcy5pbml0aWFsbHlFeHBhbmRlZClcclxuY29uc3Qgc2hvd0RlbGV0ZURpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3QgdmVyc2lvbnNUb0RlbGV0ZSA9IHJlZjx7IGlkOiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIH1bXT4oW10pXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbSBvbiBWZXJzaW9uIHtcclxuICAgIGlkXHJcbiAgICBtZXNzYWdlXHJcbiAgICByZWZlcmVuY2VkT2JqZWN0XHJcbiAgICBzb3VyY2VBcHBsaWNhdGlvblxyXG4gICAgY3JlYXRlZEF0XHJcbiAgICBwcmV2aWV3VXJsXHJcbiAgICBhdXRob3JVc2VyIHtcclxuICAgICAgLi4uTGltaXRlZFVzZXJBdmF0YXJcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBtb2RlbElkID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubW9kZWwuaWQpXHJcbmNvbnN0IHZlcnNpb25zID0gY29tcHV0ZWQoKCkgPT4gW1xyXG4gIC4uLnByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXMsXHJcbiAgLi4ucHJvcHMubW9kZWwudmVyc2lvbnMuaXRlbXNcclxuXSlcclxuY29uc3Qgc2hvd0xvYWRNb3JlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IHRvdGFsQ291bnQgPSBwcm9wcy5tb2RlbC52ZXJzaW9ucy50b3RhbENvdW50XHJcbiAgY29uc3QgY3VycmVudENvdW50ID0gdmVyc2lvbnMudmFsdWUubGVuZ3RoXHJcbiAgcmV0dXJuIGN1cnJlbnRDb3VudCA8IHRvdGFsQ291bnRcclxufSlcclxuXHJcbmNvbnN0IGxvYWRlZFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PlxyXG4gIHZlcnNpb25zLnZhbHVlLmZpbmQoKHYpID0+IHYuaWQgPT09IHByb3BzLnZlcnNpb25JZClcclxuKVxyXG5cclxuY29uc3QgY3JlYXRlZEF0ID0gY29tcHV0ZWQoKCkgPT4gbG9hZGVkVmVyc2lvbi52YWx1ZT8uY3JlYXRlZEF0KVxyXG5cclxuY29uc3QgY3JlYXRlZEF0Rm9ybWF0dGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBmdWxsOiBmb3JtYXR0ZWRGdWxsRGF0ZShjcmVhdGVkQXQudmFsdWUpLFxyXG4gICAgcmVsYXRpdmU6IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShjcmVhdGVkQXQudmFsdWUsIHsgY2FwaXRhbGl6ZTogdHJ1ZSB9KVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGxhdGVzdFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHZlcnNpb25zLnZhbHVlXHJcbiAgICAuc2xpY2UoKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IChkYXlqcyhhLmNyZWF0ZWRBdCkuaXNCZWZvcmUoZGF5anMoYi5jcmVhdGVkQXQpKSA/IDEgOiAtMSkpWzBdXHJcbn0pXHJcblxyXG5jb25zdCBpc0xhdGVzdCA9IGNvbXB1dGVkKCgpID0+IGxvYWRlZFZlcnNpb24udmFsdWU/LmlkID09PSBsYXRlc3RWZXJzaW9uLnZhbHVlLmlkKVxyXG5cclxuY29uc3QgbGF0ZXN0VmVyc2lvbklkID0gY29tcHV0ZWQoKCkgPT4gbGF0ZXN0VmVyc2lvbi52YWx1ZS5pZClcclxuXHJcbmNvbnN0IG1vZGVsTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IHByb3BzLm1vZGVsLm5hbWUuc3BsaXQoJy8nKVxyXG4gIHJldHVybiB7XHJcbiAgICBzdWJoZWFkZXI6IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zbGljZSgwLCAtMSkuam9pbignLycpIDogbnVsbCxcclxuICAgIGhlYWRlcjogcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cclxuICB9XHJcbn0pXHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJzaW9uQ2hhbmdlKHZlcnNpb25JZDogc3RyaW5nKSB7XHJcbiAgYXdhaXQgc3dpdGNoTW9kZWxUb1ZlcnNpb24ocHJvcHMubW9kZWwuaWQsIHZlcnNpb25JZClcclxufVxyXG5cclxuY29uc3Qgb25Mb2FkTW9yZSA9IGFzeW5jICgpID0+IHtcclxuICBhd2FpdCBsb2FkTW9yZVZlcnNpb25zKHByb3BzLm1vZGVsLmlkKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWaWV3Q2hhbmdlcyh2ZXJzaW9uOiBWaWV3ZXJNb2RlbFZlcnNpb25DYXJkSXRlbUZyYWdtZW50KSB7XHJcbiAgaWYgKCFsb2FkZWRWZXJzaW9uLnZhbHVlPy5pZCkgcmV0dXJuXHJcbiAgYXdhaXQgZGlmZk1vZGVsVmVyc2lvbnMobW9kZWxJZC52YWx1ZSwgbG9hZGVkVmVyc2lvbi52YWx1ZS5pZCwgdmVyc2lvbi5pZClcclxufVxyXG5cclxuY29uc3QgaGlnaGxpZ2h0T2JqZWN0ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHJlZk9iamVjdCA9IHByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXNbMF0/LnJlZmVyZW5jZWRPYmplY3RcclxuICBpZiAocmVmT2JqZWN0ICYmIHR5cGVvZiByZWZPYmplY3QgPT09ICdzdHJpbmcnKSBoaWdobGlnaHRPYmplY3RzKFtyZWZPYmplY3RdKVxyXG59XHJcblxyXG5jb25zdCB1bmhpZ2hsaWdodE9iamVjdCA9ICgpID0+IHtcclxuICBjb25zdCByZWZPYmplY3QgPSBwcm9wcy5tb2RlbC5sb2FkZWRWZXJzaW9uLml0ZW1zWzBdPy5yZWZlcmVuY2VkT2JqZWN0XHJcbiAgaWYgKHJlZk9iamVjdCAmJiB0eXBlb2YgcmVmT2JqZWN0ID09PSAnc3RyaW5nJykgdW5oaWdobGlnaHRPYmplY3RzKFtyZWZPYmplY3RdKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZW1vdmVWZXJzaW9uID0gKHZlcnNpb25JZDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gRmluZCB0aGUgdmVyc2lvbiB0byBkZWxldGVcclxuICBjb25zdCB2ZXJzaW9uVG9EZWxldGUgPSB2ZXJzaW9ucy52YWx1ZS5maW5kKCh2KSA9PiB2LmlkID09PSB2ZXJzaW9uSWQpXHJcbiAgaWYgKHZlcnNpb25Ub0RlbGV0ZSkge1xyXG4gICAgdmVyc2lvbnNUb0RlbGV0ZS52YWx1ZSA9IFtcclxuICAgICAgeyBpZDogdmVyc2lvblRvRGVsZXRlLmlkLCBtZXNzYWdlOiB2ZXJzaW9uVG9EZWxldGUubWVzc2FnZSB9XHJcbiAgICBdXHJcbiAgICBzaG93RGVsZXRlRGlhbG9nLnZhbHVlID0gdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgb25WZXJzaW9uRGVsZXRlZCA9ICgpID0+IHtcclxuICAvLyBSZWZyZXNoIHRoZSB2ZXJzaW9ucyBsaXN0IGFmdGVyIHN1Y2Nlc3NmdWwgZGVsZXRpb25cclxuICBsb2FkTW9yZVZlcnNpb25zKHByb3BzLm1vZGVsLmlkKVxyXG59XHJcblxyXG53YXRjaChzaG93RGVsZXRlRGlhbG9nLCAoaXNPcGVuKSA9PiB7XHJcbiAgaWYgKCFpc09wZW4pIHtcclxuICAgIHZlcnNpb25zVG9EZWxldGUudmFsdWUgPSBbXVxyXG4gIH1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvdmVyc2lvbnMvQ2FyZC52dWUifQ==