You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

files_versions-files_versions.js.map 253KB

1
  1. {"version":3,"file":"files_versions-files_versions.js?v=2948f51e3a39d650c590","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/files/src/utils/fileUtils.ts","webpack:///nextcloud/apps/files_versions/src/utils/davClient.js","webpack:///nextcloud/apps/files_versions/src/utils/logger.js","webpack:///nextcloud/node_modules/vue-material-design-icons/BackupRestore.vue","webpack:///nextcloud/node_modules/vue-material-design-icons/BackupRestore.vue?vue&type=script&lang=js","webpack://nextcloud/./node_modules/vue-material-design-icons/BackupRestore.vue?6cf7","webpack:///nextcloud/node_modules/vue-material-design-icons/BackupRestore.vue?vue&type=template&id=25aaea72","webpack:///nextcloud/node_modules/vue-material-design-icons/Download.vue?vue&type=script&lang=js","webpack:///nextcloud/node_modules/vue-material-design-icons/Download.vue","webpack://nextcloud/./node_modules/vue-material-design-icons/Download.vue?b226","webpack:///nextcloud/node_modules/vue-material-design-icons/Download.vue?vue&type=template&id=b0ce3ea8","webpack:///nextcloud/node_modules/vue-material-design-icons/FileCompare.vue?vue&type=script&lang=js","webpack:///nextcloud/node_modules/vue-material-design-icons/FileCompare.vue","webpack://nextcloud/./node_modules/vue-material-design-icons/FileCompare.vue?5fdf","webpack:///nextcloud/node_modules/vue-material-design-icons/FileCompare.vue?vue&type=template&id=2810c319","webpack:///nextcloud/node_modules/vue-material-design-icons/ImageOffOutline.vue","webpack:///nextcloud/node_modules/vue-material-design-icons/ImageOffOutline.vue?vue&type=script&lang=js","webpack://nextcloud/./node_modules/vue-material-design-icons/ImageOffOutline.vue?e0b5","webpack:///nextcloud/node_modules/vue-material-design-icons/ImageOffOutline.vue?vue&type=template&id=7d95c70e","webpack:///nextcloud/apps/files_sharing/src/lib/SharePermissionsToolBox.js","webpack:///nextcloud/apps/files_versions/src/components/Version.vue","webpack:///nextcloud/apps/files_versions/src/components/Version.vue?vue&type=script&lang=js","webpack://nextcloud/./apps/files_versions/src/components/Version.vue?95a1","webpack://nextcloud/./apps/files_versions/src/components/Version.vue?0a31","webpack://nextcloud/./apps/files_versions/src/components/Version.vue?f787","webpack:///nextcloud/apps/files_versions/src/components/VirtualScrolling.vue?vue&type=script&lang=ts","webpack:///nextcloud/apps/files_versions/src/components/VirtualScrolling.vue","webpack://nextcloud/./apps/files_versions/src/components/VirtualScrolling.vue?3e31","webpack://nextcloud/./apps/files_versions/src/components/VirtualScrolling.vue?fc23","webpack:///nextcloud/apps/files_versions/src/components/VersionLabelForm.vue","webpack:///nextcloud/apps/files_versions/src/components/VersionLabelForm.vue?vue&type=script&lang=ts","webpack://nextcloud/./apps/files_versions/src/components/VersionLabelForm.vue?8728","webpack://nextcloud/./apps/files_versions/src/components/VersionLabelForm.vue?dbea","webpack:///nextcloud/apps/files_versions/src/views/VersionTab.vue?vue&type=script&lang=js","webpack:///nextcloud/apps/files_versions/src/views/VersionTab.vue","webpack:///nextcloud/apps/files_versions/src/utils/versions.ts","webpack:///nextcloud/apps/files_versions/src/utils/davRequest.js","webpack://nextcloud/./apps/files_versions/src/views/VersionTab.vue?492e","webpack://nextcloud/./apps/files_versions/src/views/VersionTab.vue?d7ee","webpack://nextcloud/./apps/files_versions/src/views/VersionTab.vue?4309","webpack:///nextcloud/apps/files_versions/src/files_versions_tab.js","webpack:///nextcloud/apps/files_versions/src/components/Version.vue?vue&type=style&index=0&id=5b3703ac&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/files_versions/src/components/VersionLabelForm.vue?vue&type=style&index=0&id=58311f0c&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/files_versions/src/components/VirtualScrolling.vue?vue&type=style&index=0&id=11dbbae6&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/files_versions/src/views/VersionTab.vue?vue&type=style&index=0&id=9f52be8e&prod&lang=scss","webpack:///nextcloud/node_modules/@nextcloud/files/dist/index.mjs","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nimport { FileType } from '@nextcloud/files';\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n';\nimport { basename, extname } from 'path';\n// TODO: move to @nextcloud/files\n/**\n * Create an unique file name\n * @param name The initial name to use\n * @param otherNames Other names that are already used\n * @param options Optional parameters for tuning the behavior\n * @param options.suffix A function that takes an index and returns a suffix to add to the file name, defaults to '(index)'\n * @param options.ignoreFileExtension Set to true to ignore the file extension when adding the suffix (when getting a unique directory name)\n * @return Either the initial name, if unique, or the name with the suffix so that the name is unique\n */\nexport const getUniqueName = (name, otherNames, options = {}) => {\n const opts = {\n suffix: (n) => `(${n})`,\n ignoreFileExtension: false,\n ...options,\n };\n let newName = name;\n let i = 1;\n while (otherNames.includes(newName)) {\n const ext = opts.ignoreFileExtension ? '' : extname(name);\n const base = basename(name, ext);\n newName = `${base} ${opts.suffix(i++)}${ext}`;\n }\n return newName;\n};\nexport const encodeFilePath = function (path) {\n const pathSections = (path.startsWith('/') ? path : `/${path}`).split('/');\n let relativePath = '';\n pathSections.forEach((section) => {\n if (section !== '') {\n relativePath += '/' + encodeURIComponent(section);\n }\n });\n return relativePath;\n};\n/**\n * Extract dir and name from file path\n *\n * @param {string} path the full path\n * @return {string[]} [dirPath, fileName]\n */\nexport const extractFilePaths = function (path) {\n const pathSections = path.split('/');\n const fileName = pathSections[pathSections.length - 1];\n const dirPath = pathSections.slice(0, pathSections.length - 1).join('/');\n return [dirPath, fileName];\n};\n/**\n * Generate a translated summary of an array of nodes\n * @param {Node[]} nodes the nodes to summarize\n * @return {string}\n */\nexport const getSummaryFor = (nodes) => {\n const fileCount = nodes.filter(node => node.type === FileType.File).length;\n const folderCount = nodes.filter(node => node.type === FileType.Folder).length;\n if (fileCount === 0) {\n return n('files', '{folderCount} folder', '{folderCount} folders', folderCount, { folderCount });\n }\n else if (folderCount === 0) {\n return n('files', '{fileCount} file', '{fileCount} files', fileCount, { fileCount });\n }\n if (fileCount === 1) {\n return n('files', '1 file and {folderCount} folder', '1 file and {folderCount} folders', folderCount, { folderCount });\n }\n if (folderCount === 1) {\n return n('files', '{fileCount} file and 1 folder', '{fileCount} files and 1 folder', fileCount, { fileCount });\n }\n return t('files', '{fileCount} files and {folderCount} folders', { fileCount, folderCount });\n};\n","/**\n * @copyright 2022 Louis Chemineau <mlouis@chmn.me>\n *\n * @author Louis Chemineau <mlouis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { createClient } from 'webdav'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'\n\n// init webdav client\nconst rootPath = 'dav'\nconst remote = generateRemoteUrl(rootPath)\nconst client = createClient(remote)\n\n// set CSRF token header\nconst setHeaders = (token) => {\n client.setHeaders({\n // Add this so the server knows it is an request from the browser\n 'X-Requested-With': 'XMLHttpRequest',\n // Inject user auth\n requesttoken: token ?? '',\n })\n}\n\n// refresh headers when request token changes\nonRequestTokenUpdate(setHeaders)\nsetHeaders(getRequestToken())\n\nexport default client","/**\n * @copyright 2022 Louis Chemineau <mlouis@chmn.me>\n *\n * @author Louis Chemineau <mlouis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('files_version')\n\t.detectUser()\n\t.build()\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : true\"\n :aria-label=\"title\"\n class=\"material-design-icon backup-restore-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,3A9,9 0 0,0 3,12H0L4,16L8,12H5A7,7 0 0,1 12,5A7,7 0 0,1 19,12A7,7 0 0,1 12,19C10.5,19 9.09,18.5 7.94,17.7L6.5,19.14C8.04,20.3 9.94,21 12,21A9,9 0 0,0 21,12A9,9 0 0,0 12,3M14,12A2,2 0 0,0 12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"BackupRestoreIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./BackupRestore.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./BackupRestore.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BackupRestore.vue?vue&type=template&id=25aaea72\"\nimport script from \"./BackupRestore.vue?vue&type=script&lang=js\"\nexport * from \"./BackupRestore.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon backup-restore-icon\",attrs:{\"aria-hidden\":_vm.title ? null : true,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M12,3A9,9 0 0,0 3,12H0L4,16L8,12H5A7,7 0 0,1 12,5A7,7 0 0,1 19,12A7,7 0 0,1 12,19C10.5,19 9.09,18.5 7.94,17.7L6.5,19.14C8.04,20.3 9.94,21 12,21A9,9 0 0,0 21,12A9,9 0 0,0 12,3M14,12A2,2 0 0,0 12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./Download.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./Download.vue?vue&type=script&lang=js\"","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : true\"\n :aria-label=\"title\"\n class=\"material-design-icon download-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"DownloadIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import { render, staticRenderFns } from \"./Download.vue?vue&type=template&id=b0ce3ea8\"\nimport script from \"./Download.vue?vue&type=script&lang=js\"\nexport * from \"./Download.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon download-icon\",attrs:{\"aria-hidden\":_vm.title ? null : true,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./FileCompare.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./FileCompare.vue?vue&type=script&lang=js\"","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : true\"\n :aria-label=\"title\"\n class=\"material-design-icon file-compare-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M10,18H6V16H10V18M10,14H6V12H10V14M10,1V2H6C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H10V23H12V1H10M20,8V20C20,21.11 19.11,22 18,22H14V20H18V11H14V9H18.5L14,4.5V2L20,8M16,14H14V12H16V14M16,18H14V16H16V18Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"FileCompareIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import { render, staticRenderFns } from \"./FileCompare.vue?vue&type=template&id=2810c319\"\nimport script from \"./FileCompare.vue?vue&type=script&lang=js\"\nexport * from \"./FileCompare.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon file-compare-icon\",attrs:{\"aria-hidden\":_vm.title ? null : true,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M10,18H6V16H10V18M10,14H6V12H10V14M10,1V2H6C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H10V23H12V1H10M20,8V20C20,21.11 19.11,22 18,22H14V20H18V11H14V9H18.5L14,4.5V2L20,8M16,14H14V12H16V14M16,18H14V16H16V18Z\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : true\"\n :aria-label=\"title\"\n class=\"material-design-icon image-off-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M22 20.7L3.3 2L2 3.3L3 4.3V19C3 20.1 3.9 21 5 21H19.7L20.7 22L22 20.7M5 19V6.3L12.6 13.9L11.1 15.8L9 13.1L6 17H15.7L17.7 19H5M8.8 5L6.8 3H19C20.1 3 21 3.9 21 5V17.2L19 15.2V5H8.8\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"ImageOffOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","import mod from \"-!../vue-loader/lib/index.js??vue-loader-options!./ImageOffOutline.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../vue-loader/lib/index.js??vue-loader-options!./ImageOffOutline.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ImageOffOutline.vue?vue&type=template&id=7d95c70e\"\nimport script from \"./ImageOffOutline.vue?vue&type=script&lang=js\"\nexport * from \"./ImageOffOutline.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',_vm._b({staticClass:\"material-design-icon image-off-outline-icon\",attrs:{\"aria-hidden\":_vm.title ? null : true,\"aria-label\":_vm.title,\"role\":\"img\"},on:{\"click\":function($event){return _vm.$emit('click', $event)}}},'span',_vm.$attrs,false),[_c('svg',{staticClass:\"material-design-icon__svg\",attrs:{\"fill\":_vm.fillColor,\"width\":_vm.size,\"height\":_vm.size,\"viewBox\":\"0 0 24 24\"}},[_c('path',{attrs:{\"d\":\"M22 20.7L3.3 2L2 3.3L3 4.3V19C3 20.1 3.9 21 5 21H19.7L20.7 22L22 20.7M5 19V6.3L12.6 13.9L11.1 15.8L9 13.1L6 17H15.7L17.7 19H5M8.8 5L6.8 3H19C20.1 3 21 3.9 21 5V17.2L19 15.2V5H8.8\"}},[(_vm.title)?_c('title',[_vm._v(_vm._s(_vm.title))]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2022 Louis Chmn <louis@chmn.me>\n *\n * @author Louis Chmn <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport const ATOMIC_PERMISSIONS = {\n\tNONE: 0,\n\tREAD: 1,\n\tUPDATE: 2,\n\tCREATE: 4,\n\tDELETE: 8,\n\tSHARE: 16,\n}\n\nexport const BUNDLED_PERMISSIONS = {\n\tREAD_ONLY: ATOMIC_PERMISSIONS.READ,\n\tUPLOAD_AND_UPDATE: ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE,\n\tFILE_DROP: ATOMIC_PERMISSIONS.CREATE,\n\tALL: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.DELETE | ATOMIC_PERMISSIONS.SHARE,\n\tALL_FILE: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.SHARE,\n}\n\n/**\n * Return whether a given permissions set contains some permissions.\n *\n * @param {number} initialPermissionSet - the permissions set.\n * @param {number} permissionsToCheck - the permissions to check.\n * @return {boolean}\n */\nexport function hasPermissions(initialPermissionSet, permissionsToCheck) {\n\treturn initialPermissionSet !== ATOMIC_PERMISSIONS.NONE && (initialPermissionSet & permissionsToCheck) === permissionsToCheck\n}\n\n/**\n * Return whether a given permissions set is valid.\n *\n * @param {number} permissionsSet - the permissions set.\n *\n * @return {boolean}\n */\nexport function permissionsSetIsValid(permissionsSet) {\n\t// Must have at least READ or CREATE permission.\n\tif (!hasPermissions(permissionsSet, ATOMIC_PERMISSIONS.READ) && !hasPermissions(permissionsSet, ATOMIC_PERMISSIONS.CREATE)) {\n\t\treturn false\n\t}\n\n\t// Must have READ permission if have UPDATE or DELETE.\n\tif (!hasPermissions(permissionsSet, ATOMIC_PERMISSIONS.READ) && (\n\t\thasPermissions(permissionsSet, ATOMIC_PERMISSIONS.UPDATE) || hasPermissions(permissionsSet, ATOMIC_PERMISSIONS.DELETE)\n\t)) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n/**\n * Add some permissions to an initial set of permissions.\n *\n * @param {number} initialPermissionSet - the initial permissions.\n * @param {number} permissionsToAdd - the permissions to add.\n *\n * @return {number}\n */\nexport function addPermissions(initialPermissionSet, permissionsToAdd) {\n\treturn initialPermissionSet | permissionsToAdd\n}\n\n/**\n * Remove some permissions from an initial set of permissions.\n *\n * @param {number} initialPermissionSet - the initial permissions.\n * @param {number} permissionsToSubtract - the permissions to remove.\n *\n * @return {number}\n */\nexport function subtractPermissions(initialPermissionSet, permissionsToSubtract) {\n\treturn initialPermissionSet & ~permissionsToSubtract\n}\n\n/**\n * Toggle some permissions from an initial set of permissions.\n *\n * @param {number} initialPermissionSet - the permissions set.\n * @param {number} permissionsToToggle - the permissions to toggle.\n *\n * @return {number}\n */\nexport function togglePermissions(initialPermissionSet, permissionsToToggle) {\n\tif (hasPermissions(initialPermissionSet, permissionsToToggle)) {\n\t\treturn subtractPermissions(initialPermissionSet, permissionsToToggle)\n\t} else {\n\t\treturn addPermissions(initialPermissionSet, permissionsToToggle)\n\t}\n}\n\n/**\n * Return whether some given permissions can be toggled from a permission set.\n *\n * @param {number} permissionSet - the initial permissions set.\n * @param {number} permissionsToToggle - the permissions to toggle.\n *\n * @return {boolean}\n */\nexport function canTogglePermissions(permissionSet, permissionsToToggle) {\n\treturn permissionsSetIsValid(togglePermissions(permissionSet, permissionsToToggle))\n}\n","<!--\n - @copyright 2022 Carl Schwan <carl@carlschwan.eu>\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n<template>\n\t<NcListItem class=\"version\"\n\t\t:name=\"versionLabel\"\n\t\t:force-display-actions=\"true\"\n\t\tdata-files-versions-version\n\t\t@click=\"click\">\n\t\t<template #icon>\n\t\t\t<div v-if=\"!(loadPreview || previewLoaded)\" class=\"version__image\" />\n\t\t\t<img v-else-if=\"(isCurrent || version.hasPreview) && !previewErrored\"\n\t\t\t\t:src=\"version.previewUrl\"\n\t\t\t\talt=\"\"\n\t\t\t\tdecoding=\"async\"\n\t\t\t\tfetchpriority=\"low\"\n\t\t\t\tloading=\"lazy\"\n\t\t\t\tclass=\"version__image\"\n\t\t\t\t@load=\"previewLoaded = true\"\n\t\t\t\t@error=\"previewErrored = true\">\n\t\t\t<div v-else\n\t\t\t\tclass=\"version__image\">\n\t\t\t\t<ImageOffOutline :size=\"20\" />\n\t\t\t</div>\n\t\t</template>\n\t\t<template #subname>\n\t\t\t<div class=\"version__info\">\n\t\t\t\t<span :title=\"formattedDate\">{{ version.mtime | humanDateFromNow }}</span>\n\t\t\t\t<!-- Separate dot to improve alignement -->\n\t\t\t\t<span class=\"version__info__size\">•</span>\n\t\t\t\t<span class=\"version__info__size\">{{ version.size | humanReadableSize }}</span>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<NcActionButton v-if=\"enableLabeling && hasUpdatePermissions\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t@click=\"labelUpdate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Pencil :size=\"22\" />\n\t\t\t\t</template>\n\t\t\t\t{{ version.label === '' ? t('files_versions', 'Name this version') : t('files_versions', 'Edit version name') }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionButton v-if=\"!isCurrent && canView && canCompare\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t@click=\"compareVersion\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<FileCompare :size=\"22\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files_versions', 'Compare to current version') }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionButton v-if=\"!isCurrent && hasUpdatePermissions\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t@click=\"restoreVersion\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<BackupRestore :size=\"22\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files_versions', 'Restore version') }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionLink v-if=\"isDownloadable\"\n\t\t\t\t:href=\"downloadURL\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t:download=\"downloadURL\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Download :size=\"22\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files_versions', 'Download version') }}\n\t\t\t</NcActionLink>\n\t\t\t<NcActionButton v-if=\"!isCurrent && enableDeletion && hasDeletePermissions\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t@click=\"deleteVersion\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Delete :size=\"22\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files_versions', 'Delete version') }}\n\t\t\t</NcActionButton>\n\t\t</template>\n\t</NcListItem>\n</template>\n\n<script>\nimport BackupRestore from 'vue-material-design-icons/BackupRestore.vue'\nimport Download from 'vue-material-design-icons/Download.vue'\nimport FileCompare from 'vue-material-design-icons/FileCompare.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport Delete from 'vue-material-design-icons/Delete.vue'\nimport ImageOffOutline from 'vue-material-design-icons/ImageOffOutline.vue'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js'\nimport NcListItem from '@nextcloud/vue/dist/Components/NcListItem.js'\nimport Tooltip from '@nextcloud/vue/dist/Directives/Tooltip.js'\nimport moment from '@nextcloud/moment'\nimport { translate as t } from '@nextcloud/l10n'\nimport { joinPaths } from '@nextcloud/paths'\nimport { getRootUrl } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport { Permission } from '@nextcloud/files'\n\nimport { hasPermissions } from '../../../files_sharing/src/lib/SharePermissionsToolBox.js'\n\nexport default {\n\tname: 'Version',\n\tcomponents: {\n\t\tNcActionLink,\n\t\tNcActionButton,\n\t\tNcListItem,\n\t\tBackupRestore,\n\t\tDownload,\n\t\tFileCompare,\n\t\tPencil,\n\t\tDelete,\n\t\tImageOffOutline,\n\t},\n\tdirectives: {\n\t\ttooltip: Tooltip,\n\t},\n\tfilters: {\n\t\t/**\n\t\t * @param {number} bytes\n\t\t * @return {string}\n\t\t */\n\t\thumanReadableSize(bytes) {\n\t\t\treturn OC.Util.humanFileSize(bytes)\n\t\t},\n\t\t/**\n\t\t * @param {number} timestamp\n\t\t * @return {string}\n\t\t */\n\t\thumanDateFromNow(timestamp) {\n\t\t\treturn moment(timestamp).fromNow()\n\t\t},\n\t},\n\tprops: {\n\t\t/** @type {Vue.PropOptions<import('../utils/versions.ts').Version>} */\n\t\tversion: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tfileInfo: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tisCurrent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisFirstVersion: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tloadPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tcanView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tcanCompare: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreviewLoaded: false,\n\t\t\tpreviewErrored: false,\n\t\t\tcapabilities: loadState('core', 'capabilities', { files: { version_labeling: false, version_deletion: false } }),\n\t\t}\n\t},\n\tcomputed: {\n\t\t/**\n\t\t * @return {string}\n\t\t */\n\t\tversionLabel() {\n\t\t\tconst label = this.version.label ?? ''\n\n\t\t\tif (this.isCurrent) {\n\t\t\t\tif (label === '') {\n\t\t\t\t\treturn t('files_versions', 'Current version')\n\t\t\t\t} else {\n\t\t\t\t\treturn `${label} (${t('files_versions', 'Current version')})`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isFirstVersion && label === '') {\n\t\t\t\treturn t('files_versions', 'Initial version')\n\t\t\t}\n\n\t\t\treturn label\n\t\t},\n\n\t\t/**\n\t\t * @return {string}\n\t\t */\n\t\tdownloadURL() {\n\t\t\tif (this.isCurrent) {\n\t\t\t\treturn getRootUrl() + joinPaths('/remote.php/webdav', this.fileInfo.path, this.fileInfo.name)\n\t\t\t} else {\n\t\t\t\treturn getRootUrl() + this.version.url\n\t\t\t}\n\t\t},\n\n\t\t/** @return {string} */\n\t\tformattedDate() {\n\t\t\treturn moment(this.version.mtime).format('LLL')\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\tenableLabeling() {\n\t\t\treturn this.capabilities.files.version_labeling === true\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\tenableDeletion() {\n\t\t\treturn this.capabilities.files.version_deletion === true\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\thasDeletePermissions() {\n\t\t\treturn hasPermissions(this.fileInfo.permissions, Permission.DELETE)\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\thasUpdatePermissions() {\n\t\t\treturn hasPermissions(this.fileInfo.permissions, Permission.UPDATE)\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\tisDownloadable() {\n\t\t\tif ((this.fileInfo.permissions & Permission.READ) === 0) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// If the mount type is a share, ensure it got download permissions.\n\t\t\tif (this.fileInfo.mountType === 'shared') {\n\t\t\t\tconst downloadAttribute = this.fileInfo.shareAttributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.enabled === 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},\n\tmethods: {\n\t\tlabelUpdate() {\n\t\t\tthis.$emit('label-update-request')\n\t\t},\n\n\t\trestoreVersion() {\n\t\t\tthis.$emit('restore', this.version)\n\t\t},\n\n\t\tdeleteVersion() {\n\t\t\tthis.$emit('delete', this.version)\n\t\t},\n\n\t\tclick() {\n\t\t\tif (!this.canView) {\n\t\t\t\twindow.location = this.downloadURL\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('click', { version: this.version })\n\t\t},\n\n\t\tcompareVersion() {\n\t\t\tif (!this.canView) {\n\t\t\t\tthrow new Error('Cannot compare version of this file')\n\t\t\t}\n\t\t\tthis.$emit('compare', { version: this.version })\n\t\t},\n\n\t\tt,\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.version {\n\tdisplay: flex;\n\tflex-direction: row;\n\n\t&__info {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: 0.5rem;\n\n\t\t&__size {\n\t\t\tcolor: var(--color-text-lighter);\n\t\t}\n\t}\n\n\t&__image {\n\t\twidth: 3rem;\n\t\theight: 3rem;\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: var(--border-radius-large);\n\n\t\t// Useful to display no preview icon.\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Version.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Version.vue?vue&type=script&lang=js\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Version.vue?vue&type=style&index=0&id=5b3703ac&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Version.vue?vue&type=style&index=0&id=5b3703ac&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Version.vue?vue&type=template&id=5b3703ac&scoped=true\"\nimport script from \"./Version.vue?vue&type=script&lang=js\"\nexport * from \"./Version.vue?vue&type=script&lang=js\"\nimport style0 from \"./Version.vue?vue&type=style&index=0&id=5b3703ac&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5b3703ac\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('NcListItem',{staticClass:\"version\",attrs:{\"name\":_vm.versionLabel,\"force-display-actions\":true,\"data-files-versions-version\":\"\"},on:{\"click\":_vm.click},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(!(_vm.loadPreview || _vm.previewLoaded))?_c('div',{staticClass:\"version__image\"}):((_vm.isCurrent || _vm.version.hasPreview) && !_vm.previewErrored)?_c('img',{staticClass:\"version__image\",attrs:{\"src\":_vm.version.previewUrl,\"alt\":\"\",\"decoding\":\"async\",\"fetchpriority\":\"low\",\"loading\":\"lazy\"},on:{\"load\":function($event){_vm.previewLoaded = true},\"error\":function($event){_vm.previewErrored = true}}}):_c('div',{staticClass:\"version__image\"},[_c('ImageOffOutline',{attrs:{\"size\":20}})],1)]},proxy:true},{key:\"subname\",fn:function(){return [_c('div',{staticClass:\"version__info\"},[_c('span',{attrs:{\"title\":_vm.formattedDate}},[_vm._v(_vm._s(_vm._f(\"humanDateFromNow\")(_vm.version.mtime)))]),_vm._v(\" \"),_c('span',{staticClass:\"version__info__size\"},[_vm._v(\"•\")]),_vm._v(\" \"),_c('span',{staticClass:\"version__info__size\"},[_vm._v(_vm._s(_vm._f(\"humanReadableSize\")(_vm.version.size)))])])]},proxy:true},{key:\"actions\",fn:function(){return [(_vm.enableLabeling && _vm.hasUpdatePermissions)?_c('NcActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":_vm.labelUpdate},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Pencil',{attrs:{\"size\":22}})]},proxy:true}],null,false,3072546167)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.version.label === '' ? _vm.t('files_versions', 'Name this version') : _vm.t('files_versions', 'Edit version name'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.isCurrent && _vm.canView && _vm.canCompare)?_c('NcActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":_vm.compareVersion},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('FileCompare',{attrs:{\"size\":22}})]},proxy:true}],null,false,1958207595)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Compare to current version'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.isCurrent && _vm.hasUpdatePermissions)?_c('NcActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":_vm.restoreVersion},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('BackupRestore',{attrs:{\"size\":22}})]},proxy:true}],null,false,2239038444)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Restore version'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.isDownloadable)?_c('NcActionLink',{attrs:{\"href\":_vm.downloadURL,\"close-after-click\":true,\"download\":_vm.downloadURL},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Download',{attrs:{\"size\":22}})]},proxy:true}],null,false,927269758)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Download version'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(!_vm.isCurrent && _vm.enableDeletion && _vm.hasDeletePermissions)?_c('NcActionButton',{attrs:{\"close-after-click\":true},on:{\"click\":_vm.deleteVersion},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Delete',{attrs:{\"size\":22}})]},proxy:true}],null,false,2429175571)},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Delete version'))+\"\\n\\t\\t\")]):_vm._e()]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.vue?vue&type=script&lang=ts\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return (!_vm.useWindow && _vm.containerElement === null)?_c('div',{ref:\"container\",staticClass:\"vs-container\"},[_c('div',{ref:\"rowsContainer\",staticClass:\"vs-rows-container\",style:(_vm.rowsContainerStyle)},[_vm._t(\"default\",null,{\"visibleSections\":_vm.visibleSections}),_vm._v(\" \"),_vm._t(\"loader\")],2)]):_c('div',{ref:\"rowsContainer\",staticClass:\"vs-rows-container\",style:(_vm.rowsContainerStyle)},[_vm._t(\"default\",null,{\"visibleSections\":_vm.visibleSections}),_vm._v(\" \"),_vm._t(\"loader\")],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.vue?vue&type=style&index=0&id=11dbbae6&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VirtualScrolling.vue?vue&type=style&index=0&id=11dbbae6&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./VirtualScrolling.vue?vue&type=template&id=11dbbae6&scoped=true\"\nimport script from \"./VirtualScrolling.vue?vue&type=script&lang=ts\"\nexport * from \"./VirtualScrolling.vue?vue&type=script&lang=ts\"\nimport style0 from \"./VirtualScrolling.vue?vue&type=style&index=0&id=11dbbae6&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"11dbbae6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('form',{staticClass:\"version-label-modal\",on:{\"submit\":function($event){$event.preventDefault();return _vm.setVersionLabel(_vm.innerVersionLabel)}}},[_c('label',[_c('div',{staticClass:\"version-label-modal__title\"},[_vm._v(_vm._s(_vm.t('files_versions', 'Version name')))]),_vm._v(\" \"),_c('NcTextField',{ref:\"labelInput\",attrs:{\"value\":_vm.innerVersionLabel,\"placeholder\":_vm.t('files_versions', 'Version name'),\"label-outside\":true},on:{\"update:value\":function($event){_vm.innerVersionLabel=$event}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"version-label-modal__info\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('files_versions', 'Named versions are persisted, and excluded from automatic cleanups when your storage quota is full.'))+\"\\n\\t\")]),_vm._v(\" \"),_c('div',{staticClass:\"version-label-modal__actions\"},[_c('NcButton',{attrs:{\"disabled\":_vm.innerVersionLabel.trim().length === 0},on:{\"click\":function($event){return _vm.setVersionLabel('')}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Remove version name'))+\"\\n\\t\\t\")]),_vm._v(\" \"),_c('NcButton',{attrs:{\"type\":\"primary\",\"native-type\":\"submit\"},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('Check')]},proxy:true}])},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('files_versions', 'Save version name'))+\"\\n\\t\\t\")])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionLabelForm.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionLabelForm.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionLabelForm.vue?vue&type=style&index=0&id=58311f0c&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionLabelForm.vue?vue&type=style&index=0&id=58311f0c&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./VersionLabelForm.vue?vue&type=template&id=58311f0c&scoped=true\"\nimport script from \"./VersionLabelForm.vue?vue&type=script&lang=ts\"\nexport * from \"./VersionLabelForm.vue?vue&type=script&lang=ts\"\nimport style0 from \"./VersionLabelForm.vue?vue&type=style&index=0&id=58311f0c&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"58311f0c\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionTab.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionTab.vue?vue&type=script&lang=js\"","<!--\n - @copyright 2022 Carl Schwan <carl@carlschwan.eu>\n - @license AGPL-3.0-or-later\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n<template>\n\t<div class=\"versions-tab__container\">\n\t\t<VirtualScrolling :sections=\"sections\"\n\t\t\t:header-height=\"0\">\n\t\t\t<template slot-scope=\"{visibleSections}\">\n\t\t\t\t<ul data-files-versions-versions-list>\n\t\t\t\t\t<template v-if=\"visibleSections.length === 1\">\n\t\t\t\t\t\t<Version v-for=\"(row) of visibleSections[0].rows\"\n\t\t\t\t\t\t\t:key=\"row.items[0].mtime\"\n\t\t\t\t\t\t\t:can-view=\"canView\"\n\t\t\t\t\t\t\t:can-compare=\"canCompare\"\n\t\t\t\t\t\t\t:load-preview=\"isActive\"\n\t\t\t\t\t\t\t:version=\"row.items[0]\"\n\t\t\t\t\t\t\t:file-info=\"fileInfo\"\n\t\t\t\t\t\t\t:is-current=\"row.items[0].mtime === fileInfo.mtime\"\n\t\t\t\t\t\t\t:is-first-version=\"row.items[0].mtime === initialVersionMtime\"\n\t\t\t\t\t\t\t@click=\"openVersion\"\n\t\t\t\t\t\t\t@compare=\"compareVersion\"\n\t\t\t\t\t\t\t@restore=\"handleRestore\"\n\t\t\t\t\t\t\t@label-update-request=\"handleLabelUpdateRequest(row.items[0])\"\n\t\t\t\t\t\t\t@delete=\"handleDelete\" />\n\t\t\t\t\t</template>\n\t\t\t\t</ul>\n\t\t\t</template>\n\t\t\t<NcLoadingIcon v-if=\"loading\" slot=\"loader\" class=\"files-list-viewer__loader\" />\n\t\t</VirtualScrolling>\n\t\t<NcModal v-if=\"showVersionLabelForm\"\n\t\t\t:title=\"t('files_versions', 'Name this version')\"\n\t\t\t@close=\"showVersionLabelForm = false\">\n\t\t\t<VersionLabelForm :version-label=\"editedVersion.label\" @label-update=\"handleLabelUpdate\" />\n\t\t</NcModal>\n\t</div>\n</template>\n\n<script>\nimport path from 'path'\n\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport isMobile from '@nextcloud/vue/dist/Mixins/isMobile.js'\nimport { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { getCurrentUser } from '@nextcloud/auth'\nimport NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js'\nimport NcModal from '@nextcloud/vue/dist/Components/NcModal.js'\n\nimport { fetchVersions, deleteVersion, restoreVersion, setVersionLabel } from '../utils/versions.ts'\nimport Version from '../components/Version.vue'\nimport VirtualScrolling from '../components/VirtualScrolling.vue'\nimport VersionLabelForm from '../components/VersionLabelForm.vue'\n\nexport default {\n\tname: 'VersionTab',\n\tcomponents: {\n\t\tVersion,\n\t\tVirtualScrolling,\n\t\tVersionLabelForm,\n\t\tNcLoadingIcon,\n\t\tNcModal,\n\t},\n\tmixins: [\n\t\tisMobile,\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfileInfo: null,\n\t\t\tisActive: false,\n\t\t\t/** @type {import('../utils/versions.ts').Version[]} */\n\t\t\tversions: [],\n\t\t\tloading: false,\n\t\t\tshowVersionLabelForm: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tsections() {\n\t\t\tconst rows = this.orderedVersions.map(version => ({ key: version.mtime, height: 68, sectionKey: 'versions', items: [version] }))\n\t\t\treturn [{ key: 'versions', rows, height: 68 * this.orderedVersions.length }]\n\t\t},\n\n\t\t/**\n\t\t * Order versions by mtime.\n\t\t * Put the current version at the top.\n\t\t *\n\t\t * @return {import('../utils/versions.ts').Version[]}\n\t\t */\n\t\torderedVersions() {\n\t\t\treturn [...this.versions].sort((a, b) => {\n\t\t\t\tif (a.mtime === this.fileInfo.mtime) {\n\t\t\t\t\treturn -1\n\t\t\t\t} else if (b.mtime === this.fileInfo.mtime) {\n\t\t\t\t\treturn 1\n\t\t\t\t} else {\n\t\t\t\t\treturn b.mtime - a.mtime\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Return the mtime of the first version to display \"Initial version\" label\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tinitialVersionMtime() {\n\t\t\treturn this.versions\n\t\t\t\t.map(version => version.mtime)\n\t\t\t\t.reduce((a, b) => Math.min(a, b))\n\t\t},\n\n\t\tviewerFileInfo() {\n\t\t\t// We need to remap bitmask to dav permissions as the file info we have is converted through client.js\n\t\t\tlet davPermissions = ''\n\t\t\tif (this.fileInfo.permissions & 1) {\n\t\t\t\tdavPermissions += 'R'\n\t\t\t}\n\t\t\tif (this.fileInfo.permissions & 2) {\n\t\t\t\tdavPermissions += 'W'\n\t\t\t}\n\t\t\tif (this.fileInfo.permissions & 8) {\n\t\t\t\tdavPermissions += 'D'\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...this.fileInfo,\n\t\t\t\tmime: this.fileInfo.mimetype,\n\t\t\t\tbasename: this.fileInfo.name,\n\t\t\t\tfilename: this.fileInfo.path + '/' + this.fileInfo.name,\n\t\t\t\tpermissions: davPermissions,\n\t\t\t\tfileid: this.fileInfo.id,\n\t\t\t}\n\t\t},\n\n\t\t/** @return {boolean} */\n\t\tcanView() {\n\t\t\treturn window.OCA.Viewer?.mimetypesCompare?.includes(this.fileInfo.mimetype)\n\t\t},\n\n\t\tcanCompare() {\n\t\t\treturn !this.isMobile\n\t\t},\n\t},\n\tmounted() {\n\t\tsubscribe('files_versions:restore:restored', this.fetchVersions)\n\t},\n\tbeforeUnmount() {\n\t\tunsubscribe('files_versions:restore:restored', this.fetchVersions)\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Update current fileInfo and fetch new data\n\t\t *\n\t\t * @param {object} fileInfo the current file FileInfo\n\t\t */\n\t\tasync update(fileInfo) {\n\t\t\tthis.fileInfo = fileInfo\n\t\t\tthis.resetState()\n\t\t\tthis.fetchVersions()\n\t\t},\n\n\t\t/**\n\t\t * @param {boolean} isActive whether the tab is active\n\t\t */\n\t\tasync setIsActive(isActive) {\n\t\t\tthis.isActive = isActive\n\t\t},\n\n\t\t/**\n\t\t * Get the existing versions infos\n\t\t */\n\t\tasync fetchVersions() {\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.versions = await fetchVersions(this.fileInfo)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle restored event from Version.vue\n\t\t *\n\t\t * @param {import('../utils/versions.ts').Version} version\n\t\t */\n\t\tasync handleRestore(version) {\n\t\t\t// Update local copy of fileInfo as rendering depends on it.\n\t\t\tconst oldFileInfo = this.fileInfo\n\t\t\tthis.fileInfo = {\n\t\t\t\t...this.fileInfo,\n\t\t\t\tsize: version.size,\n\t\t\t\tmtime: version.mtime,\n\t\t\t}\n\n\t\t\tconst restoreStartedEventState = {\n\t\t\t\tpreventDefault: false,\n\t\t\t\tfileInfo: this.fileInfo,\n\t\t\t\tversion,\n\t\t\t}\n\t\t\temit('files_versions:restore:requested', restoreStartedEventState)\n\t\t\tif (restoreStartedEventState.preventDefault) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait restoreVersion(version)\n\t\t\t\tif (version.label !== '') {\n\t\t\t\t\tshowSuccess(t('files_versions', `${version.label} restored`))\n\t\t\t\t} else if (version.mtime === this.initialVersionMtime) {\n\t\t\t\t\tshowSuccess(t('files_versions', 'Initial version restored'))\n\t\t\t\t} else {\n\t\t\t\t\tshowSuccess(t('files_versions', 'Version restored'))\n\t\t\t\t}\n\t\t\t\temit('files_versions:restore:restored', version)\n\t\t\t} catch (exception) {\n\t\t\t\tthis.fileInfo = oldFileInfo\n\t\t\t\tshowError(t('files_versions', 'Could not restore version'))\n\t\t\t\temit('files_versions:restore:failed', version)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle label-updated event from Version.vue\n\t\t * @param {import('../utils/versions.ts').Version} version\n\t\t */\n\t\thandleLabelUpdateRequest(version) {\n\t\t\tthis.showVersionLabelForm = true\n\t\t\tthis.editedVersion = version\n\t\t},\n\n\t\t/**\n\t\t * Handle label-updated event from Version.vue\n\t\t * @param {string} newLabel\n\t\t */\n\t\tasync handleLabelUpdate(newLabel) {\n\t\t\tconst oldLabel = this.editedVersion.label\n\t\t\tthis.editedVersion.label = newLabel\n\t\t\tthis.showVersionLabelForm = false\n\n\t\t\ttry {\n\t\t\t\tawait setVersionLabel(this.editedVersion, newLabel)\n\t\t\t\tthis.editedVersion = null\n\t\t\t} catch (exception) {\n\t\t\t\tthis.editedVersion.label = oldLabel\n\t\t\t\tshowError(this.t('files_versions', 'Could not set version label'))\n\t\t\t\tlogger.error('Could not set version label', { exception })\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle deleted event from Version.vue\n\t\t *\n\t\t * @param {import('../utils/versions.ts').Version} version\n\t\t * @param {string} newName\n\t\t */\n\t\tasync handleDelete(version) {\n\t\t\tconst index = this.versions.indexOf(version)\n\t\t\tthis.versions.splice(index, 1)\n\n\t\t\ttry {\n\t\t\t\tawait deleteVersion(version)\n\t\t\t} catch (exception) {\n\t\t\t\tthis.versions.push(version)\n\t\t\t\tshowError(t('files_versions', 'Could not delete version'))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset the current view to its default state\n\t\t */\n\t\tresetState() {\n\t\t\tthis.$set(this, 'versions', [])\n\t\t},\n\n\t\topenVersion({ version }) {\n\t\t\t// Open current file view instead of read only\n\t\t\tif (version.mtime === this.fileInfo.mtime) {\n\t\t\t\tOCA.Viewer.open({ fileInfo: this.viewerFileInfo })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Versions previews are too small for our use case, so we override hasPreview and previewUrl\n\t\t\t// which makes the viewer render the original file.\n\t\t\t// We also point to the original filename if the version is the current one.\n\t\t\tconst versions = this.versions.map(version => ({\n\t\t\t\t...version,\n\t\t\t\tfilename: version.mtime === this.fileInfo.mtime ? path.join('files', getCurrentUser()?.uid ?? '', this.fileInfo.path, this.fileInfo.name) : version.filename,\n\t\t\t\thasPreview: false,\n\t\t\t\tpreviewUrl: undefined,\n\t\t\t}))\n\n\t\t\tOCA.Viewer.open({\n\t\t\t\tfileInfo: versions.find(v => v.source === version.source),\n\t\t\t\tenableSidebar: false,\n\t\t\t})\n\t\t},\n\n\t\tcompareVersion({ version }) {\n\t\t\tconst versions = this.versions.map(version => ({ ...version, hasPreview: false, previewUrl: undefined }))\n\n\t\t\tOCA.Viewer.compare(this.viewerFileInfo, versions.find(v => v.source === version.source))\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\">\n.versions-tab__container {\n\theight: 100%;\n}\n</style>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable jsdoc/require-param */\n/* eslint-disable jsdoc/require-jsdoc */\n/**\n * @copyright 2022 Louis Chemineau <mlouis@chmn.me>\n *\n * @author Louis Chemineau <mlouis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { getCurrentUser } from '@nextcloud/auth';\nimport { joinPaths } from '@nextcloud/paths';\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router';\nimport moment from '@nextcloud/moment';\nimport { encodeFilePath } from '../../../files/src/utils/fileUtils.ts';\nimport client from '../utils/davClient.js';\nimport davRequest from '../utils/davRequest.js';\nimport logger from '../utils/logger.js';\nexport async function fetchVersions(fileInfo) {\n const path = `/versions/${getCurrentUser()?.uid}/versions/${fileInfo.id}`;\n try {\n const response = await client.getDirectoryContents(path, {\n data: davRequest,\n details: true,\n });\n return response.data\n // Filter out root\n .filter(({ mime }) => mime !== '')\n .map(version => formatVersion(version, fileInfo));\n }\n catch (exception) {\n logger.error('Could not fetch version', { exception });\n throw exception;\n }\n}\n/**\n * Restore the given version\n */\nexport async function restoreVersion(version) {\n try {\n logger.debug('Restoring version', { url: version.url });\n await client.moveFile(`/versions/${getCurrentUser()?.uid}/versions/${version.fileId}/${version.fileVersion}`, `/versions/${getCurrentUser()?.uid}/restore/target`);\n }\n catch (exception) {\n logger.error('Could not restore version', { exception });\n throw exception;\n }\n}\n/**\n * Format version\n */\nfunction formatVersion(version, fileInfo) {\n const mtime = moment(version.lastmod).unix() * 1000;\n let previewUrl = '';\n if (mtime === fileInfo.mtime) { // Version is the current one\n previewUrl = generateUrl('/core/preview?fileId={fileId}&c={fileEtag}&x=250&y=250&forceIcon=0&a=0', {\n fileId: fileInfo.id,\n fileEtag: fileInfo.etag,\n });\n }\n else {\n previewUrl = generateUrl('/apps/files_versions/preview?file={file}&version={fileVersion}', {\n file: joinPaths(fileInfo.path, fileInfo.name),\n fileVersion: version.basename,\n });\n }\n return {\n fileId: fileInfo.id,\n label: version.props['version-label'],\n filename: version.filename,\n basename: moment(mtime).format('LLL'),\n mime: version.mime,\n etag: `${version.props.getetag}`,\n size: version.size,\n type: version.type,\n mtime,\n permissions: 'R',\n hasPreview: version.props['has-preview'] === 1,\n previewUrl,\n url: joinPaths('/remote.php/dav', version.filename),\n source: generateRemoteUrl('dav') + encodeFilePath(version.filename),\n fileVersion: version.basename,\n };\n}\nexport async function setVersionLabel(version, newLabel) {\n return await client.customRequest(version.filename, {\n method: 'PROPPATCH',\n data: `<?xml version=\"1.0\"?>\n\t\t\t\t\t<d:propertyupdate xmlns:d=\"DAV:\"\n\t\t\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t\t<d:set>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<nc:version-label>${newLabel}</nc:version-label>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t</d:set>\n\t\t\t\t\t</d:propertyupdate>`,\n });\n}\nexport async function deleteVersion(version) {\n await client.deleteFile(version.filename);\n}\n","/**\n * @copyright Copyright (c) 2019 Louis Chmn <louis@chmn.me>\n *\n * @author Louis Chmn <louis@chmn.me>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport default `<?xml version=\"1.0\"?>\n<d:propfind xmlns:d=\"DAV:\"\n\txmlns:oc=\"http://owncloud.org/ns\"\n\txmlns:nc=\"http://nextcloud.org/ns\"\n\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t<d:prop>\n\t\t<d:getcontentlength />\n\t\t<d:getcontenttype />\n\t\t<d:getlastmodified />\n\t\t<d:getetag />\n\t\t<nc:version-label />\n\t\t<nc:has-preview />\n\t</d:prop>\n</d:propfind>`\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionTab.vue?vue&type=style&index=0&id=9f52be8e&prod&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionTab.vue?vue&type=style&index=0&id=9f52be8e&prod&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./VersionTab.vue?vue&type=template&id=9f52be8e\"\nimport script from \"./VersionTab.vue?vue&type=script&lang=js\"\nexport * from \"./VersionTab.vue?vue&type=script&lang=js\"\nimport style0 from \"./VersionTab.vue?vue&type=style&index=0&id=9f52be8e&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"versions-tab__container\"},[_c('VirtualScrolling',{attrs:{\"sections\":_vm.sections,\"header-height\":0},scopedSlots:_vm._u([{key:\"default\",fn:function({visibleSections}){return [_c('ul',{attrs:{\"data-files-versions-versions-list\":\"\"}},[(visibleSections.length === 1)?_vm._l((visibleSections[0].rows),function(row){return _c('Version',{key:row.items[0].mtime,attrs:{\"can-view\":_vm.canView,\"can-compare\":_vm.canCompare,\"load-preview\":_vm.isActive,\"version\":row.items[0],\"file-info\":_vm.fileInfo,\"is-current\":row.items[0].mtime === _vm.fileInfo.mtime,\"is-first-version\":row.items[0].mtime === _vm.initialVersionMtime},on:{\"click\":_vm.openVersion,\"compare\":_vm.compareVersion,\"restore\":_vm.handleRestore,\"label-update-request\":function($event){return _vm.handleLabelUpdateRequest(row.items[0])},\"delete\":_vm.handleDelete}})}):_vm._e()],2)]}}])},[_vm._v(\" \"),(_vm.loading)?_c('NcLoadingIcon',{staticClass:\"files-list-viewer__loader\",attrs:{\"slot\":\"loader\"},slot:\"loader\"}):_vm._e()],1),_vm._v(\" \"),(_vm.showVersionLabelForm)?_c('NcModal',{attrs:{\"title\":_vm.t('files_versions', 'Name this version')},on:{\"close\":function($event){_vm.showVersionLabelForm = false}}},[_c('VersionLabelForm',{attrs:{\"version-label\":_vm.editedVersion.label},on:{\"label-update\":_vm.handleLabelUpdate}})],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2022 Carl Schwan <carl@carlschwan.eu>\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport { translate as t, translatePlural as n } from '@nextcloud/l10n'\n\nimport VersionTab from './views/VersionTab.vue'\nimport VTooltip from 'v-tooltip'\n// eslint-disable-next-line n/no-missing-import, import/no-unresolved\nimport BackupRestore from '@mdi/svg/svg/backup-restore.svg?raw'\n\nVue.prototype.t = t\nVue.prototype.n = n\n\nVue.use(VTooltip)\n\n// Init Sharing tab component\nconst View = Vue.extend(VersionTab)\nlet TabInstance = null\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\tif (OCA.Files?.Sidebar === undefined) {\n\t\treturn\n\t}\n\n\tOCA.Files.Sidebar.registerTab(new OCA.Files.Sidebar.Tab({\n\t\tid: 'version_vue',\n\t\tname: t('files_versions', 'Versions'),\n\t\ticonSvg: BackupRestore,\n\n\t\tasync mount(el, fileInfo, context) {\n\t\t\tif (TabInstance) {\n\t\t\t\tTabInstance.$destroy()\n\t\t\t}\n\t\t\tTabInstance = new View({\n\t\t\t\t// Better integration with vue parent component\n\t\t\t\tparent: context,\n\t\t\t})\n\t\t\t// Only mount after we have all the info we need\n\t\t\tawait TabInstance.update(fileInfo)\n\t\t\tTabInstance.$mount(el)\n\t\t},\n\t\tupdate(fileInfo) {\n\t\t\tTabInstance.update(fileInfo)\n\t\t},\n\t\tsetIsActive(isActive) {\n\t\t\tif (!TabInstance) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tTabInstance.setIsActive(isActive)\n\t\t},\n\t\tdestroy() {\n\t\t\tTabInstance.$destroy()\n\t\t\tTabInstance = null\n\t\t},\n\t\tenabled(fileInfo) {\n\t\t\treturn !(fileInfo?.isDirectory() ?? true)\n\t\t},\n\t}))\n})\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.version[data-v-5b3703ac]{display:flex;flex-direction:row}.version__info[data-v-5b3703ac]{display:flex;flex-direction:row;align-items:center;gap:.5rem}.version__info__size[data-v-5b3703ac]{color:var(--color-text-lighter)}.version__image[data-v-5b3703ac]{width:3rem;height:3rem;border:1px solid var(--color-border);border-radius:var(--border-radius-large);display:flex;justify-content:center;color:var(--color-text-light)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files_versions/src/components/Version.vue\"],\"names\":[],\"mappings\":\"AACA,0BACC,YAAA,CACA,kBAAA,CAEA,gCACC,YAAA,CACA,kBAAA,CACA,kBAAA,CACA,SAAA,CAEA,sCACC,+BAAA,CAIF,iCACC,UAAA,CACA,WAAA,CACA,oCAAA,CACA,wCAAA,CAGA,YAAA,CACA,sBAAA,CACA,6BAAA\",\"sourcesContent\":[\"\\n.version {\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\n\\t&__info {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: row;\\n\\t\\talign-items: center;\\n\\t\\tgap: 0.5rem;\\n\\n\\t\\t&__size {\\n\\t\\t\\tcolor: var(--color-text-lighter);\\n\\t\\t}\\n\\t}\\n\\n\\t&__image {\\n\\t\\twidth: 3rem;\\n\\t\\theight: 3rem;\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tborder-radius: var(--border-radius-large);\\n\\n\\t\\t// Useful to display no preview icon.\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: center;\\n\\t\\tcolor: var(--color-text-light);\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.version-label-modal[data-v-58311f0c]{display:flex;justify-content:space-between;flex-direction:column;height:250px;padding:16px}.version-label-modal__title[data-v-58311f0c]{margin-bottom:12px;font-weight:600}.version-label-modal__info[data-v-58311f0c]{margin-top:12px;color:var(--color-text-maxcontrast)}.version-label-modal__actions[data-v-58311f0c]{display:flex;justify-content:space-between;margin-top:64px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files_versions/src/components/VersionLabelForm.vue\"],\"names\":[],\"mappings\":\"AACA,sCACC,YAAA,CACA,6BAAA,CACA,qBAAA,CACA,YAAA,CACA,YAAA,CAEA,6CACC,kBAAA,CACA,eAAA,CAGD,4CACC,eAAA,CACA,mCAAA,CAGD,+CACC,YAAA,CACA,6BAAA,CACA,eAAA\",\"sourcesContent\":[\"\\n.version-label-modal {\\n\\tdisplay: flex;\\n\\tjustify-content: space-between;\\n\\tflex-direction: column;\\n\\theight: 250px;\\n\\tpadding: 16px;\\n\\n\\t&__title {\\n\\t\\tmargin-bottom: 12px;\\n\\t\\tfont-weight: 600;\\n\\t}\\n\\n\\t&__info {\\n\\t\\tmargin-top: 12px;\\n\\t\\tcolor: var(--color-text-maxcontrast);\\n\\t}\\n\\n\\t&__actions {\\n\\t\\tdisplay: flex;\\n\\t\\tjustify-content: space-between;\\n\\t\\tmargin-top: 64px;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.vs-container[data-v-11dbbae6]{overflow-y:scroll;height:100%}.vs-rows-container[data-v-11dbbae6]{box-sizing:border-box;will-change:scroll-position,padding;contain:layout paint style}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files_versions/src/components/VirtualScrolling.vue\"],\"names\":[],\"mappings\":\"AACA,+BACC,iBAAA,CACA,WAAA,CAGD,oCACC,qBAAA,CACA,mCAAA,CACA,0BAAA\",\"sourcesContent\":[\"\\n.vs-container {\\n\\toverflow-y: scroll;\\n\\theight: 100%;\\n}\\n\\n.vs-rows-container {\\n\\tbox-sizing: border-box;\\n\\twill-change: scroll-position, padding;\\n\\tcontain: layout paint style;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.versions-tab__container{height:100%}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/files_versions/src/views/VersionTab.vue\"],\"names\":[],\"mappings\":\"AACA,yBACC,WAAA\",\"sourcesContent\":[\"\\n.versions-tab__container {\\n\\theight: 100%;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import { getCurrentUser, onRequestTokenUpdate, getRequestToken } from \"@nextcloud/auth\";\nimport { getLoggerBuilder } from \"@nextcloud/logger\";\nimport { join, basename, extname, dirname } from \"path\";\nimport { encodePath } from \"@nextcloud/paths\";\nimport { generateRemoteUrl } from \"@nextcloud/router\";\nimport { createClient, getPatcher } from \"webdav\";\nimport { CancelablePromise } from \"cancelable-promise\";\nimport { getCanonicalLocale, getLanguage } from \"@nextcloud/l10n\";\n/**\n * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst getLogger = (user) => {\n if (user === null) {\n return getLoggerBuilder().setApp(\"files\").build();\n }\n return getLoggerBuilder().setApp(\"files\").setUid(user.uid).build();\n};\nconst logger = getLogger(getCurrentUser());\n/**\n * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nvar NewMenuEntryCategory = /* @__PURE__ */ ((NewMenuEntryCategory2) => {\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"UploadFromDevice\"] = 0] = \"UploadFromDevice\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"CreateNew\"] = 1] = \"CreateNew\";\n NewMenuEntryCategory2[NewMenuEntryCategory2[\"Other\"] = 2] = \"Other\";\n return NewMenuEntryCategory2;\n})(NewMenuEntryCategory || {});\nclass NewFileMenu {\n _entries = [];\n registerEntry(entry) {\n this.validateEntry(entry);\n entry.category = entry.category ?? 1;\n this._entries.push(entry);\n }\n unregisterEntry(entry) {\n const entryIndex = typeof entry === \"string\" ? this.getEntryIndex(entry) : this.getEntryIndex(entry.id);\n if (entryIndex === -1) {\n logger.warn(\"Entry not found, nothing removed\", { entry, entries: this.getEntries() });\n return;\n }\n this._entries.splice(entryIndex, 1);\n }\n /**\n * Get the list of registered entries\n *\n * @param {Folder} context the creation context. Usually the current folder\n */\n getEntries(context) {\n if (context) {\n return this._entries.filter((entry) => typeof entry.enabled === \"function\" ? entry.enabled(context) : true);\n }\n return this._entries;\n }\n getEntryIndex(id) {\n return this._entries.findIndex((entry) => entry.id === id);\n }\n validateEntry(entry) {\n if (!entry.id || !entry.displayName || !(entry.iconSvgInline || entry.iconClass) || !entry.handler) {\n throw new Error(\"Invalid entry\");\n }\n if (typeof entry.id !== \"string\" || typeof entry.displayName !== \"string\") {\n throw new Error(\"Invalid id or displayName property\");\n }\n if (entry.iconClass && typeof entry.iconClass !== \"string\" || entry.iconSvgInline && typeof entry.iconSvgInline !== \"string\") {\n throw new Error(\"Invalid icon provided\");\n }\n if (entry.enabled !== void 0 && typeof entry.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (typeof entry.handler !== \"function\") {\n throw new Error(\"Invalid handler property\");\n }\n if (\"order\" in entry && typeof entry.order !== \"number\") {\n throw new Error(\"Invalid order property\");\n }\n if (this.getEntryIndex(entry.id) !== -1) {\n throw new Error(\"Duplicate entry\");\n }\n }\n}\nconst getNewFileMenu = function() {\n if (typeof window._nc_newfilemenu === \"undefined\") {\n window._nc_newfilemenu = new NewFileMenu();\n logger.debug(\"NewFileMenu initialized\");\n }\n return window._nc_newfilemenu;\n};\n/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nvar DefaultType = /* @__PURE__ */ ((DefaultType2) => {\n DefaultType2[\"DEFAULT\"] = \"default\";\n DefaultType2[\"HIDDEN\"] = \"hidden\";\n return DefaultType2;\n})(DefaultType || {});\nclass FileAction {\n _action;\n constructor(action) {\n this.validateAction(action);\n this._action = action;\n }\n get id() {\n return this._action.id;\n }\n get displayName() {\n return this._action.displayName;\n }\n get title() {\n return this._action.title;\n }\n get iconSvgInline() {\n return this._action.iconSvgInline;\n }\n get enabled() {\n return this._action.enabled;\n }\n get exec() {\n return this._action.exec;\n }\n get execBatch() {\n return this._action.execBatch;\n }\n get order() {\n return this._action.order;\n }\n get parent() {\n return this._action.parent;\n }\n get default() {\n return this._action.default;\n }\n get inline() {\n return this._action.inline;\n }\n get renderInline() {\n return this._action.renderInline;\n }\n validateAction(action) {\n if (!action.id || typeof action.id !== \"string\") {\n throw new Error(\"Invalid id\");\n }\n if (!action.displayName || typeof action.displayName !== \"function\") {\n throw new Error(\"Invalid displayName function\");\n }\n if (\"title\" in action && typeof action.title !== \"function\") {\n throw new Error(\"Invalid title function\");\n }\n if (!action.iconSvgInline || typeof action.iconSvgInline !== \"function\") {\n throw new Error(\"Invalid iconSvgInline function\");\n }\n if (!action.exec || typeof action.exec !== \"function\") {\n throw new Error(\"Invalid exec function\");\n }\n if (\"enabled\" in action && typeof action.enabled !== \"function\") {\n throw new Error(\"Invalid enabled function\");\n }\n if (\"execBatch\" in action && typeof action.execBatch !== \"function\") {\n throw new Error(\"Invalid execBatch function\");\n }\n if (\"order\" in action && typeof action.order !== \"number\") {\n throw new Error(\"Invalid order\");\n }\n if (\"parent\" in action && typeof action.parent !== \"string\") {\n throw new Error(\"Invalid parent\");\n }\n if (action.default && !Object.values(DefaultType).includes(action.default)) {\n throw new Error(\"Invalid default\");\n }\n if (\"inline\" in action && typeof action.inline !== \"function\") {\n throw new Error(\"Invalid inline function\");\n }\n if (\"renderInline\" in action && typeof action.renderInline !== \"function\") {\n throw new Error(\"Invalid renderInline function\");\n }\n }\n}\nconst registerFileAction = function(action) {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n if (window._nc_fileactions.find((search) => search.id === action.id)) {\n logger.error(`FileAction ${action.id} already registered`, { action });\n return;\n }\n window._nc_fileactions.push(action);\n};\nconst getFileActions = function() {\n if (typeof window._nc_fileactions === \"undefined\") {\n window._nc_fileactions = [];\n logger.debug(\"FileActions initialized\");\n }\n return window._nc_fileactions;\n};\n/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass Header {\n _header;\n constructor(header) {\n this.validateHeader(header);\n this._header = header;\n }\n get id() {\n return this._header.id;\n }\n get order() {\n return this._header.order;\n }\n get enabled() {\n return this._header.enabled;\n }\n get render() {\n return this._header.render;\n }\n get updated() {\n return this._header.updated;\n }\n validateHeader(header) {\n if (!header.id || !header.render || !header.updated) {\n throw new Error(\"Invalid header: id, render and updated are required\");\n }\n if (typeof header.id !== \"string\") {\n throw new Error(\"Invalid id property\");\n }\n if (header.enabled !== void 0 && typeof header.enabled !== \"function\") {\n throw new Error(\"Invalid enabled property\");\n }\n if (header.render && typeof header.render !== \"function\") {\n throw new Error(\"Invalid render property\");\n }\n if (header.updated && typeof header.updated !== \"function\") {\n throw new Error(\"Invalid updated property\");\n }\n }\n}\nconst registerFileListHeaders = function(header) {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n if (window._nc_filelistheader.find((search) => search.id === header.id)) {\n logger.error(`Header ${header.id} already registered`, { header });\n return;\n }\n window._nc_filelistheader.push(header);\n};\nconst getFileListHeaders = function() {\n if (typeof window._nc_filelistheader === \"undefined\") {\n window._nc_filelistheader = [];\n logger.debug(\"FileListHeaders initialized\");\n }\n return window._nc_filelistheader;\n};\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nvar Permission = /* @__PURE__ */ ((Permission2) => {\n Permission2[Permission2[\"NONE\"] = 0] = \"NONE\";\n Permission2[Permission2[\"CREATE\"] = 4] = \"CREATE\";\n Permission2[Permission2[\"READ\"] = 1] = \"READ\";\n Permission2[Permission2[\"UPDATE\"] = 2] = \"UPDATE\";\n Permission2[Permission2[\"DELETE\"] = 8] = \"DELETE\";\n Permission2[Permission2[\"SHARE\"] = 16] = \"SHARE\";\n Permission2[Permission2[\"ALL\"] = 31] = \"ALL\";\n return Permission2;\n})(Permission || {});\n/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst defaultDavProperties = [\n \"d:getcontentlength\",\n \"d:getcontenttype\",\n \"d:getetag\",\n \"d:getlastmodified\",\n \"d:quota-available-bytes\",\n \"d:resourcetype\",\n \"nc:has-preview\",\n \"nc:is-encrypted\",\n \"nc:mount-type\",\n \"oc:comments-unread\",\n \"oc:favorite\",\n \"oc:fileid\",\n \"oc:owner-display-name\",\n \"oc:owner-id\",\n \"oc:permissions\",\n \"oc:size\"\n];\nconst defaultDavNamespaces = {\n d: \"DAV:\",\n nc: \"http://nextcloud.org/ns\",\n oc: \"http://owncloud.org/ns\",\n ocs: \"http://open-collaboration-services.org/ns\"\n};\nconst registerDavProperty = function(prop, namespace = { nc: \"http://nextcloud.org/ns\" }) {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n const namespaces = { ...window._nc_dav_namespaces, ...namespace };\n if (window._nc_dav_properties.find((search) => search === prop)) {\n logger.warn(`${prop} already registered`, { prop });\n return false;\n }\n if (prop.startsWith(\"<\") || prop.split(\":\").length !== 2) {\n logger.error(`${prop} is not valid. See example: 'oc:fileid'`, { prop });\n return false;\n }\n const ns = prop.split(\":\")[0];\n if (!namespaces[ns]) {\n logger.error(`${prop} namespace unknown`, { prop, namespaces });\n return false;\n }\n window._nc_dav_properties.push(prop);\n window._nc_dav_namespaces = namespaces;\n return true;\n};\nconst getDavProperties = function() {\n if (typeof window._nc_dav_properties === \"undefined\") {\n window._nc_dav_properties = [...defaultDavProperties];\n }\n return window._nc_dav_properties.map((prop) => `<${prop} />`).join(\" \");\n};\nconst getDavNameSpaces = function() {\n if (typeof window._nc_dav_namespaces === \"undefined\") {\n window._nc_dav_namespaces = { ...defaultDavNamespaces };\n }\n return Object.keys(window._nc_dav_namespaces).map((ns) => `xmlns:${ns}=\"${window._nc_dav_namespaces?.[ns]}\"`).join(\" \");\n};\nconst davGetDefaultPropfind = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<d:propfind ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:propfind>`;\n};\nconst davGetFavoritesReport = function() {\n return `<?xml version=\"1.0\"?>\n\t\t<oc:filter-files ${getDavNameSpaces()}>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t\t<oc:filter-rules>\n\t\t\t\t<oc:favorite>1</oc:favorite>\n\t\t\t</oc:filter-rules>\n\t\t</oc:filter-files>`;\n};\nconst davGetRecentSearch = function(lastModified) {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<d:searchrequest ${getDavNameSpaces()}\n\txmlns:ns=\"https://github.com/icewind1991/SearchDAV/ns\">\n\t<d:basicsearch>\n\t\t<d:select>\n\t\t\t<d:prop>\n\t\t\t\t${getDavProperties()}\n\t\t\t</d:prop>\n\t\t</d:select>\n\t\t<d:from>\n\t\t\t<d:scope>\n\t\t\t\t<d:href>/files/${getCurrentUser()?.uid}/</d:href>\n\t\t\t\t<d:depth>infinity</d:depth>\n\t\t\t</d:scope>\n\t\t</d:from>\n\t\t<d:where>\n\t\t\t<d:and>\n\t\t\t\t<d:or>\n\t\t\t\t\t<d:not>\n\t\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t\t<d:getcontenttype/>\n\t\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t\t<d:literal>httpd/unix-directory</d:literal>\n\t\t\t\t\t\t</d:eq>\n\t\t\t\t\t</d:not>\n\t\t\t\t\t<d:eq>\n\t\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t\t<oc:size/>\n\t\t\t\t\t\t</d:prop>\n\t\t\t\t\t\t<d:literal>0</d:literal>\n\t\t\t\t\t</d:eq>\n\t\t\t\t</d:or>\n\t\t\t\t<d:gt>\n\t\t\t\t\t<d:prop>\n\t\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t\t</d:prop>\n\t\t\t\t\t<d:literal>${lastModified}</d:literal>\n\t\t\t\t</d:gt>\n\t\t\t</d:and>\n\t\t</d:where>\n\t\t<d:orderby>\n\t\t\t<d:order>\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getlastmodified/>\n\t\t\t\t</d:prop>\n\t\t\t\t<d:descending/>\n\t\t\t</d:order>\n\t\t</d:orderby>\n\t\t<d:limit>\n\t\t\t<d:nresults>100</d:nresults>\n\t\t\t<ns:firstresult>0</ns:firstresult>\n\t\t</d:limit>\n\t</d:basicsearch>\n</d:searchrequest>`;\n};\n/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst davParsePermissions = function(permString = \"\") {\n let permissions = Permission.NONE;\n if (!permString) {\n return permissions;\n }\n if (permString.includes(\"C\") || permString.includes(\"K\")) {\n permissions |= Permission.CREATE;\n }\n if (permString.includes(\"G\")) {\n permissions |= Permission.READ;\n }\n if (permString.includes(\"W\") || permString.includes(\"N\") || permString.includes(\"V\")) {\n permissions |= Permission.UPDATE;\n }\n if (permString.includes(\"D\")) {\n permissions |= Permission.DELETE;\n }\n if (permString.includes(\"R\")) {\n permissions |= Permission.SHARE;\n }\n return permissions;\n};\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nvar FileType = /* @__PURE__ */ ((FileType2) => {\n FileType2[\"Folder\"] = \"folder\";\n FileType2[\"File\"] = \"file\";\n return FileType2;\n})(FileType || {});\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst isDavRessource = function(source, davService) {\n return source.match(davService) !== null;\n};\nconst validateData = (data, davService) => {\n if (data.id && typeof data.id !== \"number\") {\n throw new Error(\"Invalid id type of value\");\n }\n if (!data.source) {\n throw new Error(\"Missing mandatory source\");\n }\n try {\n new URL(data.source);\n } catch (e) {\n throw new Error(\"Invalid source format, source must be a valid URL\");\n }\n if (!data.source.startsWith(\"http\")) {\n throw new Error(\"Invalid source format, only http(s) is supported\");\n }\n if (data.mtime && !(data.mtime instanceof Date)) {\n throw new Error(\"Invalid mtime type\");\n }\n if (data.crtime && !(data.crtime instanceof Date)) {\n throw new Error(\"Invalid crtime type\");\n }\n if (!data.mime || typeof data.mime !== \"string\" || !data.mime.match(/^[-\\w.]+\\/[-+\\w.]+$/gi)) {\n throw new Error(\"Missing or invalid mandatory mime\");\n }\n if (\"size\" in data && typeof data.size !== \"number\" && data.size !== void 0) {\n throw new Error(\"Invalid size type\");\n }\n if (\"permissions\" in data && data.permissions !== void 0 && !(typeof data.permissions === \"number\" && data.permissions >= Permission.NONE && data.permissions <= Permission.ALL)) {\n throw new Error(\"Invalid permissions\");\n }\n if (data.owner && data.owner !== null && typeof data.owner !== \"string\") {\n throw new Error(\"Invalid owner type\");\n }\n if (data.attributes && typeof data.attributes !== \"object\") {\n throw new Error(\"Invalid attributes type\");\n }\n if (data.root && typeof data.root !== \"string\") {\n throw new Error(\"Invalid root type\");\n }\n if (data.root && !data.root.startsWith(\"/\")) {\n throw new Error(\"Root must start with a leading slash\");\n }\n if (data.root && !data.source.includes(data.root)) {\n throw new Error(\"Root must be part of the source\");\n }\n if (data.root && isDavRessource(data.source, davService)) {\n const service = data.source.match(davService)[0];\n if (!data.source.includes(join(service, data.root))) {\n throw new Error(\"The root must be relative to the service. e.g /files/emma\");\n }\n }\n if (data.status && !Object.values(NodeStatus).includes(data.status)) {\n throw new Error(\"Status must be a valid NodeStatus\");\n }\n};\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nvar NodeStatus = /* @__PURE__ */ ((NodeStatus2) => {\n NodeStatus2[\"NEW\"] = \"new\";\n NodeStatus2[\"FAILED\"] = \"failed\";\n NodeStatus2[\"LOADING\"] = \"loading\";\n NodeStatus2[\"LOCKED\"] = \"locked\";\n return NodeStatus2;\n})(NodeStatus || {});\nclass Node {\n _data;\n _attributes;\n _knownDavService = /(remote|public)\\.php\\/(web)?dav/i;\n readonlyAttributes = Object.entries(Object.getOwnPropertyDescriptors(Node.prototype)).filter((e) => typeof e[1].get === \"function\" && e[0] !== \"__proto__\").map((e) => e[0]);\n handler = {\n set: (target, prop, value) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n this.updateMtime();\n return Reflect.set(target, prop, value);\n },\n deleteProperty: (target, prop) => {\n if (this.readonlyAttributes.includes(prop)) {\n return false;\n }\n this.updateMtime();\n return Reflect.deleteProperty(target, prop);\n },\n // TODO: This is deprecated and only needed for files v3\n get: (target, prop, receiver) => {\n if (this.readonlyAttributes.includes(prop)) {\n logger.warn(`Accessing \"Node.attributes.${prop}\" is deprecated, access it directly on the Node instance.`);\n return Reflect.get(this, prop);\n }\n return Reflect.get(target, prop, receiver);\n }\n };\n constructor(data, davService) {\n validateData(data, davService || this._knownDavService);\n this._data = { ...data, attributes: {} };\n this._attributes = new Proxy(this._data.attributes, this.handler);\n this.update(data.attributes ?? {});\n this._data.mtime = data.mtime;\n if (davService) {\n this._knownDavService = davService;\n }\n }\n /**\n * Get the source url to this object\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get source() {\n return this._data.source.replace(/\\/$/i, \"\");\n }\n /**\n * Get the encoded source url to this object for requests purposes\n */\n get encodedSource() {\n const { origin } = new URL(this.source);\n return origin + encodePath(this.source.slice(origin.length));\n }\n /**\n * Get this object name\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get basename() {\n return basename(this.source);\n }\n /**\n * Get this object's extension\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get extension() {\n return extname(this.source);\n }\n /**\n * Get the directory path leading to this object\n * Will use the relative path to root if available\n *\n * There is no setter as the source is not meant to be changed manually.\n * You can use the rename or move method to change the source.\n */\n get dirname() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return dirname(source.slice(firstMatch + root.length) || \"/\");\n }\n const url = new URL(this.source);\n return dirname(url.pathname);\n }\n /**\n * Get the file mime\n * There is no setter as the mime is not meant to be changed\n */\n get mime() {\n return this._data.mime;\n }\n /**\n * Get the file modification time\n * There is no setter as the modification time is not meant to be changed manually.\n * It will be automatically updated when the attributes are changed.\n */\n get mtime() {\n return this._data.mtime;\n }\n /**\n * Get the file creation time\n * There is no setter as the creation time is not meant to be changed\n */\n get crtime() {\n return this._data.crtime;\n }\n /**\n * Get the file size\n */\n get size() {\n return this._data.size;\n }\n /**\n * Set the file size\n */\n set size(size) {\n this.updateMtime();\n this._data.size = size;\n }\n /**\n * Get the file attribute\n * This contains all additional attributes not provided by the Node class\n */\n get attributes() {\n return this._attributes;\n }\n /**\n * Get the file permissions\n */\n get permissions() {\n if (this.owner === null && !this.isDavRessource) {\n return Permission.READ;\n }\n return this._data.permissions !== void 0 ? this._data.permissions : Permission.NONE;\n }\n /**\n * Set the file permissions\n */\n set permissions(permissions) {\n this.updateMtime();\n this._data.permissions = permissions;\n }\n /**\n * Get the file owner\n * There is no setter as the owner is not meant to be changed\n */\n get owner() {\n if (!this.isDavRessource) {\n return null;\n }\n return this._data.owner;\n }\n /**\n * Is this a dav-related ressource ?\n */\n get isDavRessource() {\n return isDavRessource(this.source, this._knownDavService);\n }\n /**\n * Get the dav root of this object\n * There is no setter as the root is not meant to be changed\n */\n get root() {\n if (this._data.root) {\n return this._data.root.replace(/^(.+)\\/$/, \"$1\");\n }\n if (this.isDavRessource) {\n const root = dirname(this.source);\n return root.split(this._knownDavService).pop() || null;\n }\n return null;\n }\n /**\n * Get the absolute path of this object relative to the root\n */\n get path() {\n if (this.root) {\n let source = this.source;\n if (this.isDavRessource) {\n source = source.split(this._knownDavService).pop();\n }\n const firstMatch = source.indexOf(this.root);\n const root = this.root.replace(/\\/$/, \"\");\n return source.slice(firstMatch + root.length) || \"/\";\n }\n return (this.dirname + \"/\" + this.basename).replace(/\\/\\//g, \"/\");\n }\n /**\n * Get the node id if defined.\n * There is no setter as the fileid is not meant to be changed\n */\n get fileid() {\n return this._data?.id;\n }\n /**\n * Get the node status.\n */\n get status() {\n return this._data?.status;\n }\n /**\n * Set the node status.\n */\n set status(status) {\n this._data.status = status;\n }\n /**\n * Move the node to a new destination\n *\n * @param {string} destination the new source.\n * e.g. https://cloud.domain.com/remote.php/dav/files/emma/Photos/picture.jpg\n */\n move(destination) {\n validateData({ ...this._data, source: destination }, this._knownDavService);\n this._data.source = destination;\n this.updateMtime();\n }\n /**\n * Rename the node\n * This aliases the move method for easier usage\n *\n * @param basename The new name of the node\n */\n rename(basename2) {\n if (basename2.includes(\"/\")) {\n throw new Error(\"Invalid basename\");\n }\n this.move(dirname(this.source) + \"/\" + basename2);\n }\n /**\n * Update the mtime if exists.\n */\n updateMtime() {\n if (this._data.mtime) {\n this._data.mtime = /* @__PURE__ */ new Date();\n }\n }\n /**\n * Update the attributes of the node\n *\n * @param attributes The new attributes to update on the Node attributes\n */\n update(attributes) {\n for (const [name, value] of Object.entries(attributes)) {\n try {\n if (value === void 0) {\n delete this.attributes[name];\n } else {\n this.attributes[name] = value;\n }\n } catch (e) {\n if (e instanceof TypeError) {\n continue;\n }\n throw e;\n }\n }\n }\n}\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass File extends Node {\n get type() {\n return FileType.File;\n }\n}\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass Folder extends Node {\n constructor(data) {\n super({\n ...data,\n mime: \"httpd/unix-directory\"\n });\n }\n get type() {\n return FileType.Folder;\n }\n get extension() {\n return null;\n }\n get mime() {\n return \"httpd/unix-directory\";\n }\n}\n/**\n * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Ferdinand Thiessen <opensource@fthiessen.de>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst davRootPath = `/files/${getCurrentUser()?.uid}`;\nconst davRemoteURL = generateRemoteUrl(\"dav\");\nconst davGetClient = function(remoteURL = davRemoteURL, headers = {}) {\n const client = createClient(remoteURL, { headers });\n function setHeaders(token) {\n client.setHeaders({\n ...headers,\n // Add this so the server knows it is an request from the browser\n \"X-Requested-With\": \"XMLHttpRequest\",\n // Inject user auth\n requesttoken: token ?? \"\"\n });\n }\n onRequestTokenUpdate(setHeaders);\n setHeaders(getRequestToken());\n const patcher = getPatcher();\n patcher.patch(\"fetch\", (url, options) => {\n const headers2 = options.headers;\n if (headers2?.method) {\n options.method = headers2.method;\n delete headers2.method;\n }\n return fetch(url, options);\n });\n return client;\n};\nconst getFavoriteNodes = (davClient, path = \"/\", davRoot = davRootPath) => {\n const controller = new AbortController();\n return new CancelablePromise(async (resolve, reject, onCancel) => {\n onCancel(() => controller.abort());\n try {\n const contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, {\n signal: controller.signal,\n details: true,\n data: davGetFavoritesReport(),\n headers: {\n // see davGetClient for patched webdav client\n method: \"REPORT\"\n },\n includeSelf: true\n });\n const nodes = contentsResponse.data.filter((node) => node.filename !== path).map((result) => davResultToNode(result, davRoot));\n resolve(nodes);\n } catch (error) {\n reject(error);\n }\n });\n};\nconst davResultToNode = function(node, filesRoot = davRootPath, remoteURL = davRemoteURL) {\n let userId = getCurrentUser()?.uid;\n const isPublic = document.querySelector(\"input#isPublic\")?.value;\n if (isPublic) {\n userId = userId ?? document.querySelector(\"input#sharingUserId\")?.value;\n userId = userId ?? \"anonymous\";\n } else if (!userId) {\n throw new Error(\"No user id found\");\n }\n const props = node.props;\n const permissions = davParsePermissions(props?.permissions);\n const owner = String(props?.[\"owner-id\"] || userId);\n const nodeData = {\n id: props?.fileid || 0,\n source: `${remoteURL}${node.filename}`,\n mtime: new Date(Date.parse(node.lastmod)),\n mime: node.mime || \"application/octet-stream\",\n size: props?.size || Number.parseInt(props.getcontentlength || \"0\"),\n permissions,\n owner,\n root: filesRoot,\n attributes: {\n ...node,\n ...props,\n hasPreview: props?.[\"has-preview\"]\n }\n };\n delete nodeData.attributes?.props;\n return node.type === \"file\" ? new File(nodeData) : new Folder(nodeData);\n};\nconst forbiddenCharacters = window._oc_config?.forbidden_filenames_characters ?? [\"/\", \"\\\\\"];\nconst forbiddenFilenameRegex = window._oc_config?.blacklist_files_regex ? new RegExp(window._oc_config.blacklist_files_regex) : null;\nfunction isFilenameValid(filename) {\n if (forbiddenCharacters.some((character) => filename.includes(character))) {\n return false;\n }\n if (forbiddenFilenameRegex !== null && filename.match(forbiddenFilenameRegex)) {\n return false;\n }\n return true;\n}\n/**\n * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst humanList = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\nconst humanListBinary = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\nfunction formatFileSize(size, skipSmallSizes = false, binaryPrefixes = false, base1000 = false) {\n binaryPrefixes = binaryPrefixes && !base1000;\n if (typeof size === \"string\") {\n size = Number(size);\n }\n let order = size > 0 ? Math.floor(Math.log(size) / Math.log(base1000 ? 1e3 : 1024)) : 0;\n order = Math.min((binaryPrefixes ? humanListBinary.length : humanList.length) - 1, order);\n const readableFormat = binaryPrefixes ? humanListBinary[order] : humanList[order];\n let relativeSize = (size / Math.pow(base1000 ? 1e3 : 1024, order)).toFixed(1);\n if (skipSmallSizes === true && order === 0) {\n return (relativeSize !== \"0.0\" ? \"< 1 \" : \"0 \") + (binaryPrefixes ? humanListBinary[1] : humanList[1]);\n }\n if (order < 2) {\n relativeSize = parseFloat(relativeSize).toFixed(0);\n } else {\n relativeSize = parseFloat(relativeSize).toLocaleString(getCanonicalLocale());\n }\n return relativeSize + \" \" + readableFormat;\n}\nfunction parseFileSize(value, forceBinary = false) {\n try {\n value = `${value}`.toLocaleLowerCase().replaceAll(/\\s+/g, \"\").replaceAll(\",\", \".\");\n } catch (e) {\n return null;\n }\n const match = value.match(/^([0-9]*(\\.[0-9]*)?)([kmgtp]?)(i?)b?$/);\n if (match === null || match[1] === \".\" || match[1] === \"\") {\n return null;\n }\n const bytesArray = {\n \"\": 0,\n k: 1,\n m: 2,\n g: 3,\n t: 4,\n p: 5,\n e: 6\n };\n const decimalString = `${match[1]}`;\n const base = match[4] === \"i\" || forceBinary ? 1024 : 1e3;\n return Math.round(Number.parseFloat(decimalString) * base ** bytesArray[match[3]]);\n}\nfunction stringify(value) {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\nfunction orderBy(collection, identifiers, orders) {\n identifiers = identifiers ?? [(value) => value];\n orders = orders ?? [];\n const sorting = identifiers.map((_, index) => (orders[index] ?? \"asc\") === \"asc\" ? 1 : -1);\n const collator = Intl.Collator(\n [getLanguage(), getCanonicalLocale()],\n {\n // handle 10 as ten and not as one-zero\n numeric: true,\n usage: \"sort\"\n }\n );\n return [...collection].sort((a, b) => {\n for (const [index, identifier] of identifiers.entries()) {\n const value = collator.compare(stringify(identifier(a)), stringify(identifier(b)));\n if (value !== 0) {\n return value * sorting[index];\n }\n }\n return 0;\n });\n}\nvar FilesSortingMode = /* @__PURE__ */ ((FilesSortingMode2) => {\n FilesSortingMode2[\"Name\"] = \"basename\";\n FilesSortingMode2[\"Modified\"] = \"mtime\";\n FilesSortingMode2[\"Size\"] = \"size\";\n return FilesSortingMode2;\n})(FilesSortingMode || {});\nfunction sortNodes(nodes, options = {}) {\n const sortingOptions = {\n // Default to sort by name\n sortingMode: \"basename\",\n // Default to sort ascending\n sortingOrder: \"asc\",\n ...options\n };\n const identifiers = [\n // 1: Sort favorites first if enabled\n ...sortingOptions.sortFavoritesFirst ? [(v) => v.attributes?.favorite !== 1] : [],\n // 2: Sort folders first if sorting by name\n ...sortingOptions.sortFoldersFirst ? [(v) => v.type !== \"folder\"] : [],\n // 3: Use sorting mode if NOT basename (to be able to use displayName too)\n ...sortingOptions.sortingMode !== \"basename\" ? [(v) => v[sortingOptions.sortingMode]] : [],\n // 4: Use displayName if available, fallback to name\n (v) => v.attributes?.displayName || v.basename,\n // 5: Finally, use basename if all previous sorting methods failed\n (v) => v.basename\n ];\n const orders = [\n // (for 1): always sort favorites before normal files\n ...sortingOptions.sortFavoritesFirst ? [\"asc\"] : [],\n // (for 2): always sort folders before files\n ...sortingOptions.sortFoldersFirst ? [\"asc\"] : [],\n // (for 3): Reverse if sorting by mtime as mtime higher means edited more recent -> lower\n ...sortingOptions.sortingMode === \"mtime\" ? [sortingOptions.sortingOrder === \"asc\" ? \"desc\" : \"asc\"] : [],\n // (also for 3 so make sure not to conflict with 2 and 3)\n ...sortingOptions.sortingMode !== \"mtime\" && sortingOptions.sortingMode !== \"basename\" ? [sortingOptions.sortingOrder] : [],\n // for 4: use configured sorting direction\n sortingOptions.sortingOrder,\n // for 5: use configured sorting direction\n sortingOptions.sortingOrder\n ];\n return orderBy(nodes, identifiers, orders);\n}\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass Navigation {\n _views = [];\n _currentView = null;\n register(view) {\n if (this._views.find((search) => search.id === view.id)) {\n throw new Error(`View id ${view.id} is already registered`);\n }\n this._views.push(view);\n }\n remove(id) {\n const index = this._views.findIndex((view) => view.id === id);\n if (index !== -1) {\n this._views.splice(index, 1);\n }\n }\n get views() {\n return this._views;\n }\n setActive(view) {\n this._currentView = view;\n }\n get active() {\n return this._currentView;\n }\n}\nconst getNavigation = function() {\n if (typeof window._nc_navigation === \"undefined\") {\n window._nc_navigation = new Navigation();\n logger.debug(\"Navigation service initialized\");\n }\n return window._nc_navigation;\n};\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass Column {\n _column;\n constructor(column) {\n isValidColumn(column);\n this._column = column;\n }\n get id() {\n return this._column.id;\n }\n get title() {\n return this._column.title;\n }\n get render() {\n return this._column.render;\n }\n get sort() {\n return this._column.sort;\n }\n get summary() {\n return this._column.summary;\n }\n}\nconst isValidColumn = function(column) {\n if (!column.id || typeof column.id !== \"string\") {\n throw new Error(\"A column id is required\");\n }\n if (!column.title || typeof column.title !== \"string\") {\n throw new Error(\"A column title is required\");\n }\n if (!column.render || typeof column.render !== \"function\") {\n throw new Error(\"A render function is required\");\n }\n if (column.sort && typeof column.sort !== \"function\") {\n throw new Error(\"Column sortFunction must be a function\");\n }\n if (column.summary && typeof column.summary !== \"function\") {\n throw new Error(\"Column summary must be a function\");\n }\n return true;\n};\nvar validator$2 = {};\nvar util$3 = {};\n(function(exports) {\n const nameStartChar = \":A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n const nameChar = nameStartChar + \"\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n const nameRegexp = \"[\" + nameStartChar + \"][\" + nameChar + \"]*\";\n const regexName = new RegExp(\"^\" + nameRegexp + \"$\");\n const getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n };\n const isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === \"undefined\");\n };\n exports.isExist = function(v) {\n return typeof v !== \"undefined\";\n };\n exports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n };\n exports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n if (arrayMode === \"strict\") {\n target[keys[i]] = [a[keys[i]]];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n };\n exports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return \"\";\n }\n };\n exports.isName = isName;\n exports.getAllMatches = getAllMatches;\n exports.nameRegexp = nameRegexp;\n})(util$3);\nconst util$2 = util$3;\nconst defaultOptions$2 = {\n allowBooleanAttributes: false,\n //A tag can have attributes without any value\n unpairedTags: []\n};\nvalidator$2.validate = function(xmlData, options) {\n options = Object.assign({}, defaultOptions$2, options);\n const tags = [];\n let tagFound = false;\n let reachedRoot = false;\n if (xmlData[0] === \"\\uFEFF\") {\n xmlData = xmlData.substr(1);\n }\n for (let i = 0; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && xmlData[i + 1] === \"?\") {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err)\n return i;\n } else if (xmlData[i] === \"<\") {\n let tagStartPos = i;\n i++;\n if (xmlData[i] === \"!\") {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === \"/\") {\n closingTag = true;\n i++;\n }\n let tagName = \"\";\n for (; i < xmlData.length && xmlData[i] !== \">\" && xmlData[i] !== \" \" && xmlData[i] !== \"\t\" && xmlData[i] !== \"\\n\" && xmlData[i] !== \"\\r\"; i++) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substring(0, tagName.length - 1);\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject(\"InvalidTag\", msg, getLineNumberForPosition(xmlData, i));\n }\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject(\"InvalidAttr\", \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n if (attrStr[attrStr.length - 1] === \"/\") {\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n } else {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject(\"InvalidTag\", \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject(\n \"InvalidTag\",\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos)\n );\n }\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n if (reachedRoot === true) {\n return getErrorObject(\"InvalidXml\", \"Multiple possible root nodes found.\", getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1)\n ;\n else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"!\") {\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === \"?\") {\n i = readPI(xmlData, ++i);\n if (i.err)\n return i;\n } else {\n break;\n }\n } else if (xmlData[i] === \"&\") {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject(\"InvalidChar\", \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject(\"InvalidXml\", \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n }\n if (xmlData[i] === \"<\") {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject(\"InvalidChar\", \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n if (!tagFound) {\n return getErrorObject(\"InvalidXml\", \"Start tag expected.\", 1);\n } else if (tags.length == 1) {\n return getErrorObject(\"InvalidTag\", \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject(\"InvalidXml\", \"Invalid '\" + JSON.stringify(tags.map((t) => t.tagName), null, 4).replace(/\\r?\\n/g, \"\") + \"' found.\", { line: 1, col: 1 });\n }\n return true;\n};\nfunction isWhiteSpace(char) {\n return char === \" \" || char === \"\t\" || char === \"\\n\" || char === \"\\r\";\n}\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == \"?\" || xmlData[i] == \" \") {\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === \"xml\") {\n return getErrorObject(\"InvalidXml\", \"XML declaration allowed only at the start of the document.\", getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == \"?\" && xmlData[i + 1] == \">\") {\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \"-\") {\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === \"-\" && xmlData[i + 1] === \"-\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n } else if (xmlData.length > i + 8 && xmlData[i + 1] === \"D\" && xmlData[i + 2] === \"O\" && xmlData[i + 3] === \"C\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"Y\" && xmlData[i + 6] === \"P\" && xmlData[i + 7] === \"E\") {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n angleBracketsCount++;\n } else if (xmlData[i] === \">\") {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (xmlData.length > i + 9 && xmlData[i + 1] === \"[\" && xmlData[i + 2] === \"C\" && xmlData[i + 3] === \"D\" && xmlData[i + 4] === \"A\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"A\" && xmlData[i + 7] === \"[\") {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === \"]\" && xmlData[i + 1] === \"]\" && xmlData[i + 2] === \">\") {\n i += 2;\n break;\n }\n }\n }\n return i;\n}\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\nfunction readAttributeStr(xmlData, i) {\n let attrStr = \"\";\n let startChar = \"\";\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === \"\") {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i])\n ;\n else {\n startChar = \"\";\n }\n } else if (xmlData[i] === \">\") {\n if (startChar === \"\") {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== \"\") {\n return false;\n }\n return {\n value: attrStr,\n index: i,\n tagClosed\n };\n}\nconst validAttrStrRegxp = new RegExp(`(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*(['\"])(([\\\\s\\\\S])*?)\\\\5)?`, \"g\");\nfunction validateAttributeString(attrStr, options) {\n const matches = util$2.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] !== void 0 && matches[i][4] === void 0) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === void 0 && !options.allowBooleanAttributes) {\n return getErrorObject(\"InvalidAttr\", \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n attrNames[attrName] = 1;\n } else {\n return getErrorObject(\"InvalidAttr\", \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n return true;\n}\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === \"x\") {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \";\")\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\nfunction validateAmpersand(xmlData, i) {\n i++;\n if (xmlData[i] === \";\")\n return -1;\n if (xmlData[i] === \"#\") {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === \";\")\n break;\n return -1;\n }\n return i;\n}\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col\n }\n };\n}\nfunction validateAttrName(attrName) {\n return util$2.isName(attrName);\n}\nfunction validateTagName(tagname) {\n return util$2.isName(tagname);\n}\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\nvar OptionsBuilder = {};\nconst defaultOptions$1 = {\n preserveOrder: false,\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n removeNSPrefix: false,\n // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false,\n //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true,\n //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val2) {\n return val2;\n },\n attributeValueProcessor: function(attrName, val2) {\n return val2;\n },\n stopNodes: [],\n //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs) {\n return tagName;\n }\n // skipEmptyListItem: false\n};\nconst buildOptions$1 = function(options) {\n return Object.assign({}, defaultOptions$1, options);\n};\nOptionsBuilder.buildOptions = buildOptions$1;\nOptionsBuilder.defaultOptions = defaultOptions$1;\nclass XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = [];\n this[\":@\"] = {};\n }\n add(key, val2) {\n if (key === \"__proto__\")\n key = \"#__proto__\";\n this.child.push({ [key]: val2 });\n }\n addChild(node) {\n if (node.tagname === \"__proto__\")\n node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n }\n}\nvar xmlNode$1 = XmlNode;\nconst util$1 = util$3;\nfunction readDocType$1(xmlData, i) {\n const entities = {};\n if (xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"C\" && xmlData[i + 5] === \"T\" && xmlData[i + 6] === \"Y\" && xmlData[i + 7] === \"P\" && xmlData[i + 8] === \"E\") {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\" && !comment) {\n if (hasBody && isEntity(xmlData, i)) {\n i += 7;\n [entityName, val, i] = readEntityExp(xmlData, i + 1);\n if (val.indexOf(\"&\") === -1)\n entities[validateEntityName(entityName)] = {\n regx: RegExp(`&${entityName};`, \"g\"),\n val\n };\n } else if (hasBody && isElement(xmlData, i))\n i += 8;\n else if (hasBody && isAttlist(xmlData, i))\n i += 8;\n else if (hasBody && isNotation(xmlData, i))\n i += 9;\n else if (isComment)\n comment = true;\n else\n throw new Error(\"Invalid DOCTYPE\");\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === \">\") {\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === \"[\") {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n}\nfunction readEntityExp(xmlData, i) {\n let entityName2 = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"'); i++) {\n entityName2 += xmlData[i];\n }\n entityName2 = entityName2.trim();\n if (entityName2.indexOf(\" \") !== -1)\n throw new Error(\"External entites are not supported\");\n const startChar = xmlData[i++];\n let val2 = \"\";\n for (; i < xmlData.length && xmlData[i] !== startChar; i++) {\n val2 += xmlData[i];\n }\n return [entityName2, val2, i];\n}\nfunction isComment(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"-\" && xmlData[i + 3] === \"-\")\n return true;\n return false;\n}\nfunction isEntity(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"N\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"I\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"Y\")\n return true;\n return false;\n}\nfunction isElement(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"E\" && xmlData[i + 3] === \"L\" && xmlData[i + 4] === \"E\" && xmlData[i + 5] === \"M\" && xmlData[i + 6] === \"E\" && xmlData[i + 7] === \"N\" && xmlData[i + 8] === \"T\")\n return true;\n return false;\n}\nfunction isAttlist(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"A\" && xmlData[i + 3] === \"T\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"L\" && xmlData[i + 6] === \"I\" && xmlData[i + 7] === \"S\" && xmlData[i + 8] === \"T\")\n return true;\n return false;\n}\nfunction isNotation(xmlData, i) {\n if (xmlData[i + 1] === \"!\" && xmlData[i + 2] === \"N\" && xmlData[i + 3] === \"O\" && xmlData[i + 4] === \"T\" && xmlData[i + 5] === \"A\" && xmlData[i + 6] === \"T\" && xmlData[i + 7] === \"I\" && xmlData[i + 8] === \"O\" && xmlData[i + 9] === \"N\")\n return true;\n return false;\n}\nfunction validateEntityName(name) {\n if (util$1.isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}\nvar DocTypeReader = readDocType$1;\nconst hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\nconst consider = {\n hex: true,\n leadingZeros: true,\n decimalPoint: \".\",\n eNotation: true\n //skipLike: /regex/\n};\nfunction toNumber$1(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\")\n return str;\n let trimmedStr = str.trim();\n if (options.skipLike !== void 0 && options.skipLike.test(trimmedStr))\n return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n } else {\n const match = numRegex.exec(trimmedStr);\n if (match) {\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]);\n const eNotation = match[4] || match[6];\n if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\")\n return str;\n else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\")\n return str;\n else {\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if (numStr.search(/[eE]/) !== -1) {\n if (options.eNotation)\n return num;\n else\n return str;\n } else if (eNotation) {\n if (options.eNotation)\n return num;\n else\n return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) {\n if (numStr === \"0\" && numTrimmedByZeros === \"\")\n return num;\n else if (numStr === numTrimmedByZeros)\n return num;\n else if (sign && numStr === \"-\" + numTrimmedByZeros)\n return num;\n else\n return str;\n }\n if (leadingZeros) {\n if (numTrimmedByZeros === numStr)\n return num;\n else if (sign + numTrimmedByZeros === numStr)\n return num;\n else\n return str;\n }\n if (trimmedStr === numStr)\n return num;\n else if (trimmedStr === sign + numStr)\n return num;\n return str;\n }\n } else {\n return str;\n }\n }\n}\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {\n numStr = numStr.replace(/0+$/, \"\");\n if (numStr === \".\")\n numStr = \"0\";\n else if (numStr[0] === \".\")\n numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\")\n numStr = numStr.substr(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\nvar strnum = toNumber$1;\nconst util = util$3;\nconst xmlNode = xmlNode$1;\nconst readDocType = DocTypeReader;\nconst toNumber = strnum;\nlet OrderedObjParser$1 = class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\": { regex: /&(apos|#39|#x27);/g, val: \"'\" },\n \"gt\": { regex: /&(gt|#62|#x3E);/g, val: \">\" },\n \"lt\": { regex: /&(lt|#60|#x3C);/g, val: \"<\" },\n \"quot\": { regex: /&(quot|#34|#x22);/g, val: '\"' }\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\": { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\": { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\": { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\": { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\": { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\": { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\": { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 10)) },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => String.fromCharCode(Number.parseInt(str, 16)) }\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue$1;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n};\nfunction addExternalEntities(externalEntities) {\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + ent + \";\", \"g\"),\n val: externalEntities[ent]\n };\n }\n}\nfunction parseTextData(val2, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val2 !== void 0) {\n if (this.options.trimValues && !dontTrim) {\n val2 = val2.trim();\n }\n if (val2.length > 0) {\n if (!escapeEntities)\n val2 = this.replaceEntitiesValue(val2);\n const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode);\n if (newval === null || newval === void 0) {\n return val2;\n } else if (typeof newval !== typeof val2 || newval !== val2) {\n return newval;\n } else if (this.options.trimValues) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n const trimmedVal = val2.trim();\n if (trimmedVal === val2) {\n return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n return val2;\n }\n }\n }\n }\n}\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(\":\");\n const prefix = tagname.charAt(0) === \"/\" ? \"/\" : \"\";\n if (tags[0] === \"xmlns\") {\n return \"\";\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\nconst attrsRegx = new RegExp(`([^\\\\s=]+)\\\\s*(=\\\\s*(['\"])([\\\\s\\\\S]*?)\\\\3)?`, \"gm\");\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === \"string\") {\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length;\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\")\n aName = \"#__proto__\";\n if (oldVal !== void 0) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if (newVal === null || newVal === void 0) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\");\n const xmlObj = new xmlNode(\"!xml\");\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for (let i = 0; i < xmlData.length; i++) {\n const ch = xmlData[i];\n if (ch === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\");\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n if (this.options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\") + 1);\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n }\n let propIndex = 0;\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n propIndex = jPath.lastIndexOf(\".\", jPath.lastIndexOf(\".\") - 1);\n this.tagsNodeStack.pop();\n } else {\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n currentNode = this.tagsNodeStack.pop();\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData)\n throw new Error(\"Pi Tag is not closed.\");\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if (this.options.ignoreDeclaration && tagData.tagName === \"?xml\" || this.options.ignorePiTags)\n ;\n else {\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n }\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\");\n if (this.options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n currentNode.add(this.options.commentPropName, [{ [this.options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (xmlData.substr(i + 1, 2) === \"!D\") {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if (val2 == void 0)\n val2 = \"\";\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val2);\n }\n i = closeIndex + 2;\n } else {\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n if (currentNode && textData) {\n if (currentNode.tagname !== \"!xml\") {\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n const lastTag = currentNode;\n if (lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1) {\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if (tagName !== xmlObj.tagname) {\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) {\n let tagContent = \"\";\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n } else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n i = result.closeIndex;\n } else {\n const result2 = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result2)\n throw new Error(`Unexpected end of ${rawTagName}`);\n i = result2.i;\n tagContent = result2.tagContent;\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if (tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n this.addChild(currentNode, childNode, jPath);\n } else {\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n } else {\n const childNode = new xmlNode(tagName);\n this.tagsNodeStack.push(currentNode);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n};\nfunction addChild(currentNode, childNode, jPath) {\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"]);\n if (result === false)\n ;\n else if (typeof result === \"string\") {\n childNode.tagname = result;\n currentNode.addChild(childNode);\n } else {\n currentNode.addChild(childNode);\n }\n}\nconst replaceEntitiesValue$1 = function(val2) {\n if (this.options.processEntities) {\n for (let entityName2 in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName2];\n val2 = val2.replace(entity.regx, entity.val);\n }\n for (let entityName2 in this.lastEntities) {\n const entity = this.lastEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n if (this.options.htmlEntities) {\n for (let entityName2 in this.htmlEntities) {\n const entity = this.htmlEntities[entityName2];\n val2 = val2.replace(entity.regex, entity.val);\n }\n }\n val2 = val2.replace(this.ampEntity.regex, this.ampEntity.val);\n }\n return val2;\n};\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) {\n if (isLeafNode === void 0)\n isLeafNode = Object.keys(currentNode.child).length === 0;\n textData = this.parseTextData(\n textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode\n );\n if (textData !== void 0 && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\nfunction isItStopNode(stopNodes, jPath, currentTagName) {\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if (allNodesExp === stopNodeExp || jPath === stopNodeExp)\n return true;\n }\n return false;\n}\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary)\n attrBoundary = \"\";\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if (closingChar[1]) {\n if (xmlData[index + 1] === closingChar[1]) {\n return {\n data: tagExp,\n index\n };\n }\n } else {\n return {\n data: tagExp,\n index\n };\n }\n } else if (ch === \"\t\") {\n ch = \" \";\n }\n tagExp += ch;\n }\n}\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg);\n } else {\n return closingIndex + str.length - 1;\n }\n}\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result)\n return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n return {\n tagName,\n tagExp,\n closeIndex,\n attrExpPresent,\n rawTagName\n };\n}\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n let openTagCount = 1;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n };\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === \"?\") {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === \"!--\") {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\");\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === \"![\") {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, \">\");\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }\n}\nfunction parseValue(val2, shouldParse, options) {\n if (shouldParse && typeof val2 === \"string\") {\n const newval = val2.trim();\n if (newval === \"true\")\n return true;\n else if (newval === \"false\")\n return false;\n else\n return toNumber(val2, options);\n } else {\n if (util.isExist(val2)) {\n return val2;\n } else {\n return \"\";\n }\n }\n}\nvar OrderedObjParser_1 = OrderedObjParser$1;\nvar node2json = {};\nfunction prettify$1(node, options) {\n return compress(node, options);\n}\nfunction compress(arr, options, jPath) {\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName$1(tagObj);\n let newJpath = \"\";\n if (jPath === void 0)\n newJpath = property;\n else\n newJpath = jPath + \".\" + property;\n if (property === options.textNodeName) {\n if (text === void 0)\n text = tagObj[property];\n else\n text += \"\" + tagObj[property];\n } else if (property === void 0) {\n continue;\n } else if (tagObj[property]) {\n let val2 = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val2, options);\n if (tagObj[\":@\"]) {\n assignAttributes(val2, tagObj[\":@\"], newJpath, options);\n } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== void 0 && !options.alwaysCreateTextNode) {\n val2 = val2[options.textNodeName];\n } else if (Object.keys(val2).length === 0) {\n if (options.alwaysCreateTextNode)\n val2[options.textNodeName] = \"\";\n else\n val2 = \"\";\n }\n if (compressedObj[property] !== void 0 && compressedObj.hasOwnProperty(property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val2);\n } else {\n if (options.isArray(property, newJpath, isLeaf)) {\n compressedObj[property] = [val2];\n } else {\n compressedObj[property] = val2;\n }\n }\n }\n }\n if (typeof text === \"string\") {\n if (text.length > 0)\n compressedObj[options.textNodeName] = text;\n } else if (text !== void 0)\n compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\nfunction propName$1(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\")\n return key;\n }\n}\nfunction assignAttributes(obj, attrMap, jpath, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length;\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n if (propCount === 0) {\n return true;\n }\n if (propCount === 1 && (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)) {\n return true;\n }\n return false;\n}\nnode2json.prettify = prettify$1;\nconst { buildOptions } = OptionsBuilder;\nconst OrderedObjParser2 = OrderedObjParser_1;\nconst { prettify } = node2json;\nconst validator$1 = validator$2;\nlet XMLParser$1 = class XMLParser {\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData === \"string\")\n ;\n else if (xmlData.toString) {\n xmlData = xmlData.toString();\n } else {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\");\n }\n if (validationOption) {\n if (validationOption === true)\n validationOption = {};\n const result = validator$1.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`);\n }\n }\n const orderedObjParser = new OrderedObjParser2(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === void 0)\n return orderedResult;\n else\n return prettify(orderedResult, this.options);\n }\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\");\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\");\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n};\nvar XMLParser_1 = XMLParser$1;\nconst EOL = \"\\n\";\nfunction toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === void 0)\n continue;\n let newJPath = \"\";\n if (jPath.length === 0)\n newJPath = tagName;\n else\n newJPath = `${jPath}.${tagName}`;\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += `<![CDATA[${tagObj[tagName][0][options.textNodeName]}]]>`;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + `<!--${tagObj[tagName][0][options.textNodeName]}-->`;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr2 = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\";\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr2}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode)\n xmlStr += tagStart + \">\";\n else\n xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}</${tagName}>`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"</\"))) {\n xmlStr += indentation + options.indentBy + tagValue + indentation;\n } else {\n xmlStr += tagValue;\n }\n xmlStr += `</${tagName}>`;\n }\n isPreviousElementTag = true;\n }\n return xmlStr;\n}\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!obj.hasOwnProperty(key))\n continue;\n if (key !== \":@\")\n return key;\n }\n}\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!attrMap.hasOwnProperty(attr))\n continue;\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName)\n return true;\n }\n return false;\n}\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nvar orderedJs2Xml = toXml;\nconst buildFromOrderedJs = orderedJs2Xml;\nconst defaultOptions = {\n attributeNamePrefix: \"@_\",\n attributesGroupName: false,\n textNodeName: \"#text\",\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: \" \",\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&amp;\" },\n //it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \"&gt;\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"&lt;\" },\n { regex: new RegExp(\"'\", \"g\"), val: \"&apos;\" },\n { regex: new RegExp('\"', \"g\"), val: \"&quot;\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function() {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n this.processTextOrObjNode = processTextOrObjNode;\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = \">\\n\";\n this.newLine = \"\\n\";\n } else {\n this.indentate = function() {\n return \"\";\n };\n this.tagEndChar = \">\";\n this.newLine = \"\";\n }\n}\nBuilder.prototype.build = function(jObj) {\n if (this.options.preserveOrder) {\n return buildFromOrderedJs(jObj, this.options);\n } else {\n if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n jObj = {\n [this.options.arrayNodeName]: jObj\n };\n }\n return this.j2x(jObj, 0).val;\n }\n};\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = \"\";\n let val2 = \"\";\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key))\n continue;\n if (typeof jObj[key] === \"undefined\") {\n if (this.isAttribute(key)) {\n val2 += \"\";\n }\n } else if (jObj[key] === null) {\n if (this.isAttribute(key)) {\n val2 += \"\";\n } else if (key[0] === \"?\") {\n val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n } else {\n val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n }\n } else if (jObj[key] instanceof Date) {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n } else if (typeof jObj[key] !== \"object\") {\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, \"\" + jObj[key]);\n } else {\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, \"\" + jObj[key]);\n val2 += this.replaceEntitiesValue(newval);\n } else {\n val2 += this.buildTextValNode(jObj[key], key, \"\", level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === \"undefined\")\n ;\n else if (item === null) {\n if (key[0] === \"?\")\n val2 += this.indentate(level) + \"<\" + key + \"?\" + this.tagEndChar;\n else\n val2 += this.indentate(level) + \"<\" + key + \"/\" + this.tagEndChar;\n } else if (typeof item === \"object\") {\n if (this.options.oneListGroup) {\n listTagVal += this.j2x(item, level + 1).val;\n } else {\n listTagVal += this.processTextOrObjNode(item, key, level);\n }\n } else {\n listTagVal += this.buildTextValNode(item, key, \"\", level);\n }\n }\n if (this.options.oneListGroup) {\n listTagVal = this.buildObjectNode(listTagVal, key, \"\", level);\n }\n val2 += listTagVal;\n } else {\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], \"\" + jObj[key][Ks[j]]);\n }\n } else {\n val2 += this.processTextOrObjNode(jObj[key], key, level);\n }\n }\n }\n return { attrStr, val: val2 };\n};\nBuilder.prototype.buildAttrPairStr = function(attrName, val2) {\n val2 = this.options.attributeValueProcessor(attrName, \"\" + val2);\n val2 = this.replaceEntitiesValue(val2);\n if (this.options.suppressBooleanAttributes && val2 === \"true\") {\n return \" \" + attrName;\n } else\n return \" \" + attrName + '=\"' + val2 + '\"';\n};\nfunction processTextOrObjNode(object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== void 0 && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\nBuilder.prototype.buildObjectNode = function(val2, key, attrStr, level) {\n if (val2 === \"\") {\n if (key[0] === \"?\")\n return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n else {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n let tagEndExp = \"</\" + key + this.tagEndChar;\n let piClosingChar = \"\";\n if (key[0] === \"?\") {\n piClosingChar = \"?\";\n tagEndExp = \"\";\n }\n if ((attrStr || attrStr === \"\") && val2.indexOf(\"<\") === -1) {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + \">\" + val2 + tagEndExp;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + piClosingChar + this.tagEndChar + val2 + this.indentate(level) + tagEndExp;\n }\n }\n};\nBuilder.prototype.closeTag = function(key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) {\n if (!this.options.suppressUnpairedNode)\n closeTag = \"/\";\n } else if (this.options.suppressEmptyNode) {\n closeTag = \"/\";\n } else {\n closeTag = `></${key}`;\n }\n return closeTag;\n};\nBuilder.prototype.buildTextValNode = function(val2, key, attrStr, level) {\n if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n return this.indentate(level) + `<![CDATA[${val2}]]>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `<!--${val2}-->` + this.newLine;\n } else if (key[0] === \"?\") {\n return this.indentate(level) + \"<\" + key + attrStr + \"?\" + this.tagEndChar;\n } else {\n let textValue = this.options.tagValueProcessor(key, val2);\n textValue = this.replaceEntitiesValue(textValue);\n if (textValue === \"\") {\n return this.indentate(level) + \"<\" + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + \"<\" + key + attrStr + \">\" + textValue + \"</\" + key + this.tagEndChar;\n }\n }\n};\nBuilder.prototype.replaceEntitiesValue = function(textValue) {\n if (textValue && textValue.length > 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n};\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\nfunction isAttribute(name) {\n if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}\nvar json2xml = Builder;\nconst validator = validator$2;\nconst XMLParser2 = XMLParser_1;\nconst XMLBuilder = json2xml;\nvar fxp = {\n XMLParser: XMLParser2,\n XMLValidator: validator,\n XMLBuilder\n};\nfunction isSvg(string) {\n if (typeof string !== \"string\") {\n throw new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n }\n string = string.trim();\n if (string.length === 0) {\n return false;\n }\n if (fxp.XMLValidator.validate(string) !== true) {\n return false;\n }\n let jsonObject;\n const parser = new fxp.XMLParser();\n try {\n jsonObject = parser.parse(string);\n } catch {\n return false;\n }\n if (!jsonObject) {\n return false;\n }\n if (!Object.keys(jsonObject).some((x) => x.toLowerCase() === \"svg\")) {\n return false;\n }\n return true;\n}\n/**\n * @copyright Copyright (c) 2022 John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nclass View {\n _view;\n constructor(view) {\n isValidView(view);\n this._view = view;\n }\n get id() {\n return this._view.id;\n }\n get name() {\n return this._view.name;\n }\n get caption() {\n return this._view.caption;\n }\n get emptyTitle() {\n return this._view.emptyTitle;\n }\n get emptyCaption() {\n return this._view.emptyCaption;\n }\n get getContents() {\n return this._view.getContents;\n }\n get icon() {\n return this._view.icon;\n }\n set icon(icon) {\n this._view.icon = icon;\n }\n get order() {\n return this._view.order;\n }\n set order(order) {\n this._view.order = order;\n }\n get params() {\n return this._view.params;\n }\n set params(params) {\n this._view.params = params;\n }\n get columns() {\n return this._view.columns;\n }\n get emptyView() {\n return this._view.emptyView;\n }\n get parent() {\n return this._view.parent;\n }\n get sticky() {\n return this._view.sticky;\n }\n get expanded() {\n return this._view.expanded;\n }\n set expanded(expanded) {\n this._view.expanded = expanded;\n }\n get defaultSortKey() {\n return this._view.defaultSortKey;\n }\n}\nconst isValidView = function(view) {\n if (!view.id || typeof view.id !== \"string\") {\n throw new Error(\"View id is required and must be a string\");\n }\n if (!view.name || typeof view.name !== \"string\") {\n throw new Error(\"View name is required and must be a string\");\n }\n if (view.columns && view.columns.length > 0 && (!view.caption || typeof view.caption !== \"string\")) {\n throw new Error(\"View caption is required for top-level views and must be a string\");\n }\n if (!view.getContents || typeof view.getContents !== \"function\") {\n throw new Error(\"View getContents is required and must be a function\");\n }\n if (!view.icon || typeof view.icon !== \"string\" || !isSvg(view.icon)) {\n throw new Error(\"View icon is required and must be a valid svg string\");\n }\n if (!(\"order\" in view) || typeof view.order !== \"number\") {\n throw new Error(\"View order is required and must be a number\");\n }\n if (view.columns) {\n view.columns.forEach((column) => {\n if (!(column instanceof Column)) {\n throw new Error(\"View columns must be an array of Column. Invalid column found\");\n }\n });\n }\n if (view.emptyView && typeof view.emptyView !== \"function\") {\n throw new Error(\"View emptyView must be a function\");\n }\n if (view.parent && typeof view.parent !== \"string\") {\n throw new Error(\"View parent must be a string\");\n }\n if (\"sticky\" in view && typeof view.sticky !== \"boolean\") {\n throw new Error(\"View sticky must be a boolean\");\n }\n if (\"expanded\" in view && typeof view.expanded !== \"boolean\") {\n throw new Error(\"View expanded must be a boolean\");\n }\n if (view.defaultSortKey && typeof view.defaultSortKey !== \"string\") {\n throw new Error(\"View defaultSortKey must be a string\");\n }\n return true;\n};\n/**\n * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\nconst addNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.registerEntry(entry);\n};\nconst removeNewFileMenuEntry = function(entry) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.unregisterEntry(entry);\n};\nconst getNewFileMenuEntries = function(context) {\n const newFileMenu = getNewFileMenu();\n return newFileMenu.getEntries(context).sort((a, b) => {\n if (a.order !== void 0 && b.order !== void 0 && a.order !== b.order) {\n return a.order - b.order;\n }\n return a.displayName.localeCompare(b.displayName, void 0, { numeric: true, sensitivity: \"base\" });\n });\n};\nexport {\n Column,\n DefaultType,\n File,\n FileAction,\n FileType,\n FilesSortingMode,\n Folder,\n Header,\n Navigation,\n NewMenuEntryCategory,\n Node,\n NodeStatus,\n Permission,\n View,\n addNewFileMenuEntry,\n davGetClient,\n davGetDefaultPropfind,\n davGetFavoritesReport,\n davGetRecentSearch,\n davParsePermissions,\n davRemoteURL,\n davResultToNode,\n davRootPath,\n defaultDavNamespaces,\n defaultDavProperties,\n formatFileSize,\n getDavNameSpaces,\n getDavProperties,\n getFavoriteNodes,\n getFileActions,\n getFileListHeaders,\n getNavigation,\n getNewFileMenuEntries,\n isFilenameValid,\n orderBy,\n parseFileSize,\n registerDavProperty,\n registerFileAction,\n registerFileListHeaders,\n removeNewFileMenuEntry,\n sortNodes\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \"-\" + chunkId + \".js?v=\" + {\"1110\":\"2909496e7e35d6258214\",\"8902\":\"bb2f9be8a039f8db7e58\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2250;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2250: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(62335)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","encodeFilePath","path","pathSections","startsWith","concat","split","relativePath","forEach","section","encodeURIComponent","remote","generateRemoteUrl","client","createClient","setHeaders","token","requesttoken","onRequestTokenUpdate","getRequestToken","getLoggerBuilder","setApp","detectUser","build","name","emits","props","title","type","String","fillColor","default","size","Number","_vm","this","_c","_self","_b","staticClass","attrs","on","$event","$emit","$attrs","_v","_s","_e","ATOMIC_PERMISSIONS","hasPermissions","initialPermissionSet","permissionsToCheck","components","NcActionLink","NcActionButton","NcListItem","BackupRestore","Download","FileCompare","Pencil","Delete","ImageOffOutline","directives","tooltip","Tooltip","filters","humanReadableSize","bytes","OC","Util","humanFileSize","humanDateFromNow","timestamp","moment","fromNow","version","Object","required","fileInfo","isCurrent","Boolean","isFirstVersion","loadPreview","canView","canCompare","data","previewLoaded","previewErrored","capabilities","loadState","files","version_labeling","version_deletion","computed","versionLabel","_this$version$label","label","t","downloadURL","getRootUrl","joinPaths","url","formattedDate","mtime","format","enableLabeling","enableDeletion","hasDeletePermissions","permissions","Permission","DELETE","hasUpdatePermissions","UPDATE","isDownloadable","READ","mountType","downloadAttribute","shareAttributes","find","attribute","scope","key","undefined","enabled","methods","labelUpdate","restoreVersion","deleteVersion","click","window","location","compareVersion","Error","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","scopedSlots","_u","fn","hasPreview","previewUrl","proxy","_f","defineComponent","sections","Array","containerElement","HTMLElement","useWindow","headerHeight","renderDistance","bottomBufferRatio","scrollToKey","scrollPosition","containerHeight","rowsContainerHeight","resizeObserver","visibleSections","logger","debug","containerTop","containerBottom","currentRowTop","currentRowBottom","map","rows","reduce","visibleRows","row","height","distance","filter","length","visibleItems","flatMap","_ref","_ref2","items","rowIdToKeyMap","_rowIdToKeyMap","item","id","usedTokens","_ref3","unusedTokens","values","includes","_ref4","_unusedTokens$pop","pop","Math","random","toString","substr","finalMapping","_ref5","totalHeight","sectionHeight","paddingTop","sectionKey","rowsContainerStyle","isNearBottom","buffer","container","$refs","watch","value","currentRowTopDistanceFromTop","scrollTo","top","behavior","beforeCreate","mounted","ResizeObserver","entries","entry","cr","contentRect","target","classList","contains","addEventListener","updateContainerSize","passive","innerHeight","observe","rowsContainer","updateScrollPosition","beforeDestroy","_this$resizeObserver","removeEventListener","disconnect","_this$_onScrollHandle","_onScrollHandle","requestAnimationFrame","scrollY","scrollTop","_setupProxy","ref","style","_t","NcButton","NcTextField","Check","innerVersionLabel","$nextTick","labelInput","$el","getElementsByTagName","focus","setVersionLabel","translate","Version","VirtualScrolling","VersionLabelForm","preventDefault","trim","NcLoadingIcon","NcModal","mixins","isMobile","isActive","versions","loading","showVersionLabelForm","orderedVersions","sort","a","b","initialVersionMtime","min","viewerFileInfo","davPermissions","mime","mimetype","basename","filename","fileid","_window$OCA$Viewer","OCA","Viewer","mimetypesCompare","subscribe","fetchVersions","beforeUnmount","unsubscribe","update","resetState","setIsActive","async","_getCurrentUser","getCurrentUser","uid","getDirectoryContents","details","lastmod","unix","generateUrl","fileId","fileEtag","etag","file","fileVersion","getetag","source","formatVersion","exception","error","handleRestore","oldFileInfo","restoreStartedEventState","emit","_getCurrentUser2","_getCurrentUser3","moveFile","showSuccess","showError","handleLabelUpdateRequest","editedVersion","handleLabelUpdate","newLabel","oldLabel","customRequest","method","handleDelete","index","indexOf","splice","deleteFile","push","$set","openVersion","open","_getCurrentUser$uid","v","enableSidebar","compare","_l","slot","Vue","prototype","n","use","VTooltip","View","extend","VersionTab","TabInstance","_OCA$Files","Files","Sidebar","registerTab","Tab","iconSvg","mount","el","context","$destroy","parent","$mount","destroy","_fileInfo$isDirectory","isDirectory","___CSS_LOADER_EXPORT___","module","user","setUid","Permission2","defaultDavProperties","defaultDavNamespaces","d","nc","oc","ocs","getDavProperties","_nc_dav_properties","prop","join","getDavNameSpaces","_nc_dav_namespaces","keys","ns","davGetDefaultPropfind","davGetRecentSearch","lastModified","FileType","FileType2","isDavRessource","davService","match","validateData","URL","e","Date","crtime","NONE","ALL","owner","attributes","root","service","status","NodeStatus","NodeStatus2","Node","_data","_attributes","_knownDavService","readonlyAttributes","getOwnPropertyDescriptors","get","handler","set","updateMtime","Reflect","deleteProperty","receiver","warn","constructor","Proxy","replace","encodedSource","origin","slice","extension","extname","dirname","firstMatch","pathname","move","destination","rename","basename2","TypeError","File","Folder","super","davRootPath","davRemoteURL","davGetClient","remoteURL","headers","patch","headers2","fetch","getFavoriteNodes","davClient","davRoot","controller","AbortController","CancelablePromise","resolve","reject","onCancel","abort","signal","includeSelf","node","result","davResultToNode","filesRoot","userId","isPublic","document","querySelector","permString","CREATE","SHARE","davParsePermissions","nodeData","parse","parseInt","getcontentlength","_oc_config","blacklist_files_regex","RegExp","humanList","humanListBinary","formatFileSize","skipSmallSizes","binaryPrefixes","base1000","order","floor","log","readableFormat","relativeSize","pow","toFixed","parseFloat","toLocaleString","util$3","exports","nameStartChar","nameRegexp","regexName","isExist","isEmptyObject","obj","merge","arrayMode","len","i","getValue","isName","string","exec","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","OptionsBuilder","defaultOptions$1","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val2","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","buildOptions","assign","defaultOptions","node2json","compress","arr","text","compressedObj","tagObj","property","propName$1","newJpath","isLeaf","isLeafTag","assignAttributes","hasOwnProperty","attrMap","jpath","atrrName","propCount","prettify","arrToStr","indentation","xmlStr","isPreviousElementTag","propName","newJPath","tagText","isStopNode","replaceEntitiesValue","attStr2","attr_to_str","tempInd","piTextNodeName","newIdentation","indentBy","tagStart","tagValue","suppressUnpairedNode","suppressEmptyNode","endsWith","attrStr","attr","attrVal","suppressBooleanAttributes","lastIndexOf","textValue","entities","entity","val","buildFromOrderedJs","jArray","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","j2x","buildTextValNode","buildObjectNode","repeat","jObj","arrayNodeName","call","buildAttrPairStr","newval","arrLen","listTagVal","j","Ks","L","closeTag","tagEndExp","piClosingChar","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","m","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","every","r","getter","__esModule","definition","o","defineProperty","enumerable","f","chunkId","Promise","all","promises","u","g","globalThis","Function","l","done","script","needAttach","scripts","s","getAttribute","createElement","charset","timeout","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","head","appendChild","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","test","p","baseURI","self","href","installedChunks","installedChunkData","promise","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}