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

378 lines
38 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/Actions.vue");import { FormButton as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { LayoutMenu 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/project/page/models/card/EditDialog.vue";
import { default as __nuxt_component_3 } from "/_nuxt/components/project/page/models/card/DeleteDialog.vue";
import { default as __nuxt_component_4 } from "/_nuxt/components/project/model-page/dialog/embed/Embed.vue";
import { default as __nuxt_component_5 } from "/_nuxt/components/project/page/models/UploadsDialog.vue";
import { default as __nuxt_component_6 } from "/_nuxt/components/project/page/models/card/RemoveSyncDialog.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createBlock as __createBlock,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 _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 { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts";
import { EllipsisHorizontalIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts";
import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts";
import { modelVersionsRoute } from "/_nuxt/lib/common/helpers/route.ts";
import { useWorkspacePlan } from "/_nuxt/lib/workspaces/composables/plan.ts";
import { useUpdateAccSyncItem } from "/_nuxt/lib/acc/composables/useUpdateAccSyncItem.ts";
import { useClipboard } from "/_nuxt/composables/browser.ts";
import { useId, ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => {
ActionTypes2["Rename"] = "rename";
ActionTypes2["Delete"] = "delete";
ActionTypes2["Share"] = "share";
ActionTypes2["ViewVersions"] = "view-versions";
ActionTypes2["UploadVersion"] = "upload-version";
ActionTypes2["ToggleSyncPause"] = "toggle-sync-pause";
ActionTypes2["DeleteSync"] = "delete-sync";
ActionTypes2["CopyId"] = "copy-id";
ActionTypes2["Embed"] = "embed";
ActionTypes2["ViewUploads"] = "view-uploads";
return ActionTypes2;
})(ActionTypes || {});
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ProjectPageModelsActions",
props: {
open: { type: Boolean, required: false },
model: { type: Object, required: true },
project: { type: Object, required: true },
menuPosition: { type: Number, required: false },
mountMenuOnBody: { type: Boolean, required: false }
},
emits: ["update:open", "model-updated", "upload-version", "embed"],
setup(__props, { expose: __expose, emit: __emit }) {
graphql(`
fragment ProjectPageModelsActions on Model {
id
name
permissions {
canUpdate {
...FullPermissionCheckResult
}
canDelete {
...FullPermissionCheckResult
}
canCreateVersion {
...FullPermissionCheckResult
}
}
accSyncItem {
id
...ProjectPageModelsActions_AccSyncItem
}
...UseCopyModelLink_Model
}
`);
graphql(`
fragment ProjectPageModelsActions_Project on Project {
id
workspace {
id
slug
}
permissions {
canReadAccIntegrationSettings {
...FullPermissionCheckResult
}
}
...ProjectsModelPageEmbed_Project
}
`);
graphql(`
fragment ProjectPageModelsActions_AccSyncItem on AccSyncItem {
id
accFileName
status
}
`);
const emit = __emit;
const props = __props;
const copyModelLink = useCopyModelLink();
const { copy } = useClipboard();
const menuId = useId();
const { isLoggedIn } = useActiveUser();
const router = useRouter();
const mp = useMixpanel();
const { statusIsCanceled } = useWorkspacePlan(props.project.workspace?.slug || "");
const showActionsMenu = ref(false);
const openDialog = ref(null);
const accSyncItem = computed(() => props.model.accSyncItem);
const updateAccSyncItem = useUpdateAccSyncItem();
const canEdit = computed(() => props.model.permissions.canUpdate);
const canDelete = computed(() => props.model.permissions.canDelete);
const canCreateVersion = computed(() => props.model.permissions.canCreateVersion);
const canEditAccSync = computed(
() => props.project.permissions.canReadAccIntegrationSettings
);
const uploadVersionDisabled = computed(() => {
if (canCreateVersion.value.code === "WORKSPACES_NOT_AUTHORIZED_ERROR") {
return {
disabled: true,
tooltip: `Your project role doesn't allow creating new model versions`
};
}
if (statusIsCanceled.value) {
return {
disabled: true,
tooltip: "The workspace's subscription is cancelled, so no new model versions can be created"
};
}
if (!canCreateVersion.value.authorized) {
return {
disabled: true,
tooltip: canCreateVersion.value.message || "Insufficient permissions"
};
}
return {
disabled: false,
tooltip: ""
};
});
const actionsItems = computed(() => [
...isLoggedIn.value ? [
[
{
title: "Edit model...",
id: "rename" /* Rename */,
disabled: !canEdit.value.authorized,
disabledTooltip: canEdit.value.message || "Insufficient permissions"
}
]
] : [],
accSyncItem.value ? [
{
title: accSyncItem.value?.status === "paused" ? "Resume sync..." : "Pause sync...",
id: "toggle-sync-pause" /* ToggleSyncPause */,
disabled: !canEditAccSync.value.authorized,
disabledTooltip: canEditAccSync.value.message
},
{
title: "Remove sync...",
id: "delete-sync" /* DeleteSync */,
disabled: !canEditAccSync.value.authorized,
disabledTooltip: canEditAccSync.value.message
}
] : [
{
title: "View versions",
id: "view-versions" /* ViewVersions */
},
{
title: "View uploads",
id: "view-uploads" /* ViewUploads */
},
...isLoggedIn.value ? [
{
title: "Upload new version...",
id: "upload-version" /* UploadVersion */,
disabled: uploadVersionDisabled.value.disabled,
disabledTooltip: uploadVersionDisabled.value.tooltip
}
] : []
],
[
{ title: "Copy link", id: "share" /* Share */ },
{ title: "Copy ID", id: "copy-id" /* CopyId */ },
{ title: "Embed model...", id: "embed" /* Embed */ }
],
...isLoggedIn.value ? [
[
{
title: "Delete...",
id: "delete" /* Delete */,
// TODO:
disabled: !canDelete.value.authorized,
disabledTooltip: canDelete.value.message || "Insufficient permissions"
}
]
] : []
]);
const isRenameDialogOpen = computed({
get: () => openDialog.value === "rename" /* Rename */,
set: (isOpen) => openDialog.value = isOpen ? "rename" /* Rename */ : null
});
const isDeleteDialogOpen = computed({
get: () => openDialog.value === "delete" /* Delete */,
set: (isOpen) => openDialog.value = isOpen ? "delete" /* Delete */ : null
});
const isEmbedDialogOpen = computed({
get: () => openDialog.value === "embed" /* Embed */,
set: (isOpen) => openDialog.value = isOpen ? "embed" /* Embed */ : null
});
const isUploadsDialogOpen = computed({
get: () => openDialog.value === "view-uploads" /* ViewUploads */,
set: (isOpen) => openDialog.value = isOpen ? "view-uploads" /* ViewUploads */ : null
});
const isRemoveSyncDialogOpen = computed({
get: () => openDialog.value === "delete-sync" /* DeleteSync */,
set: (isOpen) => openDialog.value = isOpen ? "delete-sync" /* DeleteSync */ : null
});
const onActionChosen = (params) => {
const { item } = params;
switch (item.id) {
case "rename" /* Rename */:
case "delete" /* Delete */:
case "embed" /* Embed */:
case "view-uploads" /* ViewUploads */:
case "delete-sync" /* DeleteSync */:
openDialog.value = item.id;
break;
case "toggle-sync-pause" /* ToggleSyncPause */:
if (!accSyncItem.value) return;
updateAccSyncItem(
props.project.id,
accSyncItem.value?.id,
accSyncItem.value.status === "paused" ? "pending" : "paused"
);
break;
case "share" /* Share */:
mp.track("Branch Action", { type: "action", name: "share" });
void copyModelLink({ model: props.model });
break;
case "view-versions" /* ViewVersions */:
router.push(modelVersionsRoute(props.project.id, props.model.id));
break;
case "upload-version" /* UploadVersion */:
emit("upload-version");
break;
case "copy-id" /* CopyId */:
copy(props.model.id, { successMessage: "Copied model ID to clipboard" });
break;
}
};
const onButtonClick = () => {
showActionsMenu.value = !showActionsMenu.value;
};
const showUploads = () => {
openDialog.value = "view-uploads" /* ViewUploads */;
};
watch(showActionsMenu, (newVal) => emit("update:open", newVal));
watch(
() => props.open || false,
(newVal) => showActionsMenu.value = newVal
);
__expose({
showUploads
});
const __returned__ = { ActionTypes, emit, props, copyModelLink, copy, menuId, isLoggedIn, router, mp, statusIsCanceled, showActionsMenu, openDialog, accSyncItem, updateAccSyncItem, canEdit, canDelete, canCreateVersion, canEditAccSync, uploadVersionDisabled, actionsItems, isRenameDialogOpen, isDeleteDialogOpen, isEmbedDialogOpen, isUploadsDialogOpen, isRemoveSyncDialogOpen, onActionChosen, onButtonClick, showUploads, get EllipsisHorizontalIcon() {
return EllipsisHorizontalIcon;
}, get HorizontalDirection() {
return HorizontalDirection;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "relative",
"data-v-inspector": "components/project/page/models/Actions.vue:3:3"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_FormButton = __nuxt_component_0;
const _component_LayoutMenu = __nuxt_component_1;
const _component_ProjectPageModelsCardEditDialog = __nuxt_component_2;
const _component_ProjectPageModelsCardDeleteDialog = __nuxt_component_3;
const _component_ProjectModelPageDialogEmbed = __nuxt_component_4;
const _component_ProjectPageModelsUploadsDialog = __nuxt_component_5;
const _component_ProjectPageModelsCardRemoveSyncDialog = __nuxt_component_6;
return _openBlock(), _createElementBlock("div", _hoisted_1, [
_createVNode(_component_LayoutMenu, {
open: $setup.showActionsMenu,
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = $event),
"menu-id": $setup.menuId,
items: $setup.actionsItems,
"menu-position": $props.menuPosition ? $props.menuPosition : $setup.HorizontalDirection.Left,
"mount-menu-on-body": $props.mountMenuOnBody,
onClick: _cache[1] || (_cache[1] = _withModifiers(() => {
}, ["stop", "prevent"])),
onChosen: $setup.onActionChosen,
"data-v-inspector": "components/project/page/models/Actions.vue:4:5"
}, {
default: _withCtx(() => [
_createVNode(_component_FormButton, {
color: "subtle",
"hide-text": "",
"icon-right": $setup.EllipsisHorizontalIcon,
class: "!text-foreground-2",
onClick: $setup.onButtonClick,
"data-v-inspector": "components/project/page/models/Actions.vue:13:7"
}, null, 8, ["icon-right"])
]),
_: 1
/* STABLE */
}, 8, ["open", "menu-id", "items", "menu-position", "mount-menu-on-body"]),
_createVNode(_component_ProjectPageModelsCardEditDialog, {
open: $setup.isRenameDialogOpen,
"onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.isRenameDialogOpen = $event),
model: $props.model,
"project-id": $props.project.id,
onUpdated: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("model-updated")),
"data-v-inspector": "components/project/page/models/Actions.vue:21:5"
}, null, 8, ["open", "model", "project-id"]),
_createVNode(_component_ProjectPageModelsCardDeleteDialog, {
open: $setup.isDeleteDialogOpen,
"onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.isDeleteDialogOpen = $event),
model: $props.model,
"project-id": $props.project.id,
onDeleted: _cache[5] || (_cache[5] = ($event) => _ctx.$emit("model-updated")),
"data-v-inspector": "components/project/page/models/Actions.vue:27:5"
}, null, 8, ["open", "model", "project-id"]),
_createVNode(_component_ProjectModelPageDialogEmbed, {
open: $setup.isEmbedDialogOpen,
"onUpdate:open": _cache[6] || (_cache[6] = ($event) => $setup.isEmbedDialogOpen = $event),
project: $props.project,
"model-id": $props.model.id,
"data-v-inspector": "components/project/page/models/Actions.vue:33:5"
}, null, 8, ["open", "project", "model-id"]),
_createVNode(_component_ProjectPageModelsUploadsDialog, {
open: $setup.isUploadsDialogOpen,
"onUpdate:open": _cache[7] || (_cache[7] = ($event) => $setup.isUploadsDialogOpen = $event),
"project-id": $props.project.id,
"model-id": $props.model.id,
"data-v-inspector": "components/project/page/models/Actions.vue:38:5"
}, null, 8, ["open", "project-id", "model-id"]),
$setup.accSyncItem ? (_openBlock(), _createBlock(_component_ProjectPageModelsCardRemoveSyncDialog, {
key: 0,
open: $setup.isRemoveSyncDialogOpen,
"onUpdate:open": _cache[8] || (_cache[8] = ($event) => $setup.isRemoveSyncDialogOpen = $event),
"project-id": $props.project.id,
"sync-item": $setup.accSyncItem,
"data-v-inspector": "components/project/page/models/Actions.vue:43:5"
}, null, 8, ["open", "project-id", "sync-item"])) : _createCommentVNode("v-if", true)
]);
}
_sfc_main.__hmrId = "d323f1f2";
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/project/page/models/Actions.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QixVQUFRO0FBQUEsTUFBZ0Isb0JBQWlCO0FBQUE7d0JBRTFDLE1BTWM7QUFBQSxRQU5kLGFBTWM7QUFBQSxVQUxaLE9BQU07QUFBQSxVQUNOO0FBQUEsVUFDQyxjQUFZO0FBQUEsVUFDYixPQUFNO0FBQUEsVUFDTCxTQUFPO0FBQUEsVUFBZSxvQkFBaUI7QUFBQTs7Ozs7SUFHNUMsYUFLRTtBQUFBLE1BSlEsTUFBTTtBQUFBLHlGQUFrQjtBQUFBLE1BQy9CLE9BQU87QUFBQSxNQUNQLGNBQVksZUFBUTtBQUFBLE1BQ3BCLFdBQU8sc0NBQUUsV0FBSztBQUFBLE1BQW1CLG9CQUFpQjtBQUFBO0lBRXJELGFBS0U7QUFBQSxNQUpRLE1BQU07QUFBQSx5RkFBa0I7QUFBQSxNQUMvQixPQUFPO0FBQUEsTUFDUCxjQUFZLGVBQVE7QUFBQSxNQUNwQixXQUFPLHNDQUFFLFdBQUs7QUFBQSxNQUFtQixvQkFBaUI7QUFBQTtJQUVyRCxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsd0ZBQWlCO0FBQUEsTUFDOUIsU0FBUztBQUFBLE1BQ1QsWUFBVSxhQUFNO0FBQUEsTUFBSSxvQkFBaUI7QUFBQTtJQUV4QyxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsMEZBQW1CO0FBQUEsTUFDaEMsY0FBWSxlQUFRO0FBQUEsTUFDcEIsWUFBVSxhQUFNO0FBQUEsTUFBSSxvQkFBaUI7QUFBQTtJQUdoQyxvQ0FEUixhQUtFO0FBQUE7TUFIUSxNQUFNO0FBQUEsNkZBQXNCO0FBQUEsTUFDbkMsY0FBWSxlQUFRO0FBQUEsTUFDcEIsYUFBVztBQUFBLE1BQWEsb0JBQWlCO0FBQUEiLCJuYW1lcyI6WyJBY3Rpb25UeXBlcyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJBY3Rpb25zLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQWN0aW9ucy52dWU6MzozXCI+XHJcbiAgICA8TGF5b3V0TWVudVxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICA6bWVudS1pZD1cIm1lbnVJZFwiXHJcbiAgICAgIDppdGVtcz1cImFjdGlvbnNJdGVtc1wiXHJcbiAgICAgIDptZW51LXBvc2l0aW9uPVwibWVudVBvc2l0aW9uID8gbWVudVBvc2l0aW9uIDogSG9yaXpvbnRhbERpcmVjdGlvbi5MZWZ0XCJcclxuICAgICAgOm1vdW50LW1lbnUtb24tYm9keT1cIm1vdW50TWVudU9uQm9keVwiXHJcbiAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTo0OjVcIlxyXG4gICAgPlxyXG4gICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICA6aWNvbi1yaWdodD1cIkVsbGlwc2lzSG9yaXpvbnRhbEljb25cIlxyXG4gICAgICAgIGNsYXNzPVwiIXRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICBAY2xpY2s9XCJvbkJ1dHRvbkNsaWNrXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToxMzo3XCJcclxuICAgICAgPjwvRm9ybUJ1dHRvbj5cclxuICAgIDwvTGF5b3V0TWVudT5cclxuICAgIDxQcm9qZWN0UGFnZU1vZGVsc0NhcmRFZGl0RGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzUmVuYW1lRGlhbG9nT3BlblwiXHJcbiAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgQHVwZGF0ZWQ9XCIkZW1pdCgnbW9kZWwtdXBkYXRlZCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToyMTo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkRGVsZXRlRGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzRGVsZXRlRGlhbG9nT3BlblwiXHJcbiAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgQGRlbGV0ZWQ9XCIkZW1pdCgnbW9kZWwtdXBkYXRlZCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZToyNzo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdE1vZGVsUGFnZURpYWxvZ0VtYmVkXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzRW1iZWREaWFsb2dPcGVuXCJcclxuICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgOm1vZGVsLWlkPVwibW9kZWwuaWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0FjdGlvbnMudnVlOjMzOjVcIlxyXG4gICAgLz5cclxuICAgIDxQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwiaXNVcGxvYWRzRGlhbG9nT3BlblwiXHJcbiAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdC5pZFwiXHJcbiAgICAgIDptb2RlbC1pZD1cIm1vZGVsLmlkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTozODo1XCJcclxuICAgIC8+XHJcbiAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkUmVtb3ZlU3luY0RpYWxvZ1xyXG4gICAgICB2LWlmPVwiYWNjU3luY0l0ZW1cIlxyXG4gICAgICB2LW1vZGVsOm9wZW49XCJpc1JlbW92ZVN5bmNEaWFsb2dPcGVuXCJcclxuICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0LmlkXCJcclxuICAgICAgOnN5bmMtaXRlbT1cImFjY1N5bmNJdGVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9BY3Rpb25zLnZ1ZTo0Mzo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB0eXBlIHtcclxuICBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNGcmFnbWVudCxcclxuICBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfUHJvamVjdEZyYWdtZW50XHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0TWVudUl0ZW0gfSBmcm9tICd+fi9saWIvbGF5b3V0L2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlQ29weU1vZGVsTGluayB9IGZyb20gJ35+L2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9tb2RlbE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IEVsbGlwc2lzSG9yaXpvbnRhbEljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9zb2xpZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgSG9yaXpvbnRhbERpcmVjdGlvbiB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvd2luZG93J1xyXG5pbXBvcnQgeyB1c2VBY3RpdmVVc2VyIH0gZnJvbSAnfn4vbGliL2F1dGgvY29tcG9zYWJsZXMvYWN0aXZlVXNlcidcclxuaW1wb3J0IHsgbW9kZWxWZXJzaW9uc1JvdXRlIH0gZnJvbSAnfi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB7IHVzZVdvcmtzcGFjZVBsYW4gfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL3BsYW4nXHJcbmltcG9ydCB7IHVzZVVwZGF0ZUFjY1N5bmNJdGVtIH0gZnJvbSAnfi9saWIvYWNjL2NvbXBvc2FibGVzL3VzZVVwZGF0ZUFjY1N5bmNJdGVtJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdFBhZ2VNb2RlbHNBY3Rpb25zIG9uIE1vZGVsIHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhblVwZGF0ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGNhbkRlbGV0ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGNhbkNyZWF0ZVZlcnNpb24ge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWNjU3luY0l0ZW0ge1xyXG4gICAgICBpZFxyXG4gICAgICAuLi5Qcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfQWNjU3luY0l0ZW1cclxuICAgIH1cclxuICAgIC4uLlVzZUNvcHlNb2RlbExpbmtfTW9kZWxcclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNfUHJvamVjdCBvbiBQcm9qZWN0IHtcclxuICAgIGlkXHJcbiAgICB3b3Jrc3BhY2Uge1xyXG4gICAgICBpZFxyXG4gICAgICBzbHVnXHJcbiAgICB9XHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhblJlYWRBY2NJbnRlZ3JhdGlvblNldHRpbmdzIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlByb2plY3RzTW9kZWxQYWdlRW1iZWRfUHJvamVjdFxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19BY2NTeW5jSXRlbSBvbiBBY2NTeW5jSXRlbSB7XHJcbiAgICBpZFxyXG4gICAgYWNjRmlsZU5hbWVcclxuICAgIHN0YXR1c1xyXG4gIH1cclxuYClcclxuXHJcbmVudW0gQWN0aW9uVHlwZXMge1xyXG4gIFJlbmFtZSA9ICdyZW5hbWUnLFxyXG4gIERlbGV0ZSA9ICdkZWxldGUnLFxyXG4gIFNoYXJlID0gJ3NoYXJlJyxcclxuICBWaWV3VmVyc2lvbnMgPSAndmlldy12ZXJzaW9ucycsXHJcbiAgVXBsb2FkVmVyc2lvbiA9ICd1cGxvYWQtdmVyc2lvbicsXHJcbiAgVG9nZ2xlU3luY1BhdXNlID0gJ3RvZ2dsZS1zeW5jLXBhdXNlJyxcclxuICBEZWxldGVTeW5jID0gJ2RlbGV0ZS1zeW5jJyxcclxuICBDb3B5SWQgPSAnY29weS1pZCcsXHJcbiAgRW1iZWQgPSAnZW1iZWQnLFxyXG4gIFZpZXdVcGxvYWRzID0gJ3ZpZXctdXBsb2FkcydcclxufVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTpvcGVuJywgdjogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ21vZGVsLXVwZGF0ZWQnKTogdm9pZFxyXG4gIChlOiAndXBsb2FkLXZlcnNpb24nKTogdm9pZFxyXG4gIChlOiAnZW1iZWQnKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBvcGVuPzogYm9vbGVhblxyXG4gIG1vZGVsOiBQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNGcmFnbWVudFxyXG4gIHByb2plY3Q6IFByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19Qcm9qZWN0RnJhZ21lbnRcclxuICBtZW51UG9zaXRpb24/OiBIb3Jpem9udGFsRGlyZWN0aW9uXHJcbiAgbW91bnRNZW51T25Cb2R5PzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCBjb3B5TW9kZWxMaW5rID0gdXNlQ29weU1vZGVsTGluaygpXHJcbmNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuY29uc3QgbWVudUlkID0gdXNlSWQoKVxyXG5jb25zdCB7IGlzTG9nZ2VkSW4gfSA9IHVzZUFjdGl2ZVVzZXIoKVxyXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgeyBzdGF0dXNJc0NhbmNlbGVkIH0gPSB1c2VXb3Jrc3BhY2VQbGFuKHByb3BzLnByb2plY3Qud29ya3NwYWNlPy5zbHVnIHx8ICcnKVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBvcGVuRGlhbG9nID0gcmVmKG51bGwgYXMgTnVsbGFibGU8QWN0aW9uVHlwZXM+KVxyXG5cclxuY29uc3QgYWNjU3luY0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5hY2NTeW5jSXRlbSlcclxuY29uc3QgdXBkYXRlQWNjU3luY0l0ZW0gPSB1c2VVcGRhdGVBY2NTeW5jSXRlbSgpXHJcblxyXG5jb25zdCBjYW5FZGl0ID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMubW9kZWwucGVybWlzc2lvbnMuY2FuVXBkYXRlKVxyXG5jb25zdCBjYW5EZWxldGUgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5wZXJtaXNzaW9ucy5jYW5EZWxldGUpXHJcbmNvbnN0IGNhbkNyZWF0ZVZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5tb2RlbC5wZXJtaXNzaW9ucy5jYW5DcmVhdGVWZXJzaW9uKVxyXG5jb25zdCBjYW5FZGl0QWNjU3luYyA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb3BzLnByb2plY3QucGVybWlzc2lvbnMuY2FuUmVhZEFjY0ludGVncmF0aW9uU2V0dGluZ3NcclxuKVxyXG5cclxuY29uc3QgdXBsb2FkVmVyc2lvbkRpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChjYW5DcmVhdGVWZXJzaW9uLnZhbHVlLmNvZGUgPT09ICdXT1JLU1BBQ0VTX05PVF9BVVRIT1JJWkVEX0VSUk9SJykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHRvb2x0aXA6IGBZb3VyIHByb2plY3Qgcm9sZSBkb2Vzbid0IGFsbG93IGNyZWF0aW5nIG5ldyBtb2RlbCB2ZXJzaW9uc2BcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHN0YXR1c0lzQ2FuY2VsZWQudmFsdWUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgICB0b29sdGlwOlxyXG4gICAgICAgIFwiVGhlIHdvcmtzcGFjZSdzIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxsZWQsIHNvIG5vIG5ldyBtb2RlbCB2ZXJzaW9ucyBjYW4gYmUgY3JlYXRlZFwiXHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICghY2FuQ3JlYXRlVmVyc2lvbi52YWx1ZS5hdXRob3JpemVkKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgdG9vbHRpcDogY2FuQ3JlYXRlVmVyc2lvbi52YWx1ZS5tZXNzYWdlIHx8ICdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgdG9vbHRpcDogJydcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBhY3Rpb25zSXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IFtcclxuICAuLi4oaXNMb2dnZWRJbi52YWx1ZVxyXG4gICAgPyBbXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogJ0VkaXQgbW9kZWwuLi4nLFxyXG4gICAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuUmVuYW1lLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogIWNhbkVkaXQudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgICAgZGlzYWJsZWRUb29sdGlwOiBjYW5FZGl0LnZhbHVlLm1lc3NhZ2UgfHwgJ0luc3VmZmljaWVudCBwZXJtaXNzaW9ucydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIF1cclxuICAgIDogW10pLFxyXG4gIGFjY1N5bmNJdGVtLnZhbHVlXHJcbiAgICA/IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTpcclxuICAgICAgICAgICAgYWNjU3luY0l0ZW0udmFsdWU/LnN0YXR1cyA9PT0gJ3BhdXNlZCcgPyAnUmVzdW1lIHN5bmMuLi4nIDogJ1BhdXNlIHN5bmMuLi4nLFxyXG4gICAgICAgICAgaWQ6IEFjdGlvblR5cGVzLlRvZ2dsZVN5bmNQYXVzZSxcclxuICAgICAgICAgIGRpc2FibGVkOiAhY2FuRWRpdEFjY1N5bmMudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuRWRpdEFjY1N5bmMudmFsdWUubWVzc2FnZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdSZW1vdmUgc3luYy4uLicsXHJcbiAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuRGVsZXRlU3luYyxcclxuICAgICAgICAgIGRpc2FibGVkOiAhY2FuRWRpdEFjY1N5bmMudmFsdWUuYXV0aG9yaXplZCxcclxuICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogY2FuRWRpdEFjY1N5bmMudmFsdWUubWVzc2FnZVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdWaWV3IHZlcnNpb25zJyxcclxuICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5WaWV3VmVyc2lvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnVmlldyB1cGxvYWRzJyxcclxuICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5WaWV3VXBsb2Fkc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGlzTG9nZ2VkSW4udmFsdWVcclxuICAgICAgICAgID8gW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnVXBsb2FkIG5ldyB2ZXJzaW9uLi4uJyxcclxuICAgICAgICAgICAgICAgIGlkOiBBY3Rpb25UeXBlcy5VcGxvYWRWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHVwbG9hZFZlcnNpb25EaXNhYmxlZC52YWx1ZS5kaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkVG9vbHRpcDogdXBsb2FkVmVyc2lvbkRpc2FibGVkLnZhbHVlLnRvb2x0aXBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIDogW10pXHJcbiAgICAgIF0sXHJcbiAgW1xyXG4gICAgeyB0aXRsZTogJ0NvcHkgbGluaycsIGlkOiBBY3Rpb25UeXBlcy5TaGFyZSB9LFxyXG4gICAgeyB0aXRsZTogJ0NvcHkgSUQnLCBpZDogQWN0aW9uVHlwZXMuQ29weUlkIH0sXHJcbiAgICB7IHRpdGxlOiAnRW1iZWQgbW9kZWwuLi4nLCBpZDogQWN0aW9uVHlwZXMuRW1iZWQgfVxyXG4gIF0sXHJcbiAgLi4uKGlzTG9nZ2VkSW4udmFsdWVcclxuICAgID8gW1xyXG4gICAgICAgIFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUuLi4nLFxyXG4gICAgICAgICAgICBpZDogQWN0aW9uVHlwZXMuRGVsZXRlLFxyXG4gICAgICAgICAgICAvLyBUT0RPOlxyXG4gICAgICAgICAgICBkaXNhYmxlZDogIWNhbkRlbGV0ZS52YWx1ZS5hdXRob3JpemVkLFxyXG4gICAgICAgICAgICBkaXNhYmxlZFRvb2x0aXA6IGNhbkRlbGV0ZS52YWx1ZS5tZXNzYWdlIHx8ICdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICBdXHJcbiAgICA6IFtdKVxyXG5dKVxyXG5cclxuY29uc3QgaXNSZW5hbWVEaWFsb2dPcGVuID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gb3BlbkRpYWxvZy52YWx1ZSA9PT0gQWN0aW9uVHlwZXMuUmVuYW1lLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5SZW5hbWUgOiBudWxsKVxyXG59KVxyXG5jb25zdCBpc0RlbGV0ZURpYWxvZ09wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBvcGVuRGlhbG9nLnZhbHVlID09PSBBY3Rpb25UeXBlcy5EZWxldGUsXHJcbiAgc2V0OiAoaXNPcGVuKSA9PiAob3BlbkRpYWxvZy52YWx1ZSA9IGlzT3BlbiA/IEFjdGlvblR5cGVzLkRlbGV0ZSA6IG51bGwpXHJcbn0pXHJcbmNvbnN0IGlzRW1iZWREaWFsb2dPcGVuID0gY29tcHV0ZWQoe1xyXG4gIGdldDogKCkgPT4gb3BlbkRpYWxvZy52YWx1ZSA9PT0gQWN0aW9uVHlwZXMuRW1iZWQsXHJcbiAgc2V0OiAoaXNPcGVuKSA9PiAob3BlbkRpYWxvZy52YWx1ZSA9IGlzT3BlbiA/IEFjdGlvblR5cGVzLkVtYmVkIDogbnVsbClcclxufSlcclxuY29uc3QgaXNVcGxvYWRzRGlhbG9nT3BlbiA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+IG9wZW5EaWFsb2cudmFsdWUgPT09IEFjdGlvblR5cGVzLlZpZXdVcGxvYWRzLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5WaWV3VXBsb2FkcyA6IG51bGwpXHJcbn0pXHJcbmNvbnN0IGlzUmVtb3ZlU3luY0RpYWxvZ09wZW4gPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiBvcGVuRGlhbG9nLnZhbHVlID09PSBBY3Rpb25UeXBlcy5EZWxldGVTeW5jLFxyXG4gIHNldDogKGlzT3BlbikgPT4gKG9wZW5EaWFsb2cudmFsdWUgPSBpc09wZW4gPyBBY3Rpb25UeXBlcy5EZWxldGVTeW5jIDogbnVsbClcclxufSlcclxuXHJcbmNvbnN0IG9uQWN0aW9uQ2hvc2VuID0gKHBhcmFtczogeyBpdGVtOiBMYXlvdXRNZW51SXRlbTsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4ge1xyXG4gIGNvbnN0IHsgaXRlbSB9ID0gcGFyYW1zXHJcblxyXG4gIHN3aXRjaCAoaXRlbS5pZCkge1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5SZW5hbWU6XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLkRlbGV0ZTpcclxuICAgIGNhc2UgQWN0aW9uVHlwZXMuRW1iZWQ6XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLlZpZXdVcGxvYWRzOlxyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5EZWxldGVTeW5jOlxyXG4gICAgICBvcGVuRGlhbG9nLnZhbHVlID0gaXRlbS5pZFxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5Ub2dnbGVTeW5jUGF1c2U6XHJcbiAgICAgIGlmICghYWNjU3luY0l0ZW0udmFsdWUpIHJldHVyblxyXG4gICAgICB1cGRhdGVBY2NTeW5jSXRlbShcclxuICAgICAgICBwcm9wcy5wcm9qZWN0LmlkLFxyXG4gICAgICAgIGFjY1N5bmNJdGVtLnZhbHVlPy5pZCxcclxuICAgICAgICBhY2NTeW5jSXRlbS52YWx1ZS5zdGF0dXMgPT09ICdwYXVzZWQnID8gJ3BlbmRpbmcnIDogJ3BhdXNlZCdcclxuICAgICAgKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5TaGFyZTpcclxuICAgICAgbXAudHJhY2soJ0JyYW5jaCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnc2hhcmUnIH0pXHJcbiAgICAgIHZvaWQgY29weU1vZGVsTGluayh7IG1vZGVsOiBwcm9wcy5tb2RlbCB9KVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5WaWV3VmVyc2lvbnM6XHJcbiAgICAgIHJvdXRlci5wdXNoKG1vZGVsVmVyc2lvbnNSb3V0ZShwcm9wcy5wcm9qZWN0LmlkLCBwcm9wcy5tb2RlbC5pZCkpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLlVwbG9hZFZlcnNpb246XHJcbiAgICAgIGVtaXQoJ3VwbG9hZC12ZXJzaW9uJylcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgQWN0aW9uVHlwZXMuQ29weUlkOlxyXG4gICAgICBjb3B5KHByb3BzLm1vZGVsLmlkLCB7IHN1Y2Nlc3NNZXNzYWdlOiAnQ29waWVkIG1vZGVsIElEIHRvIGNsaXBib2FyZCcgfSlcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uQnV0dG9uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgc2hvd0FjdGlvbnNNZW51LnZhbHVlID0gIXNob3dBY3Rpb25zTWVudS52YWx1ZVxyXG59XHJcblxyXG5jb25zdCBzaG93VXBsb2FkcyA9ICgpID0+IHtcclxuICBvcGVuRGlhbG9nLnZhbHVlID0gQWN0aW9uVHlwZXMuVmlld1VwbG9hZHNcclxufVxyXG5cclxuLy8gZG9pbmcgaXQgdGhpcyB3YXkgd2l0aCAyIHdhdGNoZXJzIHNvIHRoYXQgdXNpbmcgdGhlICdvcGVuJyBwcm9wIGlzIG9wdGlvbmFsXHJcbndhdGNoKHNob3dBY3Rpb25zTWVudSwgKG5ld1ZhbCkgPT4gZW1pdCgndXBkYXRlOm9wZW4nLCBuZXdWYWwpKVxyXG53YXRjaChcclxuICAoKSA9PiBwcm9wcy5vcGVuIHx8IGZhbHNlLFxyXG4gIChuZXdWYWwpID0+IChzaG93QWN0aW9uc01lbnUudmFsdWUgPSBuZXdWYWwpXHJcbilcclxuXHJcbmRlZmluZUV4cG9zZSh7XHJcbiAgc2hvd1VwbG9hZHNcclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQWN0aW9ucy52dWUifQ==