{"version":3,"file":"onlyoffice-main.mjs","sources":["../src/views/DownloadPicker.vue","../src/views/PdfFormNameDialog.vue","../img/new-docx.svg?raw","../img/new-pdf.svg?raw","../img/new-pptx.svg?raw","../img/new-xlsx.svg?raw","../src/services/FileService.ts","../src/main.js"],"sourcesContent":["<!--\n  Copyright (C) Ascensio System SIA, 2009-2026\n\n  This program is a free software product. You can redistribute it and/or\n  modify it under the terms of the GNU Affero General Public License (AGPL)\n  version 3 as published by the Free Software Foundation, together with the\n  additional terms provided in the LICENSE file.\n\n  This program is distributed WITHOUT ANY WARRANTY; without even the implied\n  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n  details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n\n  You can contact Ascensio System SIA by email at info@onlyoffice.com\n  or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n  LV-1050, Latvia, European Union.\n\n  The interactive user interfaces in modified versions of the Program\n  are required to display Appropriate Legal Notices in accordance with\n  Section 5 of the GNU AGPL version 3.\n\n  No trademark rights are granted under this License.\n\n  All non-code elements of the Product, including illustrations,\n  icon sets, and technical writing content, are licensed under the\n  Creative Commons Attribution-ShareAlike 4.0 International License:\n  https://creativecommons.org/licenses/by-sa/4.0/legalcode\n\n  This license applies only to such non-code elements and does not\n  modify or replace the licensing terms applicable to the Program's\n  source code, which remains licensed under the GNU Affero General\n  Public License v3.\n\n  SPDX-License-Identifier: AGPL-3.0-only\n-->\n<template>\n\t<NcDialog\n\t\tclass=\"onlyoffice-download-picker\"\n\t\t:name=\"t('onlyoffice', 'Download as')\"\n\t\t:buttons=\"buttons\"\n\t\t@update:open=\"$emit('close', null)\">\n\t\t<div ref=\"containerRef\" class=\"onlyoffice-download-container\" tabindex=\"-1\">\n\t\t\t<p>{{ t('onlyoffice', 'Choose a format to convert {fileName}', { fileName }) }}</p>\n\t\t\t<NcSelect\n\t\t\t\tv-model=\"selectedFormat\"\n\t\t\t\tinputId=\"onlyoffice-download-select\"\n\t\t\t\tclass=\"onlyoffice-download-select\"\n\t\t\t\t:options=\"selectOptions\"\n\t\t\t\t:reduce=\"(option) => option.id\"\n\t\t\t\t:clearable=\"false\"\n\t\t\t\tlabelOutside\n\t\t\t\t:aria-label-combobox=\"t('onlyoffice', 'Format')\" />\n\t\t</div>\n\t</NcDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, onMounted, ref } from 'vue'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\n\ndeclare const appName: string\n\nconst props = defineProps<{\n\tfileName: string\n\tfileId: number | string\n\textension: string\n\tsaveasFormats: string[]\n}>()\n\nconst emit = defineEmits<{\n\tclose: [value: boolean | null]\n}>()\n\nconst selectedFormat = ref(props.extension)\nconst containerRef = ref<HTMLElement | null>(null)\n\nonMounted(() => {\n\tcontainerRef.value?.focus()\n})\n\nconst selectOptions = computed(() => [\n\t{ id: props.extension, label: t('onlyoffice', 'Original format') },\n\t...props.saveasFormats.map((ext) => ({ id: ext, label: ext })),\n])\n\nconst buttons = computed(() => [\n\t{\n\t\tlabel: t('core', 'Cancel'),\n\t\tvariant: 'secondary' as const,\n\t\tcallback: () => emit('close', null),\n\t},\n\t{\n\t\tlabel: t('onlyoffice', 'Download'),\n\t\tvariant: 'primary' as const,\n\t\tcallback: () => {\n\t\t\tlocation.href = generateUrl('apps/' + appName + '/downloadas?fileId={fileId}&toExtension={toExtension}', {\n\t\t\t\tfileId: props.fileId,\n\t\t\t\ttoExtension: selectedFormat.value,\n\t\t\t})\n\t\t\temit('close', true)\n\t\t},\n\t},\n])\n</script>\n\n<style scoped lang=\"scss\">\n.onlyoffice-download-picker :deep(.modal-container) {\n\twidth: auto !important;\n\tmin-width: min(558px, 90%);\n\tpadding-block: 15px 25px !important;\n\tpadding-inline: 25px !important;\n}\n\n.onlyoffice-download-picker :deep(.dialog__name) {\n\tmargin-bottom: 0;\n}\n\n.onlyoffice-download-picker :deep(.modal-container__content) {\n\trow-gap: 26px;\n}\n\n.onlyoffice-download-picker :deep(.modal-container__close) {\n\ttop: 15px !important;\n\tinset-inline-end: 15px !important;\n}\n\n.onlyoffice-download-picker :deep(.dialog__content) {\n\tpadding-inline-end: 0;\n}\n\n.onlyoffice-download-picker :deep(.dialog__actions) {\n\tjustify-content: flex-end;\n\tmargin-block: 0 !important;\n\tpadding-inline-end: 0;\n\tpadding: 14px 0 0;\n}\n\n.onlyoffice-download-picker :deep(.dialog__actions .button-vue) {\n\t--button-size: 34px;\n}\n\n.onlyoffice-download-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\trow-gap: 12px;\n\n\t&:focus {\n\t\toutline: none;\n\t}\n}\n\n.onlyoffice-download-select {\n\twidth: fit-content;\n}\n\n@media only screen and (max-width: 512px) {\n\t.onlyoffice-download-picker :deep(.modal-wrapper .modal-container) {\n\t\theight: unset;\n\t\tmax-height: 90%;\n\t\tposition: relative;\n\t\ttop: unset;\n\t\tborder-radius: var(--border-radius-element);\n\t}\n}\n</style>\n","<!--\n  Copyright (C) Ascensio System SIA, 2009-2026\n\n  This program is a free software product. You can redistribute it and/or\n  modify it under the terms of the GNU Affero General Public License (AGPL)\n  version 3 as published by the Free Software Foundation, together with the\n  additional terms provided in the LICENSE file.\n\n  This program is distributed WITHOUT ANY WARRANTY; without even the implied\n  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n  details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n\n  You can contact Ascensio System SIA by email at info@onlyoffice.com\n  or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n  LV-1050, Latvia, European Union.\n\n  The interactive user interfaces in modified versions of the Program\n  are required to display Appropriate Legal Notices in accordance with\n  Section 5 of the GNU AGPL version 3.\n\n  No trademark rights are granted under this License.\n\n  All non-code elements of the Product, including illustrations,\n  icon sets, and technical writing content, are licensed under the\n  Creative Commons Attribution-ShareAlike 4.0 International License:\n  https://creativecommons.org/licenses/by-sa/4.0/legalcode\n\n  This license applies only to such non-code elements and does not\n  modify or replace the licensing terms applicable to the Program's\n  source code, which remains licensed under the GNU Affero General\n  Public License v3.\n\n  SPDX-License-Identifier: AGPL-3.0-only\n-->\n<template>\n\t<NcDialog\n\t\tclass=\"new-pdf-form-dialog\"\n\t\t:name=\"t('onlyoffice', 'New PDF form')\"\n\t\t:buttons=\"buttons\"\n\t\tisForm\n\t\t@submit.prevent=\"handleCreate\"\n\t\t@update:open=\"$emit('close', null)\">\n\t\t<div class=\"new-pdf-dialog__form\">\n\t\t\t<NcTextField\n\t\t\t\tref=\"input\"\n\t\t\t\tv-model=\"filename\"\n\t\t\t\t:label=\"t('files', 'Filename')\"\n\t\t\t\t:error=\"validityMessage !== ''\"\n\t\t\t\t:helperText=\"validityMessage\" />\n\t\t</div>\n\t</NcDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ButtonType, ButtonVariant } from '@nextcloud/vue/components/NcButton'\n\nimport { getUniqueName, InvalidFilenameError, InvalidFilenameErrorReason, validateFilename } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { computed, onMounted, ref, watch } from 'vue'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\n\ninterface DialogButton {\n\tlabel: string\n\tvariant: ButtonVariant\n\ttype?: ButtonType\n\tdisabled?: boolean\n\tcallback?: () => unknown\n}\n\nconst props = withDefaults(defineProps<{\n\tname: string\n\totherNames?: string[]\n}>(), {\n\totherNames: () => [],\n})\n\nconst emit = defineEmits<{\n\tclose: [value: { name: string } | { back: true } | null]\n}>()\n\nconst input = ref<InstanceType<typeof NcTextField>>()\nconst filename = ref(getUniqueName(props.name, props.otherNames))\n\nconst normalizedName = computed(() => {\n\tconst trimmed = filename.value.trim()\n\tif (/\\.pdf$/i.test(trimmed)) {\n\t\treturn trimmed\n\t}\n\treturn trimmed.replace(/\\.[^./\\\\]+$/, '') + '.pdf'\n})\n\n/**\n * Validity message for the current filename (empty if valid).\n */\nconst validityMessage = computed(() => {\n\tconst name = normalizedName.value\n\n\tif (name === '.pdf' || name.trim() === '') {\n\t\treturn t('files', 'Filename must not be empty.')\n\t}\n\n\tif (props.otherNames.includes(name)) {\n\t\treturn t('files', 'This name is already in use.')\n\t}\n\n\ttry {\n\t\tvalidateFilename(name)\n\t\treturn ''\n\t} catch (error) {\n\t\tif (!(error instanceof InvalidFilenameError)) {\n\t\t\tthrow error\n\t\t}\n\n\t\tswitch (error.reason) {\n\t\t\tcase InvalidFilenameErrorReason.Character:\n\t\t\t\treturn t('files', '\"{char}\" is not allowed inside a filename.', { char: error.segment })\n\t\t\tcase InvalidFilenameErrorReason.ReservedName:\n\t\t\t\treturn t('files', '\"{segment}\" is a reserved name and not allowed for filenames.', { segment: error.segment })\n\t\t\tcase InvalidFilenameErrorReason.Extension:\n\t\t\t\treturn t('files', 'Filenames must not end with \"{extension}\".', { extension: error.segment })\n\t\t\tdefault:\n\t\t\t\treturn t('files', 'Invalid filename.')\n\t\t}\n\t}\n})\n\nconst isValid = computed(() => validityMessage.value === '')\n\n/**\n * Closes the dialog with the normalized filename, unless it is currently invalid.\n */\nfunction handleCreate() {\n\tif (!isValid.value) {\n\t\treturn\n\t}\n\temit('close', { name: normalizedName.value })\n}\n\nconst buttons = computed<DialogButton[]>(() => [\n\t{\n\t\tlabel: t('core', 'Back'),\n\t\tvariant: 'secondary',\n\t\tcallback: () => emit('close', { back: true }),\n\t},\n\t{\n\t\tlabel: t('files', 'Create'),\n\t\tvariant: 'primary',\n\t\ttype: 'submit',\n\t\tdisabled: !isValid.value,\n\t},\n])\n\n// Recompute a unique default name if the surrounding folder content changes\nwatch(() => [props.name, props.otherNames], () => {\n\tfilename.value = getUniqueName(props.name, props.otherNames)\n})\n\nonMounted(() => {\n\tinput.value?.focus()\n})\n</script>\n\n<style scoped>\n.new-pdf-dialog__form {\n\t/* Reserve space for the validation message so the dialog does not jump */\n\tmin-height: calc(2 * var(--default-clickable-area));\n}\n\n@media only screen and (max-width: 512px) {\n\t.new-pdf-form-dialog :deep(.modal-wrapper .modal-container) {\n\t\twidth: fit-content;\n\t\theight: unset;\n\t\tmax-height: 90%;\n\t\tposition: relative;\n\t\ttop: unset;\n\t\tborder-radius: var(--border-radius-element);\n\t}\n}\n</style>\n","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#1E7AAA\\\"/>\\n<rect x=\\\"5\\\" y=\\\"6\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"9\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"12\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#9E1919\\\"/>\\n<path d=\\\"M14 6H11V7H14V6Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M14 9H11V10H14V9Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M5 12H14V13H5V12Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M5 10V6H9V10H5ZM6 7V9H8V7H6Z\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#F36700\\\"/>\\n<rect x=\\\"4\\\" y=\\\"5\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"13\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 5 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"15\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 15 5)\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#6AAA1E\\\"/>\\n<rect x=\\\"4\\\" y=\\\"5\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"9\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"13\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 5 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"15\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 15 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"10\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 10 5)\\\" fill=\\\"white\\\"/>\\n</svg>\"","/*\n * Copyright (C) Ascensio System SIA, 2009-2026\n *\n * This program is a free software product. You can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License (AGPL)\n * version 3 as published by the Free Software Foundation, together with the\n * additional terms provided in the LICENSE file.\n *\n * This program is distributed WITHOUT ANY WARRANTY; without even the implied\n * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n * details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n *\n * You can contact Ascensio System SIA by email at info@onlyoffice.com\n * or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n * LV-1050, Latvia, European Union.\n *\n * The interactive user interfaces in modified versions of the Program\n * are required to display Appropriate Legal Notices in accordance with\n * Section 5 of the GNU AGPL version 3.\n *\n * No trademark rights are granted under this License.\n *\n * All non-code elements of the Product, including illustrations,\n * icon sets, and technical writing content, are licensed under the\n * Creative Commons Attribution-ShareAlike 4.0 International License:\n * https://creativecommons.org/licenses/by-sa/4.0/legalcode\n *\n * This license applies only to such non-code elements and does not\n * modify or replace the licensing terms applicable to the Program's\n * source code, which remains licensed under the GNU Affero General\n * Public License v3.\n *\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\nimport type { FileInfo } from '../types.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\nexport interface CreateFileData {\n\tname: string\n\tdir: string\n\ttemplateId?: number\n\ttargetId?: number\n\tshareToken?: string\n}\n\nexport interface ConvertFileData {\n\tfileId: number\n\tshareToken?: string\n}\n\n/**\n *\n * @param data\n */\nexport async function createFile(data: CreateFileData): Promise<FileInfo> {\n\tconst response = await axios.post<FileInfo>(\n\t\tgenerateUrl('apps/onlyoffice/ajax/new'),\n\t\tdata,\n\t)\n\treturn response.data\n}\n\n/**\n *\n * @param data\n */\nexport async function convertFile(data: ConvertFileData): Promise<FileInfo> {\n\tconst response = await axios.post<FileInfo>(\n\t\tgenerateUrl('apps/onlyoffice/ajax/convert'),\n\t\tdata,\n\t)\n\treturn response.data\n}\n","/*\n * Copyright (C) Ascensio System SIA, 2009-2026\n *\n * This program is a free software product. You can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License (AGPL)\n * version 3 as published by the Free Software Foundation, together with the\n * additional terms provided in the LICENSE file.\n *\n * This program is distributed WITHOUT ANY WARRANTY; without even the implied\n * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n * details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n *\n * You can contact Ascensio System SIA by email at info@onlyoffice.com\n * or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n * LV-1050, Latvia, European Union.\n *\n * The interactive user interfaces in modified versions of the Program\n * are required to display Appropriate Legal Notices in accordance with\n * Section 5 of the GNU AGPL version 3.\n *\n * No trademark rights are granted under this License.\n *\n * All non-code elements of the Product, including illustrations,\n * icon sets, and technical writing content, are licensed under the\n * Creative Commons Attribution-ShareAlike 4.0 International License:\n * https://creativecommons.org/licenses/by-sa/4.0/legalcode\n *\n * This license applies only to such non-code elements and does not\n * modify or replace the licensing terms applicable to the Program's\n * source code, which remains licensed under the GNU Affero General\n * Public License v3.\n *\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\nimport { getCurrentUser, getRequestToken } from '@nextcloud/auth'\nimport { getFilePickerBuilder, showError, showSuccess } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport {\n\taddNewFileMenuEntry,\n\tDefaultType,\n\tFile,\n\tgetNewFileMenuEntries,\n\tgetSidebar,\n\tPermission,\n\tregisterFileAction,\n} from '@nextcloud/files'\nimport {\n\tgetClient,\n\tgetDefaultPropfind,\n\tgetRootPath,\n\tresultToNode,\n} from '@nextcloud/files/dav'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateFilePath, generateUrl } from '@nextcloud/router'\nimport { getSharingToken, isPublicShare } from '@nextcloud/sharing/public'\nimport { spawnDialog } from '@nextcloud/vue/functions/dialog'\nimport DownloadPicker from './views/DownloadPicker.vue'\nimport PdfFormNameDialog from './views/PdfFormNameDialog.vue'\nimport AppDarkSvg from '../img/app-dark.svg?raw'\nimport NewDocxSvg from '../img/new-docx.svg?raw'\nimport NewPdfSvg from '../img/new-pdf.svg?raw'\nimport NewPptxSvg from '../img/new-pptx.svg?raw'\nimport NewXlsxSvg from '../img/new-xlsx.svg?raw'\nimport { convertFile, createFile } from './services/FileService.ts'\nimport { getFileExtension } from './utils/files.ts'\n\nimport '@nextcloud/dialogs/style.css'\n\nOCA.Onlyoffice = { AppName: 'onlyoffice', context: null, frameSelector: null, ...OCA.Onlyoffice }\n\nOCA.Onlyoffice.setting = loadState(OCA.Onlyoffice.AppName, 'settings')\nOCA.Onlyoffice.mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini|Macintosh/i.test(navigator.userAgent)\n\t&& navigator.maxTouchPoints && navigator.maxTouchPoints > 1\n\n/**\n * @param {string} name file name\n * @param {object} context files context with dir and view\n * @param {number} templateId template file id\n * @param {number} targetId target file id to convert from\n * @param {boolean} open whether to open the editor after creation\n * @param {object|null} filesContext files app context for node creation\n */\nfunction createFileOverload(name, context, templateId, targetId, open = true, filesContext = null) {\n\tif (!context.view) {\n\t\tcontext.view = OCP.Files.Router._router.app.currentView\n\t}\n\n\tcreateFileProcess(name, context.dir, templateId, targetId, open, async (response) => {\n\t\tif (!context.view && filesContext !== null) {\n\t\t\tconst file = new File({\n\t\t\t\tsource: filesContext.source + '/' + response.name,\n\t\t\t\tid: response.id,\n\t\t\t\tmtime: new Date(),\n\t\t\t\tmime: response.mimetype,\n\t\t\t\tname: response.name,\n\t\t\t\towner: getCurrentUser()?.uid || null,\n\t\t\t\tpermissions: Permission.ALL,\n\t\t\t\ttype: 'file',\n\t\t\t\troot: filesContext?.root || '/files/' + getCurrentUser().uid,\n\t\t\t})\n\t\t\temit('files:node:created', file)\n\t\t} else {\n\t\t\tconst viewContents = await context.view.getContents(context.dir)\n\t\t\tif (viewContents.folder && (viewContents.folder.fileid === response.parentId)) {\n\t\t\t\tconst newFile = viewContents.contents.find((node) => node.fileid === response.id)\n\t\t\t\tif (newFile) {\n\t\t\t\t\temit('files:node:created', newFile)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n\n/**\n * @param {string} name file name\n * @param {string} dir directory path\n * @param {number} templateId template file id\n * @param {number} targetId target file id to convert from\n * @param {boolean} open whether to open the editor after creation\n * @param {Function} callback called with the created file response\n */\nfunction createFileProcess(name, dir, templateId, targetId, open, callback) {\n\tlet winEditor = null\n\tif (((!OCA.Onlyoffice.setting.sameTab && !OCA.Onlyoffice.setting.enableSharing) || OCA.Onlyoffice.mobile || OCA.Onlyoffice.Desktop) && open) {\n\t\tconst loaderUrl = OCA.Onlyoffice.Desktop ? '' : generateFilePath(OCA.Onlyoffice.AppName, 'templates', 'loader.html')\n\t\twinEditor = window.open(loaderUrl)\n\t}\n\n\tconst createData = {\n\t\tname,\n\t\tdir,\n\t}\n\n\tif (templateId) {\n\t\tcreateData.templateId = templateId\n\t}\n\n\tif (targetId) {\n\t\tcreateData.targetId = targetId\n\t}\n\n\tif (isPublicShare()) {\n\t\tcreateData.shareToken = encodeURIComponent(getSharingToken())\n\t}\n\n\tcreateFile(createData).then((response) => {\n\t\tif (response.error) {\n\t\t\tif (winEditor) {\n\t\t\t\twinEditor.close()\n\t\t\t}\n\t\t\tshowError(response.error)\n\t\t\treturn\n\t\t}\n\n\t\tcallback(response)\n\n\t\tif (open) {\n\t\t\tconst fileName = response.name\n\t\t\topenEditor(response.id, dir, fileName, winEditor)\n\n\t\t\tOCA.Onlyoffice.context = {\n\t\t\t\tfileName: response.name,\n\t\t\t\tdir,\n\t\t\t}\n\t\t}\n\n\t\tshowSuccess(t(OCA.Onlyoffice.AppName, 'File created'))\n\t})\n}\n\n/**\n * @param {number} fileId file id\n * @param {string} fileDir directory path\n * @param {string} fileName file name\n * @param {Window|null} winEditor pre-opened editor window\n * @param {boolean} isDefault whether this is the default open action\n */\nfunction openEditor(fileId, fileDir, fileName, winEditor, isDefault = true) {\n\tlet filePath = ''\n\tif (fileName) {\n\t\tfilePath = fileDir.replace(/\\/$/, '') + '/' + fileName\n\t}\n\tlet url = generateUrl('/apps/' + OCA.Onlyoffice.AppName + '/{fileId}?filePath={filePath}', {\n\t\tfileId,\n\t\tfilePath,\n\t})\n\n\tif (isPublicShare()) {\n\t\turl = generateUrl('apps/' + OCA.Onlyoffice.AppName + '/s/{shareToken}?fileId={fileId}', {\n\t\t\tshareToken: encodeURIComponent(getSharingToken()),\n\t\t\tfileId,\n\t\t})\n\t}\n\n\tif (winEditor && winEditor.location) {\n\t\tsetDefaultUrl()\n\t\twinEditor.location.href = url\n\t} else if ((!OCA.Onlyoffice.setting.sameTab && !OCA.Onlyoffice.setting.enableSharing)\n\t\t|| OCA.Onlyoffice.mobile || OCA.Onlyoffice.Desktop || (isPublicShare() && !isPublicFileShare()\n\t\t\t&& !OCA.Onlyoffice.setting.sameTab && OCA.Onlyoffice.setting.enableSharing)\n\t\t|| (!OCA.Onlyoffice.setting.sameTab && !isDefault)) {\n\t\tsetDefaultUrl()\n\t\twindow.open(url, '_blank')\n\t} else {\n\t\tif (OCA.Onlyoffice.setting.enableSharing\n\t\t\t&& !isPublicShare()\n\t\t\t&& (window.OCP?.Files?.Router?.query?.openfile === undefined || window.OCP?.Files?.Router?.query?.openfile === 'false'\n\t\t\t\t|| window.OCP?.Files?.Router?.query?.enableSharing === undefined\n\t\t\t)) {\n\t\t\twindow.OCP?.Files?.Router?.goToRoute(\n\t\t\t\tnull, // use default route\n\t\t\t\t{ view: 'files', fileid: fileId },\n\t\t\t\t{ ...OCP.Files.Router.query, openfile: 'true', enableSharing: 'true' },\n\t\t\t)\n\t\t\turl = window.location.href\n\t\t\tsetDefaultUrl()\n\t\t\twindow.open(url, '_blank')\n\t\t\treturn\n\t\t}\n\t\tOCA.Onlyoffice.frameSelector = '#onlyofficeFrame'\n\t\tconst iframeEl = document.createElement('iframe')\n\t\tiframeEl.id = 'onlyofficeFrame'\n\t\tiframeEl.setAttribute('nonce', btoa(getRequestToken()))\n\t\tiframeEl.setAttribute('scrolling', 'no')\n\t\tiframeEl.setAttribute('allowfullscreen', '')\n\t\tiframeEl.src = url + '&inframe=true'\n\t\tconst iframeContainer = document.createElement('div')\n\t\tiframeContainer.className = 'onlyoffice-iframe-container'\n\t\tiframeContainer.append(iframeEl)\n\n\t\tconst frameContainer = document.getElementById('app-content') ?? document.getElementById('app-content-vue')\n\t\tframeContainer.append(iframeContainer)\n\n\t\tdocument.body.classList.add('onlyoffice-inline')\n\n\t\tconst sidebar = getSidebar()\n\t\tif (sidebar) {\n\t\t\tsidebar.close()\n\t\t}\n\n\t\tconst scrollTop = document.getElementById('app-content')?.scrollTop ?? 0\n\t\tdocument.querySelector(OCA.Onlyoffice.frameSelector).style.top = scrollTop + 'px'\n\n\t\tconst currentQuery = { ...OCP.Files.Router.query }\n\t\tif (isDefault) {\n\t\t\tcurrentQuery.openfile = 'true'\n\t\t} else {\n\t\t\tdelete currentQuery.openfile\n\t\t}\n\n\t\twindow.OCP?.Files?.Router?.goToRoute(\n\t\t\tnull, // use default route\n\t\t\t{ view: 'files', fileid: fileId },\n\t\t\tcurrentQuery,\n\t\t)\n\t}\n}\n\n/**\n * Close the inline editor and restore the Files app view\n */\nfunction closeEditor() {\n\tdocument.body.classList.remove('onlyoffice-inline')\n\n\tconst iframeContainer = document.querySelector('.onlyoffice-iframe-container')\n\tif (iframeContainer !== null) {\n\t\tiframeContainer.remove()\n\t}\n\n\tOCA.Onlyoffice.context = null\n\n\tsetDefaultUrl()\n}\n\n/**\n * Reset the Files router URL, removing openfile and enableSharing query params\n */\nfunction setDefaultUrl() {\n\tconst { openfile, enableSharing, ...query } = OCP.Files.Router.query\n\twindow.OCP?.Files?.Router?.goToRoute(\n\t\tnull, // use default route\n\t\t{ view: 'files', fileid: undefined },\n\t\tquery,\n\t)\n}\n\n/**\n * Open or close the sharing sidebar for the currently open file\n */\nfunction openShareDialog() {\n\tif (OCA.Onlyoffice.context) {\n\t\tconst sidebar = getSidebar()\n\t\tif (!sidebar.isOpen) {\n\t\t\tconst client = getClient()\n\t\t\tclient.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getDefaultPropfind(),\n\t\t\t}).then((result) => {\n\t\t\t\tconst node = resultToNode(result.data)\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\tsidebar.open(node)\n\t\t\t\tsidebar.setActiveTab('sharing')\n\t\t\t})\n\t\t} else {\n\t\t\tsidebar.close()\n\t\t}\n\t}\n}\n\n/**\n * Refresh the versions sidebar tab for the currently open file\n */\nfunction refreshVersionsDialog() {\n\tif (OCA.Onlyoffice.context) {\n\t\tconst sidebar = getSidebar()\n\t\tif (sidebar.isOpen) {\n\t\t\tsidebar.close()\n\t\t\tconst client = getClient()\n\t\t\tclient.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getDefaultPropfind(),\n\t\t\t}).then((result) => {\n\t\t\t\tconst node = resultToNode(result.data)\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\tsidebar.open(node)\n\t\t\t\tsidebar.setActiveTab('versionsTabView')\n\t\t\t})\n\t\t}\n\t}\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @param {boolean} params.isDefault whether triggered as the default action\n * @return {null} null\n */\nasync function fileOpenHandler({ nodes, view, dir, isDefault = true }) {\n\tconst file = nodes[0]\n\tif (OCA.Onlyoffice.context !== null\n\t\t&& document.querySelector('.onlyoffice-iframe-container')\n\t\t&& !OCA.Onlyoffice.Desktop) {\n\t\treturn null\n\t}\n\n\topenEditor(file.fileid, file.dirname, file.basename, 0, isDefault)\n\n\tOCA.Onlyoffice.context = {\n\t\tfileName: file.basename,\n\t\tdir: file.dirname,\n\t}\n\n\treturn null\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @return {null} null\n */\nasync function fileConvertHandler({ nodes, view, dir }) {\n\tconst file = nodes[0]\n\tfileConvert(file.fileid, async (response) => {\n\t\tconst viewContents = await view.getContents(dir)\n\n\t\tif (viewContents.folder && (viewContents.folder.fileid === response.parentId)) {\n\t\t\tconst newFile = viewContents.contents.find((node) => node.fileid === response.id)\n\t\t\tif (newFile) {\n\t\t\t\temit('files:node:created', newFile)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn null\n}\n\n/**\n * @param {number} fileId file id to convert\n * @param {Function} callback called with the converted file response\n */\nfunction fileConvert(fileId, callback) {\n\tconst convertData = {\n\t\tfileId,\n\t}\n\n\tif (isPublicShare()) {\n\t\tconvertData.shareToken = encodeURIComponent(getSharingToken())\n\t}\n\n\tconvertFile(convertData).then((response) => {\n\t\tif (response.error) {\n\t\t\tshowError(response.error)\n\t\t\treturn\n\t\t}\n\n\t\tcallback(response)\n\n\t\tshowSuccess(t(OCA.Onlyoffice.AppName, 'File has been converted. Its content might look different.'))\n\t})\n}\n\n/**\n * @param {object} file Nextcloud file node\n * @param file.nodes\n * @return {null} null\n */\nasync function fileDownloadAsHandler({ nodes }) {\n\tconst file = nodes[0]\n\tconst fileName = file.basename\n\tconst fileId = file.fileid\n\tconst extension = getFileExtension(fileName)\n\tconst saveasFormats = OCA.Onlyoffice.setting.formats[extension].saveas\n\n\tspawnDialog(DownloadPicker, {\n\t\tfileName,\n\t\tfileId,\n\t\textension,\n\t\tsaveasFormats,\n\t})\n\n\treturn null\n}\n\n/**\n * @param {string} name new file name\n * @param {object} filelist files list context with dir\n * @param {object|null} filesContext files app context for node creation\n * @param {object[]} content nodes already present in the target folder\n */\nfunction openFormPicker(name, filelist, filesContext = null, content = []) {\n\tconst filterMimes = [\n\t\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t]\n\n\tconst startDir = filelist.getCurrentDirectory ? filelist.getCurrentDirectory() : filelist.dir\n\tconst otherNames = content.map((node) => node.basename)\n\n\tgetFilePickerBuilder(t(OCA.Onlyoffice.AppName, 'Create new PDF form'))\n\t\t.setMimeTypeFilter(filterMimes)\n\t\t.startAt(startDir)\n\t\t.addButton({\n\t\t\tlabel: t(OCA.Onlyoffice.AppName, 'Blank'),\n\t\t\tvariant: 'secondary',\n\t\t\tcallback: () => {\n\t\t\t\tspawnDialog(PdfFormNameDialog, { name, otherNames }).then((result) => {\n\t\t\t\t\tif (result?.back) {\n\t\t\t\t\t\topenFormPicker(name, filelist, filesContext, content)\n\t\t\t\t\t} else if (result?.name) {\n\t\t\t\t\t\tcreateFileOverload(result.name, filelist, 0, 0, true, filesContext)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\t.addButton({\n\t\t\tlabel: t(OCA.Onlyoffice.AppName, 'From text document'),\n\t\t\tcallback: (nodes) => {\n\t\t\t\tif (!nodes[0]) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst targetId = nodes[0].id ?? 0\n\t\t\t\tcreateFileOverload(name, filelist, 0, targetId, true, filesContext)\n\t\t\t},\n\t\t\tvariant: 'primary',\n\t\t})\n\t\t.build()\n\t\t.pickNodes()\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @return {null} null\n */\nasync function fileCreateFormHandler({ nodes, view, dir }) {\n\tconst file = nodes[0]\n\tconst name = file.basename.replace(/\\.[^.]+$/, '.pdf')\n\tconst context = {\n\t\tdir: file.dirname,\n\t\tview,\n\t}\n\n\tcreateFileOverload(name, context, 0, file.fileid, false)\n\n\treturn null\n}\n\n/**\n * Register all ONLYOFFICE file actions with the Nextcloud Files app\n */\nfunction registerFileActions() {\n\tconst formats = OCA.Onlyoffice.setting.formats\n\n\tconst getConfig = function(file) {\n\t\tconst fileExt = getFileExtension(file?.extension || file?.displayname)\n\t\tconst config = formats[fileExt]\n\n\t\treturn config\n\t}\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-open-def',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tif (OCA.Onlyoffice.setting.restrictExternalStorage\n\t\t\t\t&& (nodes[0].attributes['mount-type'] === 'external' || nodes[0].attributes['mount-type'] === 'external-root')) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst fileExt = getFileExtension(nodes[0]?.extension || nodes[0]?.displayname)\n\t\t\tconst config = formats[fileExt]\n\n\t\t\tif (!config\n\t\t\t\t|| !config.def) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileOpenHandler,\n\t\tdefault: DefaultType.HIDDEN,\n\t\torder: -2,\n\t})\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-open',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tif (OCA.Onlyoffice.setting.restrictExternalStorage\n\t\t\t\t&& (nodes[0].attributes['mount-type'] === 'external' || nodes[0].attributes['mount-type'] === 'external-root')) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (config.def) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec({ nodes, view, dir }) {\n\t\t\tfileOpenHandler({ nodes, view, dir, isDefault: false })\n\t\t},\n\t})\n\n\t// Skip the rest if the page is public file share\n\tif (isPublicFileShare()) {\n\t\treturn\n\t}\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-convert',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Convert with ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!config.conv) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst required = isPublicShare() ? Permission.UPDATE : Permission.READ\n\t\t\tif (required !== (nodes[0].permissions & required)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\tif (required !== (nodes[0].attributes['share-permissions'] & required)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileConvertHandler,\n\t})\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-create-form',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Create form'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!config.createForm) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst required = isPublicShare() ? Permission.UPDATE : Permission.READ\n\t\t\tif (required !== (nodes[0].permissions & required)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\tif (required !== (nodes[0].attributes['share-permissions'] & required)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileCreateFormHandler,\n\t})\n\n\tif (!isPublicShare()) {\n\t\tregisterFileAction({\n\t\t\tid: 'onlyoffice-download-as',\n\t\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Download as'),\n\t\t\ticonSvgInline: () => AppDarkSvg,\n\t\t\tenabled: ({ nodes }) => {\n\t\t\t\tif (OCA.Onlyoffice.setting.disableDownload) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\t\tif (!config) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (!config.saveas) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true\n\t\t\t},\n\t\t\texec: fileDownloadAsHandler,\n\t\t})\n\t}\n}\n\n/**\n * Register ONLYOFFICE entries in the new file menu\n */\nfunction registerNewFileMenu() {\n\tconst alreadyRegistered = getNewFileMenuEntries().some((menu) => menu.id.includes('onlyoffice'))\n\n\tif (isPublicShare() && !alreadyRegistered) {\n\t\t// Document\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-docx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New document'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewDocxSvg,\n\t\t\torder: 21,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New document')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.docx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\n\t\t// Spreadsheet\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-xlsx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New spreadsheet'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewXlsxSvg,\n\t\t\torder: 22,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New spreadsheet')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.xlsx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\n\t\t// Presentation\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-pptx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New presentation'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewPptxSvg,\n\t\t\torder: 23,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New presentation')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.pptx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\t}\n\n\t// PDF Form\n\taddNewFileMenuEntry({\n\t\tid: 'new-onlyoffice-pdf',\n\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New PDF form'),\n\t\tenabled: (folder) => {\n\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t},\n\t\ticonSvgInline: NewPdfSvg,\n\t\torder: 24,\n\t\thandler: (context, content) => {\n\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New PDF form')\n\t\t\tconst dirContext = { dir: context.path }\n\t\t\topenFormPicker(name + '.pdf', dirContext, context, content)\n\t\t},\n\t})\n}\n\n/**\n * @return {boolean} true if the current page is a public file share\n */\nfunction isPublicFileShare() {\n\treturn loadState('files_sharing', 'view', null) === 'public-file-share'\n}\n\n// Expose cross-bundle API surface consumed by listener.js and share.js\nObject.assign(OCA.Onlyoffice, {\n\tCloseEditor: closeEditor,\n\tOpenShareDialog: openShareDialog,\n\tRefreshVersionsDialog: refreshVersionsDialog,\n})\n\nif (!OCA.Onlyoffice._initialized) {\n\tOCA.Onlyoffice._initialized = true\n\tif (!isPublicFileShare()) {\n\t\tregisterNewFileMenu()\n\t}\n\tregisterFileActions()\n}\n"],"names":["props","__props","emit","__emit","selectedFormat","ref","containerRef","onMounted","selectOptions","computed","t","ext","buttons","generateUrl","appName","_createBlock","_unref","NcDialog","$emit","_createElementVNode","_toDisplayString","_createVNode","NcSelect","$event","option","input","filename","getUniqueName","normalizedName","trimmed","validityMessage","name","validateFilename","error","InvalidFilenameError","InvalidFilenameErrorReason","isValid","handleCreate","watch","_hoisted_1","NcTextField","NewDocxSvg","NewPdfSvg","NewPptxSvg","NewXlsxSvg","createFile","data","axios","convertFile","loadState","createFileOverload","context","templateId","targetId","open","filesContext","createFileProcess","response","file","File","getCurrentUser","Permission","viewContents","newFile","node","dir","callback","winEditor","loaderUrl","generateFilePath","createData","isPublicShare","getSharingToken","showError","fileName","openEditor","showSuccess","fileId","fileDir","isDefault","filePath","url","setDefaultUrl","isPublicFileShare","iframeEl","getRequestToken","iframeContainer","sidebar","getSidebar","scrollTop","currentQuery","closeEditor","openfile","enableSharing","query","openShareDialog","getClient","getRootPath","getDefaultPropfind","result","resultToNode","refreshVersionsDialog","fileOpenHandler","nodes","view","fileConvertHandler","fileConvert","convertData","fileDownloadAsHandler","extension","getFileExtension","saveasFormats","spawnDialog","DownloadPicker","openFormPicker","filelist","content","filterMimes","startDir","otherNames","getFilePickerBuilder","PdfFormNameDialog","fileCreateFormHandler","registerFileActions","formats","getConfig","fileExt","registerFileAction","AppDarkSvg","config","DefaultType","required","downloadAttribute","attribute","registerNewFileMenu","alreadyRegistered","getNewFileMenuEntries","menu","addNewFileMenuEntry","folder","dirContext"],"mappings":"ogCAgEA,MAAMA,EAAQC,EAORC,EAAOC,EAIPC,EAAiBC,EAAIL,EAAM,SAAS,EACpCM,EAAeD,EAAwB,IAAI,EAEjDE,EAAU,IAAM,CACfD,EAAa,OAAO,MAAA,CACrB,CAAC,EAED,MAAME,EAAgBC,EAAS,IAAM,CACpC,CAAE,GAAIT,EAAM,UAAW,MAAOU,EAAE,aAAc,iBAAiB,CAAA,EAC/D,GAAGV,EAAM,cAAc,IAAKW,IAAS,CAAE,GAAIA,EAAK,MAAOA,GAAM,CAAA,CAC7D,EAEKC,EAAUH,EAAS,IAAM,CAC9B,CACC,MAAOC,EAAE,OAAQ,QAAQ,EACzB,QAAS,YACT,SAAU,IAAMR,EAAK,QAAS,IAAI,CAAA,EAEnC,CACC,MAAOQ,EAAE,aAAc,UAAU,EACjC,QAAS,UACT,SAAU,IAAM,CACf,SAAS,KAAOG,EAAY,QAAUC,GAAU,wDAAyD,CACxG,OAAQd,EAAM,OACd,YAAaI,EAAe,KAAA,CAC5B,EACDF,EAAK,QAAS,EAAI,CACnB,CAAA,CACD,CACA,oBArEAa,EAiBWC,EAAAC,CAAA,EAAA,CAhBV,MAAM,6BACL,KAAMD,EAAAN,CAAA,EAAC,aAAA,aAAA,EACP,QAASE,EAAA,MACT,+BAAaM,EAAAA,MAAK,QAAA,IAAA,EAAA,aACnB,IAWM,CAXNC,EAWM,MAAA,SAXG,eAAJ,IAAIb,EAAe,MAAM,gCAAgC,SAAS,IAAA,GACtEa,EAAmF,IAAA,KAAAC,GAA7EJ,EAAAN,CAAA,EAAC,aAAA,wCAAA,CAAA,SAA0DT,EAAA,QAAA,CAAQ,CAAA,EAAA,CAAA,EACzEoB,EAQoDL,EAAAM,EAAA,EAAA,YAP1ClB,EAAA,2CAAAA,EAAc,MAAAmB,GACvB,QAAQ,6BACR,MAAM,6BACL,QAASf,EAAA,MACT,OAASgB,GAAWA,EAAO,GAC3B,UAAW,GACZ,aAAA,GACC,sBAAqBR,EAAAN,CAAA,EAAC,aAAA,QAAA,CAAA,qSCoB3B,MAAMV,EAAQC,EAORC,EAAOC,EAIPsB,EAAQpB,EAAA,EACRqB,EAAWrB,EAAIsB,EAAc3B,EAAM,KAAMA,EAAM,UAAU,CAAC,EAE1D4B,EAAiBnB,EAAS,IAAM,CACrC,MAAMoB,EAAUH,EAAS,MAAM,KAAA,EAC/B,MAAI,UAAU,KAAKG,CAAO,EAClBA,EAEDA,EAAQ,QAAQ,cAAe,EAAE,EAAI,MAC7C,CAAC,EAKKC,EAAkBrB,EAAS,IAAM,CACtC,MAAMsB,EAAOH,EAAe,MAE5B,GAAIG,IAAS,QAAUA,EAAK,KAAA,IAAW,GACtC,OAAOrB,EAAE,QAAS,6BAA6B,EAGhD,GAAIV,EAAM,WAAW,SAAS+B,CAAI,EACjC,OAAOrB,EAAE,QAAS,8BAA8B,EAGjD,GAAI,CACH,OAAAsB,GAAiBD,CAAI,EACd,EACR,OAASE,EAAO,CACf,GAAI,EAAEA,aAAiBC,IACtB,MAAMD,EAGP,OAAQA,EAAM,OAAA,CACb,KAAKE,EAA2B,UAC/B,OAAOzB,EAAE,QAAS,6CAA8C,CAAE,KAAMuB,EAAM,QAAS,EACxF,KAAKE,EAA2B,aAC/B,OAAOzB,EAAE,QAAS,gEAAiE,CAAE,QAASuB,EAAM,QAAS,EAC9G,KAAKE,EAA2B,UAC/B,OAAOzB,EAAE,QAAS,6CAA8C,CAAE,UAAWuB,EAAM,QAAS,EAC7F,QACC,OAAOvB,EAAE,QAAS,mBAAmB,CAAA,CAExC,CACD,CAAC,EAEK0B,EAAU3B,EAAS,IAAMqB,EAAgB,QAAU,EAAE,EAK3D,SAASO,GAAe,CAClBD,EAAQ,OAGblC,EAAK,QAAS,CAAE,KAAM0B,EAAe,MAAO,CAC7C,CAEA,MAAMhB,EAAUH,EAAyB,IAAM,CAC9C,CACC,MAAOC,EAAE,OAAQ,MAAM,EACvB,QAAS,YACT,SAAU,IAAMR,EAAK,QAAS,CAAE,KAAM,GAAM,CAAA,EAE7C,CACC,MAAOQ,EAAE,QAAS,QAAQ,EAC1B,QAAS,UACT,KAAM,SACN,SAAU,CAAC0B,EAAQ,KAAA,CACpB,CACA,EAGD,OAAAE,GAAM,IAAM,CAACtC,EAAM,KAAMA,EAAM,UAAU,EAAG,IAAM,CACjD0B,EAAS,MAAQC,EAAc3B,EAAM,KAAMA,EAAM,UAAU,CAC5D,CAAC,EAEDO,EAAU,IAAM,CACfkB,EAAM,OAAO,MAAA,CACd,CAAC,cA7HAV,EAeWC,EAAAC,CAAA,EAAA,CAdV,MAAM,sBACL,KAAMD,EAAAN,CAAA,EAAC,aAAA,cAAA,EACP,QAASE,EAAA,MACV,OAAA,GACC,YAAgByB,EAAY,CAAA,SAAA,CAAA,EAC5B,+BAAanB,EAAAA,MAAK,QAAA,IAAA,EAAA,aACnB,IAOM,CAPNC,EAOM,MAPNoB,GAOM,CANLlB,EAKiCL,EAAAwB,EAAA,EAAA,SAJ5B,QAAJ,IAAIf,aACKC,EAAA,2CAAAA,EAAQ,MAAAH,GAChB,MAAOP,EAAAN,CAAA,EAAC,QAAA,UAAA,EACR,MAAOoB,EAAA,QAAe,GACtB,WAAYA,EAAA,KAAA,oIChDjBW,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA,QCAfC,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QCAfC,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QCAfC,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QCyDf,eAAsBC,GAAWC,EAAyC,CAKzE,OAJiB,MAAMC,EAAM,KAC5BlC,EAAY,0BAA0B,EACtCiC,CAAA,GAEe,IACjB,CAMA,eAAsBE,GAAYF,EAA0C,CAK3E,OAJiB,MAAMC,EAAM,KAC5BlC,EAAY,8BAA8B,EAC1CiC,CAAA,GAEe,IACjB,CCLA,IAAI,WAAa,CAAE,QAAS,aAAc,QAAS,KAAM,cAAe,KAAM,GAAG,IAAI,UAAU,EAE/F,IAAI,WAAW,QAAUG,EAAU,IAAI,WAAW,QAAS,UAAU,EACrE,IAAI,WAAW,OAAS,iHAAiH,KAAK,UAAU,SAAS,GAC7J,UAAU,gBAAkB,UAAU,eAAiB,EAU3D,SAASC,EAAmBnB,EAAMoB,EAASC,EAAYC,EAAUC,EAAO,GAAMC,EAAe,KAAM,CAC7FJ,EAAQ,OACZA,EAAQ,KAAO,IAAI,MAAM,OAAO,QAAQ,IAAI,aAG7CK,GAAkBzB,EAAMoB,EAAQ,IAAKC,EAAYC,EAAUC,EAAM,MAAOG,GAAa,CACpF,GAAI,CAACN,EAAQ,MAAQI,IAAiB,KAAM,CAC3C,MAAMG,EAAO,IAAIC,GAAK,CACrB,OAAQJ,EAAa,OAAS,IAAME,EAAS,KAC7C,GAAIA,EAAS,GACb,MAAO,IAAI,KACX,KAAMA,EAAS,SACf,KAAMA,EAAS,KACf,MAAOG,KAAkB,KAAO,KAChC,YAAaC,EAAW,IACxB,KAAM,OACN,KAAMN,GAAc,MAAQ,UAAYK,EAAc,EAAG,GAC7D,CAAI,EACD1D,EAAK,qBAAsBwD,CAAI,CAChC,KAAO,CACN,MAAMI,EAAe,MAAMX,EAAQ,KAAK,YAAYA,EAAQ,GAAG,EAC/D,GAAIW,EAAa,QAAWA,EAAa,OAAO,SAAWL,EAAS,SAAW,CAC9E,MAAMM,EAAUD,EAAa,SAAS,KAAME,GAASA,EAAK,SAAWP,EAAS,EAAE,EAC5EM,GACH7D,EAAK,qBAAsB6D,CAAO,CAEpC,CACD,CACD,CAAC,CACF,CAUA,SAASP,GAAkBzB,EAAMkC,EAAKb,EAAYC,EAAUC,EAAMY,EAAU,CAC3E,IAAIC,EAAY,KAChB,IAAM,CAAC,IAAI,WAAW,QAAQ,SAAW,CAAC,IAAI,WAAW,QAAQ,eAAkB,IAAI,WAAW,QAAU,IAAI,WAAW,UAAYb,EAAM,CAC5I,MAAMc,EAAY,IAAI,WAAW,QAAU,GAAKC,GAAiB,IAAI,WAAW,QAAS,YAAa,aAAa,EACnHF,EAAY,OAAO,KAAKC,CAAS,CAClC,CAEA,MAAME,EAAa,CAClB,KAAAvC,EACA,IAAAkC,CACF,EAEKb,IACHkB,EAAW,WAAalB,GAGrBC,IACHiB,EAAW,SAAWjB,GAGnBkB,EAAa,IAChBD,EAAW,WAAa,mBAAmBE,EAAe,CAAE,GAG7D3B,GAAWyB,CAAU,EAAE,KAAMb,GAAa,CACzC,GAAIA,EAAS,MAAO,CACfU,GACHA,EAAU,MAAK,EAEhBM,EAAUhB,EAAS,KAAK,EACxB,MACD,CAIA,GAFAS,EAAST,CAAQ,EAEbH,EAAM,CACT,MAAMoB,EAAWjB,EAAS,KAC1BkB,EAAWlB,EAAS,GAAIQ,EAAKS,EAAUP,CAAS,EAEhD,IAAI,WAAW,QAAU,CACxB,SAAUV,EAAS,KACnB,IAAAQ,CACJ,CACE,CAEAW,EAAYlE,EAAE,IAAI,WAAW,QAAS,cAAc,CAAC,CACtD,CAAC,CACF,CASA,SAASiE,EAAWE,EAAQC,EAASJ,EAAUP,EAAWY,EAAY,GAAM,CAC3E,IAAIC,EAAW,GACXN,IACHM,EAAWF,EAAQ,QAAQ,MAAO,EAAE,EAAI,IAAMJ,GAE/C,IAAIO,EAAMpE,EAAY,SAAW,IAAI,WAAW,QAAU,gCAAiC,CAC1F,OAAAgE,EACA,SAAAG,CACF,CAAE,EASD,GAPIT,EAAa,IAChBU,EAAMpE,EAAY,QAAU,IAAI,WAAW,QAAU,kCAAmC,CACvF,WAAY,mBAAmB2D,GAAiB,EAChD,OAAAK,CACH,CAAG,GAGEV,GAAaA,EAAU,SAC1Be,EAAa,EACbf,EAAU,SAAS,KAAOc,UACf,CAAC,IAAI,WAAW,QAAQ,SAAW,CAAC,IAAI,WAAW,QAAQ,eACnE,IAAI,WAAW,QAAU,IAAI,WAAW,SAAYV,EAAa,GAAM,CAACY,EAAiB,GACxF,CAAC,IAAI,WAAW,QAAQ,SAAW,IAAI,WAAW,QAAQ,eAC1D,CAAC,IAAI,WAAW,QAAQ,SAAW,CAACJ,EACxCG,EAAa,EACb,OAAO,KAAKD,EAAK,QAAQ,MACnB,CACN,GAAI,IAAI,WAAW,QAAQ,eACvB,CAACV,EAAa,IACb,OAAO,KAAK,OAAO,QAAQ,OAAO,WAAa,QAAa,OAAO,KAAK,OAAO,QAAQ,OAAO,WAAa,SAC3G,OAAO,KAAK,OAAO,QAAQ,OAAO,gBAAkB,QACrD,CACH,OAAO,KAAK,OAAO,QAAQ,UAC1B,KACA,CAAE,KAAM,QAAS,OAAQM,CAAM,EAC/B,CAAE,GAAG,IAAI,MAAM,OAAO,MAAO,SAAU,OAAQ,cAAe,MAAM,CACxE,EACGI,EAAM,OAAO,SAAS,KACtBC,EAAa,EACb,OAAO,KAAKD,EAAK,QAAQ,EACzB,MACD,CACA,IAAI,WAAW,cAAgB,mBAC/B,MAAMG,EAAW,SAAS,cAAc,QAAQ,EAChDA,EAAS,GAAK,kBACdA,EAAS,aAAa,QAAS,KAAKC,GAAe,CAAE,CAAC,EACtDD,EAAS,aAAa,YAAa,IAAI,EACvCA,EAAS,aAAa,kBAAmB,EAAE,EAC3CA,EAAS,IAAMH,EAAM,gBACrB,MAAMK,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAY,8BAC5BA,EAAgB,OAAOF,CAAQ,GAER,SAAS,eAAe,aAAa,GAAK,SAAS,eAAe,iBAAiB,GAC3F,OAAOE,CAAe,EAErC,SAAS,KAAK,UAAU,IAAI,mBAAmB,EAE/C,MAAMC,EAAUC,EAAU,EACtBD,GACHA,EAAQ,MAAK,EAGd,MAAME,EAAY,SAAS,eAAe,aAAa,GAAG,WAAa,EACvE,SAAS,cAAc,IAAI,WAAW,aAAa,EAAE,MAAM,IAAMA,EAAY,KAE7E,MAAMC,EAAe,CAAE,GAAG,IAAI,MAAM,OAAO,KAAK,EAC5CX,EACHW,EAAa,SAAW,OAExB,OAAOA,EAAa,SAGrB,OAAO,KAAK,OAAO,QAAQ,UAC1B,KACA,CAAE,KAAM,QAAS,OAAQb,CAAM,EAC/Ba,CACH,CACC,CACD,CAKA,SAASC,IAAc,CACtB,SAAS,KAAK,UAAU,OAAO,mBAAmB,EAElD,MAAML,EAAkB,SAAS,cAAc,8BAA8B,EACzEA,IAAoB,MACvBA,EAAgB,OAAM,EAGvB,IAAI,WAAW,QAAU,KAEzBJ,EAAa,CACd,CAKA,SAASA,GAAgB,CACxB,KAAM,CAAE,SAAAU,EAAU,cAAAC,EAAe,GAAGC,CAAK,EAAK,IAAI,MAAM,OAAO,MAC/D,OAAO,KAAK,OAAO,QAAQ,UAC1B,KACA,CAAE,KAAM,QAAS,OAAQ,MAAS,EAClCA,CACF,CACA,CAKA,SAASC,IAAkB,CAC1B,GAAI,IAAI,WAAW,QAAS,CAC3B,MAAMR,EAAUC,EAAU,EACrBD,EAAQ,OAYZA,EAAQ,MAAK,EAXES,EAAS,EACjB,KAAK,GAAGC,EAAW,CAAE,GAAG,IAAI,WAAW,QAAQ,IAAM,IAAM,IAAI,WAAW,QAAQ,QAAQ,GAAI,CACpG,QAAS,GACT,KAAMC,EAAkB,CAC5B,CAAI,EAAE,KAAMC,GAAW,CACnB,MAAMnC,EAAOoC,EAAaD,EAAO,IAAI,EACrCjG,EAAK,qBAAsB8D,CAAI,EAC/BuB,EAAQ,KAAKvB,CAAI,EACjBuB,EAAQ,aAAa,SAAS,CAC/B,CAAC,CAIH,CACD,CAKA,SAASc,IAAwB,CAChC,GAAI,IAAI,WAAW,QAAS,CAC3B,MAAMd,EAAUC,EAAU,EACtBD,EAAQ,SACXA,EAAQ,MAAK,EACES,EAAS,EACjB,KAAK,GAAGC,EAAW,CAAE,GAAG,IAAI,WAAW,QAAQ,IAAM,IAAM,IAAI,WAAW,QAAQ,QAAQ,GAAI,CACpG,QAAS,GACT,KAAMC,EAAkB,CAC5B,CAAI,EAAE,KAAMC,GAAW,CACnB,MAAMnC,EAAOoC,EAAaD,EAAO,IAAI,EACrCjG,EAAK,qBAAsB8D,CAAI,EAC/BuB,EAAQ,KAAKvB,CAAI,EACjBuB,EAAQ,aAAa,iBAAiB,CACvC,CAAC,EAEH,CACD,CAUA,eAAee,EAAgB,CAAE,MAAAC,EAAO,KAAAC,EAAM,IAAAvC,EAAK,UAAAc,EAAY,IAAQ,CACtE,MAAMrB,EAAO6C,EAAM,CAAC,EACpB,OAAI,IAAI,WAAW,UAAY,MAC3B,SAAS,cAAc,8BAA8B,GACrD,CAAC,IAAI,WAAW,UAIpB5B,EAAWjB,EAAK,OAAQA,EAAK,QAASA,EAAK,SAAU,EAAGqB,CAAS,EAEjE,IAAI,WAAW,QAAU,CACxB,SAAUrB,EAAK,SACf,IAAKA,EAAK,OACZ,GAEQ,IACR,CASA,eAAe+C,GAAmB,CAAE,MAAAF,EAAO,KAAAC,EAAM,IAAAvC,CAAG,EAAI,CACvD,MAAMP,EAAO6C,EAAM,CAAC,EACpB,OAAAG,GAAYhD,EAAK,OAAQ,MAAOD,GAAa,CAC5C,MAAMK,EAAe,MAAM0C,EAAK,YAAYvC,CAAG,EAE/C,GAAIH,EAAa,QAAWA,EAAa,OAAO,SAAWL,EAAS,SAAW,CAC9E,MAAMM,EAAUD,EAAa,SAAS,KAAME,GAASA,EAAK,SAAWP,EAAS,EAAE,EAC5EM,GACH7D,EAAK,qBAAsB6D,CAAO,CAEpC,CACD,CAAC,EAEM,IACR,CAMA,SAAS2C,GAAY7B,EAAQX,EAAU,CACtC,MAAMyC,EAAc,CACnB,OAAA9B,CACF,EAEKN,EAAa,IAChBoC,EAAY,WAAa,mBAAmBnC,EAAe,CAAE,GAG9DxB,GAAY2D,CAAW,EAAE,KAAMlD,GAAa,CAC3C,GAAIA,EAAS,MAAO,CACnBgB,EAAUhB,EAAS,KAAK,EACxB,MACD,CAEAS,EAAST,CAAQ,EAEjBmB,EAAYlE,EAAE,IAAI,WAAW,QAAS,4DAA4D,CAAC,CACpG,CAAC,CACF,CAOA,eAAekG,GAAsB,CAAE,MAAAL,GAAS,CAC/C,MAAM7C,EAAO6C,EAAM,CAAC,EACd7B,EAAWhB,EAAK,SAChBmB,EAASnB,EAAK,OACdmD,EAAYC,EAAiBpC,CAAQ,EACrCqC,EAAgB,IAAI,WAAW,QAAQ,QAAQF,CAAS,EAAE,OAEhE,OAAAG,EAAYC,GAAgB,CAC3B,SAAAvC,EACA,OAAAG,EACA,UAAAgC,EACA,cAAAE,CACF,CAAE,EAEM,IACR,CAQA,SAASG,GAAenF,EAAMoF,EAAU5D,EAAe,KAAM6D,EAAU,GAAI,CAC1E,MAAMC,EAAc,CACnB,yEACF,EAEOC,EAAWH,EAAS,oBAAsBA,EAAS,oBAAmB,EAAKA,EAAS,IACpFI,EAAaH,EAAQ,IAAKpD,GAASA,EAAK,QAAQ,EAEtDwD,GAAqB9G,EAAE,IAAI,WAAW,QAAS,qBAAqB,CAAC,EACnE,kBAAkB2G,CAAW,EAC7B,QAAQC,CAAQ,EAChB,UAAU,CACV,MAAO5G,EAAE,IAAI,WAAW,QAAS,OAAO,EACxC,QAAS,YACT,SAAU,IAAM,CACfsG,EAAYS,GAAmB,CAAE,KAAA1F,EAAM,WAAAwF,CAAU,CAAE,EAAE,KAAMpB,GAAW,CACjEA,GAAQ,KACXe,GAAenF,EAAMoF,EAAU5D,EAAc6D,CAAO,EAC1CjB,GAAQ,MAClBjD,EAAmBiD,EAAO,KAAMgB,EAAU,EAAG,EAAG,GAAM5D,CAAY,CAEpE,CAAC,CACF,CACH,CAAG,EACA,UAAU,CACV,MAAO7C,EAAE,IAAI,WAAW,QAAS,oBAAoB,EACrD,SAAW6F,GAAU,CACpB,GAAI,CAACA,EAAM,CAAC,EACX,OAED,MAAMlD,EAAWkD,EAAM,CAAC,EAAE,IAAM,EAChCrD,EAAmBnB,EAAMoF,EAAU,EAAG9D,EAAU,GAAME,CAAY,CACnE,EACA,QAAS,SACZ,CAAG,EACA,MAAK,EACL,UAAS,CACZ,CASA,eAAemE,GAAsB,CAAE,MAAAnB,EAAO,KAAAC,EAAM,IAAAvC,CAAG,EAAI,CAC1D,MAAMP,EAAO6C,EAAM,CAAC,EACdxE,EAAO2B,EAAK,SAAS,QAAQ,WAAY,MAAM,EAC/CP,EAAU,CACf,IAAKO,EAAK,QACV,KAAA8C,CACF,EAEC,OAAAtD,EAAmBnB,EAAMoB,EAAS,EAAGO,EAAK,OAAQ,EAAK,EAEhD,IACR,CAKA,SAASiE,IAAsB,CAC9B,MAAMC,EAAU,IAAI,WAAW,QAAQ,QAEjCC,EAAY,SAASnE,EAAM,CAChC,MAAMoE,EAAUhB,EAAiBpD,GAAM,WAAaA,GAAM,WAAW,EAGrE,OAFekE,EAAQE,CAAO,CAG/B,EAEAC,EAAmB,CAClB,GAAI,sBACJ,YAAa,IAAMrH,EAAE,IAAI,WAAW,QAAS,oBAAoB,EACjE,cAAe,IAAMsH,EACrB,QAAS,CAAC,CAAE,MAAAzB,KAAY,CACvB,GAAI,IAAI,WAAW,QAAQ,0BACtBA,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,YAAcA,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,iBAC9F,MAAO,GAGR,MAAMuB,EAAUhB,EAAiBP,EAAM,CAAC,GAAG,WAAaA,EAAM,CAAC,GAAG,WAAW,EACvE0B,EAASL,EAAQE,CAAO,EAO9B,MALI,EAAA,CAACG,GACD,CAACA,EAAO,KAIRpE,EAAW,QAAU0C,EAAM,CAAC,EAAE,YAAc1C,EAAW,MAK5D,EACA,KAAMyC,EACN,QAAS4B,GAAY,OACrB,MAAO,EACT,CAAE,EAEDH,EAAmB,CAClB,GAAI,kBACJ,YAAa,IAAMrH,EAAE,IAAI,WAAW,QAAS,oBAAoB,EACjE,cAAe,IAAMsH,EACrB,QAAS,CAAC,CAAE,MAAAzB,KAAY,CACvB,GAAI,IAAI,WAAW,QAAQ,0BACtBA,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,YAAcA,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,iBAC9F,MAAO,GAGR,MAAM0B,EAASJ,EAAUtB,EAAM,CAAC,CAAC,EASjC,MAPI,GAAC0B,GAGDA,EAAO,KAIPpE,EAAW,QAAU0C,EAAM,CAAC,EAAE,YAAc1C,EAAW,MAK5D,EACA,KAAK,CAAE,MAAA0C,EAAO,KAAAC,EAAM,IAAAvC,CAAG,EAAI,CAC1BqC,EAAgB,CAAE,MAAAC,EAAO,KAAAC,EAAM,IAAAvC,EAAK,UAAW,EAAK,CAAE,CACvD,CACF,CAAE,EAGG,CAAAkB,EAAiB,IAIrB4C,EAAmB,CAClB,GAAI,qBACJ,YAAa,IAAMrH,EAAE,IAAI,WAAW,QAAS,yBAAyB,EACtE,cAAe,IAAMsH,EACrB,QAAS,CAAC,CAAE,MAAAzB,KAAY,CACvB,MAAM0B,EAASJ,EAAUtB,EAAM,CAAC,CAAC,EAKjC,GAHI,CAAC0B,GAGD,CAACA,EAAO,KACX,MAAO,GAGR,MAAME,EAAW5D,EAAa,EAAKV,EAAW,OAASA,EAAW,KAClE,GAAIsE,KAAc5B,EAAM,CAAC,EAAE,YAAc4B,GACxC,MAAO,GAGR,GAAI5B,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,SAAU,CACnD,GAAI4B,KAAc5B,EAAM,CAAC,EAAE,WAAW,mBAAmB,EAAI4B,GAC5D,MAAO,GAIR,MAAMC,EADa,KAAK,MAAM7B,EAAM,CAAC,EAAE,WAAW,kBAAkB,CAAC,EAChC,KAAM8B,GAAcA,EAAU,QAAU,eAAiBA,EAAU,MAAQ,UAAU,EAC1H,GAAID,IAAsB,QAAaA,EAAkB,QAAU,GAClE,MAAO,EAET,CAEA,MAAO,EACR,EACA,KAAM3B,EACR,CAAE,EAEDsB,EAAmB,CAClB,GAAI,yBACJ,YAAa,IAAMrH,EAAE,IAAI,WAAW,QAAS,aAAa,EAC1D,cAAe,IAAMsH,EACrB,QAAS,CAAC,CAAE,MAAAzB,KAAY,CACvB,MAAM0B,EAASJ,EAAUtB,EAAM,CAAC,CAAC,EAKjC,GAHI,CAAC0B,GAGD,CAACA,EAAO,WACX,MAAO,GAGR,MAAME,EAAW5D,EAAa,EAAKV,EAAW,OAASA,EAAW,KAClE,GAAIsE,KAAc5B,EAAM,CAAC,EAAE,YAAc4B,GACxC,MAAO,GAGR,GAAI5B,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,SAAU,CACnD,GAAI4B,KAAc5B,EAAM,CAAC,EAAE,WAAW,mBAAmB,EAAI4B,GAC5D,MAAO,GAIR,MAAMC,EADa,KAAK,MAAM7B,EAAM,CAAC,EAAE,WAAW,kBAAkB,CAAC,EAChC,KAAM8B,GAAcA,EAAU,QAAU,eAAiBA,EAAU,MAAQ,UAAU,EAC1H,GAAID,IAAsB,QAAaA,EAAkB,QAAU,GAClE,MAAO,EAET,CAEA,MAAO,EACR,EACA,KAAMV,EACR,CAAE,EAEInD,EAAa,GACjBwD,EAAmB,CAClB,GAAI,yBACJ,YAAa,IAAMrH,EAAE,IAAI,WAAW,QAAS,aAAa,EAC1D,cAAe,IAAMsH,EACrB,QAAS,CAAC,CAAE,MAAAzB,KAAY,CACvB,GAAI,IAAI,WAAW,QAAQ,gBAC1B,MAAO,GAER,MAAM0B,EAASJ,EAAUtB,EAAM,CAAC,CAAC,EASjC,GAPI,CAAC0B,GAGD,CAACA,EAAO,QAIRpE,EAAW,QAAU0C,EAAM,CAAC,EAAE,YAAc1C,EAAW,MAC1D,MAAO,GAGR,GAAI0C,EAAM,CAAC,EAAE,WAAW,YAAY,IAAM,SAAU,CAEnD,MAAM6B,EADa,KAAK,MAAM7B,EAAM,CAAC,EAAE,WAAW,kBAAkB,CAAC,EAChC,KAAM8B,GAAcA,EAAU,QAAU,eAAiBA,EAAU,MAAQ,UAAU,EAC1H,GAAID,IAAsB,QAAaA,EAAkB,QAAU,GAClE,MAAO,EAET,CAEA,MAAO,EACR,EACA,KAAMxB,EACT,CAAG,EAEH,CAKA,SAAS0B,IAAsB,CAC9B,MAAMC,EAAoBC,GAAqB,EAAG,KAAMC,GAASA,EAAK,GAAG,SAAS,YAAY,CAAC,EAE3FlE,EAAa,GAAM,CAACgE,IAEvBG,EAAoB,CACnB,GAAI,sBACJ,YAAahI,EAAE,IAAI,WAAW,QAAS,cAAc,EACrD,QAAUiI,IACDA,EAAO,YAAc9E,EAAW,UAAY,EAErD,cAAepB,GACf,MAAO,GACP,QAAUU,GAAY,CACrB,MAAMpB,EAAOrB,EAAE,IAAI,WAAW,QAAS,cAAc,EAC/CkI,EAAa,CAAE,IAAKzF,EAAQ,IAAI,EACtCD,EAAmBnB,EAAO,QAAS6G,EAAY,KAAM,KAAM,GAAMzF,CAAO,CACzE,CACH,CAAG,EAGDuF,EAAoB,CACnB,GAAI,sBACJ,YAAahI,EAAE,IAAI,WAAW,QAAS,iBAAiB,EACxD,QAAUiI,IACDA,EAAO,YAAc9E,EAAW,UAAY,EAErD,cAAejB,GACf,MAAO,GACP,QAAUO,GAAY,CACrB,MAAMpB,EAAOrB,EAAE,IAAI,WAAW,QAAS,iBAAiB,EAClDkI,EAAa,CAAE,IAAKzF,EAAQ,IAAI,EACtCD,EAAmBnB,EAAO,QAAS6G,EAAY,KAAM,KAAM,GAAMzF,CAAO,CACzE,CACH,CAAG,EAGDuF,EAAoB,CACnB,GAAI,sBACJ,YAAahI,EAAE,IAAI,WAAW,QAAS,kBAAkB,EACzD,QAAUiI,IACDA,EAAO,YAAc9E,EAAW,UAAY,EAErD,cAAelB,GACf,MAAO,GACP,QAAUQ,GAAY,CACrB,MAAMpB,EAAOrB,EAAE,IAAI,WAAW,QAAS,kBAAkB,EACnDkI,EAAa,CAAE,IAAKzF,EAAQ,IAAI,EACtCD,EAAmBnB,EAAO,QAAS6G,EAAY,KAAM,KAAM,GAAMzF,CAAO,CACzE,CACH,CAAG,GAIFuF,EAAoB,CACnB,GAAI,qBACJ,YAAahI,EAAE,IAAI,WAAW,QAAS,cAAc,EACrD,QAAUiI,IACDA,EAAO,YAAc9E,EAAW,UAAY,EAErD,cAAenB,GACf,MAAO,GACP,QAAS,CAACS,EAASiE,IAAY,CAC9B,MAAMrF,EAAOrB,EAAE,IAAI,WAAW,QAAS,cAAc,EAC/CkI,EAAa,CAAE,IAAKzF,EAAQ,IAAI,EACtC+D,GAAenF,EAAO,OAAQ6G,EAAYzF,EAASiE,CAAO,CAC3D,CACF,CAAE,CACF,CAKA,SAASjC,GAAoB,CAC5B,OAAOlC,EAAU,gBAAiB,OAAQ,IAAI,IAAM,mBACrD,CAGA,OAAO,OAAO,IAAI,WAAY,CAC7B,YAAa0C,GACb,gBAAiBI,GACjB,sBAAuBM,EACxB,CAAC,EAEI,IAAI,WAAW,eACnB,IAAI,WAAW,aAAe,GACzBlB,EAAiB,GACrBmD,GAAmB,EAEpBX,GAAmB"}