449 lines
44 KiB
Plaintext
449 lines
44 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/Card.vue");import { default as __nuxt_component_0 } from "/_nuxt/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/components/project/page/models/Actions.vue";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/automate/runs/TriggerStatus.vue";
|
|
import { default as __nuxt_component_3 } from "/_nuxt/components/project/PendingFileImportStatus.vue";
|
|
import { default as __nuxt_component_4 } from "/_nuxt/components/preview/Image.vue";
|
|
import { default as __nuxt_component_5 } from "/_nuxt/components/project/CardImportFileArea.vue";
|
|
import { default as __nuxt_component_6 } from "/_nuxt/components/project/page/models/card/UpdatedTime.vue";
|
|
import { default as __nuxt_component_7 } from "/_nuxt/components/global/icon/Discussions.vue";
|
|
import { default as __nuxt_component_8 } from "/_nuxt/components/global/icon/Versions.vue";
|
|
import { FormButton as __nuxt_component_9 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createBlock as __createBlock,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode,createVNode as __createVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
|
|
function _interopVNode(vnode) {
|
|
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
|
|
const data = vnode.props['data-v-inspector']
|
|
delete vnode.props['data-v-inspector']
|
|
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
|
|
}
|
|
return vnode
|
|
}
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...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 { modelVersionsRoute } from "/_nuxt/lib/common/helpers/route.ts";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import {
|
|
getModelItemRoute,
|
|
isPendingModelFragment
|
|
} from "/_nuxt/lib/projects/helpers/models.ts";
|
|
import { FileUploadConvertedStatus } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js";
|
|
import __vite__cjsImport16_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport16_dayjs.__esModule ? __vite__cjsImport16_dayjs.default : __vite__cjsImport16_dayjs;
|
|
|
|
import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
import { useIsAutomateModuleEnabled } from "/_nuxt/composables/globals.ts";
|
|
import { ref, computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ProjectPageModelsCard",
|
|
props: {
|
|
projectId: { type: String, required: true },
|
|
model: { type: Object, required: true },
|
|
project: { type: null, required: true },
|
|
showVersions: { type: Boolean, required: false, default: true },
|
|
showActions: { type: Boolean, required: false, default: true },
|
|
disableDefaultLink: { type: Boolean, required: false },
|
|
smallView: { type: Boolean, required: false, default: false }
|
|
},
|
|
emits: ["click"],
|
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment ProjectPageModelsCardProject on Project {
|
|
id
|
|
role
|
|
visibility
|
|
...ProjectPageModelsActions_Project
|
|
...ProjectCardImportFileArea_Project
|
|
permissions {
|
|
canCreateModel {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment ProjectPageModelsCard_Model on Model {
|
|
id
|
|
homeView {
|
|
id
|
|
resourceIds
|
|
}
|
|
lastUpload: uploads(input: { limit: 1, cursor: null }) {
|
|
items {
|
|
id
|
|
updatedAt
|
|
convertedStatus
|
|
}
|
|
}
|
|
lastVersion: versions(limit: 1, cursor: null) {
|
|
items {
|
|
id
|
|
createdAt
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const emit = __emit;
|
|
const props = __props;
|
|
const router = useRouter();
|
|
const isAutomateModuleEnabled = useIsAutomateModuleEnabled();
|
|
const importArea = ref(
|
|
null
|
|
);
|
|
const actions = ref(
|
|
null
|
|
);
|
|
const isVersionUploading = ref(false);
|
|
const showActionsMenu = ref(false);
|
|
const hovered = ref(false);
|
|
const showLastUploadFailed = computed(() => {
|
|
if (isPendingModelFragment(props.model)) return false;
|
|
const lastUpload = props.model.lastUpload?.items[0];
|
|
const lastVersion = props.model.lastVersion?.items[0];
|
|
if (lastUpload?.convertedStatus !== FileUploadConvertedStatus.Error) return false;
|
|
if (!lastVersion) return true;
|
|
return dayjs(lastUpload.updatedAt).isAfter(dayjs(lastVersion.createdAt));
|
|
});
|
|
const containerClasses = computed(() => {
|
|
const classParts = [
|
|
"group rounded-xl bg-foundation border border-outline-3 hover:border-outline-5 w-full z-[0]"
|
|
];
|
|
if (versionCount.value > 0) {
|
|
classParts.push("cursor-pointer");
|
|
}
|
|
return classParts.join(" ");
|
|
});
|
|
const nameParts = computed(() => {
|
|
const model = props.model;
|
|
const modelName = isPendingModelFragment(model) ? model.modelName : model.name;
|
|
const splitName = modelName.split("/");
|
|
if (splitName.length === 1) return [null, modelName];
|
|
const displayName = splitName.pop();
|
|
return [splitName.join("/") + "/", displayName];
|
|
});
|
|
const modelUrl = computed(() => getModelItemRoute(props.model));
|
|
const previewUrl = computed(
|
|
() => isPendingModelFragment(props.model) ? null : props.model.previewUrl
|
|
);
|
|
const defaultLinkDisabled = computed(
|
|
() => props.disableDefaultLink || versionCount.value < 1
|
|
);
|
|
const updatedAtFullDate = computed(() => {
|
|
return isPendingModelFragment(props.model) ? props.model.convertedLastUpdate || props.model.uploadDate : props.model.updatedAt;
|
|
});
|
|
const versionCount = computed(() => {
|
|
return isPendingModelFragment(props.model) ? 0 : props.model.versionCount.totalCount;
|
|
});
|
|
const pendingVersion = computed(() => {
|
|
if (isPendingModelFragment(props.model)) {
|
|
return null;
|
|
}
|
|
const lastPendingVersion = props.model.pendingImportedVersions[0];
|
|
const lastVersion = props.model.lastVersion?.items[0];
|
|
if (!lastVersion || !lastPendingVersion) return lastPendingVersion;
|
|
if (dayjs(lastPendingVersion.updatedAt).isBefore(dayjs(lastVersion.createdAt))) {
|
|
return null;
|
|
}
|
|
return lastPendingVersion;
|
|
});
|
|
const onCardClick = (event) => {
|
|
if (!previewUrl.value && !pendingVersion.value && !isPendingModelFragment(props.model)) {
|
|
return;
|
|
}
|
|
emit("click", event);
|
|
};
|
|
const onVersionUploading = (payload) => {
|
|
isVersionUploading.value = payload.isUploading;
|
|
};
|
|
const triggerVersionUpload = () => {
|
|
importArea.value?.triggerPicker();
|
|
};
|
|
const __returned__ = { emit, props, router, isAutomateModuleEnabled, importArea, actions, isVersionUploading, showActionsMenu, hovered, showLastUploadFailed, containerClasses, nameParts, modelUrl, previewUrl, defaultLinkDisabled, updatedAtFullDate, versionCount, pendingVersion, onCardClick, onVersionUploading, triggerVersionUpload, get modelVersionsRoute() {
|
|
return modelVersionsRoute;
|
|
}, get isPendingModelFragment() {
|
|
return isPendingModelFragment;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, withModifiers as _withModifiers, normalizeClass as _normalizeClass, vShow as _vShow, withDirectives as _withDirectives, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "relative p-2 h-full flex flex-col",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:12:5"
|
|
};
|
|
const _hoisted_2 = {
|
|
class: "relative z-40 flex justify-between items-center h-10",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:18:7"
|
|
};
|
|
const _hoisted_3 = {
|
|
class: "px-1 select-none w-full",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:20:11"
|
|
};
|
|
const _hoisted_4 = {
|
|
key: 0,
|
|
class: "text-body-2xs text-foreground-2 relative truncate",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:21:13"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "text-body-xs font-medium truncate text-foreground flex-shrink min-w-0",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:27:13"
|
|
};
|
|
const _hoisted_6 = {
|
|
class: "relative flex items-center justify-center my-1 flex-1",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:44:7"
|
|
};
|
|
const _hoisted_7 = {
|
|
key: 0,
|
|
class: "z-30 absolute top-0 left-0",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:45:9"
|
|
};
|
|
const _hoisted_8 = {
|
|
key: 4,
|
|
class: "h-48 w-full relative z-30",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:79:9"
|
|
};
|
|
const _hoisted_9 = {
|
|
class: "relative z-20 flex justify-between items-center w-full h-8 pl-2",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:94:7"
|
|
};
|
|
const _hoisted_10 = {
|
|
class: "flex flex-col",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:95:9"
|
|
};
|
|
const _hoisted_11 = {
|
|
class: "flex items-center gap-1",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:109:9"
|
|
};
|
|
const _hoisted_12 = ["to"];
|
|
const _hoisted_13 = {
|
|
class: "text-body-2xs font-medium",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:116:13"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_NuxtLink = __nuxt_component_0;
|
|
const _component_ProjectPageModelsActions = __nuxt_component_1;
|
|
const _component_AutomateRunsTriggerStatus = __nuxt_component_2;
|
|
const _component_ProjectPendingFileImportStatus = __nuxt_component_3;
|
|
const _component_PreviewImage = __nuxt_component_4;
|
|
const _component_ProjectCardImportFileArea = __nuxt_component_5;
|
|
const _component_ProjectPageModelsCardUpdatedTime = __nuxt_component_6;
|
|
const _component_IconDiscussions = __nuxt_component_7;
|
|
const _component_IconVersions = __nuxt_component_8;
|
|
const _component_FormButton = __nuxt_component_9;
|
|
const _directive_keyboard_clickable = _resolveDirective("keyboard-clickable");
|
|
const _directive_tippy = _resolveDirective("tippy");
|
|
return _withDirectives((_openBlock(), _createElementBlock(
|
|
"div",
|
|
{
|
|
class: _normalizeClass($setup.containerClasses),
|
|
onClick: $setup.onCardClick,
|
|
onMouseleave: _cache[4] || (_cache[4] = ($event) => {
|
|
;
|
|
$setup.showActionsMenu = false, $setup.hovered = false;
|
|
}),
|
|
onMouseenter: _cache[5] || (_cache[5] = ($event) => $setup.hovered = true),
|
|
"data-v-inspector": "components/project/page/models/Card.vue:5:3"
|
|
},
|
|
[
|
|
_createElementVNode("div", _hoisted_1, [
|
|
!$setup.defaultLinkDisabled ? (_openBlock(), _createBlock(_component_NuxtLink, {
|
|
key: 0,
|
|
to: $setup.modelUrl,
|
|
class: "absolute z-10 inset-0",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:13:7"
|
|
}, null, 8, ["to"])) : _createCommentVNode("v-if", true),
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_createVNode(_component_NuxtLink, {
|
|
to: !$setup.defaultLinkDisabled ? $setup.modelUrl : void 0,
|
|
class: "truncate",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:19:9"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createElementVNode("div", _hoisted_3, [
|
|
$setup.nameParts[0] ? (_openBlock(), _createElementBlock(
|
|
"div",
|
|
_hoisted_4,
|
|
_toDisplayString($setup.nameParts[0]),
|
|
1
|
|
/* TEXT */
|
|
)) : _createCommentVNode("v-if", true),
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_5,
|
|
_toDisplayString($setup.nameParts[1]),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["to"]),
|
|
$props.project && $props.showActions && !$setup.isPendingModelFragment($props.model) ? (_openBlock(), _createBlock(_component_ProjectPageModelsActions, {
|
|
key: 0,
|
|
ref: "actions",
|
|
open: $setup.showActionsMenu,
|
|
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = $event),
|
|
model: $props.model,
|
|
project: $props.project,
|
|
onClick: _cache[1] || (_cache[1] = _withModifiers(() => {
|
|
}, ["stop", "prevent"])),
|
|
onUploadVersion: $setup.triggerVersionUpload,
|
|
"data-v-inspector": "components/project/page/models/Card.vue:34:9"
|
|
}, null, 8, ["open", "model", "project"])) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_createElementVNode("div", _hoisted_6, [
|
|
$setup.isAutomateModuleEnabled && !$setup.isPendingModelFragment($props.model) && $props.model.automationsStatus ? (_openBlock(), _createElementBlock("div", _hoisted_7, [
|
|
_createVNode(_component_AutomateRunsTriggerStatus, {
|
|
"project-id": $props.projectId,
|
|
status: $props.model.automationsStatus,
|
|
"model-id": $props.model.id,
|
|
"data-v-inspector": "components/project/page/models/Card.vue:53:11"
|
|
}, null, 8, ["project-id", "status", "model-id"])
|
|
])) : _createCommentVNode("v-if", true),
|
|
$setup.isPendingModelFragment($props.model) ? (_openBlock(), _createBlock(_component_ProjectPendingFileImportStatus, {
|
|
key: 1,
|
|
upload: $props.model,
|
|
class: "px-4 w-full h-48",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:59:9"
|
|
}, null, 8, ["upload"])) : $setup.pendingVersion ? (_openBlock(), _createBlock(_component_ProjectPendingFileImportStatus, {
|
|
key: 2,
|
|
upload: $setup.pendingVersion,
|
|
type: "subversion",
|
|
class: "px-4 w-full h-48 text-foreground-2 text-sm flex flex-col items-center space-y-1",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:64:9"
|
|
}, null, 8, ["upload"])) : $setup.previewUrl && !$setup.isVersionUploading ? (_openBlock(), _createBlock(_component_NuxtLink, {
|
|
key: 3,
|
|
to: !$setup.defaultLinkDisabled ? $setup.modelUrl : void 0,
|
|
class: _normalizeClass(["relative z-20 bg-foundation-page w-full rounded-xl border border-outline-2 overflow-hidden", $props.smallView ? "h-24" : "h-48"]),
|
|
"data-v-inspector": "components/project/page/models/Card.vue:71:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_PreviewImage, {
|
|
"preview-url": $setup.previewUrl,
|
|
"data-v-inspector": "components/project/page/models/Card.vue:76:13"
|
|
}, null, 8, ["preview-url"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["to", "class"])) : _createCommentVNode("v-if", true),
|
|
!$setup.isPendingModelFragment($props.model) && $props.project ? _withDirectives((_openBlock(), _createElementBlock(
|
|
"div",
|
|
_hoisted_8,
|
|
[
|
|
_createVNode(_component_ProjectCardImportFileArea, {
|
|
ref: "importArea",
|
|
"empty-state-variant": "modelGrid",
|
|
project: $props.project,
|
|
model: $props.model,
|
|
class: "w-full h-full",
|
|
onUploading: $setup.onVersionUploading,
|
|
"data-v-inspector": "components/project/page/models/Card.vue:84:11"
|
|
}, null, 8, ["project", "model"])
|
|
],
|
|
512
|
|
/* NEED_PATCH */
|
|
)), [
|
|
[_vShow, !$setup.pendingVersion && ($setup.isVersionUploading || !$setup.previewUrl)]
|
|
]) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_createElementVNode("div", _hoisted_9, [
|
|
_createElementVNode("div", _hoisted_10, [
|
|
_createVNode(_component_ProjectPageModelsCardUpdatedTime, {
|
|
class: "text-body-3xs text-foreground-2",
|
|
"updated-at": $setup.updatedAtFullDate,
|
|
"data-v-inspector": "components/project/page/models/Card.vue:96:11"
|
|
}, null, 8, ["updated-at"]),
|
|
$setup.showLastUploadFailed ? _withDirectives((_openBlock(), _createBlock(_component_NuxtLink, {
|
|
key: 0,
|
|
class: "text-body-3xs text-danger hover:text-danger-lighter cursor-pointer",
|
|
onClick: _cache[2] || (_cache[2] = _withModifiers(($event) => $setup.actions?.showUploads(), ["stop"])),
|
|
"data-v-inspector": "components/project/page/models/Card.vue:100:11"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[6] || (_cache[6] = [
|
|
_createTextVNode(
|
|
" Last upload failed ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
})), [
|
|
[_directive_keyboard_clickable]
|
|
]) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_createElementVNode("div", _hoisted_11, [
|
|
!$setup.isPendingModelFragment($props.model) ? (_openBlock(), _createElementBlock("div", {
|
|
key: 0,
|
|
class: "flex items-center gap-1 !text-foreground-2",
|
|
to: $setup.modelVersionsRoute($props.projectId, $props.model.id),
|
|
"data-v-inspector": "components/project/page/models/Card.vue:110:11"
|
|
}, [
|
|
_createVNode(_component_IconDiscussions, {
|
|
class: "h-4 w-4",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:115:13"
|
|
}),
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_13,
|
|
_toDisplayString($props.model.commentThreadCount.totalCount),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
], 8, _hoisted_12)) : _createCommentVNode("v-if", true),
|
|
_withDirectives((_openBlock(), _createBlock(_component_FormButton, {
|
|
color: "subtle",
|
|
size: "sm",
|
|
class: "flex items-center gap-1 !text-foreground-2",
|
|
onClick: _cache[3] || (_cache[3] = _withModifiers(($event) => $setup.router.push($setup.modelVersionsRoute($props.projectId, $props.model.id)), ["stop"])),
|
|
"data-v-inspector": "components/project/page/models/Card.vue:120:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_IconVersions, {
|
|
class: "h-4 w-4",
|
|
"data-v-inspector": "components/project/page/models/Card.vue:127:13"
|
|
}),
|
|
_createTextVNode(
|
|
" " + _toDisplayString($setup.versionCount),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
})), [
|
|
[_directive_tippy, "View Versions"]
|
|
])
|
|
])
|
|
])
|
|
])
|
|
],
|
|
34
|
|
/* CLASS, NEED_HYDRATION */
|
|
)), [
|
|
[_directive_keyboard_clickable]
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "87de36e3";
|
|
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/Card.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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Ozs7Ozs7O1VBRUYsb0JBcUJNLE9BckJOLGFBcUJNO0FBQUEsYUFuQkssOEJBQXVCLFlBQUssbUJBRHJDLG9CQVNNO0FBQUE7Y0FQSixPQUFNO0FBQUEsY0FDTCxJQUFJLDBCQUFtQixrQkFBVyxhQUFNLEVBQUU7QUFBQSxjQUFHLG9CQUFpQjtBQUFBO2NBRS9ELGFBQXFHO0FBQUEsZ0JBQXBGLE9BQU07QUFBQSxnQkFBVSxvQkFBaUI7QUFBQTtjQUNsRDtBQUFBLGdCQUVPO0FBQUEsZ0JBRlA7QUFBQSxnQkFFTyxpQkFERixhQUFNLG1CQUFtQixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7MkNBRzFDLGFBU2E7QUFBQSxjQVBYLE9BQU07QUFBQSxjQUNOLE1BQUs7QUFBQSxjQUNMLE9BQU07QUFBQSxjQUNMLFNBQUsscURBQU8sY0FBTyxLQUFLLDBCQUFtQixrQkFBVyxhQUFNLEVBQUU7QUFBQSxjQUFJLG9CQUFpQjtBQUFBO2dDQUVwRixNQUFrRztBQUFBLGdCQUFsRyxhQUFrRztBQUFBLGtCQUFwRixPQUFNO0FBQUEsa0JBQVUsb0JBQWlCO0FBQUE7O2tCQUFtRCxNQUNsRyxpQkFBRyxtQkFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O2lDQVBOLGVBQWU7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiQ2FyZC52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWVqcy1hY2Nlc3NpYmlsaXR5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdlxyXG4gICAgdi1rZXlib2FyZC1jbGlja2FibGVcclxuICAgIDpjbGFzcz1cImNvbnRhaW5lckNsYXNzZXNcIlxyXG4gICAgQGNsaWNrPVwib25DYXJkQ2xpY2tcIlxyXG4gICAgQG1vdXNlbGVhdmU9XCI7KHNob3dBY3Rpb25zTWVudSA9IGZhbHNlKSwgKGhvdmVyZWQgPSBmYWxzZSlcIlxyXG4gICAgQG1vdXNlZW50ZXI9XCJob3ZlcmVkID0gdHJ1ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6NTozXCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgcC0yIGgtZnVsbCBmbGV4IGZsZXgtY29sXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZToxMjo1XCI+XHJcbiAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgIHYtaWY9XCIhZGVmYXVsdExpbmtEaXNhYmxlZFwiXHJcbiAgICAgICAgOnRvPVwibW9kZWxVcmxcIlxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgei0xMCBpbnNldC0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZToxMzo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHotNDAgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGgtMTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0NhcmQudnVlOjE4OjdcIj5cclxuICAgICAgICA8TnV4dExpbmsgOnRvPVwiIWRlZmF1bHRMaW5rRGlzYWJsZWQgPyBtb2RlbFVybCA6IHVuZGVmaW5lZFwiIGNsYXNzPVwidHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0NhcmQudnVlOjE5OjlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIHNlbGVjdC1ub25lIHctZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MjA6MTFcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHYtaWY9XCJuYW1lUGFydHNbMF1cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMiByZWxhdGl2ZSB0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MjE6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgbmFtZVBhcnRzWzBdIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHkteHMgZm9udC1tZWRpdW0gdHJ1bmNhdGUgdGV4dC1mb3JlZ3JvdW5kIGZsZXgtc2hyaW5rIG1pbi13LTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0NhcmQudnVlOjI3OjEzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IG5hbWVQYXJ0c1sxXSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvTnV4dExpbms+XHJcbiAgICAgICAgPFByb2plY3RQYWdlTW9kZWxzQWN0aW9uc1xyXG4gICAgICAgICAgdi1pZj1cInByb2plY3QgJiYgc2hvd0FjdGlvbnMgJiYgIWlzUGVuZGluZ01vZGVsRnJhZ21lbnQobW9kZWwpXCJcclxuICAgICAgICAgIHJlZj1cImFjdGlvbnNcIlxyXG4gICAgICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgICAgICBAY2xpY2suc3RvcC5wcmV2ZW50XHJcbiAgICAgICAgICBAdXBsb2FkLXZlcnNpb249XCJ0cmlnZ2VyVmVyc2lvblVwbG9hZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MzQ6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBteS0xIGZsZXgtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6NDQ6N1wiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICAgaXNBdXRvbWF0ZU1vZHVsZUVuYWJsZWQgJiZcclxuICAgICAgICAgICAgIWlzUGVuZGluZ01vZGVsRnJhZ21lbnQobW9kZWwpICYmXHJcbiAgICAgICAgICAgIG1vZGVsLmF1dG9tYXRpb25zU3RhdHVzXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ6LTMwIGFic29sdXRlIHRvcC0wIGxlZnQtMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6NDU6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPEF1dG9tYXRlUnVuc1RyaWdnZXJTdGF0dXNcclxuICAgICAgICAgICAgOnByb2plY3QtaWQ9XCJwcm9qZWN0SWRcIlxyXG4gICAgICAgICAgICA6c3RhdHVzPVwibW9kZWwuYXV0b21hdGlvbnNTdGF0dXNcIlxyXG4gICAgICAgICAgICA6bW9kZWwtaWQ9XCJtb2RlbC5pZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6NTM6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8UHJvamVjdFBlbmRpbmdGaWxlSW1wb3J0U3RhdHVzXHJcbiAgICAgICAgICB2LWlmPVwiaXNQZW5kaW5nTW9kZWxGcmFnbWVudChtb2RlbClcIlxyXG4gICAgICAgICAgOnVwbG9hZD1cIm1vZGVsXCJcclxuICAgICAgICAgIGNsYXNzPVwicHgtNCB3LWZ1bGwgaC00OFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6NTk6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8UHJvamVjdFBlbmRpbmdGaWxlSW1wb3J0U3RhdHVzXHJcbiAgICAgICAgICB2LWVsc2UtaWY9XCJwZW5kaW5nVmVyc2lvblwiXHJcbiAgICAgICAgICA6dXBsb2FkPVwicGVuZGluZ1ZlcnNpb25cIlxyXG4gICAgICAgICAgdHlwZT1cInN1YnZlcnNpb25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJweC00IHctZnVsbCBoLTQ4IHRleHQtZm9yZWdyb3VuZC0yIHRleHQtc20gZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc3BhY2UteS0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZTo2NDo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJwcmV2aWV3VXJsICYmICFpc1ZlcnNpb25VcGxvYWRpbmdcIj5cclxuICAgICAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgICAgICA6dG89XCIhZGVmYXVsdExpbmtEaXNhYmxlZCA/IG1vZGVsVXJsIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTIwIGJnLWZvdW5kYXRpb24tcGFnZSB3LWZ1bGwgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLW91dGxpbmUtMiBvdmVyZmxvdy1oaWRkZW5cIlxyXG4gICAgICAgICAgICA6Y2xhc3M9XCJzbWFsbFZpZXcgPyAnaC0yNCcgOiAnaC00OCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0NhcmQudnVlOjcxOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPFByZXZpZXdJbWFnZSA6cHJldmlldy11cmw9XCJwcmV2aWV3VXJsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZTo3NjoxM1wiIC8+XHJcbiAgICAgICAgICA8L051eHRMaW5rPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1pZj1cIiFpc1BlbmRpbmdNb2RlbEZyYWdtZW50KG1vZGVsKSAmJiBwcm9qZWN0XCJcclxuICAgICAgICAgIHYtc2hvdz1cIiFwZW5kaW5nVmVyc2lvbiAmJiAoaXNWZXJzaW9uVXBsb2FkaW5nIHx8ICFwcmV2aWV3VXJsKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImgtNDggdy1mdWxsIHJlbGF0aXZlIHotMzBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0NhcmQudnVlOjc5OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxQcm9qZWN0Q2FyZEltcG9ydEZpbGVBcmVhXHJcbiAgICAgICAgICAgIHJlZj1cImltcG9ydEFyZWFcIlxyXG4gICAgICAgICAgICBlbXB0eS1zdGF0ZS12YXJpYW50PVwibW9kZWxHcmlkXCJcclxuICAgICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgICAgICAgOm1vZGVsPVwibW9kZWxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGxcIlxyXG4gICAgICAgICAgICBAdXBsb2FkaW5nPVwib25WZXJzaW9uVXBsb2FkaW5nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZTo4NDoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHotMjAgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHctZnVsbCBoLTggcGwtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6OTQ6N1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZTo5NTo5XCI+XHJcbiAgICAgICAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkVXBkYXRlZFRpbWVcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzIHRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgICAgOnVwZGF0ZWQtYXQ9XCJ1cGRhdGVkQXRGdWxsRGF0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6OTY6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgICAgICB2LWlmPVwic2hvd0xhc3RVcGxvYWRGYWlsZWRcIlxyXG4gICAgICAgICAgICB2LWtleWJvYXJkLWNsaWNrYWJsZVxyXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0zeHMgdGV4dC1kYW5nZXIgaG92ZXI6dGV4dC1kYW5nZXItbGlnaHRlciBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wPVwiYWN0aW9ucz8uc2hvd1VwbG9hZHMoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MTAwOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgTGFzdCB1cGxvYWQgZmFpbGVkXHJcbiAgICAgICAgICA8L051eHRMaW5rPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MTA5OjlcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIiFpc1BlbmRpbmdNb2RlbEZyYWdtZW50KG1vZGVsKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgIXRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgICAgOnRvPVwibW9kZWxWZXJzaW9uc1JvdXRlKHByb2plY3RJZCwgbW9kZWwuaWQpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZToxMTA6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8SWNvbkRpc2N1c3Npb25zIGNsYXNzPVwiaC00IHctNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MTE1OjEzXCIgLz5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGZvbnQtbWVkaXVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZToxMTY6MTNcIj5cclxuICAgICAgICAgICAgICB7eyBtb2RlbC5jb21tZW50VGhyZWFkQ291bnQudG90YWxDb3VudCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCInVmlldyBWZXJzaW9ucydcIlxyXG4gICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgIXRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJyb3V0ZXIucHVzaChtb2RlbFZlcnNpb25zUm91dGUocHJvamVjdElkLCBtb2RlbC5pZCkpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZToxMjA6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8SWNvblZlcnNpb25zIGNsYXNzPVwiaC00IHctNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvQ2FyZC52dWU6MTI3OjEzXCIgLz5cclxuICAgICAgICAgICAge3sgdmVyc2lvbkNvdW50IH19XHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCIgc2V0dXA+XHJcbmltcG9ydCB0eXBlIHtcclxuICBQZW5kaW5nRmlsZVVwbG9hZEZyYWdtZW50LFxyXG4gIFByb2plY3RQYWdlTGF0ZXN0SXRlbXNNb2RlbEl0ZW1GcmFnbWVudCxcclxuICBQcm9qZWN0UGFnZU1vZGVsc0NhcmRQcm9qZWN0RnJhZ21lbnRcclxufSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgbW9kZWxWZXJzaW9uc1JvdXRlIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQge1xyXG4gIGdldE1vZGVsSXRlbVJvdXRlLFxyXG4gIGlzUGVuZGluZ01vZGVsRnJhZ21lbnRcclxufSBmcm9tICd+fi9saWIvcHJvamVjdHMvaGVscGVycy9tb2RlbHMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IEZpbGVBcmVhVXBsb2FkaW5nUGF5bG9hZCB9IGZyb20gJ34vbGliL2Zvcm0vaGVscGVycy9maWxlVXBsb2FkJ1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL2Jsb2JzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBQcm9qZWN0UGFnZU1vZGVsc0NhcmRQcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIHJvbGVcclxuICAgIHZpc2liaWxpdHlcclxuICAgIC4uLlByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19Qcm9qZWN0XHJcbiAgICAuLi5Qcm9qZWN0Q2FyZEltcG9ydEZpbGVBcmVhX1Byb2plY3RcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQ3JlYXRlTW9kZWwge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RQYWdlTW9kZWxzQ2FyZF9Nb2RlbCBvbiBNb2RlbCB7XHJcbiAgICBpZFxyXG4gICAgaG9tZVZpZXcge1xyXG4gICAgICBpZFxyXG4gICAgICByZXNvdXJjZUlkc1xyXG4gICAgfVxyXG4gICAgbGFzdFVwbG9hZDogdXBsb2FkcyhpbnB1dDogeyBsaW1pdDogMSwgY3Vyc29yOiBudWxsIH0pIHtcclxuICAgICAgaXRlbXMge1xyXG4gICAgICAgIGlkXHJcbiAgICAgICAgdXBkYXRlZEF0XHJcbiAgICAgICAgY29udmVydGVkU3RhdHVzXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxhc3RWZXJzaW9uOiB2ZXJzaW9ucyhsaW1pdDogMSwgY3Vyc29yOiBudWxsKSB7XHJcbiAgICAgIGl0ZW1zIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIGNyZWF0ZWRBdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ2NsaWNrJywgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhcclxuICBkZWZpbmVQcm9wczx7XHJcbiAgICBwcm9qZWN0SWQ6IHN0cmluZ1xyXG4gICAgbW9kZWw6IFByb2plY3RQYWdlTGF0ZXN0SXRlbXNNb2RlbEl0ZW1GcmFnbWVudCB8IFBlbmRpbmdGaWxlVXBsb2FkRnJhZ21lbnRcclxuICAgIHByb2plY3Q6IE9wdGlvbmFsPFByb2plY3RQYWdlTW9kZWxzQ2FyZFByb2plY3RGcmFnbWVudD5cclxuICAgIHNob3dWZXJzaW9ucz86IGJvb2xlYW5cclxuICAgIHNob3dBY3Rpb25zPzogYm9vbGVhblxyXG4gICAgZGlzYWJsZURlZmF1bHRMaW5rPzogYm9vbGVhblxyXG4gICAgc21hbGxWaWV3PzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgc2hvd1ZlcnNpb25zOiB0cnVlLFxyXG4gICAgc2hvd0FjdGlvbnM6IHRydWUsXHJcbiAgICBzbWFsbFZpZXc6IGZhbHNlXHJcbiAgfVxyXG4pXHJcblxyXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxyXG5jb25zdCBpc0F1dG9tYXRlTW9kdWxlRW5hYmxlZCA9IHVzZUlzQXV0b21hdGVNb2R1bGVFbmFibGVkKClcclxuXHJcbmNvbnN0IGltcG9ydEFyZWEgPSByZWYoXHJcbiAgbnVsbCBhcyBOdWxsYWJsZTx7XHJcbiAgICB0cmlnZ2VyUGlja2VyOiAoKSA9PiB2b2lkXHJcbiAgfT5cclxuKVxyXG5cclxuY29uc3QgYWN0aW9ucyA9IHJlZihcclxuICBudWxsIGFzIE51bGxhYmxlPHtcclxuICAgIHNob3dVcGxvYWRzOiAoKSA9PiB2b2lkXHJcbiAgfT5cclxuKVxyXG5cclxuY29uc3QgaXNWZXJzaW9uVXBsb2FkaW5nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBzaG93QWN0aW9uc01lbnUgPSByZWYoZmFsc2UpXHJcbmNvbnN0IGhvdmVyZWQgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBzaG93TGFzdFVwbG9hZEZhaWxlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNQZW5kaW5nTW9kZWxGcmFnbWVudChwcm9wcy5tb2RlbCkpIHJldHVybiBmYWxzZVxyXG4gIGNvbnN0IGxhc3RVcGxvYWQgPSBwcm9wcy5tb2RlbC5sYXN0VXBsb2FkPy5pdGVtc1swXVxyXG4gIGNvbnN0IGxhc3RWZXJzaW9uID0gcHJvcHMubW9kZWwubGFzdFZlcnNpb24/Lml0ZW1zWzBdXHJcblxyXG4gIC8vIE9ubHkgc2hvdyBpZiBsYXN0IHVwbG9hZCBmYWlsZWQgJiB0aGVyZSBpcyBubyBsYXN0IHZlcnNpb24sXHJcbiAgLy8gb3IgbGFzdCB2ZXJzaW9uIGlzIG9sZGVyIHRoYW4gbGFzdCB1cGxvYWRcclxuICBpZiAobGFzdFVwbG9hZD8uY29udmVydGVkU3RhdHVzICE9PSBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzLkVycm9yKSByZXR1cm4gZmFsc2VcclxuICBpZiAoIWxhc3RWZXJzaW9uKSByZXR1cm4gdHJ1ZVxyXG4gIHJldHVybiBkYXlqcyhsYXN0VXBsb2FkLnVwZGF0ZWRBdCkuaXNBZnRlcihkYXlqcyhsYXN0VmVyc2lvbi5jcmVhdGVkQXQpKVxyXG59KVxyXG5cclxuY29uc3QgY29udGFpbmVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBjbGFzc1BhcnRzID0gW1xyXG4gICAgJ2dyb3VwIHJvdW5kZWQteGwgYmctZm91bmRhdGlvbiBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyBob3Zlcjpib3JkZXItb3V0bGluZS01IHctZnVsbCB6LVswXSdcclxuICBdXHJcblxyXG4gIGlmICh2ZXJzaW9uQ291bnQudmFsdWUgPiAwKSB7XHJcbiAgICBjbGFzc1BhcnRzLnB1c2goJ2N1cnNvci1wb2ludGVyJylcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG59KVxyXG5jb25zdCBuYW1lUGFydHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbW9kZWwgPSBwcm9wcy5tb2RlbFxyXG4gIGNvbnN0IG1vZGVsTmFtZSA9IGlzUGVuZGluZ01vZGVsRnJhZ21lbnQobW9kZWwpID8gbW9kZWwubW9kZWxOYW1lIDogbW9kZWwubmFtZVxyXG4gIGNvbnN0IHNwbGl0TmFtZSA9IG1vZGVsTmFtZS5zcGxpdCgnLycpXHJcbiAgaWYgKHNwbGl0TmFtZS5sZW5ndGggPT09IDEpIHJldHVybiBbbnVsbCwgbW9kZWxOYW1lXVxyXG5cclxuICBjb25zdCBkaXNwbGF5TmFtZSA9IHNwbGl0TmFtZS5wb3AoKVxyXG4gIHJldHVybiBbc3BsaXROYW1lLmpvaW4oJy8nKSArICcvJywgZGlzcGxheU5hbWVdXHJcbn0pXHJcblxyXG5jb25zdCBtb2RlbFVybCA9IGNvbXB1dGVkKCgpID0+IGdldE1vZGVsSXRlbVJvdXRlKHByb3BzLm1vZGVsKSlcclxuXHJcbmNvbnN0IHByZXZpZXdVcmwgPSBjb21wdXRlZCgoKSA9PlxyXG4gIGlzUGVuZGluZ01vZGVsRnJhZ21lbnQocHJvcHMubW9kZWwpID8gbnVsbCA6IHByb3BzLm1vZGVsLnByZXZpZXdVcmxcclxuKVxyXG5jb25zdCBkZWZhdWx0TGlua0Rpc2FibGVkID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMuZGlzYWJsZURlZmF1bHRMaW5rIHx8IHZlcnNpb25Db3VudC52YWx1ZSA8IDFcclxuKVxyXG5cclxuY29uc3QgdXBkYXRlZEF0RnVsbERhdGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIGlzUGVuZGluZ01vZGVsRnJhZ21lbnQocHJvcHMubW9kZWwpXHJcbiAgICA/IHByb3BzLm1vZGVsLmNvbnZlcnRlZExhc3RVcGRhdGUgfHwgcHJvcHMubW9kZWwudXBsb2FkRGF0ZVxyXG4gICAgOiBwcm9wcy5tb2RlbC51cGRhdGVkQXRcclxufSlcclxuXHJcbmNvbnN0IHZlcnNpb25Db3VudCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gaXNQZW5kaW5nTW9kZWxGcmFnbWVudChwcm9wcy5tb2RlbCkgPyAwIDogcHJvcHMubW9kZWwudmVyc2lvbkNvdW50LnRvdGFsQ291bnRcclxufSlcclxuXHJcbmNvbnN0IHBlbmRpbmdWZXJzaW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChpc1BlbmRpbmdNb2RlbEZyYWdtZW50KHByb3BzLm1vZGVsKSkge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGNvbnN0IGxhc3RQZW5kaW5nVmVyc2lvbiA9IHByb3BzLm1vZGVsLnBlbmRpbmdJbXBvcnRlZFZlcnNpb25zWzBdXHJcbiAgY29uc3QgbGFzdFZlcnNpb24gPSBwcm9wcy5tb2RlbC5sYXN0VmVyc2lvbj8uaXRlbXNbMF1cclxuICBpZiAoIWxhc3RWZXJzaW9uIHx8ICFsYXN0UGVuZGluZ1ZlcnNpb24pIHJldHVybiBsYXN0UGVuZGluZ1ZlcnNpb25cclxuXHJcbiAgLy8gSWYgcGVuZGluZyB2ZXJzaW9uIGlzIG9sZGVyIHRoYW4gbmV3ZXN0IHZlcnNpb24sIGhpZGUgaXQgKG1heSBiZSBhIHN0dWNrIGltcG9ydClcclxuICBpZiAoZGF5anMobGFzdFBlbmRpbmdWZXJzaW9uLnVwZGF0ZWRBdCkuaXNCZWZvcmUoZGF5anMobGFzdFZlcnNpb24uY3JlYXRlZEF0KSkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbGFzdFBlbmRpbmdWZXJzaW9uXHJcbn0pXHJcblxyXG5jb25zdCBvbkNhcmRDbGljayA9IChldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpID0+IHtcclxuICBpZiAoXHJcbiAgICAhcHJldmlld1VybC52YWx1ZSAmJlxyXG4gICAgIXBlbmRpbmdWZXJzaW9uLnZhbHVlICYmXHJcbiAgICAhaXNQZW5kaW5nTW9kZWxGcmFnbWVudChwcm9wcy5tb2RlbClcclxuICApIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBlbWl0KCdjbGljaycsIGV2ZW50KVxyXG59XHJcblxyXG5jb25zdCBvblZlcnNpb25VcGxvYWRpbmcgPSAocGF5bG9hZDogRmlsZUFyZWFVcGxvYWRpbmdQYXlsb2FkKSA9PiB7XHJcbiAgaXNWZXJzaW9uVXBsb2FkaW5nLnZhbHVlID0gcGF5bG9hZC5pc1VwbG9hZGluZ1xyXG59XHJcblxyXG5jb25zdCB0cmlnZ2VyVmVyc2lvblVwbG9hZCA9ICgpID0+IHtcclxuICBpbXBvcnRBcmVhLnZhbHVlPy50cmlnZ2VyUGlja2VyKClcclxufVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9DYXJkLnZ1ZSJ9 |