import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/pages/projects/[id]/index.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/projects/invite/Banner.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/projects/MoveToWorkspaceAlert.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/project/page/Header.vue"; import { CommonBadge as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { UserAvatarGroup as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_5 } from "/_nuxt/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29"; import { FormButton as __nuxt_component_6 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutMenu as __nuxt_component_7 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_8 } from "/_nuxt/node_modules/nuxt/dist/pages/runtime/page.js?v=e4f18c29"; import { default as __nuxt_component_9 } from "/_nuxt/components/workspace/moveProject/index.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createElementBlock as __createElementBlock,createBlock as __createBlock,createElementVNode as __createElementVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...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 { useQuery } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29"; import { Roles, RoleInfo } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { projectPageQuery } from "/_nuxt/lib/projects/graphql/queries.ts"; import { useGeneralProjectPageUpdateTracking } from "/_nuxt/lib/projects/composables/projectPages.ts"; import { LayoutTabsHorizontal } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { projectRoute, projectWebhooksRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { EllipsisHorizontalIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29"; import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts"; import { useCopyProjectLink } from "/_nuxt/lib/projects/composables/projectManagement.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { definePageMeta } from "/_nuxt/node_modules/nuxt/dist/pages/runtime/composables.js?v=e4f18c29"; import { navigateTo, useRoute, useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; import { useActiveUser, usePageQueryStandardFetchPolicy, useIsAutomateModuleEnabled, useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts"; import { computed, ref, useId } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useHead } from "/_nuxt/node_modules/nuxt/dist/app/composables/head.js?v=e4f18c29"; var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => { ActionTypes2["CopyLink"] = "copy-link"; ActionTypes2["Move"] = "move"; return ActionTypes2; })(ActionTypes || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "index", setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ProjectPageProject on Project { id createdAt modelCount: models(limit: 0) { totalCount } commentThreadCount: commentThreads(limit: 0) { totalCount } workspace { id permissions { canListDashboards { ...FullPermissionCheckResult } } } permissions { canReadSettings { ...FullPermissionCheckResult } canUpdate { ...FullPermissionCheckResult } canMoveToWorkspace { ...FullPermissionCheckResult } } ...ProjectPageTeamInternals_Project ...ProjectPageProjectHeader ...ProjectPageTeamDialog ...WorkspaceMoveProjectManager_ProjectBase ...ProjectPageSettingsTab_Project ...WorkspaceMoveProject_Project hasAccessToDashboards: hasAccessToFeature(featureName: dashboards) } `); definePageMeta({ middleware: [ "require-valid-project", function(to) { const projectId2 = to.params.id; if (/\/models\/?$/i.test(to.path)) { return navigateTo(projectRoute(projectId2)); } if (/\/projects\/\w*?\/webhooks/i.test(to.path)) { return navigateTo(projectWebhooksRoute(projectId2)); } } ], alias: ["/projects/:id/models", "/projects/:id/webhooks"] }); const route = useRoute(); const router = useRouter(); const copyProjectLink = useCopyProjectLink(); const { isLoggedIn } = useActiveUser(); const mixpanel = useMixpanel(); const projectId = computed(() => route.params.id); const token = computed(() => route.query.token); const pageFetchPolicy = usePageQueryStandardFetchPolicy(); useGeneralProjectPageUpdateTracking({ projectId }, { notifyOnProjectUpdate: true }); const { result: projectPageResult } = useQuery( projectPageQuery, () => ({ id: projectId.value, ...token.value?.length ? { token: token.value } : {} }), () => ({ fetchPolicy: pageFetchPolicy.value }) ); const showActionsMenu = ref(false); const menuId = useId(); const showMoveDialog = ref(false); const project = computed(() => projectPageResult.value?.project); const invite = computed(() => projectPageResult.value?.projectInvite || void 0); const projectName = computed( () => project.value?.name.length ? project.value.name : "" ); const modelCount = computed(() => project.value?.modelCount.totalCount); const commentCount = computed(() => project.value?.commentThreadCount.totalCount); const canListDashboards = computed( () => project.value?.workspace?.permissions.canListDashboards.authorized ); const canReadSettings = computed(() => project.value?.permissions.canReadSettings); const canUpdate = computed(() => project.value?.permissions.canUpdate); const hasRole = computed(() => project.value?.role); const teamUsers = computed(() => project.value?.team.map((t) => t.user) || []); const actionsItems = computed(() => { const items = [ [ { title: "Copy link", id: "copy-link" /* CopyLink */ } ] ]; if (isWorkspacesEnabled.value && !project.value?.workspace?.id && hasRole.value) { items.push([ { title: "Move project...", id: "move" /* Move */, disabled: !isOwner.value, disabledTooltip: "Only the project owner can move this project into a workspace" } ]); } return items; }); useHead({ title: projectName, meta: [ { name: "robots", content: "noindex, nofollow" } ] }); const onInviteAccepted = async (params) => { if (params.accepted) { await router.replace({ query: { ...route.query, accept: void 0, token: void 0 } }); } }; const isOwner = computed(() => project.value?.role === Roles.Stream.Owner); const isAutomateEnabled = useIsAutomateModuleEnabled(); const isWorkspacesEnabled = useIsWorkspacesEnabled(); const pageTabItems = computed(() => { const items = [ { title: "Models", id: "models", count: modelCount.value }, { title: "Discussions", id: "discussions", count: commentCount.value } ]; if (isAutomateEnabled.value && project.value?.workspace && project.value?.workspace?.role !== Roles.Workspace.Guest) { items.push({ title: "Automations", id: "automations" }); } if (canReadSettings.value?.authorized) { items.push({ title: "Collaborators", id: "collaborators" }); items.push({ title: "Settings", id: "settings" }); } if (project.value?.hasAccessToDashboards && canListDashboards.value) { items.push({ title: "Dashboards", id: "dashboards" }); } return items; }); const findTabById = (id) => pageTabItems.value.find((tab) => tab.id === id) || pageTabItems.value[0]; const collaboratorsTooltip = computed( () => canReadSettings.value?.authorized ? canUpdate.value?.authorized ? "Manage collaborators" : "View collaborators" : null ); const activePageTab = computed({ get: () => { const path = router.currentRoute.value.path; if (/\/discussions\/?$/i.test(path)) return findTabById("discussions"); if (/\/automations\/?.*$/i.test(path)) return findTabById("automations"); if (/\/acc\/?.*$/i.test(path)) return findTabById("acc"); if (/\/dashboards\/?/i.test(path)) return findTabById("dashboards"); if (/\/collaborators\/?/i.test(path) && canReadSettings.value?.authorized) return findTabById("collaborators"); if (/\/settings\/?/i.test(path) && canReadSettings.value?.authorized) return findTabById("settings"); return findTabById("models"); }, set: (val) => { if (!val) return; switch (val.id) { case "models": router.push({ path: projectRoute(projectId.value, "models") }); break; case "discussions": router.push({ path: projectRoute(projectId.value, "discussions") }); break; case "acc": router.push({ path: projectRoute(projectId.value, "acc") }); break; case "automations": router.push({ path: projectRoute(projectId.value, "automations") }); break; case "collaborators": if (canReadSettings.value?.authorized) { router.push({ path: projectRoute(projectId.value, "collaborators") }); } break; case "dashboards": if (project.value?.hasAccessToDashboards) { router.push({ path: projectRoute(projectId.value, "dashboards") }); } break; case "settings": if (canReadSettings.value?.authorized) { router.push({ path: projectRoute(projectId.value, "settings") }); } break; } } }); const shouldShowWorkspaceAlert = computed( () => isWorkspacesEnabled.value && isLoggedIn.value && !project.value?.workspace && hasRole.value ); const disableLegacyMoveProjectButton = computed( () => !project.value?.permissions.canMoveToWorkspace.authorized ); const onMoveProject = () => { mixpanel.track("Move Project CTA Clicked", { location: "project" }); showMoveDialog.value = true; }; const onActionChosen = (params) => { const { item } = params; switch (item.id) { case "copy-link" /* CopyLink */: copyProjectLink(projectId.value); break; case "move" /* Move */: onMoveProject(); break; } }; const __returned__ = { ActionTypes, route, router, copyProjectLink, isLoggedIn, mixpanel, projectId, token, pageFetchPolicy, projectPageResult, showActionsMenu, menuId, showMoveDialog, project, invite, projectName, modelCount, commentCount, canListDashboards, canReadSettings, canUpdate, hasRole, teamUsers, actionsItems, onInviteAccepted, isOwner, isAutomateEnabled, isWorkspacesEnabled, pageTabItems, findTabById, collaboratorsTooltip, activePageTab, shouldShowWorkspaceAlert, disableLegacyMoveProjectButton, onMoveProject, onActionChosen, get RoleInfo() { return RoleInfo; }, get LayoutTabsHorizontal() { return LayoutTabsHorizontal; }, get projectRoute() { return projectRoute; }, get EllipsisHorizontalIcon() { return EllipsisHorizontalIcon; }, get HorizontalDirection() { return HorizontalDirection; } }; 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, resolveDirective as _resolveDirective, withDirectives as _withDirectives, withModifiers as _withModifiers } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "pages/projects/[id]/index.vue:2:3" }; const _hoisted_2 = { key: 0, "data-v-inspector": "pages/projects/[id]/index.vue:3:5" }; const _hoisted_3 = { key: 0, class: "mb-4", "data-v-inspector": "pages/projects/[id]/index.vue:4:7" }; const _hoisted_4 = { class: "flex flex-col md:flex-row md:justify-between md:items-center gap-6 mb-6", "data-v-inspector": "pages/projects/[id]/index.vue:18:7" }; const _hoisted_5 = { class: "flex gap-x-3 items-center justify-between", "data-v-inspector": "pages/projects/[id]/index.vue:22:9" }; const _hoisted_6 = { class: "flex flex-row gap-x-3", "data-v-inspector": "pages/projects/[id]/index.vue:23:11" }; const _hoisted_7 = { class: "flex flex-row gap-x-3", "data-v-inspector": "pages/projects/[id]/index.vue:28:11" }; const _hoisted_8 = { "data-v-inspector": "pages/projects/[id]/index.vue:29:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ProjectsInviteBanner = __nuxt_component_0; const _component_ProjectsMoveToWorkspaceAlert = __nuxt_component_1; const _component_ProjectPageHeader = __nuxt_component_2; const _component_CommonBadge = __nuxt_component_3; const _component_UserAvatarGroup = __nuxt_component_4; const _component_NuxtLink = __nuxt_component_5; const _component_FormButton = __nuxt_component_6; const _component_LayoutMenu = __nuxt_component_7; const _component_NuxtPage = __nuxt_component_8; const _component_WorkspaceMoveProject = __nuxt_component_9; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ $setup.project ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ $setup.invite ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ _createVNode(_component_ProjectsInviteBanner, { invite: $setup.invite, "show-project-name": false, onProcessed: $setup.onInviteAccepted, "data-v-inspector": "pages/projects/[id]/index.vue:5:9" }, null, 8, ["invite"]) ])) : _createCommentVNode("v-if", true), $setup.shouldShowWorkspaceAlert ? (_openBlock(), _createBlock(_component_ProjectsMoveToWorkspaceAlert, { key: 1, "disable-button": $setup.disableLegacyMoveProjectButton, "project-id": $setup.project.id, onMoveProject: $setup.onMoveProject, "data-v-inspector": "pages/projects/[id]/index.vue:11:7" }, null, 8, ["disable-button", "project-id"])) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_4, [ _createVNode(_component_ProjectPageHeader, { project: $setup.project, "data-v-inspector": "pages/projects/[id]/index.vue:21:9" }, null, 8, ["project"]), _createElementVNode("div", _hoisted_5, [ _createElementVNode("div", _hoisted_6, [ $setup.project.role ? (_openBlock(), _createBlock(_component_CommonBadge, { key: 0, rounded: "", color: "secondary", "data-v-inspector": "pages/projects/[id]/index.vue:24:13" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.RoleInfo.Stream[$setup.project.role].title), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true) ]), _createElementVNode("div", _hoisted_7, [ _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_8, [ _createVNode(_component_NuxtLink, { to: $setup.canReadSettings?.authorized ? $setup.projectRoute($setup.project.id, "collaborators") : "", "data-v-inspector": "pages/projects/[id]/index.vue:30:15" }, { default: _withCtx(() => [ _createVNode(_component_UserAvatarGroup, { users: $setup.teamUsers, "max-count": 2, class: "max-w-[104px]", "hide-tooltips": "", "data-v-inspector": "pages/projects/[id]/index.vue:37:17" }, null, 8, ["users"]) ]), _: 1 /* STABLE */ }, 8, ["to"]) ])), [ [_directive_tippy, $setup.collaboratorsTooltip] ]) ]), _createVNode(_component_LayoutMenu, { open: $setup.showActionsMenu, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event), items: $setup.actionsItems, "menu-position": $setup.HorizontalDirection.Left, "menu-id": $setup.menuId, onClick: _cache[2] || (_cache[2] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "pages/projects/[id]/index.vue:46:11" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { color: "subtle", "hide-text": "", "icon-right": $setup.EllipsisHorizontalIcon, onClick: _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = !$setup.showActionsMenu), "data-v-inspector": "pages/projects/[id]/index.vue:54:13" }, null, 8, ["icon-right"]) ]), _: 1 /* STABLE */ }, 8, ["open", "items", "menu-position", "menu-id"]) ]) ]), _createVNode($setup["LayoutTabsHorizontal"], { "active-item": $setup.activePageTab, "onUpdate:activeItem": _cache[3] || (_cache[3] = ($event) => $setup.activePageTab = $event), items: $setup.pageTabItems, "data-v-inspector": "pages/projects/[id]/index.vue:63:7" }, { default: _withCtx(() => [ _createVNode(_component_NuxtPage, { project: $setup.project, "data-v-inspector": "pages/projects/[id]/index.vue:64:9" }, null, 8, ["project"]) ]), _: 1 /* STABLE */ }, 8, ["active-item", "items"]) ])) : _createCommentVNode("v-if", true), $setup.project && $setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_WorkspaceMoveProject, { key: 1, open: $setup.showMoveDialog, "onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showMoveDialog = $event), "event-source": "project-page", project: $setup.project, "data-v-inspector": "pages/projects/[id]/index.vue:68:5" }, null, 8, ["open", "project"])) : _createCommentVNode("v-if", true) ]); } _sfc_main.__hmrId = "0774e42a"; 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/pages/projects/[id]/index.vue"]]); //# sourceMappingURL=data:application/json;base64,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bkMsV0FBUztBQUFBLFlBQ1QsU0FBSyx5Q0FBTjtBQUFBLGVBQW1CO0FBQUEsWUFDbEIsVUFBUTtBQUFBLFlBQWdCLG9CQUFpQjtBQUFBOzhCQUUxQyxNQUtFO0FBQUEsY0FMRixhQUtFO0FBQUEsZ0JBSkEsT0FBTTtBQUFBLGdCQUNOO0FBQUEsZ0JBQ0MsY0FBWTtBQUFBLGdCQUNaLFNBQUssc0NBQUUseUJBQWUsQ0FBSTtBQUFBLGdCQUFpQixvQkFBaUI7QUFBQTs7Ozs7OztNQUtyRSxhQUV1QjtBQUFBLFFBRk8sZUFBYTtBQUFBLDRGQUFhO0FBQUEsUUFBRyxPQUFPO0FBQUEsUUFBYyxvQkFBaUI7QUFBQTswQkFDL0YsTUFBcUY7QUFBQSxVQUFyRixhQUFxRjtBQUFBLFlBQTFFLFNBQVM7QUFBQSxZQUFTLG9CQUFpQjtBQUFBOzs7Ozs7SUFLMUMsa0JBQVcsNENBRG5CLGFBS0U7QUFBQTtNQUhRLE1BQU07QUFBQSxxRkFBYztBQUFBLE1BQzVCLGdCQUFhO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFBUyxvQkFBaUI7QUFBQSIsIm5hbWVzIjpbIkFjdGlvblR5cGVzIiwicHJvamVjdElkIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImluZGV4LnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6MjozXCI+XHJcbiAgICA8ZGl2IHYtaWY9XCJwcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjM6NVwiPlxyXG4gICAgICA8ZGl2IHYtaWY9XCJpbnZpdGVcIiBjbGFzcz1cIm1iLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6NDo3XCI+XHJcbiAgICAgICAgPFByb2plY3RzSW52aXRlQmFubmVyXHJcbiAgICAgICAgICA6aW52aXRlPVwiaW52aXRlXCJcclxuICAgICAgICAgIDpzaG93LXByb2plY3QtbmFtZT1cImZhbHNlXCJcclxuICAgICAgICAgIEBwcm9jZXNzZWQ9XCJvbkludml0ZUFjY2VwdGVkXCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjU6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxQcm9qZWN0c01vdmVUb1dvcmtzcGFjZUFsZXJ0XHJcbiAgICAgICAgdi1pZj1cInNob3VsZFNob3dXb3Jrc3BhY2VBbGVydFwiXHJcbiAgICAgICAgOmRpc2FibGUtYnV0dG9uPVwiZGlzYWJsZUxlZ2FjeU1vdmVQcm9qZWN0QnV0dG9uXCJcclxuICAgICAgICA6cHJvamVjdC1pZD1cInByb2plY3QuaWRcIlxyXG4gICAgICAgIEBtb3ZlLXByb2plY3Q9XCJvbk1vdmVQcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjExOjdcIlxyXG4gICAgICAvPlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBtZDpqdXN0aWZ5LWJldHdlZW4gbWQ6aXRlbXMtY2VudGVyIGdhcC02IG1iLTZcIiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6MTg6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8UHJvamVjdFBhZ2VIZWFkZXIgOnByb2plY3Q9XCJwcm9qZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjIxOjlcIiAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC14LTMgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJwYWdlcy9wcm9qZWN0cy9baWRdL2luZGV4LnZ1ZToyMjo5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAteC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjIzOjExXCI+XHJcbiAgICAgICAgICAgIDxDb21tb25CYWRnZSB2LWlmPVwicHJvamVjdC5yb2xlXCIgcm91bmRlZCBjb2xvcj1cInNlY29uZGFyeVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJwYWdlcy9wcm9qZWN0cy9baWRdL2luZGV4LnZ1ZToyNDoxM1wiPlxyXG4gICAgICAgICAgICAgIHt7IFJvbGVJbmZvLlN0cmVhbVtwcm9qZWN0LnJvbGUgYXMgU3RyZWFtUm9sZXNdLnRpdGxlIH19XHJcbiAgICAgICAgICAgIDwvQ29tbW9uQmFkZ2U+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC14LTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6Mjg6MTFcIj5cclxuICAgICAgICAgICAgPGRpdiB2LXRpcHB5PVwiY29sbGFib3JhdG9yc1Rvb2x0aXBcIiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6Mjk6MTNcIj5cclxuICAgICAgICAgICAgICA8TnV4dExpbmtcclxuICAgICAgICAgICAgICAgIDp0bz1cIlxyXG4gICAgICAgICAgICAgICAgICBjYW5SZWFkU2V0dGluZ3M/LmF1dGhvcml6ZWRcclxuICAgICAgICAgICAgICAgICAgICA/IHByb2plY3RSb3V0ZShwcm9qZWN0LmlkLCAnY29sbGFib3JhdG9ycycpXHJcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICAgICAgXCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjMwOjE1XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8VXNlckF2YXRhckdyb3VwXHJcbiAgICAgICAgICAgICAgICAgIDp1c2Vycz1cInRlYW1Vc2Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgIDptYXgtY291bnQ9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtdy1bMTA0cHhdXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZS10b29sdGlwcyBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6Mzc6MTdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L051eHRMaW5rPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgICAgOml0ZW1zPVwiYWN0aW9uc0l0ZW1zXCJcclxuICAgICAgICAgICAgOm1lbnUtcG9zaXRpb249XCJIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnRcIlxyXG4gICAgICAgICAgICA6bWVudS1pZD1cIm1lbnVJZFwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjQ2OjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgOmljb24tcmlnaHQ9XCJFbGxpcHNpc0hvcml6b250YWxJY29uXCJcclxuICAgICAgICAgICAgICBAY2xpY2s9XCJzaG93QWN0aW9uc01lbnUgPSAhc2hvd0FjdGlvbnNNZW51XCIgZGF0YS12LWluc3BlY3Rvcj1cInBhZ2VzL3Byb2plY3RzL1tpZF0vaW5kZXgudnVlOjU0OjEzXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvTGF5b3V0TWVudT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxMYXlvdXRUYWJzSG9yaXpvbnRhbCB2LW1vZGVsOmFjdGl2ZS1pdGVtPVwiYWN0aXZlUGFnZVRhYlwiIDppdGVtcz1cInBhZ2VUYWJJdGVtc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJwYWdlcy9wcm9qZWN0cy9baWRdL2luZGV4LnZ1ZTo2Mzo3XCI+XHJcbiAgICAgICAgPE51eHRQYWdlIDpwcm9qZWN0PVwicHJvamVjdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJwYWdlcy9wcm9qZWN0cy9baWRdL2luZGV4LnZ1ZTo2NDo5XCIgLz5cclxuICAgICAgPC9MYXlvdXRUYWJzSG9yaXpvbnRhbD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxXb3Jrc3BhY2VNb3ZlUHJvamVjdFxyXG4gICAgICB2LWlmPVwicHJvamVjdCAmJiBpc1dvcmtzcGFjZXNFbmFibGVkXCJcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd01vdmVEaWFsb2dcIlxyXG4gICAgICBldmVudC1zb3VyY2U9XCJwcm9qZWN0LXBhZ2VcIlxyXG4gICAgICA6cHJvamVjdD1cInByb2plY3RcIiBkYXRhLXYtaW5zcGVjdG9yPVwicGFnZXMvcHJvamVjdHMvW2lkXS9pbmRleC52dWU6Njg6NVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyB1c2VRdWVyeSB9IGZyb20gJ0B2dWUvYXBvbGxvLWNvbXBvc2FibGUnXHJcbmltcG9ydCB7IFJvbGVzLCB0eXBlIE9wdGlvbmFsLCBSb2xlSW5mbywgdHlwZSBTdHJlYW1Sb2xlcyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHsgcHJvamVjdFBhZ2VRdWVyeSB9IGZyb20gJ35+L2xpYi9wcm9qZWN0cy9ncmFwaHFsL3F1ZXJpZXMnXHJcbmltcG9ydCB7IHVzZUdlbmVyYWxQcm9qZWN0UGFnZVVwZGF0ZVRyYWNraW5nIH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Byb2plY3RQYWdlcydcclxuaW1wb3J0IHsgTGF5b3V0VGFic0hvcml6b250YWwsIHR5cGUgTGF5b3V0UGFnZVRhYkl0ZW0gfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBwcm9qZWN0Um91dGUsIHByb2plY3RXZWJob29rc1JvdXRlIH0gZnJvbSAnfi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0TWVudUl0ZW0gfSBmcm9tICd+fi9saWIvbGF5b3V0L2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgRWxsaXBzaXNIb3Jpem9udGFsSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgeyBIb3Jpem9udGFsRGlyZWN0aW9uIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy93aW5kb3cnXHJcbmltcG9ydCB7IHVzZUNvcHlQcm9qZWN0TGluayB9IGZyb20gJ35+L2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9wcm9qZWN0TWFuYWdlbWVudCdcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdFBhZ2VQcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIGNyZWF0ZWRBdFxyXG4gICAgbW9kZWxDb3VudDogbW9kZWxzKGxpbWl0OiAwKSB7XHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICAgIGNvbW1lbnRUaHJlYWRDb3VudDogY29tbWVudFRocmVhZHMobGltaXQ6IDApIHtcclxuICAgICAgdG90YWxDb3VudFxyXG4gICAgfVxyXG4gICAgd29ya3NwYWNlIHtcclxuICAgICAgaWRcclxuICAgICAgcGVybWlzc2lvbnMge1xyXG4gICAgICAgIGNhbkxpc3REYXNoYm9hcmRzIHtcclxuICAgICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuUmVhZFNldHRpbmdzIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgICAgY2FuVXBkYXRlIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgICAgY2FuTW92ZVRvV29ya3NwYWNlIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlByb2plY3RQYWdlVGVhbUludGVybmFsc19Qcm9qZWN0XHJcbiAgICAuLi5Qcm9qZWN0UGFnZVByb2plY3RIZWFkZXJcclxuICAgIC4uLlByb2plY3RQYWdlVGVhbURpYWxvZ1xyXG4gICAgLi4uV29ya3NwYWNlTW92ZVByb2plY3RNYW5hZ2VyX1Byb2plY3RCYXNlXHJcbiAgICAuLi5Qcm9qZWN0UGFnZVNldHRpbmdzVGFiX1Byb2plY3RcclxuICAgIC4uLldvcmtzcGFjZU1vdmVQcm9qZWN0X1Byb2plY3RcclxuICAgIGhhc0FjY2Vzc1RvRGFzaGJvYXJkczogaGFzQWNjZXNzVG9GZWF0dXJlKGZlYXR1cmVOYW1lOiBkYXNoYm9hcmRzKVxyXG4gIH1cclxuYClcclxuXHJcbmRlZmluZVBhZ2VNZXRhKHtcclxuICBtaWRkbGV3YXJlOiBbXHJcbiAgICAncmVxdWlyZS12YWxpZC1wcm9qZWN0JyxcclxuICAgIGZ1bmN0aW9uICh0bykge1xyXG4gICAgICAvLyBSZWRpcmVjdCBmcm9tIC9wcm9qZWN0cy86aWQvbW9kZWxzIHRvIC9wcm9qZWN0cy86aWRcclxuICAgICAgY29uc3QgcHJvamVjdElkID0gdG8ucGFyYW1zLmlkIGFzIHN0cmluZ1xyXG4gICAgICBpZiAoL1xcL21vZGVsc1xcLz8kL2kudGVzdCh0by5wYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0ZVRvKHByb2plY3RSb3V0ZShwcm9qZWN0SWQpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZWRpcmVjdCBmcm9tIC9wcm9qZWN0cy86aWQvd2ViaG9va3MgdG8gL3Byb2plY3RzLzppZC9zZXR0aW5ncy93ZWJob29rc1xyXG4gICAgICBpZiAoL1xcL3Byb2plY3RzXFwvXFx3Kj9cXC93ZWJob29rcy9pLnRlc3QodG8ucGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdGVUbyhwcm9qZWN0V2ViaG9va3NSb3V0ZShwcm9qZWN0SWQpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXSxcclxuICBhbGlhczogWycvcHJvamVjdHMvOmlkL21vZGVscycsICcvcHJvamVjdHMvOmlkL3dlYmhvb2tzJ11cclxufSlcclxuXHJcbmVudW0gQWN0aW9uVHlwZXMge1xyXG4gIENvcHlMaW5rID0gJ2NvcHktbGluaycsXHJcbiAgTW92ZSA9ICdtb3ZlJ1xyXG59XHJcblxyXG5jb25zdCByb3V0ZSA9IHVzZVJvdXRlKClcclxuY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKClcclxuY29uc3QgY29weVByb2plY3RMaW5rID0gdXNlQ29weVByb2plY3RMaW5rKClcclxuY29uc3QgeyBpc0xvZ2dlZEluIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3QgbWl4cGFuZWwgPSB1c2VNaXhwYW5lbCgpXHJcblxyXG5jb25zdCBwcm9qZWN0SWQgPSBjb21wdXRlZCgoKSA9PiByb3V0ZS5wYXJhbXMuaWQgYXMgc3RyaW5nKVxyXG5jb25zdCB0b2tlbiA9IGNvbXB1dGVkKCgpID0+IHJvdXRlLnF1ZXJ5LnRva2VuIGFzIE9wdGlvbmFsPHN0cmluZz4pXHJcblxyXG5jb25zdCBwYWdlRmV0Y2hQb2xpY3kgPSB1c2VQYWdlUXVlcnlTdGFuZGFyZEZldGNoUG9saWN5KClcclxudXNlR2VuZXJhbFByb2plY3RQYWdlVXBkYXRlVHJhY2tpbmcoeyBwcm9qZWN0SWQgfSwgeyBub3RpZnlPblByb2plY3RVcGRhdGU6IHRydWUgfSlcclxuY29uc3QgeyByZXN1bHQ6IHByb2plY3RQYWdlUmVzdWx0IH0gPSB1c2VRdWVyeShcclxuICBwcm9qZWN0UGFnZVF1ZXJ5LFxyXG4gICgpID0+ICh7XHJcbiAgICBpZDogcHJvamVjdElkLnZhbHVlLFxyXG4gICAgLi4uKHRva2VuLnZhbHVlPy5sZW5ndGggPyB7IHRva2VuOiB0b2tlbi52YWx1ZSB9IDoge30pXHJcbiAgfSksXHJcbiAgKCkgPT4gKHtcclxuICAgIGZldGNoUG9saWN5OiBwYWdlRmV0Y2hQb2xpY3kudmFsdWVcclxuICB9KVxyXG4pXHJcblxyXG5jb25zdCBzaG93QWN0aW9uc01lbnUgPSByZWYoZmFsc2UpXHJcbmNvbnN0IG1lbnVJZCA9IHVzZUlkKClcclxuY29uc3Qgc2hvd01vdmVEaWFsb2cgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBwcm9qZWN0ID0gY29tcHV0ZWQoKCkgPT4gcHJvamVjdFBhZ2VSZXN1bHQudmFsdWU/LnByb2plY3QpXHJcbmNvbnN0IGludml0ZSA9IGNvbXB1dGVkKCgpID0+IHByb2plY3RQYWdlUmVzdWx0LnZhbHVlPy5wcm9qZWN0SW52aXRlIHx8IHVuZGVmaW5lZClcclxuY29uc3QgcHJvamVjdE5hbWUgPSBjb21wdXRlZCgoKSA9PlxyXG4gIHByb2plY3QudmFsdWU/Lm5hbWUubGVuZ3RoID8gcHJvamVjdC52YWx1ZS5uYW1lIDogJydcclxuKVxyXG5jb25zdCBtb2RlbENvdW50ID0gY29tcHV0ZWQoKCkgPT4gcHJvamVjdC52YWx1ZT8ubW9kZWxDb3VudC50b3RhbENvdW50KVxyXG5jb25zdCBjb21tZW50Q291bnQgPSBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlPy5jb21tZW50VGhyZWFkQ291bnQudG90YWxDb3VudClcclxuY29uc3QgY2FuTGlzdERhc2hib2FyZHMgPSBjb21wdXRlZChcclxuICAoKSA9PiBwcm9qZWN0LnZhbHVlPy53b3Jrc3BhY2U/LnBlcm1pc3Npb25zLmNhbkxpc3REYXNoYm9hcmRzLmF1dGhvcml6ZWRcclxuKVxyXG5jb25zdCBjYW5SZWFkU2V0dGluZ3MgPSBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlPy5wZXJtaXNzaW9ucy5jYW5SZWFkU2V0dGluZ3MpXHJcblxyXG5jb25zdCBjYW5VcGRhdGUgPSBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlPy5wZXJtaXNzaW9ucy5jYW5VcGRhdGUpXHJcbmNvbnN0IGhhc1JvbGUgPSBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlPy5yb2xlKVxyXG5jb25zdCB0ZWFtVXNlcnMgPSBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlPy50ZWFtLm1hcCgodCkgPT4gdC51c2VyKSB8fCBbXSlcclxuY29uc3QgYWN0aW9uc0l0ZW1zID0gY29tcHV0ZWQ8TGF5b3V0TWVudUl0ZW1bXVtdPigoKSA9PiB7XHJcbiAgY29uc3QgaXRlbXM6IExheW91dE1lbnVJdGVtW11bXSA9IFtcclxuICAgIFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnQ29weSBsaW5rJyxcclxuICAgICAgICBpZDogQWN0aW9uVHlwZXMuQ29weUxpbmtcclxuICAgICAgfVxyXG4gICAgXVxyXG4gIF1cclxuXHJcbiAgaWYgKGlzV29ya3NwYWNlc0VuYWJsZWQudmFsdWUgJiYgIXByb2plY3QudmFsdWU/LndvcmtzcGFjZT8uaWQgJiYgaGFzUm9sZS52YWx1ZSkge1xyXG4gICAgaXRlbXMucHVzaChbXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ01vdmUgcHJvamVjdC4uLicsXHJcbiAgICAgICAgaWQ6IEFjdGlvblR5cGVzLk1vdmUsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICFpc093bmVyLnZhbHVlLFxyXG4gICAgICAgIGRpc2FibGVkVG9vbHRpcDogJ09ubHkgdGhlIHByb2plY3Qgb3duZXIgY2FuIG1vdmUgdGhpcyBwcm9qZWN0IGludG8gYSB3b3Jrc3BhY2UnXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gaXRlbXNcclxufSlcclxuXHJcbnVzZUhlYWQoe1xyXG4gIHRpdGxlOiBwcm9qZWN0TmFtZSxcclxuICBtZXRhOiBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdyb2JvdHMnLFxyXG4gICAgICBjb250ZW50OiAnbm9pbmRleCwgbm9mb2xsb3cnXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5cclxuY29uc3Qgb25JbnZpdGVBY2NlcHRlZCA9IGFzeW5jIChwYXJhbXM6IHsgYWNjZXB0ZWQ6IGJvb2xlYW4gfSkgPT4ge1xyXG4gIGlmIChwYXJhbXMuYWNjZXB0ZWQpIHtcclxuICAgIGF3YWl0IHJvdXRlci5yZXBsYWNlKHtcclxuICAgICAgcXVlcnk6IHsgLi4ucm91dGUucXVlcnksIGFjY2VwdDogdW5kZWZpbmVkLCB0b2tlbjogdW5kZWZpbmVkIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc093bmVyID0gY29tcHV0ZWQoKCkgPT4gcHJvamVjdC52YWx1ZT8ucm9sZSA9PT0gUm9sZXMuU3RyZWFtLk93bmVyKVxyXG5jb25zdCBpc0F1dG9tYXRlRW5hYmxlZCA9IHVzZUlzQXV0b21hdGVNb2R1bGVFbmFibGVkKClcclxuY29uc3QgaXNXb3Jrc3BhY2VzRW5hYmxlZCA9IHVzZUlzV29ya3NwYWNlc0VuYWJsZWQoKVxyXG5cclxuY29uc3QgcGFnZVRhYkl0ZW1zID0gY29tcHV0ZWQoKCk6IExheW91dFBhZ2VUYWJJdGVtW10gPT4ge1xyXG4gIGNvbnN0IGl0ZW1zOiBMYXlvdXRQYWdlVGFiSXRlbVtdID0gW1xyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ01vZGVscycsXHJcbiAgICAgIGlkOiAnbW9kZWxzJyxcclxuICAgICAgY291bnQ6IG1vZGVsQ291bnQudmFsdWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnRGlzY3Vzc2lvbnMnLFxyXG4gICAgICBpZDogJ2Rpc2N1c3Npb25zJyxcclxuICAgICAgY291bnQ6IGNvbW1lbnRDb3VudC52YWx1ZVxyXG4gICAgfVxyXG4gIF1cclxuXHJcbiAgaWYgKFxyXG4gICAgaXNBdXRvbWF0ZUVuYWJsZWQudmFsdWUgJiZcclxuICAgIHByb2plY3QudmFsdWU/LndvcmtzcGFjZSAmJlxyXG4gICAgcHJvamVjdC52YWx1ZT8ud29ya3NwYWNlPy5yb2xlICE9PSBSb2xlcy5Xb3Jrc3BhY2UuR3Vlc3RcclxuICApIHtcclxuICAgIGl0ZW1zLnB1c2goe1xyXG4gICAgICB0aXRsZTogJ0F1dG9tYXRpb25zJyxcclxuICAgICAgaWQ6ICdhdXRvbWF0aW9ucydcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpZiAoY2FuUmVhZFNldHRpbmdzLnZhbHVlPy5hdXRob3JpemVkKSB7XHJcbiAgICBpdGVtcy5wdXNoKHtcclxuICAgICAgdGl0bGU6ICdDb2xsYWJvcmF0b3JzJyxcclxuICAgICAgaWQ6ICdjb2xsYWJvcmF0b3JzJ1xyXG4gICAgfSlcclxuXHJcbiAgICBpdGVtcy5wdXNoKHtcclxuICAgICAgdGl0bGU6ICdTZXR0aW5ncycsXHJcbiAgICAgIGlkOiAnc2V0dGluZ3MnXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb2plY3QudmFsdWU/Lmhhc0FjY2Vzc1RvRGFzaGJvYXJkcyAmJiBjYW5MaXN0RGFzaGJvYXJkcy52YWx1ZSkge1xyXG4gICAgaXRlbXMucHVzaCh7XHJcbiAgICAgIHRpdGxlOiAnRGFzaGJvYXJkcycsXHJcbiAgICAgIGlkOiAnZGFzaGJvYXJkcydcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gaXRlbXNcclxufSlcclxuXHJcbmNvbnN0IGZpbmRUYWJCeUlkID0gKGlkOiBzdHJpbmcpID0+XHJcbiAgcGFnZVRhYkl0ZW1zLnZhbHVlLmZpbmQoKHRhYikgPT4gdGFiLmlkID09PSBpZCkgfHwgcGFnZVRhYkl0ZW1zLnZhbHVlWzBdXHJcblxyXG5jb25zdCBjb2xsYWJvcmF0b3JzVG9vbHRpcCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgY2FuUmVhZFNldHRpbmdzLnZhbHVlPy5hdXRob3JpemVkXHJcbiAgICA/IGNhblVwZGF0ZS52YWx1ZT8uYXV0aG9yaXplZFxyXG4gICAgICA/ICdNYW5hZ2UgY29sbGFib3JhdG9ycydcclxuICAgICAgOiAnVmlldyBjb2xsYWJvcmF0b3JzJ1xyXG4gICAgOiBudWxsXHJcbilcclxuXHJcbmNvbnN0IGFjdGl2ZVBhZ2VUYWIgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiB7XHJcbiAgICBjb25zdCBwYXRoID0gcm91dGVyLmN1cnJlbnRSb3V0ZS52YWx1ZS5wYXRoXHJcbiAgICBpZiAoL1xcL2Rpc2N1c3Npb25zXFwvPyQvaS50ZXN0KHBhdGgpKSByZXR1cm4gZmluZFRhYkJ5SWQoJ2Rpc2N1c3Npb25zJylcclxuICAgIGlmICgvXFwvYXV0b21hdGlvbnNcXC8/LiokL2kudGVzdChwYXRoKSkgcmV0dXJuIGZpbmRUYWJCeUlkKCdhdXRvbWF0aW9ucycpXHJcbiAgICBpZiAoL1xcL2FjY1xcLz8uKiQvaS50ZXN0KHBhdGgpKSByZXR1cm4gZmluZFRhYkJ5SWQoJ2FjYycpXHJcbiAgICBpZiAoL1xcL2Rhc2hib2FyZHNcXC8/L2kudGVzdChwYXRoKSkgcmV0dXJuIGZpbmRUYWJCeUlkKCdkYXNoYm9hcmRzJylcclxuICAgIGlmICgvXFwvY29sbGFib3JhdG9yc1xcLz8vaS50ZXN0KHBhdGgpICYmIGNhblJlYWRTZXR0aW5ncy52YWx1ZT8uYXV0aG9yaXplZClcclxuICAgICAgcmV0dXJuIGZpbmRUYWJCeUlkKCdjb2xsYWJvcmF0b3JzJylcclxuICAgIGlmICgvXFwvc2V0dGluZ3NcXC8/L2kudGVzdChwYXRoKSAmJiBjYW5SZWFkU2V0dGluZ3MudmFsdWU/LmF1dGhvcml6ZWQpXHJcbiAgICAgIHJldHVybiBmaW5kVGFiQnlJZCgnc2V0dGluZ3MnKVxyXG4gICAgcmV0dXJuIGZpbmRUYWJCeUlkKCdtb2RlbHMnKVxyXG4gIH0sXHJcbiAgc2V0OiAodmFsOiBMYXlvdXRQYWdlVGFiSXRlbSkgPT4ge1xyXG4gICAgaWYgKCF2YWwpIHJldHVyblxyXG4gICAgc3dpdGNoICh2YWwuaWQpIHtcclxuICAgICAgY2FzZSAnbW9kZWxzJzpcclxuICAgICAgICByb3V0ZXIucHVzaCh7IHBhdGg6IHByb2plY3RSb3V0ZShwcm9qZWN0SWQudmFsdWUsICdtb2RlbHMnKSB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rpc2N1c3Npb25zJzpcclxuICAgICAgICByb3V0ZXIucHVzaCh7IHBhdGg6IHByb2plY3RSb3V0ZShwcm9qZWN0SWQudmFsdWUsICdkaXNjdXNzaW9ucycpIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnYWNjJzpcclxuICAgICAgICByb3V0ZXIucHVzaCh7IHBhdGg6IHByb2plY3RSb3V0ZShwcm9qZWN0SWQudmFsdWUsICdhY2MnKSB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2F1dG9tYXRpb25zJzpcclxuICAgICAgICByb3V0ZXIucHVzaCh7IHBhdGg6IHByb2plY3RSb3V0ZShwcm9qZWN0SWQudmFsdWUsICdhdXRvbWF0aW9ucycpIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnY29sbGFib3JhdG9ycyc6XHJcbiAgICAgICAgaWYgKGNhblJlYWRTZXR0aW5ncy52YWx1ZT8uYXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgcm91dGVyLnB1c2goeyBwYXRoOiBwcm9qZWN0Um91dGUocHJvamVjdElkLnZhbHVlLCAnY29sbGFib3JhdG9ycycpIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJ2Rhc2hib2FyZHMnOlxyXG4gICAgICAgIGlmIChwcm9qZWN0LnZhbHVlPy5oYXNBY2Nlc3NUb0Rhc2hib2FyZHMpIHtcclxuICAgICAgICAgIHJvdXRlci5wdXNoKHsgcGF0aDogcHJvamVjdFJvdXRlKHByb2plY3RJZC52YWx1ZSwgJ2Rhc2hib2FyZHMnKSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICdzZXR0aW5ncyc6XHJcbiAgICAgICAgaWYgKGNhblJlYWRTZXR0aW5ncy52YWx1ZT8uYXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgcm91dGVyLnB1c2goeyBwYXRoOiBwcm9qZWN0Um91dGUocHJvamVjdElkLnZhbHVlLCAnc2V0dGluZ3MnKSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHNob3VsZFNob3dXb3Jrc3BhY2VBbGVydCA9IGNvbXB1dGVkKFxyXG4gICgpID0+XHJcbiAgICBpc1dvcmtzcGFjZXNFbmFibGVkLnZhbHVlICYmXHJcbiAgICBpc0xvZ2dlZEluLnZhbHVlICYmXHJcbiAgICAhcHJvamVjdC52YWx1ZT8ud29ya3NwYWNlICYmXHJcbiAgICBoYXNSb2xlLnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGRpc2FibGVMZWdhY3lNb3ZlUHJvamVjdEJ1dHRvbiA9IGNvbXB1dGVkKFxyXG4gICgpID0+ICFwcm9qZWN0LnZhbHVlPy5wZXJtaXNzaW9ucy5jYW5Nb3ZlVG9Xb3Jrc3BhY2UuYXV0aG9yaXplZFxyXG4pXHJcblxyXG5jb25zdCBvbk1vdmVQcm9qZWN0ID0gKCkgPT4ge1xyXG4gIG1peHBhbmVsLnRyYWNrKCdNb3ZlIFByb2plY3QgQ1RBIENsaWNrZWQnLCB7XHJcbiAgICBsb2NhdGlvbjogJ3Byb2plY3QnXHJcbiAgfSlcclxuICBzaG93TW92ZURpYWxvZy52YWx1ZSA9IHRydWVcclxufVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtOyBldmVudDogTW91c2VFdmVudCB9KSA9PiB7XHJcbiAgY29uc3QgeyBpdGVtIH0gPSBwYXJhbXNcclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLkNvcHlMaW5rOlxyXG4gICAgICBjb3B5UHJvamVjdExpbmsocHJvamVjdElkLnZhbHVlKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5Nb3ZlOlxyXG4gICAgICBvbk1vdmVQcm9qZWN0KClcclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9wYWdlcy9wcm9qZWN0cy9baWRdL2luZGV4LnZ1ZSJ9