476 lines
49 KiB
Plaintext
476 lines
49 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/Card.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/node_modules/@nuxt/image/dist/runtime/components/NuxtImg.vue";
|
|
import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { LayoutMenu as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/VisibilityButton.vue";
|
|
import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/IsolateButton.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createVNode as __createVNode,createBlock as __createBlock,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
|
|
function _interopVNode(vnode) {
|
|
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
|
|
const data = vnode.props['data-v-inspector']
|
|
delete vnode.props['data-v-inspector']
|
|
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
|
|
}
|
|
return vnode
|
|
}
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
/* Injection by vite-plugin-vue-inspector End */
|
|
import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import __vite__cjsImport8_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport8_dayjs.__esModule ? __vite__cjsImport8_dayjs.default : __vite__cjsImport8_dayjs;
|
|
import {
|
|
useHighlightedObjectsUtilities,
|
|
useCameraUtilities,
|
|
useSelectionUtilities
|
|
} from "/_nuxt/lib/viewer/composables/ui.ts";
|
|
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
|
|
import {
|
|
useInjectedViewerState,
|
|
useInjectedViewerRequestedResources,
|
|
useInjectedViewerLoadedResources
|
|
} from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import { containsAll } from "/_nuxt/lib/common/helpers/utils.ts";
|
|
import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts";
|
|
import { useLoadLatestVersion } from "/_nuxt/lib/viewer/composables/resources.ts";
|
|
import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
|
|
import { useCopyModelLink } from "/_nuxt/lib/projects/composables/modelManagement.ts";
|
|
import { Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
|
|
|
|
import { useDateFormatters } from "/_nuxt/composables/dates.ts";
|
|
import { useRoute } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerModelsCard",
|
|
props: {
|
|
model: { type: null, required: true },
|
|
versionId: { type: String, required: true },
|
|
isExpanded: { type: Boolean, required: false }
|
|
},
|
|
emits: ["show-versions", "show-diff", "toggle-expansion"],
|
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
__expose();
|
|
const emit = __emit;
|
|
const props = __props;
|
|
const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities();
|
|
const { hideObjects, showObjects, isolateObjects, unIsolateObjects } = useFilterUtilities();
|
|
const { zoom } = useCameraUtilities();
|
|
const { items } = useInjectedViewerRequestedResources();
|
|
const { resourceItems } = useInjectedViewerLoadedResources();
|
|
const { addToSelectionFromObjectIds } = useSelectionUtilities();
|
|
const {
|
|
viewer: {
|
|
metadata: { filteringState }
|
|
},
|
|
ui: { filters }
|
|
} = useInjectedViewerState();
|
|
const mp = useMixpanel();
|
|
const copyModelLink = useCopyModelLink();
|
|
const { formattedRelativeDate, formattedFullDate } = useDateFormatters();
|
|
const route = useRoute();
|
|
const resourceIdString = computed(() => {
|
|
const resourceParam = route.params.modelId;
|
|
return Array.isArray(resourceParam) ? resourceParam.join("/") : resourceParam;
|
|
});
|
|
const {
|
|
resources: {
|
|
response: { project }
|
|
}
|
|
} = useInjectedViewerState();
|
|
const { load: loadLatestVersion } = useLoadLatestVersion({
|
|
project: computed(() => project.value),
|
|
resourceIdString: computed(() => resourceIdString.value || "")
|
|
});
|
|
const showActionsMenu = ref(false);
|
|
const removeEnabled = computed(() => items.value.length > 1);
|
|
const actionsItems = computed(() => [
|
|
[
|
|
{
|
|
title: "Copy link to model",
|
|
id: "copy-link-to-model"
|
|
},
|
|
{
|
|
title: "Show version history",
|
|
id: "show-version-history"
|
|
},
|
|
{
|
|
title: "Load latest version",
|
|
id: "load-latest-version",
|
|
disabled: isLatest.value,
|
|
disabledTooltip: "Already on the latest version"
|
|
},
|
|
{
|
|
title: "Show version changes",
|
|
id: "show-version-changes",
|
|
disabled: isLatest.value,
|
|
disabledTooltip: "No changes to show for the latest version"
|
|
}
|
|
],
|
|
[
|
|
{
|
|
title: "Remove model",
|
|
id: "remove-model",
|
|
disabled: !removeEnabled.value,
|
|
disabledTooltip: "You cannot remove the last model"
|
|
}
|
|
]
|
|
]);
|
|
const versions = computed(() => [
|
|
...props.model.loadedVersion.items,
|
|
...props.model.versions.items
|
|
]);
|
|
const loadedVersion = computed(
|
|
() => versions.value.find((v) => v.id === props.versionId)
|
|
);
|
|
const createdAt = computed(() => loadedVersion.value?.createdAt);
|
|
const createdAtFormatted = computed(() => {
|
|
return {
|
|
full: formattedFullDate(createdAt.value),
|
|
relative: formattedRelativeDate(createdAt.value, { capitalize: true })
|
|
};
|
|
});
|
|
const latestVersion = computed(() => {
|
|
return versions.value.slice().sort((a, b) => dayjs(a.createdAt).isBefore(dayjs(b.createdAt)) ? 1 : -1)[0];
|
|
});
|
|
const isLatest = computed(() => loadedVersion.value?.id === latestVersion.value.id);
|
|
const modelName = computed(() => {
|
|
const parts = props.model.name.split("/");
|
|
if (parts.length > 1) {
|
|
const name = parts[parts.length - 1];
|
|
parts.pop();
|
|
return {
|
|
subheader: parts.join("/"),
|
|
header: name
|
|
};
|
|
} else {
|
|
return {
|
|
subheader: null,
|
|
header: props.model.name
|
|
};
|
|
}
|
|
});
|
|
const modelObjectIds = computed(() => {
|
|
const refObject = props.model.loadedVersion.items[0]?.referencedObject;
|
|
return refObject ? getTargetObjectIds({ id: refObject }) : [];
|
|
});
|
|
const hiddenObjects = computed(() => filteringState.value?.hiddenObjects);
|
|
const { isolatedObjectsSet } = filters;
|
|
const isHidden = computed(() => {
|
|
if (!hiddenObjects.value || modelObjectIds.value.length === 0) return false;
|
|
return containsAll(modelObjectIds.value, hiddenObjects.value);
|
|
});
|
|
const isIsolated = computed(() => {
|
|
if (!isolatedObjectsSet.value || modelObjectIds.value.length === 0) return false;
|
|
const isolatedObjectsArray = Array.from(isolatedObjectsSet.value);
|
|
return containsAll(modelObjectIds.value, isolatedObjectsArray);
|
|
});
|
|
const stateHasIsolatedObjectsInGeneral = computed(() => {
|
|
if (!isolatedObjectsSet.value) return false;
|
|
return isolatedObjectsSet.value.size > 0;
|
|
});
|
|
const modelContainsIsolatedObjects = computed(() => {
|
|
if (!isolatedObjectsSet.value || isolatedObjectsSet.value.size === 0) return false;
|
|
return modelObjectIds.value.some((modelId) => isolatedObjectsSet.value.has(modelId));
|
|
});
|
|
const shouldShowDimmed = computed(() => {
|
|
return stateHasIsolatedObjectsInGeneral.value && !modelContainsIsolatedObjects.value;
|
|
});
|
|
const hideOrShowObject = (e) => {
|
|
e.stopPropagation();
|
|
if (modelObjectIds.value.length === 0) return;
|
|
if (!isHidden.value) {
|
|
hideObjects(modelObjectIds.value);
|
|
} else {
|
|
showObjects(modelObjectIds.value);
|
|
}
|
|
};
|
|
const isolateOrUnisolateObject = (e) => {
|
|
e.stopPropagation();
|
|
if (modelObjectIds.value.length === 0) return;
|
|
if (!isIsolated.value) {
|
|
isolateObjects(modelObjectIds.value);
|
|
} else {
|
|
unIsolateObjects(modelObjectIds.value);
|
|
}
|
|
};
|
|
const highlightObject = () => {
|
|
const refObject = props.model.loadedVersion.items[0]?.referencedObject;
|
|
if (refObject && typeof refObject === "string") highlightObjects([refObject]);
|
|
};
|
|
const unhighlightObject = () => {
|
|
const refObject = props.model.loadedVersion.items[0]?.referencedObject;
|
|
if (refObject && typeof refObject === "string") unhighlightObjects([refObject]);
|
|
};
|
|
const handleClick = () => {
|
|
if (!props.isExpanded) {
|
|
emit("toggle-expansion");
|
|
} else {
|
|
addToSelectionFromObjectIds(modelObjectIds.value);
|
|
}
|
|
};
|
|
const zoomToModel = () => {
|
|
if (modelObjectIds.value.length > 0) {
|
|
zoom(modelObjectIds.value);
|
|
}
|
|
};
|
|
const removeModel = async (modelId) => {
|
|
const builder = SpeckleViewer.ViewerRoute.resourceBuilder();
|
|
for (const loadedResource of resourceItems.value) {
|
|
if (loadedResource.modelId) {
|
|
if (loadedResource.modelId !== modelId) {
|
|
builder.addModel(loadedResource.modelId, loadedResource.versionId || void 0);
|
|
}
|
|
} else {
|
|
if (loadedResource.objectId !== modelId)
|
|
builder.addObject(loadedResource.objectId);
|
|
}
|
|
}
|
|
mp.track("Viewer Action", { type: "action", name: "federation", action: "remove" });
|
|
await items.update(builder.toResources());
|
|
};
|
|
const onActionChosen = async (params) => {
|
|
const { item } = params;
|
|
switch (item.id) {
|
|
case "copy-link-to-model":
|
|
if (project.value) {
|
|
copyModelLink({ model: { projectId: project.value.id, id: props.model.id } });
|
|
}
|
|
break;
|
|
case "load-latest-version":
|
|
if (!isLatest.value) {
|
|
loadLatestVersion();
|
|
}
|
|
break;
|
|
case "show-version-history":
|
|
emit("show-versions", props.model.id);
|
|
break;
|
|
case "show-version-changes":
|
|
if (loadedVersion.value && latestVersion.value && loadedVersion.value.id !== latestVersion.value.id) {
|
|
emit(
|
|
"show-diff",
|
|
props.model.id,
|
|
loadedVersion.value.id,
|
|
latestVersion.value.id
|
|
);
|
|
}
|
|
break;
|
|
case "remove-model":
|
|
if (removeEnabled.value) {
|
|
await removeModel(props.model.id);
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
const __returned__ = { emit, props, highlightObjects, unhighlightObjects, hideObjects, showObjects, isolateObjects, unIsolateObjects, zoom, items, resourceItems, addToSelectionFromObjectIds, filteringState, filters, mp, copyModelLink, formattedRelativeDate, formattedFullDate, route, resourceIdString, project, loadLatestVersion, showActionsMenu, removeEnabled, actionsItems, versions, loadedVersion, createdAt, createdAtFormatted, latestVersion, isLatest, modelName, modelObjectIds, hiddenObjects, isolatedObjectsSet, isHidden, isIsolated, stateHasIsolatedObjectsInGeneral, modelContainsIsolatedObjects, shouldShowDimmed, hideOrShowObject, isolateOrUnisolateObject, highlightObject, unhighlightObject, handleClick, zoomToModel, removeModel, onActionChosen, get Ellipsis() {
|
|
return Ellipsis;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, withModifiers as _withModifiers, withCtx as _withCtx, withKeys as _withKeys } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "bg-foundation relative",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:3:3"
|
|
};
|
|
const _hoisted_2 = { "data-v-inspector": "components/viewer/models/Card.vue:4:5" };
|
|
const _hoisted_3 = {
|
|
class: "flex flex-col min-w-0",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:32:9"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "text-body-2xs font-medium truncate",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:33:11"
|
|
};
|
|
const _hoisted_5 = {
|
|
key: 0,
|
|
class: "text-body-3xs text-foreground",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:39:11"
|
|
};
|
|
const _hoisted_6 = {
|
|
key: 1,
|
|
class: "text-body-3xs text-primary truncate",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:42:11"
|
|
};
|
|
const _hoisted_7 = {
|
|
class: "flex items-center gap-1 text-body-3xs text-foreground-2 min-w-0",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:45:11"
|
|
};
|
|
const _hoisted_8 = {
|
|
key: 0,
|
|
class: "shrink-0 flex items-center gap-1",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:46:13"
|
|
};
|
|
const _hoisted_9 = { "data-v-inspector": "components/viewer/models/Card.vue:50:15" };
|
|
const _hoisted_10 = {
|
|
class: "truncate",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:55:13"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_ViewerExpansionTriangle = __nuxt_component_0;
|
|
const _component_NuxtImg = __nuxt_component_1;
|
|
const _component_FormButton = __nuxt_component_2;
|
|
const _component_LayoutMenu = __nuxt_component_3;
|
|
const _component_ViewerVisibilityButton = __nuxt_component_4;
|
|
const _component_ViewerIsolateButton = __nuxt_component_5;
|
|
const _directive_tippy = _resolveDirective("tippy");
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_createCommentVNode(" Model Header "),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(["group flex items-center h-16 select-none cursor-pointer hover:bg-highlight-1 border-b border-outline-3", $setup.isHidden ? "opacity-50" : ""]),
|
|
onMouseenter: $setup.highlightObject,
|
|
onMouseleave: $setup.unhighlightObject,
|
|
onFocusin: $setup.highlightObject,
|
|
onFocusout: $setup.unhighlightObject,
|
|
onClick: $setup.handleClick,
|
|
onDblclick: $setup.zoomToModel,
|
|
onKeydown: _withKeys($setup.handleClick, ["enter"]),
|
|
"data-v-inspector": "components/viewer/models/Card.vue:6:7"
|
|
},
|
|
[
|
|
_createVNode(_component_ViewerExpansionTriangle, {
|
|
class: "h-8",
|
|
"is-expanded": $props.isExpanded,
|
|
onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("toggle-expansion")),
|
|
"data-v-inspector": "components/viewer/models/Card.vue:17:9"
|
|
}, null, 8, ["is-expanded"]),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(["h-12 w-12 rounded-md overflow-hidden border border-outline-3 mr-3 shrink-0", { grayscale: $setup.shouldShowDimmed }]),
|
|
"data-v-inspector": "components/viewer/models/Card.vue:22:9"
|
|
},
|
|
[
|
|
$setup.loadedVersion?.previewUrl ? (_openBlock(), _createBlock(_component_NuxtImg, {
|
|
key: 0,
|
|
src: $setup.loadedVersion.previewUrl,
|
|
class: "w-full h-full object-cover",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:26:11"
|
|
}, null, 8, ["src"])) : _createCommentVNode("v-if", true)
|
|
],
|
|
2
|
|
/* CLASS */
|
|
),
|
|
_createElementVNode("div", _hoisted_3, [
|
|
_withDirectives((_openBlock(), _createElementBlock("div", _hoisted_4, [
|
|
_createTextVNode(
|
|
_toDisplayString($setup.modelName.header),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])), [
|
|
[_directive_tippy, $setup.modelName.subheader ? $props.model.name : null]
|
|
]),
|
|
$setup.isLatest ? (_openBlock(), _createElementBlock("div", _hoisted_5, " Latest version ")) : (_openBlock(), _createElementBlock("div", _hoisted_6, " Viewing old version ")),
|
|
_createElementVNode("div", _hoisted_7, [
|
|
$setup.loadedVersion?.sourceApplication ? (_openBlock(), _createElementBlock("div", _hoisted_8, [
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_9,
|
|
_toDisplayString($setup.loadedVersion.sourceApplication),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_cache[4] || (_cache[4] = _createElementVNode(
|
|
"span",
|
|
{
|
|
class: "shrink-0",
|
|
"data-v-inspector": "components/viewer/models/Card.vue:53:15"
|
|
},
|
|
"·",
|
|
-1
|
|
/* CACHED */
|
|
))
|
|
])) : _createCommentVNode("v-if", true),
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_10,
|
|
_toDisplayString($setup.createdAtFormatted.relative),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])
|
|
]),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass([
|
|
"flex items-center ml-auto mr-2 w-0 group-hover:w-auto opacity-0 group-hover:opacity-100 transition",
|
|
$setup.showActionsMenu || $setup.isIsolated || $setup.isHidden ? "!w-auto !opacity-100" : ""
|
|
]),
|
|
"data-v-inspector": "components/viewer/models/Card.vue:60:9"
|
|
},
|
|
[
|
|
_createVNode(_component_LayoutMenu, {
|
|
open: $setup.showActionsMenu,
|
|
"onUpdate:open": _cache[2] || (_cache[2] = ($event) => $setup.showActionsMenu = $event),
|
|
items: $setup.actionsItems,
|
|
"mount-menu-on-body": "",
|
|
onClick: _cache[3] || (_cache[3] = _withModifiers(() => {
|
|
}, ["stop", "prevent"])),
|
|
onChosen: $setup.onActionChosen,
|
|
"data-v-inspector": "components/viewer/models/Card.vue:66:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_FormButton, {
|
|
"hide-text": "",
|
|
class: _normalizeClass({
|
|
"!bg-highlight-3": $setup.showActionsMenu
|
|
}),
|
|
color: "subtle",
|
|
"icon-left": $setup.Ellipsis,
|
|
size: "sm",
|
|
onClick: _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = !$setup.showActionsMenu),
|
|
"data-v-inspector": "components/viewer/models/Card.vue:73:13"
|
|
}, null, 8, ["class", "icon-left"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["open", "items"]),
|
|
_createVNode(_component_ViewerVisibilityButton, {
|
|
"is-hidden": $setup.isHidden,
|
|
"force-visible": $setup.showActionsMenu,
|
|
onClick: $setup.hideOrShowObject,
|
|
"data-v-inspector": "components/viewer/models/Card.vue:84:11"
|
|
}, null, 8, ["is-hidden", "force-visible"]),
|
|
_createVNode(_component_ViewerIsolateButton, {
|
|
"is-isolated": $setup.isIsolated,
|
|
"force-visible": $setup.showActionsMenu,
|
|
onClick: $setup.isolateOrUnisolateObject,
|
|
"data-v-inspector": "components/viewer/models/Card.vue:89:11"
|
|
}, null, 8, ["is-isolated", "force-visible"])
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
],
|
|
34
|
|
/* CLASS, NEED_HYDRATION */
|
|
)
|
|
])
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "6027bc65";
|
|
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
|
|
import.meta.hot.on("file-changed", ({ file }) => {
|
|
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
|
|
});
|
|
import.meta.hot.accept((mod) => {
|
|
if (!mod) return;
|
|
const { default: updated, _rerender_only } = mod;
|
|
if (_rerender_only) {
|
|
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
|
|
} else {
|
|
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
|
|
}
|
|
});
|
|
import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper";
|
|
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/models/Card.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJDYXJkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImJnLWZvdW5kYXRpb24gcmVsYXRpdmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjM6M1wiPlxyXG4gICAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjQ6NVwiPlxyXG4gICAgICA8IS0tIE1vZGVsIEhlYWRlciAtLT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZ3JvdXAgZmxleCBpdGVtcy1jZW50ZXIgaC0xNiBzZWxlY3Qtbm9uZSBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1oaWdobGlnaHQtMSBib3JkZXItYiBib3JkZXItb3V0bGluZS0zXCJcclxuICAgICAgICA6Y2xhc3M9XCJpc0hpZGRlbiA/ICdvcGFjaXR5LTUwJyA6ICcnXCJcclxuICAgICAgICBAbW91c2VlbnRlcj1cImhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgICAgQG1vdXNlbGVhdmU9XCJ1bmhpZ2hsaWdodE9iamVjdFwiXHJcbiAgICAgICAgQGZvY3VzaW49XCJoaWdobGlnaHRPYmplY3RcIlxyXG4gICAgICAgIEBmb2N1c291dD1cInVuaGlnaGxpZ2h0T2JqZWN0XCJcclxuICAgICAgICBAY2xpY2s9XCJoYW5kbGVDbGlja1wiXHJcbiAgICAgICAgQGRibGNsaWNrPVwiem9vbVRvTW9kZWxcIlxyXG4gICAgICAgIEBrZXlkb3duLmVudGVyPVwiaGFuZGxlQ2xpY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjY6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyRXhwYW5zaW9uVHJpYW5nbGVcclxuICAgICAgICAgIGNsYXNzPVwiaC04XCJcclxuICAgICAgICAgIDppcy1leHBhbmRlZD1cImlzRXhwYW5kZWRcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZToxNzo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaC0xMiB3LTEyIHJvdW5kZWQtbWQgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlciBib3JkZXItb3V0bGluZS0zIG1yLTMgc2hyaW5rLTBcIlxyXG4gICAgICAgICAgOmNsYXNzPVwieyBncmF5c2NhbGU6IHNob3VsZFNob3dEaW1tZWQgfVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6MjI6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPE51eHRJbWdcclxuICAgICAgICAgICAgdi1pZj1cImxvYWRlZFZlcnNpb24/LnByZXZpZXdVcmxcIlxyXG4gICAgICAgICAgICA6c3JjPVwibG9hZGVkVmVyc2lvbi5wcmV2aWV3VXJsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6MjY6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtaW4tdy0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTozMjo5XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJtb2RlbE5hbWUuc3ViaGVhZGVyID8gbW9kZWwubmFtZSA6IG51bGxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0yeHMgZm9udC1tZWRpdW0gdHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjMzOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgbW9kZWxOYW1lLmhlYWRlciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IHYtaWY9XCJpc0xhdGVzdFwiIGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjM5OjExXCI+XHJcbiAgICAgICAgICAgIExhdGVzdCB2ZXJzaW9uXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LXByaW1hcnkgdHJ1bmNhdGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL0NhcmQudnVlOjQyOjExXCI+XHJcbiAgICAgICAgICAgIFZpZXdpbmcgb2xkIHZlcnNpb25cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQtYm9keS0zeHMgdGV4dC1mb3JlZ3JvdW5kLTIgbWluLXctMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NDU6MTFcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHYtaWY9XCJsb2FkZWRWZXJzaW9uPy5zb3VyY2VBcHBsaWNhdGlvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaHJpbmstMCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NDY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo1MDoxNVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbG9hZGVkVmVyc2lvbi5zb3VyY2VBcHBsaWNhdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo1MzoxNVwiPsK3PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NTU6MTNcIj5cclxuICAgICAgICAgICAgICB7eyBjcmVhdGVkQXRGb3JtYXR0ZWQucmVsYXRpdmUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBtbC1hdXRvIG1yLTIgdy0wIGdyb3VwLWhvdmVyOnctYXV0byBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvblwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJcclxuICAgICAgICAgICAgc2hvd0FjdGlvbnNNZW51IHx8IGlzSXNvbGF0ZWQgfHwgaXNIaWRkZW4gPyAnIXctYXV0byAhb3BhY2l0eS0xMDAnIDogJydcclxuICAgICAgICAgIFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NjA6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgICAgOml0ZW1zPVwiYWN0aW9uc0l0ZW1zXCJcclxuICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgQGNob3Nlbj1cIm9uQWN0aW9uQ2hvc2VuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo2NjoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgOmNsYXNzPVwie1xyXG4gICAgICAgICAgICAgICAgJyFiZy1oaWdobGlnaHQtMyc6IHNob3dBY3Rpb25zTWVudVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2hvd0FjdGlvbnNNZW51ID0gIXNob3dBY3Rpb25zTWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWU6NzM6MTNcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgICAgPFZpZXdlclZpc2liaWxpdHlCdXR0b25cclxuICAgICAgICAgICAgOmlzLWhpZGRlbj1cImlzSGlkZGVuXCJcclxuICAgICAgICAgICAgOmZvcmNlLXZpc2libGU9XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJoaWRlT3JTaG93T2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo4NDoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPFZpZXdlcklzb2xhdGVCdXR0b25cclxuICAgICAgICAgICAgOmlzLWlzb2xhdGVkPVwiaXNJc29sYXRlZFwiXHJcbiAgICAgICAgICAgIDpmb3JjZS12aXNpYmxlPVwic2hvd0FjdGlvbnNNZW51XCJcclxuICAgICAgICAgICAgQGNsaWNrPVwiaXNvbGF0ZU9yVW5pc29sYXRlT2JqZWN0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9DYXJkLnZ1ZTo4OToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgdHlwZSB7IFZpZXdlckxvYWRlZFJlc291cmNlc1F1ZXJ5IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQgdHlwZSB7IExheW91dE1lbnVJdGVtIH0gZnJvbSAnfn4vbGliL2xheW91dC9oZWxwZXJzL2NvbXBvbmVudHMnXHJcbmltcG9ydCB7XHJcbiAgdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzLFxyXG4gIHVzZUNhbWVyYVV0aWxpdGllcyxcclxuICB1c2VTZWxlY3Rpb25VdGlsaXRpZXNcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlclN0YXRlLFxyXG4gIHVzZUluamVjdGVkVmlld2VyUmVxdWVzdGVkUmVzb3VyY2VzLFxyXG4gIHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgY29udGFpbnNBbGwgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvdXRpbHMnXHJcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdElkcyB9IGZyb20gJ35+L2xpYi9vYmplY3Qtc2lkZWJhci9oZWxwZXJzJ1xyXG5pbXBvcnQgeyB1c2VMb2FkTGF0ZXN0VmVyc2lvbiB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvcmVzb3VyY2VzJ1xyXG5pbXBvcnQgeyBTcGVja2xlVmlld2VyIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyB1c2VDb3B5TW9kZWxMaW5rIH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL21vZGVsTWFuYWdlbWVudCdcclxuaW1wb3J0IHsgRWxsaXBzaXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcblxyXG50eXBlIE1vZGVsSXRlbSA9IE5vbk51bGxhYmxlPEdldDxWaWV3ZXJMb2FkZWRSZXNvdXJjZXNRdWVyeSwgJ3Byb2plY3QubW9kZWxzLml0ZW1zWzBdJz4+XHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAnc2hvdy12ZXJzaW9ucycsIG1vZGVsSWQ6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ3Nob3ctZGlmZicsIG1vZGVsSWQ6IHN0cmluZywgdmVyc2lvbkE6IHN0cmluZywgdmVyc2lvbkI6IHN0cmluZyk6IHZvaWRcclxuICAoZTogJ3RvZ2dsZS1leHBhbnNpb24nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtb2RlbDogTW9kZWxJdGVtXHJcbiAgdmVyc2lvbklkOiBzdHJpbmdcclxuICBpc0V4cGFuZGVkPzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCB7IGhpZ2hsaWdodE9iamVjdHMsIHVuaGlnaGxpZ2h0T2JqZWN0cyB9ID0gdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzKClcclxuY29uc3QgeyBoaWRlT2JqZWN0cywgc2hvd09iamVjdHMsIGlzb2xhdGVPYmplY3RzLCB1bklzb2xhdGVPYmplY3RzIH0gPVxyXG4gIHVzZUZpbHRlclV0aWxpdGllcygpXHJcbmNvbnN0IHsgem9vbSB9ID0gdXNlQ2FtZXJhVXRpbGl0aWVzKClcclxuY29uc3QgeyBpdGVtcyB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJSZXF1ZXN0ZWRSZXNvdXJjZXMoKVxyXG5jb25zdCB7IHJlc291cmNlSXRlbXMgfSA9IHVzZUluamVjdGVkVmlld2VyTG9hZGVkUmVzb3VyY2VzKClcclxuY29uc3QgeyBhZGRUb1NlbGVjdGlvbkZyb21PYmplY3RJZHMgfSA9IHVzZVNlbGVjdGlvblV0aWxpdGllcygpXHJcblxyXG5jb25zdCB7XHJcbiAgdmlld2VyOiB7XHJcbiAgICBtZXRhZGF0YTogeyBmaWx0ZXJpbmdTdGF0ZSB9XHJcbiAgfSxcclxuICB1aTogeyBmaWx0ZXJzIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgY29weU1vZGVsTGluayA9IHVzZUNvcHlNb2RlbExpbmsoKVxyXG5jb25zdCB7IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZSwgZm9ybWF0dGVkRnVsbERhdGUgfSA9IHVzZURhdGVGb3JtYXR0ZXJzKClcclxuXHJcbmNvbnN0IHJvdXRlID0gdXNlUm91dGUoKVxyXG5jb25zdCByZXNvdXJjZUlkU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IHJlc291cmNlUGFyYW0gPSByb3V0ZS5wYXJhbXMubW9kZWxJZFxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc291cmNlUGFyYW0pID8gcmVzb3VyY2VQYXJhbS5qb2luKCcvJykgOiByZXNvdXJjZVBhcmFtXHJcbn0pXHJcblxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0IH1cclxuICB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbmNvbnN0IHsgbG9hZDogbG9hZExhdGVzdFZlcnNpb24gfSA9IHVzZUxvYWRMYXRlc3RWZXJzaW9uKHtcclxuICBwcm9qZWN0OiBjb21wdXRlZCgoKSA9PiBwcm9qZWN0LnZhbHVlKSxcclxuICByZXNvdXJjZUlkU3RyaW5nOiBjb21wdXRlZCgoKSA9PiByZXNvdXJjZUlkU3RyaW5nLnZhbHVlIHx8ICcnKVxyXG59KVxyXG5cclxuY29uc3Qgc2hvd0FjdGlvbnNNZW51ID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgcmVtb3ZlRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IGl0ZW1zLnZhbHVlLmxlbmd0aCA+IDEpXHJcbmNvbnN0IGFjdGlvbnNJdGVtcyA9IGNvbXB1dGVkPExheW91dE1lbnVJdGVtW11bXT4oKCkgPT4gW1xyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdDb3B5IGxpbmsgdG8gbW9kZWwnLFxyXG4gICAgICBpZDogJ2NvcHktbGluay10by1tb2RlbCdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnU2hvdyB2ZXJzaW9uIGhpc3RvcnknLFxyXG4gICAgICBpZDogJ3Nob3ctdmVyc2lvbi1oaXN0b3J5J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdMb2FkIGxhdGVzdCB2ZXJzaW9uJyxcclxuICAgICAgaWQ6ICdsb2FkLWxhdGVzdC12ZXJzaW9uJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGF0ZXN0LnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6ICdBbHJlYWR5IG9uIHRoZSBsYXRlc3QgdmVyc2lvbidcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnU2hvdyB2ZXJzaW9uIGNoYW5nZXMnLFxyXG4gICAgICBpZDogJ3Nob3ctdmVyc2lvbi1jaGFuZ2VzJyxcclxuICAgICAgZGlzYWJsZWQ6IGlzTGF0ZXN0LnZhbHVlLFxyXG4gICAgICBkaXNhYmxlZFRvb2x0aXA6ICdObyBjaGFuZ2VzIHRvIHNob3cgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbidcclxuICAgIH1cclxuICBdLFxyXG4gIFtcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdSZW1vdmUgbW9kZWwnLFxyXG4gICAgICBpZDogJ3JlbW92ZS1tb2RlbCcsXHJcbiAgICAgIGRpc2FibGVkOiAhcmVtb3ZlRW5hYmxlZC52YWx1ZSxcclxuICAgICAgZGlzYWJsZWRUb29sdGlwOiAnWW91IGNhbm5vdCByZW1vdmUgdGhlIGxhc3QgbW9kZWwnXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgdmVyc2lvbnMgPSBjb21wdXRlZCgoKSA9PiBbXHJcbiAgLi4ucHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtcyxcclxuICAuLi5wcm9wcy5tb2RlbC52ZXJzaW9ucy5pdGVtc1xyXG5dKVxyXG5cclxuY29uc3QgbG9hZGVkVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+XHJcbiAgdmVyc2lvbnMudmFsdWUuZmluZCgodikgPT4gdi5pZCA9PT0gcHJvcHMudmVyc2lvbklkKVxyXG4pXHJcblxyXG5jb25zdCBjcmVhdGVkQXQgPSBjb21wdXRlZCgoKSA9PiBsb2FkZWRWZXJzaW9uLnZhbHVlPy5jcmVhdGVkQXQpXHJcbmNvbnN0IGNyZWF0ZWRBdEZvcm1hdHRlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgZnVsbDogZm9ybWF0dGVkRnVsbERhdGUoY3JlYXRlZEF0LnZhbHVlKSxcclxuICAgIHJlbGF0aXZlOiBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUoY3JlYXRlZEF0LnZhbHVlLCB7IGNhcGl0YWxpemU6IHRydWUgfSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBsYXRlc3RWZXJzaW9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB2ZXJzaW9ucy52YWx1ZVxyXG4gICAgLnNsaWNlKClcclxuICAgIC5zb3J0KChhLCBiKSA9PiAoZGF5anMoYS5jcmVhdGVkQXQpLmlzQmVmb3JlKGRheWpzKGIuY3JlYXRlZEF0KSkgPyAxIDogLTEpKVswXVxyXG59KVxyXG5cclxuY29uc3QgaXNMYXRlc3QgPSBjb21wdXRlZCgoKSA9PiBsb2FkZWRWZXJzaW9uLnZhbHVlPy5pZCA9PT0gbGF0ZXN0VmVyc2lvbi52YWx1ZS5pZClcclxuXHJcbmNvbnN0IG1vZGVsTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IHByb3BzLm1vZGVsLm5hbWUuc3BsaXQoJy8nKVxyXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XHJcbiAgICBjb25zdCBuYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cclxuICAgIHBhcnRzLnBvcCgpXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdWJoZWFkZXI6IHBhcnRzLmpvaW4oJy8nKSxcclxuICAgICAgaGVhZGVyOiBuYW1lXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1YmhlYWRlcjogbnVsbCxcclxuICAgICAgaGVhZGVyOiBwcm9wcy5tb2RlbC5uYW1lXHJcbiAgICB9XHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbW9kZWxPYmplY3RJZHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgcmVmT2JqZWN0ID0gcHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtc1swXT8ucmVmZXJlbmNlZE9iamVjdFxyXG4gIHJldHVybiByZWZPYmplY3QgPyBnZXRUYXJnZXRPYmplY3RJZHMoeyBpZDogcmVmT2JqZWN0IH0pIDogW11cclxufSlcclxuXHJcbmNvbnN0IGhpZGRlbk9iamVjdHMgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJpbmdTdGF0ZS52YWx1ZT8uaGlkZGVuT2JqZWN0cylcclxuLy8gVXNlIHNpbmdsZXRvbiBpc29sYXRlZE9iamVjdHNTZXQgZnJvbSB2aWV3ZXIgc3RhdGVcclxuY29uc3QgeyBpc29sYXRlZE9iamVjdHNTZXQgfSA9IGZpbHRlcnNcclxuXHJcbmNvbnN0IGlzSGlkZGVuID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghaGlkZGVuT2JqZWN0cy52YWx1ZSB8fCBtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZVxyXG4gIHJldHVybiBjb250YWluc0FsbChtb2RlbE9iamVjdElkcy52YWx1ZSwgaGlkZGVuT2JqZWN0cy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGlzSXNvbGF0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFpc29sYXRlZE9iamVjdHNTZXQudmFsdWUgfHwgbW9kZWxPYmplY3RJZHMudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcclxuICBjb25zdCBpc29sYXRlZE9iamVjdHNBcnJheSA9IEFycmF5LmZyb20oaXNvbGF0ZWRPYmplY3RzU2V0LnZhbHVlKVxyXG4gIHJldHVybiBjb250YWluc0FsbChtb2RlbE9iamVjdElkcy52YWx1ZSwgaXNvbGF0ZWRPYmplY3RzQXJyYXkpXHJcbn0pXHJcblxyXG5jb25zdCBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIGlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZS5zaXplID4gMFxyXG59KVxyXG5cclxuY29uc3QgbW9kZWxDb250YWluc0lzb2xhdGVkT2JqZWN0cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSB8fCBpc29sYXRlZE9iamVjdHNTZXQudmFsdWUuc2l6ZSA9PT0gMCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gIHJldHVybiBtb2RlbE9iamVjdElkcy52YWx1ZS5zb21lKChtb2RlbElkKSA9PiBpc29sYXRlZE9iamVjdHNTZXQudmFsdWUhLmhhcyhtb2RlbElkKSlcclxufSlcclxuXHJcbmNvbnN0IHNob3VsZFNob3dEaW1tZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHN0YXRlSGFzSXNvbGF0ZWRPYmplY3RzSW5HZW5lcmFsLnZhbHVlICYmICFtb2RlbENvbnRhaW5zSXNvbGF0ZWRPYmplY3RzLnZhbHVlXHJcbn0pXHJcblxyXG5jb25zdCBoaWRlT3JTaG93T2JqZWN0ID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gIGlmIChtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPT09IDApIHJldHVyblxyXG5cclxuICBpZiAoIWlzSGlkZGVuLnZhbHVlKSB7XHJcbiAgICBoaWRlT2JqZWN0cyhtb2RlbE9iamVjdElkcy52YWx1ZSlcclxuICB9IGVsc2Uge1xyXG4gICAgc2hvd09iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc29sYXRlT3JVbmlzb2xhdGVPYmplY3QgPSAoZTogRXZlbnQpID0+IHtcclxuICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgaWYgKG1vZGVsT2JqZWN0SWRzLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXHJcblxyXG4gIGlmICghaXNJc29sYXRlZC52YWx1ZSkge1xyXG4gICAgaXNvbGF0ZU9iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfSBlbHNlIHtcclxuICAgIHVuSXNvbGF0ZU9iamVjdHMobW9kZWxPYmplY3RJZHMudmFsdWUpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoaWdobGlnaHRPYmplY3QgPSAoKSA9PiB7XHJcbiAgY29uc3QgcmVmT2JqZWN0ID0gcHJvcHMubW9kZWwubG9hZGVkVmVyc2lvbi5pdGVtc1swXT8ucmVmZXJlbmNlZE9iamVjdFxyXG4gIGlmIChyZWZPYmplY3QgJiYgdHlwZW9mIHJlZk9iamVjdCA9PT0gJ3N0cmluZycpIGhpZ2hsaWdodE9iamVjdHMoW3JlZk9iamVjdF0pXHJcbn1cclxuXHJcbmNvbnN0IHVuaGlnaGxpZ2h0T2JqZWN0ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHJlZk9iamVjdCA9IHByb3BzLm1vZGVsLmxvYWRlZFZlcnNpb24uaXRlbXNbMF0/LnJlZmVyZW5jZWRPYmplY3RcclxuICBpZiAocmVmT2JqZWN0ICYmIHR5cGVvZiByZWZPYmplY3QgPT09ICdzdHJpbmcnKSB1bmhpZ2hsaWdodE9iamVjdHMoW3JlZk9iamVjdF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xyXG4gIGlmICghcHJvcHMuaXNFeHBhbmRlZCkge1xyXG4gICAgZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicpXHJcbiAgfSBlbHNlIHtcclxuICAgIGFkZFRvU2VsZWN0aW9uRnJvbU9iamVjdElkcyhtb2RlbE9iamVjdElkcy52YWx1ZSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHpvb21Ub01vZGVsID0gKCkgPT4ge1xyXG4gIGlmIChtb2RlbE9iamVjdElkcy52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICB6b29tKG1vZGVsT2JqZWN0SWRzLnZhbHVlKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcmVtb3ZlTW9kZWwgPSBhc3luYyAobW9kZWxJZDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgYnVpbGRlciA9IFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGUucmVzb3VyY2VCdWlsZGVyKClcclxuICBmb3IgKGNvbnN0IGxvYWRlZFJlc291cmNlIG9mIHJlc291cmNlSXRlbXMudmFsdWUpIHtcclxuICAgIGlmIChsb2FkZWRSZXNvdXJjZS5tb2RlbElkKSB7XHJcbiAgICAgIGlmIChsb2FkZWRSZXNvdXJjZS5tb2RlbElkICE9PSBtb2RlbElkKSB7XHJcbiAgICAgICAgYnVpbGRlci5hZGRNb2RlbChsb2FkZWRSZXNvdXJjZS5tb2RlbElkLCBsb2FkZWRSZXNvdXJjZS52ZXJzaW9uSWQgfHwgdW5kZWZpbmVkKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobG9hZGVkUmVzb3VyY2Uub2JqZWN0SWQgIT09IG1vZGVsSWQpXHJcbiAgICAgICAgYnVpbGRlci5hZGRPYmplY3QobG9hZGVkUmVzb3VyY2Uub2JqZWN0SWQpXHJcbiAgICB9XHJcbiAgfVxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywgeyB0eXBlOiAnYWN0aW9uJywgbmFtZTogJ2ZlZGVyYXRpb24nLCBhY3Rpb246ICdyZW1vdmUnIH0pXHJcbiAgYXdhaXQgaXRlbXMudXBkYXRlKGJ1aWxkZXIudG9SZXNvdXJjZXMoKSlcclxufVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSBhc3luYyAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtIH0pID0+IHtcclxuICBjb25zdCB7IGl0ZW0gfSA9IHBhcmFtc1xyXG5cclxuICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgIGNhc2UgJ2NvcHktbGluay10by1tb2RlbCc6XHJcbiAgICAgIGlmIChwcm9qZWN0LnZhbHVlKSB7XHJcbiAgICAgICAgY29weU1vZGVsTGluayh7IG1vZGVsOiB7IHByb2plY3RJZDogcHJvamVjdC52YWx1ZS5pZCwgaWQ6IHByb3BzLm1vZGVsLmlkIH0gfSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnbG9hZC1sYXRlc3QtdmVyc2lvbic6XHJcbiAgICAgIGlmICghaXNMYXRlc3QudmFsdWUpIHtcclxuICAgICAgICBsb2FkTGF0ZXN0VmVyc2lvbigpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3Nob3ctdmVyc2lvbi1oaXN0b3J5JzpcclxuICAgICAgZW1pdCgnc2hvdy12ZXJzaW9ucycsIHByb3BzLm1vZGVsLmlkKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSAnc2hvdy12ZXJzaW9uLWNoYW5nZXMnOlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgbG9hZGVkVmVyc2lvbi52YWx1ZSAmJlxyXG4gICAgICAgIGxhdGVzdFZlcnNpb24udmFsdWUgJiZcclxuICAgICAgICBsb2FkZWRWZXJzaW9uLnZhbHVlLmlkICE9PSBsYXRlc3RWZXJzaW9uLnZhbHVlLmlkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGVtaXQoXHJcbiAgICAgICAgICAnc2hvdy1kaWZmJyxcclxuICAgICAgICAgIHByb3BzLm1vZGVsLmlkLFxyXG4gICAgICAgICAgbG9hZGVkVmVyc2lvbi52YWx1ZS5pZCxcclxuICAgICAgICAgIGxhdGVzdFZlcnNpb24udmFsdWUuaWRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgJ3JlbW92ZS1tb2RlbCc6XHJcbiAgICAgIGlmIChyZW1vdmVFbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgICAgYXdhaXQgcmVtb3ZlTW9kZWwocHJvcHMubW9kZWwuaWQpXHJcbiAgICAgIH1cclxuICAgICAgYnJlYWtcclxuICB9XHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvQ2FyZC52dWUifQ== |