import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/anchored-point/thread/CommentAttachments.vue");import { LayoutDialog as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementBlock as __createElementBlock,createVNode as __createVNode,createElementVNode as __createElementVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } /* Injection by vite-plugin-vue-inspector End */ import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { ensureError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { prettyFileSize } from "/_nuxt/lib/core/helpers/file.ts"; import { useFileDownload } from "/_nuxt/lib/core/composables/fileUpload.ts"; import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts"; import { Download, Paperclip, TriangleAlert } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerAnchoredPointThreadCommentAttachments", props: { attachments: { type: Object, required: true }, projectId: { type: String, required: true } }, setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ThreadCommentAttachment on Comment { text { attachments { id fileName fileType fileSize } } } `); const props = __props; const { getBlobUrl, download } = useFileDownload(); const { triggerNotification } = useGlobalToast(); const dialogOpen = ref(false); const dialogAttachment = ref(null); const dialogAttachmentError = ref(null); const dialogAttachmentObjectUrl = ref(null); const isImage = (attachment) => { switch (attachment.fileType) { case "jpg": case "jpeg": case "png": case "gif": return true; default: return false; } }; const onAttachmentClick = (attachment) => { dialogAttachment.value = attachment; dialogOpen.value = true; }; const onDownloadClick = async () => { if (!dialogAttachment.value) return; try { const { id, fileName } = dialogAttachment.value; await download({ blobId: id, fileName, projectId: props.projectId }); } catch (e) { triggerNotification({ type: ToastNotificationType.Danger, title: "Download failed", description: ensureError(e).message }); } }; const attachmentList = computed(() => props.attachments?.text?.attachments || []); const dialogButtons = computed(() => { if (!dialogAttachment.value) return void 0; const button = { text: dialogAttachment.value.fileSize ? prettyFileSize(dialogAttachment.value.fileSize) : "Download", props: { iconLeft: Download, color: "outline" }, onClick: () => { onDownloadClick(); } }; return [button]; }); watch(dialogOpen, (newIsOpen) => { if (!newIsOpen) { dialogAttachmentError.value = null; if (dialogAttachmentObjectUrl.value) { URL.revokeObjectURL(dialogAttachmentObjectUrl.value); dialogAttachmentObjectUrl.value = null; } } else if (dialogAttachment.value) { if (isImage(dialogAttachment.value)) { getBlobUrl({ blobId: dialogAttachment.value.id, projectId: props.projectId }).then((url) => { dialogAttachmentObjectUrl.value = url; }).catch((err) => { dialogAttachmentError.value = ensureError(err); }); } } }); const __returned__ = { props, getBlobUrl, download, triggerNotification, dialogOpen, dialogAttachment, dialogAttachmentError, dialogAttachmentObjectUrl, isImage, onAttachmentClick, onDownloadClick, attachmentList, dialogButtons, get Paperclip() { return Paperclip; }, get TriangleAlert() { return TriangleAlert; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:2:3" }; const _hoisted_2 = { key: 0, class: "flex flex-col gap-y-1 pt-2", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:3:5" }; const _hoisted_3 = ["onClick"]; const _hoisted_4 = { class: "truncate relative text-body-3xs", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:11:9" }; const _hoisted_5 = { key: 0, class: "flex flex-col space-y-2", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:22:9" }; const _hoisted_6 = { class: "flex justify-center text-foreground text-body-xs py-4", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:23:11" }; const _hoisted_7 = { key: 0, class: "inline-flex space-x-2 items-center", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:24:13" }; const _hoisted_8 = ["src"]; const _hoisted_9 = { key: 2, class: "inline-flex space-x-4 items-center", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:36:15" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_LayoutDialog = __nuxt_component_0; return _openBlock(), _createElementBlock("div", _hoisted_1, [ $setup.attachmentList.length > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.attachmentList, (attachment) => { return _openBlock(), _createElementBlock("button", { key: attachment.id, class: "text-foreground hover:text-foreground-2 flex items-center gap-x-1", onClick: () => $setup.onAttachmentClick(attachment), "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:4:7" }, [ _createVNode($setup["Paperclip"], { class: "size-3", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:10:9" }), _createElementVNode( "span", _hoisted_4, _toDisplayString(attachment.fileName), 1 /* TEXT */ ) ], 8, _hoisted_3); }), 128 /* KEYED_FRAGMENT */ )) ])) : _createCommentVNode("v-if", true), _createVNode(_component_LayoutDialog, { open: $setup.dialogOpen, "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.dialogOpen = $event), "max-width": "lg", buttons: $setup.dialogButtons, "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:17:5" }, { header: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.dialogAttachment ? $setup.dialogAttachment.fileName : "Attachment"), 1 /* TEXT */ ) ]), default: _withCtx(() => [ $setup.dialogAttachment ? (_openBlock(), _createElementBlock("div", _hoisted_5, [ _createElementVNode("div", _hoisted_6, [ $setup.dialogAttachmentError ? (_openBlock(), _createElementBlock("span", _hoisted_7, " Failed to load attachment preview ")) : $setup.isImage($setup.dialogAttachment) && $setup.dialogAttachmentObjectUrl ? (_openBlock(), _createElementBlock("img", { key: 1, src: $setup.dialogAttachmentObjectUrl, alt: "Attachment preview", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:33:15" }, null, 8, _hoisted_8)) : (_openBlock(), _createElementBlock("span", _hoisted_9, [ _createVNode($setup["TriangleAlert"], { class: "w-6 h-6", "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:37:17" }), _cache[1] || (_cache[1] = _createElementVNode( "span", { "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:38:17" }, " Please note: This file is user-uploaded and has not been scanned for security. Download at your own discretion. ", -1 /* CACHED */ )) ])) ]) ])) : _createCommentVNode("v-if", true) ]), _: 1 /* STABLE */ }, 8, ["open", "buttons"]) ]); } _sfc_main.__hmrId = "6effd946"; 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/anchored-point/thread/CommentAttachments.vue"]]); //# sourceMappingURL=data:application/json;base64,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WUFNTztBQUFBLGNBTEwsYUFBeUg7QUFBQSxnQkFBMUcsT0FBTTtBQUFBLGdCQUFVLG9CQUFpQjtBQUFBO3dDQUNoRDtBQUFBLGdCQUdPO0FBQUEsa0JBSEQsb0JBQWlCLHVFQUFzRTtBQUFBLGdCQUFDO0FBQUEsZ0JBRzlGO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJDb21tZW50QXR0YWNobWVudHMudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC90aHJlYWQvQ29tbWVudEF0dGFjaG1lbnRzLnZ1ZToyOjNcIj5cclxuICAgIDxkaXYgdi1pZj1cImF0dGFjaG1lbnRMaXN0Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLXktMSBwdC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjM6NVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdi1mb3I9XCJhdHRhY2htZW50IGluIGF0dGFjaG1lbnRMaXN0XCJcclxuICAgICAgICA6a2V5PVwiYXR0YWNobWVudC5pZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kLTIgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiXHJcbiAgICAgICAgQGNsaWNrPVwiKCkgPT4gb25BdHRhY2htZW50Q2xpY2soYXR0YWNobWVudClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6NDo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxQYXBlcmNsaXAgY2xhc3M9XCJzaXplLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MTA6OVwiIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZSByZWxhdGl2ZSB0ZXh0LWJvZHktM3hzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjExOjlcIj5cclxuICAgICAgICAgIHt7IGF0dGFjaG1lbnQuZmlsZU5hbWUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPExheW91dERpYWxvZyB2LW1vZGVsOm9wZW49XCJkaWFsb2dPcGVuXCIgbWF4LXdpZHRoPVwibGdcIiA6YnV0dG9ucz1cImRpYWxvZ0J1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MTc6NVwiPlxyXG4gICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cclxuICAgICAgICB7eyBkaWFsb2dBdHRhY2htZW50ID8gZGlhbG9nQXR0YWNobWVudC5maWxlTmFtZSA6ICdBdHRhY2htZW50JyB9fVxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImRpYWxvZ0F0dGFjaG1lbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MjI6OVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgdGV4dC1mb3JlZ3JvdW5kIHRleHQtYm9keS14cyBweS00XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjIzOjExXCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgdi1pZj1cImRpYWxvZ0F0dGFjaG1lbnRFcnJvclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjI0OjEzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIGF0dGFjaG1lbnQgcHJldmlld1xyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImlzSW1hZ2UoZGlhbG9nQXR0YWNobWVudCkgJiYgZGlhbG9nQXR0YWNobWVudE9iamVjdFVybFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJkaWFsb2dBdHRhY2htZW50T2JqZWN0VXJsXCIgYWx0PVwiQXR0YWNobWVudCBwcmV2aWV3XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjMzOjE1XCIgLz5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlubGluZS1mbGV4IHNwYWNlLXgtNCBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MzY6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxUcmlhbmdsZUFsZXJ0IGNsYXNzPVwidy02IGgtNlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC90aHJlYWQvQ29tbWVudEF0dGFjaG1lbnRzLnZ1ZTozNzoxN1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6Mzg6MTdcIj5cclxuICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGU6IFRoaXMgZmlsZSBpcyB1c2VyLXVwbG9hZGVkIGFuZCBoYXMgbm90IGJlZW4gc2Nhbm5lZCBmb3JcclxuICAgICAgICAgICAgICAgICAgc2VjdXJpdHkuIERvd25sb2FkIGF0IHlvdXIgb3duIGRpc2NyZXRpb24uXHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L0xheW91dERpYWxvZz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUgeyBHZXQgfSBmcm9tICd0eXBlLWZlc3QnXHJcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBUaHJlYWRDb21tZW50QXR0YWNobWVudEZyYWdtZW50IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7IHByZXR0eUZpbGVTaXplIH0gZnJvbSAnfn4vbGliL2NvcmUvaGVscGVycy9maWxlJ1xyXG5pbXBvcnQgeyB1c2VGaWxlRG93bmxvYWQgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9maWxlVXBsb2FkJ1xyXG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblR5cGUsIHVzZUdsb2JhbFRvYXN0IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy90b2FzdCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXREaWFsb2dCdXR0b24gfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBEb3dubG9hZCwgUGFwZXJjbGlwLCBUcmlhbmdsZUFsZXJ0IH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxudHlwZSBBdHRhY2htZW50RmlsZSA9IE5vbk51bGxhYmxlPFxyXG4gIEdldDxUaHJlYWRDb21tZW50QXR0YWNobWVudEZyYWdtZW50LCAndGV4dC5hdHRhY2htZW50c1swXSc+XHJcbj5cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFRocmVhZENvbW1lbnRBdHRhY2htZW50IG9uIENvbW1lbnQge1xyXG4gICAgdGV4dCB7XHJcbiAgICAgIGF0dGFjaG1lbnRzIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIGZpbGVOYW1lXHJcbiAgICAgICAgZmlsZVR5cGVcclxuICAgICAgICBmaWxlU2l6ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgYXR0YWNobWVudHM6IFRocmVhZENvbW1lbnRBdHRhY2htZW50RnJhZ21lbnRcclxuICBwcm9qZWN0SWQ6IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IGdldEJsb2JVcmwsIGRvd25sb2FkIH0gPSB1c2VGaWxlRG93bmxvYWQoKVxyXG5jb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuXHJcbmNvbnN0IGRpYWxvZ09wZW4gPSByZWYoZmFsc2UpXHJcbmNvbnN0IGRpYWxvZ0F0dGFjaG1lbnQgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxBdHRhY2htZW50RmlsZT4pXHJcbmNvbnN0IGRpYWxvZ0F0dGFjaG1lbnRFcnJvciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEVycm9yPilcclxuY29uc3QgZGlhbG9nQXR0YWNobWVudE9iamVjdFVybCA9IHJlZihudWxsIGFzIE51bGxhYmxlPHN0cmluZz4pXHJcblxyXG5jb25zdCBpc0ltYWdlID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XHJcbiAgc3dpdGNoIChhdHRhY2htZW50LmZpbGVUeXBlKSB7XHJcbiAgICBjYXNlICdqcGcnOlxyXG4gICAgY2FzZSAnanBlZyc6XHJcbiAgICBjYXNlICdwbmcnOlxyXG4gICAgY2FzZSAnZ2lmJzpcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgb25BdHRhY2htZW50Q2xpY2sgPSAoYXR0YWNobWVudDogQXR0YWNobWVudEZpbGUpID0+IHtcclxuICBkaWFsb2dBdHRhY2htZW50LnZhbHVlID0gYXR0YWNobWVudFxyXG4gIGRpYWxvZ09wZW4udmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbmNvbnN0IG9uRG93bmxvYWRDbGljayA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIWRpYWxvZ0F0dGFjaG1lbnQudmFsdWUpIHJldHVyblxyXG5cclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBpZCwgZmlsZU5hbWUgfSA9IGRpYWxvZ0F0dGFjaG1lbnQudmFsdWVcclxuICAgIGF3YWl0IGRvd25sb2FkKHsgYmxvYklkOiBpZCwgZmlsZU5hbWUsIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkIH0pXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgIHR5cGU6IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5EYW5nZXIsXHJcbiAgICAgIHRpdGxlOiAnRG93bmxvYWQgZmFpbGVkJyxcclxuICAgICAgZGVzY3JpcHRpb246IGVuc3VyZUVycm9yKGUpLm1lc3NhZ2VcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhdHRhY2htZW50TGlzdCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmF0dGFjaG1lbnRzPy50ZXh0Py5hdHRhY2htZW50cyB8fCBbXSlcclxuXHJcbmNvbnN0IGRpYWxvZ0J1dHRvbnMgPSBjb21wdXRlZCgoKTogT3B0aW9uYWw8TGF5b3V0RGlhbG9nQnV0dG9uW10+ID0+IHtcclxuICBpZiAoIWRpYWxvZ0F0dGFjaG1lbnQudmFsdWUpIHJldHVybiB1bmRlZmluZWRcclxuXHJcbiAgY29uc3QgYnV0dG9uOiBMYXlvdXREaWFsb2dCdXR0b24gPSB7XHJcbiAgICB0ZXh0OiBkaWFsb2dBdHRhY2htZW50LnZhbHVlLmZpbGVTaXplXHJcbiAgICAgID8gcHJldHR5RmlsZVNpemUoZGlhbG9nQXR0YWNobWVudC52YWx1ZS5maWxlU2l6ZSlcclxuICAgICAgOiAnRG93bmxvYWQnLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgaWNvbkxlZnQ6IERvd25sb2FkLFxyXG4gICAgICBjb2xvcjogJ291dGxpbmUnXHJcbiAgICB9LFxyXG4gICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICBvbkRvd25sb2FkQ2xpY2soKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIFtidXR0b25dXHJcbn0pXHJcblxyXG53YXRjaChkaWFsb2dPcGVuLCAobmV3SXNPcGVuKSA9PiB7XHJcbiAgaWYgKCFuZXdJc09wZW4pIHtcclxuICAgIGRpYWxvZ0F0dGFjaG1lbnRFcnJvci52YWx1ZSA9IG51bGxcclxuXHJcbiAgICBpZiAoZGlhbG9nQXR0YWNobWVudE9iamVjdFVybC52YWx1ZSkge1xyXG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUpXHJcbiAgICAgIGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUgPSBudWxsXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChkaWFsb2dBdHRhY2htZW50LnZhbHVlKSB7XHJcbiAgICBpZiAoaXNJbWFnZShkaWFsb2dBdHRhY2htZW50LnZhbHVlKSkge1xyXG4gICAgICBnZXRCbG9iVXJsKHsgYmxvYklkOiBkaWFsb2dBdHRhY2htZW50LnZhbHVlLmlkLCBwcm9qZWN0SWQ6IHByb3BzLnByb2plY3RJZCB9KVxyXG4gICAgICAgIC50aGVuKCh1cmwpID0+IHtcclxuICAgICAgICAgIGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUgPSB1cmxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBkaWFsb2dBdHRhY2htZW50RXJyb3IudmFsdWUgPSBlbnN1cmVFcnJvcihlcnIpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWUifQ==