345 lines
34 KiB
Plaintext
345 lines
34 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/projects/Dashboard.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/projects/MoveToWorkspaceAlert.vue";
|
|
import { FormTextInput 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/form/select/ProjectRoles.vue";
|
|
import { FormCheckbox as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { FormButton as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { CommonLoadingBar as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_6 } from "/_nuxt/components/projects/HiddenProjectWarning.vue";
|
|
import { default as __nuxt_component_7 } from "/_nuxt/components/projects/DashboardEmptyState.vue";
|
|
import { default as __nuxt_component_8 } from "/_nuxt/components/projects/DashboardFilled.vue";
|
|
import { InfiniteLoading as __nuxt_component_9 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_10 } from "/_nuxt/components/common/EmptySearchState.vue";
|
|
import { default as __nuxt_component_11 } from "/_nuxt/components/projects/Add.vue";
|
|
import { default as __nuxt_component_12 } from "/_nuxt/components/workspace/moveProject/index.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 { useQuery, useQueryLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { projectsDashboardQuery } from "/_nuxt/lib/projects/graphql/queries.ts";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { useDebouncedTextInput } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { MagnifyingGlassIcon, Squares2X2Icon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
|
|
import { useUserProjectsUpdatedTracking } from "/_nuxt/lib/user/composables/projectUpdates.ts";
|
|
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
|
|
import { useCanCreatePersonalProject } from "/_nuxt/lib/projects/composables/permissions.ts";
|
|
|
|
import { useLogger } from "/_nuxt/composables/logging.ts";
|
|
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ProjectsDashboard",
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment ProjectsDashboard_UserProjectCollection on UserProjectCollection {
|
|
numberOfHidden
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment ProjectsDashboard_User on User {
|
|
...ProjectsAdd_User
|
|
permissions {
|
|
canCreatePersonalProject {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const logger = useLogger();
|
|
const infiniteLoaderId = ref("");
|
|
const cursor = ref(null);
|
|
const selectedRoles = ref(void 0);
|
|
const filterProjectsToMove = ref(false);
|
|
const showLoadingBar = ref(false);
|
|
const showMoveProjectDialog = ref(false);
|
|
const emittedProject = ref();
|
|
const areQueriesLoading = useQueryLoading();
|
|
const isWorkspacesEnabled = useIsWorkspacesEnabled();
|
|
const showCreateNewProjectDialog = ref(false);
|
|
useUserProjectsUpdatedTracking();
|
|
const {
|
|
on,
|
|
bind,
|
|
value: search
|
|
} = useDebouncedTextInput({
|
|
debouncedBy: 800
|
|
});
|
|
const {
|
|
result: projectsPanelResult,
|
|
fetchMore: fetchMoreProjects,
|
|
onResult: onProjectsResult,
|
|
variables: projectsVariables
|
|
} = useQuery(projectsDashboardQuery, () => ({
|
|
filter: {
|
|
search: (search.value || "").trim() || null,
|
|
onlyWithRoles: filterProjectsToMove.value ? ["stream:owner"] : selectedRoles.value?.length ? selectedRoles.value : null,
|
|
personalOnly: isWorkspacesEnabled.value
|
|
},
|
|
cursor: null
|
|
}));
|
|
const { canClickCreate } = useCanCreatePersonalProject({
|
|
activeUser: computed(() => projectsPanelResult.value?.activeUser)
|
|
});
|
|
onProjectsResult((res) => {
|
|
cursor.value = res.data?.activeUser?.projects.cursor || null;
|
|
infiniteLoaderId.value = JSON.stringify(projectsVariables.value?.filter || {});
|
|
});
|
|
const projects = computed(() => projectsPanelResult.value?.activeUser?.projects);
|
|
const showEmptyState = computed(() => {
|
|
const isFiltering = projectsVariables.value?.filter?.onlyWithRoles?.length || projectsVariables.value?.filter?.search?.length;
|
|
if (isFiltering) return false;
|
|
return projects.value && !projects.value.items.length;
|
|
});
|
|
const moreToLoad = computed(
|
|
() => (!projects.value || projects.value.items.length < projects.value.totalCount) && cursor.value
|
|
);
|
|
const infiniteLoad = async (state) => {
|
|
if (!moreToLoad.value) return state.complete();
|
|
try {
|
|
await fetchMoreProjects({
|
|
variables: {
|
|
cursor: cursor.value
|
|
}
|
|
});
|
|
} catch (e) {
|
|
logger.error(e);
|
|
state.error();
|
|
return;
|
|
}
|
|
state.loaded();
|
|
if (!moreToLoad.value) {
|
|
state.complete();
|
|
}
|
|
};
|
|
const mixpanel = useMixpanel();
|
|
const onMoveProject = (projectId, location) => {
|
|
const project = projectId ? projects.value?.items.find((p) => p.id === projectId) : void 0;
|
|
emittedProject.value = project || void 0;
|
|
mixpanel.track("Move Project CTA Clicked", {
|
|
location,
|
|
// eslint-disable-next-line camelcase
|
|
workspace_id: project?.workspace?.id || void 0
|
|
});
|
|
showMoveProjectDialog.value = true;
|
|
};
|
|
watch(search, (newVal) => {
|
|
if (newVal) showLoadingBar.value = true;
|
|
else showLoadingBar.value = false;
|
|
});
|
|
watch(areQueriesLoading, (newVal) => showLoadingBar.value = newVal);
|
|
const clearSearch = () => {
|
|
search.value = "";
|
|
selectedRoles.value = [];
|
|
};
|
|
const onClickCreate = () => {
|
|
showCreateNewProjectDialog.value = true;
|
|
};
|
|
const __returned__ = { logger, infiniteLoaderId, cursor, selectedRoles, filterProjectsToMove, showLoadingBar, showMoveProjectDialog, emittedProject, areQueriesLoading, isWorkspacesEnabled, showCreateNewProjectDialog, on, bind, search, projectsPanelResult, fetchMoreProjects, onProjectsResult, projectsVariables, canClickCreate, projects, showEmptyState, moreToLoad, infiniteLoad, mixpanel, onMoveProject, clearSearch, onClickCreate, get MagnifyingGlassIcon() {
|
|
return MagnifyingGlassIcon;
|
|
}, get Squares2X2Icon() {
|
|
return Squares2X2Icon;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toHandlers as _toHandlers, mergeProps as _mergeProps, createTextVNode as _createTextVNode, withCtx as _withCtx, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = { "data-v-inspector": "components/projects/Dashboard.vue:2:3" };
|
|
const _hoisted_2 = {
|
|
key: 0,
|
|
class: "flex flex-col gap-4",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:4:5"
|
|
};
|
|
const _hoisted_3 = {
|
|
class: "flex items-center gap-2 mb-2",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:9:7"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "flex flex-col lg:flex-row gap-2 lg:items-center justify-between",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:14:7"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "flex flex-col md:flex-row gap-2",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:15:9"
|
|
};
|
|
const _hoisted_6 = {
|
|
key: 1,
|
|
class: "md:mt-1",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:35:11"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_Portal = _resolveComponent("Portal");
|
|
const _component_ProjectsMoveToWorkspaceAlert = __nuxt_component_0;
|
|
const _component_FormTextInput = __nuxt_component_1;
|
|
const _component_FormSelectProjectRoles = __nuxt_component_2;
|
|
const _component_FormCheckbox = __nuxt_component_3;
|
|
const _component_FormButton = __nuxt_component_4;
|
|
const _component_CommonLoadingBar = __nuxt_component_5;
|
|
const _component_ProjectsHiddenProjectWarning = __nuxt_component_6;
|
|
const _component_ProjectsDashboardEmptyState = __nuxt_component_7;
|
|
const _component_ProjectsDashboardFilled = __nuxt_component_8;
|
|
const _component_InfiniteLoading = __nuxt_component_9;
|
|
const _component_CommonEmptySearchState = __nuxt_component_10;
|
|
const _component_ProjectsAdd = __nuxt_component_11;
|
|
const _component_WorkspaceMoveProject = __nuxt_component_12;
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createVNode(_component_Portal, {
|
|
to: "primary-actions",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:3:5"
|
|
}),
|
|
!$setup.showEmptyState ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
|
|
$setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_ProjectsMoveToWorkspaceAlert, {
|
|
key: 0,
|
|
onMoveProject: _cache[0] || (_cache[0] = (id) => $setup.onMoveProject(id, "projects")),
|
|
"data-v-inspector": "components/projects/Dashboard.vue:5:7"
|
|
})) : _createCommentVNode("v-if", true),
|
|
_createElementVNode("div", _hoisted_3, [
|
|
_createVNode($setup["Squares2X2Icon"], {
|
|
class: "h-5 w-5",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:10:9"
|
|
}),
|
|
_cache[6] || (_cache[6] = _createElementVNode(
|
|
"h1",
|
|
{
|
|
class: "text-heading-lg",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:11:9"
|
|
},
|
|
"Projects",
|
|
-1
|
|
/* CACHED */
|
|
))
|
|
]),
|
|
_createElementVNode("div", _hoisted_4, [
|
|
_createElementVNode("div", _hoisted_5, [
|
|
_createVNode(_component_FormTextInput, _mergeProps({
|
|
name: "modelsearch",
|
|
"show-label": false,
|
|
placeholder: "Search...",
|
|
"custom-icon": $setup.MagnifyingGlassIcon,
|
|
color: "foundation",
|
|
"wrapper-classes": "grow md:grow-0 md:w-60",
|
|
"show-clear": !!$setup.search
|
|
}, $setup.bind, _toHandlers($setup.on), { "data-v-inspector": "components/projects/Dashboard.vue:16:11" }), null, 16, ["custom-icon", "show-clear"]),
|
|
!$setup.showEmptyState ? (_openBlock(), _createBlock(_component_FormSelectProjectRoles, {
|
|
key: 0,
|
|
modelValue: $setup.selectedRoles,
|
|
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.selectedRoles = $event),
|
|
class: "md:w-56 grow md:grow-0",
|
|
"allow-unset": "",
|
|
"fixed-height": "",
|
|
clearable: "",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:27:11"
|
|
}, null, 8, ["modelValue"])) : _createCommentVNode("v-if", true),
|
|
!$setup.showEmptyState && $setup.isWorkspacesEnabled ? (_openBlock(), _createElementBlock("div", _hoisted_6, [
|
|
_createVNode(_component_FormCheckbox, {
|
|
id: "projects-to-move",
|
|
modelValue: $setup.filterProjectsToMove,
|
|
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.filterProjectsToMove = $event),
|
|
"label-classes": "!font-normal select-none",
|
|
name: "Projects to move",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:36:13"
|
|
}, null, 8, ["modelValue"])
|
|
])) : _createCommentVNode("v-if", true)
|
|
]),
|
|
$setup.canClickCreate ? (_openBlock(), _createBlock(_component_FormButton, {
|
|
key: 0,
|
|
onClick: $setup.onClickCreate,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:44:9"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[7] || (_cache[7] = [
|
|
_createTextVNode(
|
|
" New project ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
})) : _createCommentVNode("v-if", true)
|
|
])
|
|
])) : _createCommentVNode("v-if", true),
|
|
_createVNode(_component_CommonLoadingBar, {
|
|
loading: $setup.showLoadingBar,
|
|
class: "my-2",
|
|
"data-v-inspector": "components/projects/Dashboard.vue:49:5"
|
|
}, null, 8, ["loading"]),
|
|
$setup.projectsPanelResult?.activeUser && $setup.projects?.numberOfHidden ? (_openBlock(), _createBlock(_component_ProjectsHiddenProjectWarning, {
|
|
key: 1,
|
|
"hidden-item-count": $setup.projectsPanelResult.activeUser.projects.numberOfHidden,
|
|
user: $setup.projectsPanelResult.activeUser,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:51:5"
|
|
}, null, 8, ["hidden-item-count", "user"])) : _createCommentVNode("v-if", true),
|
|
$setup.showEmptyState ? (_openBlock(), _createBlock(_component_ProjectsDashboardEmptyState, {
|
|
key: 2,
|
|
"can-create-project": $setup.canClickCreate,
|
|
onCreateProject: $setup.onClickCreate,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:57:5"
|
|
}, null, 8, ["can-create-project"])) : $setup.projects?.items?.length ? (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 3 },
|
|
[
|
|
_createVNode(_component_ProjectsDashboardFilled, {
|
|
projects: $setup.projects,
|
|
"show-workspace-link": "",
|
|
onMoveProject: _cache[3] || (_cache[3] = (id) => $setup.onMoveProject(id, "project_card")),
|
|
"data-v-inspector": "components/projects/Dashboard.vue:63:7"
|
|
}, null, 8, ["projects"]),
|
|
_createVNode(_component_InfiniteLoading, {
|
|
settings: { identifier: $setup.infiniteLoaderId },
|
|
onInfinite: $setup.infiniteLoad,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:68:7"
|
|
}, null, 8, ["settings"])
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)) : !$setup.showLoadingBar ? (_openBlock(), _createBlock(_component_CommonEmptySearchState, {
|
|
key: 4,
|
|
onClearSearch: $setup.clearSearch,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:73:5"
|
|
})) : _createCommentVNode("v-if", true),
|
|
$setup.projectsPanelResult?.activeUser ? (_openBlock(), _createBlock(_component_ProjectsAdd, {
|
|
key: 5,
|
|
open: $setup.showCreateNewProjectDialog,
|
|
"onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showCreateNewProjectDialog = $event),
|
|
"data-v-inspector": "components/projects/Dashboard.vue:74:5"
|
|
}, null, 8, ["open"])) : _createCommentVNode("v-if", true),
|
|
$setup.showMoveProjectDialog ? (_openBlock(), _createBlock(_component_WorkspaceMoveProject, {
|
|
key: 6,
|
|
open: $setup.showMoveProjectDialog,
|
|
"onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showMoveProjectDialog = $event),
|
|
project: $setup.emittedProject,
|
|
"data-v-inspector": "components/projects/Dashboard.vue:78:5"
|
|
}, null, 8, ["open", "project"])) : _createCommentVNode("v-if", true)
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "fbbf1a1a";
|
|
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/projects/Dashboard.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QUFBQTtJQUdsRSw0QkFBcUIsY0FBYyxpQkFBVSxnQ0FEckQsYUFJRTtBQUFBO01BRkMscUJBQW1CLDJCQUFvQixXQUFXLFNBQVM7QUFBQSxNQUMzRCxNQUFNLDJCQUFvQjtBQUFBLE1BQVksb0JBQWlCO0FBQUE7SUFJbEQsdUNBRFIsYUFJRTtBQUFBO01BRkMsc0JBQW9CO0FBQUEsTUFDcEIsaUJBQWdCO0FBQUEsTUFBZSxvQkFBaUI7QUFBQSwyQ0FFOUIsaUJBQVUsT0FBTyx3QkFBdEM7QUFBQSxNQVVXO0FBQUE7QUFBQTtBQUFBLFFBVFQsYUFJRTtBQUFBLFVBSEMsVUFBVTtBQUFBLFVBQ1g7QUFBQSxVQUNDLGVBQVksMkJBQUcsT0FBTyxxQkFBYyxJQUFFO0FBQUEsVUFBbUIsb0JBQWlCO0FBQUE7UUFFN0UsYUFHRTtBQUFBLFVBRkMsVUFBUSxjQUFnQix3QkFBZ0I7QUFBQSxVQUN4QyxZQUFVO0FBQUEsVUFBYyxvQkFBaUI7QUFBQTs7OztVQUdWLHVDQUFwQyxhQUE0STtBQUFBO01BQXZGLGVBQWM7QUFBQSxNQUFhLG9CQUFpQjtBQUFBO0lBRXpGLDRCQUFxQiw0QkFEN0IsYUFHRTtBQUFBO01BRFEsTUFBTTtBQUFBLGlHQUEwQjtBQUFBLE1BQUUsb0JBQWlCO0FBQUE7SUFHckQsOENBRFIsYUFJRTtBQUFBO01BRlEsTUFBTTtBQUFBLDRGQUFxQjtBQUFBLE1BQ2xDLFNBQVM7QUFBQSxNQUFnQixvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiRGFzaGJvYXJkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjI6M1wiPlxyXG4gICAgPFBvcnRhbCB0bz1cInByaW1hcnktYWN0aW9uc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mzo1XCI+PC9Qb3J0YWw+XHJcbiAgICA8ZGl2IHYtaWY9XCIhc2hvd0VtcHR5U3RhdGVcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ6NVwiPlxyXG4gICAgICA8UHJvamVjdHNNb3ZlVG9Xb3Jrc3BhY2VBbGVydFxyXG4gICAgICAgIHYtaWY9XCJpc1dvcmtzcGFjZXNFbmFibGVkXCJcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdHMnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6NTo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjk6N1wiPlxyXG4gICAgICAgIDxTcXVhcmVzMlgySWNvbiBjbGFzcz1cImgtNSB3LTVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjEwOjlcIiAvPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cInRleHQtaGVhZGluZy1sZ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6MTE6OVwiPlByb2plY3RzPC9oMT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBsZzpmbGV4LXJvdyBnYXAtMiBsZzppdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZToxNDo3XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE1OjlcIj5cclxuICAgICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICAgIG5hbWU9XCJtb2RlbHNlYXJjaFwiXHJcbiAgICAgICAgICAgIDpzaG93LWxhYmVsPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiXHJcbiAgICAgICAgICAgIDpjdXN0b20taWNvbj1cIk1hZ25pZnlpbmdHbGFzc0ljb25cIlxyXG4gICAgICAgICAgICBjb2xvcj1cImZvdW5kYXRpb25cIlxyXG4gICAgICAgICAgICB3cmFwcGVyLWNsYXNzZXM9XCJncm93IG1kOmdyb3ctMCBtZDp3LTYwXCJcclxuICAgICAgICAgICAgOnNob3ctY2xlYXI9XCIhIXNlYXJjaFwiXHJcbiAgICAgICAgICAgIHYtYmluZD1cImJpbmRcIlxyXG4gICAgICAgICAgICB2LW9uPVwib25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE2OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RSb2xlc1xyXG4gICAgICAgICAgICB2LWlmPVwiIXNob3dFbXB0eVN0YXRlXCJcclxuICAgICAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkUm9sZXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1kOnctNTYgZ3JvdyBtZDpncm93LTBcIlxyXG4gICAgICAgICAgICBhbGxvdy11bnNldFxyXG4gICAgICAgICAgICBmaXhlZC1oZWlnaHRcclxuICAgICAgICAgICAgY2xlYXJhYmxlIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mjc6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cIiFzaG93RW1wdHlTdGF0ZSAmJiBpc1dvcmtzcGFjZXNFbmFibGVkXCIgY2xhc3M9XCJtZDptdC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNToxMVwiPlxyXG4gICAgICAgICAgICA8Rm9ybUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgaWQ9XCJwcm9qZWN0cy10by1tb3ZlXCJcclxuICAgICAgICAgICAgICB2LW1vZGVsPVwiZmlsdGVyUHJvamVjdHNUb01vdmVcIlxyXG4gICAgICAgICAgICAgIGxhYmVsLWNsYXNzZXM9XCIhZm9udC1ub3JtYWwgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJQcm9qZWN0cyB0byBtb3ZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNjoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiB2LWlmPVwiY2FuQ2xpY2tDcmVhdGVcIiBAY2xpY2s9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo0NDo5XCI+XHJcbiAgICAgICAgICBOZXcgcHJvamVjdFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwic2hvd0xvYWRpbmdCYXJcIiBjbGFzcz1cIm15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ5OjVcIiAvPlxyXG5cclxuICAgIDxQcm9qZWN0c0hpZGRlblByb2plY3RXYXJuaW5nXHJcbiAgICAgIHYtaWY9XCJwcm9qZWN0c1BhbmVsUmVzdWx0Py5hY3RpdmVVc2VyICYmIHByb2plY3RzPy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDpoaWRkZW4taXRlbS1jb3VudD1cInByb2plY3RzUGFuZWxSZXN1bHQuYWN0aXZlVXNlci5wcm9qZWN0cy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDp1c2VyPVwicHJvamVjdHNQYW5lbFJlc3VsdC5hY3RpdmVVc2VyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1MTo1XCJcclxuICAgIC8+XHJcblxyXG4gICAgPFByb2plY3RzRGFzaGJvYXJkRW1wdHlTdGF0ZVxyXG4gICAgICB2LWlmPVwic2hvd0VtcHR5U3RhdGVcIlxyXG4gICAgICA6Y2FuLWNyZWF0ZS1wcm9qZWN0PVwiY2FuQ2xpY2tDcmVhdGVcIlxyXG4gICAgICBAY3JlYXRlLXByb2plY3Q9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1Nzo1XCJcclxuICAgIC8+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwicHJvamVjdHM/Lml0ZW1zPy5sZW5ndGhcIj5cclxuICAgICAgPFByb2plY3RzRGFzaGJvYXJkRmlsbGVkXHJcbiAgICAgICAgOnByb2plY3RzPVwicHJvamVjdHNcIlxyXG4gICAgICAgIHNob3ctd29ya3NwYWNlLWxpbmtcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdF9jYXJkJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjYzOjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgOnNldHRpbmdzPVwieyBpZGVudGlmaWVyOiBpbmZpbml0ZUxvYWRlcklkIH1cIlxyXG4gICAgICAgIEBpbmZpbml0ZT1cImluZmluaXRlTG9hZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Njg6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPENvbW1vbkVtcHR5U2VhcmNoU3RhdGUgdi1lbHNlLWlmPVwiIXNob3dMb2FkaW5nQmFyXCIgQGNsZWFyLXNlYXJjaD1cImNsZWFyU2VhcmNoXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3Mzo1XCIgLz5cclxuICAgIDxQcm9qZWN0c0FkZFxyXG4gICAgICB2LWlmPVwicHJvamVjdHNQYW5lbFJlc3VsdD8uYWN0aXZlVXNlclwiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3NDo1XCJcclxuICAgIC8+XHJcbiAgICA8V29ya3NwYWNlTW92ZVByb2plY3RcclxuICAgICAgdi1pZj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIDpwcm9qZWN0PVwiZW1pdHRlZFByb2plY3RcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjc4OjVcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZVF1ZXJ5LCB1c2VRdWVyeUxvYWRpbmcgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBwcm9qZWN0c0Rhc2hib2FyZFF1ZXJ5IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwsIFN0cmVhbVJvbGVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWRUZXh0SW5wdXQsIHR5cGUgSW5maW5pdGVMb2FkZXJTdGF0ZSB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IE1hZ25pZnlpbmdHbGFzc0ljb24sIFNxdWFyZXMyWDJJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgdXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nIH0gZnJvbSAnfn4vbGliL3VzZXIvY29tcG9zYWJsZXMvcHJvamVjdFVwZGF0ZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Blcm1pc3Npb25zJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3RzRGFzaGJvYXJkUXVlcnlRdWVyeSB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdHNEYXNoYm9hcmRfVXNlclByb2plY3RDb2xsZWN0aW9uIG9uIFVzZXJQcm9qZWN0Q29sbGVjdGlvbiB7XHJcbiAgICBudW1iZXJPZkhpZGRlblxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RzRGFzaGJvYXJkX1VzZXIgb24gVXNlciB7XHJcbiAgICAuLi5Qcm9qZWN0c0FkZF9Vc2VyXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhbkNyZWF0ZVBlcnNvbmFsUHJvamVjdCB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgbG9nZ2VyID0gdXNlTG9nZ2VyKClcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZGVySWQgPSByZWYoJycpXHJcbmNvbnN0IGN1cnNvciA9IHJlZihudWxsIGFzIE51bGxhYmxlPHN0cmluZz4pXHJcbmNvbnN0IHNlbGVjdGVkUm9sZXMgPSByZWYodW5kZWZpbmVkIGFzIE9wdGlvbmFsPFN0cmVhbVJvbGVzW10+KVxyXG5jb25zdCBmaWx0ZXJQcm9qZWN0c1RvTW92ZSA9IHJlZihmYWxzZSlcclxuY29uc3Qgc2hvd0xvYWRpbmdCYXIgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNob3dNb3ZlUHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3QgZW1pdHRlZFByb2plY3QgPVxyXG4gIHJlZjxHZXQ8UHJvamVjdHNEYXNoYm9hcmRRdWVyeVF1ZXJ5LCAnYWN0aXZlVXNlci5wcm9qZWN0cy5pdGVtc1swXSc+PigpXHJcbmNvbnN0IGFyZVF1ZXJpZXNMb2FkaW5nID0gdXNlUXVlcnlMb2FkaW5nKClcclxuY29uc3QgaXNXb3Jrc3BhY2VzRW5hYmxlZCA9IHVzZUlzV29ya3NwYWNlc0VuYWJsZWQoKVxyXG5jb25zdCBzaG93Q3JlYXRlTmV3UHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxudXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nKClcclxuXHJcbmNvbnN0IHtcclxuICBvbixcclxuICBiaW5kLFxyXG4gIHZhbHVlOiBzZWFyY2hcclxufSA9IHVzZURlYm91bmNlZFRleHRJbnB1dCh7XHJcbiAgZGVib3VuY2VkQnk6IDgwMFxyXG59KVxyXG5cclxuY29uc3Qge1xyXG4gIHJlc3VsdDogcHJvamVjdHNQYW5lbFJlc3VsdCxcclxuICBmZXRjaE1vcmU6IGZldGNoTW9yZVByb2plY3RzLFxyXG4gIG9uUmVzdWx0OiBvblByb2plY3RzUmVzdWx0LFxyXG4gIHZhcmlhYmxlczogcHJvamVjdHNWYXJpYWJsZXNcclxufSA9IHVzZVF1ZXJ5KHByb2plY3RzRGFzaGJvYXJkUXVlcnksICgpID0+ICh7XHJcbiAgZmlsdGVyOiB7XHJcbiAgICBzZWFyY2g6IChzZWFyY2gudmFsdWUgfHwgJycpLnRyaW0oKSB8fCBudWxsLFxyXG4gICAgb25seVdpdGhSb2xlczogZmlsdGVyUHJvamVjdHNUb01vdmUudmFsdWVcclxuICAgICAgPyBbJ3N0cmVhbTpvd25lciddXHJcbiAgICAgIDogc2VsZWN0ZWRSb2xlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgID8gc2VsZWN0ZWRSb2xlcy52YWx1ZVxyXG4gICAgICA6IG51bGwsXHJcbiAgICBwZXJzb25hbE9ubHk6IGlzV29ya3NwYWNlc0VuYWJsZWQudmFsdWVcclxuICB9LFxyXG4gIGN1cnNvcjogbnVsbCBhcyBOdWxsYWJsZTxzdHJpbmc+XHJcbn0pKVxyXG5cclxuY29uc3QgeyBjYW5DbGlja0NyZWF0ZSB9ID0gdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0KHtcclxuICBhY3RpdmVVc2VyOiBjb21wdXRlZCgoKSA9PiBwcm9qZWN0c1BhbmVsUmVzdWx0LnZhbHVlPy5hY3RpdmVVc2VyKVxyXG59KVxyXG5cclxub25Qcm9qZWN0c1Jlc3VsdCgocmVzKSA9PiB7XHJcbiAgY3Vyc29yLnZhbHVlID0gcmVzLmRhdGE/LmFjdGl2ZVVzZXI/LnByb2plY3RzLmN1cnNvciB8fCBudWxsXHJcbiAgaW5maW5pdGVMb2FkZXJJZC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXIgfHwge30pXHJcbn0pXHJcblxyXG5jb25zdCBwcm9qZWN0cyA9IGNvbXB1dGVkKCgpID0+IHByb2plY3RzUGFuZWxSZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LnByb2plY3RzKVxyXG5jb25zdCBzaG93RW1wdHlTdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpc0ZpbHRlcmluZyA9XHJcbiAgICBwcm9qZWN0c1ZhcmlhYmxlcy52YWx1ZT8uZmlsdGVyPy5vbmx5V2l0aFJvbGVzPy5sZW5ndGggfHxcclxuICAgIHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXI/LnNlYXJjaD8ubGVuZ3RoXHJcbiAgaWYgKGlzRmlsdGVyaW5nKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgcmV0dXJuIHByb2plY3RzLnZhbHVlICYmICFwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGhcclxufSlcclxuXHJcbmNvbnN0IG1vcmVUb0xvYWQgPSBjb21wdXRlZChcclxuICAoKSA9PlxyXG4gICAgKCFwcm9qZWN0cy52YWx1ZSB8fCBwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGggPCBwcm9qZWN0cy52YWx1ZS50b3RhbENvdW50KSAmJlxyXG4gICAgY3Vyc29yLnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZCA9IGFzeW5jIChzdGF0ZTogSW5maW5pdGVMb2FkZXJTdGF0ZSkgPT4ge1xyXG4gIGlmICghbW9yZVRvTG9hZC52YWx1ZSkgcmV0dXJuIHN0YXRlLmNvbXBsZXRlKClcclxuXHJcbiAgdHJ5IHtcclxuICAgIGF3YWl0IGZldGNoTW9yZVByb2plY3RzKHtcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgY3Vyc29yOiBjdXJzb3IudmFsdWVcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZSlcclxuICAgIHN0YXRlLmVycm9yKClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgc3RhdGUubG9hZGVkKClcclxuICBpZiAoIW1vcmVUb0xvYWQudmFsdWUpIHtcclxuICAgIHN0YXRlLmNvbXBsZXRlKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG1peHBhbmVsID0gdXNlTWl4cGFuZWwoKVxyXG5cclxuY29uc3Qgb25Nb3ZlUHJvamVjdCA9IChwcm9qZWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgbG9jYXRpb246IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0SWRcclxuICAgID8gcHJvamVjdHMudmFsdWU/Lml0ZW1zLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZClcclxuICAgIDogdW5kZWZpbmVkXHJcbiAgZW1pdHRlZFByb2plY3QudmFsdWUgPSBwcm9qZWN0IHx8IHVuZGVmaW5lZFxyXG5cclxuICBtaXhwYW5lbC50cmFjaygnTW92ZSBQcm9qZWN0IENUQSBDbGlja2VkJywge1xyXG4gICAgbG9jYXRpb24sXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXHJcbiAgICB3b3Jrc3BhY2VfaWQ6IHByb2plY3Q/LndvcmtzcGFjZT8uaWQgfHwgdW5kZWZpbmVkXHJcbiAgfSlcclxuICBzaG93TW92ZVByb2plY3REaWFsb2cudmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbndhdGNoKHNlYXJjaCwgKG5ld1ZhbCkgPT4ge1xyXG4gIGlmIChuZXdWYWwpIHNob3dMb2FkaW5nQmFyLnZhbHVlID0gdHJ1ZVxyXG4gIGVsc2Ugc2hvd0xvYWRpbmdCYXIudmFsdWUgPSBmYWxzZVxyXG59KVxyXG5cclxud2F0Y2goYXJlUXVlcmllc0xvYWRpbmcsIChuZXdWYWwpID0+IChzaG93TG9hZGluZ0Jhci52YWx1ZSA9IG5ld1ZhbCkpXHJcblxyXG5jb25zdCBjbGVhclNlYXJjaCA9ICgpID0+IHtcclxuICBzZWFyY2gudmFsdWUgPSAnJ1xyXG4gIHNlbGVjdGVkUm9sZXMudmFsdWUgPSBbXVxyXG59XHJcblxyXG5jb25zdCBvbkNsaWNrQ3JlYXRlID0gKCkgPT4ge1xyXG4gIHNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nLnZhbHVlID0gdHJ1ZVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlIn0= |