SPDXVersion: SPDX-2.1 DataLicense: CC0-1.0 SPDXID: SPDXRef-DOCUMENT DocumentName: project DocumentNamespace: http://spdx.org/spdxdocs/spdx-v2.1-b5231f61-6478-480c-b889-281d149ff2a7 Creator: Person: Anonymous () Creator: Organization: Anonymous () Creator: Tool: reuse-6.1.0 Created: 2026-07-18T20:35:57Z CreatorComment: This document was created automatically using available reuse information consistent with REUSE. Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2f12121b1f712fba81f8a018d3dbdf4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b80370b613ecacd338cf9031f8f3147f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e428a070baa59703cb334d6b1b2c72f6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ad80fa918b303166c7cb1798a2c6c6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62ee00f1b137e1c28823269bcb8deada Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8364e97c6fec47d2cd44ab1bfa5220ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-301ca705cd31b4b5b65cc8d208481ebb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83ecee466dc1bfcce0c3a8ab6d4dbc6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d452b34267d6864b776965b208a5cf1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9f2c6bebb9a555ad4d50f87f88201674 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-688a9cf9061f0e4f5dfe6826f1c1e69d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d125dfa950950b6670fe7f1a52bbd2a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b83871177dd2d7a0b98430bb18f9ca15 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b473dc6e3272e87486d2b4b1371b28e5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-81b424050c42cd6e5bb862c24071ef14 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c81b81f2e4813939ce5bf23acdaf358c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c9deedb210298e3389f9912a08a6a8a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1284edff68563e06410700a654e3234c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6f9bf711cd1cf7418e52ea297cc8554c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-845ccd3d19de38fb29be6622010fd3a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d16263d1658339b57c5eed47a16fb230 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9cbe38f0b6ac52df57c54ddec0af2d5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-977c188d338bed2a4ae06fb9ff80317e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61d46aa68a5d69937783c7002f166b87 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-249f157d34282baf58b15ecb2ea40dd0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d56659aa4232e22cac7475ae1dc906cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37a70b57ebbd6db676ce0b58685cbcec Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-08e3cc47e4bcc61be36ed8006447af58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c6367b42327474f609d53e71c9398970 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-762d5e66ffa1d926fc13121837500c3e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7dcf2064a8f70f76ccab0ac67b4b0d16 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93d096f9e65a10d7112e416a3dd34a89 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b51ef9717ff25116711e13031289e6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-63b39cdba655664313c6aa84038fe70a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-04561ef8359abf611aef318f7a309687 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c9891148d1352eb7da43efc1d515df66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f753c555c8a90bbff873de263632f8af Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16359731e0d4d0d0620d7b0e10306b27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0065015f63f1d9836daa3e3a36aeca00 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7a342ed297c82f241f90760c266841e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc5706b4b5a3902aa8d92efda1f67b65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fdc0ed7d120a94fb99f1af66422a3330 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16d11402699eae98929dea964519eb7c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4b443ea07ced3e88445bb0aad9e7d819 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-18161bb7652ea217635773f2c2b23f3c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-769d4c7cec613d086cedc3fc0abafbaa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6c88d2973342f9622afa057842106fde Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bbc76d616dfb26c617b7e26b6fa50047 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-778c1d95712d38dc15f621a6d4586903 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-13b5f5441cd979cb46e703d2ab09357d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36c73247bf9ae9de297f4d6bf16e1ea8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb4b085d197dca82a222220c8d46dcac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3a3d7a7ed970d05e0620ef5dea7ac71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-52532090a2d1c26ca551f2fd528ff747 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-64bb2dfcf5c3644ce740526fd8365332 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2d026a0b57320f4c4ec7c4d27567784b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-94678b5c2acf5ec3e5715a62422e0c81 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90f4d371215cd28d01c0a45d5b17c66b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-503199a6795c21b38164cdaa097bc3f7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-750502d199879b9e14405ee3b63c6797 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-937ea743b8a54111f6d983e2e8011eb3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c3e8d3debd5ec2733fe172aa1efeba50 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a258444d201e47926b962acde4b867f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aba2643863472df193d53b4907b88cb2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e8753000b00a1bb681b22b3365fe9b5f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cfe9e55a037f08897c5c83b0dad05ae5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f677b86f771b5e606c38b6269e1197b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbce26367e5d847d54fae7443e40891c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9352c52d93a1af407480b9abed5351b0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6aebf2a5c57612bf22aa019076ac53c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-30198b72182e9b41b000c4d54300796a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b2f0fe831a8f81048889c0d75900f861 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1134b44082ac5eb5b9e81b6beefbc17d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25a7bf455fbc03b9a93508224b70c37f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f73dae6fb3046eda3d336341fdc046d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2cccd8aa1b1b6e6c94ba244fa1b1bb8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f460493be4fc6348bfa68e952e34bb7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e58e06121abd03acaa7d5b58737f3ab3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1183d2812b0580523453641914f0caf9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2cfa8f3c939b0da89ae5b93814049192 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d546b82062227848a8b4b2aac6d99760 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5f49adc04387d446c267b988190d522 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2b0f5043df0794ac233970b1ce7dc6f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-47b1da7343026e779b4832e0a65e00ca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-39e365234c05f411caa2ef1ed21b9437 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8ea23b611d508213581e75448b5e935c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16d1ad255434a109571a7770b2305c60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-956905975682519e1f8fd865ddcdff01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2318a9aa1fbaebda1d6c362311ed49d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e30e6309c3522dd8c266e9681499965d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-86d621d5f07ce9fa29b4e6f33005be5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8feeb1402f4c0ef5f2f943ffca6a8e43 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f4b354319dde9917c156db6ab0ae686 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b9cdfddd5be108a7b727f6124d19368 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f4f9648261bb485753acb8fb84b4d114 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a100ecebdab8996a3464b741554384f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7569553cc36f4de3a6df54bf1e1ad8f8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1de4bbcff85b693c6ec413bfee1b9d9a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5ea343327e3543becaf608842bce51b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cfa72118432396856106aa225c417a3e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-04409d9b414820c54e4fe03591fb5c6f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8e89720efe725e1efd4dcf4f9cd85266 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24f78f402754280ace3a02fb19671d65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36eea0e46f1194d70744e7d55dd89296 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d837f00bdb1110dd54065aec537bb95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0bee1c79512834885c788a41a47c9c97 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1da326df523cc927960e094f13a39dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2a2065250a4c4cc595b8f38e651d9c0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-157b277c4c5eddd9a917c028b2723f66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e668558b6996d72e5068dad3452f890e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-507ce7954e395df4daf516b87a7aa1f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-025dba846a4f8bacd82242eb84f0c0d1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9f79f6f8f1a0af4886b08654c4b56057 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d3c1d81f29e2c387123663b7230f5aed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f21f938b2b8f41304014773975d0d7c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9576ecc903d4e5b287d5dae5c525868a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65d40b5ea9094b98a30803bc32a82dc8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-686f387d949c90f757f60696c90287fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f231db286a236b93b292e9df026bb3aa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-66149bcc08451366c200b59af6ff027d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3c3b054071b67ce3de0c2116783b830 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f952a6faa185257f70eb6814b95b243 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8fa89cdc8b90aebf124e7972686ddc32 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b8e905f674331576fd02093f1bc8af3b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-75e25be6512be15ec5eb4d8a1b5fe351 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-101b12eef88cf5068cb4ecc8b6c7ef3a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b32e832a2d0427619d6739b72a69f035 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b75684c34b22adbee20fc9334743f330 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0cdbc25691f44b923954028a0ff6004e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e5193f2c4ff547b903b766b0a2fcc6e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25c735207739c4fd621b032d4280de17 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-43ac77279bd1f1e79157a50c62f6ccaf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2e274d394124ab9d5ce17f316897f7b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1ebb79ca500550c325c252ce4c2d54eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d4887381a56cf947f49781a0456a2b85 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aad754be4a3eb5c933277639d09aa553 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-44c3c9cd5068134015dfcff46cd202b5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-70351a7f4eda39a9299aee7cefe33358 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ffb91683f6250562e5ce86799acde384 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d9dcb78449354913ea15692d3b2edfb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76186ee3b7dde25fa05cb5c97b13c594 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e980a502ee6c8a33d5272fc05b88926 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f84e00cd91fdef7d4fccd9a30f8c9916 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4add210b6e7a667defc2f0f8e77664f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-059fcb83081a6755dfd80c7c6b69b788 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e3d84b613f5565fc52d7135437616f7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a2c90db80a78b8883253cc974b9cbd5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d3c55e65d0aec642864a53861c66357 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-749a132c7c5d6c130c641905c2a47e69 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1109f7fb268defb3a74c797dc46dd848 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d426089b78da1a1ad12019e8816101b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-692cc2f14caf7af5a8cacf05acfcf591 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ceab08d07ce0e4d61474ee2bf7b39c34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55a18df123bc13cb9fe8ee7a2b18915d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a7eb8219fb4cb1c615f67767d04f9fa9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f3ae3bfc9785fe927c16fa1308323c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-baf7bbb0f9072ce6f03a344ec51af178 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2ea9c12d96ae7dd1359f6d2ed742f26 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96be17d7381c0138c61ad4373cfdb25f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-32e9f938be0ebd28edc8dd2cf324fdfc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e5be12aef5b9c2ab242fe9fc92182d1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1106b2130a2dcbe4bac1a204166be22f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3d27037d7d49f14b0b3acaa6d2bd21c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9031ceee6a4912ea9edbc7536fe76913 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b5f3e458ea6827114d30a7af0fb048e1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7705c33ae9c3244c4fe207fa43c52e05 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9fa98fccd09fe32f7ecce555b4f793c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83e935714699ab1f8d3ac9bea96d8ad8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-138d5c61609c50b034d68476d2686d81 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e251748d2828247b2d143e53d7faa53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a43ee72c6b952f74f7d71b9e89b9eaad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2bf9344eaf9f002461260c9ded19d8bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b74ef137811053aa09038bf9ab274162 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad3415bec61d6d02e990cbd542faa6c6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-051a923af402cad662ae19f79529d1e4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-68d42951467aac7154e3bcdbae58c0c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-67987cb3f8b46bce72ad9220343b21d1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-880ec8a8067e4ea0f252a31bd65a95e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a597673bc14702faed5095bc2c982fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c6546fa37050893ea49607a227241528 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-71c72923fbd6b61e47ec702e96b121d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0541d8d8ca844dfe5f28a5104897aadc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f3b324079c6c1c78bae05892fa5c6e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06df24b74b1652ecf6a2e27c719f2ff7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8915ca8b3544c3e5a21a1265200922c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-22fe71c29a1782d8a1561cc0d8763fea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dabe71045661d859d25d54f8f9253196 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e6d7c418891a2a5890871cb28f6d1b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7421b0ee394c6406b816d22a6461408 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3c6475f40aef7b2888b457fb5625ee7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a5362a1a8046d58901ed2bfe16a73c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec4304797c8f937dfd4c50c83749bd6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-00764fe63dd52124922ec6cef5aee849 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef7240b261364b09497878bcb93788ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c2450e27188c5285a6efa66fbf98a867 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7844d31ab132f5e29bbd9f6180cfc746 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e427bd60bbc9766d971078c8618589e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a79404a5ef558f203645ff78b231a90d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b7cd7ebce169d2e7b6c493e89f68a71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b26a3f5797b6cf8780dc6af66dcef290 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-77387e37501368ac805241782423cef2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03968146b3f0199ea45b635b8d06d59a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-95d70a909bc52eadc1bf4b7e6c90a5ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eeb001f184b290799545a1a026b46b16 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-94a5c164cfaf3d0f90d8c86ac68e6598 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a376a8012deedba0c443b522353f2db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-480e7b126d37bf09524ca522a59e1f7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15e85f8d8841809c2d0efdfc9d2c77d2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59d98f1ebbf6b16c1d7e783aabff8d98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c6f025b38a7fbdc3d6553046b090c313 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14b3987aae0eba3753d34e94b71efd7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ddc5ea31bdbecbdfe2e3ad3346cbc00f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7244bfaa20c11a7a8232c1da8af7da63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fbcb10c9dbb7491161acad7dead41c59 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-894ac026c70c23773b736fe125ee34f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7c5014726eff0ebf7b82d153a867e4ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5fe09d67db21d728dfd646ce8fd03de3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2c91654ea18080f737a08e5e672acc4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-68e19dcba01d6fd840219d12e4486113 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9e64cb9fecbc490c0b024122613891f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8561a5e7fdc491f0a1e3abb45ad6626c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2bac3047ff54c16e1c6a689a2b10ad22 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a26cbd05cf21bf2f7001d762d888f327 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6388576291af3611a2525851f7ddc52 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-514c6166ed75827b9823b60059f7b57e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-390220069460f92559e048fea9a9ad34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-717bc38222e729ab79ec14fd4a71944b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b56e9a221ca9c6ec18ed6412779cb850 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b7b48ab80f8921aaac3ccbd2569cac8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0f03aac89ded934998e6c2d39fd6eda6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4bdf0011aa438ca7a5096b0e6670c431 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19ca6e9e8c91e7dc4d6f77436637302e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c711bc61d97394346dc634eae3f882ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-70718e4f37930e2512cf36421f8d09f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-95fae741e4128503029d47f4181d7b37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e19683f3cca2841fce00ded0f41dacf4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a6898f199395f70a00d4a8d4e2c19b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4068f0356d58cf72cd1888d306a31df6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aabfbd70ee999337dd13acca6c97b963 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93342fdf005c1fa5d8cfbcca8f4c2563 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b9761aa4b1ad689cfbb19fe0e46a8e63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6ec01debce38c867c330762b86cce1c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-992f01775fea64bba2682b4ae928ffc6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-43f9e420e4f9ffe8f33ade8ecfb2cc17 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3b4b1ef964e11846d0db025afb5fdedb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0bb95cec3700b3452f8bc80721195ac5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-672385985ea945dd6d85f3c5114c79bb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9c7187ff44728ee813fedaae21b4b95c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b9a529639ef1b24911fa77313653caf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-05ac0c2dc441c73b59f800cc018ef359 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ec61ff388223bd78d1621ec9ef58fcf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-803ea67c57a80a10de4d54ab0b8d6f1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8a23b21194dbbb92a946b27b3559a58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5260f30e8fb4624b8710914c007bf0ca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62844547770f8e56864f6f44ff0f96af Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-098bb0ae2e7d87aede9138eaff1d86fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ddf2f8008b006aeb5abd4b7c5c790068 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-837afb4db0ea4f652408b223d792c626 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59ff2a7b7dad63f2b98bcd8ffa1d610c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c03016f2f0b4fd73cd908e2d5b233b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-630421d59dd52387a58f196cf72e873a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83baa23dd1a7039c6df4f8afa32d2adc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5820b605ddbf1aa0ee1064c5b1cd6d47 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1018f07c87c80ad57b970f020790b794 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4fe05982e37d26e8eeeb10527113f3cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f4d150d98a453526b6d9bf5799675496 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8356d54428c6f4f32236bc0c7455e4ba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1beb32b8df190cfd78c9676f4a3638b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-062c78f8a6a9301962490eb7fde3637b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-34406415b192e3d38c866d693887d808 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d0bc90837335e830f66a511b4880964e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d1d937f813689edce2a5225a0481c950 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1094112cb8fe9ca7bb823703d41d38c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c9ca5690cfbb3b4a4113ef80d24b1274 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d60d35622cd2b792d36a771f2c0db281 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50f3f59f80b46efa73d108513c2db8c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85e67d0f8d493717d42ea43f4aabc3bf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-de38a8d031e46a70fff6a11bb3be96e4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f6ef0b37d82abe0590928ef217051226 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bf918b9af323f5b61e1cf09248502df3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33010d241c929a9e3b27b1e53e2df224 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0cc2cf2de8bc436fd89a742fbceb25f3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d91e4160f21c05078bd16c13d0b8b1f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2d0eccab2440584dc702eca63aebbff8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-564a223a527d3f857be20e047a3ebd94 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-17e056f3358af4858f520927503ae83a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-53fba6752c3ce56444e24d4e11e75c97 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5521659ffb0ecd0c7c7b0d00fd5cab6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-515583f2a86a46fd09fa7ebef7787ba3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8710d57a3030c1ee9777d9f887055d0c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3bf5db2e509840987ed54965e8a7695a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-57f98781e70f41368e4b29021049e6c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e737d760a40b5317aac31b62664a2364 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f97d2a669900989efc6454a807679907 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b9ad6cd66fff645a852cdc86fc85979b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2d939304035c82b18dd21b0a484b103e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0a884d43e726ab1aac99e06d7074ca6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c2f82173d18b061e531b22dda1490da2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bf50086bd9c2d20d571dc5f6bce072d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c8fbe75191fec76b1f006b513e19a361 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae20e6df8e7e0408ffac2c951fd7460a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1dde8094faf570fdd9787ab7977ab0dd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ced7d14a9279594ee46ea7d7c8db9d82 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9d117dc592607bf410c16dfe1d518416 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50e95b35293c92db34d93b37d01421b4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0207be3dea51db9021d7b2a8efe4440a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f75cef0036cc71024f9d2a325a64ff2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37fe97c338a0b4fba744994f740fbf6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15d8e607acf0d3b7424a6e578173060a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5318baf63cbd337b6e0352522bbce04e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0801f34f5d6947d45481375eaf369535 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ead7a82d5f26065615ef50448dee2229 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e98329a3090d4cfda3aa02c18cf7b69d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5cb55b5c13e6a0fb8482d003b492852 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae486ab39354c1585a71e3756c30323e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a26292cdec5ba158a36177a52f5620f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-059f2bd2652fb098ab7d9bdb17a3d705 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55a01355be09460df5d892bd761eecd6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b6e520435d32065d7d165700460b654 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f5ce865cb691d635ac7b42343450af5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a97b5c68bd18a8b1f7f711b29c94a01b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7758ebba3f7ee550b71ed3a6907ad389 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0ef4e684897af22d7ab16aa1d2ddd97 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eea5430a26a79a1051ddbd2d7f172c0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1c62e01dee517fb794456a08b4f195a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c71e2021267c81d2a703896a7a7bb5ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3b735f1322ce0c2b11b193b71f0f504 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ea1ba41321061f4c1db728c06af1bc2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e63c45b0251dd84633bdf171bc8178a2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6658ce71cdb5db0710476c1a253b6b3e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ceecef687da476ef56b4cd9e4411dc7e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ff6df7bd84ee4674f90dabd589686c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f85f1e4dd95c21bde85263e98423a8c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0220a19f889fe6bfef9b5ceea43cc5f0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9c2d49a2c9fb55bc5a7e972c6276e892 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7881592d08ea2aba9da5f8b943d6de16 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a6f20f2af8b63262d040f278a005cab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3eece7902298f3e2ac3964de99f4a914 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-167964c353fd762cf164fabca1ed1416 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b25eae65eff4c96ceeaa9454068e63e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-86b701a2903306994cd1809498d5f500 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-adabfe78cc6fcc6d27279085a601efb2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8b8b1223dd43efeea4584053b8221e4e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5db3f5869fb75e24e24922d51ba0335d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16691b382fc1a495e19a026ff8e3b746 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b9f7b1c179d73b1c12e54b2a6e064a68 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d23e15e42002f1e89105c0b8504ff28 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d5ce4747d713ddfa74dc969f3ed28dac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e77a08d93ada2d9b18e74d3b0400853 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19ce43276ba75e4fb37f04b5cbc43b98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-18630deb03e2cf3a2df1440fa3addc37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d89fd48b569fcbd638e90d44d4b71d42 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3cbf6a8d9c5c64fa35d4e23bf93ae78 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-52bfed1f85f4a8c132fb15d96e6256d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e33b85ef4a9e3ff732a565b6d938c60f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-72aafefd9fd1633f9b8a10bfff3a7985 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-907655789b85c19df3d463877c86911c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3b918929977602c22c2ebc58e381a961 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9931112c06220141760a3884f94cef60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ff1e68594a61eb4cc63b11b0f5262b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33fcb1bfd0382e26539ba4f094846f59 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61dc383492bf94e63e8c5ddcd9b95242 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-09346f3dea418e4f26eab4f11cf802a1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9c33adb5c7e299d808355a5684c65827 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0413cce901dde3955d2e30fe9596c104 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9ea47162abe898aa46e34f69d09880f3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b27b120a47dd8eb568ced59d7d56d4b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cf9951d371d5cfe5267e01484d4fd881 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2569f0813aa37d9ce9732eaa40138bb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad41fda0b40bf793ada75e80693b0daf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bfce031a00b2e1cf9b51de5f1fae739a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3d5d249936256c7bcbe67f4b467e4d0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f9daf31d2e958967dc50a56708b434c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f611749b5727508ef74c81d738bbb8e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f9c11860266622cff1ebac1503f4b6e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b1f7b854e439e3fde08f1b11a9df01f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d9575bc83bf492ced273fa3dfae93aae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d4f63b26a63f887d608cd62ce84c66eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb4eb5bf4ec658818fd888aa3ae458bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a79f5df1e3f8d700275ea0d283df44a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b48789689582521a2998f3ab34667c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9fc453866c76717ce369f2d1ad243878 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b6006408d23ba263a7e03534c21396f8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-84cdc322fec7d199a3af8262e24e3445 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5259796d8edaa7e9d796099b8eb2e0dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df6004fbbf13f9d2063616b5805adf9c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f822043a41b158e1ea5c2521643a5ff4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-085d36b9266d235cd3d3ec8ad1cb1cb8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b4d86f8eb2e74eada1f0a4fde47bd79e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-11ccd4310bf9dc32531a1a3b38c53ed6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d61bbe01e135f2d9fa64e48b18952a05 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c27499b8d4900a061701e21ba440e803 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0cccf43d569869e330102985d165572b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3f48c3491670c8adacf0825b85ba3c3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03886b6cf65f74714a760c11177b70c6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cc90f893379bafb90fc86024d55178da Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-294ae8c520e10fac44a675a82bc73060 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6e6fd9229830a3e4aedfd6555c210aa1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d2142eb2b85ff5b201da65d3f4f04ff1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3b40b32778199af43c340a3727a5a7e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6cfcb0ff1506dde870f9931880aa0261 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-77f836f5349b33125ed624108a6d012a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0c27a0d1a934aed0e6d0ed8b3d67129c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-75346287ce4419255c5d3802a23719b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d8430a51285bb441b7181e12cbb299ab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6165bbe5bef08b1b93108fcab311030 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6000c507f07b7c4b2c323d8e6175e1a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-017664b07f71b341e701aba3a27fe6b4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-163e037d3572cd2a9726ec2988c8bd14 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5b1227e76a42392ebb5d80a9f4467f7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5c51308e09205031bf1734fda8b0c5c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d043c796819dbeab1bdc781b0e05557 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4212b410b88e0dd4788fed1d3a21e957 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9db90d3a27e7171f70734ecb8f564592 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23754045664ea5c7b539a0f817eaa5a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-63b9a1aa570bd9c970a744e64030a3cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d885ed49b084d740061d67643cc74d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8245a93eaa12dafb536d662e60cbaa0a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e66b28d3332a7f256e869ae2842500ff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bc3d64f66307ffd849a90d40d7f2b9cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-761a9b54c8ead8e225ea9e39f93e873a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e65d0baa6c943ce504dde75a3b37791 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-178f9af7ec8c0535aae8abcd28f73708 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f556b2fe2418ec53ff2a4dce0f41325d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2767b05b932652afea33fb812eb56207 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a6ae53490918bf5554950e058959022c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8ee9182824d2848543c17685c4ca554d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-40f04142d143258d5b0411fdd3bfa9fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1ddc66397f5f2381cb5c033840ca31ab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f3f2ea9637f137ad52eaedef00fac5a0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2e2fb104a73c4da96093d66408782e66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-beb27e6aee416054f6ed93ca66299491 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1be20b437493059a2e58ccd7f009ab18 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-08a91381be45b8140da18545eb43f3fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-992142fee10293e089e5c48c69e6dfc3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0a2c0a7ced80f8cd831270a0d107070e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec1f27097b1d3f4a633bca8e13389d2c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4351ca2a140d0aa302a75c77cf14dc44 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbbeb9dd4202670ae5a5351e9981959e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-30a6db15a9b6505eef6761b374bf2bac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec3dbeb6526f0423c519666c020c2d22 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f9f0811fa8ebd2edbb388648534d5031 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-763fc7c612135c98475301bf814284c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d09e634da11f8674511fca34068b7fd3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2d89a472fa38222070cf348bfcb078f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9dd34e04239a769718539f9c8e3ae7e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ac69eee3e4c582b12f1bc7972781bf7d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1282950a4174c888a2c50de6daf66e39 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2486bae4c366f7a4669f77ca7f850fbd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a37bca134626dc712e13a9b3dd73d3db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b30a17f414a76b226cfdba169487d973 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-daa3370f8570f16dc0f2fe8efbb31c76 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a93de9d0cf716d6ce0733ac23ca9eadd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9391264a7afa001b47e4e7f517e672a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-48c4dfccbe9a61ba2351cf4ef1289db8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1741e24ac3deb37f6ee661cc3a5308fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bd40b32e29c08ce309f9e4bb409bba44 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9aebba5167ea12d67c18f5e804f6d7c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d3a559ad575aaf72233625a4c020e89 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-48f74b55c8eb2303c47f588f20a90f47 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f7639430e0dcf51080991a5f89b7ef51 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f24f2a6af900648d7c79408f56c958f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a302e3e90a94420090518205afd8b3cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f74ae4d12538a0059d150d0f0b756eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-460f8362d78202b4075e6aa6206a5cb7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dd8eb41b6490bcfedf9df6cf596bcce6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b159071a189828b636c7dc78b223650a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eede182160895f8e978cc2f81e590899 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-102047d7ee68326786b18fc4bf627d96 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-556f791b8094f924ed67e2ef9028d0ee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc1fefd1454f144f608e886618211386 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c2f55a6f6263b057d2a32f3f03637579 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5ea5657616fadf8a186374f9b98aef6b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f591416d3985f4e8829bd1db3c39f4c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5054d34e5df85a26ab02a64f239ace8a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f95966bdb96b9b705210a3717e3f92f7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6bf93667388e1aff965b0f422efc7cb5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e6f0de7e64481e762985db472c13ce1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aa1c4c600f23498d586fded000b5e8da Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36c4ab1b203ab1ed4040d82e9669a68a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c3c3b459f4383152c41b6b8e8cc867e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-791d45c10ba28b1ab686d2bf2dbac764 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-509bbf3bdb84c7b145ef9b0ef776adfd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3333218a0c005d9df55f685793ed2aea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14e0b992c394a488d589be37d9ed7a9e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc6732c60dd28e7c8f21d3dad2b01bb9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-658df346dbd9ed1057701abd342b3974 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a611ff88749d427ea9363db2db0f653 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-70fdcfd78d7b528d3943f3a48c016369 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a7817df3907382b5c9cd51f4265b6e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a214ef3dab94d815f94d366d9a860252 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-318bcf5d3e8b866f13659ca593263eab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a1637782cc2018cac983fc293e9890c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-542dd9797546a291b07f2638220766c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1411b7bfe2d71e58a8a60226f2be7365 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c1ce96a7547301bdb7ac3d5336c3228c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5318779c999d3d9641e91542bb9f7cb1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ca7c65ed2dbcb85eab9f403c263da12e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dfd4477ca0b8ed3916b42486db70457f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b7bd682c0fe4707877aed102053a013 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-08f6ea3ce572ff179c48cb86236df7c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b7d5b83097cabecfeb2e48a70767bca7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-38bd112470646f223781b481d246d9d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c3d8a7964620c3481aa3d37d512ba58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-26ee39a15276554c8aa2d925df165b65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbb34d01de3c32d9fc323441a3447088 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f769f78fbdd63a693a514b2f947f8b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1fbd5ea7329d8bc9f7e134907708cf01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1103dbb646cd348553e328617186bbab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d22325d2b5ab1e8a9716a58341e5089d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-34bc0ac3b4635db5657a9c5e87ad1444 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-53b590e7c5b1487929ae7aea35ff13c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d7318c01b1e6cbfb596dc02ceb9b2cbc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0d28e787a9778c6127359cfe51030554 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0c0a297e21d59bbbc1930bedfd1c8572 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a82f08b137d496ab9daa465a86d7fc7b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d419072f916ac011f9479d1f9ac2398 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6ff1c192bf9a7d2cf1fb7600d5474e17 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ece00df1bd16659714e148fed216d4d6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5fa12b5bc5ca8629939ead92c1d5a057 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4100f80b003a19c372842cdab4f0d6fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-572f74de14d60382434a7f0a3a7819f0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-158c3cd8b113e9cb83342dc080737e2b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b08c998541d6e66fb6b349ac1debb75e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f637698c927ecca6f505231243bd7dab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ee2232ab482d72a87f645dc28214266 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0549e824e1242af0d1d09510077f0af6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-873fa58f71e3030c8a69a32575e1c020 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96f0004fb957c649c8bc6b840fc511b4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-be66c95861fe2e88b206b3ff16a17517 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f595082233c3d0b5a898071020338ade Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cfd7ad5f9983da715b37fe2c932ae451 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-574dfca4efb212377ba8e0cf4e0f09e5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad4a18bd6cbae5355f2e7737366a5529 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f19f499920843294a1f7af7d088aaf41 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bff0676307120c4ae9cdb13e9dc1cbd9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9b521163709a8e0e947fb75193be7a92 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8058152a7889890295656ddc4261bf9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-102c5bf93e5e45b3e7fb658db19c7d00 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d88e15ee4634f5df89e22999efbd0289 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b4d36215ce1235112b7b48903e1217f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20589d1c600d257bd8d5a7f1cd615fe2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-179337e4e0170ea7b1be4cf8117026ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f085f4e041c8e1813976aaf73eeff95e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb0796cccaff59bcd8504cd4a5ba6590 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b30e748bb2eb18103fe9efc17ef93558 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9293b9a64bd765cc11a627ead6c32cd1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f70950d7d6fc845994420117d12494c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad6c758813df901493cf97bf5b463b66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7b17e64b53293e265ea30a1cc0190d4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae4fcc4286ec138de76b5a07d8bbbfba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-39c1655bd59c61e08f68939a0a8201b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1bc5411dcb631d8b163c61e7d3ffb086 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-04ba8a30d989647ab22b75a211bd1c98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ba1478415ca53b010abd3505e14eddd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-100fcb7bef31075a08369abdcc2d5bef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-77e173ec6b03941cb1e49bf8af9ac1e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a93ee572c181cee3a3bb373d4bd6ed9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6df9a1deaa155a4cd521184ba2600ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3a9ad735a4d29d4e7fc88624d5848fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6896e3c186756b26a4add73629e5b66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5ec9d05f12a6f91fe12f4bae72fde02b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a06c0d2c0e65d0d96131def58e1caeff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2f31c0cb7fb62f3efc8412b02215336 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24d34311b7f0007dd774a1d0b617c2cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-92ab6816399a8471aaa4b502265f93fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4b5065ab6e8b9d3f8af8dcb119d3747b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d53d11c87cd2ab54ee89a195c37c64e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0357157c6314b52f7b7b761660b6917a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61674a7efce89e9517278a5b79d7d39e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0efc4ec08af31fcb85826fd8576572dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e8fc6e7875745b0b5f11c5c9b4e8c329 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1745e166fd6c2ceb1e551f09af7c8dfd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-de0646a586910cf0204fc700c8961428 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87a39f6d0b3b39bc381a4841d1aaaba8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c285a4d463f519c30ac802b4381db35f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8090b56a27d6007280db217cbf963117 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f19e3f520908185f37c17aabea1eff05 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5745fe8c3e61b5d55755a996194a1fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b88f97d3f6324a92a7cab18461b12e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb5f4e2c06034d527f6b8803c7874214 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4b594900a51bc605514e745b4172f7d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b2631eed023159121636e2ecba727da7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aa71cd76f460c9c1f1eb9f97add40e4e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b95a5730c16371cf359af35e3c2ebf5f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87a5b4b480bc062b857dabdc5a824245 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e0050bb466309dd0f870dec4853037c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c6dd6529b4e7f9d10032bb4205be049a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4cb4daecf77d267277b02737c029ee22 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e977ea01d70a9316cbba9d7fc5945cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-033a04568b36115f09b95ea80e0ba89a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2dd1d3646f08aabde231b062efd3dd03 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5b716e4c315825d38baf7bdb7896762 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14a5f2c33a9703e6bb20948b45968fda Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-26f2c3bf62967a63c25df43275a32bd6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50567ed4646302567d19df551dfc4ca9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8170564368f2534878fae64655efa812 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a854701b070aa3c0b853161a73665f95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-29d49d152a2fbf5802a185198ecfde0f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14382ffb325d6ca8f2523c0636deb32c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23258359ced227e343b0de6452991b11 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3767efbb129aeb1ddf691283e4b174f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-664064868d90f34dab82eb43a94535ec Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-588adde03792bcee195b6163f32dacfa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df7eb60c3378b6d7fea76b47ed13cf8e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-43a23ac6ece815e390704752d66ba375 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b30a99caf54118a647f3d8796239554 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8490239c9701d96b686e43db85ca7532 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d9b79c371f259f42064137b8a03f1eb8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1c83e2db78bed946d36d4023df1baae6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8fc0d38eea9c39e99e3734c72920e822 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ebe9eb2e205cb2c06e43a1a201410086 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f9d6cc988043d865aff9b2557d98a6e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e56b4794fa7e4d0de24aa1594abba56 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3887cc6da464186fc702e8497796fa7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8286234423a7efe9b0c6118444aa2e74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-815b144b5d3125c27f1773c0982b5bb4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb9e17c6107766af5646fd5c3fb49935 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-818723a6a5f3d25c7a2d171d73ddb566 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6da89ca5eefde1d6ee2439b207fa028c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55caffc6a00d7a1125336f0a2d79df6f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bf67c52f9f1f317d3480d33431e557b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df7ab3391b910cf05f45235c83815efa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e7e6c7bce4b24c41ff40b21e726b0a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dd4bec81a2cf946ab3f192c108d06ffb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a756a2618a095d2380fea8a1fc2a80df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cdc2b08233ee020dfa50ff3770870eb3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a1a0bc0ee8ed5de82301fdd4f449998 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-311b8cb8a525787118398ff3bc32fa00 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5f22daf72d5fb5c871597af0a5b6be1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a206e8230d32853268f3d95871c47a46 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7307fb28105ef282702b0ecd030e8f5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0f5fc0842bd278c2ed8c9441191b55a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-acfdc85813665297edc26e1450576c75 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7e349a84ddcff33e53fb74715808aca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c30fe21299c915c2d5cc8d68cc734b53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e7b147b257de268fd71720a423c7ecb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9f55a74117196b7bd2bb7ed22f293b31 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-936d28551b0af6e9a885d5d72a425646 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c9052f207a26b0d58f82d077df12c62 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4af44a40786b683f42608c7bdb140833 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f406886c34a1bedc2c7049ec7baf279c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e42a7a741bb563454ee20f687c78341 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6313c478eef0c1491399f66fc99529a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2befb6443d110eec3f456f2ca264c6fb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50bc6a7f2d9b4e645b6f786cadd36e2e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f050218c2d583c0955704beffe6c1395 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a34859adbd51838ab0367704037b08b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-396fca73dfe8b90aa64d34ed0fe683f6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54a868e0d7fdbd16bdee114bb8cb42ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e09408781439f12c45797bbb2ee53c6f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a35c47cc67c39fd5604885a011471f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-48b92b3dfd524518d0dc9e66f6772c13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-58a42ac571016317f43e3b1d077a2e4d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bd162919dac455c3cddf2bd35c2f88d6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e38d1e2e85449d4e52df6179b13056b7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-727333991701ac3c2acb76b7efd22578 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c9a4645b0bf14d70d2c2e4768d3fc297 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e59abff2c5fbaa2f3b34a43323a1651e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c169d70c39262fa6676257dd2979a3cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f512a29a4be4016dc6ffa6fd247b85f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-486690dbbe692e3577c18c175b6705fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-293f9587663a6c88018916b8c3178d54 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-27a23de080b673a52621a8e1a8950309 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d544ed770f1b91baaaa1ca3c55feddb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9d0cfd6e485d6e2ca07b71e81da7cea6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bd81e3becfc9215fba12a3a418d0f84a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-75bac1d6496b5a75f9c4bbc4a9ea84c0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ca9539d6c21458a313486ef4fa3ac00 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9b79ef2f9722e9a645b1e599339da7a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6e2a7514e1aa7b6ff6c038c196d134d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5eb364e64a097b3f70e009997db7cab7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-428f02c543f3dc178b0559a4e119033a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9db74bc0b60c5bc7f980f8faddf42267 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f6c4d02f773f47d8eb668d1037a647a0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8ad3c38d16475edc5612543ce04b2af6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-677dcd881514b50f4545669941e14bd5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62bcbe56abe8217252b680c313546043 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9b4664f9d7a35291f0e078ccd007285f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bc8869b240ea1f91bad0b2b841802443 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad7d8995d945df0746982265881ffdf1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2631b6a539fc7ea3fcdc21911abd8dea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0f4acf706b17ca967c85f3948a933edf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fd5158e83cb8edf0095a3ca4f96dae90 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0d746f75876ab2d2395804e9d8f29fab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9d500624d8bf59fbbec0e780f179ec37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d5e2b6b6634af7be658cb77bef2aa182 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2bd02674ee8ebff97d27492c3e51800a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e33b7a8ce7565b544ef0b9423323028 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a12ac5cdb6b7551671bbc54aae03ebc3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33c95dd267d6fa054a6f8be2ab099685 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25957a5f776e059d624484a4f0ef5d6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-13fc875573daab84cad6583dadbe7187 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbb8b4c750c7090961e3e95abbbcd32f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fddfa3143441bbf4d9709bab8fb06bda Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-99736d2024d53de11bcbd6c02d33865f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65715efb1702d8a91a9b14f604223008 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6fcb8a5c32a740e7dd7da32cce1a635c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e32343e44e020b54dd9894094f35a4fa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-70fe48129798555b18aa1465c2df07c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4344a54e178285ff107f6d8874533ea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7da6f8d48f66a7e3c87973d15edba0d4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25e878c72a25e42048baaf91d83656cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1bcce45a4ba818755272d2206ed6dfd6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d1d499ae9f17b587d78c470740778db5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3ba8c9bfacc20f9b1075063b71dd89b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e8eb9904d1128932063b5e09c140593f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dae3cde7c2b94fe0f73d7c500615b13e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d074f210d1e8a7260553da5082bf7e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ec237aaf80d921490a5db8bd4e2e641 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6358a123c5ba6abb6f7cf864bf953b15 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a440b1cb72de42fa5b5e4815aea6ede Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16f74d7d149035a1c4005d7b10d43810 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d2fb3409d6cef7ed6761846ef00ff9c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e48a801a81a0905f4ea5c7395ca26456 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a567bf5ef6b0155829547206ce3c7113 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8737bdc060b875686373857be7a3cbe6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b600f935797b5528620f3eb47219e32e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9b8dab7f8c0708f1550453a46edcedb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e99cdc860401234b5dda75c40d453646 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b179044780c6b7489971f32443af765f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a3a3e2dfc4fb24ce513c655674eb5e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c459a0a85a12b957c9b04c2bb4331f9f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2a5cddf0ecc6876c91df59a54d39dfd7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c3fa66d1f4e4b72527b7e0d37c6793ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bd90831d514744270db935cf997df873 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-140ea49a05bcda08ff03d871cf15aecc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e5f87e537fb982181f3c83cd873029e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-66738969eb869e2fe188702234191f05 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e2a60b326a13a868cdcb9441cc87bd4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ffa17734ff4a08293bd95905ce3760d0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-970931a1028143330b1f5f31e134dcfb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-67cdf8fb35d9261e9ca53ab05f2eb6be Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec0e59869f68d348f0c84d3b38a4b9ba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-385148eb36920b3e2b98364acf88022d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1163b4ead85ed01248ef25d0f5a3d599 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93f8bd3d1b75ad443c5af7186d16b936 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dd1f05756d9c1ff52931878bf47944e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-63778ccc2a40c556bfb429fdcef78438 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb4f70c0bd003323e05e9795b1068682 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a874016fc5bcdaf2e51bc10add0de5c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b5a7498967322931f65925c08c774a8f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b35afd391985b0a30fcd2b1a825d652f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-69373b22e429560f33d8a64a018cd0d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ff129e6b0688093f26e123db77422406 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7a15eefd1dc9b6ac159d3eae18d9afe3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe90ee00ec6ad2b4e625e333e45f1284 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36ccda9df72a7e1b247da8462e14ed49 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7cff3454aadaebb922658ac19bf91c58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a50ec0a9917482b8b2ed019fe1ec2ae1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-32364377055f17782b5bc58a1275d0f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5be4e2b8693d941edfe12e9b551a014f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4fff277234660531affbedcd29b122e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c2d3ead8099472fef97aa1c3914b0940 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-52907d7058b8878763c20229c5033aaf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c473e227c1d8fe62e64ae6a71ebc7c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a48cfb31f9b159853062e32390df3cad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b137162510b84109c1281f6c83e8008c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2a4a04f1929a9f5bc2eab9112a628c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85472b7bab0f4808873bc3c044543889 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e6d1f778f067303f711c415f97ba3ac9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-34f9d4bd9e8fbceb5583c7ba455f4318 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b27e07ab3ed284c959ad67ef179fb8ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e7dcd821d04e5642ecb42a89210c29c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1a13e4d588263fd6b6d60ba83597277 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f79fc72e170cfba1a71653d1662247c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7548f92b7dabc65aa90d6a8139d0cb00 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-31006279cf4c36dc4564b1d4d5f1f988 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19e0a777c50008bcbec4a4df3395adab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f6b7646b24124ea082e6a0680942723 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-733697cb8e4453729208ecd3ea706236 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76386c76b9b50ff9a64137ba977a11ec Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8480d2a3f2ae7ff57e427fb61b9bb160 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f7f03d8bb148ddcaf9808e2a8ffb6ff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef1aaa5fb2ba64d58af2a0728d8587bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-211d5e883bf4545da7bb31180e1c3279 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a7ecf49258a0461b287668a54fdbfb86 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-60e4fc25ce907e668d6be02eefd226fa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-392c01cb5938823e021ab4265a8efbca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e57753ba6765dc70a3c4ec78a8c300a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-21e742e36018c7264f39e5b7c004e6c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb41a47d206a1b76d57881bb3f9228ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-22c781b72ad7d635566d8938190595f6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b794b63ae13d2c0252dac329f332480 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-32dc6c396b756e1524e61b78a9aa9366 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e74bf95e8f4dd6cd0b349bf1dd6e7598 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-db304f9166ea4b42c9336394d3acd3ea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-080cb9fa35445ace27f17960f4170e47 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b7675004af06884511c28e9519fd291 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cfae225dfacd41fd62f027c477504ab2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d19817837b4b062f77059c73211b94c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-abf89c65ae8ce62434290d32f4f0891a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ebacad98a64a92f2cd3086f68bedc37a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54e88925c7801c007f16deda89977a66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2d610b47d1e752409874aa06cd3053c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2fe7cb5721db9e69dd507a83aaa6a56 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8da8b70f04902c86f59f79bde453c5a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7aa1ab129ff0d2ab35086a0b9a1561a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c0a757170c29c1c3f06dcae859f607d0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a30e462f7f2f57bcf415063a8bc961b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e374dc430b1c9922cdd2403c7594fb9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20ebfaa01f76ee3ce9527baa9749b753 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-57cb2cedcd8cb48ea9b8e9e727e8409e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a6519992cf17122fee396d23dd48c5bf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d1fb6759362188e5b4d15aeebf2ab363 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cec37300e20308c22941277973664271 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c72549865c0309ad4d0a594cf723b452 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7903b0dc6d9a98cc7bc424d6933be8e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6cf4bc812a2d059e1ee5f99da2828c74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f90d5ae16b939b2ca1d9cc5bbd45d15b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16ebcac9fb13c41a23d6555a0c4eb83e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe76f3084dd995645a4a746df79ed46a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-949dfd5b93f49865dce7e0e6582279f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50beb0e6fc0acc2fdb18102448cd3873 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c66f443deb5280d98c2151ae03d718f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-092ded8a9ddb0ac7483f267ca1606d7b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9ba0d08ccbd7895c9b8a39c9e3aa8d6d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a14a4e64b9e0033b7029f67b2aae2bdc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb6412bda2876989e7a459e7f957cbda Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e7b64d1cef80b91288e3b56e3178189 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3c29288f487e20a177be8a4e17eaa2b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ab03e811b44686010587871fee07c600 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7db0397f656c636a57ce6b125d9c25ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-852b5405073cb7bd836c99aa04d7e3af Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e582c45cecf718995578cc9ef356b04d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50e9aa91c29f73c5f0fa0358daca432e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f132c8d95d2b58941325d3ef39a1889c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20de67f2ffb848799f568b9b75119faf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-872f2530ef4ea457c8995c4bf4e38a13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e59fc9ead3ea5575c10a656bdf9fc46b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cb110d1cf7cdce30dc4a8e4114b3ea3c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b5e2de9fd105444d319020249fb39663 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-92fe2bc330caa1eca0488f663926f49c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1cbffec00897d2cbd05dcc040e26db63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-10f689d87b1b3ec75d6622aefacd412a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e05afcbc5891c6afefb47b151c21e500 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50058c2fd27165695261feb28357b4c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-401a038bf757bec2774a7a22c1a9b025 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5aaff0fd7fa1ebf3b78924e123fcae8d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5705412406544027137990a7ef1370a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0765fa79cb8c5cec70727f6fde03c548 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3c438677b7dfcf971d45f04498692abd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55bb28cabf7289f33b701899f76d8a6c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-688a72465b88761ddcb0c6bfc86ea272 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ba967121b0f20ea5ddda8a770f40145 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-442da7907975cc7c9b32fdcf062a0460 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-190af6db00efa11b58c4165051b8bf03 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b478426e17e4cbbb4771e47e5813bb8d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-09b13026df154a4ebebd4bc55abd211f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93b4c885fa0cd84e2b44f4d0bc5c4c91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5221e51f9aac6889babf91080da4393e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b96a06bc0f0e683c70904d57d0f145a4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f2ac68bdec270f52d70d557b4d25e7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3330e4f9ac841ef7161797a7fa80ec1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9ffeaccd66b106f227e851c005946e2c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-115ed5a8dc755e479033ecfaf4887aad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b83cac265d7f956f2bf9d80c161158e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5612ff70d5a0fe9d471726f9140068ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-22d24a9dcc381c870b6d76fdb0bab089 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad76d8663229cc9d085a00dfae8271f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-91fa5d56e4a8fff6808a3865f04ee6b6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ab95dfbf4569826f039156cc18f1ebda Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c95313bbbe68a76fadac2551d1d2317a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d91b3d4793bb50a7f020ace628ea575 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-abddc311c0298daab7c706becc96c960 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90ec3d22fba7049558fae8fdcaf1c30e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a0b765434486e9a37b1f1b3229cc6a0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5c3e31b3647f4f1b8bbbead925c0a30f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6521f94301f672da6abd98419c31b291 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0475f2c55574916c9f216cf15d149be7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f4e2a06da41f2b3932283fd70a519790 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9e1c727560df42e7136771293a475b7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4ba222ccb0f58a542d62c5567da223f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c43438141e2589e9c36396da861a3ee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-526fc2d3c46db14def1b0fc3b6acae9a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8cf4134dffce374decbb5ee820e26c75 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe900dc6d5a86242fbc90619c315223e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61a01b31a46e13ef80f0b3054d2f487d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54fbb84a9a6b7363ec7c38b0536f2fe5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-264b778b3cd917810488e6af7064f1ba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-481ad44d1255ff8e6af947382f320d3f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4d1586bce92ac09a312e64647781a9e4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2fd9632033f0df083b9e6094b7e7cd72 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96e8ba2678cb8235cf615db6b1c8ac58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65c28a87acd4a1b6bbfc3775c95c6cc0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7dca29540f14f6bd29f2d128e67be032 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-45c932b37ed3816bc52fd0c750a059ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-089e2f980b88fc24d7542da453b0065e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb474abc9ebdbcbe53c4549bbfaf011a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6451d42d8453da9ef6129ef91b8895d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4893eed2ebef1a8a33c606f66f0df3e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c7a45144800fb7b4a9b18609313ec1c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8fcea2f4240b92457e2b815e09cf7ae5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03d583cac870cfe4023ecb3311d0c357 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-079fbcd8f8239ff803b8bbee11c29dd3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b7bcd3a527d796bd82dd0d8611dd5bff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ac57f7582339f77a027434a015106103 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6fc4f8f5bc2d27e473aed6e359746924 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-67545a98f0579da04eff1fb6b494f47f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b5f31f622b5122fcc8337a112dd2688 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-478f90ae1938351c62737436d05bfad3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ba02a6a0cc3e4e63513639fc67c05ad8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2d437d1a5bf5187d98080c3673a6a91e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b4d20fbdb681f9a08f10b28f0ddf6677 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d86827eab8a644d4aafb404f56efaad0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b15270999a245e11575f52705114e6a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cc5bc5eab39138ed58218a23264a1411 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37c2407cd8aa5c888c1737e1e9a1646a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e9d61d651932c9c9bff02237b74cf87 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ba50e9710f27f6996692be77838ffc30 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f3c0a0cd17b66441b6ea9b6ef4a33204 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a968239dfdf6d2699196654bee73918 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-230e218bbab1725e259175b8b0d8f926 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e34c9b7b9e2876e28afd22e9523dc60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e1757effb702c14f532b691c6267e0b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-118bcf4a2fc7bc9e0fd4f3e4c1512d0c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d86fd2b9987f73a2e78bb55c12aa2fdd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-86bce2af6d345a1725849819ac099c57 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-034ad4332f70a6d69b000025eaaece2f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f1ba54ee81b040c32238f9257958b4d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-71fba849948000407bea6869a67c1561 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d3f6dee740d4c8531606df39b22c0bf4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6dbce2f27a7b8b3122e8734d240210d4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f28b3a30f5d068a4ab72350a90e52441 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9024a4168fbb7020ea4f3bf16822bc6b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8ddc681f37365d81aa4fb21a7e80a3b0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-45db01078df23d8f581a8e3d1818a0fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b73c411de9175c59d4b51a6c21654cc8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-27433ca61ad3146c7718455ba02bf02c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65024f6a3b061f1c66baf27eef260c5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-588653eacf5d0fdfc6825849fcc51067 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-67ae8eb083425886cfd7e5faec372f77 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1825517d3d40cb40de7675149c70890 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ab6f860c93894f7d85a777d446386606 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e5a9d0a568fd6076930f496b810cc96 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-78991acd8616d7bfc7635bf656b4ae58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-66890a53f36489fe6aece5be986490fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f029c3cfb45b07179a8b5da74c540f5f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23329c131232f230fc7ccc59c35c667b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-006f84dfdb61f7ef16d911ec5e5691e0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-77b202c2f5b6c1fcc1703b803bdfe8bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a52be1093341bbe378f32e85a6472213 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4b0c333495e505aed31f79a9054d02b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dae1681dd51b7526ba0c3656f686fed4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bf67297ecc73f0c22312fb5497163f95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-661bc58e6342376417183663163eb206 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f94b5cf35b198a5cf8fef06cbbb15cf6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cf2d56b66ef7d961654477e698cc2d4a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8da9461aa9dbfa59a569d09a4ab3494 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61a8e3fb4629d3479d8ab5973f661304 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1d68988c3ef8a954524aab7ffd1557f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-de270fb5421e20046d6f6a05641b1a94 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96de21715a139143da342611e2ea9f16 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8375d51e959b8b54b3629a0f3cbf0094 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-744924de811610ef819000cf32d9ec79 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-211b03bbc90bd343cdd1e3a121e36809 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5322811c210b84006a54da3a5e7f3e54 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-31caf01512fb2893b125ebbcbdbca0df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-caac49e1af0af017d206ddb4cd40c68c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-223295a382079bdb5f3e4842c9bf4c13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-45f4210d8acf67c06c6bf5ae47838920 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9486e6fd02ed5c026df68db9f97ec13c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5bd23ccba4f8b7e6e538e739881c8218 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b11108d66c9eb32e94a2dab0bbb6b63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c0bec47383fbd34c1e3bdd36977c078 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ffce3ded38c61fe9fcbd6ba89d03757b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e46a2fc0399f10c0576a7ccc1ad94c6d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bcb1fe298d2b9d65397da9969ae221d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a42ea177ce6934a4477a8a606a86d41d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d697df3da2dbca032dfad5a69483421a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-99dc3c98cd6d35f9cf45e8a002c031a0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1222e345eaddb3f74ea13d9dbda8a8f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-524bed84f80de7e485bd597846ee63ee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06123a42e534b02597585e727bf7cc52 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f13e12ec5bd6e62cedea1433190a91e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0d2f129e3623862f08477c90e02f12bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-036e491bd49d61d43650f7e5df564a46 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c856f76ba8915ba6ecfb138c4d34e26f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-989c3586011931993402a267ab52b0e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87ece32cd6d55aff8a5545227ac6b0a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bc26b8f3bd6ed7a32ce7d3a9a6e6f159 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a678d753f9a6d33da9a5f1eac367bcd4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b17602d67130d8ed025f7c5cc2c51fb9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c845bc74f0d135a8813516600eb5f74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-253c4a618d49fda4c62b4082566c72f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ee597d3a6d5180206cd3f19fad62e014 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-002c5cf39dce1198763bde80f47be60a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9bb2ed87b34672489b7414f5d21cb7b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2a1e5ed8a047f419d2ef19bd0a9030b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-80bc95170e06e57c9b27cc7f13e39706 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe261b5cf2fa92e1a7cb025e0b30d8b3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1b405527208c4d5b851a095c0ad9b01e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e91a3960a0bc0c8425b309f547f6385d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6e6d70c065cbb4d5d85cd11f8ad14572 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-739d2ad1a3fe870ced28782bca7733ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4520de6bc2ce82edffe6a606dade6c26 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-28b4ce4e55c66f1d992c44f31d7a57e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20763aec2e78245afe193f4cb0f30ebe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-099967281a19cf4f22c5be63e31a5762 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a147332aa96fc532484486a4673ce40 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-41f83182314956a287a8aaf9dcd9b74b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-148a6344ed4b31acbb95c0ce2aa736a2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0398994b0e0cdd140054887fd72f2bd2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-43be35d188a1d0c6e4995e9df45af33f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-88a24915c841aedae86c22e2c00e75e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d3e26d06cec3ec2cd6d4a1425164ff43 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6ff2014d00ebf931746bb76b65836d59 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2afe3f6d8b789e5b52f6e189d4d02641 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a8aee363e0870980d9642ef944c222e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-638b0f441d741fd1c94ed333a2bcf021 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-368338f12eb03196c2083140c8e11057 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ff9d24767542a43778f5a903a303c138 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-610f2fc45733fcb2aaac008cb04d6679 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ea076ca4732c79c16697944b065e0e71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a066e8420972bdd21d79720b68a50c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9732e935f15cbc939a3580a310329ca2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ddac7cfef2cf9463650046d541265fa4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe6bb96f91bdaee8100372a11e3da0d1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-52e6e3355c84b4cdebaa59eaed4ca9b3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a19268a6e114aaf6fde3fb16466c1a13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e47f6d4d4ea1b16252793e94d2ce920e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ff4639456f2c6b7cd0222eca45f430e0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6f630ee315d7dc1cd66340f056803267 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-af8f087cf82d1fcd076cdc117f2d82d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33154b645f11be0228b763498cfa3a29 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a08434a817f3d0ee8efc4487f24e589 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20c995f6a2a61e4ef8fd7a944af77f7b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2fa5ffdf5fcd0865be35044dc3f6fdf2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a3152069852004a304363edbdd7425c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-729c774ad6b6a42278b9259b9a5e022a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7a0072ed0cba2da096cfb80e26d0b5a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2901c693fe1a37c3b04ab51420a6fe49 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d279b3e41e5fd58dd23e3ce1d2190064 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-40c8d4065b01e212c7be0f4e4a45efc9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-42de73754dddf9306b56f0e6697b15a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-608cb2371f72146d44a0bf3bab4daa9b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b18ad30bb497058ca9b2e78576f66f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e05420a2bc36ce47e22ec4e86a76bb8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0437554208673c759a297e0bc4e29f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6752f1143178f9acc9531f1746f0fdbc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3295c80f6bb60bb8eecd418dbf986b53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6155f0a1c62e78333018fb064a3af53a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20ad5e17dae08c87c361f792520fb65e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4bdf450d3b57832014a71b18d569ecc9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ec9f52114c1b2aee596f49ef00e3bfb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d8963c324220ac9924e24d5534a73001 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-56974f3777f58be244154f1d4fbbdcc3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c91a6c3a0b91a21ddb78ffd57302a3c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-82e54ec3e696cb9817580fea2934fd06 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-755a77502b2e2b16dbcb5c29eb5fef89 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85c738d22a7ea582ba88221fdb0013f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-efb93806bafdf986c0f6e3b2962a1a38 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dd345d5eb76bf94e7d80e00a6a9199d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-26b1f6f50c035385dda848ae38d40d42 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2609bf136db39248e094d7510bc138aa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c92b837098bd35ffdee791769ec1f34d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e0b9ec7d56710c6c99b94fe63e15ddba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0061e73ccbcf33b26529eb04f564d410 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55c283926e0741c0b5c2f96ae9c21c37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2e739efa6e81ff8508dc46f924c2f3f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1b9580ab654bf2026893175a4a6643d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93dd70b7b394f4497bfb3b9856c9c285 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb11594ea9f562f6f573357a8c229ac6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4fc4a1133f54e5c108dfc5b6b89d4364 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d231a64ed198a1c819df99d60f0ab066 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-574db9e70fe217d694e02688033462fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f478c0d77daab6c36896bae0e70058a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15a6f2825a6b92651d1da920bc81b955 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e0edae15620ccda42a53bdd481040539 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1a9afa6979efad8601036018a101ce68 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d800ab7e50e19b3040063530d6bd0459 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-711c09090f1f910a04731635505a9abd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9981043dfe83f9166a9ac5605e320f60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f7ecaca6fc5cd87ad83b14f3d63fb7b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ce2c1d4d678c22193bb38c4d5c248db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fcf05dbe3797768a95a3b8cf84c6197f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3b5403b9d70e5397088db67a4f17431 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d1f5db75a8fd5456d40446eb64ad7b90 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0c8500ffad02c3a26f61a0da72a31066 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0160e6622882f8fd804bdc4c88d7a553 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef792940878386b7e8b59197d7780f40 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90fff0392cc8dbb518a9e52b93398663 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a69c6b3ab2db8e4f41a9087180e41b21 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d8c6d60e4106bfea975259398cd3eb8d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d79543f60f5b0ce7c64b4a022e5e4c65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36959eb50e28d20f59602e6e476867ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e210dfefff3cabf35543f61d497b8aef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bdbd30a4a7c3b0234d59e2104b3213cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f15b49a4775600d219eac4d5fbd10ff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ca8ae8ec74592b4967da5f05c7c9613 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-45be5caf21b090eb85d6e957ed4fcd5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f6362f58b4a425e460a3d06aac8fc082 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0a2c7b7c8126124a6df68c8490c62fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65bdb8dd37d7d34ba8bd1bef33506832 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6f2ef8747ad02f9b97a7c30b10da7d1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9ef8f2c429316af2e9e554dac455c10 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7bad22461be5bdcf31c61b134470038a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c6980eaa735a9444cd1cf767d5c6620a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8cff6ea726cde383a66b695b53bc270a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d114c276ef5dac1722d4ab84e8dbf048 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad7a702a470b88be444d18af59b4d544 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1916f3bf7e1a907b0701f7c99a3557f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-db2ef98a3781b68635301bd88b7bd00f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e55c37f22063ef8580520e54f25cc342 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a70519547d6f452184cd1c91a949fffe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-12dfc27200ea128251fff40a64f8b06b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f8c16b262508a261d049d0517647ad1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-573cf4c3a1ad0e0ecb61a957f285cc43 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-af16782411ff4d64eaba0892d8667d50 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-abde4ab2d865f942b35c2e44f356d8d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1cd2078b58d549d820e6f833728ad23c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb07ddb30fa93b851bd5a1bba32ef0ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3f728b30ec680369f14d38064445786 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8aa73ffdd8acd2ad0779144f32cf268b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d180ca0e2d513ebd2ae5bd20db57d042 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-17b53d1fa95b34b99280d48bef841fa3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4e0ada2371c548493aab5af973d34cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d07ee5e8476840c3bfff7139eecc7053 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b6aa7d189d9bac428f3f08b1567adacb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-01aa8ffd5ec1e0a7c395acab83f7f29f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8bb68f95558fdc7b3388318e18200bd1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-352f2ff5681ef57a127f557408b0d418 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c73b2ccc1058fcbefec7dc54e7aa8edd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4ff4021de097897debbee9a0609037a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a203c57bf6e73fa7e15b43b837b64be Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f587327e83514caac2d2267618e1b9e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f68896a8742430d2c992d5fa914641d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a2d014da0b1cb8ace5695e93ab6b5702 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-17e8fe632fd1c1b05c2c21cd1088d77c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d642d934daf40d3674b6b6a6e6952b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6704dd6919530f75f79d1f18fb5f1dd6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c1901af4438354c9c9bdf7848c4f006 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e194f8fea2db6edc750891578f3e344 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f561cec14f30ea9b33f6a5ad6558023f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4548f203068313ca17da8ee6825ba0be Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15317fed8686f98a994e7bc2a586f9c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-276b1e25d4aea20305e816dad2a313fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7303c9752b470e6a6fa1962f27ac2b72 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-948301f9eed707e5d8edd60b799c46b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bf88964b63c77d16885c163bf39dd85b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6e47d066bb0e96a2445bf061bdbc4c53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85a1e13fe5510e53a7af49b5bb1c1737 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4b1974f808267f490f3fd8d7d94d6955 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f850ee6e557a40e3c543e4a414930fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-400fa2e4dd91c9731fdbfd96ded34021 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c5027e3252dde49c33d554cccdf505a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cffbb2f1a941a7386bcef31885146786 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5b31b199077d2c999ce325f1fd3040df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-28e70680bd5e694ba87f6cafc9a26772 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-00481eee71fc67fb9b2f0230069236ca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b6c5d9f6052f5fad0849b0fba2c00f5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-29937a7b260c531f3e388b3e4702b214 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1bff332d1d96a31a6cd22dfc64d5b9e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-51e1a200649678dae92f3a8d428ab74f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2efc2e731ee0ecd4e29a0e07c0e85e82 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-044bf91ab4e927a2aa8d70ba96a98ebd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d4e3ae26666fc6358ee875bd3eb9c3dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fa23a2e027b8a9a548c5c8ef786b4e96 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d8fad3567680517c7b2a8418ea8710b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb6ca7f5b39a8b9d5dac830abfdcfb8e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a260eecda6fd17075d23c4b6abdf789 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-87b78c4b87ffc7624db0c8c47d709e66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6ee1eea4594df0d520df28a475a6c3ea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-31979eb1dcc4e998108a4f5736a50039 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24def95fcc37c6ecc707c52ff366f61d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe0206c429bba2d98701b70c997a8516 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-167df2ace2a96931cc93ccf05df195cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5157eae7ca775914d80922ef1645bbdd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4bed671bcfa4a79d27ea4f0e8ef0f9a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c15cd707a2c45489c057bc78d3562a9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f98641d02a2ee1b18de02cf5d066f588 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0ff6f2cdff34311c4ebcdaad66bdb26 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c785ce3db5c90ab77b92246a23882eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d4933e1d1ffa0d39626d98483f4a4114 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54e2d3b5ccb05c9c9ecb439dd063405a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-69cdeed4fb68721e7f7ee9d5458d1adc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d2e467d7ca110afeb6b49e09a4dff52 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b61faf351a31d8b27f917fa07bef89bb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9fd1a7e434f80c53f84c3c92009494b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef6d3df6f112c7cd38ae153a31bb35c3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fdbd744887dd590df6aef2c2cf6fb94d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-682e936e39db15abbb5dfdb560562cee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbedb6f0e3367f86f927349890ca49cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e033910778f7970a8c96855e64e9aa4f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4ccb0f0a29bba9a45d67fd5fb333238b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15d59c252fdc0d9cb9a4ee14a8032f82 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-78bb967824b0abc0dbb882cbcaea23cf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3b97a01d0ec81c9ba0817c7fd8f5e356 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f348740387d1e2c9dba053363c0cf993 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1619735f0c4d125c50124b3d1530cc5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cd48795a152e317c931686e47f9ac85f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef33395c0d3f378d4c7be0d144b7dd58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e641d8f0cf793a27b4bbd5d31782390 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6c7d111e78f7340d36616dcf76774f69 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b935ad970c127169a9a6294791523921 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0d5c67eb929394166ce43743be117ecc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-69fdecd6e101cbbfe7861baa50bc7e64 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb3c08c8014dddbb4d0160e24b5e6974 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ff2d669f961ab7bbd5ba3ca2996fef36 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9c2c4e37d947545be01e5ab1d77920ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6029d1282fef04fac2487d85a1b0e20c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5645b261055ddc593602742e5ec3d733 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-397cf4acceaec36865578b088ece2099 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3bd505d766ea680c8c66c9480df66fd1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e2049f9208f18729331c7ddf3011c92 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-46f7530604de2710e92abe32cf04d19f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ef4d9391c4a4edf51f3453ae77d9366 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d332feec61ed5573387c88c91b04cff1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-abf4f3a03dd520cadd22863fa9abd4a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55ee5691fa811bd20dc61fef44d6e898 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8dd33f3dd44503e337d322280dd9b9ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4d3711ea90d285b640c53452368c2802 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-35a8d724dac5221adb530c37d379d2e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f1b59d00da84962dc34721c138d87908 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5bc06b382de584822a40dabbbd59555 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-512dcb0765a8f131394e7b1444427ce7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fa693774867aafce1f17b741eb9b200a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b6e772b208d0bbd65f9375f5a9c546a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-71c5bae392f538234f7914b1c13d2e08 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e70b9ca15d4e27881e057593b9748ef9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b02533ae43b75b92ad9420499f18b97e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8189efefa4bc29996dd8efffde3ba2c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-04bf6dc2b0e654c3c14219d2337738cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f1f020508c4fdffd260d838f387b7c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d8071726111f9860dbd9e59fe64f24cf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a7a81315a72b102ba6615a45195f4511 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e43efcc65fa13effa3639dda9381225 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d620a3492a8e0f00035976d31a3173fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-045a5a8423b95771058154480949ed12 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-01c3590bb38eb237b3f18767afa15674 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dcc740a749fd6d8197c9ead6f77cb7a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8966d56e54b9d4a9cb59ce33feb4717c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1500901dc0348c9029838f601acec683 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-02b30d4c3e5dc83f5f5718fa1520dfe8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ab4dbdb16e5ccb7f81b920487901a31 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fa2b9a191da021d748be2f1b97a1a16c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-606ac334b1c72fb0ff0a202dc883a176 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7013b239270baeb397832a5243cad5e4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-495ba16ffcb51768d83c8f22f42e7434 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-13d18253f5da98582ec81dd48e4fd3cf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-09d9b71cd57d4e704422c58c8d721d67 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-73a66c08bb1cbc8a0a6b02161351e7bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-63939c68ea44dabd6f7fa79cdf0e5d94 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-91bcb1d323e5721437f6e40840b0a446 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-74ab983e9de1837c2fd10520c75264b5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-800df2ab9f85ac820609556d46bf033f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d643dc42b68d7600ceb0b6c837cf5fee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e2bbad96e86cb1f1a8e3677c5658479 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7a69d6bad004fb816b1349bf090f390 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-26697b57a637657c1989530fdc3fe6a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb9f12eeb6e80e20c5ba0323b058572c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b1225c58354c8a24cc81b5911e4747a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ca72ba4b0e43c28f88a625965753dfb2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a0a5db052f5f2fcbf3d67bfda0d69d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b1138dcf31e07325a36dada0d8634091 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ea50d215d987cf4272249d7bef2cb079 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fffb1b657573b1abb3c0a5c7d827d4d1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5518d7edf31c5e71254fc86b256bb9a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-872c7379fad6e400780ab8fdf53e1942 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-399937b081951b4f91347b852f2acade Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2207c254ca98d9c65bbcf32d884de17d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e59d12333e7daea9a330fb655eba984 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36061a018f8eb786524338f2db68031f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5c96cd3e563018914b1572bb3d93b6ea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb019ed9fa796293d0710502c9da001a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fee39b89b5c590fb2fcfe3e4455cfbbd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49d4f94f8d3d3b7494f998ae25123d5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7cf5da567864001215b55687373c4c7e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e18d8a6ba9aaa27697862f391c71116b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a30c243194c3d3c104c7f9c7b66557f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f11144d701c3c92df6810fbb6bb67333 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e49e68c16ae67694945f6fe2fd33741 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2a5389e41218efbd5a20ceb5ecf2294 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20825819d97d6e4af12ee2113a0e5c33 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bd61b0732067c7e5c32ac5accc4bc310 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-601bb937207d1ab4373f538c27cd2422 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec23c8e72c690e02d6db6bd44127408b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d8f744733c3573f9688e0350a305b54 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d10c3c1272a33f9d0584d91bd21f2802 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-73a148f653e1582dabf95cc404da62eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1887c0ba5ff76ff62394aac3d137e8a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3f4729f37c7f7a17516a7ba6f855ce3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e15ba81050d98c7374de59fc8adecb0b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a920b5487924569af2268eec54bd4b58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b2b7893288affa35cf9f0f40f6d25ab6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d5d4d9002c1522c3b76e988247580c15 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c0d1eb54b526e0354c0aeca91c8bdd70 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f94d54d0b203213f25f5739f587740c3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-efe2feb0d10d074d0636f3cc0dd9da90 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d801760f2a66ee9c7327549583ef9280 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f6df7eb247d2aa255defda6f082246a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4805f71641c11e69ffee2995b8cb285 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d790454f381a64676b81a8f773d093d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0d75b8b80b4adf990f3341155fca011 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8097e542bc3f3c0c411ef64ab934a15d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c64b5f45f895d1c90063637466b4e703 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a66e087ae3b7f551b32262ee8f14e3cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6fbf28f4613b4c3a057a4e978c622e9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-724ab4d459b61ab518f0784b581a9a4c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e8853034a3324b57f9c74c95adb47f7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4ac57c61a33912f52386b2d1592c0488 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f95c3fc42fd928b06070d39ed5a598e3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0114a92f87ff23e730445c8d7121fc86 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4e1d1b12c7328ef19965edb549ba859 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d49fb372c702f106db94ec1f576716a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e10969fab56a68116fdcaa5ee985f5f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ada4c00a11caec131b031762a033c7e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-866333782911aeb085dcba06961b356e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c0af734a3ebf668a24577ff3feced3cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14e4a949724218c1ab1a75ac8b228641 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b6c219882f3d99be28b6e16b9b950758 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb4ad287e626bae318b0ed63b5d9fff8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-071fe5eeda84374ae1917828304205f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f9583cfe957e9ec88ec7fe8e53688a8e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9ddcda03efa813e4a4e8b68e9df37dc2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec993a727b4edd87b29680761bd92087 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5df5370596717a09d7527eb19de923c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-865611b8b622ae923dc43492b7af41d0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-964e30fb3ee5bf7dd08ed267eacba4a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8cfc3a00fe7f48007891353fe99cb1eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2e21eea96ab5a9ea49be81bdd6b3758c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c1188177d2ff5a61a7e5bc235e586325 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a8473438fd0a8e2c827273a72319a565 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7405e2e1e1d6c754bf2b9bbb6117d286 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-474f3de86d82f1ae3d64fe10cdc5111d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ebf16811b5631c373abce4311b69bff2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f35e80b2947b26dc597efe46542ac8d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df31d407b75d5dab5f5baafa9223ac66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ea4bcbe8b2a9cf579f16f8b12fbcb579 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9bc2c93f4f90cbb5c7650df6f2f0a80 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-510734915014d2aec3ef5c438b5f1951 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eaa52db1b0ee4861386b2b8e7c81d228 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-67a6a0e241a72b7a49d35a733a0c9a9c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a84c3e62f6edb815921e66b1521b5a69 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a5b0c5b331fe8d6953a7bf59be2c7b18 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-88c17968b99c7d235cda22c3f629f9ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b396633301428880bb470c128c400f01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a8015ac975abeb3e0afa1b3404737f6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d6d9d530dce6674aec932acc8dce6f0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62c38d2f5029beba0417022683aed0c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9783936a89f67444722d7facb54a9eed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-58af10fcbf2210740f2c353c5f9e261a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-425713f3e41d8607e5bd9ef58471e760 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7075c5b47f7810e923c7dab51af5267c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fecf4019b2262301620cc40cb8d535a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b02faecb4c9bfdd769be113ad9dcaba5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90eec1deeb7c388ce62f3e02d7232747 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f920e50e3020641ac62924f657db2a51 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06b30dfcf7751942f062cb6899535836 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-89cc4061a7de807b493a09b9fca8ec37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-857c280b9b820bb7505d58af6e2dbff3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-717a0155dc318351dbb119729e608a11 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ff46013b53023f60e0d8fc188d6946bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc1345c443189461c5a6cb5ffee1a0b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e662b6ae6b3e0649c4feeafbf939df39 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24d17e3af7b22d2aaa450a766ac97c5f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e83b96f49c4ad4dc6ec7afe4b193e7a4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e31ddff1ec9f3d375f344d8ebd7e2df3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef83c97e945846a8116fadae4f0efc0f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-638d68b5aaa66d67f8d4a115aea7c8f9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c672025ee11074f93a62cc451bd6c94b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0390dbe20409718d6557bee6dfc7dfe0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1bcbdbf5cfc12b7adfc029ba51f290cf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a6ef60bebb03bbb61d534e08c2607f10 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e48ddc057a3b9d2de25783c84881c592 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9d963c27ebf6e38feb2cba0e3d8856ce Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-70aaa0ec6affed9cd0ea555feb453a67 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8d0de3ac0aeb3f3262955513b7019a88 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0e27ec20945cd8cf5b971cba8b75402 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a23f58c0d27a09859ac3d567157089f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d0a6ed2f320dc5c4016c724d39940f37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2889a699c491024c245372053e404053 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f86654e6bdc3bd4a50dbba985a9ad01b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-78892591812e9016a387eb70abece0fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b7d84027d7eb813446b88579da8a3a13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-595503f0b42ec41c430ae722ff355aaf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-536edccf24e210d47cf81d6a08a34e91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1fbb8db27a8d5f2a30035710cd9e9236 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-91619da9bc729e0e6164841ba54813ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c82607b114c3c0df7eeb59bf6af1f181 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ed97d2c1b3a8f4c94992131f763040ab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b422732a69eec7c1730c417dcaf3eee2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9bf1a723812366f495ed2417698e0301 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f93af35a6993b3d5e820377e1ca8983 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-312f3e2a1829d4a4073c4215224cf006 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-edbaf9f2c6a51d4b6ad07810dc015254 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7558f854e320454088caca86884784a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae7dc88b24be84fecee1860fe5b8b4e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4fdad512a01c84fe4e8aebaeb88275e1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9c97d07a738c59f23242fb44d8ae4c1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c851d7c50cb06ba73abd311195fdd554 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24ee9ffcc8fe1473cf8d7ef3757d4fd4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d81294dc2529958fc55bad5209430354 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83ae3473bdf2d22e78a67f2e984058a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d27f1728eb24eaa815c919264aede324 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e375e7627c8a6f381cd8db90c7e7eb02 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-05fc4a4571a81a1a79336f34500c8893 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76ff3c9b500e5271e04fe9faf38e2083 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9aca97ffd40ce0759e7d651ec397102a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2814a5964236280aabc52b72fe606045 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-82f99be7304e0f553b8b0fae82ec8e6a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-72f63bb195c91532536678d059d2ea0a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-38c81b15375df79b3ade4f4ad617bd68 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ab5581c90fc845955844e3a1209e28bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b866ce2129cbfd31ce66cccbf16b343 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19421fc054cfaf2e2da5c76f763571cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2a3206f4e1afbcc4564b07a2da17e6c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a8161e19bfc5a22fefb4142de8442df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-610286b347dd9a812bf498c5a569131b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7633077b8f9540e37babb38529d9698f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1e785e71f4531d373654da56e2671f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d5ce7b332ae1b84ab8886d9d67ba694 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9df32978e218e994fda9b06273d2a674 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cdb61ab11a314e9a183eeaa332dae144 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65da6550a096b90671ba745e6172512f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59ffcc703371632e07ca75a353f533a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-29165eec4a39d56ac6224ac0ca9a8b60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6ba3dfdf204d8a67aa96397fd4334c84 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-abc8a143afd8206212a13ca633bd5d73 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62b48d250e444a97bcc01a5209667066 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d074401388aac56e4555159a3007a50f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d53903e0646da4ed90c62d6a53c46670 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-01da3131ca08963dfae4911f3b440702 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55a2bf66da59604b93569f3ca1e2b826 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1ab92959866292006a25dfe727689c9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-99999d2e96007f8d87f89d3957672ef3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6dd79f1d087526885d7f8cf57c37f2b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-715aaaa1c47fb14c9f71cb65613ba1bf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-32b40c4c2ceef8c012eb943878ae471b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90673b3c6896d743bda15321d312891d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-de6d3393d5a954307684e3cd07c9d903 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0d22214db961544bf4fd8be367db4d89 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-891e61633e9a8a5996c5da3c713c9a33 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59e720fe1e0e7bff4a7cacf6589fef27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e28fb313eb4305f58d00283786e72c56 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23505ce2a7a7c644f03f47ba84ab8fc4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-310ebe59abf50a0d9e9c5b4f4912fa3c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e331b0a1d8fb6fdf8dcb9563a050a152 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7211e0ed59f1c52e098a53525d98b61b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4e710e65a54a53db8f102fcfc7e930d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-89c08622c3faad95d29203acbb6d1901 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-92207a5d698cff58c6b4a0aa980e5522 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9105327e682d724bed428d7d188dfa9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0af2b05bb7da8601242f40d48712153 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2892d37b5a2d85b0b55529663ed87e33 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-215ce61ed94b2e8a8e745812149035cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ebb0d5acc8facbd651028dfbcd2546d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b57bc792b77a6241d5a866861d42a806 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2ebb69daf9d34fbbcae809d9d1260a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4da9fd9ba546faac63a9badb60a1bd13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f57b43911d72b2f957f4bbc57417b75 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-618893bff72982b1a96092ad5d3ce124 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03a3040d1c08ab8c92cfaa890fd5c29d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-339a23c2f7cebb8da7f3238a79c744cf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ae568cead490e2593c2a6afbbe328d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9973d4a6f42cc7a8a0ca3a8d77bf3b5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85b705998821391e3d1eadf7e8894a0d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-db2b741884ac7dd45eb2b0b2f2e1d573 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b8c6267bfbf8c1c90769db09131dd454 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76b60fa6ebee275a5771f4c9f18b48eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c9836b7fc7d6e0ed8fa59ed029aa1a8b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-93cc230fccd04ba34a45bfa719119324 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1c83e8c4a64671d7d99225ca28483328 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3135678f5d0645315186e7667456e9e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-94c0910eda0114dcc4959034349e5cd1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2a79e12e599e0b6a7533ee55cb8cb6d6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f935036782736c8594ad6962b50ea984 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90b4494a23d0f09bf57f16b75df9dbc6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15b161351c2db1ea0e14c6355c56968a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d23427fe071b06c3dd51af2423e3d24 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad9d1eb534a2fded75eb18969c45b607 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3056cbb9be87bdeaaaecdb984d10ecd4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-291e9ab77529f3915f07c01de58185db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-867300a8d0f38c3ca9d10032bf2f1367 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a088e9e565d6e823a41eb16b4c0899b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9fe25b114956b3963ecad9a75a80020f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-10fcb1b858c01876b6c1c5090570bf63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cc7d61b010c1c157c651bf7146f5f8ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5c97a5dc365608b5745b71554078f3e3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-18470a310daf38b59144fe7b7b90602a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6f80fdcda201b4ac1c8337fe57d2f081 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7c89317fb372fb2572ca366d2cbb684e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e1e7e5c0df0d724ff7d567339c83742 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b741b82b2dd676b76b6aba734248254 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8bcb3980ae9a224700c6d2710147ca98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4025a83495709de339256c9df9345d37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4989e1f38be27336bfb79fa6c18fa529 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2f0d19fa75e71843313cd4f1a9678c1d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-139c76d53dd02c61c102177659d16ac4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9607fb557d625ab41ab706761662d5b3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1c7ec824640c7c67a3c45e46dd4d54a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c2fd45f54ba3644fe00af620bdca1df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cb91e513577786d65834767366305c66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ce044e8b576e42df26345c172f55bd48 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55458af87912ec8c1d9da071e9613237 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5e55bd0ab78e989f8207edf12ec55a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37d87472b8811fd33a5ccecf1fef228f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c89063a2c2045f663c65f9c529dccb4f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-91381fc88880dd520236074a01be6d91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c503c8592d7daa3db0cdd0feb7cd040e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0a1ce2e18444b48a74c602eaae1283f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d0be36d3c472c3938c347e0f14896cc3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c7700c5585c9f581e4bee755ffffa083 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7d56d94d2cd72669ec63f4b1717b2d3a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-92ba6571b51a9cf175ee890eb1ad3984 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c6d442ed5b53e00961e0921b6315ff4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-626a4bcdedfce19db3b2d4ea45edce80 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1c42483593e3e3cf46c8a6d8d10138d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-688a86f2dfa1fd46bc76e9d3918c4301 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e9205616e547679cc0475527c1b49fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-05de2f278c3672712ec70892e071dbe7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a16b0e519bbd5411710942c53b239436 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cb71bee7b49d8a7457278eb3dfb03478 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2400043eca20692057b0046b0f6ae2b7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5a5452c4ce8bd75ef2eb48150e085964 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3060aa6e4fac329b84d5a1c67654914e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-86f7136e192af068972a0e716e18cefc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49764af42cf536c39692d9c093a00d66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c12934d0d3bb0a8144946bbda6bc638e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d381c92e8a94986ddd7887f94d9909c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d77883c9f81997d00da1141e7dc18ad0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3f6639113ca5ccc916d8975fca5a448 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cd876b319d5fb015e14d9c3b38a003ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-da1d24acbdbe1d0c2fd2a32f01864d23 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49bbfe5f27a711a663452a88d43fde72 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c7e1a97f2ca1c5c68d86a8f6cf6c04a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-909b0c899e786993d7409193bd88d9f0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-50dbfdbe05ec67b1861dd42b677ed191 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2613ffb30360a6d10aad9fffcc48149 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0deceb14c8ac916d1169252ec026548 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-48fc70a130b9b8320677e22eb13e4ae1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f4b9caa53342b4b8fa76abd4e0f58394 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b78b3d4293c708bf97727c2f8722ba5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ff0e930d74f1044e6514d63dfc77509 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-090287407207066f0e1fc192f06e46ca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fff1c8955244c8b4ad06308465c15d75 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-550da6a8560c71ca7c09b4d9234450e1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4b29c89c07640747d588d3d520f7537 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-877381b41387fab9053147a6eb4aa2be Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5be9393cae152e0a416f29aa351fb6a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4c8ae5ca1b89a9cee64cc340c97212f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f86597d91e963e57e7ff3fb9ac80b6d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc7497df6b2b343711b7e016d3356cd8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ce359b50e45190fbf14fe31ef59bb27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-508098a5c8c11212d215e33a3ba3de18 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-db86667f6e86fd91559dbd589f8ac50c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-862e7aadee53a25ce8a1df5aeb530c1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-034589c05273f51ee9b1655605dca771 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-375cc4c12b69be81d2d5ac82278d6dd7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-07c12538ab99b373cc4b67fec9bf9568 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0efe185eb0d9eafd7cd87b05d15a727 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f080315732c2a06b38dfa12e718fa36 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-478671a85c7f4e3d56ea026b2e8099ec Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-73269c59ebbae916e28e96700dd9edf7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e34db91a3282ee598d0015a901fbccfb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6077c5114f527961f99f8fd0e65995cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a518294bed6796b7b72f7d78a3e47938 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f982a38dcbaec63744866191b8c008a4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad947fe44cfc2ed2dc3d84fa757077fb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c8c605f912cb9d80aaea7ae3cc553fe Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc62e7ed72ef59fb41fd542c2e3f0e67 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c28c681399422ed9902407c6c3d66f5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-afe67800f331e3e0df598ce6324b6e48 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37a6229b8e648d9f766bebbae597f1de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d56c006657165c6928d5caebb194c98a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d5a4d08d32b08efc45ad354fca667cc8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f8bb1f5e9c7d0cd11f1ebd136eec403 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0cd34d681f1f2729a70966f753595bca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-be314a45cb84b5d5fc277941347f1f74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1ff695f9598abe4b41e113293205db18 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-318093369d305d1a4facef47e10cffd2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3010920866c7a0611e0c25ee08f5d750 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b5d78e6ec806c9ef66eb2497da292623 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e9fc3345ee3abf264d753969ea93c5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a287be80dc4265487bca0631261daf94 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59a8f19b20e9599f574b164887df9d4e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9d1f32d205a86fda0972be20b2bcd12c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49f64c8ad4f743a291defab0c6682c9b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f045f7b64a022f6e777361c9eb1f6ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-90c1b08b9dd2e1536529c892e401a2a7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4cb207bcc7603eb6652ab6a5691a7930 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b9069107b636f69a2110f7cb83f4c95c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-009a78c3d99ffd162affb7d1ec63e1e9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b19006bf73bda48c82c5a95b73b5a54f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ca76de65f80dc0df2fe9131aea5e2a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-648da903fe4a90b9bba47ea21727ea4f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25e99cd97d6c00ad5bb18eb8e91327f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-130627dd74cdb051c825a478af31d0a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1842e2ee622eb64b8ee15d6132990d95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aa832fc54f263c99d03aa3eacb1b6dba Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d69cbf62c7f87cc4a036672692310f15 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c06811bc1e9df1da88d970991530f1b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0438a1fb3ea2e19b20b6cf9d5aeae5f8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0bca5b7f3c9e76d3dbce444be5b70c65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1ea5942cef8404bb3bd4ba6c3ddf951e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b2ad0fcb52aac195024b5a0aad4c6581 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b0afa72263f39ed0fae6544e60efe297 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-10fe7b356049a7514771e00949bf8f8d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2dd2bad9efbd6c2309547da11884345a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b26dd234ab6431e48570e5e845e8a0c6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7aa23c33c37d248b56e135a3a9eb206f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e9ba5f1c39a9897e28c38af1917a5a91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eaaf618a321bd9716d2bbf056d93a759 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-74b5b8a329ba2a12091bb305b817d088 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5856ca7704e42d93ca214a99bb1ac623 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-586476bb98e2bb13300ed9e03cfd4a5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d8efecf7993afe118697d7fc6df0d46 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e256e521241b68844c10d16d73bc8de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2ede150f2ec5a76e5f24b19077a93b5f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-731c98bf38bebaccb200e112c0119e83 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3b480a11371f5d241855a9dc4de62f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb15ce8041a7d745db2d7488d8364c51 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9658079b485ffa3951eec1ffb8958b50 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c044ef90aabb6e4dc13ebe70d156868e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d38e05d91fd34b3dda10e770d3c645f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8042a0de15f525cafdb5e9b5e6dce286 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4aee71f95f13a077ccfba578542f995f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bc824f493a22142b0d3d783dab2fe364 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d92942650ce23a996caedad8dcdbf505 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3ac08fae17dc0e1e11a3571b40076f37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a44d43e5ee8466462396e5779a70fff4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f293a9623b2da0616247a853820dd0c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb5767fe857f61214bb5ee14dec2dc0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49f92b3f5a9e3f5930d9d1178a19cd5d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5259c97e4dcbc7d2d4126df8b54ee476 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3665ace56834cce83b3cc3818fb67bff Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03a7cd90819e1a9df8c10df9ebccae5b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a5902cdf17bab7033a59d04deba0a1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-40edbfe300f25f3e3fa7079e91db743c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-522a19c4f2c9d4355abf65a06ce155ce Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d2e95da2036f34754f865fafc5d5adc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3614c233023c02b92716f58cc9533aa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6bf02066cfd00d236f522917d6bc85e0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec00bc1c33c7709548f9f0bb9f1fbe3d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3b19086b260c4b06d1d7829f39cb5950 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-850a62e96a70938a33158a0de7fc8109 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8233cb5e81bfac305dc9810b053b1291 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-905d9ebbc2b8743b9a3ab81ebdd4ff34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-24738d888ac16d1cb54bd1705b0fa7b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f85e0b885a05bb5abe0901264aa4e6c3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f15aad7244d2845699d4d3cf2aeb669 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d57096083ce28e069b0a67d74717299 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-262431f88250421e20f5b884985edbc0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-30e1127eb3708a82fa86b757723d86e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7f0de34d3931b22295eaa7c2877c1fcf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-80a7b98bcd9d5fb30d0c0eec9bbb070c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fbc2266f1722e7a7a1806dd9227ae527 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3261c617ef7ddaefcd09ada09e3d7da3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c81a11438334c14b3f1406a43f079ce1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbcc50eb7cdaf3932f04d7999939768b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b913621711dd9cf95cae580f34f96cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d21ce6239e79855f596f2f2d5b2e91a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8b02d2452b5cb3e2dd68c195749419a6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe9a65601227a63b0df39108c5bb9645 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e97c6e0b9d2ca51b9acf877f72012b3b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d87d8dbdcc754eb510506e27aed8a55 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-08e677bb59dc7c83deceef460860c6e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ee5f2c02590d54e81cbb7eafd745dc76 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a2af3b884c8a9407639ab5267846bfce Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-770a09ac440a57b9f887f4e3143fb798 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dbfc340bc1c313dc844230585397d490 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33cef74b1afdf8cee9d064d97cc9f71a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54c227d8016c5e126e89a4f810ae90d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-588141d3744a15eea040cecc96a4e3de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7cab6ef0f588090395029edfe9d6df4e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8478c4acb61747667996fe5ec47d4b02 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b49cf149dbf46d5839ecabdf24ae5ff3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-762f373abcb9b565337ecf8229cc777a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-943d3d79512f289345181f3c610cb212 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-228d0c286ec66d2064ecb57b9ae87ab1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1130658dbb2bf3d1403b00115ad48e90 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0255c59099a14fc509c6aef69cc13281 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cfdc2c37588c9990c6043c64df04344b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb186ad08c99029ba60adac2d51e1a14 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a6df4a3ba581f3c677aaf3fe016563f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5739228c7d1f664c81d9a1fe239ae34b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-56f8821eda1356271f18041b8d519aa7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-152ba9efd8cac9c742d74f6473c18f12 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b395c228bcc4ac9f4304fb9c61f159af Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d93635b5e11b3321ec262363a06be23 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-74c3b3ad88c383b52648f52f302121e1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-168b4731bf394e75c7dc1f45760f312e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-04883750b19a85b18d40f10f76d77d3d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-39a92bcbf2f99a1f6b3f646021da4a7a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-127fec65f4b324c405d05cbd920f4fa8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fcfef31c08bd5fe3b8b8161367f9d537 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9f9df722b0ebdaf935cb3b952d8d2544 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a73b8b21d622b9de655e4a3cef3faa1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b2abd1c4199be0cf9ce90bae9c80ec5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-de362ba325bae744b72fb5968afa4084 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-628daf9630a69e858cf17f2eb98aca98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dcf61c88cb30ba80a15f8c54ddf01532 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c5586ad3fd888df1f88b7481ae55bfe3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e15027aaf29aa053d9ab5b07c0c347c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-11415dea8cf417ba1505d6a084881d78 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5713fdf4461f30a85a7a7df8d85263c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-296b81d17f5edb9f9976ea709ff383dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fa8ea3cbaf72d330cc7a622cb1eff5bc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-be416e6f05225fa83348ecfcec73ed0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec7bbdd58fa5373df958c4048a70e996 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b3a617e124942117d0772abd2511cbe1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49d85a5a2b416030f16fb51f96f3cf40 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-faca0821ff3f65712e53bf289075264e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-481b403f37cd85c26894584cf1609816 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2bb29b3503a6b1874c93fb2c0a50940e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f194f9a0e796041f0ce0068a21d4c6db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d1b08919a9887c2dccdc3fdfb245f79 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37729261926bdf364c09d58e5c0ea580 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9df5be938329e1af1283acbac9289a9d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-55f6ede84f45631263e37aba39384960 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f07fbf3931aa476dd54c370ea2379fe3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-01b9f719e29bd40dc367e1a7f74b5ca3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cce9d78d9dadcf731cb6802b3e224153 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dae5e613cdd3597dbea849988e441e79 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9105e40e2d37d12643e6a6a052c1f15 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3dc9b20d1457fd082a04db30c97c0123 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-28823f854965134386adc4b6489d005d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8058d5cf83399a16e700b568c8d86943 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e8fd95876b7e2fab7616c88eb96283c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f499e55d7addf9a0ae5da9479475dcd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8923ba99adb3bcc2c04bdd7529111c8c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7dd906f4e00d15c0bd1125a645382987 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f0b9c09b00991846c129dd62a292162 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ceb7ef3acdd4d80de74fea0c9fb75830 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0b283bee1ce54ad41f867683a354dc1c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-299dc1d23faf00c79366780c3e7985d2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76971846a24f5a77e89daac725f90190 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9ecc4a6de9c12d65d54608f126af8f4b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-378941a1441cbd0dd3ed8fbeee57d897 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad1078f23493211f520fffd0e2d85c5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d826c778d7ee34b9ca526f991d55fb19 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d7f55922c35fcab84d7c2622fcd4fedf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a8a3500503c1048bc964facc61c22269 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7aef62ccd81e184c1b71065760ff3e48 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a6e8bc59fe176dbbb91c343b3aacf7d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef8fdaf6089ea1ae38d76c58bc569148 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-28949f58968ef1b03547c98d040bd199 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-906822ef09d255d5078ed937ac55007e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-961f9e6a1496794e25688697f228ed0c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8fa4397b1389b2cbb375ecd0f8bb0e5c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e287c280a0673501ec65fc7ccfdd54c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85a707fb70cb40c9530c32b2b968b03e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85170044e8edd5f1ec19cc062e25a117 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc9c1e46fd671dc56ab75db3214e27e3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9614a2ac78890dec865d36abf0dda8e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a9b943db5349432c79f873dcfe7b717 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc6e0c409a1195b04b3cd30e3b771e01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8124e9386449ff97d7ab87f21b98bfa2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-15ca0c0e5a5a8104941aabfc40161f01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ba5ae7761f4493af245447d43d0a5e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ca00ed03aea00e2251695f75a3b1d0db Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec3b538c57ab4afa6821af135a201682 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06d4abd5ebfb2677832571aa6ac88aa3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8411957dcaea00f790e715c8548d9a4a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ab0d2ab1b7b065f45507a10449ed0c23 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-08095ffc3bb78f90c5bb5d689b66bf33 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f9fec2a4a9cae15ebd7af2013a64bad6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-852cc3714bf1a0c0e5a9b21e55eea0d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f36eb8ec16284ec5c88ad5cd390c287 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e8884a5251411b3e29f35eecee6e4d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c22a0d7b81262be25c354af16292f20 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ed8af6711cecbd76bd6d5d9ac96b27f5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f9356c8dd6a1b705b96a432d5d0d22b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c28e8ddef54ede42d9957f32015d30b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2fee4e4b860ff4817249ec189d9476d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-65ee09268f14eada7e8815f00894e830 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5bd90aab81c8b4176328b7d779aaa905 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-425f6ec50affb9ae80cfb8538c29f108 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-981852da0e088dbaf9b542852daa3ad5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-be89ddc374f70c75ab331082a18c1857 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-986098b5205a4aea1b20e47ccbf399f8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb8865953af4bc4d1cb5722bcf12123e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0cd5f29e87ac1aa688316bed276cb30d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d95e8496bad931eb9c39003cfd284939 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-761144b7a8d827dbd04037ff698b9baf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb5832cecb7e571eaf3770ff3ab010c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eebd584afea00ee6412122cf9854691b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d5ebe71ac4728e03548165358609f62 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-75a4c896617dab427f9123968f0d14e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-00128d247a1c0ec5cee15663f2d25998 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5c183676f7bf736cb32f7d5591aacb0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f6ebca32c9fd638e2a4970892b3e921a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b5768e401fa2355aa41b28060e83253 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ed83989e4c17b27be99361210cced46a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-414042bc489af58e7146a52d832d600f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d2c790f6d8e5c69ed7cac0c1ff623d7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9c4c5537eb8c79f467719da83428aa6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e69a758feebe186a825ed9c5b6e32f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36f79b04f3799e94582cb8aacaa44800 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e564a93ba24e68b9ba4d8f845504f65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d755ec1cdf314f9c0313dea0bec26599 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4b899dd9abe8dd8a0351489c20faf34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-21cb52052fef4626eaa968df7c3b0f1a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1af64683fcd36dc36bd4dea7cd958f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-27a712bfaff0ec1d42b41ae6c1be67fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f97cea0b36ae07aa33fecfbaf2db28e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a2cf3015930e7aece5f8a96ab50b8c74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b00c34cd19d1f9207948df8ad55ce6a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a666e7f45f105a388105533a15e190e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1b9f322ae2f47846d7d9dff4de2a3678 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9a34c6f411d23b9ff8722c1fefda3506 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e942738b76a9d18669cc39e574d1805b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7cc10cd64f8d2d22c2b9942d5331190a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7c0df815da4e505d0bc2468c781a95de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b2d9a69db32f7694009f20b43e513d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-072ca978021fef5739423860a5e56f83 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f7c35c62f6844da2fd838264aaaac4d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-11b9e169ef38f13fe7275e18945dd047 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b4a43ba55852ee89333e1dcddac20035 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ddbd79a296e8e5c2580fed6a91b0e512 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3767ff5696a4a9e37ef79b94401fc992 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e326ae34e798b2d3e640f0fc5438be62 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3a98de56719cbdbd14e434ecd0210ebf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e407ad893f8a03a458d0bf6a3ef1767c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e9f3fcd4a06d9816635c61715689b55 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3c862d948653ace8425d632a90e076b7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3fc328d3d7656f467108d58a791a0cbb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-29a69c80182b257e018c7ad3f6e2ae0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-59d8ee1dea42a779c3368a5b6f9b848e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bb1db5da51c9cb1051802315030a422f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e4581b7cef8227e5910296b09aff413b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2b7f61eaac057e81c4bb2535e57c48ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-097e3e19384229f6dca1e1a30efb45fa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2aa45edd83e1adcc03ac8ce1cdde5267 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9e841aef4f257e03b5fc9daf05bfd05f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-63cc941c5483012382f8bc574005ce71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9ac7fbc8742dc2e153015dd0b5a09a4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c32a943e05a901fdf5b4bb280991be01 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-451d055f64dd9b279aafd8afb6fb0380 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c3bd91e564797b4fe9927252d2967b30 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-16f35569da6fc3d07235b9f099fee8dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2859e8d64d1a6514d49d3836b10a5108 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e6f081bd4f5e9678df08be6286d1fd3f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc1e2b65826a1a010c965c0e5d94866a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7dd1a629680902f096814bbd9271a7c0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a6542feded1a4e68fc97b913c4e8976 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7f5373d31f2357a79f29464c0b100790 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c23516d5a45962e9b9fe81bbc86f91e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0649faa2c0390a66fe0ba58e7645114b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-afd1062fc19f2e5de78eb1a6dd830211 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ff3b45ae7bceb632d50811cde2ea62d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c5c61e65d68b9bfd326360e1b363be9c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b05484fcef62bb50327d576f1126b6ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d505afdb4f884b8fe3ca206da5003500 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cdfc46588164bfba5875336315241147 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aa6f41620036fea53ba3c4156c4287fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d7fbf1f52e9838aac4c4d9892c19aff2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-db7be3c6673f834fa983b3b9f1029267 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ef35ae49a3caebf2673d012c2b0de2d3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c88fb5ee6fa77500ceb91444def5c8b6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c7da362c4b77d193aa6ccb3c136348ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cc89a420dda9299e3261daed70f299d5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e6076dc38b062fe720c18403596de9a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7427a2def1f30408b4778520c905ec32 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-361f708adba35c11745707ad69ff3dea Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d9ed226605561f94bbd6f955f7b21547 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f79d1cb55d82582824ddfae07303305f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc1c8f9200601bb8a881232c0c18f586 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6c587dee7d1453f17b960ad6256d31c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0ba15a099671e17880ce6b82d8a133c2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-89ba06d1de09272d29b4bc0c3675eb1a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0dc419f509547ba1e2032f4e3885e7b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5da987bd86a74fccd0c683611150cc47 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-21738c6436a09f247089a27570664f1b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a47eb806faec1e4537029b383968e73b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-beb169d4dac54f673c749531c9b86019 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0a6c27d5f26a2bf6202c45c303bc5c67 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e69848ef6bc30a99d7953f4586382928 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2dceea447b9580a69c4430d110321410 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-caae1e43f0ac4670005044f8822a21cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f565dd1962ad225fc4649b1f04d626f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1b9b21e4cd3bef31f43591ec672942de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7a11abee964b90481779c28dc57f62c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f97a6780e6d64c698b0a7d03fac1f2a1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dba6cfec3bd0636f1500900a474e1d0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85df6366a71c1dbb9c29d0ef538367f2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-766b23e8cae214ae44c8d9075912c955 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7d78e9003af631e8dd6f22bd1b7f9cb5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b34dc33c3ef4d5d036b846f2e671a6f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-09550044fe7c2ab8550bfd1c40a6997b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c7293fd54a7134c0132ac239e78614c0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1a1fe83f094feda966bf553a845a6f29 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-daa58c535e92735b7ca6b4aab1db0a5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ccf6b370c6220e586b9db21367c8cf0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8fb25ae89d3c5bed833bb4deaa69bb08 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3879ed186e9805f5a1d645e7b9778f84 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8f5e2bd601b6c4a4894c7caef6266fce Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b1536be9ab810845447bca8aee5039b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad0a5645cbdfebe36f4db9a8d2c69e46 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb8654ce91253a1fd58b6064a0cb1cc3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-140c8786b1ca0189b8cc38aeddfe1391 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-102654371da3d64d5f7dc0746d42748c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ceb6eed16f810d040115f2406760d480 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-69260c539baa0c48ebcde54afcd3cea0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bdcf3068d5c334355863b2146be92613 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06b715cd25add8cf9000fac7d860db08 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f7b41a4524a8e99434b10833272aa3c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3fa5d50472843ed1468f984c89c7f317 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3074321834c156374f6546f0b8a279c6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1a7f5ba81a196ef9bc48d2c1050b81f6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5b1d39d34810ad83bd34f4d51f45fb34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-edacbf913139cb8d6e7e850366ce3f12 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ec3d97078e42a1db873dfdbb08f91958 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-baec8af183eaa96c4a7ecb55b74b99f7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8becb9224ca238767ed233b7e5961a6f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1158d34a64fdd44fedac53ae53b18ced Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ac0b28ae6b9845814da45900700f403e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1bc692da96d1d81157f204bc31800443 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-07e949341495eb6aea7f305501af0706 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-52a3fd7593a887e5e2bc84841e5d4078 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-43133a7320b70492c4d4a87d34597c95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a9a272f79875b267e0bd5b7b25f1e1f3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3d13a57b1384bb51a052b5cb5d6c6f17 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aa3c2b316435fe69b72a4a41feb17509 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e2923b5ddb6b03e6228c09866dd11169 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-72ba196ec3d529a5a8479c8bd8ccde86 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fbc8c451e9d3a8967ebd116dd853e6eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-674ef6e00d4a5a8695afd38fc66cf51b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8e344f38ca25afc552198497180ae482 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f1c32bdb87c8d5172afb5e59d7f2a1e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d4f70ee78a3696c7e7c897a435683c7f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62cd74b9d23c755a1192831833105aef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fcf1ed17104be7936210798237d3d694 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b7b6da36f65fe52992e4b567a5afc10 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0e220350c6123bd53db5dcd015d8cd3b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1becc73364cdb215b2f61c8a637472a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc5dec015132094e2734235284e86689 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ced1dca1599528a5b9652ad7c7c8378d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6aa34506fa972d1918b610c16887bb37 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1293c40b8e38a9ab710cb99a307ad0b0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19f7173dbceb18e9fd468a2c0b634455 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-419e4fe55221b3b60fa957d33342ccb9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0a612a2ab2c5db39dae5375958baeb7c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9fcf4cb895f73a2cc6cb3cf4d2627b5b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3a7e8838b6133d84d59f93c6c672745 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-99cc1fa586d19439c618735bb067b37c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-174ffa753e038f927cccda145ed0507c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8e9ee751a661a619d02c96df685c0c04 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d6dd570556ca64d2a8f445954558ce13 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-edc0dd9112df4c0dbe4b8f03866f9381 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c846c32733c9f86323e263f0ae951a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9fff6ff9db1c283f2e48d65302b1ca5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ac8453fdd8e56b5dbe225e4e0cbc4f29 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ee0e6b3e8d39f18683ff3dbd621adbe8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dfbb4094cbb72d62d8c457e8ffc7da0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-301cfbb8dbf3533859c1a77e7aa6cf98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6748b11a882e5bca7a62f138744d23c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-877c8eec21e9c8b50518fbe6e5e74d5d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-84515e169e9d4948eca625dff3f7e33e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1cf20a6c66ed4fa75b00063fcc1388a8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5e8cd248ababff091a54d999f38b3f3a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c1679f29efa8fa0f189a503f67642234 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b8f10ad38a56fcb4f1d350c151282502 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f99f823c2c3b54d215d2967bfb2c6545 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8043dd78b2baa1a74a6ca88c89b50671 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-968c4fca76a9952e9836a059eeb696e4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85cb31b247f1b32ccd6d88cb8bda993d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6cdfd772deca66d0d03d9a0a715c5a0e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-837ef708ddc07d258480370833f5d127 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c60e406a70c769b6923a6694878521c1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23307459525caa387bf74b6b933e90da Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e01e730429956c774440c1426a17797c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85ec683ddbf22f5feae82451a5fa6c0f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae5ad7f4767a4771fb923ed485636411 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-aef2796b879ebdbfa4bcc57f10d76755 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-66d27e4f4a7cb463f20798c03513e7df Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-faa6d81e1c9ae3a0813c1113bd94b7cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3e5afe2877a51608297450f1b6c1173f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-34977f7dfd409af6eba5905299a558cd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4f1819a74bb6869ef4b9e8347260758 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7a279c283019a1af590a74074869d93f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e3a6a517f949fe5f814bb5e6835a18c5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-af8e02f3cee605f60a64417af85fe8aa Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c1eccda44d2a5f68573f70e54eb55526 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0a88b472bbc1c6de4f4e8c6a387324a5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c4c32314abdc7406cb6cd9e6d892289e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-23224bcf827c915edf20098a0f13d7b2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-03a11db04dd6567fc131ff49fceb3b4f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c647f3eab850c66e0151ba958c1ca8c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cd775097bd862f63292595240edb034f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2a915ee612949ab690ba843be5b0ae6d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-62faa9f6639f9f09ec1dc26522f19203 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8b3272ee6c8350e3fdc0aa6fea986e77 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d550808e02fe2c572323a3932f727dcd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f151e31e3fe8b1ce8de428a4045cc48 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8372a297a8e8715a47c2e4904224a95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-85dd643fb4281717d0c3de0aa3ed60d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1502208019b243b5441060f45a176589 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f2521bc63489e8a6fc4b8e98eb838008 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a4babab8fb29507fb4239b71f2402ef2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0ece63570f7e1b006b05b50d67fd1fd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c89ebe949d91ca60e4d67e64d10e086b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9875f58ac89fe9b7d4dfda6ebe45afbf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a2f64805eb72d4f662f5c873b48193c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-61851e75dca53fddf7ea2a3a111a09e0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d7fab362574555e1f1973095e9378d4b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bcbb1ea475e614bb1321c781c5c6d52d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-33a60151083e409b3a108710af1cb776 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d2fc4a81bf4dd8c4e68892356841068 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-573abe3e054d390cb62149f9511cc2a3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d404345ab1c05cfc8dc31ea02ae46f72 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-25b64c07e184fce00fc4ac506761b11d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fa1df65a674fdd530e35b6fd5194157f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb20a8d9f01191aacf072518ee4efd24 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8ddb0a049efdeaa31e55eda3336d7bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6e71f0404e90fa56baf9d9df44e14ed0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dc66f1b984e2d576d6b4e871552948c8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3c192261bb236e21f8a05da043368ba0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f6c21e7ac290234709840d9351f4c73 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-adece13d70ca0ddf763a6e1c6f35ccf7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b355c3fa54a1635ad99c8dc773c0fe60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9925f4f200d698118bf595c7b03e80ef Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e1179ae63ab44994eb8d975b2fb0b718 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0abe2fd7ae3d3e90ed708bca436a91ed Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-891432519529b3143b7ee99740992889 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d0602e050e87f56e73f2e80806f0c01d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0fc7df0328d674bdf12670556351fdca Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-64a3df739d96dde94fd6ab2af7d05c2a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e91930723d1a9e788b4bfe51f061f929 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-42f3ad1533aa63e81a20c5e91b117846 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e89dd70d893da87e65ad60e40403d36 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-73f1e8564551fec6f3f530f1490dde04 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-641b9ae6da7b42f7ebdfa608f0f454cb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-faee37e989e325246345978e31bd0a5e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a1d9228770fb960603fc283eadd164c3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-80d37337d7426410e120fd88e073993c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-96549f14668829240aa34b395ad642ae Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-657a8ca51f06c49c69f467ef400e4d58 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-909d2851b74a7d7e2c40bee09b24cb3f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-befe28d99ebafe649aaea8d7c0bb448c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d86a22753815bec84b5ed7dec16912dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4ead234c908c6e4824d15615c1c1226f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c546c1af22d31d27dd0fcc3af31b946f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4df286aebec83cd1ae34c5e5bad23907 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-efa37e54c3ab971456aa3aeeebf6c33f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d06c92082191e945e712f1d7b4f865e8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-86d44c069e5329e7b724a30b2a2663ec Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7b8387af42838eeb60ca34760268e3bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-dfba1501a902e88d1dec9f1229839211 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2cb86e87b3937b2e2daac3b70041aa91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-043e53a5012631e33dc7d3e33421ca48 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fcc90bbeabc77800819c9db7dbf2e403 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3275df88f64be13c026d7d2d4982d8c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d7f81c718bdfb1e19c61e765dd5097ac Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cb1021d87a21c9feb7af3fd344d5074e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-696033fdd3eee999febcf70ed2175a66 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-621f8c7b42c289a6d5583adccaf6002b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-600a3d4b753560706a84e011f2c7696a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2c7f355c2bb139cb52e26221b15bfd4f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-bcff777216600d47dc4dd780ad8fe6c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-14673c8ed527b40d07ecba6758840e16 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b41155f6fbace65b60e50dd3317641d9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6fec993cd0ec2c1eb2c72d789c5ace8a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4d93cc8a7c731c3f03f96904ebc15b1e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8279284c7ac4fd28e374988851578d8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d50353445b4e698ed596ba971cc2ad5d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f1019167466a05ea17a51082d571e309 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54e2d9e57f71dadebff32d645628d460 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a5350a032888b36266cc94c0cb6029e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a3df6088099747f43bd55fef89109a9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-297dfd73850b302fbe7dfc77ed732efd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c7c24e4b4261f82801ac3052fd638848 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f327b62a0b711aa10265fa1cb27dae4a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-164fa4afff5ade160a27aed3cd7d3ff2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fcf696d6e38a486a6f5078adaaf9dc6e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8a3420dff8381f628662b451e14e7684 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6f424a3e291ec25ff25724b77dbc0f14 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d7990546f347468a06b9e4afe3993a4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c4993bbce8b7ba85bdd5e3682487ee9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a04a3761e86b03289e21d1c4ffee70b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-483605481d1c5168ea6e84839663868a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ccaed5aa298a241c07661a8b900155fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f1de2f348bf074517b519b7244eb499d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1d1c72e7f48b9e00c68d67391994df29 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-eb5fa08056c0ada197d62295958718af Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-196f08a620252f626b0e1f0c25408e71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e4e2a1e9d49c960e50875f5d75f6501 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1f9c74e25b57da12f0430914f1510a5d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d5b19a29c07ac86d913a3111d9ec0976 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a55c240d48ce880fd38d986c8d29f6ab Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fb403c335dcd864764ff3fa8f3a881fc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-64ebbdfb2e811f16b1c36116f4cc25b9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-652071f99afa089b7ffcbbe416da588e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-534302a067aa92e5d9d5f60e2ffb401f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a5a524f7745d46fdcd9a55294725dc95 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6608a1f450f891b50a38ffbecfdd9281 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fe8080e5c516119b1fbbf2326ea740d4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b451057fddcd92c7d33e593532c6d1cc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c0f78d3440f8370104c36a5316e11f63 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83b4946e7aad7a00ad24762aeb80b7ce Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-76eac60a926cb481699cdca7e23c098c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cf5a968aed9dfb53981acc00257ab7d4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-145ad26cbee9cc4af05b04bc7eb26621 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3869ee92729ac92ac7685d1a95543a71 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f5ece02c4b55e62f92c5a4ee89a9b011 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7db5e2599a1d78440a490cdb3f45fef6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-faa051b8a802b11294bbfdd057d3462c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-0269abd2cc11ef296eb618c6be08512d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ae8464f6a31502843e0166390ce65793 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-80849fd287094c2ea7834be43e2b5588 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad2a149aa6c6facab27c79cfb96a7b20 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-afe5215f6889b71d1582ced3bdf81589 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-49b1b0e36d23a4ddab0f498bd42380ee Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-547f473c5d97d0c43daac3d31745a291 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6d7b91cf0ed8962a285e8b421417120f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc3ca20b003ee73f94c2e6cfe62ef10d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ac1d9862cbc4fb4a11b31741f5ab0d83 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ed17f396cd4abc7f48938dd7b9fb9b53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-13a655b2f133ff021a7b7b697562a2f4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4a268b2b8027425deed9cedb720c3847 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5348ae56684ab202c5a656c17604709 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-54009e9f132e4d2f25ef07a612f3ac5b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c757d565b2c4ab1d444063f3fda41356 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7ec5fc8bb3700c7d01cf3f32c2836bc5 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e71b30f899861e99d3787a61205c6f53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-be7a8c4c03387c956c725e5bdd0e7989 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5f388a3e9365302d720c36f946ccb4eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e684e120a34cf5a5a41cd447bdabf94 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3cec3598433b37dd2a2aec66c64c3fa9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-441643418ba659425c469208a542bf75 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-11e35cd34c2bc73d5a69e461bce0ecb7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9bb7e34a3ff93021ccc1e27b8e59fc27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cb31bc0ba445743af1fe225ae1b0cc74 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-adc4f192546300da03cf2415152d2bbb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-75314f0f248d350f537cb0246a115108 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df03886adf0177e568cc01f20dfb0e20 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a5d39215fca8b6ac73382145928f3f27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-20db0b19d4124f20ac1d9f8b8836dd44 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1314d5d4e419e9a7b1fb115f5c9a7120 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-06ead4cf9cd9390dc02f6aafdacf20c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6a056475c05000ddb419f42915a72441 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-068d665b69999d1ca75e60b2469afade Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ad74f51cee21b1014d04f943ce45dc39 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-312a42486ddfd30e948bce171561fd3e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37dc5c3120cf51d1313f4e2565c3ed41 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f4fee19b3d9721286cd21e0dea9024ad Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3833ae22333d7089cbaa3e726d8f933e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-cd3c1efb7115e005b21514e46fdab733 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e7b03521bc97a9a678c752437d0bde30 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f8a2c68d1f4eae552de81cbe61b4a6e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-94a170b8532c67774ad96f211332f401 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e057193dbfe88c9255872eb89729f27 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36c6b09be4f1fc163b1314fb3573bf98 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4c326c4d5f4b188db0796dc5b3754c7e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f33d6f42db7c2c7c43a542fb2f513a11 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a801e3a516e16477e05ad29363ab6f45 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f24ba258cbcaa544d1ca2f3e40d5027 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7c021b5d4320663f803377493c8d504a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5d1bf1552d925272c546032d23b7be1f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e36fa13a7be8b68e434357668f7ed1dc Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-641a354a05af9a69ad46c4eb004dc3fb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-df8795473653bdb76aa97539b96dd00f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-83aa14a675666ba0ce8b581d56935392 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c63bfb41ba164347f569791a235a7697 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0db6efe9e070fb2f1f7623a31bf0c4e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fc12a6e56b38c8d98a1b16c59c0476e3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-29ed476790decd28790c09b87fcec3c9 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-19301e356e307619a1082052b411d675 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-5926938387dfa8ac2cf1fc81e34022b1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a8069860bbd916bdc67828e6e77bd5a1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1a220ea4030ec56143cf2730bfeff580 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-37306c5a6dfca6880baa1e3284e608e6 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-959e6e5d6c3304cfa20bec3a95bfbe08 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e695675a66502b004ef2bf341100b15f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e0d926126ccf87aaddfc2456316b04b3 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-b75665f43e2a3bc44e13451263893a60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4f852d194b9483fd151d9826303d1c5b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-91a894065136b07cc768f6069540b906 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-fd1848925d6eef4ffc9157c6d7482b5a Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a3e818c086fcb1c815470f3caafe0778 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8041a9ff2e147b3519e48e0e67a506e7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2a960b86d01480dd6a5fce54188206a1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-947d40b2e372e07af36c00dd2f279c65 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-22e885feb4b97c84b187a94f4e820a34 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-caa603970162ce65be2aa97d3b1eafdf Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a5dcf7837991c3e4babf94f084eff605 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6b95d14d67844150bdeff76c78ec199d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f3c6eefea2bb664bab139a97280e92e2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f89d3981a3ca4dcb92dd35986ac21f1e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-6cda4047ee25c78359c9d4c578e662a2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-159faf4e0ccd18eac983e6519ca9454d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-997ec136c17c806c255a7394ba44c0f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8abcad37f7a45dcc3fb542021adfa8c7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9020c31121181afa0241b43672dfc1eb Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-45b53ffcabc7280282243c9fa2a4952e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-21af6fbf8d1ce1f88d78eeb61ccd4fd2 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-22f38e309948590a4fb2b0ac1ac558dd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f172d7782e49aa66a952597cca7e51b8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-da23fd664d2a9fc278744895543c3ed1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1641cb14cc46725bde6831ccc23dc087 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-73eaf3b854871c774f0892bb95902c82 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-970c3a9ec172c93d0015712130cc5e55 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-c925c6bd72d1aeae7920e0fc363cb938 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7c443118a50b5e917ae7dfdc10ed8276 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-745fbab9ed046adf2a018c8f1341f2be Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ce949ffa13f972ddd921a0a27074d0b7 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-71c3c0a36a88038805fbdd105744ba91 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4aee4713f8a2b15673ab111a63df3160 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-d53b113211a82648d0f928dcf2c17333 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-3f83fcca737fbf345fef6588da2759f1 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-a0beabf28d579508580ef4ea56bc165c Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e5c9f9cc36b69b779f891e755e2d47bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-f0886498cd0de5588712c66c7fafe962 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-57c48c902f1ed2a1f6d673f25af5cbb8 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-9737ff2ff5ce020e46ce56e20d8c5734 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7e0367beab9fd06cdb4429336268a19f Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-4e996f8a1942482c532db2285942b47b Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-661b9d85cbab928d3693a365c888b894 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-60d9235ff7df8a0c004985ad3ad81e53 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1e70f1ecbdab506fc16f8de3e8e865c4 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-72a323fd220af7ac789032ba1198840e Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1febd1988689878109c503c8901302de Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-ced2763311ecf7af8b5416d6a47e5e60 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-36d6878417a6afb4a2ec43247e69b390 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-7f87f6e265ee264d9dffacb6fecce8b0 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-8c62cc0f149ea75626cb5000824f762d Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-1461c6de8ca242f0289c15f45bdd67bd Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-e0255f3f71d33b330032a2b116319b30 FileName: ./.git-blame-ignore-revs SPDXID: SPDXRef-d2f12121b1f712fba81f8a018d3dbdf4 FileChecksum: SHA1: 1b7a0a1d186f6c124a99e580f2d74fdcde33d517 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.gitattributes SPDXID: SPDXRef-b80370b613ecacd338cf9031f8f3147f FileChecksum: SHA1: a6d096d865571e16715d0a7383ef5f40b7254a8a LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.github/CODEOWNERS SPDXID: SPDXRef-e428a070baa59703cb334d6b1b2c72f6 FileChecksum: SHA1: 92b6a43c1ef57dfff1c0d9ff94ecd668594b0a25 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.github/ISSUE_TEMPLATE/Bug_report.md SPDXID: SPDXRef-2ad80fa918b303166c7cb1798a2c6c6c FileChecksum: SHA1: 7039c19cf4ba680d6ee45e154518187b5eb511b8 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.github/ISSUE_TEMPLATE/Feature_request.md SPDXID: SPDXRef-62ee00f1b137e1c28823269bcb8deada FileChecksum: SHA1: cbb9f82350a32f21f216bb021098bcf39d702467 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.github/ISSUE_TEMPLATE/Markdown.md SPDXID: SPDXRef-8364e97c6fec47d2cd44ab1bfa5220ac FileChecksum: SHA1: a389dc580a07ee2963fc2c7330514cac48c100e9 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.github/dependabot.yml SPDXID: SPDXRef-301ca705cd31b4b5b65cc8d208481ebb FileChecksum: SHA1: 2e03bb55827c218bc8ae09d95aed815d21b28e4b LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/pull_request_template.md SPDXID: SPDXRef-83ecee466dc1bfcce0c3a8ab6d4dbc6c FileChecksum: SHA1: 53c9189d5cf7d53d97e7546efd6924cc9eaba4b9 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/stale.yml SPDXID: SPDXRef-5d452b34267d6864b776965b208a5cf1 FileChecksum: SHA1: d7de2c232213d477e2b9b1fd7fb04266529a2789 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/autoloader.yml SPDXID: SPDXRef-9f2c6bebb9a555ad4d50f87f88201674 FileChecksum: SHA1: 1fc50e2c201a62c3eb7977d06172cb919ec63140 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/block-merge-freeze.yml SPDXID: SPDXRef-688a9cf9061f0e4f5dfe6826f1c1e69d FileChecksum: SHA1: 017b93fb1ca300ca3cdd8bead623190f84232d63 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/cypress-e2e.yml SPDXID: SPDXRef-d125dfa950950b6670fe7f1a52bbd2a9 FileChecksum: SHA1: bc80d5974cf2557f5a5f1a37e44d1a6670d11bb8 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/dependabot-approve-merge.yml SPDXID: SPDXRef-b83871177dd2d7a0b98430bb18f9ca15 FileChecksum: SHA1: 84292612a3b05c45a86b15aacc306fef971cea35 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/fixup.yml SPDXID: SPDXRef-b473dc6e3272e87486d2b4b1371b28e5 FileChecksum: SHA1: 55ab933ad09019d964a6700fb231f00a714d5b99 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/lint-eslint.yml SPDXID: SPDXRef-81b424050c42cd6e5bb862c24071ef14 FileChecksum: SHA1: 7374b572507eac1804c2cf589be58270a3795540 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/lint-php-cs.yml SPDXID: SPDXRef-c81b81f2e4813939ce5bf23acdaf358c FileChecksum: SHA1: 742d00003df505a2a8a9889d70602e50f1d7a823 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/lint-php.yml SPDXID: SPDXRef-c9deedb210298e3389f9912a08a6a8a3 FileChecksum: SHA1: affb2b6b4eaab2547bc7f4de498ca0c5c4401665 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/node-dist-unchanged.yml SPDXID: SPDXRef-1284edff68563e06410700a654e3234c FileChecksum: SHA1: 1b97a854ba6da86541c755d1e382b2d2897be532 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/node-test.yml SPDXID: SPDXRef-6f9bf711cd1cf7418e52ea297cc8554c FileChecksum: SHA1: 3f732d34ceab78eb68445d725f6bf16978b87dba LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/npm-audit-fix.yml SPDXID: SPDXRef-845ccd3d19de38fb29be6622010fd3a8 FileChecksum: SHA1: 9ff06a55047701b4b196487027c7ecfd49f6b4a3 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/npm-build.yml SPDXID: SPDXRef-d16263d1658339b57c5eed47a16fb230 FileChecksum: SHA1: caaf867aabb60050cdbdbf6f07a1150c7e38410d LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/phpunit-mariadb.yml SPDXID: SPDXRef-9cbe38f0b6ac52df57c54ddec0af2d5c FileChecksum: SHA1: 287f6f5c5c8286ef08fa65260be200cf4e52b3b4 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/phpunit-mysql.yml SPDXID: SPDXRef-977c188d338bed2a4ae06fb9ff80317e FileChecksum: SHA1: 927542d9db577ebc016a5e32d49623fd6082ce4e LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/phpunit-oci.yml SPDXID: SPDXRef-61d46aa68a5d69937783c7002f166b87 FileChecksum: SHA1: 5b5bb3552e890637e58c99a443ceea9c5ebf09b2 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/phpunit-pgsql.yml SPDXID: SPDXRef-249f157d34282baf58b15ecb2ea40dd0 FileChecksum: SHA1: 25b1f998094f44dbef322eb18d59f5b64950d8fa LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/phpunit-sqlite.yml SPDXID: SPDXRef-d56659aa4232e22cac7475ae1dc906cd FileChecksum: SHA1: 6582420142307a044e0c7698c1e39a497807a157 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/playwright.yml SPDXID: SPDXRef-37a70b57ebbd6db676ce0b58685cbcec FileChecksum: SHA1: 2fce70ffdd13cc5381e4a4b183e308c43a90d69b LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/pr-feedback.yml SPDXID: SPDXRef-08e3cc47e4bcc61be36ed8006447af58 FileChecksum: SHA1: 2513a8928a7e26f8218d579e4132da014b3efc45 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2023 Daniel Kesselberg SPDX-FileCopyrightText: 2023 Florian Steffens SPDX-FileCopyrightText: 2023 Joas Schilling <213943+nickvergessen@users.noreply.github.com> SPDX-FileCopyrightText: 2023 Marcel Klehr SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/psalm.yml SPDXID: SPDXRef-c6367b42327474f609d53e71c9398970 FileChecksum: SHA1: 24a50ebce0d4ae3046b3b41ffe04338f8cde514b LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/renovate-approve-merge.yml SPDXID: SPDXRef-762d5e66ffa1d926fc13121837500c3e FileChecksum: SHA1: 959e56c48ba728bf5b81656141f80caaddefe80b LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/reuse.yml SPDXID: SPDXRef-7dcf2064a8f70f76ccab0ac67b4b0d16 FileChecksum: SHA1: 150dfb8e8a3a6bb309e6aad3df1774497c623597 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. FileName: ./.github/workflows/update-nextcloud-ocp-approve-merge.yml SPDXID: SPDXRef-93d096f9e65a10d7112e416a3dd34a89 FileChecksum: SHA1: afbe685f73f6faeea0cd5754cef916da1febe02a LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/update-nextcloud-ocp.yml SPDXID: SPDXRef-7b51ef9717ff25116711e13031289e6c FileChecksum: SHA1: fc6fc108b0d688aaf2d507b246c0cf6f140defec LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.github/workflows/update-node-dist.yml SPDXID: SPDXRef-63b39cdba655664313c6aa84038fe70a FileChecksum: SHA1: c3b770d908667b437611a4cb1822d171a5575485 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.gitignore SPDXID: SPDXRef-04561ef8359abf611aef318f7a309687 FileChecksum: SHA1: ea2f2c43968451241d97a097b9b0a84efb159b29 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.l10nignore SPDXID: SPDXRef-c9891148d1352eb7da43efc1d515df66 FileChecksum: SHA1: 76d35a4d5deec2e0c4eb494885849d2f9e8e754f LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.nextcloudignore SPDXID: SPDXRef-f753c555c8a90bbff873de263632f8af FileChecksum: SHA1: bf5309a4789caa65057100ff37351ceebe1933c7 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.php-cs-fixer.dist.php SPDXID: SPDXRef-16359731e0d4d0d0620d7b0e10306b27 FileChecksum: SHA1: c0fbd8405c9098753e511189c1373106fb277786 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./.prettierignore SPDXID: SPDXRef-0065015f63f1d9836daa3e3a36aeca00 FileChecksum: SHA1: 412add41b17f8268c0c7ee09784cf65470f4cd69 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./.tx/config SPDXID: SPDXRef-e7a342ed297c82f241f90760c266841e FileChecksum: SHA1: 760d2fd02f7e5605721030015c9b4a0f3f15c466 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./AUTHORS SPDXID: SPDXRef-fc5706b4b5a3902aa8d92efda1f67b65 FileChecksum: SHA1: 1b1b3e5c9055fc38824ba6b01c8bf55e162888d4 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./CHANGELOG.md SPDXID: SPDXRef-fdc0ed7d120a94fb99f1af66422a3330 FileChecksum: SHA1: 46bb37800ef10b5aa35351a55c112a34b943ac9d LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./Makefile SPDXID: SPDXRef-16d11402699eae98929dea964519eb7c FileChecksum: SHA1: 29854c6ccdf0cd70eadebbb692129d7d67a94dc5 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./README.md SPDXID: SPDXRef-4b443ea07ced3e88445bb0aad9e7d819 FileChecksum: SHA1: c34c0ddd824aea1b85dbbf235b3236ea4c55d35c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./appinfo/info.xml SPDXID: SPDXRef-18161bb7652ea217635773f2c2b23f3c FileChecksum: SHA1: cee0a835d3883d636ac8b09246a1f342caa07e72 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./appinfo/routes.php SPDXID: SPDXRef-769d4c7cec613d086cedc3fc0abafbaa FileChecksum: SHA1: 22b8f9c0b763214c5a99c061e3fe7ba21b12103e LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./babel.config.cjs SPDXID: SPDXRef-6c88d2973342f9622afa057842106fde FileChecksum: SHA1: 3deb88c0e3cd36495488bb6db7d2ef127b4c0682 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./composer.json SPDXID: SPDXRef-bbc76d616dfb26c617b7e26b6fa50047 FileChecksum: SHA1: 16fe54e6a48f6dea08bc5e473c4ba4b514595cad LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./composer.lock SPDXID: SPDXRef-778c1d95712d38dc15f621a6d4586903 FileChecksum: SHA1: 0fdf03c4d93ae4a367b81c6fe1dfa3ca8c30515f LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./composer/autoload.php SPDXID: SPDXRef-13b5f5441cd979cb46e703d2ab09357d FileChecksum: SHA1: 077e9f7f697851690592b56570c0976af5f99e2c LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./composer/composer.json SPDXID: SPDXRef-36c73247bf9ae9de297f4d6bf16e1ea8 FileChecksum: SHA1: 095f4cdb723777b886d41852d8f41122f93e3c26 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./composer/composer.lock SPDXID: SPDXRef-bb4b085d197dca82a222220c8d46dcac FileChecksum: SHA1: 05028bb2476efa06e381763b6fee766e14fcc651 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./composer/composer/ClassLoader.php SPDXID: SPDXRef-a3a3d7a7ed970d05e0620ef5dea7ac71 FileChecksum: SHA1: 7f146de662b0599355b3b049a161e23cbdbbdaeb LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/InstalledVersions.php SPDXID: SPDXRef-52532090a2d1c26ca551f2fd528ff747 FileChecksum: SHA1: 83f18357495e7b5aa064f20620f6de75f40f82d4 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/autoload_classmap.php SPDXID: SPDXRef-64bb2dfcf5c3644ce740526fd8365332 FileChecksum: SHA1: 8d7bc5b5e80e7d0b13224f55bec4ee772de9273f LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/autoload_namespaces.php SPDXID: SPDXRef-2d026a0b57320f4c4ec7c4d27567784b FileChecksum: SHA1: 071c030c05ffc29437aad5f32c7a54fd18cace29 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/autoload_psr4.php SPDXID: SPDXRef-94678b5c2acf5ec3e5715a62422e0c81 FileChecksum: SHA1: 43c0eb156b6ec5e53baf440ca92a6941728d7dae LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/autoload_real.php SPDXID: SPDXRef-90f4d371215cd28d01c0a45d5b17c66b FileChecksum: SHA1: c52e319847f480d61576d0e82b8ca29b1710c772 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/autoload_static.php SPDXID: SPDXRef-503199a6795c21b38164cdaa097bc3f7 FileChecksum: SHA1: 0338c03c0e8acb2f9606d72f0c06d3913ee585be LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/installed.json SPDXID: SPDXRef-750502d199879b9e14405ee3b63c6797 FileChecksum: SHA1: 2b3b04ee29002560c555b2815e4500395e6e9d9f LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./composer/composer/installed.php SPDXID: SPDXRef-937ea743b8a54111f6d983e2e8011eb3 FileChecksum: SHA1: fa911e0c51f8a264b0628b650655f6c3d623dc2a LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: Nils Adermann, Jordi Boggiano FileName: ./css/AttachmentResolver-COOW49ao.chunk.css SPDXID: SPDXRef-c3e8d3debd5ec2733fe172aa1efeba50 FileChecksum: SHA1: 68d565aa9c6d44e34cb1956666196829a0dc6cfe LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/BaseReader-D7IW0ISh.chunk.css SPDXID: SPDXRef-6a258444d201e47926b962acde4b867f FileChecksum: SHA1: 390a556421649256abd1adfcc5b15ac5024eb612 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/EditorReloader-CYdXZK5t.chunk.css SPDXID: SPDXRef-aba2643863472df193d53b4907b88cb2 FileChecksum: SHA1: 9522fec47ab37c8623b975519d0d800aa8dcce4a LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/NcCheckboxRadioSwitch-DVdt5Hkq-Ct9ZGMmH.chunk.css SPDXID: SPDXRef-e8753000b00a1bb681b22b3365fe9b5f FileChecksum: SHA1: 6db39c0fd31667c9896eeddacd78881f44ef0c63 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/RichTextReader-CYAgF5xT.chunk.css SPDXID: SPDXRef-cfe9e55a037f08897c5c83b0dad05ae5 FileChecksum: SHA1: 362c075ed53f9559302a0988c99ee5863fcab636 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/RichWorkspace-CRE0vcLh.chunk.css SPDXID: SPDXRef-2f677b86f771b5e606c38b6269e1197b FileChecksum: SHA1: 2ad0de33c94ff0b4ab89035dd08a50c67d317fa7 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/SessionList-Ubst9stx.chunk.css SPDXID: SPDXRef-dbce26367e5d847d54fae7443e40891c FileChecksum: SHA1: e31f22c3bbb013006fff068a6c0b07bc2b755ca9 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/UserColor-CiXT4p67.chunk.css SPDXID: SPDXRef-9352c52d93a1af407480b9abed5351b0 FileChecksum: SHA1: d7c9de3fcc43010616e191a5340cb6b33b4ffee0 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/ViewerView-CEqQn6j9.chunk.css SPDXID: SPDXRef-6aebf2a5c57612bf22aa019076ac53c5 FileChecksum: SHA1: eca7f5caf06f5428408d7b66812e37ff2132d43a LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/dav-DdgL1Rqn.chunk.css SPDXID: SPDXRef-30198b72182e9b41b000c4d54300796a FileChecksum: SHA1: c22287ad8741e3645831828ddad3b9b3e29b2846 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/fonts/KaTeX_AMS-Regular.ttf SPDXID: SPDXRef-b2f0fe831a8f81048889c0d75900f861 FileChecksum: SHA1: 1dfd0ee6e30f8a1c23999d9d965db8700b5a9f2e LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_AMS-Regular.woff SPDXID: SPDXRef-1134b44082ac5eb5b9e81b6beefbc17d FileChecksum: SHA1: 99ada2de3200e795143d639232c3444b08018235 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_AMS-Regular.woff2 SPDXID: SPDXRef-25a7bf455fbc03b9a93508224b70c37f FileChecksum: SHA1: 34494743736fda757197d16fcc6a6e1a79317c86 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Bold.ttf SPDXID: SPDXRef-f73dae6fb3046eda3d336341fdc046d3 FileChecksum: SHA1: 8fab738a16ba8fb7e7002a075f036a455a45c6e8 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Bold.woff SPDXID: SPDXRef-d2cccd8aa1b1b6e6c94ba244fa1b1bb8 FileChecksum: SHA1: dd23ac0fb0ac469b0624485ea78d700f63614203 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Bold.woff2 SPDXID: SPDXRef-f460493be4fc6348bfa68e952e34bb7a FileChecksum: SHA1: 5bfa49cac46cd1d7ab1351388d37c11af59ba615 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Regular.ttf SPDXID: SPDXRef-e58e06121abd03acaa7d5b58737f3ab3 FileChecksum: SHA1: 26f26a13e6a7d0a69b48f62acd31a8196bce7f6e LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Regular.woff SPDXID: SPDXRef-1183d2812b0580523453641914f0caf9 FileChecksum: SHA1: 1a6f39bd70c9b74713078df5f7dd6108f9bad38b LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Caligraphic-Regular.woff2 SPDXID: SPDXRef-2cfa8f3c939b0da89ae5b93814049192 FileChecksum: SHA1: 9f8077e0b38a290cd9b7b136b0ac29c8375e81a6 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Bold.ttf SPDXID: SPDXRef-d546b82062227848a8b4b2aac6d99760 FileChecksum: SHA1: 4e08dd00383124e7cd96970ccb0fbe35c9efaaa3 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Bold.woff SPDXID: SPDXRef-e5f49adc04387d446c267b988190d522 FileChecksum: SHA1: 5bbafd501f262219426af7f20c1103bb4b732592 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Bold.woff2 SPDXID: SPDXRef-f2b0f5043df0794ac233970b1ce7dc6f FileChecksum: SHA1: f98f89272eca11ae417672c59a0faa6a88805a89 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Regular.ttf SPDXID: SPDXRef-47b1da7343026e779b4832e0a65e00ca FileChecksum: SHA1: 17db40882dd5f140625f28dd94c43045e1893e98 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Regular.woff SPDXID: SPDXRef-39e365234c05f411caa2ef1ed21b9437 FileChecksum: SHA1: 6f756376360f0815b44862f57f795eb7c1cd4db2 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Fraktur-Regular.woff2 SPDXID: SPDXRef-8ea23b611d508213581e75448b5e935c FileChecksum: SHA1: a5764c6e2784d02820c0b904089f3fac798be4fa LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Bold.ttf SPDXID: SPDXRef-16d1ad255434a109571a7770b2305c60 FileChecksum: SHA1: 413ab3dc3fc3a5752275bae2cae67eb58f2b32f0 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Bold.woff SPDXID: SPDXRef-956905975682519e1f8fd865ddcdff01 FileChecksum: SHA1: f69a36250eae6e8a02173a9909aa628428ba2060 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Bold.woff2 SPDXID: SPDXRef-2318a9aa1fbaebda1d6c362311ed49d7 FileChecksum: SHA1: 31050a1b1b123fb2c59cad1f74b7dff90deb8fce LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-BoldItalic.ttf SPDXID: SPDXRef-e30e6309c3522dd8c266e9681499965d FileChecksum: SHA1: ba6464e442fd50aef7678924ba0f2d9581ebbb07 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-BoldItalic.woff SPDXID: SPDXRef-86d621d5f07ce9fa29b4e6f33005be5e FileChecksum: SHA1: 038bbdc8887a9730ad94147fc57c6ff4dfb48411 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-BoldItalic.woff2 SPDXID: SPDXRef-8feeb1402f4c0ef5f2f943ffca6a8e43 FileChecksum: SHA1: a4a4905b8b126f9ffd553d21a72a0c24e9480345 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Italic.ttf SPDXID: SPDXRef-8f4b354319dde9917c156db6ab0ae686 FileChecksum: SHA1: 1d5668a2b94ae7dbeefdd7cd68d98fe9d5825e07 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Italic.woff SPDXID: SPDXRef-0b9cdfddd5be108a7b727f6124d19368 FileChecksum: SHA1: 7c8589213bc7003e2c2334b51ca4152858987abd LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Italic.woff2 SPDXID: SPDXRef-f4f9648261bb485753acb8fb84b4d114 FileChecksum: SHA1: c9b2b5ffd2f27aa5c6b6f9ba41a7b2b4e66102d3 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Regular.ttf SPDXID: SPDXRef-4a100ecebdab8996a3464b741554384f FileChecksum: SHA1: 8744db6ef8c309e3dc85f1bbe980520ad8b7bfd4 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Regular.woff SPDXID: SPDXRef-7569553cc36f4de3a6df54bf1e1ad8f8 FileChecksum: SHA1: fdcae54ba1d4635ee85a5462cc1c97e521cfd515 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Main-Regular.woff2 SPDXID: SPDXRef-1de4bbcff85b693c6ec413bfee1b9d9a FileChecksum: SHA1: c884086c25cec8558160b2026f906ef7da3570ac LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-BoldItalic.ttf SPDXID: SPDXRef-5ea343327e3543becaf608842bce51b9 FileChecksum: SHA1: e80cc4c232d2075f762a52d46beb4ffbd37a5f1a LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-BoldItalic.woff SPDXID: SPDXRef-cfa72118432396856106aa225c417a3e FileChecksum: SHA1: d54e6480d6d4046c6a5619aa383baa5971fb8a0c LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-BoldItalic.woff2 SPDXID: SPDXRef-04409d9b414820c54e4fe03591fb5c6f FileChecksum: SHA1: 8fcb9d2de65ac71a0c4fdd986173db730592ed8a LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-Italic.ttf SPDXID: SPDXRef-8e89720efe725e1efd4dcf4f9cd85266 FileChecksum: SHA1: 9e9a10d8fa5ad88c9ecfa4902addd4d92580b2bc LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-Italic.woff SPDXID: SPDXRef-24f78f402754280ace3a02fb19671d65 FileChecksum: SHA1: 1c1b48739e1cb4be13ddd8c0bc279dde851bdba0 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Math-Italic.woff2 SPDXID: SPDXRef-36eea0e46f1194d70744e7d55dd89296 FileChecksum: SHA1: db4883d0cff95ecb5c03410e3283a737c51ed604 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Bold.ttf SPDXID: SPDXRef-8d837f00bdb1110dd54065aec537bb95 FileChecksum: SHA1: 20b45f5346b686d52c445745393d1707bb88ec1d LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Bold.woff SPDXID: SPDXRef-0bee1c79512834885c788a41a47c9c97 FileChecksum: SHA1: a2beddc8a3d4d08028d707776edbd4d24f2ec0fc LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Bold.woff2 SPDXID: SPDXRef-e1da326df523cc927960e094f13a39dc FileChecksum: SHA1: 886e61797a525d4aafce0aaf57414fdfaea1b873 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Italic.ttf SPDXID: SPDXRef-f2a2065250a4c4cc595b8f38e651d9c0 FileChecksum: SHA1: 991fbdc03168bb14a4447cfa3e515f09a6ecfedc LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Italic.woff SPDXID: SPDXRef-157b277c4c5eddd9a917c028b2723f66 FileChecksum: SHA1: 7564a366b76fd837041c24beef4c5580a5add40e LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Italic.woff2 SPDXID: SPDXRef-e668558b6996d72e5068dad3452f890e FileChecksum: SHA1: 3d5fa3cb309f8d83b4dcbdd27725f270f60f3eeb LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Regular.ttf SPDXID: SPDXRef-507ce7954e395df4daf516b87a7aa1f9 FileChecksum: SHA1: 4a8e17a0cb58a8228dd4417fbd1b899e41dab045 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Regular.woff SPDXID: SPDXRef-025dba846a4f8bacd82242eb84f0c0d1 FileChecksum: SHA1: 804610f4cb2e2ead9694b8da2ec84ece8d09c38d LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_SansSerif-Regular.woff2 SPDXID: SPDXRef-9f79f6f8f1a0af4886b08654c4b56057 FileChecksum: SHA1: e45d5f4f4a7f2ff3dca9fccc2f148e781e23f292 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Script-Regular.ttf SPDXID: SPDXRef-d3c1d81f29e2c387123663b7230f5aed FileChecksum: SHA1: c6f675da81ad29cbf24b2cf770f795b4da2c648e LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Script-Regular.woff SPDXID: SPDXRef-f21f938b2b8f41304014773975d0d7c5 FileChecksum: SHA1: 6a05cdca4f1f7085e607dc38bedef55753f86fd8 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Script-Regular.woff2 SPDXID: SPDXRef-9576ecc903d4e5b287d5dae5c525868a FileChecksum: SHA1: 63b80959f1fc56899ae21ba0cbbcd39a6cb08390 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size1-Regular.ttf SPDXID: SPDXRef-65d40b5ea9094b98a30803bc32a82dc8 FileChecksum: SHA1: 3280bacbcb1245971fe01017b474c76c337c10c9 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size1-Regular.woff SPDXID: SPDXRef-686f387d949c90f757f60696c90287fe FileChecksum: SHA1: aefe6674a56533627c739cd7896398f14487e01c LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size1-Regular.woff2 SPDXID: SPDXRef-f231db286a236b93b292e9df026bb3aa FileChecksum: SHA1: 57fa599974a1bc0b37d5f0e5cc8602302f02b573 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size2-Regular.ttf SPDXID: SPDXRef-66149bcc08451366c200b59af6ff027d FileChecksum: SHA1: faf73ff3e795184e5431666ffafeb8aa0e28834d LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size2-Regular.woff SPDXID: SPDXRef-b3c3b054071b67ce3de0c2116783b830 FileChecksum: SHA1: 46698ff1819bd27826fd5d2dc4ba4e1f63cacdf4 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size2-Regular.woff2 SPDXID: SPDXRef-5f952a6faa185257f70eb6814b95b243 FileChecksum: SHA1: ee18713634a3be8c997276808552ab195a598f43 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size3-Regular.ttf SPDXID: SPDXRef-8fa89cdc8b90aebf124e7972686ddc32 FileChecksum: SHA1: 302a61b2ecdf82d39e6780f42bd07ee4ce67b8d5 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size3-Regular.woff SPDXID: SPDXRef-b8e905f674331576fd02093f1bc8af3b FileChecksum: SHA1: 1da1905a6d1d9bcab92b059df72b528dea708bcb LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size4-Regular.ttf SPDXID: SPDXRef-75e25be6512be15ec5eb4d8a1b5fe351 FileChecksum: SHA1: 3d8d9dd58a03b7a46d497f5761e60d8b844a5199 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size4-Regular.woff SPDXID: SPDXRef-101b12eef88cf5068cb4ecc8b6c7ef3a FileChecksum: SHA1: 8fdddb83513ec226231ebee05079ec45fc013578 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Size4-Regular.woff2 SPDXID: SPDXRef-b32e832a2d0427619d6739b72a69f035 FileChecksum: SHA1: 9bed17fb92f2650501e229862c40c6407e1c5528 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Typewriter-Regular.ttf SPDXID: SPDXRef-b75684c34b22adbee20fc9334743f330 FileChecksum: SHA1: 629b99faf18d97529f21a1b1018093e60bcd058f LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Typewriter-Regular.woff SPDXID: SPDXRef-0cdbc25691f44b923954028a0ff6004e FileChecksum: SHA1: f5e729fa4ff466fc07e0c7ab1979ad70c45fa5d5 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/fonts/KaTeX_Typewriter-Regular.woff2 SPDXID: SPDXRef-1e5193f2c4ff547b903b766b0a2fcc6e FileChecksum: SHA1: 7a08883fffc6958c71cc01a75a0b99cca3e4b475 LicenseConcluded: NOASSERTION LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: KaTeX project and contributors FileName: ./css/index-B-oCDuhe.chunk.css SPDXID: SPDXRef-25c735207739c4fd621b032d4280de17 FileChecksum: SHA1: f2b54d5d01cc6e819a62ed1d09c85fd9dfa2ef31 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/index-BnF98eos.chunk.css SPDXID: SPDXRef-43ac77279bd1f1e79157a50c62f6ccaf FileChecksum: SHA1: d67d5a76e868696fe9d72c8986ef63bf1fbc0f28 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/index-CPoSwE-9.chunk.css SPDXID: SPDXRef-d2e274d394124ab9d5ce17f316897f7b FileChecksum: SHA1: 3c3f1a8b9ac09be683c279a3902c60e952a5abc1 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/index-bfXBK-tQ.chunk.css SPDXID: SPDXRef-1ebb79ca500550c325c252ce4c2d54eb FileChecksum: SHA1: 13737b3cb0e692552ea215ab0ba8704c78de7c01 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-BT_4pRDt.chunk.css SPDXID: SPDXRef-d4887381a56cf947f49781a0456a2b85 FileChecksum: SHA1: 1c0602335321c62f407398b53fcbbdca04b46b63 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-editor.css SPDXID: SPDXRef-aad754be4a3eb5c933277639d09aa553 FileChecksum: SHA1: dba3d9a1e091fa9f657c98341e56c32da8043a3f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-files.css SPDXID: SPDXRef-44c3c9cd5068134015dfcff46cd202b5 FileChecksum: SHA1: dba3d9a1e091fa9f657c98341e56c32da8043a3f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-init.css SPDXID: SPDXRef-70351a7f4eda39a9299aee7cefe33358 FileChecksum: SHA1: 2dddaf00171a78d13e883c163de9435e952a6d99 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-public.css SPDXID: SPDXRef-ffb91683f6250562e5ce86799acde384 FileChecksum: SHA1: dba3d9a1e091fa9f657c98341e56c32da8043a3f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-text.css SPDXID: SPDXRef-1d9dcb78449354913ea15692d3b2edfb FileChecksum: SHA1: 45174b371b63d8e14d0b75c10c2217b2f678b698 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./css/text-viewer.css SPDXID: SPDXRef-76186ee3b7dde25fa05cb5c97b13c594 FileChecksum: SHA1: dba3d9a1e091fa9f657c98341e56c32da8043a3f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress.config.ts SPDXID: SPDXRef-5e980a502ee6c8a33d5272fc05b88926 FileChecksum: SHA1: 232f20974436c582fd9f165433a7ac442eb64c56 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/.env SPDXID: SPDXRef-f84e00cd91fdef7d4fccd9a30f8c9916 FileChecksum: SHA1: 332352fd0ed9ab4083fe153b4f04620334593780 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/.eslintrc.json SPDXID: SPDXRef-4add210b6e7a667defc2f0f8e77664f1 FileChecksum: SHA1: ec2eece5b1b8cffc81765912c33e9a7cfec6a226 LicenseConcluded: NOASSERTION LicenseInfoInFile: CC0-1.0 FileCopyrightText: SPDX-FileCopyrightText: none FileName: ./cypress/Dockerfile SPDXID: SPDXRef-059fcb83081a6755dfd80c7c6b69b788 FileChecksum: SHA1: f787f094f6c9053473a8a8f66f471d3ca185d686 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/README.md SPDXID: SPDXRef-4e3d84b613f5565fc52d7135437616f7 FileChecksum: SHA1: 1fe8902c4ec641c4694fb69b4713dc30c024af47 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/docker-compose.yml SPDXID: SPDXRef-3a2c90db80a78b8883253cc974b9cbd5 FileChecksum: SHA1: de42741edc06842bf72cdc594ca071da18cc74b3 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/Assistant.spec.js SPDXID: SPDXRef-6d3c55e65d0aec642864a53861c66357 FileChecksum: SHA1: 85a9672baaf1a7a171be63d4b3969d7af3d6b583 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/Links.spec.js SPDXID: SPDXRef-749a132c7c5d6c130c641905c2a47e69 FileChecksum: SHA1: 16d776efd02f48f8404598e86d2986ae287a5b91 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/MenuBar.spec.js SPDXID: SPDXRef-1109f7fb268defb3a74c797dc46dd848 FileChecksum: SHA1: 1d5f013219daf8d88134ff660cca48111cb7a706 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/api/SessionApi.spec.js SPDXID: SPDXRef-d426089b78da1a1ad12019e8816101b1 FileChecksum: SHA1: 0bbb3e1e8644062fd6daee1c9840e6cda919a7f0 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/api/SyncServiceProvider.spec.js SPDXID: SPDXRef-692cc2f14caf7af5a8cacf05acfcf591 FileChecksum: SHA1: 06f66afc5de47b53b7efe9761e064112aabedc1d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/api/UsersApi.spec.js SPDXID: SPDXRef-ceab08d07ce0e4d61474ee2bf7b39c34 FileChecksum: SHA1: 13b1a84615dadecb3cb447453ba94ac3d45bdd8b LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/attachments.spec.js SPDXID: SPDXRef-55a18df123bc13cb9fe8ee7a2b18915d FileChecksum: SHA1: 2a133d9a683be68e9cbaed98b9133b23ac350867 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/changeMimetype.spec.js SPDXID: SPDXRef-a7eb8219fb4cb1c615f67767d04f9fa9 FileChecksum: SHA1: 4d6510a79757c77bf203688dda881f778af36017 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/directediting.spec.js SPDXID: SPDXRef-3f3ae3bfc9785fe927c16fa1308323c8 FileChecksum: SHA1: 5c26617ffea310e58d7afd4f5054018c5226cdc1 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/files.spec.js SPDXID: SPDXRef-baf7bbb0f9072ce6f03a344ec51af178 FileChecksum: SHA1: 3bb1b65a5e146fbb4def45b1d50479c5755113f1 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/initial.spec.js SPDXID: SPDXRef-d2ea9c12d96ae7dd1359f6d2ed742f26 FileChecksum: SHA1: ea9499203571534a488a7da0362a2304eb3a29d9 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/inputRules.spec.js SPDXID: SPDXRef-96be17d7381c0138c61ad4373cfdb25f FileChecksum: SHA1: 0e6e36a3c5c9e853ae6e877d1a5c53c138b6d759 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors © ')) FileName: ./cypress/e2e/marks/Link.spec.js SPDXID: SPDXRef-32e9f938be0ebd28edc8dd2cf324fdfc FileChecksum: SHA1: cd9b65931335159824de91da7b3e31436a594c70 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/CodeBlock.spec.js SPDXID: SPDXRef-3e5be12aef5b9c2ab242fe9fc92182d1 FileChecksum: SHA1: b8f0260338b543e568e8011a13e85f541a410e0f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/FrontMatter.spec.js SPDXID: SPDXRef-1106b2130a2dcbe4bac1a204166be22f FileChecksum: SHA1: ed96862d351ba11cb16ccc7248a0d9d63ac700c1 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/HardBreak.spec.js SPDXID: SPDXRef-b3d27037d7d49f14b0b3acaa6d2bd21c FileChecksum: SHA1: 12e5522998a97388ad55ee62379d949a56d16aa7 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/ImageView.spec.js SPDXID: SPDXRef-9031ceee6a4912ea9edbc7536fe76913 FileChecksum: SHA1: 772f32efae751684dd39d53dd0fb0837b4238bf2 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/ListItem.spec.js SPDXID: SPDXRef-b5f3e458ea6827114d30a7af0fb048e1 FileChecksum: SHA1: 38f4432ff93c6ac0ae48cf5a5f307a9e71a17f95 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/Mentions.spec.js SPDXID: SPDXRef-7705c33ae9c3244c4fe207fa43c52e05 FileChecksum: SHA1: 338e6b76a096422a96e9638d92c6de5de798ea6d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/Preview.spec.js SPDXID: SPDXRef-a9fa98fccd09fe32f7ecce555b4f793c FileChecksum: SHA1: f75c0aa804b5708b00eadc2e3276a56910060291 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/PreviewOptions.spec.js SPDXID: SPDXRef-83e935714699ab1f8d3ac9bea96d8ad8 FileChecksum: SHA1: d342291bd7d2ca2bec0d23f0aea2dcc85533f1ea LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/Table.spec.js SPDXID: SPDXRef-138d5c61609c50b034d68476d2686d81 FileChecksum: SHA1: cac6becf02e4e7669f44e9620624451e308ef260 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/nodes/helpers.js SPDXID: SPDXRef-7e251748d2828247b2d143e53d7faa53 FileChecksum: SHA1: 6a41080b0def9c08b8d69cdbe75ad89f1c943426 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/openreadonly.spec.js SPDXID: SPDXRef-a43ee72c6b952f74f7d71b9e89b9eaad FileChecksum: SHA1: 88b52efff5eb2363472d533660588a86f371d41c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/propfind.spec.js SPDXID: SPDXRef-2bf9344eaf9f002461260c9ded19d8bd FileChecksum: SHA1: dfc1fad6d688de696f61f5ff83047429dacfbe40 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/sections.spec.js SPDXID: SPDXRef-b74ef137811053aa09038bf9ab274162 FileChecksum: SHA1: 92c9c76d762493f007f539953dd4cb260eedbc2d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/share.spec.js SPDXID: SPDXRef-ad3415bec61d6d02e990cbd542faa6c6 FileChecksum: SHA1: d3e9f4956b4f7385df5f7032c42a290786eca273 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/shareWithAttachments.spec.js SPDXID: SPDXRef-051a923af402cad662ae19f79529d1e4 FileChecksum: SHA1: 7a2269baf734ce517d6783fd81a4de097a9c3600 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/shortcuts.spec.js SPDXID: SPDXRef-68d42951467aac7154e3bcdbae58c0c2 FileChecksum: SHA1: 344dac8ebc0a59b16309e92e4b309b1976b4f64c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/sync.spec.js SPDXID: SPDXRef-67987cb3f8b46bce72ad9220343b21d1 FileChecksum: SHA1: f43c5ca7c5565ca6c92c06f54224b6238c01615e LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/viewer.spec.js SPDXID: SPDXRef-880ec8a8067e4ea0f252a31bd65a95e9 FileChecksum: SHA1: 03b1937b92c62d0ecd557596310a0972dd41ce82 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/e2e/workspace.spec.js SPDXID: SPDXRef-9a597673bc14702faed5095bc2c982fd FileChecksum: SHA1: e24bfdba83c2f17cfa8677966398663d0888e813 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/entrypoint.sh SPDXID: SPDXRef-c6546fa37050893ea49607a227241528 FileChecksum: SHA1: 00d4288ffdf97583444d5eb3618d066dcd1d0752 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2012-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/ListItem.md SPDXID: SPDXRef-71c72923fbd6b61e47ec702e96b121d5 FileChecksum: SHA1: 24f86d903cec05e4037f674c93d57adc331eefff LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/Preview.md SPDXID: SPDXRef-0541d8d8ca844dfe5f28a5104897aadc FileChecksum: SHA1: 3ae421326d6c847739c71ff9954a748d8ca35919 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/Table.md SPDXID: SPDXRef-8f3b324079c6c1c78bae05892fa5c6e8 FileChecksum: SHA1: e6e2f2ac23961d37cb58d43d59a4a1c1150d126c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/anchors.md SPDXID: SPDXRef-06df24b74b1652ecf6a2e27c719f2ff7 FileChecksum: SHA1: 6e5e20d218081ad41b994eba6c00e9d3563efe8d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/codeblock.md SPDXID: SPDXRef-8915ca8b3544c3e5a21a1265200922c5 FileChecksum: SHA1: 4c17a032cf6827f349057db97e2e9c3bfb9c6d72 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/edited-lines.txt SPDXID: SPDXRef-22fe71c29a1782d8a1561cc0d8763fea FileChecksum: SHA1: e8d789e7d08435deb54beca5511930a0136bfd69 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/edited-long.md SPDXID: SPDXRef-dabe71045661d859d25d54f8f9253196 FileChecksum: SHA1: 7d8f6ec62348bf59d477659eaaa54ea8fa2da252 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/edited-test.md SPDXID: SPDXRef-7e6d7c418891a2a5890871cb28f6d1b1 FileChecksum: SHA1: 668966a7ea3ebb7e45356f8e7218b82b2d330d77 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/file.txt.gz SPDXID: SPDXRef-e7421b0ee394c6406b816d22a6461408 FileChecksum: SHA1: c5c65947e790b7c01acf7734f9b960ef81e350ee LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/frontmatter.md SPDXID: SPDXRef-b3c6475f40aef7b2888b457fb5625ee7 FileChecksum: SHA1: 9868bd4cd11d81d8c2183d6e25d6d61f279a969c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/github.png SPDXID: SPDXRef-8a5362a1a8046d58901ed2bfe16a73c7 FileChecksum: SHA1: dd0f546d71d51fb2efe323eee102b3ae4ac13614 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/lines.txt SPDXID: SPDXRef-ec4304797c8f937dfd4c50c83749bd6c FileChecksum: SHA1: bdf43ee07015bc0189d1282ddb35df1fdd2dd8e3 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/long.md SPDXID: SPDXRef-00764fe63dd52124922ec6cef5aee849 FileChecksum: SHA1: 4f7d2fa135a5a6fb0e61252fe2cabff870b4d09f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/table.png SPDXID: SPDXRef-ef7240b261364b09497878bcb93788ac FileChecksum: SHA1: f89bf4e659549e74afed86b1b86d8a3a395c6c9a LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/test.adoc SPDXID: SPDXRef-c2450e27188c5285a6efa66fbf98a867 FileChecksum: SHA1: 9a5d274221659086d001c6d60156363adb7d245d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/fixtures/test.md SPDXID: SPDXRef-7844d31ab132f5e29bbd9f6180cfc746 FileChecksum: SHA1: 0440d8312191cde34483659f0c6c4e4c862ba987 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/runLocal.sh SPDXID: SPDXRef-e427bd60bbc9766d971078c8618589e7 FileChecksum: SHA1: 7484e7e3e2f147e93c2e69d9e8b4acd544a6d352 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/chai.js SPDXID: SPDXRef-a79404a5ef558f203645ff78b231a90d FileChecksum: SHA1: b99f51eecf1f2562be0d024ddbec05fa30776624 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/commands.js SPDXID: SPDXRef-7b7cd7ebce169d2e7b6c493e89f68a71 FileChecksum: SHA1: 82061dca05db9da47db1d6fcdb69c21478053beb LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/component-index.html SPDXID: SPDXRef-b26a3f5797b6cf8780dc6af66dcef290 FileChecksum: SHA1: d3a8bba571a9db56518e2edd1e90791f16b90f7d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/components.js SPDXID: SPDXRef-77387e37501368ac805241782423cef2 FileChecksum: SHA1: fd61045e70c821517fa78ff72971bfbe253af5f9 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/e2e.js SPDXID: SPDXRef-03968146b3f0199ea45b635b8d06d59a FileChecksum: SHA1: a6831295dda00a1176fa4edf7ac21a8a3712db21 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/support/sessions.js SPDXID: SPDXRef-95d70a909bc52eadc1bf4b7e6c90a5ef FileChecksum: SHA1: 320644130a486c9aa1abe69faec2036192550019 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors FileName: ./cypress/utils/index.js SPDXID: SPDXRef-eeb001f184b290799545a1a026b46b16 FileChecksum: SHA1: 4ef75d782efca6e5ed26da7ecfac558c6239f7b4 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors FileName: ./eslint.config.js SPDXID: SPDXRef-94a5c164cfaf3d0f90d8c86ac68e6598 FileChecksum: SHA1: 7fd9738bc9c24a87e71fc54dd3e535a21d1f83a8 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors FileName: ./img/app-dark.svg SPDXID: SPDXRef-8a376a8012deedba0c443b522353f2db FileChecksum: SHA1: bc4dc5b31b07d15c6611ed9fd144e76aa8a7ae9b LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./img/app.png SPDXID: SPDXRef-480e7b126d37bf09524ca522a59e1f7a FileChecksum: SHA1: 4a56df72ae7687a05a99d266879205c195ab17a6 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./img/app.svg SPDXID: SPDXRef-15e85f8d8841809c2d0efdfc9d2c77d2 FileChecksum: SHA1: 2ca647b60df821f95e520fd8de05d666d3b3801c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./img/article.svg SPDXID: SPDXRef-59d98f1ebbf6b16c1d7e783aabff8d98 FileChecksum: SHA1: e493b7ae593634db188b58016f36fc358d28f092 LicenseConcluded: NOASSERTION LicenseInfoInFile: Apache-2.0 FileCopyrightText: SPDX-FileCopyrightText: 2018-2024 Google LLC FileName: ./img/checkbox-mark.svg SPDXID: SPDXRef-c6f025b38a7fbdc3d6553046b090c313 FileChecksum: SHA1: b7620b223ac4d7d771fd6eccbb1a6b5c68c70b1d LicenseConcluded: NOASSERTION LicenseInfoInFile: Apache-2.0 FileCopyrightText: SPDX-FileCopyrightText: 2018-2024 Google LLC FileName: ./img/screenshots/screenshot1.png SPDXID: SPDXRef-14b3987aae0eba3753d34e94b71efd7a FileChecksum: SHA1: 8a94134e87a932b70a1d4a49308f46a8bc0ab06e LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./img/screenshots/screenshot2.png SPDXID: SPDXRef-ddc5ea31bdbecbdfe2e3ad3346cbc00f FileChecksum: SHA1: cf62a955e4c3a8af9641d33de3d4d703aa38d6d1 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./img/screenshots/screenshot3.gif SPDXID: SPDXRef-7244bfaa20c11a7a8232c1da8af7da63 FileChecksum: SHA1: 301bdba93bab103163a5d21e4f032e47045749eb LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors FileName: ./js/1c-CC0wpk6N.chunk.mjs SPDXID: SPDXRef-fbcb10c9dbb7491161acad7dead41c59 FileChecksum: SHA1: 938009d8257227c205136904e0a9d2c233143d00 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: BSD-3-Clause FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Josh Goebel FileName: ./js/1c-CC0wpk6N.chunk.mjs.map SPDXID: SPDXRef-894ac026c70c23773b736fe125ee34f9 FileChecksum: SHA1: cf350d65f6a331b7b9a5efa3150ca952efe6984d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/1c-Cfsor94y.chunk.mjs SPDXID: SPDXRef-7c5014726eff0ebf7b82d153a867e4ad FileChecksum: SHA1: caf700409295b51baa15fb1155ab84a7282e1da8 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: BSD-3-Clause FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Josh Goebel FileName: ./js/1c-Cfsor94y.chunk.mjs.map SPDXID: SPDXRef-5fe09d67db21d728dfd646ce8fd03de3 FileChecksum: SHA1: e522d7e44b1c8510cf356f05f9b449d1b0d324ec LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/1c.js-BNw8cWrt.chunk.mjs SPDXID: SPDXRef-f2c91654ea18080f737a08e5e672acc4 FileChecksum: SHA1: 2af021b447ed76963bebe9d4acad559ad091da0d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: BSD-3-Clause FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Josh Goebel FileName: ./js/1c.js-BNw8cWrt.chunk.mjs.map SPDXID: SPDXRef-68e19dcba01d6fd840219d12e4486113 FileChecksum: SHA1: 31313359b5d5ebf301d92696e950eb8c3100001b LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/AttachmentResolver-CIolD0qT.chunk.mjs SPDXID: SPDXRef-e9e64cb9fecbc490c0b024122613891f FileChecksum: SHA1: 3f03f16f9dde974527527830518003c8f55bf0b5 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Autumn Z SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/AttachmentResolver-CIolD0qT.chunk.mjs.map SPDXID: SPDXRef-8561a5e7fdc491f0a1e3abb45ad6626c FileChecksum: SHA1: 655e2f6e15efd20417f5037f80204794fa2850a0 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2022, 2021, 2022, 2022, 2022, 2022, 2022, 2025, 2025, 2023, 2019, 2022, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Check if current platform is a mobile device\n *\n * @return {boolean} whether the platform is a mobile device\n */\nexport function isMobilePlatform() {\n\t// Use client hints if already available\n\tif (navigator?.userAgentData?.mobile !== undefined) {\n\t\treturn navigator.userAgentData.mobile\n\t}\n\n\t// use regex to match userAgent (required for Safari and Firefox in 2022)\n\tconst mobileDevices = [\n\t\t/Android/i,\n\t\t/webOS/i,\n\t\t/iPhone/i,\n\t\t/iPad/i,\n\t\t/iPod/i,\n\t\t/playbook/i,\n\t\t/silk/i,\n\t\t/BlackBerry/i,\n\t\t/Windows Phone/i,\n\t]\n\n\treturn mobileDevices.some((regex) => navigator.userAgent.match(regex))\n}\n","\n\n\n\n\n\n\n","\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import '../assets/NcActionCheckbox-wD8m_a8-.css';\nimport { h as mdiCheckboxMarked, i as mdiCheckboxBlankOutline } from \"./mdi-CpchYUUV.mjs\";\nimport { resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, withDirectives, vModelCheckbox, createVNode, toDisplayString, useModel } from \"vue\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { A as ActionGlobalMixin } from \"./actionGlobal-BZFdtdJL.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { a as NC_ACTIONS_IS_SEMANTIC_MENU } from \"./useNcActions-BzPO2c4h.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _sfc_main = {\n name: \"NcActionCheckbox\",\n components: {\n NcIconSvgWrapper\n },\n mixins: [ActionGlobalMixin],\n inject: {\n isInSemanticMenu: {\n from: NC_ACTIONS_IS_SEMANTIC_MENU,\n default: false\n }\n },\n props: {\n /**\n * id attribute of the checkbox element\n */\n id: {\n type: String,\n default: () => \"action-\" + createElementId(),\n validator: (id) => id.trim() !== \"\"\n },\n /**\n * checked state of the the checkbox element\n */\n modelValue: {\n type: Boolean,\n default: false\n },\n /**\n * value of the checkbox input\n */\n value: {\n type: [String, Number],\n default: \"\"\n },\n /**\n * disabled state of the checkbox element\n */\n disabled: {\n type: Boolean,\n default: false\n }\n },\n emits: [\n /** Native change event */\n \"change\",\n /** Checkbox is checked */\n \"check\",\n /** Checkbox is unchecked */\n \"uncheck\",\n /** Model value changed */\n \"update:modelValue\"\n ],\n setup(props) {\n const model = useModel(props, \"modelValue\");\n return {\n model,\n mdiCheckboxBlankOutline,\n mdiCheckboxMarked\n };\n },\n methods: {\n onChange(event) {\n this.$emit(\"change\", event);\n if (event.target.checked) {\n this.$emit(\"check\");\n } else {\n this.$emit(\"uncheck\");\n }\n }\n }\n};\nconst _hoisted_1 = [\"role\"];\nconst _hoisted_2 = [\"role\", \"aria-checked\"];\nconst _hoisted_3 = { class: \"action-checkbox__icon\" };\nconst _hoisted_4 = [\"id\", \"value\", \"disabled\"];\nconst _hoisted_5 = { class: \"action-checkbox__text\" };\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcIconSvgWrapper = resolveComponent(\"NcIconSvgWrapper\");\n return openBlock(), createElementBlock(\"li\", {\n class: normalizeClass([\"action\", { \"action--disabled\": $props.disabled }]),\n role: $options.isInSemanticMenu && \"presentation\"\n }, [\n createElementVNode(\"label\", {\n class: \"action-checkbox\",\n role: $options.isInSemanticMenu && \"menuitemcheckbox\",\n \"aria-checked\": $options.isInSemanticMenu && $setup.model.toString()\n }, [\n createElementVNode(\"span\", _hoisted_3, [\n withDirectives(createElementVNode(\"input\", {\n id: $props.id,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event) => $setup.model = $event),\n type: \"checkbox\",\n class: normalizeClass([\"action-checkbox__input\", { focusable: !$props.disabled }]),\n value: $props.value,\n disabled: $props.disabled,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.onChange && $options.onChange(...args))\n }, null, 42, _hoisted_4), [\n [vModelCheckbox, $setup.model]\n ]),\n createVNode(_component_NcIconSvgWrapper, {\n path: $setup.model ? $setup.mdiCheckboxMarked : $setup.mdiCheckboxBlankOutline,\n size: 20\n }, null, 8, [\"path\"])\n ]),\n createElementVNode(\"span\", _hoisted_5, toDisplayString(_ctx.text), 1)\n ], 8, _hoisted_2)\n ], 10, _hoisted_1);\n}\nconst NcActionCheckbox = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-2947bc3b\"]]);\nexport {\n NcActionCheckbox as N\n};\n//# sourceMappingURL=NcActionCheckbox-DBqiK-AZ.mjs.map\n","\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport {\n\tgetAssistantMenuEntries,\n\tgetMenuEntries,\n\toutlineEntries,\n\treadOnlyDoneEntries,\n\treadOnlyEditEntries,\n} from '../components/Menu/entries.ts'\nimport { useEditorFlags } from './useEditorFlags.ts'\n\n/**\n *\n */\nexport function useMenuEntries() {\n\tconst { isRichWorkspace } = useEditorFlags()\n\n\tconst assistantMenuEntries = getAssistantMenuEntries()\n\tconst menuEntries = getMenuEntries(isRichWorkspace)\n\n\treturn {\n\t\tassistantMenuEntries,\n\t\tmenuEntries,\n\t\toutlineEntries,\n\t\treadOnlyDoneEntries,\n\t\treadOnlyEditEntries,\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\t/** Current menu entry that has focus */\n\t\t\tactiveMenuEntry: 0,\n\t\t\tentries: [],\n\t\t}\n\t},\n\tcomputed: {\n\t\tvisibleEntries() {\n\t\t\treturn this.entries\n\t\t},\n\t},\n\twatch: {\n\t\tvisibleEntries() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tif (\n\t\t\t\t\tthis.activeMenuEntry > this.visibleEntries.length\n\t\t\t\t\t|| this.visibleEntries[this.activeMenuEntry]?.disabled\n\t\t\t\t) {\n\t\t\t\t\tthis.setNextMenuEntry()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Update the disabled state of an menu entry\n\t\t *\n\t\t * @param {string} menuKey The key of the menu entry that changed\n\t\t * @param {boolean} state The new disabled state\n\t\t */\n\t\tdisableMenuEntry(menuKey, state) {\n\t\t\tconst index = this.visibleEntries.findIndex(({ key }) => key === menuKey)\n\t\t\tthis.visibleEntries[index].disabled = state\n\t\t\tif (state === false && this.activeMenuEntry === index) {\n\t\t\t\tthis.$nextTick(() => this.setNextMenuEntry())\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set the active menu entry to the next one (or reset to first)\n\t\t */\n\t\tsetNextMenuEntry() {\n\t\t\t// refs is not reactive so we must check this every time\n\t\t\tconst modulo\n\t\t\t\t= this.visibleEntries.length + (this.$refs.remainingEntries ? 1 : 0)\n\n\t\t\tdo {\n\t\t\t\tthis.activeMenuEntry = (this.activeMenuEntry + 1) % modulo\n\t\t\t} while (\n\t\t\t\tthis.activeMenuEntry < this.visibleEntries.length\n\t\t\t\t&& this.visibleEntries[this.activeMenuEntry].disabled\n\t\t\t)\n\t\t},\n\t\t/**\n\t\t * Set the active menu entry to the previous one (or reset to last entry (remaining actions))\n\t\t */\n\t\tsetPreviousMenuEntry() {\n\t\t\t// refs is not reactive so we must check this every time\n\t\t\tconst modulo\n\t\t\t\t= this.visibleEntries.length + (this.$refs.remainingEntries ? 1 : 0)\n\n\t\t\tdo {\n\t\t\t\tconst index = this.activeMenuEntry - 1\n\t\t\t\tthis.activeMenuEntry = ((index % modulo) + modulo) % modulo // needed as JS does not work with negative modulos\n\t\t\t} while (\n\t\t\t\tthis.activeMenuEntry < this.visibleEntries.length\n\t\t\t\t&& this.visibleEntries[this.activeMenuEntry].disabled\n\t\t\t)\n\t\t},\n\n\t\t/**\n\t\t * Handle navigation in toolbar\n\t\t *\n\t\t * @param {KeyboardEvent} event The keyup event\n\t\t */\n\t\thandleToolbarNavigation(event) {\n\t\t\tif (event.key === 'ArrowRight') {\n\t\t\t\tthis.setNextMenuEntry()\n\t\t\t} else if (event.key === 'ArrowLeft') {\n\t\t\t\tthis.setPreviousMenuEntry()\n\t\t\t}\n\n\t\t\tif (this.activeMenuEntry === this.visibleEntries.length) {\n\t\t\t\tthis.$refs.remainingEntries?.focusButton?.()\n\t\t\t} else {\n\t\t\t\tthis.menuEntryRefs[this.activeMenuEntry]?.focusButton()\n\t\t\t}\n\t\t},\n\t},\n})\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\"use strict\";\n/* eslint-disable @typescript-eslint/no-magic-numbers */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.normalize = void 0;\nconst SLASH = 47;\nconst DOT = 46;\nconst assertPath = (path) => {\n const t = typeof path;\n if (t !== 'string') {\n throw new TypeError(`Expected a string, got a ${t}`);\n }\n};\n// this function is directly from node source\n// eslint-disable-next-line complexity\nconst posixNormalize = (path, allowAboveRoot) => {\n let res = '';\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n // eslint-disable-next-line @typescript-eslint/init-declarations\n let code;\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) {\n code = path.charCodeAt(i);\n }\n else if (code === SLASH) {\n break;\n }\n else {\n code = SLASH;\n }\n if (code === SLASH) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n }\n else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 ||\n lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== DOT ||\n res.charCodeAt(res.length - 2) !== DOT) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n // eslint-disable-next-line max-depth\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n }\n else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) {\n res += '/..';\n }\n else {\n res = '..';\n }\n lastSegmentLength = 2;\n }\n }\n else {\n if (res.length > 0) {\n res += '/' + path.slice(lastSlash + 1, i);\n }\n else {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n }\n else if (code === DOT && dots !== -1) {\n // eslint-disable-next-line no-plusplus\n ++dots;\n }\n else {\n dots = -1;\n }\n }\n return res;\n};\nconst decode = (s) => {\n try {\n return decodeURIComponent(s);\n }\n catch {\n return s;\n }\n};\nconst normalize = (p) => {\n assertPath(p);\n let path = p;\n if (path.length === 0) {\n return '.';\n }\n const isAbsolute = path.charCodeAt(0) === SLASH;\n const trailingSeparator = path.charCodeAt(path.length - 1) === SLASH;\n path = decode(path);\n path = posixNormalize(path, !isAbsolute);\n if (path.length === 0 && !isAbsolute) {\n path = '.';\n }\n if (path.length > 0 && trailingSeparator) {\n path += '/';\n }\n if (isAbsolute) {\n return '/' + path;\n }\n return path;\n};\nexports.normalize = normalize;\nexports.default = exports.normalize;\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport pathNormalize from 'path-normalize'\n\nexport default class AttachmentResolver {\n\t#session\n\t#user\n\t#shareToken\n\t#currentDirectory\n\t#documentId\n\t#initAttachmentListPromise\n\t#attachmentList = []\n\n\tconstructor({ session, user, shareToken, currentDirectory, fileId }) {\n\t\tthis.#session = session\n\t\tthis.#user = user\n\t\tthis.#shareToken = shareToken\n\t\tthis.#currentDirectory = currentDirectory\n\t\tthis.#documentId = fileId ?? session.documentId\n\t\tthis.#initAttachmentListPromise = this.#updateAttachmentList()\n\t}\n\n\tasync #updateAttachmentList() {\n\t\tconst response = await axios.post(generateUrl('/apps/text/attachments'), {\n\t\t\tdocumentId: this.#session?.documentId ?? this.#documentId,\n\t\t\tsessionId: this.#session?.id,\n\t\t\tsessionToken: this.#session?.token,\n\t\t\tshareToken: this.#shareToken,\n\t\t})\n\t\tthis.#attachmentList = response.data\n\t}\n\n\t#findAttachment(fileName) {\n\t\treturn this.#attachmentList.find((a) => a.name === fileName)\n\t}\n\n\t/*\n\t * Resolve a given image/attachment src.\n\t * @param { string } src - the original src in the node.\n\t * @param { bool } fallback - fetch again attachmentsList if not found | defaul = true\n\t */\n\tasync resolve(src, fallback = true) {\n\t\tlet attachment\n\n\t\t// Native attachment\n\t\tconst directoryRegexp = /^\\.attachments\\.\\d+\\//\n\t\tif (src.match(directoryRegexp)) {\n\t\t\tconst imageFileName = decodeURIComponent(src.replace(directoryRegexp, '').split('?')[0])\n\n\t\t\t// Wait until attachment list got fetched (initialized by constructor)\n\t\t\tawait this.#initAttachmentListPromise\n\t\t\tattachment = this.#findAttachment(imageFileName)\n\n\t\t\tif (fallback && !attachment) {\n\t\t\t\t// Update attachments list. Needed if attachments gets added to the session\n\t\t\t\tawait this.#updateAttachmentList()\n\t\t\t\tattachment = this.#findAttachment(imageFileName)\n\t\t\t}\n\n\t\t\tif (attachment) {\n\t\t\t\treturn attachment\n\t\t\t}\n\t\t}\n\n\t\t// Direct URLs\n\t\tif (isDirectUrl(src)) {\n\t\t\treturn {\n\t\t\t\tisImage: true,\n\t\t\t\tname: this.#name(src),\n\t\t\t\tpreviewUrl: src,\n\t\t\t\tfullUrl: src,\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: Return DAV url (e.g. for relative paths to images)\n\t\treturn {\n\t\t\tisImage: true,\n\t\t\tname: this.#name(src),\n\t\t\tpreviewUrl: this.#davUrl(src),\n\t\t\tfullUrl: this.#davUrl(src),\n\t\t}\n\t}\n\n\t#name(src) {\n\t\treturn src.split('/').pop()\n\t}\n\n\t#davUrl(src) {\n\t\tif (this.#user) {\n\t\t\tconst uid = this.#user.uid\n\t\t\tconst encoded = this.#filePath(src)\n\t\t\t\t.split('/')\n\t\t\t\t.map(encodeURIComponent)\n\t\t\t\t.join('/')\n\t\t\treturn generateRemoteUrl(`dav/files/${uid}${encoded}`)\n\t\t}\n\n\t\tconst path = this.#filePath(src).split('/')\n\t\tconst basename = path.pop()\n\t\tconst dirname = path.join('/')\n\n\t\treturn generateUrl('/s/{token}/download?path={dirname}&files={basename}', {\n\t\t\ttoken: this.#shareToken,\n\t\t\tbasename,\n\t\t\tdirname,\n\t\t})\n\t}\n\n\t/**\n\t * Return the relativePath to a file specified in the url\n\t *\n\t * @param {string} src - url to extract path from\n\t */\n\t#relativePath(src) {\n\t\treturn decodeURI(src.split('?')[0])\n\t}\n\n\t#filePath(src) {\n\t\tconst f = [this.#currentDirectory, this.#relativePath(src)].join('/')\n\n\t\treturn pathNormalize(f)\n\t}\n}\n\n/**\n * Check if src is a direct URL.\n * Full URLs only work for images on the same Nextcloud instance (due to CORS restrictions).\n *\n * @param {string} src - the url to check\n */\nfunction isDirectUrl(src) {\n\treturn (\n\t\tsrc.startsWith('http://')\n\t\t|| src.startsWith('https://')\n\t\t|| src.startsWith('data:')\n\t)\n}\n"],"names":["isMobilePlatform","regex","_sfc_main","NcDialog","TRANSLATIONS","MODIFIERS","style","t","_hoisted_11","_hoisted_12","_hoisted_15","_hoisted_16","_hoisted_28","_createBlock","_component_NcDialog","$options","_ctx","_createElementVNode","_openBlock","_createElementBlock","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","$data","_cache","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_13","_hoisted_14","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","defineComponent","NextcloudVueNcActionButton","Help","_component_NextcloudVueNcActionButton","_mergeProps","_createVNode","_component_Help","_createTextVNode","BaseActionEntry","actionEntry","_resolveDynamicComponent","NcActions","NcActionSeparator","ActionListItem","useMenuIDMixin","state","editor","children","child","getIsActive","visible","debounce","val","entry","getActionState","_component_NcActions","_Fragment","_renderList","_component_NcActionSeparator","_component_ActionListItem","_renderSlot","NcButton","_component_NcButton","_normalizeClass","AlphabeticalVariant","NextcloudVueNcActionText","useEditor","countString","ref","storage","wordCount","charCount","words","n","chars","logger","_component_NextcloudVueNcActionText","_component_AlphabeticalVariant","NcIconSvgWrapper","ActionGlobalMixin","NC_ACTIONS_IS_SEMANTIC_MENU","createElementId","id","props","useModel","mdiCheckboxBlankOutline","mdiCheckboxMarked","event","_hoisted_1","_hoisted_2","_hoisted_3","_sfc_render","$props","$setup","_component_NcIconSvgWrapper","resolveComponent","openBlock","createElementBlock","normalizeClass","createElementVNode","withDirectives","$event","args","vModelCheckbox","createVNode","toDisplayString","NcActionCheckbox","_export_sfc","canToggleWidth","isFullWidth","setFullWidth","useEditorWidth","_unref","NextcloudVueNcActionCheckbox","useMenuEntries","isRichWorkspace","useEditorFlags","assistantMenuEntries","getAssistantMenuEntries","menuEntries","getMenuEntries","outlineEntries","readOnlyDoneEntries","readOnlyEditEntries","ToolBarLogic","menuKey","index","key","modulo","ActionFormattingHelp","ActionList","ActionSingle","HelpModal","CharacterCount","WidthToggle","useIsMobileMixin","MENU_ID","isPublic","isRichEditor","menubar","width","useElementSize","a","b","remainingEntries","entries","acc","separatorBefore","separatorAfter","DotsHorizontal","clickableArea","spaceToFill","spacePerSlot","el","_component_HelpModal","_component_ActionList","_withCtx","_component_WidthToggle","_component_ActionFormattingHelp","_component_CharacterCount","exports","SLASH","DOT","assertPath","path","posixNormalize","allowAboveRoot","res","lastSegmentLength","lastSlash","dots","code","i","lastSlashIndex","decode","s","normalize","p","isAbsolute","trailingSeparator","AttachmentResolver","#session","#user","#shareToken","#currentDirectory","#documentId","#initAttachmentListPromise","#attachmentList","session","user","shareToken","currentDirectory","fileId","#updateAttachmentList","response","axios","generateUrl","#findAttachment","fileName","src","fallback","attachment","directoryRegexp","imageFileName","isDirectUrl","#name","#davUrl","uid","encoded","#filePath","generateRemoteUrl","basename","dirname","#relativePath","f","pathNormalize"],"mappings":"s1BAUO,SAASA,IAAmB,CAElC,OAAI,WAAW,eAAe,SAAW,OACjC,UAAU,cAAc,OAIV,CACrB,WACA,SACA,UACA,QACA,QACA,YACA,QACA,cACA,gBACF,EAEsB,KAAMC,GAAU,UAAU,UAAU,MAAMA,CAAK,CAAC,CACtE,CCqRA,MAAKC,GAAU,CACd,KAAM,YACN,WAAY,CACX,SAAAC,IAGD,MAAO,CAAC,OAAO,EAEf,MAAO,CACN,MAAO,CACN,UAAW,CACV,KAAM,GACN,OAAQ,GACR,cAAe,GACf,SAAU,GACV,SAAU,GACV,aAAc,GACd,YAAa,GACb,UAAW,GACX,WAAY,GACZ,UAAW,IAGZ,aAAcC,GAAaC,GAAU,GAAG,CACzC,CACD,EAEA,SAAU,CACT,aAAc,CACb,OAAQC,GAAU,KAAK,UAAUA,CAAK,CACvC,EAGA,gBAAiB,CAChB,OAAO,KAAK,iBAAgB,CAC7B,GAGD,QAAS,GACRC,EACA,gBAAgBD,EAAO,CACtB,KAAK,UAAUA,CAAK,EAAI,CAAC,KAAK,UAAUA,CAAK,CAC9C,EAEA,iBAAAN,GAEF,gHA5OSQ,GAAA,CAAA,MAAM,cAAc,EAGpBC,GAAA,CAAA,MAAM,cAAc,YAGG,MAAM,0BAeN,MAAM,qBAK7BC,GAAA,CAAA,MAAM,0BAA0B,EAGhCC,GAAA,CAAA,MAAM,0BAA0B,YAGT,MAAM,0IAiH7BC,GAAA,CAAA,IAAI,iBAAiB,4DAhQ7BC,EAoSWC,EAAA,CAnSV,KAAK,QACL,eAAa,kBACZ,KAAMC,EAAA,EAAC,OAAA,0BAAA,EACR,oBAAA,GACC,yBAASC,EAAA,MAAK,OAAA,eACf,IAAoD,CAApDC,EAAoD,YAA7CF,EAAA,EAAC,OAAA,0BAAA,CAAA,EAAA,CAAA,EACRE,EAAsE,WAAhEF,EAAA,EAAC,OAAA,8CAAA,CAAA,EAAA,CAAA,EACGA,EAAA,gBAQVG,IAAAC,EAEI,SADAJ,EAAA,EAAC,OAAA,2CAAA,CAAA,EAAA,CAAA,IATLG,EAAA,EAAAC,EAOI,SALFJ,EAAA,qFAUFE,EA0OQ,QAAA,KAAA,CAzOPA,EAQQ,QAAA,KAAA,CAPPA,EAMK,KAAA,KAAA,CALJA,EAAiC,YAA1BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,EACRE,EAAkC,YAA3BF,EAAA,EAAC,OAAA,QAAA,CAAA,EAAA,CAAA,EACGA,EAAA,yBAAXG,IAAAC,EAEK,UADDJ,EAAA,EAAC,OAAA,oBAAA,CAAA,EAAA,CAAA,OAIPE,EA+NQ,QAAA,KAAA,CA9NPA,EAMK,KAAA,KAAA,CALJA,EAAyC,YAAlCF,EAAA,EAAC,OAAA,eAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,IAECA,EAAA,6BAAXI,EAA6B,KAAAC,EAAA,KAE9BH,EAYK,KAAA,KAAA,CAXJA,EAA2C,YAApCF,EAAA,EAAC,OAAA,iBAAA,CAAA,EAAA,CAAA,EACRE,EAIK,KAAA,KAAA,CAHJA,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,IAA0B,IACnCM,EAAGN,EAAA,EAAC,OAAA,aAAA,CAAA,EAA0B,IAC9B,CAAA,EAAAE,EAAuC,aAA/BF,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,IAECA,EAAA,6BAAXI,EAIK,KAAAG,GAAA,CAHJL,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,gBAA0B,MAEnC,EAAA,GAAAE,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,OAGXE,EAUK,KAAA,KAAA,CATJA,EAAgC,YAAzBF,EAAA,EAAC,OAAA,MAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA6C,OAAA,KAAvC,KAAEI,EAAGN,EAAA,uBAAyB,KAAE,CAAA,IAE5BA,EAAA,6BAAXI,EAIK,KAAAI,GAAA,CAHJN,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,gBAAS,MAE7B,EAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAUK,KAAA,KAAA,CATJA,EAAkC,YAA3BF,EAAA,EAAC,OAAA,QAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAiD,OAAA,KAA3C,IAACI,EAAGN,EAAA,6BAA+B,IAAC,CAAA,IAEhCA,EAAA,6BAAXI,EAIK,KAAAO,GAAA,CAHJT,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,gBAAS,MAE7B,EAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAUK,KAAA,KAAA,CATJA,EAAqC,YAA9BF,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAmD,OAAA,KAA7C,KAAEI,EAAGN,EAAA,6BAA+B,KAAE,CAAA,IAElCA,EAAA,6BAAXI,EAIK,KAAAQ,GAAA,CAHJV,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,gBAAS,MAE7B,EAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAAyC,YAAlCF,EAAA,EAAC,OAAA,eAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAiD,OAAA,KAA3C,KAAEI,EAAGN,EAAA,2BAA6B,KAAE,CAAA,IAEhCA,EAAA,6BAAXI,EAMK,KAAAS,GAAA,CALJX,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,gBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,gBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAAqC,YAA9BF,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAoD,OAAA,KAA9C,KAAEI,EAAGN,EAAA,8BAAgC,KAAE,CAAA,IAEnCA,EAAA,6BAAXI,EAMK,KAAAU,GAAA,CALJZ,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAcK,KAAA,KAAA,CAbJA,EAEK,KAFLT,GAEKa,EADDN,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,EAELE,EAEK,KAFLR,GAEK,CADJQ,EAAiD,OAAA,KAA3C,KAAEI,EAAGN,EAAA,EAAC,OAAA,iBAAA,CAAA,EAAA,CAAA,IAEFA,EAAA,yBAAXG,IAAAC,EAMK,KANLW,GAMK,CALJb,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAUK,KAAA,KAAA,CATJQ,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAEK,KAAA,CAFD,MAAM,mBAAmB,EAAC,MAE9B,EAAA,GACAQ,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAEK,KAAA,CAFD,MAAM,mBAAmB,EAAC,MAE9B,EAAA,GACWF,EAAA,6BAAXI,EAEK,KAFLY,GAAqD,KAErD,KAEDd,EAcK,KAAA,KAAA,CAbJA,EAEK,KAFLP,GAEKW,EADDN,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,EAELE,EAEK,KAFLN,GAEK,CADJM,EAAsD,OAAA,KAAhD,UAAOI,EAAGN,EAAA,EAAC,OAAA,iBAAA,CAAA,EAAA,CAAA,IAEPA,EAAA,yBAAXG,IAAAC,EAMK,KANLa,GAMK,CALJf,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAA0C,YAAnCF,EAAA,EAAC,OAAA,gBAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAyC,OAAA,KAAnC,KAAEI,EAAGN,EAAA,EAAC,OAAA,SAAA,CAAA,EAAA,CAAA,IAEFA,EAAA,6BAAXI,EAMK,KAAAc,GAAA,CALJhB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAAwC,YAAjCF,EAAA,EAAC,OAAA,cAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA6C,OAAA,KAAvC,MAAGI,EAAGN,EAAA,EAAC,OAAA,YAAA,CAAA,EAAA,CAAA,IAEHA,EAAA,6BAAXI,EAMK,KAAAe,GAAA,CALJjB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAAqC,YAA9BF,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA+C,OAAA,KAAzC,QAAKI,EAAGN,EAAA,EAAC,OAAA,YAAA,CAAA,EAAA,CAAA,IAELA,EAAA,6BAAXI,EAMK,KAAAgB,GAAA,CALJlB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAUK,KAAA,KAAA,CATJA,EAAsC,YAA/BF,EAAA,EAAC,OAAA,YAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA6C,OAAA,KAAvC,KAAEI,EAAGN,EAAA,EAAC,OAAA,aAAA,CAAA,EAAA,CAAA,IAEFA,EAAA,6BAAXI,EAIK,KAAAiB,GAAA,CAHJnB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAMK,KAAA,KAAA,CALJA,EAAsC,YAA/BF,EAAA,EAAC,OAAA,YAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA6C,OAAA,KAAvC,OAAII,EAAGN,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,IAEJA,EAAA,6BAAXI,EAA6B,KAAAkB,EAAA,KAE9BpB,EAUK,KAAA,KAAA,CATJA,EAAgC,YAAzBF,EAAA,EAAC,OAAA,MAAA,CAAA,EAAA,CAAA,gBACRE,EAEK,KAAA,KAAA,CADJA,EAAyC,YAAnC,8BAA4B,QAExBF,EAAA,6BAAXI,EAIK,KAAAmB,GAAA,CAHJrB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAYK,KAAA,KAAA,CAXJA,EAAoC,YAA7BF,EAAA,EAAC,OAAA,UAAA,CAAA,EAAA,CAAA,gBACRE,EAEK,KAAA,KAAA,CADJA,EAAgB,YAAV,KAAG,QAECF,EAAA,6BAAXI,EAMK,KAAAoB,GAAA,CALJtB,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAmC,aAA3BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,kBAA0B,MAEnC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,QAGRA,EAMK,KAAA,KAAA,CALJA,EAAiC,YAA1BF,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAsC,OAAA,KAAhC,IAACI,EAAGN,EAAA,EAAC,OAAA,OAAA,CAAA,EAAA,CAAA,IAEDA,EAAA,6BAAXI,EAA6B,KAAAqB,EAAA,KAE9BvB,EAMK,KAAA,KAAA,CALJA,EAA2C,YAApCF,EAAA,EAAC,OAAA,iBAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAAqC,OAAA,KAA/B,IAACI,EAAGN,EAAA,EAAC,OAAA,MAAA,CAAA,EAAA,CAAA,IAEDA,EAAA,6BAAXI,EAA6B,KAAAsB,EAAA,KAE9BxB,EAMK,KAAA,KAAA,CALJA,EAAwC,YAAjCF,EAAA,EAAC,OAAA,cAAA,CAAA,EAAA,CAAA,EACRE,EAEK,KAAA,KAAA,CADJA,EAA0C,OAAA,KAApC,IAACI,EAAGN,EAAA,EAAC,OAAA,WAAA,CAAA,EAAA,CAAA,IAEDA,EAAA,6BAAXI,EAA6B,KAAAuB,EAAA,SAKhCzB,EAmCQ,QAnCRL,GAmCQ,CAlCPK,EAKQ,QAAA,KAAA,CAJPA,EAGK,KAAA,KAAA,CAFJA,EAAkC,YAA3BF,EAAA,EAAC,OAAA,QAAA,CAAA,EAAA,CAAA,EACRE,EAA8C,YAAvCF,EAAA,EAAC,OAAA,oBAAA,CAAA,EAAA,CAAA,MAGVE,EA2BQ,QAAA,KAAA,CA1BPA,EAOK,KAAA,KAAA,CANJA,EAAgC,YAAzBF,EAAA,EAAC,OAAA,MAAA,CAAA,EAAA,CAAA,EACRE,EAIK,KAAA,KAAA,CAHJA,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,OAGRA,EAOK,KAAA,KAAA,CANJA,EAAgC,YAAzBF,EAAA,EAAC,OAAA,MAAA,CAAA,EAAA,CAAA,EACRE,EAIK,KAAA,KAAA,CAHJA,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,OAGRA,EASK,KAAA,KAAA,CARJA,EAA0C,YAAnCF,EAAA,EAAC,OAAA,gBAAA,CAAA,EAAA,CAAA,EACRE,EAMK,KAAA,KAAA,CALJA,EAA6B,aAArBO,EAAA,YAAY,EAAA,CAAA,kBAAS,MAE7B,EAAA,GAAAP,EAAiC,aAAzBF,EAAA,EAAC,OAAA,KAAA,CAAA,EAAA,CAAA,kBAAwB,MAEjC,EAAA,GAAAU,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAY,WAAP,IAAC,EAAA,6FC/QPf,GAAayC,EAAa,CAM9B,KAAM,iBACN,WAAY,4BACXC,EACA,KAAAC,IAGD,QAAS,GACRtC,EAEF,CAAC,+EAhCA,OAAAW,EAAA,EAAAL,EAQ6BiC,EAR7BC,EAQ6B,CAP5B,gBAAA,GACA,yBAAuB,mBACf/B,EAAA,MAAM,EAAA,CACH,OACV, FileName: ./js/BaseReader-B7jdmiPj.chunk.mjs SPDXID: SPDXRef-2bac3047ff54c16e1c6a689a2b10ad22 FileChecksum: SHA1: 4c23722a1ef400a3d883f48075887380654d0003 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/BaseReader-B7jdmiPj.chunk.mjs.map SPDXID: SPDXRef-a26cbd05cf21bf2f7001d762d888f327 FileChecksum: SHA1: f7248f3a4dec3f819a609d0699237bf3220fd482 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n"],"names":["_sfc_main","EditorContent","TocContainer","props","extensions","inject","editor","markRaw","Editor","provideEditor","hasTableOfContents","useEditorFlags","setContent","setEditable","useEditorMethods","watch","content","logger","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_EditorContent","$setup","_createBlock","_component_TocContainer"],"mappings":"2PAyBA,MAAKA,EAAU,CACd,KAAM,aACN,WAAY,CACX,cAAAC,EACA,aAAAC,GAGD,MAAO,CACN,QAAS,CACR,KAAM,OACN,SAAU,KAIZ,MAAMC,EAAO,CAEZ,MAAMC,EAAaC,EAAO,YAAY,EAChCC,EAASC,EAAQ,IAAIC,EAAO,CAAE,WAAYJ,EAAU,EAAI,CAAC,EAC/DK,EAAcH,CAAM,EAEpB,KAAM,CAAE,mBAAAI,CAAiB,EAAMC,EAAc,EACvC,CAAE,WAAAC,EAAY,YAAAC,CAAU,EAAMC,EAAiBR,CAAM,EAC3D,OAAAS,EACC,IAAMZ,EAAM,QACXa,GAAY,CACZC,EAAO,KAAK,4BAA6B,CAAE,QAAAD,CAAM,CAAG,EACpDJ,EAAWI,CAAO,CACnB,CACD,EACAH,EAAY,EAAK,EAIjBD,EAAWT,EAAM,QAAS,CAAE,aAAc,GAAO,EAC1C,CAAE,OAAAG,EAAQ,mBAAAI,CAAiB,CACnC,EAEA,eAAgB,CACf,KAAK,QAAQ,QAAO,CACrB,CACD,KA3DM,eAAa,yBAAyB,MAAM,kGAAjD,OAAAQ,EAAA,EAAAC,EAMM,MANNC,EAMM,CALLC,EAGoBC,EAAA,CAFnB,GAAG,mBACH,MAAM,uCACL,OAAQC,EAAA,2BACUA,EAAA,wBAApBC,EAA0CC,EAAA,CAAA,IAAA,CAAA,CAAA" SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/CollaborativeEditorApp-CKsyPJtA.chunk.mjs SPDXID: SPDXRef-d6388576291af3611a2525851f7ddc52 FileChecksum: SHA1: afe37ce4ac79416650a4e515f1199a45ea9301d2 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/CollaborativeEditorApp-CKsyPJtA.chunk.mjs.map SPDXID: SPDXRef-514c6166ed75827b9823b60059f7b57e FileChecksum: SHA1: b24c3d258a38ea2984d15a6c62d19b0c1d5bdac6 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n"],"names":["emit","__emit","editorContainer","useTemplateRef","__expose","_createBlock","EditorReloader","__props","_cache","c","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps"],"mappings":"wjCAgDA,MAAMA,EAAOC,EAMPC,EAAkBC,EAAe,kBAAkB,EACzD,OAAAC,EAAa,CAAE,gBAAAF,EAAiB,cAjD/BG,EAeiBC,EAAA,CAdhB,IAAI,mBACH,OAAAC,EAAA,OACA,aAAAA,EAAA,aACA,aAAcA,EAAA,SACd,WAAAA,EAAA,WACD,KAAK,gBACL,OAAA,GACC,UAAAA,EAAA,UACA,uBAAOP,EAAI,OAAA,GACX,mBAAcQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGC,GAA4BT,mBAAuBS,CAAC,GACrE,mBAAcD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGC,GAA4BT,mBAAuBS,CAAC,EAAA,WACtDF,EAAA,2BAAuB,mBACtC,IAAkE,MAAlEF,EAAkEK,EAAlDH,EAAA,oBAAoB,EAAAI,EAAAC,EAAUL,EAAA,gBAAgB,CAAA,EAAA,KAAA,EAAA,EAAA" FileName: ./js/Editor.provider-DrD4_5-q.chunk.mjs SPDXID: SPDXRef-390220069460f92559e048fea9a9ad34 FileChecksum: SHA1: 71fcdf275dee0ab7bd48484e82566d91039ae679 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/Editor.provider-DrD4_5-q.chunk.mjs.map SPDXID: SPDXRef-717bc38222e729ab79ec14fd4a71944b FileChecksum: SHA1: 829183f97f08adf74e11a8af2eeccba3c12caaef LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2020, 2026, 2022, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { generateUrl } from '@nextcloud/router'\n\n/**\n * Href to be used in the dom\n *\n * @param {import('@tiptap/pm/model').Mark} mark to compute href for\n */\nfunction domHref(mark) {\n\tconst ref = mark.attrs.href\n\tif (!ref) {\n\t\treturn ref\n\t}\n\tif (!window.OCA?.Viewer) {\n\t\treturn ref\n\t}\n\tif (ref.match(/^[a-zA-Z]*:/)) {\n\t\treturn ref\n\t}\n\tif (ref.startsWith('#')) {\n\t\treturn ref\n\t}\n\t// Don't rewrite links in collectives app context\n\tif (loadState('core', 'active-app', '') === 'collectives') {\n\t\treturn ref\n\t}\n\t// Don't rewrite links to the collectives app\n\tif (ref.includes('/apps/collectives/')) {\n\t\treturn ref\n\t}\n\n\t// Rewrite links with old format from file picker to `/f/`\n\tconst match = ref.match(/^([^?]*)\\?fileId=(\\d+)/)\n\tif (match) {\n\t\tconst [, , id] = match\n\t\treturn new URL(generateUrl(`/f/${id}`), window.origin).href\n\t}\n\treturn ref\n}\n\n/**\n *\n * @param {Element} dom element to parse\n */\nfunction parseHref(dom) {\n\tconst ref = dom.getAttribute('href')\n\tif (!ref) {\n\t\treturn ref\n\t}\n\tconst match = ref.match(/\\?dir=([^&]*)&openfile=([^&]*)#relPath=([^&]*)/)\n\tif (match) {\n\t\tconst [, , id] = match\n\t\treturn new URL(generateUrl(`/f/${id}`), window.origin).href\n\t}\n\treturn ref\n}\n\n/**\n *\n * @param {string} href url to check\n */\nfunction isLinkToSelfWithHash(href) {\n\tconst locationNoHash\n\t\t= window.location.origin + window.location.pathname + window.location.search\n\treturn href?.startsWith('#') || href?.startsWith(locationNoHash + '#')\n}\n\n/**\n * Open links, to be used as custom click handler\n *\n * @param {string} href the link href\n */\nfunction openLink(href) {\n\tconst linkUrl = new URL(href, window.location.href)\n\twindow.open(linkUrl.href, '_blank')\n}\n\nexport { domHref, isLinkToSelfWithHash, openLink, parseHref }\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { inject } from 'vue'\nimport { openLink } from '../helpers/links.js'\n\nexport const OPEN_LINK_HANDLER = Symbol('editor:open-link-handler')\n\n/**\n * Inject provided link handler\n */\nexport function useOpenLinkHandler() {\n\tconst openLinkHandler = inject(OPEN_LINK_HANDLER, { openLink })\n\treturn { openLinkHandler }\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport const STATE_UPLOADING = Symbol('state:uploading-state')\nexport const ACTION_ATTACHMENT_PROMPT = Symbol('editor:action:attachment-prompt')\nexport const ACTION_CHOOSE_LOCAL_ATTACHMENT = Symbol('editor:action:upload-attachment')\nexport const ACTION_CREATE_ATTACHMENT = Symbol('editor:action:create-attachment')\n\nexport const useUploadingStateMixin = {\n\tinject: {\n\t\t$uploadingState: {\n\t\t\tfrom: STATE_UPLOADING,\n\t\t\tdefault: {\n\t\t\t\tisUploadingAttachments: false,\n\t\t\t},\n\t\t},\n\t},\n}\n\nexport const useActionAttachmentPromptMixin = {\n\tinject: {\n\t\t$callAttachmentPrompt: { from: ACTION_ATTACHMENT_PROMPT, default: () => {} },\n\t},\n}\n\nexport const useActionChooseLocalAttachmentMixin = {\n\tinject: {\n\t\t$callChooseLocalAttachment: {\n\t\t\tfrom: ACTION_CHOOSE_LOCAL_ATTACHMENT,\n\t\t\tdefault: () => {},\n\t\t},\n\t},\n}\n\nexport const useActionCreateAttachmentMixin = {\n\tinject: {\n\t\t$callCreateAttachment: {\n\t\t\tfrom: ACTION_CREATE_ATTACHMENT,\n\t\t\tdefault: () => () => {},\n\t\t},\n\t},\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { shallowRef } from 'vue'\nimport { logger } from '../helpers/logger.js'\n\nexport const ATTACHMENT_RESOLVER = Symbol('attachment:resolver')\nexport const IS_MOBILE = Symbol('editor:is-mobile')\nexport const EDITOR_UPLOAD = Symbol('editor:upload')\nexport const HOOK_MENTION_SEARCH = Symbol('hook:mention-search')\nexport const HOOK_MENTION_INSERT = Symbol('hook:mention-insert')\nexport const HOOK_MENUBAR_LINK_CUSTOM_ACTION = Symbol('menubar:link-custom-action')\n\nexport const useIsMobileMixin = {\n\tinject: {\n\t\t$isMobile: { from: IS_MOBILE, default: false },\n\t},\n}\n\nconst defaultAttachmentResolver = shallowRef({\n\tresolve(src: string) {\n\t\tlogger.warn('No attachment resolver provided. Some attachment sources cannot be resolved.')\n\t\treturn [src]\n\t},\n})\n\nexport const useAttachmentResolver = {\n\tinject: {\n\t\t$attachmentResolver: {\n\t\t\tfrom: ATTACHMENT_RESOLVER,\n\t\t\tdefault: defaultAttachmentResolver,\n\t\t},\n\t},\n}\nexport const useEditorUpload = {\n\tinject: {\n\t\t$editorUpload: {\n\t\t\tfrom: EDITOR_UPLOAD,\n\t\t\tdefault: false,\n\t\t},\n\t},\n}\nexport const useMentionHook = {\n\tinject: {\n\t\t$mentionHookInsert: {\n\t\t\tfrom: HOOK_MENTION_INSERT,\n\t\t\tdefault: true,\n\t\t},\n\t\t$mentionHookSearch: {\n\t\t\tfrom: HOOK_MENTION_SEARCH,\n\t\t\tdefault: true,\n\t\t},\n\t},\n}\n"],"names":["domHref","mark","ref","loadState","match","id","generateUrl","parseHref","dom","isLinkToSelfWithHash","href","locationNoHash","openLink","linkUrl","OPEN_LINK_HANDLER","useOpenLinkHandler","inject","STATE_UPLOADING","ACTION_ATTACHMENT_PROMPT","ACTION_CHOOSE_LOCAL_ATTACHMENT","ACTION_CREATE_ATTACHMENT","useUploadingStateMixin","useActionAttachmentPromptMixin","useActionChooseLocalAttachmentMixin","useActionCreateAttachmentMixin","ATTACHMENT_RESOLVER","IS_MOBILE","EDITOR_UPLOAD","HOOK_MENTION_SEARCH","HOOK_MENTION_INSERT","HOOK_MENUBAR_LINK_CUSTOM_ACTION","useIsMobileMixin","defaultAttachmentResolver","shallowRef","src","logger","useAttachmentResolver","useEditorUpload"],"mappings":"sMAaA,SAASA,EAAQC,EAAM,CACtB,MAAMC,EAAMD,EAAK,MAAM,KAkBvB,GAjBI,CAACC,GAGD,CAAC,OAAO,KAAK,QAGbA,EAAI,MAAM,aAAa,GAGvBA,EAAI,WAAW,GAAG,GAIlBC,EAAU,OAAQ,aAAc,EAAE,IAAM,eAIxCD,EAAI,SAAS,oBAAoB,EACpC,OAAOA,EAIR,MAAME,EAAQF,EAAI,MAAM,wBAAwB,EAChD,GAAIE,EAAO,CACV,KAAM,CAAA,CAAA,CAAKC,CAAE,EAAID,EACjB,OAAO,IAAI,IAAIE,EAAY,MAAMD,CAAE,EAAE,EAAG,OAAO,MAAM,EAAE,IACxD,CACA,OAAOH,CACR,CAMA,SAASK,EAAUC,EAAK,CACvB,MAAMN,EAAMM,EAAI,aAAa,MAAM,EACnC,GAAI,CAACN,EACJ,OAAOA,EAER,MAAME,EAAQF,EAAI,MAAM,gDAAgD,EACxE,GAAIE,EAAO,CACV,KAAM,CAAA,CAAA,CAAKC,CAAE,EAAID,EACjB,OAAO,IAAI,IAAIE,EAAY,MAAMD,CAAE,EAAE,EAAG,OAAO,MAAM,EAAE,IACxD,CACA,OAAOH,CACR,CAMA,SAASO,EAAqBC,EAAM,CACnC,MAAMC,EACH,OAAO,SAAS,OAAS,OAAO,SAAS,SAAW,OAAO,SAAS,OACvE,OAAOD,GAAM,WAAW,GAAG,GAAKA,GAAM,WAAWC,EAAiB,GAAG,CACtE,CAOA,SAASC,EAASF,EAAM,CACvB,MAAMG,EAAU,IAAI,IAAIH,EAAM,OAAO,SAAS,IAAI,EAClD,OAAO,KAAKG,EAAQ,KAAM,QAAQ,CACnC,CCxEO,MAAMC,SAA2B,0BAA0B,EAK3D,SAASC,GAAqB,CAEpC,MAAO,CAAE,gBADeC,EAAOF,EAAmB,CAAE,SAAAF,EAAU,CACrD,CACV,CCXY,MAACK,EAAkB,OAAO,uBAAuB,EAChDC,EAA2B,OAAO,iCAAiC,EACnEC,EAAiC,OAAO,iCAAiC,EACzEC,EAA2B,OAAO,iCAAiC,EAEnEC,EAAyB,CACrC,OAAQ,CACP,gBAAiB,CAChB,KAAMJ,EACN,QAAS,CACR,uBAAwB,EAC5B,CACA,CACA,CACA,EAEaK,EAAiC,CAC7C,OAAQ,CACP,sBAAuB,CAAE,KAAMJ,EAA0B,QAAS,IAAM,CAAC,CAAC,CAC5E,CACA,EAEaK,EAAsC,CAClD,OAAQ,CACP,2BAA4B,CAC3B,KAAMJ,EACN,QAAS,IAAM,CAAC,CACnB,CACA,CACA,EAEaK,EAAiC,CAC7C,OAAQ,CACP,sBAAuB,CACtB,KAAMJ,EACN,QAAS,IAAM,IAAM,CAAC,CACzB,CACA,CACA,ECnCaK,SAA6B,qBAAqB,EAClDC,SAAmB,kBAAkB,EACrCC,SAAuB,eAAe,EACtCC,SAA6B,qBAAqB,EAClDC,SAA6B,qBAAqB,EAClDC,SAAyC,4BAA4B,EAErEC,EAAmB,CAC/B,OAAQ,CACP,UAAW,CAAE,KAAML,EAAW,QAAS,EAAA,CAAM,CAE/C,EAEMM,EAA4BC,EAAW,CAC5C,QAAQC,EAAa,CACpB,OAAAC,EAAO,KAAK,8EAA8E,EACnF,CAACD,CAAG,CACZ,CACD,CAAC,EAEYE,EAAwB,CACpC,OAAQ,CACP,oBAAqB,CACpB,KAAMX,EACN,QAASO,CAAA,CACV,CAEF,EACaK,EAAkB,CAC9B,OAAQ,CACP,cAAe,CACd,KAAMV,EACN,QAAS,EAAA,CACV,CAEF" FileName: ./js/EditorReloader.vue_vue_type_script_setup_true_lang-nS5NibIi.chunk.mjs SPDXID: SPDXRef-b56e9a221ca9c6ec18ed6412779cb850 FileChecksum: SHA1: 65b48c38afa59e167df0fff4ec9b5fcfbd50eb64 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: Apache-2.0 LicenseInfoInFile: GPL-3.0-or-later LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Christoph Wurst SPDX-FileCopyrightText: Evan You SPDX-FileCopyrightText: Iskren Ivov Chernev (https://github.com/ichernev) SPDX-FileCopyrightText: Kevin Jahns SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Rob Cresswell SPDX-FileCopyrightText: The Chromium Authors SPDX-FileCopyrightText: text developers FileName: ./js/EditorReloader.vue_vue_type_script_setup_true_lang-nS5NibIi.chunk.mjs.map SPDXID: SPDXRef-6b7b48ab80f8921aaac3ccbd2569cac8 FileChecksum: SHA1: e5b2859e53667d61bb59ff55fc5f44d60e7654a2 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2022, 2023, 2025, 2025, 2025, 2016, 2018, 2019, 2019, 2025, 2023, 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n","\n\n\n\t\n\n\n\n\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Ref } from 'vue'\n\nimport { ref, watch } from 'vue'\n\n/**\n * Delay the changing of the boolean\n *\n * @param input - ref to react to\n * @param customDelay - custom delay\n */\nexport function useDelayedFlag(\n\tinput: Ref,\n\tcustomDelay?: number,\n): { delayed: Ref } {\n\tlet timeout: ReturnType | undefined\n\tconst delayed = ref(input.value)\n\n\twatch(input, (val) => {\n\t\tif (timeout) {\n\t\t\tclearTimeout(timeout)\n\t\t}\n\t\tconst delay = val ? (customDelay ?? 5000) : 200\n\t\ttimeout = setTimeout(() => {\n\t\t\tdelayed.value = val\n\t\t}, delay)\n\t})\n\n\treturn { delayed }\n}\n","/* eslint-env browser */\n\n/**\n * Helpers to work with IndexedDB.\n *\n * @module indexeddb\n */\n\nimport * as promise from './promise.js'\nimport * as error from './error.js'\n\n/* c8 ignore start */\n\n/**\n * IDB Request to Promise transformer\n *\n * @param {IDBRequest} request\n * @return {Promise}\n */\nexport const rtop = request => promise.create((resolve, reject) => {\n // @ts-ignore\n request.onerror = event => reject(new Error(event.target.error))\n // @ts-ignore\n request.onsuccess = event => resolve(event.target.result)\n})\n\n/**\n * @param {string} name\n * @param {function(IDBDatabase):any} initDB Called when the database is first created\n * @return {Promise}\n */\nexport const openDB = (name, initDB) => promise.create((resolve, reject) => {\n const request = indexedDB.open(name)\n /**\n * @param {any} event\n */\n request.onupgradeneeded = event => initDB(event.target.result)\n /**\n * @param {any} event\n */\n request.onerror = event => reject(error.create(event.target.error))\n /**\n * @param {any} event\n */\n request.onsuccess = event => {\n /**\n * @type {IDBDatabase}\n */\n const db = event.target.result\n db.onversionchange = () => { db.close() }\n resolve(db)\n }\n})\n\n/**\n * @param {string} name\n */\nexport const deleteDB = name => rtop(indexedDB.deleteDatabase(name))\n\n/**\n * @param {IDBDatabase} db\n * @param {Array|Array>} definitions\n */\nexport const createStores = (db, definitions) => definitions.forEach(d =>\n // @ts-ignore\n db.createObjectStore.apply(db, d)\n)\n\n/**\n * @param {IDBDatabase} db\n * @param {Array} stores\n * @param {\"readwrite\"|\"readonly\"} [access]\n * @return {Array}\n */\nexport const transact = (db, stores, access = 'readwrite') => {\n const transaction = db.transaction(stores, access)\n return stores.map(store => getStore(transaction, store))\n}\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange} [range]\n * @return {Promise}\n */\nexport const count = (store, range) =>\n rtop(store.count(range))\n\n/**\n * @param {IDBObjectStore} store\n * @param {String | number | ArrayBuffer | Date | Array } key\n * @return {Promise>}\n */\nexport const get = (store, key) =>\n rtop(store.get(key))\n\n/**\n * @param {IDBObjectStore} store\n * @param {String | number | ArrayBuffer | Date | IDBKeyRange | Array } key\n */\nexport const del = (store, key) =>\n rtop(store.delete(key))\n\n/**\n * @param {IDBObjectStore} store\n * @param {String | number | ArrayBuffer | Date | boolean} item\n * @param {String | number | ArrayBuffer | Date | Array} [key]\n */\nexport const put = (store, item, key) =>\n rtop(store.put(item, key))\n\n/**\n * @param {IDBObjectStore} store\n * @param {String | number | ArrayBuffer | Date | boolean} item\n * @param {String | number | ArrayBuffer | Date | Array} key\n * @return {Promise}\n */\nexport const add = (store, item, key) =>\n rtop(store.add(item, key))\n\n/**\n * @param {IDBObjectStore} store\n * @param {String | number | ArrayBuffer | Date} item\n * @return {Promise} Returns the generated key\n */\nexport const addAutoKey = (store, item) =>\n rtop(store.add(item))\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange} [range]\n * @param {number} [limit]\n * @return {Promise>}\n */\nexport const getAll = (store, range, limit) =>\n rtop(store.getAll(range, limit))\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange} [range]\n * @param {number} [limit]\n * @return {Promise>}\n */\nexport const getAllKeys = (store, range, limit) =>\n rtop(store.getAllKeys(range, limit))\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange|null} query\n * @param {'next'|'prev'|'nextunique'|'prevunique'} direction\n * @return {Promise}\n */\nexport const queryFirst = (store, query, direction) => {\n /**\n * @type {any}\n */\n let first = null\n return iterateKeys(store, query, key => {\n first = key\n return false\n }, direction).then(() => first)\n}\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange?} [range]\n * @return {Promise}\n */\nexport const getLastKey = (store, range = null) => queryFirst(store, range, 'prev')\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange?} [range]\n * @return {Promise}\n */\nexport const getFirstKey = (store, range = null) => queryFirst(store, range, 'next')\n\n/**\n * @typedef KeyValuePair\n * @type {Object}\n * @property {any} k key\n * @property {any} v Value\n */\n\n/**\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange} [range]\n * @param {number} [limit]\n * @return {Promise>}\n */\nexport const getAllKeysValues = (store, range, limit) =>\n // @ts-ignore\n promise.all([getAllKeys(store, range, limit), getAll(store, range, limit)]).then(([ks, vs]) => ks.map((k, i) => ({ k, v: vs[i] })))\n\n/**\n * @param {any} request\n * @param {function(IDBCursorWithValue):void|boolean|Promise} f\n * @return {Promise}\n */\nconst iterateOnRequest = (request, f) => promise.create((resolve, reject) => {\n request.onerror = reject\n /**\n * @param {any} event\n */\n request.onsuccess = async event => {\n const cursor = event.target.result\n if (cursor === null || (await f(cursor)) === false) {\n return resolve()\n }\n cursor.continue()\n }\n})\n\n/**\n * Iterate on keys and values\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange|null} keyrange\n * @param {function(any,any):void|boolean|Promise} f Callback that receives (value, key)\n * @param {'next'|'prev'|'nextunique'|'prevunique'} direction\n */\nexport const iterate = (store, keyrange, f, direction = 'next') =>\n iterateOnRequest(store.openCursor(keyrange, direction), cursor => f(cursor.value, cursor.key))\n\n/**\n * Iterate on the keys (no values)\n *\n * @param {IDBObjectStore} store\n * @param {IDBKeyRange|null} keyrange\n * @param {function(any):void|boolean|Promise} f callback that receives the key\n * @param {'next'|'prev'|'nextunique'|'prevunique'} direction\n */\nexport const iterateKeys = (store, keyrange, f, direction = 'next') =>\n iterateOnRequest(store.openKeyCursor(keyrange, direction), cursor => f(cursor.key))\n\n/**\n * Open store from transaction\n * @param {IDBTransaction} t\n * @param {String} store\n * @returns {IDBObjectStore}\n */\nexport const getStore = (t, store) => t.objectStore(store)\n\n/**\n * @param {any} lower\n * @param {any} upper\n * @param {boolean} lowerOpen\n * @param {boolean} upperOpen\n */\nexport const createIDBKeyRangeBound = (lower, upper, lowerOpen, upperOpen) => IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen)\n\n/**\n * @param {any} upper\n * @param {boolean} upperOpen\n */\nexport const createIDBKeyRangeUpperBound = (upper, upperOpen) => IDBKeyRange.upperBound(upper, upperOpen)\n\n/**\n * @param {any} lower\n * @param {boolean} lowerOpen\n */\nexport const createIDBKeyRangeLowerBound = (lower, lowerOpen) => IDBKeyRange.lowerBound(lower, lowerOpen)\n\n/* c8 ignore stop */\n","import * as Y from 'yjs'\nimport * as idb from 'lib0/indexeddb'\nimport * as promise from 'lib0/promise'\nimport { Observable } from 'lib0/observable'\n\nconst customStoreName = 'custom'\nconst updatesStoreName = 'updates'\n\nexport const PREFERRED_TRIM_SIZE = 500\n\n/**\n * @param {IndexeddbPersistence} idbPersistence\n * @param {function(IDBObjectStore):void} [beforeApplyUpdatesCallback]\n * @param {function(IDBObjectStore):void} [afterApplyUpdatesCallback]\n */\nexport const fetchUpdates = (idbPersistence, beforeApplyUpdatesCallback = () => {}, afterApplyUpdatesCallback = () => {}) => {\n const [updatesStore] = idb.transact(/** @type {IDBDatabase} */ (idbPersistence.db), [updatesStoreName]) // , 'readonly')\n return idb.getAll(updatesStore, idb.createIDBKeyRangeLowerBound(idbPersistence._dbref, false)).then(updates => {\n if (!idbPersistence._destroyed) {\n beforeApplyUpdatesCallback(updatesStore)\n Y.transact(idbPersistence.doc, () => {\n updates.forEach(val => Y.applyUpdate(idbPersistence.doc, val))\n }, idbPersistence, false)\n afterApplyUpdatesCallback(updatesStore)\n }\n })\n .then(() => idb.getLastKey(updatesStore).then(lastKey => { idbPersistence._dbref = lastKey + 1 }))\n .then(() => idb.count(updatesStore).then(cnt => { idbPersistence._dbsize = cnt }))\n .then(() => updatesStore)\n}\n\n/**\n * @param {IndexeddbPersistence} idbPersistence\n * @param {boolean} forceStore\n */\nexport const storeState = (idbPersistence, forceStore = true) =>\n fetchUpdates(idbPersistence)\n .then(updatesStore => {\n if (forceStore || idbPersistence._dbsize >= PREFERRED_TRIM_SIZE) {\n idb.addAutoKey(updatesStore, Y.encodeStateAsUpdate(idbPersistence.doc))\n .then(() => idb.del(updatesStore, idb.createIDBKeyRangeUpperBound(idbPersistence._dbref, true)))\n .then(() => idb.count(updatesStore).then(cnt => { idbPersistence._dbsize = cnt }))\n }\n })\n\n/**\n * @param {string} name\n */\nexport const clearDocument = name => idb.deleteDB(name)\n\n/**\n * @extends Observable\n */\nexport class IndexeddbPersistence extends Observable {\n /**\n * @param {string} name\n * @param {Y.Doc} doc\n */\n constructor (name, doc) {\n super()\n this.doc = doc\n this.name = name\n this._dbref = 0\n this._dbsize = 0\n this._destroyed = false\n /**\n * @type {IDBDatabase|null}\n */\n this.db = null\n this.synced = false\n this._db = idb.openDB(name, db =>\n idb.createStores(db, [\n ['updates', { autoIncrement: true }],\n ['custom']\n ])\n )\n /**\n * @type {Promise}\n */\n this.whenSynced = promise.create(resolve => this.on('synced', () => resolve(this)))\n\n this._db.then(db => {\n this.db = db\n /**\n * @param {IDBObjectStore} updatesStore\n */\n const beforeApplyUpdatesCallback = (updatesStore) => idb.addAutoKey(updatesStore, Y.encodeStateAsUpdate(doc))\n const afterApplyUpdatesCallback = () => {\n if (this._destroyed) return this\n this.synced = true\n this.emit('synced', [this])\n }\n fetchUpdates(this, beforeApplyUpdatesCallback, afterApplyUpdatesCallback)\n })\n /**\n * Timeout in ms untill data is merged and persisted in idb.\n */\n this._storeTimeout = 1000\n /**\n * @type {any}\n */\n this._storeTimeoutId = null\n /**\n * @param {Uint8Array} update\n * @param {any} origin\n */\n this._storeUpdate = (update, origin) => {\n if (this.db && origin !== this) {\n const [updatesStore] = idb.transact(/** @type {IDBDatabase} */ (this.db), [updatesStoreName])\n idb.addAutoKey(updatesStore, update)\n if (++this._dbsize >= PREFERRED_TRIM_SIZE) {\n // debounce store call\n if (this._storeTimeoutId !== null) {\n clearTimeout(this._storeTimeoutId)\n }\n this._storeTimeoutId = setTimeout(() => {\n storeState(this, false)\n this._storeTimeoutId = null\n }, this._storeTimeout)\n }\n }\n }\n doc.on('update', this._storeUpdate)\n this.destroy = this.destroy.bind(this)\n doc.on('destroy', this.destroy)\n }\n\n destroy () {\n if (this._storeTimeoutId) {\n clearTimeout(this._storeTimeoutId)\n }\n this.doc.off('update', this._storeUpdate)\n this.doc.off('destroy', this.destroy)\n this._destroyed = true\n return this._db.then(db => {\n db.close()\n })\n }\n\n /**\n * Destroys this instance and removes all data from indexeddb.\n *\n * @return {Promise}\n */\n clearData () {\n return this.destroy().then(() => {\n idb.deleteDB(this.name)\n })\n }\n\n /**\n * @param {String | number | ArrayBuffer | Date} key\n * @return {Promise}\n */\n get (key) {\n return this._db.then(db => {\n const [custom] = idb.transact(db, [customStoreName], 'readonly')\n return idb.get(custom, key)\n })\n }\n\n /**\n * @param {String | number | ArrayBuffer | Date} key\n * @param {String | number | ArrayBuffer | Date} value\n * @return {Promise}\n */\n set (key, value) {\n return this._db.then(db => {\n const [custom] = idb.transact(db, [customStoreName])\n return idb.put(custom, value, key)\n })\n }\n\n /**\n * @param {String | number | ArrayBuffer | Date} key\n * @return {Promise}\n */\n del (key) {\n return this._db.then(db => {\n const [custom] = idb.transact(db, [customStoreName])\n return idb.del(custom, key)\n })\n }\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Doc } from 'yjs'\n\nimport { readonly, ref } from 'vue'\nimport { IndexeddbPersistence } from 'y-indexeddb'\nimport { logger } from '../helpers/logger.js'\n\n/**\n * Initialize a indexed db provider for the given ydoc\n *\n * @param props Props of the editor component.\n * @param props.fileId Fileid of the file.\n * @param ydoc Document to sync via the provider\n */\nexport function useIndexedDbProvider(\n\tprops: {\n\t\tfileId: number\n\t},\n\tydoc: Doc,\n) {\n\tconst name = `text-${props.fileId}`\n\tconst indexedDbProvider = new IndexeddbPersistence(name, ydoc)\n\tconst dirty = ref(false)\n\tlet isDestroyed = false\n\tconst whenSynced: Promise = indexedDbProvider.whenSynced.then(async () => {\n\t\tconst val = await indexedDbProvider.get('dirty')\n\t\tdirty.value = Boolean(val)\n\t\tlogger.info('synced from indexeddb', {\n\t\t\tdirty: val,\n\t\t\tbaseVersionEtag: await indexedDbProvider.get('baseVersionEtag'),\n\t\t})\n\t})\n\n\t/**\n\t * Set the dirty flag to indicate (no) unsaved changes.\n\t *\n\t * @param val truethy if there are unsaved changes.\n\t */\n\tfunction setDirty(val: boolean) {\n\t\tdirty.value = Boolean(val)\n\t\tif (isDestroyed) {\n\t\t\tlogger.debug('IndexedDB already destroyed, skipping setDirty')\n\t\t\treturn Promise.resolve()\n\t\t}\n\t\treturn indexedDbProvider.set('dirty', val ? 1 : 0)\n\t}\n\n\t/**\n\t * Get the base version etag the document had when it was edited last.\n\t */\n\tfunction getBaseVersionEtag(): Promise {\n\t\tif (isDestroyed) {\n\t\t\tlogger.debug('IndexedDB already destroyed, skipping getBaseVersionEtag')\n\t\t\treturn Promise.resolve(undefined)\n\t\t}\n\t\treturn indexedDbProvider.get('baseVersionEtag')\n\t}\n\n\t/**\n\t * Set the base version etag for the current connection.\n\t *\n\t * @param val the base version etag as returned by open.\n\t */\n\tfunction setBaseVersionEtag(val: string) {\n\t\tif (isDestroyed) {\n\t\t\tlogger.debug('IndexedDB already destroyed, skipping setBaseVersionEtag')\n\t\t\treturn Promise.resolve(undefined)\n\t\t}\n\t\treturn indexedDbProvider.set('baseVersionEtag', val)\n\t}\n\n\t/**\n\t * Clear the current document from indexed db.\n\t * Used to reset the browser state to load a new editing session.\n\t */\n\tfunction clearIndexedDb() {\n\t\tlogger.info('clearing indexeddb')\n\t\tisDestroyed = true\n\t\treturn indexedDbProvider.clearData()\n\t}\n\n\treturn {\n\t\tclearIndexedDb,\n\t\tdirty: readonly(dirty),\n\t\tgetBaseVersionEtag,\n\t\tsetBaseVersionEtag,\n\t\tsetDirty,\n\t\twhenSynced,\n\t}\n}\n","/*\n * Copyright Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nmodule.exports = function proxyPolyfill() {\n let lastRevokeFn = null;\n let ProxyPolyfill;\n\n /**\n * @param {*} o\n * @return {boolean} whether this is probably a (non-null) Object\n */\n function isObject(o) {\n return o ? (typeof o === 'object' || typeof o === 'function') : false;\n }\n\n function validateProto(proto) {\n if (proto !== null && !isObject(proto)) {\n throw new TypeError('Object prototype may only be an Object or null: ' + proto);\n }\n }\n\n const $Object = Object;\n\n // Closure assumes that `{__proto__: null} instanceof Object` is always true, hence why we check against a different name.\n const canCreateNullProtoObjects = Boolean($Object.create) || !({ __proto__: null } instanceof $Object);\n const objectCreate =\n $Object.create ||\n (canCreateNullProtoObjects\n ? function create(proto) {\n validateProto(proto);\n return { __proto__: proto };\n }\n : function create(proto) {\n validateProto(proto);\n if (proto === null) {\n throw new SyntaxError('Native Object.create is required to create objects with null prototype');\n }\n\n // nb. cast to convince Closure compiler that this is a constructor\n var T = /** @type {!Function} */ (function T() {});\n T.prototype = proto;\n return new T();\n });\n\n const noop = function() { return null; };\n\n const getProto =\n $Object.getPrototypeOf ||\n ([].__proto__ === Array.prototype\n ? function getPrototypeOf(O) {\n // If O.[[Prototype]] === null, then the __proto__ accessor won't exist,\n // as it's inherited from `Object.prototype`\n const proto = O.__proto__;\n return isObject(proto) ? proto : null;\n }\n : noop);\n\n /**\n * @constructor\n * @param {!Object} target\n * @param {{apply, construct, get, set}} handler\n */\n ProxyPolyfill = function(target, handler) {\n const newTarget = this && this instanceof ProxyPolyfill ? this.constructor : undefined;\n if (newTarget === undefined) {\n throw new TypeError(\"Constructor Proxy requires 'new'\");\n }\n\n if (!isObject(target) || !isObject(handler)) {\n throw new TypeError('Cannot create proxy with a non-object as target or handler');\n }\n\n // Construct revoke function, and set lastRevokeFn so that Proxy.revocable can steal it.\n // The caller might get the wrong revoke function if a user replaces or wraps scope.Proxy\n // to call itself, but that seems unlikely especially when using the polyfill.\n let throwRevoked = function() {};\n lastRevokeFn = function() {\n /** @suppress {checkTypes} */\n target = null; // clear ref\n throwRevoked = function(trap) {\n throw new TypeError(`Cannot perform '${trap}' on a proxy that has been revoked`);\n };\n };\n setTimeout(function() {\n lastRevokeFn = null;\n }, 0);\n\n // Fail on unsupported traps: Chrome doesn't do this, but ensure that users of the polyfill\n // are a bit more careful. Copy the internal parts of handler to prevent user changes.\n const unsafeHandler = handler;\n handler = { 'get': null, 'set': null, 'apply': null, 'construct': null };\n for (let k in unsafeHandler) {\n if (!(k in handler)) {\n throw new TypeError(`Proxy polyfill does not support trap '${k}'`);\n }\n handler[k] = unsafeHandler[k];\n }\n if (typeof unsafeHandler === 'function') {\n // Allow handler to be a function (which has an 'apply' method). This matches what is\n // probably a bug in native versions. It treats the apply call as a trap to be configured.\n handler.apply = unsafeHandler.apply.bind(unsafeHandler);\n }\n\n // Define proxy as an object that extends target.[[Prototype]],\n // or a Function (if either it's callable, or apply is set).\n const proto = getProto(target); // can return null in old browsers\n let proxy;\n let isMethod = false;\n let isArray = false;\n if (typeof target === 'function') {\n proxy = function ProxyPolyfill() {\n const usingNew = (this && this.constructor === proxy);\n const args = Array.prototype.slice.call(arguments);\n throwRevoked(usingNew ? 'construct' : 'apply');\n\n // TODO(samthor): Closure compiler doesn't know about 'construct', attempts to rename it.\n if (usingNew && handler['construct']) {\n return handler['construct'].call(this, target, args);\n } else if (!usingNew && handler.apply) {\n return handler['apply'](target, this, args);\n }\n\n // since the target was a function, fallback to calling it directly.\n if (usingNew) {\n // inspired by answers to https://stackoverflow.com/q/1606797\n args.unshift(target); // pass class as first arg to constructor, although irrelevant\n // nb. cast to convince Closure compiler that this is a constructor\n const f = /** @type {!Function} */ (target.bind.apply(target, args));\n return new f();\n }\n return target.apply(this, args);\n };\n isMethod = true;\n } else if (target instanceof Array) {\n proxy = [];\n isArray = true;\n } else {\n proxy = (canCreateNullProtoObjects || proto !== null) ? objectCreate(proto) : {};\n }\n\n // Create default getters/setters. Create different code paths as handler.get/handler.set can't\n // change after creation.\n const getter = handler.get ? function(prop) {\n throwRevoked('get');\n return handler.get(this, prop, proxy);\n } : function(prop) {\n throwRevoked('get');\n return this[prop];\n };\n const setter = handler.set ? function(prop, value) {\n throwRevoked('set');\n const status = handler.set(this, prop, value, proxy);\n // TODO(samthor): If the calling code is in strict mode, throw TypeError.\n // if (!status) {\n // It's (sometimes) possible to work this out, if this code isn't strict- try to load the\n // callee, and if it's available, that code is non-strict. However, this isn't exhaustive.\n // }\n } : function(prop, value) {\n throwRevoked('set');\n this[prop] = value;\n };\n\n // Clone direct properties (i.e., not part of a prototype).\n const propertyNames = $Object.getOwnPropertyNames(target);\n const propertyMap = {};\n propertyNames.forEach(function(prop) {\n if ((isMethod || isArray) && prop in proxy) {\n return; // ignore properties already here, e.g. 'bind', 'prototype' etc\n }\n const real = $Object.getOwnPropertyDescriptor(target, prop);\n const desc = {\n enumerable: Boolean(real.enumerable),\n get: getter.bind(target, prop),\n set: setter.bind(target, prop),\n };\n $Object.defineProperty(proxy, prop, desc);\n propertyMap[prop] = true;\n });\n\n // Set the prototype, or clone all prototype methods (always required if a getter is provided).\n // TODO(samthor): We don't allow prototype methods to be set. It's (even more) awkward.\n // An alternative here would be to _just_ clone methods to keep behavior consistent.\n let prototypeOk = true;\n if (isMethod || isArray) {\n // Arrays and methods are special: above, we instantiate boring versions of these then swap\n // our their prototype later. So we only need to use setPrototypeOf in these cases. Some old\n // engines support `Object.getPrototypeOf` but not `Object.setPrototypeOf`.\n const setProto =\n $Object.setPrototypeOf ||\n ([].__proto__ === Array.prototype\n ? function setPrototypeOf(O, proto) {\n validateProto(proto);\n O.__proto__ = proto;\n return O;\n }\n : noop);\n if (!(proto && setProto(proxy, proto))) {\n prototypeOk = false;\n }\n }\n if (handler.get || !prototypeOk) {\n for (let k in target) {\n if (propertyMap[k]) {\n continue;\n }\n $Object.defineProperty(proxy, k, { get: getter.bind(target, k) });\n }\n }\n\n // The Proxy polyfill cannot handle adding new properties. Seal the target and proxy.\n $Object.seal(target);\n $Object.seal(proxy);\n\n return proxy; // nb. if isMethod is true, proxy != this\n };\n\n ProxyPolyfill.revocable = function(target, handler) {\n const p = new ProxyPolyfill(target, handler);\n return { 'proxy': p, 'revoke': lastRevokeFn };\n };\n\n return ProxyPolyfill;\n}\n","/*\n * Copyright Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\n'use strict';\n\n(function(scope) {\n if (scope['Proxy']) {\n return;\n }\n scope.Proxy = require('./proxy.js')();\n scope.Proxy['revocable'] = scope.Proxy.revocable;\n})(\n ('undefined' !== typeof process &&\n '[object process]' === {}.toString.call(process)) ||\n ('undefined' !== typeof navigator && navigator.product === 'ReactNative')\n ? global\n : self\n);\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Extension } from '@tiptap/core'\nimport type { Node } from '@tiptap/pm/model'\nimport type { Connection } from './composables/useConnection.ts'\n\nimport { Editor } from '@tiptap/core'\nimport hljs from 'highlight.js/lib/core'\nimport { createLowlight } from 'lowlight'\nimport { markRaw } from 'vue'\nimport { FocusTrap, PlainText, RichText } from './extensions/index.js'\nimport { logger } from './helpers/logger.ts'\n\nimport 'proxy-polyfill'\n\nconst lowlight = createLowlight()\n\n/**\n * @param language to load the syntax highlighting for\n */\nasync function loadSyntaxHighlight(language: string) {\n\tconst list = hljs.listLanguages()\n\tlogger.debug('Supported languages', { list })\n\tif (!lowlight.listLanguages().includes(language)) {\n\t\ttry {\n\t\t\tlogger.debug('Loading language ' + language)\n\t\t\tconst syntax = await import(`../node_modules/highlight.js/lib/languages/${language}.js`)\n\t\t\tlowlight.register(language, syntax.default)\n\t\t} catch (error) {\n\t\t\t// fallback to none\n\t\t\tlogger.debug('No matching highlighing found', { error })\n\t\t}\n\t}\n}\n\nconst editorProps = {\n\tscrollMargin: 50,\n\tscrollThreshold: 50,\n}\n\n/**\n *\n * @param options for the editor\n * @param options.extensions additional tiptap extensions\n * @param options.connection to the server api\n * @param options.relativePath to the file\n * @param options.isEmbedded wether the editor is embedded as a preview\n * @param options.mentionSearch hook to perform searches for mentions\n * @param options.openLink hook called when opening a link\n * @param options.noLazyImages load images right away\n */\nfunction createRichEditor({\n\textensions = [],\n\tconnection,\n\trelativePath,\n\tisEmbedded = false,\n\tmentionSearch = undefined,\n\topenLink = undefined,\n\tnoLazyImages = false,\n}: {\n\textensions?: Extension[]\n\tconnection?: Connection\n\trelativePath?: string\n\tisEmbedded?: boolean\n\tmentionSearch?: (query: string) => Promise>\n\topenLink?: (href: string) => void\n\tnoLazyImages?: boolean\n} = {}) {\n\treturn markRaw(new Editor({\n\t\teditorProps,\n\t\textensions: [\n\t\t\tRichText.configure({\n\t\t\t\tconnection,\n\t\t\t\trelativePath,\n\t\t\t\tisEmbedded,\n\t\t\t\tmentionSearch,\n\t\t\t\topenLink,\n\t\t\t\tnoLazyImages,\n\t\t\t}),\n\t\t\tFocusTrap,\n\t\t\t...extensions,\n\t\t],\n\t}))\n}\n\n/**\n *\n * @param options for the editor\n * @param options.language for syntax highlighting, default: plaintext\n * @param options.extensions additional tiptap extensions\n */\nfunction createPlainEditor({\n\tlanguage = 'plaintext',\n\textensions = [],\n}: { language?: string, extensions?: Extension[] } = {}) {\n\treturn markRaw(new Editor({\n\t\teditorProps,\n\t\textensions: [\n\t\t\tPlainText.configure({\n\t\t\t\t// Options to be passed through to `CodeBlockPlainText`\n\t\t\t\tlowlight,\n\t\t\t\tdefaultLanguage: language,\n\t\t\t}),\n\t\t\tFocusTrap,\n\t\t\t...extensions,\n\t\t],\n\t}))\n}\n\n/**\n *\n * @param doc prosemirror document to serialize\n */\nfunction serializePlainText(doc: Node) {\n\treturn doc.textContent\n}\n\nexport {\n\tcreatePlainEditor,\n\tcreateRichEditor,\n\tloadSyntaxHighlight,\n\tserializePlainText,\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nconst extensionHighlight: Record = {\n\tpy: 'python',\n\tgyp: 'python',\n\twsgi: 'python',\n\thtm: 'html',\n\txhtml: 'html',\n\terl: 'erlang',\n\tjsp: 'java',\n\tpl: 'perl',\n\trss: 'xml',\n\tatom: 'xml',\n\txsl: 'xml',\n\tplist: 'xml',\n\trb: 'ruby',\n\tbuilder: 'ruby',\n\tgemspec: 'ruby',\n\tpodspec: 'ruby',\n\tthor: 'ruby',\n\tdiff: 'patch',\n\ths: 'haskell',\n\ticl: 'haskell',\n\tphp3: 'php',\n\tphp4: 'php',\n\tphp5: 'php',\n\tphp6: 'php',\n\tsh: 'bash',\n\tzsh: 'bash',\n\tst: 'smalltalk',\n\tas: 'actionscript',\n\tapacheconf: 'apache',\n\tosacript: 'applescript',\n\tb: 'brainfuck',\n\tbf: 'brainfuck',\n\tclj: 'clojure',\n\t'cmake.in': 'cmake',\n\tcoffee: 'coffeescript',\n\tcson: 'coffescript',\n\ticed: 'coffescript',\n\tc: 'cpp',\n\th: 'cpp',\n\t'c++': 'cpp',\n\t'h++': 'cpp',\n\thh: 'cpp',\n\tjinja: 'django',\n\tbat: 'dos',\n\tcmd: 'dos',\n\tfs: 'fsharp',\n\thbs: 'handlebars',\n\t'html.hbs': 'handlebars',\n\t'html.handlebars': 'handlebars',\n\tsublime_metrics: 'json',\n\tsublime_session: 'json',\n\t'sublime-keymap': 'json',\n\t'sublime-mousemap': 'json',\n\t'sublime-project': 'json',\n\t'sublime-settings': 'json',\n\t'sublime-workspace': 'json',\n\tjs: 'javascript',\n\tmk: 'makefile',\n\tmak: 'makefile',\n\tmd: 'markdown',\n\tmkdown: 'markdown',\n\tmkd: 'markdown',\n\tnginxconf: 'nginx',\n\tm: 'objectivec',\n\tmm: 'objectivec',\n\tml: 'ocaml',\n\trs: 'rust',\n\tsci: 'scilab',\n\ttxt: 'plaintext',\n\tvb: 'vbnet',\n\tvbs: 'vbscript',\n}\n\nexport { extensionHighlight }\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { loadSyntaxHighlight } from '../EditorFactory.js'\nimport { extensionHighlight } from '../helpers/mappings.ts'\n\n/**\n * Determine the language of the file and load the syntax highlighting\n *\n * @param isRichEditor Is the editor a rich editor?\n * @param props Props of the editor component.\n * @param props.relativePath Relative path to the file.\n */\nexport function useSyntaxHighlighting(\n\tisRichEditor: boolean,\n\tprops: { relativePath: string },\n) {\n\tif (isRichEditor) {\n\t\treturn { language: 'md', lowlightLoaded: Promise.resolve() }\n\t}\n\tconst filename = props.relativePath.split('/').pop()\n\tconst extension = filename?.split('.').pop() ?? 'txt'\n\tconst language = extensionHighlight[extension] || extension\n\tconst lowlightLoaded = loadSyntaxHighlight(language)\n\treturn { language, lowlightLoaded }\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { Extension } from '@tiptap/core'\n\nexport interface AutofocusOptions {\n\tfileId: number | null\n}\n\ndeclare module '@tiptap/core' {\n\tinterface Commands {\n\t\tautofocus: {\n\t\t\tautofocus: () => ReturnType\n\t\t}\n\t}\n}\n\nexport default Extension.create({\n\taddOptions() {\n\t\treturn {\n\t\t\tfileId: null,\n\t\t}\n\t},\n\taddStorage() {\n\t\treturn {\n\t\t\tstarted: false,\n\t\t}\n\t},\n\tonCreate() {\n\t\tif (this.options.fileId === null) {\n\t\t\tthrow new Error('fileId needs to be provided')\n\t\t}\n\t\tthis.storage.started = true\n\t},\n\tonSelectionUpdate({ editor }) {\n\t\tif (!this.storage.started) {\n\t\t\treturn\n\t\t}\n\n\t\tconst pos = editor.state.selection.$anchor.pos\n\t\tlocalStorage.setItem('text-lastPos-' + this.options.fileId, String(pos))\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tautofocus:\n\t\t\t\t() => ({ commands }) => {\n\t\t\t\t\tconst pos = localStorage.getItem('text-lastPos-' + this.options.fileId)\n\t\t\t\t\tif (pos) {\n\t\t\t\t\t\treturn commands.focus(Number(pos))\n\t\t\t\t\t}\n\n\t\t\t\t\treturn commands.focus('start')\n\t\t\t\t},\n\t\t}\n\t},\n})\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/* eslint-disable no-console */\n\n/**\n * Setup OCA.Text.debugYjs() and expose editor component in OCA.Text.editorComponents\n */\n\nif (!window.OCA.Text) {\n\twindow.OCA.Text = {}\n}\n\n// These can be changed in the browser console for more verbose logging.\nwindow.OCA.Text.logEditorUpdates = false\nwindow.OCA.Text.logWebSocketPolyfill = false\nwindow.OCA.Text.logYjsUpdates = false\n\nconst editorComponents = window.OCA.Text.editorComponents ?? new Set()\nwindow.OCA.Text.editorComponents = editorComponents\n\n/**\n * Print debug info for all editor components as a warning.\n */\nexport function debugYjs() {\n\tconst intro\n\t\t= 'Editor Yjs debug data. Copy the objects above that start with \"fileId\".'\n\tconst introChrome = '- In Chrome, select \"Copy\" at the end of the line.'\n\tconst introFirefox\n\t\t= '- In Firefox, right-click on the object and select \"Copy object\".'\n\tconst styleBold = 'font-weight: bold;'\n\tconst styleItalic = 'font-weight: normal; font-style: italic;'\n\n\tfor (const editorComponent of editorComponents.values()) {\n\t\tconsole.warn(JSON.stringify(editorComponent.debugData(), null, ' '))\n\t}\n\n\tconsole.warn(\n\t\t'%c%s\\n%c%s\\n%s',\n\t\tstyleBold,\n\t\tintro,\n\t\tstyleItalic,\n\t\tintroChrome,\n\t\tintroFirefox,\n\t)\n}\n\nif (!window.OCA.Text.debugYjs) {\n\twindow.OCA.Text.debugYjs = debugYjs\n}\n\n/**\n * Expose editor component in OCA.Text.editorComponents\n *\n * @param component - the editor component to include in debug output\n */\nexport function exposeForDebugging(component: object) {\n\teditorComponents.add(component)\n}\n\n/**\n * Drop editor component from OCA.Text.editorComponents\n *\n * @param component - the editor component to remove from debug output\n */\nexport function removeFromDebugging(component: object) {\n\teditorComponents.delete(component)\n}\n","import { PluginKey } from 'prosemirror-state' // eslint-disable-line\n\n/**\n * The unique prosemirror plugin key for syncPlugin\n *\n * @public\n */\nexport const ySyncPluginKey = new PluginKey('y-sync')\n\n/**\n * The unique prosemirror plugin key for undoPlugin\n *\n * @public\n * @type {PluginKey}\n */\nexport const yUndoPluginKey = new PluginKey('y-undo')\n\n/**\n * The unique prosemirror plugin key for cursorPlugin\n *\n * @public\n */\nexport const yCursorPluginKey = new PluginKey('yjs-cursor')\n","import * as sha256 from 'lib0/hash/sha256'\nimport * as buf from 'lib0/buffer'\n\n/**\n * Custom function to transform sha256 hash to N byte\n *\n * @param {Uint8Array} digest\n */\nconst _convolute = digest => {\n const N = 6\n for (let i = N; i < digest.length; i++) {\n digest[i % N] = digest[i % N] ^ digest[i]\n }\n return digest.slice(0, N)\n}\n\n/**\n * @param {any} json\n */\nexport const hashOfJSON = (json) => buf.toBase64(_convolute(sha256.digest(buf.encodeAny(json))))\n","/**\n * @module bindings/prosemirror\n */\n\nimport { createMutex } from 'lib0/mutex'\nimport * as PModel from 'prosemirror-model'\nimport { AllSelection, Plugin, TextSelection, NodeSelection } from \"prosemirror-state\"; // eslint-disable-line\nimport * as math from 'lib0/math'\nimport * as object from 'lib0/object'\nimport * as set from 'lib0/set'\nimport { simpleDiff } from 'lib0/diff'\nimport * as error from 'lib0/error'\nimport { ySyncPluginKey, yUndoPluginKey } from './keys.js'\nimport * as Y from 'yjs'\nimport {\n absolutePositionToRelativePosition,\n relativePositionToAbsolutePosition\n} from '../lib.js'\nimport * as random from 'lib0/random'\nimport * as environment from 'lib0/environment'\nimport * as dom from 'lib0/dom'\nimport * as eventloop from 'lib0/eventloop'\nimport * as map from 'lib0/map'\nimport * as utils from '../utils.js'\n\n/**\n * @typedef {Object} BindingMetadata\n * @property {ProsemirrorMapping} BindingMetadata.mapping\n * @property {Map} BindingMetadata.isOMark - is overlapping mark\n */\n\n/**\n * @return {BindingMetadata}\n */\nexport const createEmptyMeta = () => ({\n mapping: new Map(),\n isOMark: new Map()\n})\n\n/**\n * @param {Y.Item} item\n * @param {Y.Snapshot} [snapshot]\n */\nexport const isVisible = (item, snapshot) =>\n snapshot === undefined\n ? !item.deleted\n : (snapshot.sv.has(item.id.client) && /** @type {number} */\n (snapshot.sv.get(item.id.client)) > item.id.clock &&\n !Y.isDeleted(snapshot.ds, item.id))\n\n/**\n * Either a node if type is YXmlElement or an Array of text nodes if YXmlText\n * @typedef {Map, PModel.Node | Array>} ProsemirrorMapping\n */\n\n/**\n * @typedef {Object} ColorDef\n * @property {string} ColorDef.light\n * @property {string} ColorDef.dark\n */\n\n/**\n * @typedef {Object} YSyncOpts\n * @property {Array} [YSyncOpts.colors]\n * @property {Map} [YSyncOpts.colorMapping]\n * @property {Y.PermanentUserData|null} [YSyncOpts.permanentUserData]\n * @property {ProsemirrorMapping} [YSyncOpts.mapping]\n * @property {function} [YSyncOpts.onFirstRender] Fired when the content from Yjs is initially rendered to ProseMirror\n */\n\n/**\n * @type {Array}\n */\nconst defaultColors = [{ light: '#ecd44433', dark: '#ecd444' }]\n\n/**\n * @param {Map} colorMapping\n * @param {Array} colors\n * @param {string} user\n * @return {ColorDef}\n */\nconst getUserColor = (colorMapping, colors, user) => {\n // @todo do not hit the same color twice if possible\n if (!colorMapping.has(user)) {\n if (colorMapping.size < colors.length) {\n const usedColors = set.create()\n colorMapping.forEach((color) => usedColors.add(color))\n colors = colors.filter((color) => !usedColors.has(color))\n }\n colorMapping.set(user, random.oneOf(colors))\n }\n return /** @type {ColorDef} */ (colorMapping.get(user))\n}\n\n/**\n * This plugin listens to changes in prosemirror view and keeps yXmlState and view in sync.\n *\n * This plugin also keeps references to the type and the shared document so other plugins can access it.\n * @param {Y.XmlFragment} yXmlFragment\n * @param {YSyncOpts} opts\n * @return {any} Returns a prosemirror plugin that binds to this type\n */\nexport const ySyncPlugin = (yXmlFragment, {\n colors = defaultColors,\n colorMapping = new Map(),\n permanentUserData = null,\n onFirstRender = () => {},\n mapping\n} = {}) => {\n let initialContentChanged = false\n const binding = new ProsemirrorBinding(yXmlFragment, mapping)\n const plugin = new Plugin({\n props: {\n editable: (state) => {\n const syncState = ySyncPluginKey.getState(state)\n return syncState.snapshot == null && syncState.prevSnapshot == null\n }\n },\n key: ySyncPluginKey,\n state: {\n /**\n * @returns {any}\n */\n init: (_initargs, _state) => {\n return {\n type: yXmlFragment,\n doc: yXmlFragment.doc,\n binding,\n snapshot: null,\n prevSnapshot: null,\n isChangeOrigin: false,\n isUndoRedoOperation: false,\n addToHistory: true,\n colors,\n colorMapping,\n permanentUserData\n }\n },\n apply: (tr, pluginState) => {\n const change = tr.getMeta(ySyncPluginKey)\n if (change !== undefined) {\n pluginState = Object.assign({}, pluginState)\n for (const key in change) {\n pluginState[key] = change[key]\n }\n }\n pluginState.addToHistory = tr.getMeta('addToHistory') !== false\n // always set isChangeOrigin. If undefined, this is not change origin.\n pluginState.isChangeOrigin = change !== undefined &&\n !!change.isChangeOrigin\n pluginState.isUndoRedoOperation = change !== undefined && !!change.isChangeOrigin && !!change.isUndoRedoOperation\n if (binding.prosemirrorView !== null) {\n if (\n change !== undefined &&\n (change.snapshot != null || change.prevSnapshot != null)\n ) {\n // snapshot changed, rerender next\n eventloop.timeout(0, () => {\n if (binding.prosemirrorView == null) {\n return\n }\n if (change.restore == null) {\n binding._renderSnapshot(\n change.snapshot,\n change.prevSnapshot,\n pluginState\n )\n } else {\n binding._renderSnapshot(\n change.snapshot,\n change.snapshot,\n pluginState\n )\n // reset to current prosemirror state\n delete pluginState.restore\n delete pluginState.snapshot\n delete pluginState.prevSnapshot\n binding.mux(() => {\n binding._prosemirrorChanged(\n binding.prosemirrorView.state.doc\n )\n })\n }\n })\n }\n }\n return pluginState\n }\n },\n view: (view) => {\n binding.initView(view)\n if (mapping == null) {\n // force rerender to update the bindings mapping\n binding._forceRerender()\n }\n onFirstRender()\n return {\n update: () => {\n const pluginState = plugin.getState(view.state)\n if (\n pluginState.snapshot == null && pluginState.prevSnapshot == null\n ) {\n if (\n // If the content doesn't change initially, we don't render anything to Yjs\n // If the content was cleared by a user action, we want to catch the change and\n // represent it in Yjs\n initialContentChanged ||\n view.state.doc.content.findDiffStart(\n view.state.doc.type.createAndFill().content\n ) !== null\n ) {\n initialContentChanged = true\n if (\n pluginState.addToHistory === false &&\n !pluginState.isChangeOrigin\n ) {\n const yUndoPluginState = yUndoPluginKey.getState(view.state)\n /**\n * @type {Y.UndoManager}\n */\n const um = yUndoPluginState && yUndoPluginState.undoManager\n if (um) {\n um.stopCapturing()\n }\n }\n binding.mux(() => {\n /** @type {Y.Doc} */ (pluginState.doc).transact((tr) => {\n tr.meta.set('addToHistory', pluginState.addToHistory)\n binding._prosemirrorChanged(view.state.doc)\n }, ySyncPluginKey)\n })\n }\n }\n },\n destroy: () => {\n binding.destroy()\n }\n }\n }\n })\n return plugin\n}\n\n/**\n * @param {import('prosemirror-state').Transaction} tr\n * @param {ReturnType} relSel\n * @param {ProsemirrorBinding} binding\n */\nconst restoreRelativeSelection = (tr, relSel, binding) => {\n if (relSel !== null && relSel.anchor !== null && relSel.head !== null) {\n if (relSel.type === 'all') {\n tr.setSelection(new AllSelection(tr.doc))\n } else if (relSel.type === 'node') {\n const anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping\n )\n tr.setSelection(NodeSelection.create(tr.doc, anchor))\n } else {\n const anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping\n )\n const head = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.head,\n binding.mapping\n )\n if (anchor !== null && head !== null) {\n const sel = TextSelection.between(tr.doc.resolve(anchor), tr.doc.resolve(head))\n tr.setSelection(sel)\n }\n }\n }\n}\n\n/**\n * @param {ProsemirrorBinding} pmbinding\n * @param {import('prosemirror-state').EditorState} state\n */\nexport const getRelativeSelection = (pmbinding, state) => ({\n type: /** @type {any} */ (state.selection).jsonID,\n anchor: absolutePositionToRelativePosition(\n state.selection.anchor,\n pmbinding.type,\n pmbinding.mapping\n ),\n head: absolutePositionToRelativePosition(\n state.selection.head,\n pmbinding.type,\n pmbinding.mapping\n )\n})\n\n/**\n * Binding for prosemirror.\n *\n * @protected\n */\nexport class ProsemirrorBinding {\n /**\n * @param {Y.XmlFragment} yXmlFragment The bind source\n * @param {ProsemirrorMapping} mapping\n */\n constructor (yXmlFragment, mapping = new Map()) {\n this.type = yXmlFragment\n /**\n * this will be set once the view is created\n * @type {any}\n */\n this.prosemirrorView = null\n this.mux = createMutex()\n this.mapping = mapping\n /**\n * Is overlapping mark - i.e. mark does not exclude itself.\n *\n * @type {Map}\n */\n this.isOMark = new Map()\n this._observeFunction = this._typeChanged.bind(this)\n /**\n * @type {Y.Doc}\n */\n // @ts-ignore\n this.doc = yXmlFragment.doc\n /**\n * current selection as relative positions in the Yjs model\n */\n this.beforeTransactionSelection = null\n this.beforeAllTransactions = () => {\n if (this.beforeTransactionSelection === null && this.prosemirrorView != null) {\n this.beforeTransactionSelection = getRelativeSelection(\n this,\n this.prosemirrorView.state\n )\n }\n }\n this.afterAllTransactions = () => {\n this.beforeTransactionSelection = null\n }\n this._domSelectionInView = null\n }\n\n /**\n * Create a transaction for changing the prosemirror state.\n *\n * @returns\n */\n get _tr () {\n return this.prosemirrorView.state.tr.setMeta('addToHistory', false)\n }\n\n _isLocalCursorInView () {\n if (!this.prosemirrorView.hasFocus()) return false\n if (environment.isBrowser && this._domSelectionInView === null) {\n // Calculate the domSelectionInView and clear by next tick after all events are finished\n eventloop.timeout(0, () => {\n this._domSelectionInView = null\n })\n this._domSelectionInView = this._isDomSelectionInView()\n }\n return this._domSelectionInView\n }\n\n _isDomSelectionInView () {\n const selection = this.prosemirrorView._root.getSelection()\n\n if (selection == null || selection.anchorNode == null) return false\n\n const range = this.prosemirrorView._root.createRange()\n range.setStart(selection.anchorNode, selection.anchorOffset)\n range.setEnd(selection.focusNode, selection.focusOffset)\n\n // This is a workaround for an edgecase where getBoundingClientRect will\n // return zero values if the selection is collapsed at the start of a newline\n // see reference here: https://stackoverflow.com/a/59780954\n const rects = range.getClientRects()\n if (rects.length === 0) {\n // probably buggy newline behavior, explicitly select the node contents\n if (range.startContainer && range.collapsed) {\n range.selectNodeContents(range.startContainer)\n }\n }\n\n const bounding = range.getBoundingClientRect()\n const documentElement = dom.doc.documentElement\n\n return bounding.bottom >= 0 && bounding.right >= 0 &&\n bounding.left <=\n (window.innerWidth || documentElement.clientWidth || 0) &&\n bounding.top <= (window.innerHeight || documentElement.clientHeight || 0)\n }\n\n /**\n * @param {Y.Snapshot} snapshot\n * @param {Y.Snapshot} prevSnapshot\n */\n renderSnapshot (snapshot, prevSnapshot) {\n if (!prevSnapshot) {\n prevSnapshot = Y.createSnapshot(Y.createDeleteSet(), new Map())\n }\n this.prosemirrorView.dispatch(\n this._tr.setMeta(ySyncPluginKey, { snapshot, prevSnapshot })\n )\n }\n\n unrenderSnapshot () {\n this.mapping.clear()\n this.mux(() => {\n const fragmentContent = this.type.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n this.prosemirrorView.state.schema,\n this\n )\n ).filter((n) => n !== null)\n // @ts-ignore\n const tr = this._tr.replace(\n 0,\n this.prosemirrorView.state.doc.content.size,\n new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n )\n tr.setMeta(ySyncPluginKey, { snapshot: null, prevSnapshot: null })\n this.prosemirrorView.dispatch(tr)\n })\n }\n\n _forceRerender () {\n this.mapping.clear()\n this.mux(() => {\n // If this is a forced rerender, this might neither happen as a pm change nor within a Yjs\n // transaction. Then the \"before selection\" doesn't exist. In this case, we need to create a\n // relative position before replacing content. Fixes #126\n const sel = this.beforeTransactionSelection !== null ? null : this.prosemirrorView.state.selection\n const fragmentContent = this.type.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n this.prosemirrorView.state.schema,\n this\n )\n ).filter((n) => n !== null)\n // @ts-ignore\n const tr = this._tr.replace(\n SPDX-FileCopyrightText: 2023, 2023, 2022, 2022, 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { Node } from '@tiptap/pm/model'\nimport escapeHtml from 'escape-html'\nimport { prosemirrorToYXmlFragment } from 'y-prosemirror'\nimport { applyUpdate, Doc, encodeStateAsUpdate, XmlFragment } from 'yjs'\nimport { createPlainEditor, createRichEditor } from '../EditorFactory.js'\nimport markdownit from '../markdownit/index.js'\n\n/**\n * Apply an update to the ydoc that will change it to match content\n *\n * @param ydoc document to update\n * @param content desired content of the final document\n * @param options options\n * @param options.isRichEditor use a rich editor for the content\n */\nexport function setInitialYjsState(\n\tydoc: Doc,\n\tcontent: string,\n\t{ isRichEditor }: { isRichEditor: boolean },\n) {\n\tconst html = isRichEditor\n\t\t? markdownit.render(content) + '

'\n\t\t: `

\\n${escapeHtml(content)}
`\n\n\tconst editor = isRichEditor ? createRichEditor() : createPlainEditor()\n\teditor.commands.setContent(html)\n\n\tconst json = editor.getJSON()\n\n\tconst node = Node.fromJSON(editor.schema, json)\n\tconst getBaseDoc = (node: Node) => {\n\t\tconst baseDoc = new Doc()\n\t\t// In order to make the initial document state idempotent, we need to reset the clientID\n\t\t// While this is not recommended, we cannot avoid it here as we lack another mechanism\n\t\t// to generate the initial state on the server side\n\t\t// The only other option to avoid this could be to generate the initial state once and push\n\t\t// it to the server immediately, however this would require read only sessions to be able\n\t\t// to still push a state\n\t\tbaseDoc.clientID = 0\n\t\tconst type = baseDoc.get('default', XmlFragment)\n\t\tif (!type.doc) {\n\t\t\t// This should not happen but is aligned with the upstream implementation\n\t\t\t// https://github.com/yjs/y-prosemirror/blob/8db24263770c2baaccb08e08ea9ef92dbcf8a9da/src/lib.js#L209\n\t\t\treturn baseDoc\n\t\t}\n\n\t\tprosemirrorToYXmlFragment(node, type)\n\t\treturn baseDoc\n\t}\n\n\tconst baseUpdate = encodeStateAsUpdate(getBaseDoc(node))\n\tapplyUpdate(ydoc, baseUpdate)\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { Node } from '@nextcloud/files'\nimport type { FileStat, ResponseDataDetailed } from 'webdav'\n\nimport { getClient, getDefaultPropfind, resultToNode } from '@nextcloud/files/dav'\n\nexport const client = getClient()\n\n/**\n * Get a node from the server\n *\n * @param node to get\n */\nexport async function fetchNode(node: Node): Promise {\n\tconst propfindPayload = getDefaultPropfind()\n\tconst result = (await client.stat(`${node.root}${node.path}`, {\n\t\tdetails: true,\n\t\tdata: propfindPayload,\n\t})) as ResponseDataDetailed\n\treturn resultToNode(result.data)\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { OpenData } from '../apis/connect.ts'\nimport type { Step, SyncService } from './SyncService.ts'\n\nimport { decodeArrayBuffer, encodeArrayBuffer } from '../helpers/base64.ts'\nimport { logger } from '../helpers/logger.js'\nimport { stepsFromOpenData } from '../helpers/yjs.ts'\nimport getNotifyBus from './NotifyService.ts'\n\n/**\n * Optional debug logging if window.OCA.Text.logWebSocketPolyfill is set.\n *\n * @param message to log\n * @param context data to include in the log\n */\nfunction debug(message: string, context?: Record) {\n\tif (window.OCA?.Text?.logWebSocketPolyfill) {\n\t\tlogger.debug(message, context)\n\t}\n}\n\n/**\n *\n * @param syncService - the sync service to build upon\n * @param fileId - id of the file to open\n */\nexport default function initWebSocketPolyfill(\n\tsyncService: SyncService,\n\tfileId: number,\n) {\n\treturn class WebSocketPolyfill {\n\t\tbinaryType: 'blob' | 'arraybuffer' = 'blob'\n\t\tonmessage?: (message: MessageEvent) => void\n\t\tonerror?: (error: Event) => void\n\t\tonclose?: (event: CloseEvent) => void\n\t\tonopen?: () => void\n\t\t#notifyPushBus\n\t\t#onSync\n\t\t#onOpened\n\t\t#processingVersion = 0\n\n\t\tconstructor(url: string) {\n\t\t\tthis.#notifyPushBus = getNotifyBus()\n\t\t\tthis.#notifyPushBus?.on('notify_push', this.#onNotifyPush.bind(this))\n\t\t\tdebug('WebSocketPolyfill#constructor', { url, fileId })\n\n\t\t\tthis.#onOpened = (data: OpenData) => {\n\t\t\t\tdebug('WebSocketPolyfill#onOpen', { data })\n\t\t\t\tif (syncService.hasActiveConnection()) {\n\t\t\t\t\tthis.onopen?.()\n\t\t\t\t}\n\t\t\t\tthis.#processSteps(stepsFromOpenData(data))\n\t\t\t}\n\t\t\tsyncService.bus.on('opened', this.#onOpened)\n\n\t\t\tthis.#onSync = ({ steps }: { steps: Step[] }) => {\n\t\t\t\tdebug('WebSocketPolyfill#onSync', { steps })\n\t\t\t\tif (steps) {\n\t\t\t\t\tthis.#processSteps(steps)\n\t\t\t\t\tdebug('synced ', {\n\t\t\t\t\t\tversion: syncService.version,\n\t\t\t\t\t\tsteps,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tsyncService.bus.on('sync', this.#onSync)\n\n\t\t\tsyncService.open()\n\t\t\tif (syncService.hasActiveConnection()) {\n\t\t\t\tsetTimeout(() => this.onopen?.(), 0)\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Process the given steps, handing them to the onmessage handler\n\t\t *\n\t\t * Set this.#processingVersion for detecting and logging immediate responses in `send()`.\n\t\t *\n\t\t * @param steps steps to process\n\t\t */\n\t\t#processSteps(steps: Step[]): void {\n\t\t\tsteps.forEach((s) => {\n\t\t\t\tthis.#processingVersion = s.version\n\t\t\t\ts.data.forEach((singleStep) => {\n\t\t\t\t\tconst data = decodeArrayBuffer(singleStep)\n\t\t\t\t\tthis.onmessage?.(new MessageEvent('processing step', { data }))\n\t\t\t\t})\n\t\t\t\tsyncService.version = Math.max(\n\t\t\t\t\tsyncService.version,\n\t\t\t\t\tthis.#processingVersion,\n\t\t\t\t)\n\t\t\t})\n\t\t\tthis.#processingVersion = 0\n\t\t}\n\n\t\tsend(step: Uint8Array) {\n\t\t\t// Useful for debugging what steps are sent and how they were initiated\n\t\t\t// logStep(step)\n\n\t\t\tconst encoded = encodeArrayBuffer(step)\n\t\t\tconst isSyncStep1 = encoded < 'AAE'\n\t\t\tif (!this.#processingVersion || !isSyncStep1) {\n\t\t\t\tsyncService.sendStep(step)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// If `this.#processingVersion` is set, we're in the middle of applying steps of one version.\n\t\t\t// If `isSyncStep1`, Yjs failed to integrate a message due to pending structs.\n\t\t\t// Log and ask for recovery due to a not applied/missing step.\n\t\t\tlogger.error(`Failed to process step ${this.#processingVersion}.`, {\n\t\t\t\tlastSuccessfullyProcessed: syncService.version,\n\t\t\t\tsendingSyncStep1: step,\n\t\t\t})\n\t\t\t// Do not increase the syncService.version for the current steps\n\t\t\t// as we failed to process them.\n\t\t\tthis.#processingVersion = 0\n\t\t\tsyncService.sendRecoveryStep(step)\n\t\t}\n\n\t\tasync close() {\n\t\t\tsyncService.bus.off('sync', this.#onSync)\n\t\t\tsyncService.bus.off('opened', this.#onOpened)\n\t\t\tthis.#notifyPushBus?.off('notify_push', this.#onNotifyPush.bind(this))\n\t\t\tthis.onclose?.(new CloseEvent('closing'))\n\t\t\tdebug('Websocket closed')\n\t\t}\n\n\t\t#onNotifyPush({\n\t\t\tmessageBody,\n\t\t}: {\n\t\t\tmessageBody: { documentId: number, steps: string[] }\n\t\t}) {\n\t\t\tdebug('WebSocketPolyfill#onNotifyPush', messageBody)\n\t\t\tif (messageBody.documentId !== fileId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tmessageBody.steps.forEach((step) => {\n\t\t\t\tconst data = decodeArrayBuffer(step)\n\t\t\t\tthis.onmessage?.(new MessageEvent('notify pushed', { data }))\n\t\t\t})\n\t\t}\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { logger } from '../helpers/logger.ts'\nimport initWebSocketPolyfill from './WebSocketPolyfill.ts'\nimport { WebsocketProvider } from './y-websocket.js'\n\n/**\n *\n * @param {object} options - options for the sync provider\n * @param {object} options.ydoc - the Ydoc\n * @param {object} options.syncService - sync service to build upon\n * @param {number} options.fileId - file id of the file to open\n * @param {number} options.queue - queue for outgoing steps\n * @param {object} options.initialSession - initialSession to start from\n * @param {object} options.awareness - awareness instance for the provider\n * @param {boolean} options.disableBc - disable broadcast channel synchronization\n */\nexport default function createSyncServiceProvider({\n\tydoc,\n\tsyncService,\n\tfileId,\n\tinitialSession,\n\tqueue,\n\tawareness,\n\tdisableBc,\n}) {\n\tif (!fileId) {\n\t\t// We need a file id as a unique identifier for y.js as otherwise state might leak between different files\n\t\tthrow new Error('fileId is required')\n\t}\n\tconst WebSocketPolyfill = initWebSocketPolyfill(\n\t\tsyncService,\n\t\tfileId,\n\t\tinitialSession,\n\t\tqueue,\n\t)\n\tconst websocketProvider = new WebsocketProvider(\n\t\t'ws://localhost:1234',\n\t\t'file:' + fileId,\n\t\tydoc,\n\t\t{ WebSocketPolyfill, awareness, disableBc },\n\t)\n\twebsocketProvider.on('status', (event) => logger.debug('status', event))\n\treturn websocketProvider\n}\n","\n\n\n\n\n\n\n","\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport debounce from 'debounce'\n\nconst getClientWidth = () => document.documentElement.clientWidth\nconst isMobile = () => getClientWidth() < 768\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tisMobile: isMobile(),\n\t\t}\n\t},\n\tbeforeMount() {\n\t\tthis.$onResize = debounce(() => {\n\t\t\tthis.isMobile = isMobile()\n\t\t}, 100)\n\n\t\twindow.addEventListener('resize', this.$onResize)\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.$onResize)\n\t},\n}\n","\n\n\n\n\n\n\n",";(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks() {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback(callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return (\n input instanceof Array ||\n Object.prototype.toString.call(input) === '[object Array]'\n );\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return (\n input != null &&\n Object.prototype.toString.call(input) === '[object Object]'\n );\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return Object.getOwnPropertyNames(obj).length === 0;\n } else {\n var k;\n for (k in obj) {\n if (hasOwnProp(obj, k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return (\n typeof input === 'number' ||\n Object.prototype.toString.call(input) === '[object Number]'\n );\n }\n\n function isDate(input) {\n return (\n input instanceof Date ||\n Object.prototype.toString.call(input) === '[object Date]'\n );\n }\n\n function map(arr, fn) {\n var res = [],\n i,\n arrL SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n"],"file":"EditorReloader.vue_vue_type_script_setup_true_lang-nS5NibIi.chunk.mjs"
FileName: ./js/FilePicker-DWYoSaVg-CH4ygoyX.chunk.mjs SPDXID: SPDXRef-0f03aac89ded934998e6c2d39fd6eda6 FileChecksum: SHA1: ee0bfa50ca58beb1ee23df3473834c5ea19713d4 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: Apache-2.0 LicenseInfoInFile: GPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: @nextcloud/dialogs developers SPDX-FileCopyrightText: Austin Andrews SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors FileName: ./js/FilePicker-DWYoSaVg-CH4ygoyX.chunk.mjs.map SPDXID: SPDXRef-4bdf0011aa438ca7a5096b0e6670c431 FileChecksum: SHA1: 63226d6cebf0b44072fa59ad2ee63b869b7e8fdb LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nexport var ShareType;\n(function (ShareType) {\n ShareType[ShareType[\"User\"] = 0] = \"User\";\n ShareType[ShareType[\"Group\"] = 1] = \"Group\";\n ShareType[ShareType[\"Link\"] = 3] = \"Link\";\n ShareType[ShareType[\"Email\"] = 4] = \"Email\";\n ShareType[ShareType[\"Remote\"] = 6] = \"Remote\";\n /**\n * Was called `Circle` before Nextcloud 29\n */\n ShareType[ShareType[\"Team\"] = 7] = \"Team\";\n ShareType[ShareType[\"Guest\"] = 8] = \"Guest\";\n ShareType[ShareType[\"RemoteGroup\"] = 9] = \"RemoteGroup\";\n ShareType[ShareType[\"Room\"] = 10] = \"Room\";\n ShareType[ShareType[\"Deck\"] = 12] = \"Deck\";\n /**\n * @since 26.0.0\n */\n ShareType[ShareType[\"FederatedGroup\"] = 14] = \"FederatedGroup\";\n /**\n * Third party share types\n *\n * @since 25.0.0\n */\n ShareType[ShareType[\"ScienceMesh\"] = 15] = \"ScienceMesh\";\n})(ShareType || (ShareType = {}));\n","import { openBlock, createElementBlock, mergeProps, createElementVNode, toDisplayString, createCommentVNode, defineComponent, ref, computed, toRef, normalizeClass, normalizeStyle, unref, Fragment, createBlock, createVNode, toHandlers, withModifiers, onMounted, toValue, useModel, onUnmounted, withCtx, createTextVNode, renderList, mergeModels, nextTick, useTemplateRef, createSlots, shallowRef, watch } from \"vue\";\nimport { emit } from \"@nextcloud/event-bus\";\nimport NcDialog from \"@nextcloud/vue/components/NcDialog\";\nimport NcEmptyContent from \"@nextcloud/vue/components/NcEmptyContent\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { FileType, Permission, formatFileSize, sortNodes, validateFilename, InvalidFilenameError, InvalidFilenameErrorReason } from \"@nextcloud/files\";\nimport NcButton from \"@nextcloud/vue/components/NcButton\";\nimport NcCheckboxRadioSwitch from \"@nextcloud/vue/components/NcCheckboxRadioSwitch\";\nimport { extname, join } from \"@nextcloud/paths\";\nimport NcDateTime from \"@nextcloud/vue/components/NcDateTime\";\nimport { mdiKey, mdiTagOutline, mdiLink, mdiAccountPlus, mdiAccountGroupOutline, mdiNetworkOutline, mdiFolder, mdiClock, mdiStar } from \"@mdi/js\";\nimport { ShareType } from \"@nextcloud/sharing\";\nimport NcIconSvgWrapper from \"@nextcloud/vue/components/NcIconSvgWrapper\";\nimport { u as usePreviewURL } from \"./preview-BIbJGxXF.mjs\";\nimport { t, l as logger, s as showError } from \"./index-DL1yHC1K.mjs\";\nimport axios from \"@nextcloud/axios\";\nimport { loadState } from \"@nextcloud/initial-state\";\nimport { generateUrl } from \"@nextcloud/router\";\nimport { isPublicShare } from \"@nextcloud/sharing/public\";\nimport NcActionInput from \"@nextcloud/vue/components/NcActionInput\";\nimport NcActions from \"@nextcloud/vue/components/NcActions\";\nimport NcBreadcrumb from \"@nextcloud/vue/components/NcBreadcrumb\";\nimport NcBreadcrumbs from \"@nextcloud/vue/components/NcBreadcrumbs\";\nimport { getCurrentUser } from \"@nextcloud/auth\";\nimport NcSelect from \"@nextcloud/vue/components/NcSelect\";\nimport NcTextField from \"@nextcloud/vue/components/NcTextField\";\nimport { getRecentSearch, resultToNode, defaultRootPath, getDefaultPropfind, getClient, getFavoriteNodes } from \"@nextcloud/files/dav\";\nconst _sfc_main$e = {\n name: \"FileIcon\",\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};\nconst _hoisted_1$c = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$b = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$a = { d: \"M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z\" };\nconst _hoisted_4$a = { key: 0 };\nfunction _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon file-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$a, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$a, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$b))\n ], 16, _hoisted_1$c);\n}\nconst IconFile = /* @__PURE__ */ _export_sfc(_sfc_main$e, [[\"render\", _sfc_render$7]]);\nconst _sfc_main$d = {\n name: \"MenuDownIcon\",\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};\nconst _hoisted_1$b = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$a = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$9 = { d: \"M7,10L12,15L17,10H7Z\" };\nconst _hoisted_4$9 = { key: 0 };\nfunction _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon menu-down-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$9, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$9, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$a))\n ], 16, _hoisted_1$b);\n}\nconst IconSortDescending = /* @__PURE__ */ _export_sfc(_sfc_main$d, [[\"render\", _sfc_render$6]]);\nconst _sfc_main$c = {\n name: \"MenuUpIcon\",\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};\nconst _hoisted_1$a = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$9 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$8 = { d: \"M7,15L12,10L17,15H7Z\" };\nconst _hoisted_4$8 = { key: 0 };\nfunction _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon menu-up-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$8, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$8, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$9))\n ], 16, _hoisted_1$a);\n}\nconst IconSortAscending = /* @__PURE__ */ _export_sfc(_sfc_main$c, [[\"render\", _sfc_render$5]]);\nconst _sfc_main$b = {\n name: \"FolderIcon\",\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};\nconst _hoisted_1$9 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$8 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$7 = { d: \"M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z\" };\nconst _hoisted_4$7 = { key: 0 };\nfunction _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon folder-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$7, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$7, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$8))\n ], 16, _hoisted_1$9);\n}\nconst IconFolder = /* @__PURE__ */ _export_sfc(_sfc_main$b, [[\"render\", _sfc_render$4]]);\nconst fileListIconStyles = {\n \"file-picker__file-icon\": \"_file-picker__file-icon_1aykw_9\",\n \"file-picker__file-icon--primary\": \"_file-picker__file-icon--primary_1aykw_22\",\n \"file-picker__file-icon-overlay\": \"_file-picker__file-icon-overlay_1aykw_26\"\n};\nconst _sfc_main$a = /* @__PURE__ */ defineComponent({\n __name: \"FilePreview\",\n props: {\n node: {},\n cropImagePreviews: { type: Boolean }\n },\n setup(__props) {\n const props = __props;\n const fileListIconStyles$1 = ref(fileListIconStyles);\n const {\n previewURL,\n previewLoaded\n } = usePreviewURL(toRef(props, \"node\"), computed(() => ({ cropPreview: props.cropImagePreviews })));\n const isFile = computed(() => props.node.type === FileType.File);\n const folderDecorationIcon = computed(() => {\n if (props.node.type !== FileType.Folder) {\n return null;\n }\n if (props.node.attributes?.[\"is-encrypted\"] === 1) {\n return mdiKey;\n }\n if (props.node.attributes?.[\"is-tag\"]) {\n return mdiTagOutline;\n }\n const shareTypes = Object.values(props.node.attributes?.[\"share-types\"] || {}).flat();\n if (shareTypes.some((type) => type === ShareType.Link || type === ShareType.Email)) {\n return mdiLink;\n }\n if (shareTypes.length > 0) {\n return mdiAccountPlus;\n }\n switch (props.node.attributes?.[\"mount-type\"]) {\n case \"external\":\n case \"external-session\":\n return mdiNetworkOutline;\n case \"group\":\n return mdiAccountGroupOutline;\n case \"shared\":\n return mdiAccountPlus;\n }\n return null;\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n style: normalizeStyle(unref(previewLoaded) ? { backgroundImage: `url(${unref(previewURL)})` } : void 0),\n class: normalizeClass(fileListIconStyles$1.value[\"file-picker__file-icon\"])\n }, [\n !unref(previewLoaded) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [\n isFile.value ? (openBlock(), createBlock(IconFile, {\n key: 0,\n size: 32\n })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [\n folderDecorationIcon.value ? (openBlock(), createBlock(unref(NcIconSvgWrapper), {\n key: 0,\n class: normalizeClass(fileListIconStyles$1.value[\"file-picker__file-icon-overlay\"]),\n inline: \"\",\n path: folderDecorationIcon.value,\n size: 16\n }, null, 8, [\"class\", \"path\"])) : createCommentVNode(\"\", true),\n createVNode(IconFolder, {\n class: normalizeClass(fileListIconStyles$1.value[\"file-picker__file-icon--primary\"]),\n size: 32\n }, null, 8, [\"class\"])\n ], 64))\n ], 64)) : createCommentVNode(\"\", true)\n ], 6);\n };\n }\n});\nconst _hoisted_1$8 = [\"tabindex\", \"aria-selected\", \"data-filename\"];\nconst _hoisted_2$7 = { class: \"row-name\" };\nconst _hoisted_3$6 = {\n class: \"file-picker__name-container\",\n \"data-testid\": \"row-name\"\n};\nconst _hoisted_4$6 = [\"title\", \"textContent\"];\nconst _hoisted_5$1 = [\"textContent\"];\nconst _hoisted_6$1 = { class: \"row-size\" };\nconst _hoisted_7$1 = { class: \"row-modified\" };\nconst _sfc_main$9 = /* @__PURE__ */ defineComponent({\n __name: \"FileListRow\",\n props: {\n allowPickDirectory: { type: Boolean },\n selected: { type: Boolean },\n showCheckbox: { type: Boolean },\n canPick: { type: Boolean },\n node: {},\n cropImagePreviews: { type: Boolean }\n },\n emits: [\"update:selected\", \"enterDirectory\"],\n setup(__props, { emit: __emit }) {\n const props = __props;\n const emit2 = __emit;\n const timestamp = computed(() => props.node.mtime ?? 0);\n const fileExtension = computed(() => extname(props.node.displayname));\n const displayName = computed(() => props.node.displayname.slice(0, fileExtension.value ? -fileExtension.value.length : void 0));\n const isDirectory = computed(() => props.node.type === FileType.Folder);\n const isPickable = computed(() => props.canPick && (props.allowPickDirectory || !isDirectory.value));\n const isNavigatable = computed(() => (props.node.permissions & Permission.READ) === Permission.READ);\n function toggleSelected() {\n if (!isPickable.value) {\n return;\n }\n emit2(\"update:selected\", !props.selected);\n }\n function handleClick() {\n if (isDirectory.value) {\n if (isNavigatable.value) {\n emit2(\"enterDirectory\", props.node);\n }\n } else {\n toggleSelected();\n }\n }\n function handleKeyDown(event) {\n if (event.key === \"Enter\") {\n handleClick();\n }\n }\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"tr\", mergeProps({\n tabindex: __props.showCheckbox && !isDirectory.value ? void 0 : 0,\n \"aria-selected\": !isPickable.value ? void 0 : __props.selected,\n class: [\"file-picker__row\", [\n {\n \"file-picker__row--selected\": __props.selected && !__props.showCheckbox,\n \"file-picker__row--not-navigatable\": isDirectory.value && !isNavigatable.value,\n \"file-picker__row--not-pickable\": !isPickable.value\n }\n ]],\n \"data-filename\": __props.node.basename,\n \"data-testid\": \"file-list-row\"\n }, toHandlers({\n click: handleClick,\n /* same as tabindex -> if we hide the checkbox or this is a directory we need keyboard access to enter the directory or select the node */\n ...!__props.showCheckbox || isDirectory.value ? { keydown: handleKeyDown } : {}\n }, true)), [\n __props.showCheckbox ? (openBlock(), createElementBlock(\"td\", {\n key: 0,\n class: \"row-checkbox\",\n onClick: withModifiers(() => {\n }, [\"stop\"])\n }, [\n createVNode(unref(NcCheckboxRadioSwitch), {\n \"aria-label\": unref(t)(\"Select the row for {nodename}\", { nodename: displayName.value }),\n disabled: !isPickable.value,\n \"data-testid\": \"row-checkbox\",\n modelValue: __props.selected,\n \"onUpdate:modelValue\": toggleSelected\n }, null, 8, [\"aria-label\", \"disabled\", \"modelValue\"])\n ])) : createCommentVNode(\"\", true),\n createElementVNode(\"td\", _hoisted_2$7, [\n createElementVNode(\"div\", _hoisted_3$6, [\n createVNode(_sfc_main$a, {\n node: __props.node,\n cropImagePreviews: __props.cropImagePreviews\n }, null, 8, [\"node\", \"cropImagePreviews\"]),\n createElementVNode(\"div\", {\n class: \"file-picker__file-name\",\n title: displayName.value,\n textContent: toDisplayString(displayName.value)\n }, null, 8, _hoisted_4$6),\n createElementVNode(\"div\", {\n class: \"file-picker__file-extension\",\n textContent: toDisplayString(fileExtension.value)\n }, null, 8, _hoisted_5$1)\n ])\n ]),\n createElementVNode(\"td\", _hoisted_6$1, toDisplayString(unref(formatFileSize)(__props.node.size || 0)), 1),\n createElementVNode(\"td\", _hoisted_7$1, [\n createVNode(unref(NcDateTime), {\n timestamp: timestamp.value,\n ignoreSeconds: \"\"\n }, null, 8, [\"timestamp\"])\n ])\n ], 16, _hoisted_1$8);\n };\n }\n});\nconst FileListRow = /* @__PURE__ */ _export_sfc(_sfc_main$9, [[\"__scopeId\", \"data-v-7857e8bd\"]]);\nconst _hoisted_1$7 = {\n \"aria-hidden\": \"true\",\n class: \"file-picker__row loading-row\"\n};\nconst _hoisted_2$6 = {\n key: 0,\n class: \"row-checkbox\"\n};\nconst _hoisted_3$5 = { class: \"row-name\" };\nconst _hoisted_4$5 = { class: \"row-wrapper\" };\nconst _sfc_main$8 = /* @__PURE__ */ defineComponent({\n __name: \"LoadingTableRow\",\n props: {\n showCheckbox: { type: Boolean }\n },\n setup(__props) {\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"tr\", _hoisted_1$7, [\n __props.showCheckbox ? (openBlock(), createElementBlock(\"td\", _hoisted_2$6, [..._cache[0] || (_cache[0] = [\n createElementVNode(\"span\", null, null, -1)\n ])])) : createCommentVNode(\"\", true),\n createElementVNode(\"td\", _hoisted_3$5, [\n createElementVNode(\"div\", _hoisted_4$5, [\n createElementVNode(\"span\", {\n class: normalizeClass(unref(fileListIconStyles)[\"file-picker__file-icon\"])\n }, null, 2),\n _cache[1] || (_cache[1] = createElementVNode(\"span\", null, null, -1))\n ])\n ]),\n _cache[2] || (_cache[2] = createElementVNode(\"td\", { class: \"row-size\" }, [\n createElementVNode(\"span\")\n ], -1)),\n _cache[3] || (_cache[3] = createElementVNode(\"td\", { class: \"row-modified\" }, [\n createElementVNode(\"span\")\n ], -1))\n ]);\n };\n }\n});\nconst LoadingTableRow = /* @__PURE__ */ _export_sfc(_sfc_main$8, [[\"__scopeId\", \"data-v-1f96131b\"]]);\nfunction useFilesSettings() {\n const filesUserState = loadState(\"files\", \"config\", null);\n const showHiddenFiles = ref(filesUserState?.show_hidden ?? true);\n const sortFavoritesFirst = ref(filesUserState?.sort_favorites_first ?? true);\n const cropImagePreviews = ref(filesUserState?.crop_image_previews ?? true);\n onMounted(async () => {\n if (!isPublicShare()) {\n try {\n const { data } = await axios.get(generateUrl(\"/apps/files/api/v1/configs\"));\n showHiddenFiles.value = data?.data?.show_hidden ?? false;\n sortFavoritesFirst.value = data?.data?.sort_favorites_first ?? true;\n cropImagePreviews.value = data?.data?.crop_image_previews ?? true;\n } catch (error) {\n logger.error(\"Could not load files settings\", { error });\n showError(t(\"Could not load files settings\"));\n }\n } else {\n logger.debug(\"Skip loading files settings - currently on public share\");\n }\n });\n return {\n showHiddenFiles,\n sortFavoritesFirst,\n cropImagePreviews\n };\n}\nfunction useFilesViews(currentView) {\n const convertOrder = (order2) => order2 === \"asc\" ? \"ascending\" : order2 === \"desc\" ? \"descending\" : \"none\";\n const filesViewsState = loadState(\"files\", \"viewConfigs\", null);\n const filesViewConfig = ref({\n sortBy: filesViewsState?.files?.sorting_mode ?? \"basename\",\n order: convertOrder(filesViewsState?.files?.sorting_direction ?? \"asc\")\n });\n const recentViewConfig = ref({\n sortBy: filesViewsState?.recent?.sorting_mode ?? \"basename\",\n order: convertOrder(filesViewsState?.recent?.sorting_direction ?? \"asc\")\n });\n const favoritesViewConfig = ref({\n sortBy: filesViewsState?.favorites?.sorting_mode ?? \"basename\",\n order: convertOrder(filesViewsState?.favorites?.sorting_direction ?? \"asc\")\n });\n onMounted(async () => {\n if (!isPublicShare()) {\n try {\n const { data } = await axios.get(generateUrl(\"/apps/files/api/v1/views\"));\n filesViewConfig.value = {\n sortBy: data?.data?.files?.sorting_mode ?? \"basename\",\n order: convertOrder(data?.data?.files?.sorting_direction)\n };\n favoritesViewConfig.value = {\n sortBy: data?.data?.favorites?.sorting_mode ?? \"basename\",\n order: convertOrder(data?.data?.favorites?.sorting_direction)\n };\n recentViewConfig.value = {\n sortBy: data?.data?.recent?.sorting_mode ?? \"basename\",\n order: convertOrder(data?.data?.recent?.sorting_direction)\n };\n } catch (error) {\n logger.error(\"Could not load files views\", { error });\n showError(t(\"Could not load files views\"));\n }\n } else {\n logger.debug(\"Skip loading files views - currently on public share\");\n }\n });\n const currentConfig = computed(() => toValue(currentView || \"files\") === \"files\" ? filesViewConfig.value : toValue(currentView) === \"recent\" ? recentViewConfig.value : favoritesViewConfig.value);\n const sortBy = computed(() => currentConfig.value.sortBy);\n const order = computed(() => currentConfig.value.order);\n return {\n filesViewConfig,\n favoritesViewConfig,\n recentViewConfig,\n currentConfig,\n sortBy,\n order\n };\n}\nconst _hoisted_1$6 = {\n key: 0,\n class: \"row-checkbox\"\n};\nconst _hoisted_2$5 = { class: \"hidden-visually\" };\nconst _hoisted_3$4 = [\"aria-sort\"];\nconst _hoisted_4$4 = { class: \"header-wrapper\" };\nconst _hoisted_5 = {\n key: 2,\n style: { \"width\": \"44px\" }\n};\nconst _hoisted_6 = [\"aria-sort\"];\nconst _hoisted_7 = {\n key: 2,\n style: { \"width\": \"44px\" }\n};\nconst _hoisted_8 = [\"aria-sort\"];\nconst _hoisted_9 = {\n key: 2,\n style: { \"width\": \"44px\" }\n};\nconst _sfc_main$7 = /* @__PURE__ */ defineComponent({\n __name: \"FileList\",\n props: /* @__PURE__ */ mergeModels({\n currentView: {},\n multiselect: { type: Boolean },\n allowPickDirectory: { type: Boolean },\n loading: { type: Boolean },\n files: {},\n canPick: { type: Function }\n }, {\n \"path\": { required: true },\n \"pathModifiers\": {},\n \"selectedFiles\": { required: true },\n \"selectedFilesModifiers\": {}\n }),\n emits: [\"update:path\", \"update:selectedFiles\"],\n setup(__props) {\n const path = useModel(__props, \"path\");\n const selectedFiles = useModel(__props, \"selectedFiles\");\n const props = __props;\n const customSortingConfig = ref();\n const { currentConfig: filesAppSorting } = useFilesViews(props.currentView);\n const sortingConfig = computed(() => customSortingConfig.value ?? filesAppSorting.value);\n const sortByName = computed(() => sortingConfig.value.sortBy === \"basename\" ? sortingConfig.value.order === \"none\" ? void 0 : sortingConfig.value.order : void 0);\n const sortBySize = computed(() => sortingConfig.value.sortBy === \"size\" ? sortingConfig.value.order === \"none\" ? void 0 : sortingConfig.value.order : void 0);\n const sortByModified = computed(() => sortingConfig.value.sortBy === \"mtime\" ? sortingConfig.value.order === \"none\" ? void 0 : sortingConfig.value.order : void 0);\n function toggleSorting(sortBy) {\n if (sortingConfig.value.sortBy === sortBy) {\n if (sortingConfig.value.order === \"ascending\") {\n customSortingConfig.value = { sortBy: sortingConfig.value.sortBy, order: \"descending\" };\n } else {\n customSortingConfig.value = { sortBy: sortingConfig.value.sortBy, order: \"ascending\" };\n }\n } else {\n customSortingConfig.value = { sortBy, order: \"ascending\" };\n }\n }\n const { sortFavoritesFirst, cropImagePreviews } = useFilesSettings();\n const sortedFiles = computed(() => {\n return sortNodes(props.files, {\n sortFoldersFirst: true,\n sortFavoritesFirst: sortFavoritesFirst.value,\n sortingOrder: sortingConfig.value.order === \"descending\" ? \"desc\" : \"asc\",\n sortingMode: sortingConfig.value.sortBy\n });\n });\n const selectableFiles = computed(() => props.files.filter((file) => props.allowPickDirectory || file.type !== FileType.Folder));\n const allSelected = computed(() => !props.loading && selectedFiles.value.length > 0 && selectedFiles.value.length >= selectableFiles.value.length);\n function onSelectAll() {\n if (selectedFiles.value.length < selectableFiles.value.length) {\n selectedFiles.value = [...selectableFiles.value];\n } else {\n selectedFiles.value = [];\n }\n }\n function onNodeSelected(file) {\n if (selectedFiles.value.includes(file)) {\n selectedFiles.value = selectedFiles.value.filter((f) => f.path !== file.path);\n } else {\n if (props.multiselect) {\n selectedFiles.value = [...selectedFiles.value, file];\n } else {\n selectedFiles.value = [file];\n }\n }\n }\n function onChangeDirectory(dir) {\n path.value = dir.path;\n }\n const skeletonNumber = ref(4);\n const fileContainer = ref();\n {\n const resize = () => nextTick(() => {\n const nodes = fileContainer.value?.parentElement?.children || [];\n let height = fileContainer.value?.parentElement?.clientHeight || 450;\n for (let index = 0; index < nodes.length; index++) {\n if (!fileContainer.value?.isSameNode(nodes[index])) {\n height -= nodes[index].clientHeight;\n }\n }\n skeletonNumber.value = Math.max(1, Math.floor((height - 50) / 50));\n });\n onMounted(() => {\n window.addEventListener(\"resize\", resize);\n resize();\n });\n onUnmounted(() => {\n window.removeEventListener(\"resize\", resize);\n });\n }\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n ref_key: \"fileContainer\",\n ref: fileContainer,\n class: \"file-picker__files\"\n }, [\n createElementVNode(\"table\", null, [\n createElementVNode(\"thead\", null, [\n createElementVNode(\"tr\", null, [\n __props.multiselect ? (openBlock(), createElementBlock(\"th\", _hoisted_1$6, [\n createElementVNode(\"span\", _hoisted_2$5, toDisplayString(unref(t)(\"Select entry\")), 1),\n __props.multiselect ? (openBlock(), createBlock(unref(NcCheckboxRadioSwitch), {\n key: 0,\n \"aria-label\": unref(t)(\"Select all entries\"),\n \"data-testid\": \"select-all-checkbox\",\n modelValue: allSelected.value,\n \"onUpdate:modelValue\": onSelectAll\n }, null, 8, [\"aria-label\", \"modelValue\"])) : createCommentVNode(\"\", true)\n ])) : createCommentVNode(\"\", true),\n createElementVNode(\"th\", {\n \"aria-sort\": sortByName.value,\n class: \"row-name\"\n }, [\n createElementVNode(\"div\", _hoisted_4$4, [\n _cache[3] || (_cache[3] = createElementVNode(\"span\", { class: \"file-picker__header-preview\" }, null, -1)),\n createVNode(unref(NcButton), {\n \"data-test\": \"file-picker_sort-name\",\n variant: \"tertiary\",\n wide: \"\",\n onClick: _cache[0] || (_cache[0] = ($event) => toggleSorting(\"basename\"))\n }, {\n icon: withCtx(() => [\n sortByName.value === \"ascending\" ? (openBlock(), createBlock(IconSortAscending, {\n key: 0,\n size: 20\n })) : sortByName.value === \"descending\" ? (openBlock(), createBlock(IconSortDescending, {\n key: 1,\n size: 20\n })) : (openBlock(), createElementBlock(\"span\", _hoisted_5))\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(unref(t)(\"Name\")), 1)\n ]),\n _: 1\n })\n ])\n ], 8, _hoisted_3$4),\n createElementVNode(\"th\", {\n \"aria-sort\": sortBySize.value,\n class: \"row-size\"\n }, [\n createVNode(unref(NcButton), {\n variant: \"tertiary\",\n wide: \"\",\n onClick: _cache[1] || (_cache[1] = ($event) => toggleSorting(\"size\"))\n }, {\n icon: withCtx(() => [\n sortBySize.value === \"ascending\" ? (openBlock(), createBlock(IconSortAscending, {\n key: 0,\n size: 20\n })) : sortBySize.value === \"descending\" ? (openBlock(), createBlock(IconSortDescending, {\n key: 1,\n size: 20\n })) : (openBlock(), createElementBlock(\"span\", _hoisted_7))\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(unref(t)(\"Size\")), 1)\n ]),\n _: 1\n })\n ], 8, _hoisted_6),\n createElementVNode(\"th\", {\n \"aria-sort\": sortByModified.value,\n class: \"row-modified\"\n }, [\n createVNode(unref(NcButton), {\n variant: \"tertiary\",\n wide: \"\",\n onClick: _cache[2] || (_cache[2] = ($event) => toggleSorting(\"mtime\"))\n }, {\n icon: withCtx(() => [\n sortByModified.value === \"ascending\" ? (openBlock(), createBlock(IconSortAscending, {\n key: 0,\n size: 20\n })) : sortByModified.value === \"descending\" ? (openBlock(), createBlock(IconSortDescending, {\n key: 1,\n size: 20\n })) : (openBlock(), createElementBlock(\"span\", _hoisted_9))\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(unref(t)(\"Modified\")), 1)\n ]),\n _: 1\n })\n ], 8, _hoisted_8)\n ])\n ]),\n createElementVNode(\"tbody\", null, [\n __props.loading ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(skeletonNumber.value, (index) => {\n return openBlock(), createBlock(LoadingTableRow, {\n key: index,\n showCheckbox: __props.multiselect\n }, null, 8, [\"showCheckbox\"]);\n }), 128)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(sortedFiles.value, (file) => {\n return openBlock(), createBlock(FileListRow, {\n key: file.fileid || file.path,\n allowPickDirectory: __props.allowPickDirectory,\n showCheckbox: __props.multiselect,\n canPick: (__props.multiselect || selectedFiles.value.length === 0 || selectedFiles.value.includes(file)) && (__props.canPick === void 0 || __props.canPick(file)),\n selected: selectedFiles.value.includes(file),\n node: file,\n cropImagePreviews: unref(cropImagePreviews),\n \"onUpdate:selected\": ($event) => onNodeSelected(file),\n onEnterDirectory: onChangeDirectory\n }, null, 8, [\"allowPickDirectory\", \"showCheckbox\", \"canPick\", \"selected\", \"node\", \"cropImagePreviews\", \"onUpdate:selected\"]);\n }), 128))\n ])\n ])\n ], 512);\n };\n }\n});\nconst FileList = /* @__PURE__ */ _export_sfc(_sfc_main$7, [[\"__scopeId\", \"data-v-412efd5c\"]]);\nconst _sfc_main$6 = {\n name: \"HomeIcon\",\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};\nconst _hoisted_1$5 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$4 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$3 = { d: \"M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z\" };\nconst _hoisted_4$3 = { key: 0 };\nfunction _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon home-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$3, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$3, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$4))\n ], 16, _hoisted_1$5);\n}\nconst IconHome = /* @__PURE__ */ _export_sfc(_sfc_main$6, [[\"render\", _sfc_render$3]]);\nconst _sfc_main$5 = {\n name: \"PlusIcon\",\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};\nconst _hoisted_1$4 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$3 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$2 = { d: \"M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z\" };\nconst _hoisted_4$2 = { key: 0 };\nfunction _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon plus-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$2, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$2, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$3))\n ], 16, _hoisted_1$4);\n}\nconst IconPlus = /* @__PURE__ */ _export_sfc(_sfc_main$5, [[\"render\", _sfc_render$2]]);\nconst _sfc_main$4 = /* @__PURE__ */ defineComponent({\n __name: \"FilePickerBreadcrumbs\",\n props: /* @__PURE__ */ mergeModels({\n showMenu: { type: Boolean }\n }, {\n \"path\": { required: true },\n \"pathModifiers\": {}\n }),\n emits: /* @__PURE__ */ mergeModels([\"createNode\"], [\"update:path\"]),\n setup(__props, { emit: __emit }) {\n const path = useModel(__props, \"path\");\n const emit2 = __emit;\n const actionsOpen = ref(false);\n const newNodeName = ref(\"\");\n const nameInput = useTemplateRef(\"nameInput\");\n function validateInput() {\n const name = newNodeName.value.trim();\n const input = nameInput.value?.$el?.querySelector(\"input\");\n let validity = \"\";\n try {\n validateFilename(name);\n } catch (error) {\n if (!(error instanceof InvalidFilenameError)) {\n throw error;\n }\n switch (error.reason) {\n case InvalidFilenameErrorReason.Character:\n validity = t('\"{char}\" is not allowed inside a folder name.', { char: error.segment });\n break;\n case InvalidFilenameErrorReason.ReservedName:\n validity = t('\"{segment}\" is a reserved name and not allowed for folder names.', { segment: error.segment });\n break;\n case InvalidFilenameErrorReason.Extension:\n validity = t('Folder names must not end with \"{extension}\".', { extension: error.segment });\n break;\n default:\n validity = t(\"Invalid folder name.\");\n }\n }\n if (input) {\n input.setCustomValidity(validity);\n }\n return validity === \"\";\n }\n function onSubmit() {\n const name = newNodeName.value.trim();\n if (validateInput()) {\n actionsOpen.value = false;\n emit2(\"createNode\", name);\n newNodeName.value = \"\";\n }\n }\n const pathElements = computed(() => path.value.split(\"/\").filter((v) => v !== \"\").map((v, i, elements) => ({\n name: v,\n path: \"/\" + elements.slice(0, i + 1).join(\"/\")\n })));\n return (_ctx, _cache) => {\n return openBlock(), createBlock(unref(NcBreadcrumbs), { class: \"file-picker__breadcrumbs\" }, createSlots({\n default: withCtx(() => [\n createVNode(unref(NcBreadcrumb), {\n name: unref(t)(\"All files\"),\n title: unref(t)(\"Home\"),\n onClick: _cache[0] || (_cache[0] = ($event) => path.value = \"/\")\n }, {\n icon: withCtx(() => [\n createVNode(IconHome, { size: 20 })\n ]),\n _: 1\n }, 8, [\"name\", \"title\"]),\n (openBlock(true), createElementBlock(Fragment, null, renderList(pathElements.value, (dir) => {\n return openBlock(), createBlock(unref(NcBreadcrumb), {\n key: dir.path,\n name: dir.name,\n title: dir.path,\n onClick: ($event) => path.value = dir.path\n }, null, 8, [\"name\", \"title\", \"onClick\"]);\n }), 128))\n ]),\n _: 2\n }, [\n __props.showMenu ? {\n name: \"actions\",\n fn: withCtx(() => [\n createVNode(unref(NcActions), {\n open: actionsOpen.value,\n \"onUpdate:open\": _cache[2] || (_cache[2] = ($event) => actionsOpen.value = $event),\n \"aria-label\": unref(t)(\"Create directory\"),\n forceMenu: true,\n forceName: true,\n menuName: unref(t)(\"New\"),\n variant: \"secondary\",\n onClose: _cache[3] || (_cache[3] = ($event) => newNodeName.value = \"\")\n }, {\n icon: withCtx(() => [\n createVNode(IconPlus, { size: 20 })\n ]),\n default: withCtx(() => [\n createVNode(unref(NcActionInput), {\n ref_key: \"nameInput\",\n ref: nameInput,\n modelValue: newNodeName.value,\n \"onUpdate:modelValue\": [\n _cache[1] || (_cache[1] = ($event) => newNodeName.value = $event),\n validateInput\n ],\n label: unref(t)(\"New folder\"),\n placeholder: unref(t)(\"New folder name\"),\n onSubmit\n }, {\n icon: withCtx(() => [\n createVNode(IconFolder, { size: 20 })\n ]),\n _: 1\n }, 8, [\"modelValue\", \"label\", \"placeholder\"])\n ]),\n _: 1\n }, 8, [\"open\", \"aria-label\", \"menuName\"])\n ]),\n key: \"0\"\n } : void 0\n ]), 1024);\n };\n }\n});\nconst FilePickerBreadcrumbs = /* @__PURE__ */ _export_sfc(_sfc_main$4, [[\"__scopeId\", \"data-v-b448b141\"]]);\nconst _sfc_main$3 = {\n name: \"CloseIcon\",\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};\nconst _hoisted_1$3 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$2 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$1 = { d: \"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" };\nconst _hoisted_4$1 = { key: 0 };\nfunction _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon close-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$1, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$1, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$2))\n ], 16, _hoisted_1$3);\n}\nconst IconClose = /* @__PURE__ */ _export_sfc(_sfc_main$3, [[\"render\", _sfc_render$1]]);\nconst _sfc_main$2 = {\n name: \"MagnifyIcon\",\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};\nconst _hoisted_1$2 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$1 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3 = { d: \"M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z\" };\nconst _hoisted_4 = { key: 0 };\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon magnify-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$1))\n ], 16, _hoisted_1$2);\n}\nconst IconMagnify = /* @__PURE__ */ _export_sfc(_sfc_main$2, [[\"render\", _sfc_render]]);\nfunction useViews(isAnonymous) {\n const allViews = [\n {\n id: \"files\",\n label: t(\"All files\"),\n icon: mdiFolder\n },\n {\n id: \"recent\",\n label: t(\"Recent\"),\n icon: mdiClock\n },\n {\n id: \"favorites\",\n label: t(\"Favorites\"),\n icon: mdiStar\n }\n ];\n const availableViews = isAnonymous.value ? allViews.filter(({ id }) => id === \"files\") : allViews;\n return {\n allViews,\n availableViews\n };\n}\nconst _hoisted_1$1 = {\n key: 0,\n class: \"file-picker__side\"\n};\nconst _sfc_main$1 = /* @__PURE__ */ defineComponent({\n __name: \"FilePickerNavigation\",\n props: {\n currentView: {},\n filterString: {},\n isCollapsed: { type: Boolean },\n disabledNavigation: { type: Boolean }\n },\n emits: [\"update:currentView\", \"update:filterString\"],\n setup(__props, { emit: __emit }) {\n const props = __props;\n const emit2 = __emit;\n const { availableViews } = useViews(ref(getCurrentUser() === null));\n const currentViewObject = computed(() => availableViews.filter((v) => v.id === props.currentView)[0] ?? availableViews[0]);\n const updateFilterValue = (value) => emit2(\"update:filterString\", value.toString());\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(Fragment, null, [\n createVNode(unref(NcTextField), {\n class: \"file-picker__filter-input\",\n label: unref(t)(\"Filter file list\"),\n showTrailingButton: !!__props.filterString,\n modelValue: __props.filterString,\n \"onUpdate:modelValue\": updateFilterValue,\n onTrailingButtonClick: _cache[0] || (_cache[0] = ($event) => updateFilterValue(\"\"))\n }, {\n \"trailing-button-icon\": withCtx(() => [\n createVNode(IconClose, { size: 16 })\n ]),\n default: withCtx(() => [\n createVNode(IconMagnify, { size: 16 })\n ]),\n _: 1\n }, 8, [\"label\", \"showTrailingButton\", \"modelValue\"]),\n unref(availableViews).length > 1 && !__props.disabledNavigation ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [\n !__props.isCollapsed ? (openBlock(), createElementBlock(\"ul\", _hoisted_1$1, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(unref(availableViews), (view) => {\n return openBlock(), createElementBlock(\"li\", {\n key: view.id\n }, [\n createVNode(unref(NcButton), {\n variant: __props.currentView === view.id ? \"primary\" : \"tertiary\",\n wide: true,\n onClick: ($event) => _ctx.$emit(\"update:currentView\", view.id)\n }, {\n icon: withCtx(() => [\n createVNode(unref(NcIconSvgWrapper), {\n path: view.icon,\n size: 20\n }, null, 8, [\"path\"])\n ]),\n def Copyright = \"M10.08 10.86C10.13 10.53 10.24 10.24 10.38 10C10.68 9.44 11.19 9.15 11.88 9.14C12.33 9.14 12.74 9.34 13.03 9.63C13.31 9.94 13.5 10.37 13.5 10.8H15.3C15.28 10.33 15.19 9.9 15 9.5C14.85 9.12 14.62 8.78 14.32 8.5C12.87 7.16 10.18 7.35 8.95 8.87C7.66 10.54 7.63 13.46 8.94 15.13C10.15 16.62 12.8 16.83 14.24 15.5C14.55 15.25 14.8 14.94 15 14.58C15.16 14.22 15.27 13.84 15.28 13.43H13.5C13.5 13.64 13.43 13.83 13.34 14C13.25 14.19 13.13 14.34 13 14.47C12.67 14.73 12.28 14.87 11.86 14.87C11.5 14.86 11.2 14.79 10.97 14.64C10.72 14.5 10.5 14.27 10.38 14C9.88 13.1 9.96 11.85 10.08 10.86M12 2C6.5 2 2 6.5 2 12C2.53 25.27 21.5 25.26 22 12C22 6.5 17.5 2 12 2M12 20C7.59 20 4 16.41 4 12C4.44 1.39 19.56 1.39 20 12C20 16.41 16.41 20 12 20Z\";\nexport var mdiCordova = \"M20.18,21.55H16.94L17.17,18.82H15.58L15.35,21.55H8.65L8.42,18.82H6.83L7.06,21.55H3.82L2,9.73L6.55,2.45H17.45L22,9.73L20.18,21.55M16.55,6.09H13.62L13.82,7.45H10.18L10.38,6.09H7.45L5.64,9.73L6.55,17H17.45L18.36,9.73L16.55,6.09M14.95,14.59C14.7,14.59 14.5,13.83 14.5,12.9C14.5,11.96 14.7,11.2 14.95,11.2C15.21,11.2 15.41,11.96 15.41,12.9C15.41,13.83 15.21,14.59 14.95,14.59M9.22,14.73C8.96,14.73 8.76,13.97 8.76,13.04C8.76,12.1 8.96,11.35 9.22,11.35C9.47,11.35 9.67,12.1 9.67,13.04C9.67,13.97 9.47,14.73 9.22,14.73Z\";\nexport var mdiCorn = \"M11,12H8.82C9.62,12.5 10.35,13.07 11,13.68V12M7,11C7.27,5.88 9.37,2 12,2C14.66,2 16.77,5.94 17,11.12C18.5,10.43 20.17,10 22,10C16.25,12.57 18.25,22 12,22C6,22 7.93,12.57 2,10C3.82,10 5.5,10.4 7,11M11,11V9H8.24L8.03,11H11M11,8V6H9.05C8.8,6.6 8.6,7.27 8.43,8H11M11,5V3.3C10.45,3.63 9.95,4.22 9.5,5H11M12,3V5H13V6H12V8H14V9H12V11H15V12H12V14H14V15H12.23C13.42,16.45 14.15,18 14.32,19.23C15.31,17.56 15.96,14.84 16,11.76C15.94,7 14.13,3 12,3Z\";\nexport var mdiCornOff = \"M22.1 21.5L2.4 1.7L1.1 3L7.2 9.1C7.1 9.7 7 10.3 7 11C5.5 10.4 3.8 10 2 10C7.9 12.6 6 22 12 22C14.5 22 15.7 20.5 16.6 18.5L20.9 22.8L22.1 21.5M8.1 10L9.1 11H8L8.1 10M8.8 12H10.1L11 12.9V13.7C10.3 13.1 9.6 12.5 8.8 12M14.3 19.2C14.1 18 13.4 16.4 12.2 15H13.1L15.2 17.1C15 17.9 14.7 18.6 14.3 19.2M11 6V7.8L12.2 9H14V8H12V6H13V5H12V3C14.1 3 15.9 7 16 11.8V12.8L18 14.8C18.8 12.8 19.9 10.9 22 10C20.2 10 18.5 10.4 17 11.1C16.8 5.9 14.7 2 12 2C10.5 2 9.2 3.2 8.3 5.1L9.2 6H11M11 3.3V5H9.5C10 4.2 10.5 3.6 11 3.3M15 11.8L14.2 11H15V11.8Z\";\nexport var mdiCosineWave = \"M22 2V4C20.26 4 19 8.58 17.96 12.27C16.57 17.27 15.26 22 12 22C8.74 22 7.43 17.27 6.04 12.27C5 8.58 3.74 4 2 4V2C5.26 2 6.57 6.73 7.96 11.73C9 15.42 10.26 20 12 20C13.74 20 15 15.42 16.04 11.73C17.43 6.73 18.74 2 22 2Z\";\nexport var mdiCounter = \"M4,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M4,6V18H11V6H4M20,18V6H18.76C19,6.54 18.95,7.07 18.95,7.13C18.88,7.8 18.41,8.5 18.24,8.75L15.91,11.3L19.23,11.28L19.24,12.5L14.04,12.47L14,11.47C14,11.47 17.05,8.24 17.2,7.95C17.34,7.67 17.91,6 16.5,6C15.27,6.05 15.41,7.3 15.41,7.3L13.87,7.31C13.87,7.31 13.88,6.65 14.25,6H13V18H15.58L15.57,17.14L16.54,17.13C16.54,17.13 17.45,16.97 17.46,16.08C17.5,15.08 16.65,15.08 16.5,15.08C16.37,15.08 15.43,15.13 15.43,15.95H13.91C13.91,15.95 13.95,13.89 16.5,13.89C19.1,13.89 18.96,15.91 18.96,15.91C18.96,15.91 19,17.16 17.85,17.63L18.37,18H20M8.92,16H7.42V10.2L5.62,10.76V9.53L8.76,8.41H8.92V16Z\";\nexport var mdiCountertop = \"M18 10V7C18 5.34 16.66 4 15 4S12 5.34 12 7H14C14 6.45 14.45 6 15 6S16 6.45 16 7V10H8C9.1 10 10 9.1 10 8V4H4V8C4 9.1 4.9 10 6 10H2V12H4V20H20V12H22V10H18M13 18H11V12H13V18Z\";\nexport var mdiCountertopOutline = \"M22 10H18V7C18 5.34 16.66 4 15 4S12 5.34 12 7H14C14 6.45 14.45 6 15 6S16 6.45 16 7V10H8C9.1 10 10 9.1 10 8V4H4V8C4 9.1 4.9 10 6 10H2V12H4V20H20V12H22V10M6 6H8V8H6V6M6 18V12H11V18H6M18 18H13V12H18V18Z\";\nexport var mdiCow = \"M10.5,18A0.5,0.5 0 0,1 11,18.5A0.5,0.5 0 0,1 10.5,19A0.5,0.5 0 0,1 10,18.5A0.5,0.5 0 0,1 10.5,18M13.5,18A0.5,0.5 0 0,1 14,18.5A0.5,0.5 0 0,1 13.5,19A0.5,0.5 0 0,1 13,18.5A0.5,0.5 0 0,1 13.5,18M10,11A1,1 0 0,1 11,12A1,1 0 0,1 10,13A1,1 0 0,1 9,12A1,1 0 0,1 10,11M14,11A1,1 0 0,1 15,12A1,1 0 0,1 14,13A1,1 0 0,1 13,12A1,1 0 0,1 14,11M18,18C18,20.21 15.31,22 12,22C8.69,22 6,20.21 6,18C6,17.1 6.45,16.27 7.2,15.6C6.45,14.6 6,13.35 6,12L6.12,10.78C5.58,10.93 4.93,10.93 4.4,10.78C3.38,10.5 1.84,9.35 2.07,8.55C2.3,7.75 4.21,7.6 5.23,7.9C5.82,8.07 6.45,8.5 6.82,8.96L7.39,8.15C6.79,7.05 7,4 10,3L9.91,3.14V3.14C9.63,3.58 8.91,4.97 9.67,6.47C10.39,6.17 11.17,6 12,6C12.83,6 13.61,6.17 14.33,6.47C15.09,4.97 14.37,3.58 14.09,3.14L14,3C17,4 17.21,7.05 16.61,8.15L17.18,8.96C17.55,8.5 18.18,8.07 18.77,7.9C19.79,7.6 21.7,7.75 21.93,8.55C22.16,9.35 20.62,10.5 19.6,10.78C19.07,10.93 18.42,10.93 17.88,10.78L18,12C18,13.35 17.55,14.6 16.8,15.6C17.55,16.27 18,17.1 18,18M12,16C9.79,16 8,16.9 8,18C8,19.1 9.79,20 12,20C14.21,20 16,19.1 16,18C16,16.9 14.21,16 12,16M12,14C13.12,14 14.17,14.21 15.07,14.56C15.65,13.87 16,13 16,12A4,4 0 0,0 12,8A4,4 0 0,0 8,12C8,13 8.35,13.87 8.93,14.56C9.83,14.21 10.88,14 12,14M14.09,3.14V3.14Z\";\nexport var mdiCowOff = \"M22.1 21.5L2.4 1.7L1.1 3L6.9 8.8L6.8 9C6.4 8.5 5.8 8.1 5.2 7.9C4.2 7.6 2.3 7.7 2 8.5S3.3 10.5 4.3 10.7C4.8 10.8 5.5 10.8 6 10.7V12C6 13.3 6.5 14.6 7.2 15.6C6.5 16.3 6 17.1 6 18C6 20.2 8.7 22 12 22C14.5 22 16.7 21 17.6 19.5L20.9 22.8L22.1 21.5M9.4 11.2C9.1 11.4 9 11.7 9 12C9 12.6 9.4 13 10 13C10.3 13 10.6 12.9 10.8 12.6L12.2 14H12.1C11 14 9.9 14.2 9 14.6C8.3 13.9 8 13 8 12C8 11.4 8.1 10.8 8.4 10.3L9.4 11.2M16 18C16 19.1 14.2 20 12 20S8 19.1 8 18 9.8 16 12 16C13 16 13.9 16.2 14.6 16.5L16 17.9V18M9.7 6.5L7.8 4.6C8.3 3.9 9 3.3 10 3L9.9 3.1C9.6 3.6 8.9 5 9.7 6.5M11.3 8.1L9.7 6.5C10.4 6.2 11.2 6 12 6S13.6 6.2 14.3 6.5C15.1 5 14.3 3.6 14.1 3.2L14 3C17 4 17.2 7 16.6 8.2L17.2 9C17.6 8.5 18.2 8.1 18.8 7.9C19.8 7.6 21.7 7.7 22 8.5S20.7 10.5 19.7 10.7C19.2 10.8 18.5 10.8 18 10.7V12C18 12.8 17.8 13.6 17.5 14.3L15.9 12.7C15.9 12.5 16 12.2 16 12C16 9.8 14.2 8 12 8C11.8 8 11.5 8 11.3 8.1M14 18.5C14 18.8 13.8 19 13.5 19S13 18.8 13 18.5 13.2 18 13.5 18 14 18.2 14 18.5M11 18.5C11 18.8 10.8 19 10.5 19S10 18.8 10 18.5 10.2 18 10.5 18 11 18.2 11 18.5Z\";\nexport var mdiCpu32Bit = \"M9,3V5H7A2,2 0 0,0 5,7V9H3V11H5V13H3V15H5V17A2,2 0 0,0 7,19H9V21H11V19H13V21H15V19H17A2,2 0 0,0 19,17V15H21V13H19V11H21V9H19V7A2,2 0 0,0 17,5H15V3H13V5H11V3M7,9H10.5A1,1 0 0,1 11.5,10V14A1,1 0 0,1 10.5,15H7V13.5H10V12.75H8.5V11.25H10V10.5H7M12.5,9H16A1,1 0 0,1 17,10V11.75A1,1 0 0,1 16,12.75H14V13.5H17V15H12.5V12.25A1,1 0 0,1 13.5,11.25H15.5V10.5H12.5\";\nexport var mdiCpu64Bit = \"M9,3V5H7A2,2 0 0,0 5,7V9H3V11H5V13H3V15H5V17A2,2 0 0,0 7,19H9V21H11V19H13V21H15V19H17A2,2 0 0,0 19,17V15H21V13H19V11H21V9H19V7A2,2 0 0,0 17,5H15V3H13V5H11V3M8,9H11.5V10.5H8.5V11.25H10.5A1,1 0 0,1 11.5,12.25V14A1,1 0 0,1 10.5,15H8A1,1 0 0,1 7,14V10A1,1 0 0,1 8,9M12.5,9H14V11H15.5V9H17V15H15.5V12.5H12.5M8.5,12.75V13.5H10V12.75\";\nexport var mdiCradle = \"M18 9H12V4H8C5.8 4 4 5.8 4 8V14C4 15.1 4.9 16 6 16H8V18.9C7.4 18.5 6.8 18.1 6.3 17.6L4.9 19C6.7 20.9 9.2 22 12 22S17.3 20.9 19.1 19.1L17.7 17.7C17.2 18.2 16.7 18.6 16.1 19V16H18.1C19.2 16 20.1 15.1 20.1 14V11C20 9.9 19.1 9 18 9M14 19.8C13.4 20 12.7 20 12 20S10.6 19.9 10 19.8V16H14V19.8Z\";\nexport var mdiCradleOutline = \"M18 9H12V4H8C5.8 4 4 5.8 4 8V14C4 15.1 4.9 16 6 16H8V18.9C7.4 18.5 6.8 18.1 6.3 17.6L4.9 19C6.7 20.9 9.2 22 12 22S17.3 20.9 19.1 19.1L17.7 17.7C17.2 18.2 16.7 18.6 16.1 19V16H18.1C19.2 16 20.1 15.1 20.1 14V11C20 9.9 19.1 9 18 9M14 19.8C13.4 20 12.7 20 12 20S10.6 19.9 10 19.8V16H14V19.8M18 14H6V8C6 6.9 6.9 6 8 6H10V11H18V14Z\";\nexport var mdiCrane = \"M20,6V5A1,1 0 0,0 19,4H9V3H6V4H5V6H6V15H5V13H3V15H2V17H3V21H5V17H10V21H12V19.92L12,17H13V15H12V13H10V15H9V6H17V10.62C16.53,10.79 16.19,11.23 16.19,11.76C16.19,12.2 16.43,12.6 16.8,12.82V14H17.42C17.76,14 18.03,14.28 18.03,14.62C18.03,14.96 17.76,15.24 17.42,15.24C17.2,15.24 17,15.12 16.89,14.93C16.71,14.64 16.34,14.54 16.05,14.71C15.75,14.87 15.65,15.25 15.82,15.55C16.15,16.11 16.76,16.47 17.42,16.47C18.43,16.47 19.26,15.64 19.26,14.62C19.26,13.84 18.76,13.14 18.03,12.88V12.82C18.41,12.6 18.65,12.2 18.65,11.76C18.65,11.3 18.38,10.91 18,10.7V6H20M8,13.66L7,14.66V13.24L8,12.24V13.66M8,10.71L7,11.71V10.29L8,9.29V10.71M7,8.71V7.29L8,6.29V7.71L7,8.71Z\";\nexport var mdiCreation = \"M19,1L17.74,3.75L15,5L17.74,6.26L19,9L20.25,6.26L23,5L20.25,3.75M9,4L6.5,9.5L1,12L6.5,14.5L9,20L11.5,14.5L17,12L11.5,9.5M19,15L17.74,17.74L15,19L17.74,20.25L19,23L20.25,20.25L23,19L20.25,17.74\";\nexport var mdiCreationOutline = \"M9 4L11.5 9.5L17 12L11.5 14.5L9 20L6.5 14.5L1 12L6.5 9.5L9 4M9 8.83L8 11L5.83 12L8 13L9 15.17L10 13L12.17 12L10 11L9 8.83M19 9L17.74 6.26L15 5L17.74 3.75L19 1L20.25 3.75L23 5L20.25 6.26L19 9M19 23L17.74 20.26L15 19L17.74 17.75L19 15L20.25 17.75L23 19L20.25 20.26L19 23Z\";\nexport var mdiCreativeCommons = \"M11.89,10.34L10.55,11.04C10.41,10.74 10.24,10.53 10.03,10.41C9.82,10.29 9.62,10.23 9.45,10.23C8.55,10.23 8.11,10.82 8.11,12C8.11,12.54 8.22,12.97 8.45,13.29C8.67,13.61 9,13.77 9.45,13.77C10.03,13.77 10.44,13.5 10.68,12.91L11.91,13.54C11.65,14.03 11.29,14.41 10.82,14.69C10.36,14.97 9.85,15.11 9.29,15.11C8.39,15.11 7.67,14.84 7.12,14.29C6.58,13.74 6.3,13 6.3,12C6.3,11.05 6.58,10.3 7.13,9.74C7.69,9.18 8.39,8.9 9.23,8.9C10.47,8.89 11.36,9.38 11.89,10.34M17.66,10.34L16.34,11.04C16.2,10.74 16,10.53 15.81,10.41C15.6,10.29 15.4,10.23 15.21,10.23C14.32,10.23 13.87,10.82 13.87,12C13.87,12.54 14,12.97 14.21,13.29C14.44,13.61 14.77,13.77 15.21,13.77C15.8,13.77 16.21,13.5 16.45,12.91L17.7,13.54C17.42,14.03 17.05,14.41 16.59,14.69C16.12,14.97 15.62,15.11 15.07,15.11C14.17,15.11 13.44,14.84 12.9,14.29C12.36,13.74 12.09,13 12.09,12C12.09,11.05 12.37,10.3 12.92,9.74C13.47,9.18 14.17,8.9 15,8.9C16.26,8.89 17.14,9.38 17.66,10.34M12,3.5A8.5,8.5 0 0,1 20.5,12A8.5,8.5 0 0,1 12,20.5A8.5,8.5 0 0,1 3.5,12A8.5,8.5 0 0,1 12,3.5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\";\nexport var mdiCreditCard = \"M20 4H4A2 2 0 0 0 2 6V18A2 2 0 0 0 4 20H20A2 2 0 0 0 22 18V6A2 2 0 0 0 20 4M20 11H4V8H20Z\";\nexport var mdiCreditCardCheck = \"M20 4H4C2.9 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H13.09C13.03 19.67 13 19.34 13 19C13 15.69 15.69 13 19 13C20.06 13 21.09 13.28 22 13.81V6C22 4.89 21.11 4 20 4M20 11H4V8H20M17.75 22L15 19L16.16 17.84L17.75 19.43L21.34 15.84L22.5 17.25L17.75 22\";\nexport var mdiCreditCardCheckOutline = \"M13 19C13 18.66 13.04 18.33 13.09 18H3V12H19V13C19.7 13 20.37 13.13 21 13.35V6C21 4.89 20.11 4 19 4H3C1.89 4 1 4.89 1 6V18C1 19.1 1.89 20 3 20H13.09C13.04 19.67 13 19.34 13 19M3 6H19V8H3V6M17.75 22L15 19L16.16 17.84L17.75 19.43L21.34 15.84L22.5 17.25L17.75 22\";\nexport var mdiCreditCardChip = \"M20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.89 20 4 20H20C21.11 20 22 19.11 22 18V6C22 4.89 21.11 4 20 4M10 14H5V10H10V14Z\";\nexport var mdiCreditCardChipOutline = \"M20 6L20 18L4 18L4 6H20M20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.89 20 4 20H20C21.11 20 22 19.11 22 18V6C22 4.89 21.11 4 20 4M11 10H6V14H11V10Z\";\nexport var mdiCreditCardClock = \"M16,14H17.5V16.82L19.94,18.23L19.19,19.53L16,17.69V14M24,17A7,7 0 0,1 17,24C14.21,24 11.8,22.36 10.67,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H20A2,2 0 0,1 22,6V12.1C23.24,13.36 24,15.09 24,17M17,12A5,5 0 0,0 12,17A5,5 0 0,0 17,22A5,5 0 0,0 22,17A5,5 0 0,0 17,12M20,10V7H4V10H20Z\";\nexport var mdiCreditCardClockOutline = \"M16,14H17.5V16.82L19.94,18.23L19.19,19.53L16,17.69V14M24,17A7,7 0 0,1 17,24C14.21,24 11.8,22.36 10.67,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H20A2,2 0 0,1 22,6V12.1C23.24,13.36 24,15.09 24,17M10,17C10,15.04 10.81,13.27 12.1,12H4V18H10.07C10,17.67 10,17.34 10,17M17,12A5,5 0 0,0 12,17A5,5 0 0,0 17,22A5,5 0 0,0 22,17A5,5 0 0,0 17,12M20,8V6H4V8H20Z\";\nexport var mdiCreditCardEdit = \"M20.6 11.3C20.7 11.2 20.8 11.1 21 11.1C21.1 11.1 21.3 11.2 21.4 11.3L22.6 12.5C22.8 12.7 22.8 13.1 22.6 13.3L21.6 14.3L19.6 12.3L20.6 11.3M13 18.9L19 12.8L21.1 14.9L15.1 21H13V18.9M11 19.1V18.1L11.6 17.5L18.1 11H4V8H20V9.1L22 7.1V6C22 4.9 21.1 4 20 4H4C3.5 4 3 4.2 2.6 4.6C2.2 5 2 5.5 2 6V18C2 18.5 2.2 19 2.6 19.4C3 19.8 3.5 20 4 20H11V19.1Z\";\nexport var mdiCreditCardEditOutline = \"M13 18.9L19.1 12.8L21.2 14.9L15.1 21H13V18.9M21.4 11.3L22.7 12.6C22.9 12.8 22.9 13.1 22.7 13.3L21.7 14.3L19.6 12.3L20.6 11.3C20.7 11.2 20.8 11.1 21 11.1C21.2 11.1 21.3 11.2 21.4 11.3M11 18H4V12H17.1L22 7.1V6C22 4.9 21.1 4 20 4H4C2.9 4 2 4.9 2 6V18C2 19.1 2.9 20 4 20H11V18M4 6H20V8H4V6Z\";\nexport var mdiCreditCardFast = \"M3 8C2.45 8 2 7.55 2 7S2.45 6 3 6H5.54C5.19 6.6 5 7.29 5 8H3M5 13H2C1.45 13 1 12.55 1 12S1.45 11 2 11H5V13M1 18C.448 18 0 17.55 0 17S.448 16 1 16H5C5 16.71 5.19 17.4 5.54 18H1M21 6H9C7.89 6 7 6.89 7 8V16C7 17.11 7.89 18 9 18H21C22.11 18 23 17.11 23 16V8C23 6.89 22.11 6 21 6M21 12H9V9H21V12Z\";\nexport var mdiCreditCardFastOutline = \"M3 8C2.45 8 2 7.55 2 7S2.45 6 3 6H5.54C5.19 6.6 5 7.29 5 8H3M5 13H2C1.45 13 1 12.55 1 12S1.45 11 2 11H5V13M1 18C.448 18 0 17.55 0 17S.448 16 1 16H5C5 16.71 5.19 17.4 5.54 18H1M21 6H9C7.89 6 7 6.89 7 8V16C7 17.11 7.89 18 9 18H21C22.11 18 23 17.11 23 16V8C23 6.89 22.11 6 21 6M21 8V9H9V8H21M9 16L9 12H21L21 16L9 16Z\";\nexport var mdiCreditCardLock = \"M21.8 15V13.5C21.8 12.1 20.4 11 19 11S16.2 12.1 16.2 13.5V15C15.6 15 15 15.6 15 16.2V19.7C15 20.4 15.6 21 16.2 21H21.7C22.4 21 23 20.4 23 19.8V16.3C23 15.6 22.4 15 21.8 15M20.5 15H17.5V13.5C17.5 12.7 18.2 12.2 19 12.2S20.5 12.7 20.5 13.5V15M13.03 20H4C2.9 20 2 19.11 2 18V6C2 4.89 2.9 4 4 4H20C21.11 4 22 4.89 22 6V10.04C21.42 9.6 20.75 9.26 20 9.11V8H4V11H15.04C14.5 11.72 14.2 12.58 14.2 13.5V13.74C13.5 14.34 13 15.24 13 16.2V19.7C13 19.8 13 19.9 13.03 20Z\";\nexport var mdiCreditCardLockOutline = \"M21.8 15V13.5C21.8 12.1 20.4 11 19 11S16.2 12.1 16.2 13.5V15C15.6 15 15 15.6 15 16.2V19.7C15 20.4 15.6 21 16.2 21H21.7C22.4 21 23 20.4 23 19.8V16.3C23 15.6 22.4 15 21.8 15M20.5 15H17.5V13.5C17.5 12.7 18.2 12.2 19 12.2S20.5 12.7 20.5 13.5V15M13 19.7V18H4V12H14.5C15.18 10.28 16.96 9 19 9C20.13 9 21.17 9.4 22 10.04V6C22 4.89 21.1 4 20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H13.03C13 19.9 13 19.8 13 19.7M4 6H20V8H4V6Z\";\nexport var mdiCreditCardMarker = \"M18.5 12C16.6 12 15 13.6 15 15.5C15 18.1 18.5 22 18.5 22S22 18.1 22 15.5C22 13.6 20.4 12 18.5 12M18.5 16.8C17.8 16.8 17.3 16.2 17.3 15.6C17.3 14.9 17.9 14.4 18.5 14.4S19.7 15 19.7 15.6C19.8 16.2 19.2 16.8 18.5 16.8M14.55 20H4C2.9 20 2 19.11 2 18V6C2 4.89 2.9 4 4 4H20C21.11 4 22 4.89 22 6V11.3C21.42 10.81 20.74 10.44 20 10.22V8H4V11H15.39C13.96 12 13 13.66 13 15.5C13 17 13.72 18.61 14.55 20Z\";\nexport var mdiCreditCardMarkerOutline = \"M13.5,18H4V12H14.3C15.3,10.8 16.8,10 18.5,10C19.8,10 21,10.5 22,11.3V6A2,2 0 0,0 20,4H4A2,2 0 0,0 2,6V18A2,2 0 0,0 4,20H14.6C14.2,19.4 13.8,18.7 13.5,18M4,6H20V8H4V6M18.5,12C16.6,12 15,13.6 15,15.5C15,18.1 18.5,22 18.5,22C18.5,22 22,18.1 22,15.5C22,13.6 20.4,12 18.5,12M18.5,16.8C17.8,16.8 17.3,16.2 17.3,15.6C17.3,14.9 17.9,14.4 18.5,14.4C19.1,14.4 19.7,15 19.7,15.6C19.8,16.2 19.2,16.8 18.5,16.8Z\";\nexport var mdiCreditCardMinus = \"M20 4H4C2.9 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H13.09C13.03 19.67 13 19.34 13 19C13 15.69 15.69 13 19 13C20.06 13 21.09 13.28 22 13.81V6C22 4.89 21.11 4 20 4M20 11H4V8H20M23 18V20H15V18H23Z\";\nexport var mdiCreditCardMinusOutline = \"M24 18V20H16V18M19 8V6H3V8H19M19 12H3V18H14V20H3C1.89 20 1 19.1 1 18V6C1 4.89 1.89 4 3 4H19C20.11 4 21 4.89 21 6V13H19V12Z\";\nexport var mdiCreditCardMultiple = \"M21 9V6H7V9H21M21 3A2 2 0 0 1 23 5V15A2 2 0 0 1 21 17H7A2 2 0 0 1 5 15V5A2 2 0 0 1 7 3H21M3 19H18V21H3A2 2 0 0 1 1 19V8H3Z\";\nexport var mdiCreditCardMultipleOutline = \"M21,8V6H7V8H21M21,16V11H7V16H21M21,4A2,2 0 0,1 23,6V16A2,2 0 0,1 21,18H7C5.89,18 5,17.1 5,16V6C5,4.89 5.89,4 7,4H21M3,20H18V22H3A2,2 0 0,1 1,20V9H3V20Z\";\nexport var mdiCreditCardOff = \"M11.2 8L7.2 4H20A2 2 0 0 1 22 6V18A1.91 1.91 0 0 1 21.88 18.68L14.2 11H20V8M20.84 22.73L18.11 20H4A2 2 0 0 1 2 18V6A2 2 0 0 1 2.65 4.54L1.11 3L2.39 1.73L22.11 21.46M9.11 11L6.11 8H4V11Z\";\nexport var mdiCreditCardOffOutline = \"M0.93,4.2L2.21,2.93L20,20.72L18.73,22L16.73,20H4C2.89,20 2,19.1 2,18V6C2,5.78 2.04,5.57 2.11,5.38L0.93,4.2M20,8V6H7.82L5.82,4H20A2,2 0 0,1 22,6V18C22,18.6 21.74,19.13 21.32,19.5L19.82,18H20V12H13.82L9.82,8H20M4,8H4.73L4,7.27V8M4,12V18H14.73L8.73,12H4Z\";\nexport var mdiCreditCardOutline = \"M20,8H4V6H20M20,18H4V12H20M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z\";\nexport var mdiCreditCardPlus = \"M20 4H4A2 2 0 0 0 2 6V18A2 2 0 0 0 4 20H13.09A5.47 5.47 0 0 1 13 19A6 6 0 0 1 19 13A5.88 5.88 0 0 1 22 13.81V6A2 2 0 0 0 20 4M20 11H4V8H20M20 15V18H23V20H20V23H18V20H15V18H18V15Z\";\nexport var mdiCreditCardPlusOutline = \"M21,18H24V20H21V23H19V20H16V18H19V15H21V18M19,8V6H3V8H19M19,12H3V18H14V20H3C1.89,20 1,19.1 1,18V6C1,4.89 1.89,4 3,4H19A2,2 0 0,1 21,6V13H19V12Z\";\nexport var mdiCreditCardRefresh = \"M20 4H4C2.9 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H11.68C11.57 19.5 11.5 19 11.5 18.5C11.5 14.91 14.41 12 18 12C19.5 12 20.9 12.53 22 13.4V6C22 4.89 21.11 4 20 4M20 11H4V8H20V11M20.83 15.67L22 14.5V18.5H18L19.77 16.73C19.32 16.28 18.69 16 18 16C16.62 16 15.5 17.12 15.5 18.5S16.62 21 18 21C18.82 21 19.54 20.61 20 20H21.71C21.12 21.47 19.68 22.5 18 22.5C15.79 22.5 14 20.71 14 18.5S15.79 14.5 18 14.5C19.11 14.5 20.11 14.95 20.83 15.67Z\";\nexport var mdiCreditCardRefreshOutline = \"M20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H11.68C11.57 19.5 11.5 19 11.5 18.5C11.5 18.33 11.5 18.17 11.53 18H4V12H20V12.32C20.74 12.56 21.41 12.93 22 13.4V6C22 4.89 21.1 4 20 4M20 8H4V6H20V8M20.83 15.67L22 14.5V18.5H18L19.77 16.73C19.32 16.28 18.69 16 18 16C16.62 16 15.5 17.12 15.5 18.5S16.62 21 18 21C18.82 21 19.54 20.61 20 20H21.71C21.12 21.47 19.68 22.5 18 22.5C15.79 22.5 14 20.71 14 18.5S15.79 14.5 18 14.5C19.11 14.5 20.11 14.95 20.83 15.67Z\";\nexport var mdiCreditCardRefund = \"M18 11H6A2 2 0 0 0 4 13V21A2 2 0 0 0 6 23H18A2 2 0 0 0 20 21V13A2 2 0 0 0 18 11M18 17H6V14H18M17 5V10H15.5V6.5H9.88L12.3 8.93L11.24 10L7 5.75L11.24 1.5L12.3 2.57L9.88 5Z\";\nexport var mdiCreditCardRefundOutline = \"M18,11H6A2,2 0 0,0 4,13V21A2,2 0 0,0 6,23H18A2,2 0 0,0 20,21V13A2,2 0 0,0 18,11M18,21H6V17H18V21M18,15H6V13H18V15M17,5V10H15.5V6.5H9.88L12.3,8.93L11.24,10L7,5.75L11.24,1.5L12.3,2.57L9.88,5H17Z\";\nexport var mdiCreditCardRemove = \"M20 4H4A2 2 0 0 0 2 6V18A2 2 0 0 0 4 20H13.09A5.47 5.47 0 0 1 13 19A6 6 0 0 1 19 13A5.88 5.88 0 0 1 22 13.81V6A2 2 0 0 0 20 4M20 11H4V8H20M22.54 16.88L20.41 19L22.54 21.12L21.12 22.54L19 20.41L16.88 22.54L15.46 21.12L17.59 19L15.46 16.88L16.88 15.46L19 17.59L21.12 15.46Z\";\nexport var mdiCreditCardRemoveOutline = \"M13 19C13 18.66 13.04 18.33 13.09 18H3V12H19V13C19.7 13 20.37 13.13 21 13.35V6C21 4.89 20.11 4 19 4H3C1.89 4 1 4.89 1 6V18C1 19.1 1.89 20 3 20H13.09C13.04 19.67 13 19.34 13 19M3 6H19V8H3V6M22.54 16.88L20.41 19L22.54 21.12L21.12 22.54L19 20.41L16.88 22.54L15.47 21.12L17.59 19L15.47 16.88L16.88 15.47L19 17.59L21.12 15.46L22.54 16.88Z\";\nexport var mdiCreditCardScan = \"M18 6H6A2 2 0 0 0 4 8V16A2 2 0 0 0 6 18H18A2 2 0 0 0 20 16V8A2 2 0 0 0 18 6M18 12H6V9H18M2 4H6V2H2A2 2 0 0 0 0 4V8H2V4M22 2H18V4H22V8H24V4A2 2 0 0 0 22 2M2 16H0V20A2 2 0 0 0 2 22H6V20H2V16M22 20H18V22H22A2 2 0 0 0 24 20V16H22V20\";\nexport var mdiCreditCardScanOutline = \"M2,4H6V2H2A2,2 0 0,0 0,4V8H2V4M22,2H18V4H22V8H24V4A2,2 0 0,0 22,2M2,16H0V20A2,2 0 0,0 2,22H6V20H2V16M22,20H18V22H22A2,2 0 0,0 24,20V16H22V20M4,8V16A2,2 0 0,0 6,18H18A2,2 0 0,0 20,16V8A2,2 0 0,0 18,6H6A2,2 0 0,0 4,8M6,16V12H18V16H6M18,8V10H6V8H18Z\";\nexport var mdiCreditCardSearch = \"M11.82 11C9.4 13.5 9.4 17.5 11.82 20H4C2.9 20 2 19.11 2 18V6C2 4.89 2.9 4 4 4H20C21.11 4 22 4.89 22 6V12.06C21.74 11.65 21.45 11.26 21.1 10.9C20.76 10.57 20.39 10.27 20 10.03V8H4V11H11.82M23.39 21L22 22.39L18.88 19.32C18.19 19.75 17.37 20 16.5 20C14 20 12 18 12 15.5S14 11 16.5 11 21 13 21 15.5C21 16.38 20.75 17.21 20.31 17.9L23.39 21M19 15.5C19 14.12 17.88 13 16.5 13S14 14.12 14 15.5 15.12 18 16.5 18 19 16.88 19 15.5Z\";\nexport var mdiCreditCardSearchOutline = \"M11.03 12C11.28 11.61 11.57 11.24 11.9 10.9C14.44 8.37 18.56 8.37 21.1 10.9C21.45 11.26 21.74 11.65 22 12.06V6C22 4.89 21.1 4 20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H11.82C11.24 19.4 10.8 18.72 10.5 18H4V12H11.03M4 6H20V8H4V6M20.31 17.9C20.75 17.21 21 16.38 21 15.5C21 13 19 11 16.5 11S12 13 12 15.5 14 20 16.5 20C17.37 20 18.19 19.75 18.88 19.32L22 22.39L23.39 21L20.31 17.9M16.5 18C15.12 18 14 16.88 14 15.5S15.12 13 16.5 13 19 14.12 19 15.5 17.88 18 16.5 18Z\";\nexport var mdiCreditCardSettings = \"M20 4H4A2 2 0 0 0 2 6V18A2 2 0 0 0 4 20H20A2 2 0 0 0 22 18V6A2 2 0 0 0 20 4M20 11H4V8H20M7 22H9V24H7V22M11 22H13V24H11V22M15 22H17V24H15Z\";\nexport var mdiCreditCardSettingsOutline = \"M20,8H4V6H20M20,18H4V12H20M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M7,22H9V24H7V22M11,22H13V24H11V22M15,22H17V24H15V22Z\";\nexport var mdiCreditCardSync = \"M13 17.5C13 18.39 13.18 19.23 13.5 20H4C2.9 20 2 19.11 2 18V6C2 4.89 2.9 4 4 4H20C21.11 4 22 4.89 22 6V11.5C21.23 11.18 20.39 11 19.5 11H20V8H4V11H19.5C15.91 11 13 13.91 13 17.5M19 20C17.62 20 16.5 18.88 16.5 17.5C16.5 17.1 16.59 16.72 16.76 16.38L15.67 15.29C15.25 15.92 15 16.68 15 17.5C15 19.71 16.79 21.5 19 21.5V23L21.25 20.75L19 18.5V20M19 13.5V12L16.75 14.25L19 16.5V15C20.38 15 21.5 16.12 21.5 17.5C21.5 17.9 21.41 18.28 21.24 18.62L22.33 19.71C22.75 19.08 23 18.32 23 17.5C23 15.29 21.21 13.5 19 13.5Z\";\nexport var mdiCreditCardSyncOutline = \"M4 18V12H16.05C17.05 11.37 18.23 11 19.5 11C20.39 11 21.23 11.18 22 11.5V6C22 4.89 21.1 4 20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H13.5C13.24 19.38 13.08 18.7 13.03 18H4M4 6H20V8H4V6M23 17.5C23 18.32 22.75 19.08 22.33 19.71L21.24 18.62C21.41 18.28 21.5 17.9 21.5 17.5C21.5 16.12 20.38 15 19 15V16.5L16.75 14.25L19 12V13.5C21.21 13.5 23 15.29 23 17.5M19 18.5L21.25 20.75L19 23V21.5C16.79 21.5 15 19.71 15 17.5C15 16.68 15.25 15.92 15.67 15.29L16.76 16.38C16.59 16.72 16.5 17.1 16.5 17.5C16.5 18.88 17.62 20 19 20V18.5Z\";\nexport var mdiCreditCardWireless = \"M4.93 4.92L6.34 6.33C9.46 3.2 14.53 3.2 17.66 6.33L19.07 4.92C15.17 1 8.84 1 4.93 4.92M7.76 7.75L9.17 9.16C10.73 7.6 13.26 7.6 14.83 9.16L16.24 7.75C13.9 5.41 10.1 5.41 7.76 7.75M18 11H6C4.89 11 4 11.9 4 13V21C4 22.11 4.89 23 6 23H18C19.11 23 20 22.11 20 21V13C20 11.9 19.11 11 18 11M18 17H6V14H18V17Z\";\nexport var mdiCreditCardWirelessOff = \"M12 2C9.85 2 7.7 2.69 5.9 4.08L7.32 5.5C10.45 3.24 14.84 3.5 17.66 6.33L19.07 4.92C17.12 2.96 14.56 2 12 2M3.28 4L2 5.27L7.73 11H6C4.89 11 4 11.9 4 13V21C4 22.11 4.89 23 6 23H18C18.5 23 18.92 22.82 19.27 22.54L19.73 23L21 21.72M12 6C10.87 6 9.75 6.31 8.77 6.94L10.24 8.41C11.73 7.68 13.58 7.92 14.83 9.16L16.24 7.75C15.07 6.58 13.54 6 12 6M12.82 11L15.82 14H18V16.18L20 18.18V13C20 11.9 19.11 11 18 11M6 14H10.73L13.73 17H6Z\";\nexport var mdiCreditCardWirelessOffOutline = \"M12 2C9.85 2 7.7 2.69 5.9 4.08L7.32 5.5C10.45 3.24 14.84 3.5 17.66 6.33L19.07 4.92C17.12 2.96 14.56 2 12 2M3.28 4L2 5.27L7.73 11H6C4.89 11 4 11.9 4 13V21C4 22.11 4.89 23 6 23H18C18.47 23 18.92 22.84 19.27 22.54L19.73 23L21 21.72M12 6C10.87 6 9.75 6.31 8.77 6.94L10.24 8.41C11.73 7.68 13.58 7.92 14.83 9.16L16.24 7.75C15.07 6.58 13.54 6 12 6M12.82 11L14.82 13H18V15H16.82L20 18.18V13C20 11.9 19.11 11 18 11M6 13H9.73L11.73 15H6M6 17H13.73L17.73 21H6Z\";\nexport var mdiCreditCardWirelessOutline = \"M18,11H6A2,2 0 0,0 4,13V21A2,2 0 0,0 6,23H18A2,2 0 0,0 20,21V13A2,2 0 0,0 18,11M18,21H6V17H18V21M18,15H6V13H18V15M4.93,4.92L6.34,6.33C9.46,3.2 14.53,3.2 17.66,6.33L19.07,4.92C15.17,1 8.84,1 4.93,4.92M7.76,7.75L9.17,9.16C10.73,7.6 13.26,7.6 14.83,9.16L16.24,7.75C13.9,5.41 10.1,5.41 7.76,7.75Z\";\nexport var mdiCricket = \"M14.34,17.77L15.75,16.36L20,20.58L18.56,22L14.34,17.77M18.5,2A3.5,3.5 0 0,1 22,5.5A3.5,3.5 0 0,1 18.5,9A3.5,3.5 0 0,1 15,5.5A3.5,3.5 0 0,1 18.5,2M2.24,7.11L5.07,4.28C5.46,3.89 6.09,3.89 6.5,4.28L14.97,12.77C15.36,13.16 15.36,13.79 14.97,14.18L12.14,17C11.75,17.4 11.12,17.4 10.72,17L2.24,8.53C1.85,8.13 1.85,7.5 2.24,7.11Z\";\nexport var mdiCrop = \"M7,17V1H5V5H1V7H5V17A2,2 0 0,0 7,19H17V23H19V19H23V17M17,15H19V7C19,5.89 18.1,5 17,5H9V7H17V15Z\";\nexport var mdiCropFree = \"M19,3H15V5H19V9H21V5C21,3.89 20.1,3 19,3M19,19H15V21H19A2,2 0 0,0 21,19V15H19M5,15H3V19A2,2 0 0,0 5,21H9V19H5M3,5V9H5V5H9V3H5A2,2 0 0,0 3,5Z\";\nexport var mdiCropLandscape = \"M19,17H5V7H19M19,5H5A2,2 0 0,0 3,7V17A2,2 0 0,0 5,19H19A2,2 0 0,0 21,17V7C21,5.89 20.1,5 19,5Z\";\nexport var mdiCropPortrait = \"M17,19H7V5H17M17,3H7A2,2 0 0,0 5,5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V5C19,3.89 18.1,3 17,3Z\";\nexport var mdiCropRotate = \"M7.47,21.5C4.2,19.93 1.86,16.76 1.5,13H0C0.5,19.16 5.66,24 11.95,24C12.18,24 12.39,24 12.61,23.97L8.8,20.15L7.47,21.5M12.05,0C11.82,0 11.61,0 11.39,0.04L15.2,3.85L16.53,2.5C19.8,4.07 22.14,7.24 22.5,11H24C23.5,4.84 18.34,0 12.05,0M16,14H18V8C18,6.89 17.1,6 16,6H10V8H16V14M8,16V4H6V6H4V8H6V16A2,2 0 0,0 8,18H16V20H18V18H20V16H8Z\";\nexport var mdiCropSquare = \"M18,18H6V6H18M18,4H6A2,2 0 0,0 4,6V18A2,2 0 0,0 6,20H18A2,2 0 0,0 20,18V6C20,4.89 19.1,4 18,4Z\";\nexport var mdiCross = \"M10.5,2H13.5V8H19V11H13.5V22H10.5V11H5V8H10.5V2Z\";\nexport var mdiCrossBolnisi = \"M22,7L21.5,6.5C19.93,8 18.47,9.4 16.93,10.18C15.5,10.91 14.44,10.91 13,11C13.09,9.56 13.09,8.5 13.82,7.07C14.6,5.53 16,4.07 17.5,2.5L17,2C15.32,3.23 13.64,3.83 12,3.83C10.36,3.83 8.68,3.23 7,2L6.5,2.5C8,4.07 9.4,5.53 10.18,7.07C10.91,8.5 10.91,9.56 11,11C9.56,10.91 8.5,10.91 7.07,10.18C5.53,9.4 4.06,8 2.5,6.5L2,7C3.23,8.68 3.83,10.36 3.83,12C3.83,13.64 3.23,15.32 2,17L2.5,17.5C4.07,16 5.53,14.6 7.07,13.82C8.5,13.09 9.56,13.09 11,13C10.91,14.44 10.91,15.5 10.18,16.93C9.4,18.47 8,19.93 6.5,21.5L7,22C8.68,20.77 10.36,20.17 12,20.17C13.64,20.17 15.32,20.77 17,22L17.5,21.5C16,19.93 14.6,18.47 13.82,16.93C13.09,15.5 13.09,14.44 13,13C14.44,13.09 15.5,13.09 16.93,13.82C18.47,14.6 19.93,16 21.5,17.5L22,17C20.77,15.32 20.17,13.64 20.17,12C20.17,10.36 20.77,8.68 22,7Z\";\nexport var mdiCrossCeltic = \"M17.8,8C17.26,5.89 15.61,4.24 13.5,3.7V2H10.5V3.7C8.39,4.24 6.74,5.89 6.2,8H4V11H6.2C6.74,13.11 8.39,14.76 10.5,15.3V22H13.5V15.3C15.61,14.76 17.26,13.11 17.8,11H19.97V8H17.8M12.04,9.53L14.5,11H15.76C15.35,12.03 14.53,12.84 13.5,13.26V12L12.06,9.56L12,9.5L11.94,9.56L10.5,12V13.26C9.47,12.84 8.66,12.03 8.24,11H9.5L11.96,9.53L12,9.5H11.96L9.5,8H8.24C8.65,6.97 9.47,6.16 10.5,5.74V7L11.94,9.44L12,9.5L12.06,9.44L13.5,7V5.74C14.53,6.16 15.35,6.97 15.76,8H14.5L12.04,9.5H12L12.04,9.53Z\";\nexport var mdiCrossOutline = \"M15.5,6V1H8.5V6H3V13H8.5V23H15.5V13H21V6H15.5M19,11H13.5V21H10.5V11H5V8H10.5V3H13.5V8H19V11Z\";\nexport var mdiCrosshairs = \"M3.05,13H1V11H3.05C3.5,6.83 6.83,3.5 11,3.05V1H13V3.05C17.17,3.5 20.5,6.83 20.95,11H23V13H20.95C20.5,17.17 17.17,20.5 13,20.95V23H11V20.95C6.83,20.5 3.5,17.17 3.05,13M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z\";\nexport var mdiCrosshairsGps = \"M12,8A4,4 0 0,1 16,12A4,4 0 0,1 12,16A4,4 0 0,1 8,12A4,4 0 0,1 12,8M3.05,13H1V11H3.05C3.5,6.83 6.83,3.5 11,3.05V1H13V3.05C17.17,3.5 20.5,6.83 20.95,11H23V13H20.95C20.5,17.17 17.17,20.5 13,20.95V23H11V20.95C6.83,20.5 3.5,17.17 3.05,13M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z\";\nexport var mdiCrosshairsOff = \"M20.94 11C20.5 6.83 17.17 3.5 13 3.06V1H11V3.06C9.87 3.18 8.81 3.5 7.84 4.03L9.34 5.53C10.16 5.19 11.06 5 12 5C15.87 5 19 8.13 19 12C19 12.94 18.81 13.84 18.5 14.65L20 16.15C20.5 15.19 20.82 14.13 20.95 13H23V11H20.94M3 4.27L5.04 6.31C3.97 7.62 3.25 9.23 3.06 11H1V13H3.06C3.5 17.17 6.83 20.5 11 20.94V23H13V20.94C14.77 20.74 16.38 20.03 17.69 18.96L19.73 21L21 19.73L4.27 3L3 4.27M16.27 17.54C15.09 18.45 13.61 19 12 19C8.13 19 5 15.87 5 12C5 10.39 5.55 8.91 6.46 7.73L16.27 17.54Z\";\nexport var mdiCrosshairsQuestion = \"M3.05 13H1V11H3.05C3.5 6.83 6.83 3.5 11 3.05V1H13V3.05C17.17 3.5 20.5 6.83 20.95 11H23V13H20.95C20.5 17.17 17.17 20.5 13 20.95V23H11V20.95C6.83 20.5 3.5 17.17 3.05 13M12 5C8.13 5 5 8.13 5 12S8.13 19 12 19 19 15.87 19 12 15.87 5 12 5M11.13 17.25H12.88V15.5H11.13V17.25M12 6.75C10.07 6.75 8.5 8.32 8.5 10.25H10.25C10.25 9.28 11.03 8.5 12 8.5S13.75 9.28 13.75 10.25C13.75 12 11.13 11.78 11.13 14.63H12.88C12.88 12.66 15.5 12.44 15.5 10.25C15.5 8.32 13.93 6.75 12 6.75Z\";\nexport var mdiCrowd = \"M3.69 9.12C3.5 8.93 3.29 8.84 3.04 8.84C2.63 8.84 2.32 9.03 2.12 9.42S1.97 10.18 2.29 10.53C3.47 11.59 4.22 12.34 4.54 12.78C4.95 13.34 5.15 14.16 5.15 15.22C5.15 16.53 5.65 17.5 6.65 18.17C7.21 18.61 7.82 18.94 8.5 19.16L8.5 15.27C8.5 14.33 8.17 13.55 7.54 12.92M16.46 12.97C15.84 13.59 15.5 14.36 15.5 15.27L15.5 19.2C16.46 18.86 17.26 18.33 17.92 17.63C18.57 16.93 18.9 16.16 18.9 15.22C18.9 14.09 19.09 13.28 19.47 12.78C19.56 12.62 19.73 12.42 20 12.17C20.23 11.92 20.47 11.68 20.71 11.46C20.94 11.25 21.17 11.03 21.39 10.81L21.72 10.53C21.91 10.34 22 10.12 22 9.87C22 9.59 21.91 9.34 21.72 9.14C21.53 8.94 21.3 8.84 21 8.84S20.5 8.93 20.31 9.12M12 20C12.69 20 13.36 19.91 14 19.72L14 16.15C14 15.56 13.82 15.1 13.41 14.66C13 14.22 12.53 14 12 14C11.47 14 11 14.2 10.62 14.61C10.22 15 10 15.46 10 16.06L10 19.72C10.64 19.91 11.31 20 12 20M9 8.5C9 9.33 8.33 10 7.5 10S6 9.33 6 8.5 6.67 7 7.5 7 9 7.67 9 8.5M18 8.5C18 9.33 17.33 10 16.5 10C15.67 10 15 9.33 15 8.5S15.67 7 16.5 7C17.33 7 18 7.67 18 8.5M13.5 5.5C13.5 6.33 12.83 7 12 7S10.5 6.33 10.5 5.5 11.17 4 12 4 13.5 4.67 13.5 5.5M13.5 11C13.5 11.83 12.83 12.5 12 12.5S10.5 11.83 10.5 11 11.17 9.5 12 9.5 13.5 10.17 13.5 11Z\";\nexport var mdiCrown = \"M5 16L3 5L8.5 10L12 4L15.5 10L21 5L19 16H5M19 19C19 19.6 18.6 20 18 20H6C5.4 20 5 19.6 5 19V18H19V19Z\";\nexport var mdiCrownCircle = \"M12 2C6.47 2 2 6.5 2 12C2 17.5 6.5 22 12 22S22 17.5 22 12 17.5 2 12 2M16 15.44C16 15.78 15.78 16 15.44 16H8.56C8.22 16 8 15.78 8 15.44V15H16V15.44M16 14H8L7 8L10 10L12 7L14 10L17 8L16 14Z\";\nexport var mdiCrownCircleOutline = \"M12 2C6.47 2 2 6.5 2 12C2 17.5 6.5 22 12 22S22 17.5 22 12 17.5 2 12 2M12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4S20 7.58 20 12C20 16.42 16.42 20 12 20M8 14L7 8L10 10L12 7L14 10L17 8L16 14H8M8.56 16C8.22 16 8 15.78 8 15.44V15H16V15.44C16 15.78 15.78 16 15.44 16H8.56Z\";\nexport var mdiCrownOutline = \"M12 8L15 13.2L18 10.5L17.3 14H6.7L6 10.5L9 13.2L12 8M12 4L8.5 10L3 5L5 16H19L21 5L15.5 10L12 4M19 18H5V19C5 19.6 5.4 20 6 20H18C18.6 20 19 19.6 19 19V18Z\";\nexport var mdiCryengine = \"M23.03,12.4M23.03,12.5V12.5C23,13 20.91,15.23 17.82,16.24C14.05,17.5 7.97,17.03 7.97,12.3C7.97,10.08 9.78,8.27 12,8.27C14.25,8.27 16.05,10.09 16.05,12.31C16.05,13.39 15.58,14.44 14.87,15.18C15.54,15.17 17.94,15 20.21,13.12C20.46,12.88 20.62,12.68 20.69,12.55C20.71,12.5 20.74,12.46 20.73,12.4C20.73,11.92 18.12,8.19 12.72,7.12C19.22,7.46 23,11.32 23.03,12.4V12.5H23.03M12,10C10.74,10 9.71,11.04 9.71,12.3C9.71,13.57 10.74,14.59 12,14.59C13.27,14.59 14.29,13.57 14.29,12.3C14.29,11.04 13.27,10 12,10M3.31,12.34C3.31,12.34 3.31,12.31 3.31,12.42V12.42C3.41,12.94 4.82,15.41 10.28,16.88C3.96,16.37 1.12,13.28 1.04,12.42H1.03C1.03,12.31 1.03,12.36 1.03,12.35C1.03,11.5 4.96,7.58 10.92,7.15C6.14,8.26 3.31,11.87 3.31,12.34V12.34Z\";\nexport var mdiCrystalBall = \"M9.38,8.38L11.5,9.34L13.62,8.38L12.66,10.5L13.62,12.62L11.5,11.66L9.38,12.62L10.34,10.5L9.38,8.38M16.5,2.5L17.59,5.41L20.5,6.5L17.59,7.59L16.5,10.5L15.41,7.59L12.5,6.5L15.41,5.41L16.5,2.5M6,19H7V18A1,1 0 0,1 8,17H8.26C6,15.7 4.5,13.28 4.5,10.5A7.5,7.5 0 0,1 12,3C13.05,3 14.05,3.22 14.96,3.61L14.59,4.59L13.17,5.12C12.79,5.04 12.4,5 12,5A5.5,5.5 0 0,0 6.5,10.5A5.5,5.5 0 0,0 12,16C14.91,16 17.3,13.73 17.5,10.87L18.41,8.41L19.12,8.14C19.37,8.88 19.5,9.68 19.5,10.5C19.5,13.28 18,15.7 15.74,17H16A1,1 0 0,1 17,18V19H18A2,2 0 0,1 20,21V22H4V21A2,2 0 0,1 6,19Z\";\nexport var mdiCube = \"M21,16.5C21,16.88 20.79,17.21 20.47,17.38L12.57,21.82C12.41,21.94 12.21,22 12,22C11.79,22 11.59,21.94 11.43,21.82L3.53,17.38C3.21,17.21 3,16.88 3,16.5V7.5C3,7.12 3.21,6.79 3.53,6.62L11.43,2.18C11.59,2.06 11.79,2 12,2C12.21,2 12.41,2.06 12.57,2.18L20.47,6.62C20.79,6.79 21,7.12 21,7.5V16.5M12,4.15L6.04,7.5L12,10.85L17.96,7.5L12,4.15Z\";\nexport var mdiCubeOff = \"M20.84 22.73L17.28 19.17L12.57 21.82C12.41 21.94 12.21 22 12 22S11.59 21.94 11.43 21.82L3.53 17.38C3.21 17.21 3 16.88 3 16.5V7.5C3 7.12 3.21 6.79 3.53 6.62L4.3 6.19L1.11 3L2.39 1.73L22.11 21.46L20.84 22.73M12 4.15L17.96 7.5L13.31 10.11L20.53 17.33C20.82 17.16 21 16.85 21 16.5V7.5C21 7.12 20.79 6.79 20.47 6.62L12.57 2.18C12.41 2.06 12.21 2 12 2S11.59 2.06 11.43 2.18L7.56 4.36L9 5.82L12 4.15Z\";\nexport var mdiCubeOffOutline = \"M22.11 21.46L2.39 1.73L1.11 3L4.3 6.19L3.53 6.62C3.21 6.79 3 7.12 3 7.5V16.5C3 16.88 3.21 17.21 3.53 17.38L11.43 21.82C11.59 21.94 11.79 22 12 22S12.41 21.94 12.57 21.82L17.28 19.17L20.84 22.73L22.11 21.46M5 15.91V9.21L10.29 12.18L11 12.89V19.29L5 15.91M13 19.29V14.89L15.82 17.7L13 19.29M9 5.82L7.56 4.36L11.43 2.18C11.59 2.06 11.79 2 12 2S12.41 2.06 12.57 2.18L20.47 6.62C20.79 6.79 21 7.12 21 7.5V16.5C21 16.85 20.82 17.16 20.53 17.33L19 15.8V9.21L14.78 11.58L13.31 10.11L17.96 7.5L12 4.15L9 5.82Z\";\nexport var mdiCubeOutline = \"M21,16.5C21,16.88 20.79,17.21 20.47,17.38L12.57,21.82C12.41,21.94 12.21,22 12,22C11.79,22 11.59,21.94 11.43,21.82L3.53,17.38C3.21,17.21 3,16.88 3,16.5V7.5C3,7.12 3.21,6.79 3.53,6.62L11.43,2.18C11.59,2.06 11.79,2 12,2C12.21,2 12.41,2.06 12.57,2.18L20.47,6.62C20.79,6.79 21,7.12 21,7.5V16.5M12,4.15L6.04,7.5L12,10.85L17.96,7.5L12,4.15M5,15.91L11,19.29V12.58L5,9.21V15.91M19,15.91V9.21L13,12.58V19.29L19,15.91Z\";\nexport var mdiCubeScan = \"M17,22V20H20V17H22V20.5C22,20.89 21.84,21.24 21.54,21.54C21.24,21.84 20.89,22 20.5,22H17M7,22H3.5C3.11,22 2.76,21.84 2.46,21.54C2.16,21.24 2,20.89 2,20.5V17H4V20H7V22M17,2H20.5C20.89,2 21.24,2.16 21.54,2.46C21.84,2.76 22,3.11 22,3.5V7H20V4H17V2M7,2V4H4V7H2V3.5C2,3.11 2.16,2.76 2.46,2.46C2.76,2.16 3.11,2 3.5,2H7M13,17.25L17,14.95V10.36L13,12.66V17.25M12,10.92L16,8.63L12,6.28L8,8.63L12,10.92M7,14.95L11,17.25V12.66L7,10.36V14.95M18.23,7.59C18.73,7.91 19,8.34 19,8.91V15.23C19,15.8 18.73,16.23 18.23,16.55L12.75,19.73C12.25,20.05 11.75,20.05 11.25,19.73L5.77,16.55C5.27,16.23 5,15.8 5,15.23V8.91C5,8.34 5.27,7.91 5.77,7.59L11.25,4.41C11.5,4.28 11.75,4.22 12,4.22C12.25,4.22 12.5,4.28 12.75,4.41L18.23,7.59Z\";\nexport var mdiCubeSend = \"M16,4L9,8.04V15.96L16,20L23,15.96V8.04M16,6.31L19.8,8.5L16,10.69L12.21,8.5M0,7V9H7V7M11,10.11L15,12.42V17.11L11,14.81M21,10.11V14.81L17,17.11V12.42M2,11V13H7V11M4,15V17H7V15\";\nexport var mdiCubeUnfolded = \"M6,9V4H13V9H23V16H18V21H11V16H1V9H6M16,16H13V19H16V16M8,9H11V6H8V9M6,14V11H3V14H6M18,11V14H21V11H18M13,11V14H16V11H13M8,11V14H11V11H8Z\";\nexport var mdiCup = \"M18.32,8H5.67L5.23,4H18.77M3,2L5,20.23C5.13,21.23 5.97,22 7,22H17C18,22 18.87,21.23 19,20.23L21,2H3Z\";\nexport var mdiCupOff = \"M1,4.27L2.28,3L21,21.72L19.73,23L18.27,21.54C17.93,21.83 17.5,22 17,22H7C5.97,22 5.13,21.23 5,20.23L3.53,6.8L1,4.27M18.32,8L18.77,4H5.82L3.82,2H21L19.29,17.47L9.82,8H18.32Z\";\nexport var mdiCupOffOutline = \"M3.83 2L5.83 4H18.78L17.5 15.66L19.3 17.5L21 2M2.27 3L1 4.27L3.53 6.8L5 20.23C5.13 21.23 5.97 22 7 22H17C17.47 22 17.91 21.82 18.26 21.54L19.73 23L21 21.73M5.78 9.06L16.73 20H7Z\";\nexport var mdiCupOutline = \"M3 2L5 20.23C5.13 21.23 5.97 22 7 22H17C18 22 18.87 21.23 19 20.23L21 2H3M5.22 4H18.78L17 20H7L5.22 4Z\";\nexport var mdiCupWater = \"M18.32,8H5.67L5.23,4H18.77M12,19A3,3 0 0,1 9,16C9,14 12,10.6 12,10.6C12,10.6 15,14 15,16A3,3 0 0,1 12,19M3,2L5,20.23C5.13,21.23 5.97,22 7,22H17C18,22 18.87,21.23 19,20.23L21,2H3Z\";\nexport var mdiCupboard = \"M17 2H7C5.9 2 5 2.9 5 4V19C5 20.11 5.9 21 7 21V22H9V21H15V22H17V21C18.11 21 19 20.11 19 19V4C19 2.9 18.11 2 17 2M10 18H8V15H10V18M16 18H14V15H16V18M17 12H7V9H17V12M17 7H7V4H17V7Z\";\nexport var mdiCupboardOutline = \"M7 2C5.9 2 5 2.9 5 4V19C5 20.11 5.9 21 7 21V22H9V21H15V22H17V21C18.11 21 19 20.11 19 19V4C19 2.9 18.11 2 17 2H7M7 4H17V7H7V4M7 9H17V12H7V9M7 14H11V19H7V14M13 14H17V19H13V14M8 15V18H10V15H8M14 15V18H16V15H14Z\";\nexport var mdiCupcake = \"M12,1.5A2.5,2.5 0 0,1 14.5,4A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 9.5,4A2.5,2.5 0 0,1 12,1.5M15.87,5C18,5 20,7 20,9C22.7,9 22.7,13 20,13H4C1 FileName: ./js/FilesSettings-DtyBZzBY.chunk.mjs SPDXID: SPDXRef-19ca6e9e8c91e7dc4d6f77436637302e FileChecksum: SHA1: 88544cd264a9803ad8ab6030e2cb48aae98d2f1f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/FilesSettings-DtyBZzBY.chunk.mjs.map SPDXID: SPDXRef-c711bc61d97394346dc634eae3f882ac FileChecksum: SHA1: e60868b60be30fd8d4d085526fd3fbae43098224 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n"],"names":["_sfc_main","NcCheckboxRadioSwitch","enabled","emit","axios","generateUrl","t","_hoisted_1","_openBlock","_createElementBlock","_createVNode","_component_NcCheckboxRadioSwitch","$data","$event","$options"],"mappings":"sRAmBA,MAAKA,EAAU,CACd,KAAM,gBACN,WAAY,CACX,sBAAAC,GAGD,MAAO,CACN,MAAO,CACN,cAAe,IAAI,KAAK,oBACzB,CACD,EAEA,QAAS,CACR,OAAOC,EAAS,CAEfC,EAAKD,EAAU,0BAA4B,yBAAyB,EACpEE,EAAM,KAAKC,EAAY,qBAAqB,EAAG,CAC9C,IAAK,oBACL,MAAOH,EAAU,IAAM,IACvB,CACF,IAEAI,EAEF,EAtCMC,EAAA,CAAA,GAAG,6BAA6B,6DAArC,OAAAC,EAAA,EAAAC,EAIM,MAJNF,EAIM,CAHLG,EAEwBC,EAAA,YAFQC,EAAA,oDAAAA,EAAA,cAAaC,GAAsBC,EAAA,oBAClE,IAA0C,KAAvCA,EAAA,EAAC,OAAA,yBAAA,CAAA,EAAA,CAAA" SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/MarkdownContentEditor-Dz8hVnd0.chunk.mjs SPDXID: SPDXRef-70718e4f37930e2512cf36421f8d09f4 FileChecksum: SHA1: 53672c8e0e4de39fba885099ba0ec72baf155e04 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/MarkdownContentEditor-Dz8hVnd0.chunk.mjs.map SPDXID: SPDXRef-95fae741e4128503029d47f4181d7b37 FileChecksum: SHA1: 9c093dccb7d408d03b5c4fefaca58bde030cbae6 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n"],"names":["_sfc_main","ContentContainer","ReadonlyBar","MenuBar","MainContainer","EditorWrapper","props","openLinkHandler","useOpenLinkHandler","extensions","RichText","UndoRedo","FocusTrap","editor","markRaw","Editor","setEditable","setContent","useEditorMethods","updateHeadings","provideEditorHeadings","watch","content","readOnly","provide","editorFlagsKey","provideEditor","applyEditorWidth","provideEditorWidth","attachmentResolver","shallowRef","ATTACHMENT_RESOLVER","markdown","createMarkdownSerializer","AttachmentResolver","getCurrentUser","_createBlock","_component_EditorWrapper","_createVNode","_component_MainContainer","$props","_createElementBlock","_Fragment","_renderSlot","_ctx","_component_ReadonlyBar","_component_MenuBar","_component_ContentContainer"],"mappings":"4cAwCA,MAAKA,EAAU,CACd,KAAM,wBACN,WAAY,CAAE,iBAAAC,EAAkB,YAAAC,EAAa,QAAAC,EAAS,cAAAC,EAAe,cAAAC,GAErE,MAAO,CACN,OAAQ,CACP,KAAM,OACN,QAAS,MAGV,QAAS,CACR,KAAM,OACN,SAAU,IAGX,SAAU,CACT,KAAM,SAGP,aAAc,CACb,KAAM,OACN,QAAS,IAGV,WAAY,CACX,KAAM,OACN,QAAS,MAGV,YAAa,CACZ,KAAM,SAGP,aAAc,CACb,KAAM,QACN,QAAS,KAIX,MAAO,CAAC,QAAS,gBAAgB,EAEjC,MAAMC,EAAO,CACZ,KAAM,CAAE,gBAAAC,CAAc,EAAMC,EAAkB,EACxCC,EAAa,CAClBC,EAAS,UAAU,CAClB,WAAY,CAACC,CAAQ,EACrB,SAAUJ,EAAgB,SAC1B,aAAcD,EAAM,YACrB,CAAC,EACDM,CACD,EACMC,EAASC,EAAQ,IAAIC,EAAO,CAAE,WAAAN,CAAS,CAAG,CAAC,EAE3C,CAAE,YAAAO,EAAa,WAAAC,CAAS,EAAMC,EAAiBL,CAAM,EACrD,CAAE,eAAAM,GAAmBC,EAAsBP,CAAM,EACvDQ,EACC,IAAMf,EAAM,QACXgB,GAAY,CACZL,EAAWK,CAAO,CACnB,CACD,EAEAN,EAAY,CAACV,EAAM,QAAQ,EAC3Be,EACC,IAAMf,EAAM,SACXiB,GAAa,CACbP,EAAY,CAACO,CAAQ,CACtB,CACD,EAEAC,EAAQC,EAAgB,CACvB,SAAU,GACV,aAAc,GACd,gBAAiB,GACjB,mBAAoB,GACpB,EACDC,EAAcb,CAAM,EAEpB,KAAM,CAAE,iBAAAc,GAAqBC,EAAmB,EAAI,EACpDD,EAAgB,EAEhB,MAAME,EAAqBC,EAAW,IAAI,EAC1C,OAAAN,EAAQO,EAAqBF,CAAkB,EAExC,CAAE,mBAAAA,EAAoB,OAAAhB,EAAQ,WAAAI,EAAY,eAAAE,CAAa,CAC/D,EAEA,SAAU,CAIT,KAAK,WAAW,KAAK,QAAS,CAAE,aAAc,EAAI,CAAG,EACrD,KAAK,eAAc,EACnB,KAAK,OAAO,GAAG,SAAU,IAAM,CAC9B,KAAK,MAAM,OAAO,CACnB,CAAC,EACD,KAAK,OAAO,GAAG,SAAU,CAAC,CAAE,OAAAN,CAAK,IAAQ,CACxC,MAAMmB,EAAWC,EAAyBpB,EAAO,MAAM,EAAE,UAAUA,EAAO,MAAM,GAAG,EACnF,KAAK,MAAM,iBAAkB,CAC5B,KAAMA,EAAO,MAAM,IACnB,SAAAmB,EACA,CACF,CAAC,EACG,KAAK,SACR,KAAK,mBAAqB,IAAIE,EAAmB,CAChD,iBAAkB,KAAK,cAAc,MAAM,MAAM,EACjD,KAAMC,EAAc,EACpB,WAAY,KAAK,WACjB,OAAQ,KAAK,OACb,EAEH,EAEA,eAAgB,CACf,KAAK,OAAO,QAAO,CACpB,CACD,+IAtJCC,EAUgBC,EAAA,CAVD,cAAA,IAAa,WAC3B,IAQgB,CARhBC,EAQgBC,EAAA,KAAA,WAPf,IAKW,CALMC,EAAA,0BAAjBC,EAKWC,EAAA,CAAA,IAAA,CAAA,EAAA,CAJMF,EAAA,SAChBG,EAEOC,+BAFP,IAEO,CADNN,EAAeO,CAAA,SAFhBT,EAA8CU,EAAA,OAAnB,SAAU,YAKtCR,EAAyCS,EAAA,CAAtB,SAAUP,EAAA,QAAQ,EAAA,KAAA,EAAA,CAAA,UAAA,CAAA" FileName: ./js/MarkdownContentEditorApp-VjLrJcTx.chunk.mjs SPDXID: SPDXRef-e19683f3cca2841fce00ded0f41dacf4 FileChecksum: SHA1: 1a159fdf22df52363a2a092ed88e72b35705c020 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/MarkdownContentEditorApp-VjLrJcTx.chunk.mjs.map SPDXID: SPDXRef-3a6898f199395f70a00d4a8d4e2c19b9 FileChecksum: SHA1: 5513f03e4346174940a34b19b4739b8b724003e9 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n"],"names":["emit","__emit","editorContainer","useTemplateRef","__expose","_createBlock","MarkdownContentEditor","__props","_cache","c","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps"],"mappings":"uiCAgDA,MAAMA,EAAOC,EAMPC,EAAkBC,EAAe,kBAAkB,EACzD,OAAAC,EAAa,CAAE,gBAAAF,EAAiB,cAjD/BG,EAcwBC,EAAA,CAbvB,IAAI,mBACH,QAAAC,EAAA,QACA,OAAAA,EAAA,OACA,aAAAA,EAAA,aACA,SAAAA,EAAA,SACA,aAAcA,EAAA,SACd,WAAAA,EAAA,WACA,uBAAOP,EAAI,OAAA,GACX,mBAAcQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGC,GAA4BT,mBAAuBS,CAAC,GACrE,mBAAcD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGC,GAA4BT,mBAAuBS,CAAC,EAAA,WACtDF,EAAA,2BAAuB,mBACtC,IAAkE,MAAlEF,EAAkEK,EAAlDH,EAAA,oBAAoB,EAAAI,EAAAC,EAAUL,EAAA,gBAAgB,CAAA,EAAA,KAAA,EAAA,EAAA" FileName: ./js/NcCheckboxRadioSwitch-DVdt5Hkq-CrRfUIIU.chunk.mjs SPDXID: SPDXRef-4068f0356d58cf72cd1888d306a31df6 FileChecksum: SHA1: 6ac151a5a47c88b3b13ad619bb2bcc5a70be4af0 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors FileName: ./js/NcCheckboxRadioSwitch-DVdt5Hkq-CrRfUIIU.chunk.mjs.map SPDXID: SPDXRef-aabfbd70ee999337dd13acca6c97b963 FileChecksum: SHA1: 532bcb559815505c40f307b9cf5a1e9310fa104e LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2025, 1032 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst INSIDE_RADIO_GROUP_KEY = /* @__PURE__ */ Symbol.for(\"insideRadioGroup\");\nfunction useInsideRadioGroup() {\n return inject(INSIDE_RADIO_GROUP_KEY, void 0);\n}\nexport {\n INSIDE_RADIO_GROUP_KEY as I,\n useInsideRadioGroup as u\n};\n//# sourceMappingURL=useNcRadioGroup-D6llQmAl.mjs.map\n","import '../assets/NcCheckboxRadioSwitch-BlQSZVW0.css';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode, toDisplayString, createCommentVNode, resolveComponent, normalizeClass, renderSlot, createBlock, resolveDynamicComponent, toHandlers, withCtx, createVNode, createSlots, createTextVNode, onMounted, computed, useCssVars } from \"vue\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { N as NcIconToggleSwitch } from \"./NcIconToggleSwitch-CRvGt4su.mjs\";\nimport { N as NcLoadingIcon } from \"./NcLoadingIcon-BOVpFVQz.mjs\";\nimport { r as register, K as n, a as t } from \"./_l10n-wdIzZwir.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { u as useInsideRadioGroup } from \"./useNcRadioGroup-D6llQmAl.mjs\";\nconst _sfc_main$6 = {\n name: \"CheckboxBlankOutlineIcon\",\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};\nconst _hoisted_1$6 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$5 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$5 = { d: \"M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3M19,5V19H5V5H19Z\" };\nconst _hoisted_4$4 = { key: 0 };\nfunction _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon checkbox-blank-outline-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$5, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$4, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$5))\n ], 16, _hoisted_1$6);\n}\nconst CheckboxBlankOutline = /* @__PURE__ */ _export_sfc(_sfc_main$6, [[\"render\", _sfc_render$6]]);\nconst _sfc_main$5 = {\n name: \"CheckboxMarkedIcon\",\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};\nconst _hoisted_1$5 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$4 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$4 = { d: \"M10,17L5,12L6.41,10.58L10,14.17L17.59,6.58L19,8M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z\" };\nconst _hoisted_4$3 = { key: 0 };\nfunction _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon checkbox-marked-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$4, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$3, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$4))\n ], 16, _hoisted_1$5);\n}\nconst CheckboxMarked = /* @__PURE__ */ _export_sfc(_sfc_main$5, [[\"render\", _sfc_render$5]]);\nconst _sfc_main$4 = {\n name: \"MinusBoxIcon\",\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};\nconst _hoisted_1$4 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$3 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$3 = { d: \"M17,13H7V11H17M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z\" };\nconst _hoisted_4$2 = { key: 0 };\nfunction _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon minus-box-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$3, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$2, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$3))\n ], 16, _hoisted_1$4);\n}\nconst MinusBox = /* @__PURE__ */ _export_sfc(_sfc_main$4, [[\"render\", _sfc_render$4]]);\nconst _sfc_main$3 = {\n name: \"RadioboxBlankIcon\",\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};\nconst _hoisted_1$3 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$2 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$2 = { d: \"M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\" };\nconst _hoisted_4$1 = { key: 0 };\nfunction _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon radiobox-blank-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$2, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$1, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$2))\n ], 16, _hoisted_1$3);\n}\nconst RadioboxBlank = /* @__PURE__ */ _export_sfc(_sfc_main$3, [[\"render\", _sfc_render$3]]);\nconst _sfc_main$2 = {\n name: \"RadioboxMarkedIcon\",\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};\nconst _hoisted_1$2 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$1 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$1 = { d: \"M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7Z\" };\nconst _hoisted_4 = { key: 0 };\nfunction _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon radiobox-marked-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$1, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$1))\n ], 16, _hoisted_1$2);\n}\nconst RadioboxMarked = /* @__PURE__ */ _export_sfc(_sfc_main$2, [[\"render\", _sfc_render$2]]);\nconst TYPE_CHECKBOX = \"checkbox\";\nconst TYPE_RADIO = \"radio\";\nconst TYPE_SWITCH = \"switch\";\nconst TYPE_BUTTON = \"button\";\nconst _sfc_main$1 = {\n name: \"NcCheckboxContent\",\n components: {\n NcLoadingIcon,\n NcIconToggleSwitch\n },\n props: {\n /**\n * Class for the icon element\n */\n iconClass: {\n type: [String, Object],\n default: null\n },\n /**\n * Class for the text element\n */\n textClass: {\n type: [String, Object],\n default: null\n },\n /**\n * Type of the input. checkbox, radio, switch, or button.\n *\n * Only use button when used in a `tablist` container and the\n * `tab` role is set.\n *\n * @type {'checkbox'|'radio'|'switch'|'button'}\n */\n type: {\n type: String,\n default: \"checkbox\",\n validator: (type) => [\n TYPE_CHECKBOX,\n TYPE_RADIO,\n TYPE_SWITCH,\n TYPE_BUTTON\n ].includes(type)\n },\n /**\n * Toggle the alternative button style\n */\n buttonVariant: {\n type: Boolean,\n default: false\n },\n /**\n * True if the entry is checked\n */\n isChecked: {\n type: Boolean,\n default: false\n },\n /**\n * Indeterminate state\n */\n indeterminate: {\n type: Boolean,\n default: false\n },\n /**\n * Loading state\n */\n loading: {\n type: Boolean,\n default: false\n },\n /**\n * Icon size\n */\n iconSize: {\n type: Number,\n default: 24\n },\n /**\n * Label id attribute\n */\n labelId: {\n type: String,\n required: true\n },\n /**\n * Description id attribute\n */\n descriptionId: {\n type: String,\n required: true\n }\n },\n computed: {\n isButtonType() {\n return this.type === TYPE_BUTTON;\n },\n isSwitchType() {\n return this.type === TYPE_SWITCH;\n },\n /**\n * Returns the proper Material icon depending on the select case\n *\n * @return {object}\n */\n checkboxRadioIconElement() {\n if (this.type === TYPE_RADIO) {\n if (this.isChecked) {\n return RadioboxMarked;\n }\n return RadioboxBlank;\n }\n if (this.indeterminate) {\n return MinusBox;\n }\n if (this.isChecked) {\n return CheckboxMarked;\n }\n return CheckboxBlankOutline;\n }\n }\n};\nconst _hoisted_1$1 = {\n key: 0,\n class: \"checkbox-content__wrapper\"\n};\nconst _hoisted_2 = [\"id\"];\nconst _hoisted_3 = [\"id\"];\nfunction _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcLoadingIcon = resolveComponent(\"NcLoadingIcon\");\n const _component_NcIconToggleSwitch = resolveComponent(\"NcIconToggleSwitch\");\n return openBlock(), createElementBlock(\"span\", {\n class: normalizeClass([\"checkbox-content\", {\n [\"checkbox-content-\" + $props.type]: true,\n \"checkbox-content--button-variant\": $props.buttonVariant,\n \"checkbox-content--has-text\": !!_ctx.$slots.default\n }])\n }, [\n createElementVNode(\"span\", {\n class: normalizeClass([\"checkbox-content__icon\", {\n \"checkbox-content__icon--checked\": $props.isChecked,\n \"checkbox-content__icon--has-description\": !$options.isButtonType && _ctx.$slots.description,\n [$props.iconClass]: true\n }]),\n \"aria-hidden\": true,\n inert: \"\"\n }, [\n renderSlot(_ctx.$slots, \"icon\", {\n checked: $props.isChecked,\n loading: $props.loading\n }, () => [\n $props.loading ? (openBlock(), createBlock(_component_NcLoadingIcon, { key: 0 })) : $options.isSwitchType ? (openBlock(), createBlock(_component_NcIconToggleSwitch, {\n key: 1,\n checked: $props.isChecked,\n size: $props.iconSize,\n inline: \"\"\n }, null, 8, [\"checked\", \"size\"])) : !$props.buttonVariant ? (openBlock(), createBlock(resolveDynamicComponent($options.checkboxRadioIconElement), {\n key: 2,\n size: $props.iconSize\n }, null, 8, [\"size\"])) : createCommentVNode(\"\", true)\n ], true)\n ], 2),\n _ctx.$slots.default || _ctx.$slots.description ? (openBlock(), createElementBlock(\"span\", _hoisted_1$1, [\n _ctx.$slots.default ? (openBlock(), createElementBlock(\"span\", {\n key: 0,\n id: $props.labelId,\n class: normalizeClass([\"checkbox-content__text\", $props.textClass])\n }, [\n renderSlot(_ctx.$slots, \"default\", {}, void 0, true)\n ], 10, _hoisted_2)) : createCommentVNode(\"\", true),\n !$options.isButtonType && _ctx.$slots.description ? (openBlock(), createElementBlock(\"span\", {\n key: 1,\n id: $props.descriptionId,\n class: \"checkbox-content__description\"\n }, [\n renderSlot(_ctx.$slots, \"description\", {}, void 0, true)\n ], 8, _hoisted_3)) : createCommentVNode(\"\", true)\n ])) : createCommentVNode(\"\", true)\n ], 2);\n}\nconst NcCheckboxContent = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"render\", _sfc_render$1], [\"__scopeId\", \"data-v-5ca1e30f\"]]);\nregister();\nconst _sfc_main = {\n name: \"NcCheckboxRadioSwitch\",\n components: {\n NcCheckboxContent\n },\n // We need to pass attributes to the input element\n inheritAttrs: false,\n props: {\n /**\n * Unique id attribute of the input\n */\n id: {\n type: String,\n default: () => \"checkbox-radio-switch-\" + createElementId(),\n validator: (id) => id.trim() !== \"\"\n },\n /**\n * Unique id attribute of the wrapper element\n */\n wrapperId: {\n type: String,\n default: null\n },\n /**\n * Input name. Required for radio, optional for checkbox, and ignored\n * for button.\n */\n name: {\n type: String,\n default: null\n },\n /**\n * Required if no text is set.\n * The aria-label is forwarded to the input or button.\n */\n ariaLabel: {\n type: String,\n default: \"\"\n },\n /**\n * Type of the input. checkbox, radio, switch, or button.\n *\n * Only use button when used in a `tablist` container and the\n * `tab` role is set.\n *\n * @type {'checkbox'|'radio'|'switch'|'button'}\n */\n type: {\n type: String,\n default: \"checkbox\",\n validator: (type) => [\n TYPE_CHECKBOX,\n TYPE_RADIO,\n TYPE_SWITCH,\n TYPE_BUTTON\n ].includes(type)\n },\n /**\n * Toggle the alternative button style\n *\n * @deprecated - Use `NcRadioGroup` instead\n */\n buttonVariant: {\n type: Boolean,\n default: false\n },\n /**\n * Are the elements are all direct siblings?\n * If so they will be grouped horizontally or vertically\n *\n * @type {'no'|'horizontal'|'vertical'}\n * @deprecated - Use `NcRadioGroup` instead\n */\n buttonVariantGrouped: {\n type: String,\n default: \"no\",\n validator: (v) => [\"no\", \"vertical\", \"horizontal\"].includes(v)\n },\n /**\n * Checked state. To be used with `v-model:value`\n */\n modelValue: {\n type: [Boolean, Array, String],\n default: false\n },\n /**\n * Value to be synced on check\n */\n value: {\n type: String,\n default: null\n },\n /**\n * Disabled state\n */\n disabled: {\n type: Boolean,\n default: false\n },\n /**\n * Indeterminate state\n */\n indeterminate: {\n type: Boolean,\n default: false\n },\n /**\n * Required state\n */\n required: {\n type: Boolean,\n default: false\n },\n /**\n * Loading state\n */\n loading: {\n type: Boolean,\n default: false\n },\n /**\n * Wrapping element tag\n *\n * When `type` is set to `button` this will be ignored\n *\n * Defaults to `span`\n */\n wrapperElement: {\n type: String,\n default: null\n },\n /**\n * The class(es) to pass to the wrapper / root element of the component\n */\n class: {\n type: [String, Array, Object],\n default: \"\"\n },\n /**\n * The style to pass to the wrapper / root element of the component\n */\n style: {\n type: [String, Array, Object],\n default: \"\"\n },\n /**\n * Description\n *\n * This is unsupported when using button has type.\n */\n description: {\n type: String,\n default: null\n }\n },\n emits: [\"update:modelValue\"],\n setup(props, { emit }) {\n const radioGroup = useInsideRadioGroup();\n onMounted(() => radioGroup?.value.register(false));\n const internalType = computed(() => radioGroup?.value ? TYPE_RADIO : props.type);\n const internalModelValue = computed({\n get() {\n if (radioGroup?.value) {\n return radioGroup.value.modelValue;\n }\n return props.modelValue;\n },\n set(value) {\n if (radioGroup?.value) {\n radioGroup.value.onUpdate(value);\n } else {\n emit(\"update:modelValue\", value);\n }\n }\n });\n return {\n internalType,\n internalModelValue,\n labelId: createElementId(),\n descriptionId: createElementId()\n };\n },\n computed: {\n isButtonType() {\n return this.internalType === TYPE_BUTTON;\n },\n computedWrapperElement() {\n if (this.isButtonType) {\n return \"button\";\n }\n if (this.wrapperElement !== null) {\n return this.wrapperElement;\n }\n return \"span\";\n },\n listeners() {\n if (this.isButtonType) {\n return {\n click: this.onToggle\n };\n }\n return {\n change: this.onToggle\n };\n },\n iconSize() {\n return this.internalType === TYPE_SWITCH ? 36 : 20;\n },\n cssIconSize() {\n return this.iconSize + \"px\";\n },\n cssIconHeight() {\n return this.internalType === TYPE_SWITCH ? \"16px\" : this.cssIconSize;\n },\n /**\n * Return the input type.\n * Switch is not an official type\n *\n * @return {string}\n */\n inputType() {\n const nativeTypes = [\n TYPE_CHECKBOX,\n TYPE_RADIO,\n TYPE_BUTTON\n ];\n if (nativeTypes.includes(this.internalType)) {\n return this.internalType;\n }\n return TYPE_CHECKBOX;\n },\n /**\n * Check if that entry is checked\n * If value is defined, we use that as the checked value\n * If not, we expect true/false in this.checked\n *\n * @return {boolean}\n */\n isChecked() {\n if (this.value !== null) {\n if (Array.isArray(this.internalModelValue)) {\n return [...this.internalModelValue].indexOf(this.value) > -1;\n }\n return this.internalModelValue === this.value;\n }\n return this.internalModelValue === true;\n },\n hasIndeterminate() {\n return [\n TYPE_CHECKBOX,\n TYPE_RADIO\n ].includes(this.inputType);\n }\n },\n mounted() {\n if (this.name && this.internalType === TYPE_CHECKBOX) {\n if (!Array.isArray(this.internalModelValue)) {\n throw new Error(\"When using groups of checkboxes, the updated value will be an array.\");\n }\n }\n if (this.name && this.internalType === TYPE_SWITCH) {\n throw new Error(\"Switches are not made to be used for data sets. Please use checkboxes instead.\");\n }\n if (typeof this.internalModelValue !== \"boolean\" && this.internalType === TYPE_SWITCH) {\n throw new Error(\"Switches can only be used with boolean as modelValue prop.\");\n }\n },\n methods: {\n t,\n n,\n onToggle(event) {\n if (this.disabled || event.target.tagName.toLowerCase() === \"a\") {\n return;\n }\n if (this.internalType === TYPE_RADIO) {\n this.internalModelValue = this.value;\n return;\n }\n if (this.internalType === TYPE_SWITCH) {\n this.internalModelValue = !this.isChecked;\n return;\n }\n if (typeof this.internalModelValue === \"boolean\") {\n this.internalModelValue = !this.internalModelValue;\n return;\n }\n if (this.isChecked) {\n this.internalModelValue = this.internalModelValue.filter((v) => v !== this.value);\n } else {\n this.internalModelValue = [...this.internalModelValue, this.value];\n }\n }\n }\n};\nconst __injectCSSVars__ = () => {\n useCssVars((_ctx) => ({\n \"v5ac25550\": _ctx.cssIconSize,\n \"d98ce684\": _ctx.cssIconHeight\n }));\n};\nconst __setup__ = _sfc_main.setup;\n_sfc_main.setup = __setup__ ? (props, ctx) => {\n __injectCSSVars__();\n return __setup__(props, ctx);\n} : __injectCSSVars__;\nconst _hoisted_1 = [\"id\", \"aria-labelledby\", \"aria-describedby\", \"aria-label\", \"disabled\", \"type\", \"value\", \"checked\", \".indeterminate\", \"required\", \"name\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcCheckboxContent = resolveComponent(\"NcCheckboxContent\");\n return openBlock(), createBlock(resolveDynamicComponent($options.computedWrapperElement), mergeProps({\n id: $props.wrapperId ?? ($options.isButtonType ? $props.id : null),\n \"aria-label\": $options.isButtonType && $props.ariaLabel ? $props.ariaLabel : void 0,\n class: [\"checkbox-radio-switch\", [\n _ctx.$props.class,\n {\n [\"checkbox-radio-switch-\" + $setup.internalType]: $setup.internalType,\n \"checkbox-radio-switch--checked\": $options.isChecked,\n \"checkbox-radio-switch--disabled\": $props.disabled,\n \"checkbox-radio-switch--indeterminate\": $options.hasIndeterminate ? $props.indeterminate : false,\n \"checkbox-radio-switch--button-variant\": $props.buttonVariant,\n \"checkbox-radio-switch--button-variant-v-grouped\": $props.buttonVariant && $props.buttonVariantGrouped === \"vertical\",\n \"checkbox-radio-switch--button-variant-h-grouped\": $props.buttonVariant && $props.buttonVariantGrouped === \"horizontal\",\n \"button-vue\": $options.isButtonType\n }\n ]],\n style: $props.style,\n type: $options.isButtonType ? \"button\" : null\n }, $options.isButtonType ? _ctx.$attrs : {}, toHandlers($options.isButtonType ? $options.listeners : {})), {\n default: withCtx(() => [\n !$options.isButtonType ? (openBlock(), createElementBlock(\"input\", mergeProps({\n key: 0,\n id: $props.id,\n \"aria-labelledby\": !$options.isButtonType && !$props.ariaLabel ? $setup.labelId : null,\n \"aria-describedby\": !$options.isButtonType && ($props.description || _ctx.$slots.description) ? $setup.descriptionId : null,\n \"aria-label\": $props.ariaLabel || void 0,\n class: \"checkbox-radio-switch__input\",\n disabled: $props.disabled,\n type: $options.inputType,\n value: $props.value,\n checked: $options.isChecked,\n \".indeterminate\": $options.hasIndeterminate ? $props.indeterminate : null,\n required: $props.required,\n name: $props.name\n }, _ctx.$attrs, toHandlers($options.listeners, true)), null, 48, _hoisted_1)) : createCommentVNode(\"\", true),\n createVNode(_component_NcCheckboxContent, {\n id: !$options.isButtonType ? `${$props.id}-label` : void 0,\n class: \"checkbox-radio-switch__content\",\n iconClass: \"checkbox-radio-switch__icon\",\n textClass: \"checkbox-radio-switch__text\",\n type: $setup.internalType,\n indeterminate: $options.hasIndeterminate ? $props.indeterminate : false,\n buttonVariant: $props.buttonVariant,\n isChecked: $options.isChecked,\n loading: $props.loading,\n labelId: $setup.labelId,\n descriptionId: $setup.descriptionId,\n iconSize: $options.iconSize,\n onClick: $options.onToggle\n }, createSlots({\n icon: withCtx(() => [\n renderSlot(_ctx.$slots, \"icon\", {}, void 0, true)\n ]),\n _: 2\n }, [\n _ctx.$slots.description || $props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString($props.description), 1)\n ], true)\n ]),\n key: \"0\"\n } : void 0,\n !!_ctx.$slots.default ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, void 0, true)\n ]),\n key: \"1\"\n } : void 0\n ]), [\"id\", \"type\", \"indeterminate\", \"buttonVariant\", \"isChecked\", \"loading\", \"labelId\", \"descriptionId\", \"iconSize\", \"onClick\"])\n ]),\n _: 3\n }, 16, [\"id\", \"aria-label\", \"class\", \"style\", \"type\"]);\n}\nconst NcCheckboxRadioSwitch = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-c34c63a4\"]]);\nexport {\n NcCheckboxRadioSwitch as N\n};\n//# sourceMappingURL=NcCheckboxRadioSwitch-DVdt5Hkq.mjs.map\n"],"names":["svg","_sfc_main","defineComponent","__props","useCssVars","_ctx","color","cx","computed","_cache","openBlock","createBlock","NcIconSvgWrapper","normalizeClass","iconToggleSwitch","style0","cssModules","NcIconToggleSwitch","_export_sfc","INSIDE_RADIO_GROUP_KEY","useInsideRadioGroup","inject","_sfc_main$6","_hoisted_1$6","_hoisted_2$5","_hoisted_3$5","_hoisted_4$4","_sfc_render$6","$props","$setup","$data","$options","createElementBlock","mergeProps","$event","createElementVNode","toDisplayString","createCommentVNode","CheckboxBlankOutline","_sfc_main$5","_hoisted_1$5","_hoisted_2$4","_hoisted_3$4","_hoisted_4$3","_sfc_render$5","CheckboxMarked","_sfc_main$4","_hoisted_1$4","_hoisted_2$3","_hoisted_3$3","_hoisted_4$2","_sfc_render$4","MinusBox","_sfc_main$3","_hoisted_1$3","_hoisted_2$2","_hoisted_3$2","_hoisted_4$1","_sfc_render$3","RadioboxBlank","_sfc_main$2","_hoisted_1$2","_hoisted_2$1","_hoisted_3$1","_hoisted_4","_sfc_render$2","RadioboxMarked","TYPE_CHECKBOX","TYPE_RADIO","TYPE_SWITCH","TYPE_BUTTON","_sfc_main$1","NcLoadingIcon","type","_hoisted_1$1","_hoisted_2","_hoisted_3","_sfc_render$1","_component_NcLoadingIcon","resolveComponent","_component_NcIconToggleSwitch","renderSlot","resolveDynamicComponent","NcCheckboxContent","register","createElementId","id","v","props","emit","radioGroup","onMounted","internalType","internalModelValue","value","t","n","event","__injectCSSVars__","__setup__","ctx","_hoisted_1","_sfc_render","_component_NcCheckboxContent","toHandlers","withCtx","createVNode","createSlots","createTextVNode","NcCheckboxRadioSwitch"],"mappings":"2RAIA,MAAMA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASNC,EAA4BC,EAAgB,CAChD,OAAQ,qBACR,MAAO,CACL,QAAS,CAAE,KAAM,OAAO,EACxB,KAAM,CAAE,QAAS,EAAE,EACnB,OAAQ,CAAE,KAAM,QAAS,QAAS,EAAK,CAC3C,EACE,MAAMC,EAAS,CACbC,EAAYC,IAAU,CACpB,UAAaC,EAAM,MACnB,UAAaC,EAAG,KACtB,EAAM,EACF,MAAMD,EAAQE,EAAS,IAAML,EAAQ,QAAU,+BAAiC,+BAA+B,EACzGI,EAAKC,EAAS,IAAML,EAAQ,QAAU,uBAAyB,qBAAqB,EAC1F,MAAO,CAACE,EAAMI,KACLC,EAAS,EAAIC,EAAYC,EAAkB,CAChD,MAAOC,EAAeR,EAAK,OAAO,gBAAgB,EAClD,IAAAL,EACA,KAAMG,EAAQ,KACd,OAAQA,EAAQ,MACxB,EAAS,KAAM,EAAG,CAAC,QAAS,OAAQ,QAAQ,CAAC,EAE3C,CACF,CAAC,EACKW,EAAmB,0BACnBC,EAAS,CACb,uBAAwB,8BACxB,iBAAAD,CACF,EACME,EAAa,CACjB,OAAUD,CACZ,EACME,EAAqCC,EAAYjB,EAAW,CAAC,CAAC,eAAgBe,CAAU,CAAC,CAAC,ECxC1FG,EAAyC,OAAO,IAAI,kBAAkB,EAC5E,SAASC,GAAsB,CAC7B,OAAOC,EAAOF,EAAwB,MAAM,CAC9C,CCAA,MAAMG,EAAc,CAClB,KAAM,2BACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,MACZ,EACI,UAAW,CACT,KAAM,OACN,QAAS,cACf,EACI,KAAM,CACJ,KAAM,OACN,QAAS,EACf,CACA,CACA,EACMC,EAAe,CAAC,cAAe,YAAY,EAC3CC,EAAe,CAAC,OAAQ,QAAS,QAAQ,EACzCC,GAAe,CAAE,EAAG,sGAAsG,EAC1HC,GAAe,CAAE,IAAK,CAAC,EAC7B,SAASC,GAActB,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOrB,EAAS,EAAIsB,EAAmB,OAAQC,EAAW5B,EAAK,OAAQ,CACrE,cAAeuB,EAAO,MAAQ,KAAO,OACrC,aAAcA,EAAO,MACrB,MAAO,mDACP,KAAM,MACN,QAASnB,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKyB,GAAW7B,EAAK,MAAM,QAAS6B,CAAM,EAC7E,CAAG,EAAG,EACDxB,EAAS,EAAIsB,EAAmB,MAAO,CACtC,KAAMJ,EAAO,UACb,MAAO,4BACP,MAAOA,EAAO,KACd,OAAQA,EAAO,KACf,QAAS,WACf,EAAO,CACDO,EAAmB,OAAQV,GAAc,CACvCG,EAAO,OAASlB,EAAS,EAAIsB,EAAmB,QAASN,GAAcU,EAAgBR,EAAO,KAAK,EAAG,CAAC,GAAKS,EAAmB,GAAI,EAAI,CAC/I,CAAO,CACP,EAAO,EAAGb,CAAY,EACtB,EAAK,GAAID,CAAY,CACrB,CACA,MAAMe,GAAuCpB,EAAYI,EAAa,CAAC,CAAC,SAAUK,EAAa,CAAC,CAAC,EAC3FY,GAAc,CAClB,KAAM,qBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,MACZ,EACI,UAAW,CACT,KAAM,OACN,QAAS,cACf,EACI,KAAM,CACJ,KAAM,OACN,QAAS,EACf,CACA,CACA,EACMC,GAAe,CAAC,cAAe,YAAY,EAC3CC,GAAe,CAAC,OAAQ,QAAS,QAAQ,EACzCC,GAAe,CAAE,EAAG,sIAAsI,EAC1JC,GAAe,CAAE,IAAK,CAAC,EAC7B,SAASC,GAAcvC,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOrB,EAAS,EAAIsB,EAAmB,OAAQC,EAAW5B,EAAK,OAAQ,CACrE,cAAeuB,EAAO,MAAQ,KAAO,OACrC,aAAcA,EAAO,MACrB,MAAO,4CACP,KAAM,MACN,QAASnB,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKyB,GAAW7B,EAAK,MAAM,QAAS6B,CAAM,EAC7E,CAAG,EAAG,EACDxB,EAAS,EAAIsB,EAAmB,MAAO,CACtC,KAAMJ,EAAO,UACb,MAAO,4BACP,MAAOA,EAAO,KACd,OAAQA,EAAO,KACf,QAAS,WACf,EAAO,CACDO,EAAmB,OAAQO,GAAc,CACvCd,EAAO,OAASlB,EAAS,EAAIsB,EAAmB,QAASW,GAAcP,EAAgBR,EAAO,KAAK,EAAG,CAAC,GAAKS,EAAmB,GAAI,EAAI,CAC/I,CAAO,CACP,EAAO,EAAGI,EAAY,EACtB,EAAK,GAAID,EAAY,CACrB,CACA,MAAMK,GAAiC3B,EAAYqB,GAAa,CAAC,CAAC,SAAUK,EAAa,CAAC,CAAC,EACrFE,GAAc,CAClB,KAAM,eACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,MACZ,EACI,UAAW,CACT,KAAM,OACN,QAAS,cACf,EACI,KAAM,CACJ,KAAM,OACN,QAAS,EACf,CACA,CACA,EACMC,GAAe,CAAC,cAAe,YAAY,EAC3CC,GAAe,CAAC,OAAQ,QAAS,QAAQ,EACzCC,GAAe,CAAE,EAAG,qGAAqG,EACzHC,GAAe,CAAE,IAAK,CAAC,EAC7B,SAASC,GAAc9C,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOrB,EAAS,EAAIsB,EAAmB,OAAQC,EAAW5B,EAAK,OAAQ,CACrE,cAAeuB,EAAO,MAAQ,KAAO,OACrC,aAAcA,EAAO,MACrB,MAAO,sCACP,KAAM,MACN,QAASnB,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKyB,GAAW7B,EAAK,MAAM,QAAS6B,CAAM,EAC7E,CAAG,EAAG,EACDxB,EAAS,EAAIsB,EAAmB,MAAO,CACtC,KAAMJ,EAAO,UACb,MAAO,4BACP,MAAOA,EAAO,KACd,OAAQA,EAAO,KACf,QAAS,WACf,EAAO,CACDO,EAAmB,OAAQc,GAAc,CACvCrB,EAAO,OAASlB,EAAS,EAAIsB,EAAmB,QAASkB,GAAcd,EAAgBR,EAAO,KAAK,EAAG,CAAC,GAAKS,EAAmB,GAAI,EAAI,CAC/I,CAAO,CACP,EAAO,EAAGW,EAAY,EACtB,EAAK,GAAID,EAAY,CACrB,CACA,MAAMK,GAA2BlC,EAAY4B,GAAa,CAAC,CAAC,SAAUK,EAAa,CAAC,CAAC,EAC/EE,GAAc,CAClB,KAAM,oBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,MACZ,EACI,UAAW,CACT,KAAM,OACN,QAAS,cACf,EACI,KAAM,CACJ,KAAM,OACN,QAAS,EACf,CACA,CACA,EACMC,GAAe,CAAC,cAAe,YAAY,EAC3CC,GAAe,CAAC,OAAQ,QAAS,QAAQ,EACzCC,GAAe,CAAE,EAAG,kJAAkJ,EACtKC,GAAe,CAAE,IAAK,CAAC,EAC7B,SAASC,GAAcrD,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOrB,EAAS,EAAIsB,EAAmB,OAAQC,EAAW5B,EAAK,OAAQ,CACrE,cAAeuB,EAAO,MAAQ,KAAO,OACrC,aAAcA,EAAO,MACrB,MAAO,2CACP,KAAM,MACN,QAASnB,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKyB,GAAW7B,EAAK,MAAM,QAAS6B,CAAM,EAC7E,CAAG,EAAG,EACDxB,EAAS,EAAIsB,EAAmB,MAAO,CACtC,KAAMJ,EAAO,UACb,MAAO,4BACP,MAAOA,EAAO,KACd,OAAQA,EAAO,KACf,QAAS,WACf,EAAO,CACDO,EAAmB,OAAQqB,GAAc,CACvC5B,EAAO,OAASlB,EAAS,EAAIsB,EAAmB,QAASyB,GAAcrB,EAAgBR,EAAO,KAAK,EAAG,CAAC,GAAKS,EAAmB,GAAI,EAAI,CAC/I,CAAO,CACP,EAAO,EAAGkB,EAAY,EACtB,EAAK,GAAID,EAAY,CACrB,CACA,MAAMK,GAAgCzC,EAAYmC,GAAa,CAAC,CAAC,SAAUK,EAAa,CAAC,CAAC,EACpFE,GAAc,CAClB,KAAM,qBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,MACZ,EACI,UAAW,CACT,KAAM,OACN,QAAS,cACf,EACI,KAAM,CACJ,KAAM,OACN,QAAS,EACf,CACA,CACA,EACMC,GAAe,CAAC,cAAe,YAAY,EAC3CC,GAAe,CAAC,OAAQ,QAAS,QAAQ,EACzCC,GAAe,CAAE,EAAG,qNAAqN,EACzOC,GAAa,CAAE,IAAK,CAAC,EAC3B,SAASC,GAAc5D,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,OAAOrB,EAAS,EAAIsB,EAAmB,OAAQC,EAAW5B,EAAK,OAAQ,CACrE,cAAeuB,EAAO,MAAQ,KAAO,OACrC,aAAcA,EAAO,MACrB,MAAO,4CACP,KAAM,MACN,QAASnB,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAKyB,GAAW7B,EAAK,MAAM,QAAS6B,CAAM,EAC7E,CAAG,EAAG,EACDxB,EAAS,EAAIsB,EAAmB,MAAO,CACtC,KAAMJ,EAAO,UACb,MAAO,4BACP,MAAOA,EAAO,KACd,OAAQA,EAAO,KACf,QAAS,WACf,EAAO,CACDO,EAAmB,OAAQ4B,GAAc,CACvCnC,EAAO,OAASlB,EAAS,EAAIsB,EAAmB,QAASgC,GAAY5B,EAAgBR,EAAO,KAAK,EAAG,CAAC,GAAKS,EAAmB,GAAI,EAAI,CAC7I,CAAO,CACP,EAAO,EAAGyB,EAAY,EACtB,EAAK,GAAID,EAAY,CACrB,CACA,MAAMK,GAAiChD,EAAY0C,GAAa,CAAC,CAAC,SAAUK,EAAa,CAAC,CAAC,EACrFE,EAAgB,WAChBC,EAAa,QACbC,EAAc,SACdC,EAAc,SACdC,GAAc,CAClB,KAAM,oBACN,WAAY,CACV,cAAAC,EACA,mBAAAvD,CACJ,EACE,MAAO,CAIL,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IACf,EAII,UAAW,CACT,KAAM,CAAC,OAAQ,MAAM,EACrB,QAAS,IACf,EASI,KAAM,CACJ,KAAM,OACN,QAAS,WACT,UAAYwD,GAAS,CACnBN,EACAC,EACAC,EACAC,CACR,EAAQ,SAASG,CAAI,CACrB,EAII,cAAe,CACb,KAAM,QACN,QAAS,EACf,EAII,UAAW,CACT,KAAM,QACN,QAAS,EACf,EAII,cAAe,CACb,KAAM,QACN,QAAS,EACf,EAII,QAAS,CACP,KAAM,QACN,QAAS,EACf,EAII,SAAU,CACR,KAAM,OACN,QAAS,EACf,EAII,QAAS,CACP,KAAM,OACN,SAAU,EAChB,EAII,cAAe,CACb,KAAM,OACN,SAAU,EAChB,CACA,EACE,SAAU,CACR,cAAe,CACb,OAAO,KAAK,OAASH,CACvB,EACA,cAAe,CACb,OAAO,KAAK,OAASD,CACvB,EAMA,0BAA2B,CACzB,OAAI,KAAK,OAASD,EACZ,KAAK,UACAF,GAEFP,GAEL,KAAK,cACAP,GAEL,KAAK,UACAP,GAEFP,EACT,CACJ,CACA,EACMoC,GAAe,CACnB,IAAK,EACL,MAAO,2BACT,EACMC,GAAa,CAAC,IAAI,EAClBC,GAAa,CAAC,IAAI,EACxB,SAASC,GAAcxE,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CACpE,MAAM+C,EAA2BC,EAAiB,eAAe,EAC3DC,EAAgCD,EAAiB,oBAAoB,EAC3E,OAAOrE,EAAS,EAAIsB,EAAmB,OAAQ,CAC7C,MAAOnB,EAAe,CAAC,mBAAoB,CACzC,CAAC,oBAAsBe,EAAO,IAAI,EAAG,GACrC,mCAAoCA,EAAO,cAC3C,6BAA8B,CAAC,CAACvB,EAAK,OAAO,OAClD,CAAK,CAAC,CACN,EAAK,CACD8B,EAAmB,OAAQ,CACzB,MAAOtB,EAAe,CAAC,yBAA0B,CAC/C,kCAAmCe,EAAO,UAC1C,0CAA2C,CAACG,EAAS,cAAgB1B,EAAK,OAAO,YACjF,CAACuB,EAAO,SAAS,EAAG,EAC5B,CAAO,CAAC,EACF,cAAe,GACf,MAAO,EACb,EAAO,CACDqD,EAAW5E,EAAK,OAAQ,OAAQ,CAC9B,QAASuB,EAAO,UAChB,QAASA,EAAO,OACxB,EAAS,IAAM,CACPA,EAAO,SAAWlB,EAAS,EAAIC,EAAYmE,EAA0B,CAAE,IAAK,CAAC,CAAE,GAAK/C,EAAS,cAAgBrB,EAAS,EAAIC,EAAYqE,EAA+B,CACnK,IAAK,EACL,QAASpD,EAAO,UAChB,KAAMA,EAAO,SACb,OAAQ,EAClB,EAAW,KAAM,EAAG,CAAC,UAAW,MAAM,CAAC,GAAMA,EAAO,cAGnBS,EAAmB,GAAI,EAAI,GAHS3B,EAAS,EAAIC,EAAYuE,EAAwBnD,EAAS,wBAAwB,EAAG,CAChJ,IAAK,EACL,KAAMH,EAAO,QACvB,EAAW,KAAM,EAAG,CAAC,MAAM,CAAC,EAC5B,EAAS,EAAI,CACb,EAAO,CAAC,EACJvB,EAAK,OAAO,SAAWA,EAAK,OAAO,aAAeK,IAAasB,EAAmB,OAAQ0C,GAAc,CACtGrE,EAAK,OAAO,SAAWK,EAAS,EAAIsB,EAAmB,OAAQ,CAC7D,IAAK,EACL,GAAIJ,EAAO,QACX,MAAOf,EAAe,CAAC,yBAA0Be,EAAO,SAAS,CAAC,CAC1E,EAAS,CACDqD,EAAW5E,EAAK,OAAQ,UAAW,CAAA,EAAI,OAAQ,EAAI,CAC3D,EAAS,GAAIsE,EAAU,GAAKtC,EAAmB,GAAI,EAAI,EACjD,CAACN,EAAS,cAAgB1B,EAAK,OAAO,aAAeK,EAAS,EAAIsB,EAAmB,OAAQ,CAC3F,IAAK,EACL,GAAIJ,EAAO,cACX,MAAO,+BACf,EAAS,CACDqD,EAAW5E,EAAK,OAAQ,cAAe,CAAA,EAAI,OAAQ,EAAI,CAC/D,EAAS,EAAGuE,EAAU,GAAKvC,EAAmB,GAAI,EAAI,CACtD,CAAK,GAAKA,EAAmB,GAAI,EAAI,CACrC,EAAK,CAAC,CACN,CACA,MAAM8C,GAAoCjE,EAAYqD,GAAa,CAAC,CAAC,SAAUM,EAAa,EAAG,CAAC,YAAa,iBAAiB,CAAC,CAAC,EAChIO,EAAQ,EACR,MAAMnF,EAAY,CAChB,KAAM,wBACN,WAAY,CACV,kBAAAkF,EACJ,EAEE,aAAc,GACd,MAAO,CAIL,GAAI,CACF,KAAM,OACN,QAAS,IAAM,yBAA2BE,EAAe,EACzD,UAAYC,GAAOA,EAAG,KAAI,IAAO,EACvC,EAII,UAAW,CACT,KAAM,OACN,QAAS,IACf,EAKI,KAAM,CACJ,KAAM,OACN,QAAS,IACf,EAKI,UAAW,CACT,KAAM,OACN,QAAS,EACf,EASI,KAAM,CACJ,KAAM,OACN,QAAS,WACT,UAAYb,GAAS,CACnBN,EACAC,EACAC,EACAC,CACR,EAAQ,SAASG,CAAI,CACrB,EAMI,cAAe,CACb,KAAM,QACN,QAAS,EACf,EAQI,qBAAsB,CACpB,KAAM,OACN,QAAS,KACT,UAAYc,GAAM,CAAC,KAAM,WAAY,YAAY,EAAE,SAASA,CAAC,CACnE,EAII,WAAY,CACV,KAAM,CAAC,QAAS,MAAO,MAAM,EAC7B,QAAS,EACf,EAII,MAAO,CACL,KAAM,OACN,QAAS,IACf,EAII,SAAU,CACR,KAAM,QACN,QAAS,EACf,EAII,cAAe,CACb,KAAM,QACN,QAAS,EACf,EAII,SAAU,CACR,KAAM,QACN,QAAS,EACf,EAII,QAAS,CACP,KAAM,QACN,QAAS,EACf,EAQI,eAAgB,CACd,KAAM,OACN,QAAS,IACf,EAII,MAAO,CACL,KAAM,CAAC,OAAQ,MAAO,MAAM,EAC5B,QAAS,EACf,EAII,MAAO,CACL,KAAM,CAAC,OAAQ,MAAO,MAAM,EAC5B,QAAS,EACf,EAMI,YAAa,CACX,KAAM,OACN,QAAS,IACf,CACA,EACE,MAAO,CAAC,mBAAmB,EAC3B,MAAMC,EAAO,CAAE,KAAAC,GAAQ,CACrB,MAAMC,EAAatE,EAAmB,EACtCuE,EAAU,IAAMD,GAAY,MAAM,SAAS,EAAK,CAAC,EACjD,MAAME,EAAepF,EAAS,IAAMkF,GAAY,MAAQtB,EAAaoB,EAAM,IAAI,EACzEK,EAAqBrF,EAAS,CAClC,KAAM,CACJ,OAAIkF,GAAY,MACPA,EAAW,MAAM,WAEnBF,EAAM,UACf,EACA,IAAIM,EAAO,CACLJ,GAAY,MACdA,EAAW,MAAM,SAASI,CAAK,EAE/BL,EAAK,oBAAqBK,CAAK,CAEnC,CACN,CAAK,EACD,MAAO,CACL,aAAAF,EACA,mBAAAC,EACA,QAASR,EAAe,EACxB,cAAeA,EAAe,CACpC,CACE,EACA,SAAU,CACR,cAAe,CACb,OAAO,KAAK,eAAiBf,CAC/B,EACA,wBAAyB,CACvB,OAAI,KAAK,aACA,SAEL,KAAK,iBAAmB,KACnB,KAAK,eAEP,MACT,EACA,WAAY,CACV,OAAI,KAAK,aACA,CACL,MAAO,KAAK,QACtB,EAEa,CACL,OAAQ,KAAK,QACrB,CACI,EACA,UAAW,CACT,OAAO,KAAK,eAAiBD,EAAc,GAAK,EAClD,EACA,aAAc,CACZ,OAAO,KAAK,SAAW,IACzB,EACA,eAAgB,CACd,OAAO,KAAK,eAAiBA,EAAc,OAAS,KAAK,WAC3D,EAOA,WAAY,CAMV,MALoB,CAClBF,EACAC,EACAE,CACR,EACsB,SAAS,KAAK,YAAY,EACjC,KAAK,aAEPH,CACT,EAQA,WAAY,CACV,OAAI,KAAK,QAAU,KACb,MAAM,QAAQ,KAAK,kBAAkB,EAChC,CAAC,GAAG,KAAK,kBAAkB,EAAE,QAAQ,KAAK,KAAK,EAAI,GAErD,KAAK,qBAAuB,KAAK,MAEnC,KAAK,qBAAuB,EACrC,EACA,kBAAmB,CACjB,MAAO,CACLA,EACAC,CACR,EAAQ,SAAS,KAAK,SAAS,CAC3B,CACJ,EACE,SAAU,CACR,GAAI,KAAK,MAAQ,KAAK,eAAiBD,GACjC,CAAC,MAAM,QAAQ,KAAK,kBAAkB,EACxC,MAAM,IAAI,MAAM,sEAAsE,EAG1F,GAAI,KAAK,MAAQ,KAAK,eAAiBE,EACrC,MAAM,IAAI,MAAM,gFAAgF,EAElG,GAAI,OAAO,KAAK,oBAAuB,WAAa,KAAK,eAAiBA,EACxE,MAAM,IAAI,MAAM,4DAA4D,CAEhF,EACA,QAAS,CACP,EAAA0B,EACA,EAAAC,EACA,SAASC,EAAO,CACd,GAAI,EAAA,KAAK,UAAYA,EAAM,OAAO,QAAQ,YAAW,IAAO,KAG5D,CAAA,GAAI,KAAK,eAAiB7B,EAAY,CACpC,KAAK,mBAAqB,KAAK,MAC/B,MACF,CACA,GAAI,KAAK,eAAiBC,EAAa,CACrC,KAAK,mBAAqB,CAAC,KAAK,UAChC,MACF,CACA,GAAI,OAAO,KAAK,oBAAuB,UAAW,CAChD,KAAK,mBAAqB,CAAC,KAAK,mBAChC,MACF,CACI,KAAK,UACP,KAAK,mBAAqB,KAAK,mBAAmB,OAAQkB,GAAMA,IAAM,KAAK,KAAK,EAEhF,KAAK,mBAAqB,CAAC,GAAG,KAAK,mBAAoB,KAAK,KAAK,CAAA,CAErE,CACJ,CACA,EACMW,EAAoB,IAAM,CAC9B9F,EAAYC,IAAU,CACpB,UAAaA,EAAK,YAClB,SAAYA,EAAK,aACrB,EAAI,CACJ,EACM8F,EAAYlG,EAAU,MAC5BA,EAAU,MAAQkG,EAAY,CAACX,EAAOY,KACpCF,EAAiB,EACVC,EAAUX,EAAOY,CAAG,GACzBF,EACJ,MAAMG,GAAa,CAAC,KAAM,kBAAmB,mBAAoB,aAAc,WAAY,OAAQ,QAAS,UAAW,iBAAkB,WAAY,MAAM,EAC3J,SAASC,GAAYjG,EAAMI,EAAQmB,EAAQC,EAAQC,EAAOC,EAAU,CAClE,MAAMwE,EAA+BxB,EAAiB,mBAAmB,EACzE,OAAOrE,EAAS,EAAIC,EAAYuE,EAAwBnD,EAAS,sBAAsB,EAAGE,EAAW,CACnG,GAAIL,EAAO,YAAcG,EAAS,aAAeH,EAAO,GAAK,MAC7D,aAAcG,EAAS,cAAgBH,EAAO,UAAYA,EAAO,UAAY,OAC7E,MAAO,CAAC,wBAAyB,CAC/BvB,EAAK,OAAO,MACZ,CACE,CAAC,yBAA2BwB,EAAO,YAAY,EAAGA,EAAO,aACzD,iCAAkCE,EAAS,UAC3C,kCAAmCH,EAAO,SAC1C,uCAAwCG,EAAS,iBAAmBH,EAAO,cAAgB,GAC3F,wCAAyCA,EAAO,cAChD,kDAAmDA,EAAO,eAAiBA,EAAO,uBAAyB,WAC3G,kDAAmDA,EAAO,eAAiBA,EAAO,uBAAyB,aAC3G,aAAcG,EAAS,YAC/B,CACA,CAAK,EACD,MAAOH,EAAO,MACd,KAAMG,EAAS,aAAe,SAAW,IAC7C,EAAKA,EAAS,aAAe1B,EAAK,OAAS,CAAA,EAAImG,EAAWzE,EAAS,aAAeA,EAAS,UAAY,CAAA,CAAE,CAAC,EAAG,CACzG,QAAS0E,EAAQ,IAAM,CACpB1E,EAAS,aAcsEM,EAAmB,GAAI,EAAI,GAdjF3B,EAAS,EAAIsB,EAAmB,QAASC,EAAW,CAC5E,IAAK,EACL,GAAIL,EAAO,GACX,kBAAmB,CAACG,EAAS,cAAgB,CAACH,EAAO,UAAYC,EAAO,QAAU,KAClF,mBAAoB,CAACE,EAAS,eAAiBH,EAAO,aAAevB,EAAK,OAAO,aAAewB,EAAO,cAAgB,KACvH,aAAcD,EAAO,WAAa,OAClC,MAAO,+BACP,SAAUA,EAAO,SACjB,KAAMG,EAAS,UACf,MAAOH,EAAO,MACd,QAASG,EAAS,UAClB,iBAAkBA,EAAS,iBAAmBH,EAAO,cAAgB,KACrE,SAAUA,EAAO,SACjB,KAAMA,EAAO,IACrB,EAASvB,EAAK,OAAQmG,EAAWzE,EAAS,UAAW,EAAI,CAAC,EAAG,KAAM,GAAIsE,EAAU,GAC3EK,EAAYH,EAA8B,CACxC,GAAKxE,EAAS,aAAsC,OAAvB,GAAGH,EAAO,EAAE,SACzC,MAAO,iCACP,UAAW,8BACX,UAAW,8BACX,KAAMC,EAAO,aACb,cAAeE,EAAS,iBAAmBH,EAAO,cAAgB,GAClE,cAAeA,EAAO,cACtB,UAAWG,EAAS,UACpB,QAASH,EAAO,QAChB,QAASC,EAAO,QAChB,cAAeA,EAAO,cACtB,SAAUE,EAAS,SACnB,QAASA,EAAS,QAC1B,EAAS4E,EAAY,CACb,KAAMF,EAAQ,IAAM,CAClBxB,EAAW5E,EAAK,OAAQ,OAAQ,CAAA,EAAI,OAAQ,EAAI,CAC1D,CAAS,EACD,EAAG,CACX,EAAS,CACDA,EAAK,OAAO,aAAeuB,EAAO,YAAc,CAC9C,KAAM,cACN,GAAI6E,EAAQ,IAAM,CAChBxB,EAAW5E,EAAK,OAAQ,cAAe,CAAA,EAAI,IAAM,CAC/CuG,EAAgBxE,EAAgBR,EAAO,WAAW,EAAG,CAAC,CACpE,EAAe,EAAI,CACnB,CAAW,EACD,IAAK,GACf,EAAY,OACFvB,EAAK,OAAO,QAAU,CACtB,KAAM,UACN,GAAIoG,EAAQ,IAAM,CAChBxB,EAAW5E,EAAK,OAAQ,UAAW,CAAA,EAAI,OAAQ,EAAI,CAC/D,CAAW,EACD,IAAK,GACf,EAAY,MACZ,CAAO,EAAG,KAAM,CAAC,KAAM,OAAQ,gBAAiB,gBAAiB,YAAa,UAAW,UAAW,gBAAiB,WAAY,SAAS,CAAC,CAC3I,CAAK,EACD,EAAG,CACP,EAAK,GAAI,CAAC,KAAM,aAAc,QAAS,QAAS,MAAM,CAAC,CACvD,CACK,MAACwG,GAAwC3F,EAAYjB,EAAW,CAAC,CAAC,SAAUqG,EAAW,EAAG,CAAC,YAAa,iBAAiB,CAAC,CAAC","x_google_ignoreList":[0,1,2] FileName: ./js/PlainTableContentEditor-DYd67gB3.chunk.mjs SPDXID: SPDXRef-93342fdf005c1fa5d8cfbcca8f4c2563 FileChecksum: SHA1: 162a25efaf57664c5473f742e0f28e76b636bb96 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/PlainTableContentEditor-DYd67gB3.chunk.mjs.map SPDXID: SPDXRef-b9761aa4b1ad689cfbb19fe0e46a8e63 FileChecksum: SHA1: 1be8b3adfd26edb97814f9919cbe4a3dd4345fea LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n"],"names":["_sfc_main","ContentContainer","MainContainer","EditorWrapper","props","extensions","PlainTable","UndoRedo","FocusTrap","editor","markRaw","Editor","setEditable","setContent","useEditorMethods","watch","content","readOnly","provideEditor","provide","editorFlagsKey","editorWidthKey","markdown","createMarkdownSerializer","error","logger","_createBlock","_component_EditorWrapper","_createVNode","_component_MainContainer","_component_ContentContainer","$props"],"mappings":"8qBA4BA,MAAKA,EAAU,CACd,KAAM,0BACN,WAAY,CAAE,iBAAAC,EAAkB,cAAAC,EAAe,cAAAC,CAAY,EAE3D,MAAO,CACN,QAAS,CACR,KAAM,OACN,SAAU,IAGX,SAAU,CACT,KAAM,QACN,QAAS,KAIX,MAAO,CAAC,iBAAkB,QAAS,gBAAgB,EAEnD,MAAMC,EAAO,CACZ,MAAMC,EAAa,CAACC,EAAYC,EAAUC,CAAS,EAC7CC,EAASC,EAAQ,IAAIC,EAAO,CAAE,WAAAN,CAAS,CAAG,CAAC,EAE3C,CAAE,YAAAO,EAAa,WAAAC,CAAS,EAAMC,EAAiBL,CAAM,EAC3D,OAAAM,EACC,IAAMX,EAAM,QACXY,GAAY,CACZH,EAAWG,CAAO,CACnB,CACD,EAEAJ,EAAY,CAACR,EAAM,QAAQ,EAC3BW,EACC,IAAMX,EAAM,SACXa,GAAa,CACbL,EAAY,CAACK,CAAQ,CACtB,CACD,EAEAC,EAAcT,CAAM,EACpBU,EAAQC,EAAgB,CACvB,SAAU,GACV,aAAc,GACd,gBAAiB,GACjB,mBAAoB,GACpB,EACDD,EAAQE,EAAgB,IAAI,EACrB,CAAE,OAAAZ,EAAQ,WAAAI,CAAS,CAC3B,EAEA,SAAU,CAIT,KAAK,WAAW,KAAK,QAAS,CAAE,aAAc,EAAI,CAAG,EACrD,KAAK,OAAO,GAAG,SAAU,IAAM,CAC9B,KAAK,MAAM,OAAO,EAGlB,GAAI,CACH,MAAMS,EAAWC,EAAyB,KAAK,OAAO,MAAM,EAAE,UAAU,KAAK,OAAO,MAAM,GAAG,EAC7F,KAAK,MAAM,iBAAkB,CAC5B,KAAM,KAAK,OAAO,MAAM,IACxB,SAAAD,EACA,CACF,OAASE,EAAO,CACfC,EAAO,MAAM,2BAA4BD,CAAK,CAC/C,CACD,CAAC,EACD,KAAK,OAAO,GAAG,SAAU,CAAC,CAAE,OAAAf,CAAK,IAAQ,CACxC,GAAI,CACH,MAAMa,EAAWC,EAAyBd,EAAO,MAAM,EAAE,UAAUA,EAAO,MAAM,GAAG,EACnF,KAAK,MAAM,iBAAkB,CAC5B,KAAMA,EAAO,MAAM,IACnB,SAAAa,EACA,CACF,OAASE,EAAO,CACfC,EAAO,MAAM,2BAA4BD,CAAK,CAC/C,CACD,CAAC,CACF,EAEA,eAAgB,CACf,KAAK,OAAO,QAAO,CACpB,CACD,6GA1GCE,EAIgBC,EAAA,CAJD,cAAA,IAAa,WAC3B,IAEgB,CAFhBC,EAEgBC,EAAA,KAAA,WADf,IAAyC,CAAzCD,EAAyCE,EAAA,CAAtB,SAAUC,EAAA,QAAQ,EAAA,KAAA,EAAA,CAAA,UAAA,CAAA" FileName: ./js/PlainTextReader-DTJHbXJ-.chunk.mjs SPDXID: SPDXRef-6ec01debce38c867c330762b86cce1c2 FileChecksum: SHA1: 6d4b518e627df4c1c1a46c76b9945c472b0472aa LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/PlainTextReader-DTJHbXJ-.chunk.mjs.map SPDXID: SPDXRef-992f01775fea64bba2682b4ae928ffc6 FileChecksum: SHA1: 418b7bc84fb8b0004a3916cdf4e50287d82e3997 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n"],"names":["_sfc_main","BaseReader","PlainText","_createBlock","_component_BaseReader","$props"],"mappings":"smBAaA,MAAKA,EAAU,CACd,KAAM,kBACN,WAAY,CAAE,WAAAC,CAAS,EAEvB,QAAS,CACR,WAAY,IAAM,CAACC,CAAS,GAG7B,MAAO,CACN,QAAS,CACR,KAAM,OACN,SAAU,IAGb,6DArBCC,EAAiCC,EAAA,CAApB,QAASC,EAAA,OAAO,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA" SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/RichTextReader-B84UjvkW.chunk.mjs SPDXID: SPDXRef-43f9e420e4f9ffe8f33ade8ecfb2cc17 FileChecksum: SHA1: 1d402fb488fcec4fcf1063452de414cc9649a01b LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/RichTextReader-B84UjvkW.chunk.mjs.map SPDXID: SPDXRef-3b4b1ef964e11846d0db025afb5fdedb FileChecksum: SHA1: d3cf7ef320e2346187fd55bf2f0832c3653f35de LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n"],"names":["_sfc_main","BaseReader","RichText","_createBlock","_component_BaseReader","$props","_cache","e","a","_ctx"],"mappings":"smBAeA,MAAKA,EAAU,CACd,KAAM,iBACN,WAAY,CAAE,WAAAC,CAAS,EAEvB,QAAS,CACR,YAAa,CACZ,MAAO,CACNC,EAAS,UAAU,CAClB,QAAS,EACV,CAAC,CACF,CACD,GAGD,MAAO,CACN,QAAS,CACR,KAAM,OACN,SAAU,KAIZ,MAAO,CAAC,WAAW,CACpB,6DA/BCC,EAEmDC,EAAA,CADjD,QAASC,EAAA,QACT,YAASC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAAGC,EAAGC,IAAMC,EAAA,MAAK,YAAcF,EAAGC,CAAC" SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/RichWorkspace-B0XjQh4s.chunk.mjs SPDXID: SPDXRef-0bb95cec3700b3452f8bc80721195ac5 FileChecksum: SHA1: 3b906bd6db8c999392f273b57852058f73c06860 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: text developers FileName: ./js/RichWorkspace-B0XjQh4s.chunk.mjs.map SPDXID: SPDXRef-672385985ea945dd6d85f3c5114c79bb FileChecksum: SHA1: ffd3fa7f366476972d16eb458f610fb990048d9c LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n"],"names":["IS_PUBLIC","isPublicShare","WORKSPACE_URL","generateOcsUrl","defaultExtension","loadState","descriptionFile","translatedDescriptionFile","t","SUPPORTED_STATIC_FILENAMES","_sfc_main","RichTextReader","EditorReloader","getSharingToken","newValue","value","subscribe","unsubscribe","event","params","axios","response","data","error","node","$options","_createElementBlock","_normalizeClass","$data","_createBlock","_component_RichTextReader","$props","_component_EditorReloader"],"mappings":"k3BA0CA,MAAMA,EAAYC,EAAa,EACzBC,EAAgBC,EACrB,aAAeH,EAAY,UAAY,IAAM,aAC7C,CACD,EACMI,EAAmBC,EAAU,OAAQ,wBAAwB,EAC7DC,EAAkB,UAAYF,EAC9BG,EAA4BC,EAAE,OAAQ,QAAQ,EAAI,IAAMJ,EACxDK,EAA6B,CAClCF,EACAD,EACA,YACA,YACA,WACD,EAEKI,EAAU,CACd,KAAM,gBACN,WAAY,CACX,eAAAC,EACA,eAAAC,GAGD,MAAO,CACN,QAAS,CACR,KAAM,OACN,QAAS,IAGV,KAAM,CACL,KAAM,OACN,SAAU,IAGX,iBAAkB,CACjB,KAAM,QACN,QAAS,KAIX,MAAO,CACN,MAAO,CAEN,sBAAuB,GACvB,MAAO,GACP,OAAQ,KACR,KAAM,KACN,OAAQ,GACR,MAAO,GACP,UAAW,GACX,gBAAiB,GACjB,SAAU,GACV,UAAW,QAAQ,KAAK,eAAe,QAAU,OACjD,QAAS,QAAQ,KAAK,MAAM,oBAC7B,CACD,EAEA,SAAU,CACT,YAAa,CACZ,OAAOC,EAAe,CACvB,EAEA,cAAe,CACd,OAAO,KAAK,SAAW,KAAK,qBAC7B,GAGD,MAAO,CACN,MAAO,CACN,KAAK,MAAK,CACX,EAEA,OAAQ,CACP,KAAK,gBAAkB,EACxB,EAEA,MAAMC,EAAU,CACVA,GACJ,SACE,cAAc,0CAA0C,GACvD,SAAS,EAAG,CAAC,CAElB,EAEA,aAAaC,EAAO,CACfA,GACH,KAAK,YAAW,CAElB,EAEA,iBAAiBA,EAAO,CACvB,KAAK,sBAAwBA,CAC9B,GAGD,SAAU,CACT,KAAK,sBAAwB,KAAK,iBAClCC,EAAU,0BAA2B,KAAK,iBAAiB,EAC3DA,EAAU,0BAA2B,KAAK,iBAAiB,EAC3DA,EAAU,qBAAsB,KAAK,aAAa,EAClDA,EAAU,qBAAsB,KAAK,aAAa,EAClDA,EAAU,qBAAsB,KAAK,aAAa,EAElD,KAAK,oBAAmB,CACzB,EAEA,eAAgB,CACfC,EAAY,0BAA2B,KAAK,iBAAiB,EAC7DA,EAAY,0BAA2B,KAAK,iBAAiB,EAC7DA,EAAY,qBAAsB,KAAK,aAAa,EACpDA,EAAY,qBAAsB,KAAK,aAAa,EACpDA,EAAY,qBAAsB,KAAK,aAAa,EAEpD,KAAK,sBAAqB,CAC3B,EAEA,QAAS,CACR,SAAU,CACT,KAAK,MAAQ,GACb,KAAK,SAAW,GAChB,KAAK,sBAAqB,CAC3B,EAEA,OAAOC,EAAO,CAET,KAAK,IAAI,SAASA,GAAO,aAAa,IAG1C,KAAK,MAAQ,GACb,KAAK,SAAW,GACjB,EAEA,OAAQ,CACP,KAAK,KAAO,KACZ,KAAK,MAAQ,GACb,KAAK,gBAAkB,GACvB,KAAK,UAAU,IAAM,CAChB,KAAK,cACR,KAAK,YAAW,CAElB,CAAC,CACF,EAEA,aAAc,CACb,KAAK,KAAO,KACZ,KAAK,MAAQ,GACb,KAAK,OAAS,GACd,MAAMC,EAAS,CAAE,KAAM,KAAK,IAAG,EAC/B,OAAInB,IACHmB,EAAO,WAAa,KAAK,YAEnBC,EACL,IAAIlB,EAAe,CAAE,OAAAiB,CAAK,CAAG,EAC7B,KAAME,GAAa,CACnB,MAAMC,EAAOD,EAAS,KAAK,IAAI,KAC/B,OAAA,KAAK,OAASC,EAAK,QAAU,KAC7B,KAAK,KAAOA,EAAK,KACjB,KAAK,QAAU,GACf,KAAK,OAAS,GACd,KAAK,UAAY,KAAK,gBACf,EACR,CAAC,EACA,MAAOC,IAENA,EAAM,SAAS,KAAK,KACjBA,EAAM,SAAS,KAAK,IAAI,KAAK,OAEhC,KAAK,OAASA,EAAM,SAAS,KAAK,IAAI,KAAK,OAE3C,KAAK,OAAS,KAEf,KAAK,KAAO,KACZ,KAAK,OAAS,GACd,KAAK,MAAQ,GACN,GACP,CACH,EAEA,mBAAoB,CACnB,KAAK,QAAU,EAChB,EAEA,mBAAoB,CACnB,KAAK,QAAU,EAChB,EAEA,qBAAsB,CACrB,OAAO,iBAAiB,UAAW,KAAK,SAAS,CAClD,EAEA,uBAAwB,CACvB,OAAO,oBAAoB,UAAW,KAAK,SAAS,CACrD,EAEA,UAAU,EAAG,CACR,EAAE,MAAQ,QACb,KAAK,SAAW,GAElB,EAEA,cAAcC,EAAM,CACff,EAA2B,SAASe,EAAK,QAAQ,IACpD,KAAK,gBAAkB,KAAK,QAC5B,KAAK,sBAAwB,GAE/B,EAEA,cAAcA,EAAM,CACfA,EAAK,OAAS,KAAK,MAAM,OAC5B,KAAK,sBAAwB,GAE/B,EAEA,cAAcA,EAAM,CACff,EAA2B,SAASe,EAAK,QAAQ,EACpD,KAAK,sBAAwB,GAE7BA,EAAK,SAAW,KAAK,MAAM,IACxBA,EAAK,OAAS,KAAK,MAAM,OAE5B,KAAK,sBAAwB,GAE/B,IAEAhB,EAEF,mFArQQiB,EAAA,kBADPC,EAuBM,MAAA,OArBL,GAAG,iBACF,MAAKC,EAAA,CAAA,MAAWC,EAAA,MAAK,KAAQA,EAAA,SAAS,CAAA,IAE/B,CAAAA,EAAA,SAAWA,EAAA,WADnBC,EAGmCC,EAAA,OADjC,QAAAC,EAAA,QACD,MAAM,yDAEAH,EAAA,YADPC,EAckBG,EAAA,CAXhB,IAAKJ,EAAA,KAAK,KACV,OAAQA,EAAA,KAAK,GACb,aAAcA,EAAA,KAAK,KACnB,WAAAH,EAAA,WACA,KAAMG,EAAA,KAAK,SACX,UAAAA,EAAA,UACA,SAAAA,EAAA,SACD,OAAA,GACA,cAAA,GACC,uBAAOA,EAAA,MAAK,IACZ,QAAOH,EAAA,QACP,OAAMA,EAAA,6GAZCG,EAAA,KAAK" SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors FileName: ./js/SessionList-dSZjzFOD.chunk.mjs SPDXID: SPDXRef-9c7187ff44728ee813fedaae21b4b95c FileChecksum: SHA1: d3ff30bf4ef70533a788490bc8bbbfe1803f767d LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Rob Cresswell SPDX-FileCopyrightText: text developers FileName: ./js/SessionList-dSZjzFOD.chunk.mjs.map SPDXID: SPDXRef-0b9a529639ef1b24911fa77313653caf FileChecksum: SHA1: 10965023c093e1dce17755c87a9ba099e5e4c194 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2022, 2019, 2025, 1000, 2019, 1000 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ShallowRef } from 'vue'\nimport type { OpenData } from '../apis/connect.ts'\nimport type { SyncService } from '../services/SyncService.ts'\nimport type { Session } from '../services/SyncService.ts'\n\nimport {\n\tcomputed,\n\tonMounted,\n\tonUnmounted,\n\treadonly,\n\tref,\n\tshallowRef,\n\twatch,\n} from 'vue'\nimport { COLLABORATOR_DISCONNECT_TIME, isGuest } from '../services/SyncService.ts'\nimport { useConnection } from './useConnection.ts'\n\n/**\n * Get the sessions from the sync service.\n *\n * @param syncService to watch for changes to the sessions.\n */\nexport function useSessions(syncService: SyncService) {\n\tconst { openData } = useConnection() as {\n\t\topenData: ShallowRef\n\t}\n\tconst currentSession = ref(openData.value?.session)\n\tconst sessions = shallowRef([])\n\n\twatch(openData, (val) => {\n\t\tif (val?.session) {\n\t\t\tcurrentSession.value = val.session\n\t\t}\n\t})\n\n\tconst currentGuestSession = computed({\n\t\tget() {\n\t\t\tif (currentSession.value && isGuest(currentSession.value)) {\n\t\t\t\treturn currentSession.value\n\t\t\t}\n\t\t},\n\t\tset(newValue) {\n\t\t\tcurrentSession.value = newValue\n\t\t},\n\t})\n\n\tconst updateSessions = ({ sessions: updated }: { sessions: Session[] }) => {\n\t\tconst cutoff = Date.now() / - COLLABORATOR_DISCONNECT_TIME\n\t\tsessions.value = updated\n\t\t\t.filter((session) => session.lastContact > cutoff)\n\t\t\t.sort((a, b) => b.lastContact - a.lastContact)\n\t\t\t.filter(uniqueUserId)\n\n\t\t// Make sure we get our own session updated\n\t\tconst currentUpdatedSession = sessions.value.find((session) => session.id === currentSession.value?.id)\n\t\tif (currentUpdatedSession) {\n\t\t\tcurrentSession.value = currentUpdatedSession\n\t\t}\n\t}\n\tonMounted(() => {\n\t\tsyncService.bus.on('change', updateSessions)\n\t})\n\tonUnmounted(() => {\n\t\tsyncService.bus.off('change', updateSessions)\n\t})\n\treturn {\n\t\tcurrentGuestSession,\n\t\tcurrentSession: readonly(currentSession),\n\t\tsessions: readonly(sessions),\n\t}\n}\n\n/**\n * Return true for entries with a unique user id or with no user id (Guests).\n *\n * To be used in filter. Will keep the first entry and remove duplicates.\n *\n * @param val the current value\n * @param idx index of the current value\n * @param arr the entire array\n */\nfunction uniqueUserId(val: Session, idx: number, arr: Session[]): boolean {\n\tif (!('userId' in val)) {\n\t\treturn true\n\t}\n\treturn !arr\n\t\t.slice(0, idx)\n\t\t.some((session) => 'userId' in session && session.userId === val.userId)\n}\n","\n\n\n\n\n\n\n"],"names":["_sfc_main","_hoisted_3","_createElementBlock","_mergeProps","_ctx","$props","_cache","$event","_createElementVNode","_openBlock","NcAvatar","AccountOutlineIcon","$options","_createBlock","_component_NcAvatar","_Fragment","_component_AccountOutlineIcon","props","__props","emit","__emit","connection","useConnection","editor","useEditor","updateUser","useEditorMethods","editing","ref","loading","guestName","watch","newName","setGuestName","showError","t","previousGuestName","session","update","e","logger","error","showWarning","_unref","_createVNode","NcInputField","NcButton","CheckIcon","AvatarWrapper","_hoisted_2","_toDisplayString","PencilOutlineIcon","useSessions","syncService","openData","currentSession","sessions","shallowRef","val","currentGuestSession","computed","isGuest","newValue","updateSessions","updated","cutoff","COLLABORATOR_DISCONNECT_TIME","a","b","uniqueUserId","currentUpdatedSession","onMounted","onUnmounted","readonly","idx","arr","AccountMultipleOutlineIcon","GuestNameDialog","NcPopover","isPublic","useEditorFlags","useSyncService","COLLABORATOR_IDLE_TIME","_hoisted_1","_component_NcPopover","_withCtx","attrs","_component_NcButton","_component_AccountMultipleOutlineIcon","_renderList","_component_AvatarWrapper","_renderSlot","_component_GuestNameDialog","$setup","_normalizeStyle","_normalizeClass"],"mappings":"y+BAoBA,MAAKA,GAAU,CACb,KAAM,6BACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,QAER,UAAW,CACT,KAAM,OACN,QAAS,gBAEX,KAAM,CACJ,KAAM,OACN,QAAS,EACX,CACF,CACF,+DAxBYC,GAAA,CAAA,EAAE,wVAAwV,iDAXpWC,EAeO,OAfPC,EAAcC,EAAA,OAAM,CACb,cAAaC,EAAA,MAAK,KAAA,OAClB,aAAYA,EAAA,MACb,MAAM,qDACN,KAAK,MACJ,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEH,EAAA,MAAK,QAAUG,CAAM,WACjCL,EAQM,MAAA,CARA,KAAMG,EAAA,UACP,MAAM,4BACL,MAAOA,EAAA,KACP,OAAQA,EAAA,KACT,QAAQ,cACXG,EAEO,OAFPP,GAEO,CADQI,EAAA,OAAbI,EAAA,EAAAP,EAAuC,aAAhBG,EAAA,KAAK,EAAA,CAAA,6DCO/BL,GAAU,CACb,KAAM,qBACN,MAAO,CAAC,OAAO,EACf,MAAO,CACL,MAAO,CACL,KAAM,QAER,UAAW,CACT,KAAM,OACN,QAAS,gBAEX,KAAM,CACJ,KAAM,OACN,QAAS,EACX,CACF,CACF,+DAxBYC,GAAA,CAAA,EAAE,gRAAgR,iDAX5RC,EAeO,OAfPC,EAAcC,EAAA,OAAM,CACb,cAAaC,EAAA,MAAK,KAAA,OAClB,aAAYA,EAAA,MACb,MAAM,4CACN,KAAK,MACJ,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEH,EAAA,MAAK,QAAUG,CAAM,WACjCL,EAQM,MAAA,CARA,KAAMG,EAAA,UACP,MAAM,4BACL,MAAOA,EAAA,KACP,OAAQA,EAAA,KACT,QAAQ,cACXG,EAEO,OAFPP,GAEO,CADQI,EAAA,OAAbI,EAAA,EAAAP,EAAuC,aAAhBG,EAAA,KAAK,EAAA,CAAA,6DCc/BL,GAAU,CACd,KAAM,gBACN,WAAY,CACX,SAAAU,EACA,mBAAAC,IAGD,MAAO,CACN,QAAS,CACR,KAAM,OACN,SAAU,KAIZ,SAAU,CACT,oBAAqB,CACpB,MAAO,CACN,GAAG,KAAK,uBACR,eAAgB,KAAK,QAAQ,KAC9B,CACD,EAEA,wBAAyB,CACxB,MAAO,CACN,mBAAoB,KAAK,QAAQ,OAC9B,KAAK,QAAQ,MAAQ,cACrB,8BACJ,CACD,EAEA,cAAe,CACd,OAAO,KAAK,QAAQ,YAAc,GAC/B,IACA,KAAK,QAAQ,UAAU,MAAM,EAAG,CAAC,EAAE,YAAW,CAClD,EAEF,sFAzDCT,EAcM,MAAA,CAdD,MAAM,iBAAkB,QAAOU,EAAA,kBAAkB,IAE9CP,EAAA,QAAQ,YADfQ,EAMkBC,EAAA,OAJhB,KAAMT,EAAA,QAAQ,OACd,QAAS,GACV,YAAA,GACA,WAAA,GACA,eAAA,2BACDH,EAKM,MAAA,OALM,MAAM,SAAU,QAAOU,EAAA,sBAAsB,IACxCP,EAAA,QAAQ,eAAxBH,EAEWa,EAAA,CAAA,IAAA,CAAA,EAAA,KADPH,EAAA,YAAY,EAAA,CAAA,aAEhBC,EAA6BG,EAAA,CAAA,IAAA,CAAA,CAAA,0OCwChC,MAAMC,EAAQC,EAMRC,EAAOC,EACP,CAAE,WAAAC,CAAU,EAAKC,EAAa,EAC9B,CAAE,OAAAC,CAAM,EAAKC,EAAS,EACtB,CAAE,WAAAC,CAAU,EAAKC,EAAiBH,CAAM,EACxCI,EAAUC,EAAI,EAAK,EACnBC,EAAUD,EAAI,EAAK,EACnBE,EAAYF,EAAIX,EAAM,QAAQ,SAAS,EAC7Cc,EACC,IAAMd,EAAM,QAAQ,UACnBe,GAAY,CACPL,EAAQ,QACZG,EAAU,MAAQE,EAEpB,CACD,EAIA,eAAeC,GAAe,CAC7B,GAAI,CAACZ,EAAW,MAAO,CACtBa,EAAUC,EAAE,OAAQ,0CAA0C,CAAC,EAC/D,MACD,CACA,MAAMC,EAAoBnB,EAAM,QAAQ,UACxCY,EAAQ,MAAQ,GAChB,GAAI,CACH,MAAMQ,EAAU,MAAMC,EAAOR,EAAU,MAAOT,EAAW,KAAK,EAC9DQ,EAAQ,MAAQ,GAChBF,EAAQ,MAAQ,GAChB,GAAI,CACH,aAAa,QAAQ,OAAQU,EAAQ,SAAS,CAC/C,OAASE,EAAG,CACXC,EAAO,KAAK,+CAAgDD,CAAC,CAC9D,CACApB,EAAK,iBAAkBkB,CAAO,EAC9BZ,EAAWY,CAAO,CACnB,OAASI,EAAO,CACfZ,EAAQ,MAAQ,GAChBW,EAAO,KAAK,+BAAgC,CAAE,MAAAC,CAAK,CAAE,EACrDC,EAAYP,EAAE,OAAQ,kCAAkC,CAAC,EACzDL,EAAU,MAAQM,CACnB,CACD,mBApGClC,EAkCK,KAAA,KAAA,CAhCGyB,EAAA,WADPzB,EAqBO,OAAA,OAnBL,MAAYyC,EAAAR,CAAA,EAAC,OAAA,wDAAA,EAGd,MAAM,oBACL,WAAgBF,EAAY,CAAA,SAAA,CAAA,IAC7BW,EAKqCD,EAAAE,EAAA,EAAA,YAJ3Bf,EAAA,2CAAAA,EAAS,MAAAvB,GAClB,UAAU,KACT,SAAUsB,EAAA,MACV,MAAOc,EAAAR,CAAA,EAAC,OAAA,iBAAA,EACR,YAAaQ,EAAAR,CAAA,EAAC,OAAA,OAAA,2DAChBS,EAOWD,EAAAG,CAAA,EAAA,CANV,QAAQ,UACP,aAAYH,EAAAR,CAAA,EAAC,OAAA,QAAA,EACb,QAAOF,IACG,OACV,IAAwB,CAAxBW,EAAwBG,EAAA,CAAZ,KAAM,EAAE,CAAA,yCAIvB7C,EAUWa,EAAA,CAAA,IAAA,CAAA,EAAA,CATV6B,EAAoCI,EAAA,CAApB,QAAS9B,EAAA,OAAO,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,EAChCV,EAEO,OAFPyC,GAEOC,EADHpB,EAAA,OAAaa,EAAAR,CAAA,EAAC,OAAA,KAAA,CAAA,EAAA,CAAA,EAElBS,EAIWD,EAAAG,CAAA,EAAA,CAJA,aAAYH,EAAAR,CAAA,EAAC,OAAA,MAAA,EAAmB,uBAAOR,EAAA,MAAO,MAC7C,OACV,IAAgC,CAAhCiB,EAAgCO,EAAA,CAAZ,KAAM,EAAE,CAAA,iFCT1B,SAASC,GAAYC,EAA0B,CACrD,KAAM,CAAE,SAAAC,CAAA,EAAahC,EAAA,EAGfiC,EAAiB3B,EAAI0B,EAAS,OAAO,OAAO,EAC5CE,EAAWC,EAAsB,EAAE,EAEzC1B,EAAMuB,EAAWI,GAAQ,CACpBA,GAAK,UACRH,EAAe,MAAQG,EAAI,QAE7B,CAAC,EAED,MAAMC,EAAsBC,EAAS,CACpC,KAAM,CACL,GAAIL,EAAe,OAASM,GAAQN,EAAe,KAAK,EACvD,OAAOA,EAAe,KAExB,EACA,IAAIO,EAAU,CACbP,EAAe,MAAQO,CACxB,CAAA,CACA,EAEKC,EAAiB,CAAC,CAAE,SAAUC,KAAuC,CAC1E,MAAMC,EAAS,KAAK,IAAA,EAAQ,IAAOC,GACnCV,EAAS,MAAQQ,EACf,OAAQ3B,GAAYA,EAAQ,YAAc4B,CAAM,EAChD,KAAK,CAACE,EAAGC,IAAMA,EAAE,YAAcD,EAAE,WAAW,EAC5C,OAAOE,EAAY,EAGrB,MAAMC,EAAwBd,EAAS,MAAM,KAAMnB,GAAYA,EAAQ,KAAOkB,EAAe,OAAO,EAAE,EAClGe,IACHf,EAAe,MAAQe,EAEzB,EACA,OAAAC,EAAU,IAAM,CACflB,EAAY,IAAI,GAAG,SAAUU,CAAc,CAC5C,CAAC,EACDS,EAAY,IAAM,CACjBnB,EAAY,IAAI,IAAI,SAAUU,CAAc,CAC7C,CAAC,EACM,CACN,oBAAAJ,EACA,eAAgBc,EAASlB,CAAc,EACvC,SAAUkB,EAASjB,CAAQ,CAAA,CAE7B,CAWA,SAASa,GAAaX,EAAcgB,EAAaC,EAAyB,CACzE,MAAM,WAAYjB,EAGX,CAACiB,EACN,MAAM,EAAGD,CAAG,EACZ,KAAMrC,GAAY,WAAYA,GAAWA,EAAQ,SAAWqB,EAAI,MAAM,EAJhE,EAKT,CC7BA,MAAK1D,GAAU,CACd,KAAM,cACN,WAAY,CACX,2BAAA4E,GACA,cAAA5B,EACA,gBAAA6B,GACA,SAAA/B,EACA,UAAAgC,GAGD,OAAQ,CACP,KAAM,CAAE,SAAAC,CAAO,EAAMC,GAAc,EAC7B,CAAE,YAAA3B,CAAU,EAAM4B,GAAc,EAChC,CAAE,oBAAAtB,EAAqB,eAAAJ,EAAgB,SAAAC,CAAO,EACjDJ,GAAYC,CAAW,EAC1B,MAAO,CAAE,oBAAAM,EAAqB,eAAAJ,EAAgB,SAAAC,EAAU,SAAAuB,CAAO,CAChE,EAEA,SAAU,CACT,OAAQ,CACP,OAAO5C,EAAE,OAAQ,eAAe,CACjC,EAEA,aAAc,CACb,OAAO,KAAK,oBAAsB,KAAK,eAAiB,KAAK,QAC9D,EAEA,gBAAiB,CAChB,OAAO,KAAK,SAAS,OAAQE,GAAYA,EAAQ,KAAO,KAAK,gBAAgB,EAAE,CAChF,EAEA,qBAAsB,CACrB,OAAO,KAAK,UAAY,KAAK,mBAC9B,EAEA,aAAc,CACb,OAAQA,IACA,CACN,QACCA,EAAQ,YACN,KAAK,IAAG,EAAK,IAAO6C,GACnB,EACA,EACL,EAEF,EAEA,0BAA2B,CAC1B,OAAO,KAAK,eAAe,MAAM,EAAG,CAAC,CACtC,GAGD,QAAS,GACR/C,EACA,uBAAyBE,GACpBA,EAAQ,OACJA,EAAQ,YAGT,GADWA,EAAQ,WAAaF,EAAE,OAAQ,OAAO,CACrC,KAAKA,EAAE,OAAQ,OAAO,CAAC,IAG7C,EAjGQgD,GAAA,CAAA,MAAM,cAAc,2JAvB3BtE,EA2CYuE,EAAA,CA1CV,aAAcxE,EAAA,oBACf,MAAM,eACN,UAAU,WACC,QAAOyE,EACjB,CAeM,CAhBe,MAAAC,KAAK,CAC1B9E,EAeM,MAAA,KAAA,CAdLoC,EAaW2C,EAbXpF,EAaW,CAZT,MAAOS,EAAA,MACP,aAAYA,EAAA,MACb,QAAQ,WACR,MAAM,eACE0E,CAAK,EAAA,CACF,OACV,IAAyC,CAAzC1C,EAAyC4C,EAAA,CAAZ,KAAM,EAAE,CAAA,SACrCtF,EAGsBa,EAAA,KAAA0E,EAFH7E,EAAA,yBAAXyB,QADRxB,EAGsB6E,EAAA,CADpB,IAAKrD,EAAQ,GACb,QAASA,qEAKJ,UACV,IAkBM,CAlBN7B,EAkBM,MAlBN2E,GAkBM,CAjBLQ,EAAyBvF,EAAA,OAAA,YAAA,CAAA,EAAA,OAAA,EAAA,EACzBI,EAeK,KAAA,KAAA,CAbGI,EAAA,yBADPC,EAEyC+E,EAAA,OAAhC,QAASC,EAAA,sDAAAA,EAAA,oBAAmBtF,yCACrCL,EAUKa,EAAA,KAAA0E,EATc7E,EAAA,YAAXyB,QADRnC,EAUK,KAAA,CARH,IAAKmC,EAAQ,GACb,MAAKyD,EAAElF,EAAA,YAAYyB,CAAO,CAAA,IAC3BO,EAAoC8C,EAAA,CAApB,QAASrD,CAAO,EAAA,KAAA,EAAA,CAAA,SAAA,CAAA,EAChC7B,EAIO,OAAA,CAHN,MAAKuF,EAAA,CAAC,gBAAe,CACZ1D,EAAQ,QAAM,OAAA,CAAA,CACpB,EAAAa,EAAAtC,EAAA,uBAAuByB,CAAO,CAAA,EAAA,CAAA","x_google_ignoreList":[0,1] FileName: ./js/UserColor-vxAIO1AP.chunk.mjs SPDXID: SPDXRef-05ac0c2dc441c73b59f800cc018ef359 FileChecksum: SHA1: 19faee0dc21703ed4cb1d18fbc9e4ac9334f9e7f LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: AGPL-3.0-or-later LicenseInfoInFile: Apache-2.0 LicenseInfoInFile: BSD-2-Clause LicenseInfoInFile: BSD-3-Clause LicenseInfoInFile: MIT FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: @tiptap/core developers SPDX-FileCopyrightText: @tiptap/extension-blockquote developers SPDX-FileCopyrightText: @tiptap/extension-bold developers SPDX-FileCopyrightText: @tiptap/extension-code developers SPDX-FileCopyrightText: @tiptap/extension-code-block developers SPDX-FileCopyrightText: @tiptap/extension-code-block-lowlight developers SPDX-FileCopyrightText: @tiptap/extension-collaboration developers SPDX-FileCopyrightText: @tiptap/extension-collaboration-caret developers SPDX-FileCopyrightText: @tiptap/extension-document developers SPDX-FileCopyrightText: @tiptap/extension-drag-handle developers SPDX-FileCopyrightText: @tiptap/extension-drag-handle-vue-3 developers SPDX-FileCopyrightText: @tiptap/extension-hard-break developers SPDX-FileCopyrightText: @tiptap/extension-heading developers SPDX-FileCopyrightText: @tiptap/extension-highlight developers SPDX-FileCopyrightText: @tiptap/extension-horizontal-rule developers SPDX-FileCopyrightText: @tiptap/extension-image developers SPDX-FileCopyrightText: @tiptap/extension-italic developers SPDX-FileCopyrightText: @tiptap/extension-link developers SPDX-FileCopyrightText: @tiptap/extension-list developers SPDX-FileCopyrightText: @tiptap/extension-mathematics developers SPDX-FileCopyrightText: @tiptap/extension-mention developers SPDX-FileCopyrightText: @tiptap/extension-node-range developers SPDX-FileCopyrightText: @tiptap/extension-paragraph developers SPDX-FileCopyrightText: @tiptap/extension-placeholder developers SPDX-FileCopyrightText: @tiptap/extension-strike developers SPDX-FileCopyrightText: @tiptap/extension-table developers SPDX-FileCopyrightText: @tiptap/extension-text developers SPDX-FileCopyrightText: @tiptap/extension-typography developers SPDX-FileCopyrightText: @tiptap/extension-underline developers SPDX-FileCopyrightText: @tiptap/extensions developers SPDX-FileCopyrightText: @tiptap/suggestion developers SPDX-FileCopyrightText: @tiptap/vue-3 developers SPDX-FileCopyrightText: @tiptap/y-tiptap developers SPDX-FileCopyrightText: Antonio Laguna SPDX-FileCopyrightText: Arnout Kazemier SPDX-FileCopyrightText: Eduardo San Martin Morote SPDX-FileCopyrightText: Eric Norris (https://github.com/ericnorris) SPDX-FileCopyrightText: Federico Zivolo SPDX-FileCopyrightText: Felix Boehm SPDX-FileCopyrightText: Jacob Clevenger SPDX-FileCopyrightText: Jordan Humphreys SPDX-FileCopyrightText: Josh Goebel SPDX-FileCopyrightText: Kevin Jahns SPDX-FileCopyrightText: Kevin Jahns SPDX-FileCopyrightText: Marijn Haverbeke SPDX-FileCopyrightText: Mathias Bynens SPDX-FileCopyrightText: Mr.Hope SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: Nick Frasser (https://nfrasser.com) SPDX-FileCopyrightText: ParkSB SPDX-FileCopyrightText: Rob Cresswell SPDX-FileCopyrightText: Titus Wormer (https://wooorm.com) SPDX-FileCopyrightText: Tristan Pemble SPDX-FileCopyrightText: atomiks SPDX-FileCopyrightText: dodo (https://github.com/dodo) SPDX-FileCopyrightText: katex developers SPDX-FileCopyrightText: linkify-it developers SPDX-FileCopyrightText: markdown-it developers SPDX-FileCopyrightText: markdown-it-container developers SPDX-FileCopyrightText: markdown-it-footnote developers SPDX-FileCopyrightText: markdown-it-mark developers SPDX-FileCopyrightText: mdurl developers SPDX-FileCopyrightText: mitt developers SPDX-FileCopyrightText: omahlama SPDX-FileCopyrightText: prosemirror-commands developers SPDX-FileCopyrightText: prosemirror-dropcursor developers SPDX-FileCopyrightText: prosemirror-gapcursor developers SPDX-FileCopyrightText: prosemirror-history developers SPDX-FileCopyrightText: prosemirror-keymap developers SPDX-FileCopyrightText: prosemirror-markdown developers SPDX-FileCopyrightText: prosemirror-model developers SPDX-FileCopyrightText: prosemirror-schema-list developers SPDX-FileCopyrightText: prosemirror-state developers SPDX-FileCopyrightText: prosemirror-tables developers SPDX-FileCopyrightText: prosemirror-transform developers SPDX-FileCopyrightText: prosemirror-view developers SPDX-FileCopyrightText: redbug312 SPDX-FileCopyrightText: text developers SPDX-FileCopyrightText: ts-md5 developers SPDX-FileCopyrightText: uc.micro developers SPDX-FileCopyrightText: uuid developers FileName: ./js/UserColor-vxAIO1AP.chunk.mjs.map SPDXID: SPDXRef-7ec61ff388223bd78d1621ec9ef58fcf FileChecksum: SHA1: 96ca7dd51ccf4e86db5cc2ac9f2d813b536421a5 LicenseConcluded: NOASSERTION LicenseInfoInFile: AGPL-3.0-or-later FileCopyrightText: SPDX-FileCopyrightText: 2019-2025 Nextcloud GmbH and Nextcloud contributors SPDX-FileCopyrightText: 2020, 1032 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst gtBuilder = getGettextBuilder().detectLanguage();\nconst gt = gtBuilder.build();\ngt.ngettext.bind(gt);\nconst t = gt.gettext.bind(gt);\nconst _hoisted_1 = [\"accept\", \"multiple\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFilePicker\",\n props: {\n accept: { default: void 0 },\n actionCaption: { default: \"\" },\n actions: { default: () => [] },\n directory: { type: Boolean },\n directoryOnly: { type: Boolean },\n disabled: { type: Boolean },\n iconOnly: { type: Boolean },\n label: { default: void 0 },\n loading: { type: Boolean },\n multiple: { type: Boolean },\n variant: { default: \"primary\" }\n },\n emits: [\"pick\"],\n setup(__props, { expose: __expose, emit: __emit }) {\n const props = __props;\n const emit = __emit;\n __expose({\n reset\n });\n const formElement = useTemplateRef(\"form\");\n const inputElement = useTemplateRef(\"input\");\n const currentLabel = computed(() => {\n if (props.loading) {\n return t(\"Uploading …\");\n } else if (props.label) {\n return props.label;\n } else if (props.directoryOnly) {\n return t(\"Pick folder\");\n }\n return props.multiple ? t(\"Pick files\") : t(\"Pick file\");\n });\n const canUploadFolders = computed(() => {\n return (props.directory || props.directoryOnly) && \"webkitdirectory\" in HTMLInputElement.prototype;\n });\n function triggerPickFiles(uploadFolders) {\n reset();\n if (canUploadFolders.value) {\n inputElement.value.webkitdirectory = uploadFolders;\n }\n nextTick(() => inputElement.value.click());\n }\n function onPick() {\n const files = inputElement.value?.files ? Array.from(inputElement.value.files) : [];\n emit(\"pick\", files);\n }\n function reset() {\n formElement.value.reset();\n }\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"form\", {\n ref: \"form\",\n class: normalizeClass(_ctx.$style.filePicker)\n }, [\n createVNode(NcActions, {\n \"aria-label\": currentLabel.value,\n disabled: __props.disabled || __props.loading,\n menuName: __props.iconOnly ? void 0 : currentLabel.value,\n forceName: !__props.iconOnly,\n variant: __props.variant\n }, {\n icon: withCtx(() => [\n !__props.loading ? renderSlot(_ctx.$slots, \"icon\", { key: 0 }, () => [\n createVNode(IconPlus, { size: 20 })\n ]) : (openBlock(), createBlock(NcLoadingIcon, { key: 1 }))\n ]),\n default: withCtx(() => [\n __props.actionCaption ? (openBlock(), createBlock(NcActionCaption, {\n key: 0,\n name: __props.actionCaption\n }, null, 8, [\"name\"])) : createCommentVNode(\"\", true),\n !__props.directoryOnly ? (openBlock(), createBlock(NcActionButton, {\n key: 1,\n closeAfterClick: \"\",\n onClick: _cache[0] || (_cache[0] = ($event) => triggerPickFiles(false))\n }, {\n icon: withCtx(() => [\n createVNode(IconUpload, { size: 20 })\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(canUploadFolders.value || _ctx.$slots.actions ? __props.multiple ? unref(t)(\"Upload files\") : unref(t)(\"Upload file\") : currentLabel.value), 1)\n ]),\n _: 1\n })) : createCommentVNode(\"\", true),\n canUploadFolders.value ? (openBlock(), createBlock(NcActionButton, {\n key: 2,\n closeAfterClick: \"\",\n onClick: _cache[1] || (_cache[1] = ($event) => triggerPickFiles(true))\n }, {\n icon: withCtx(() => [\n createVNode(IconFolderUpload, {\n style: { \"color\": \"var(--color-primary-element)\" },\n size: 20\n })\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(!__props.directoryOnly || _ctx.$slots.actions ? unref(t)(\"Upload folder\") : currentLabel.value), 1)\n ]),\n _: 1\n })) : createCommentVNode(\"\", true),\n (openBlock(true), createElementBlock(Fragment, null, renderList(__props.actions, (group) => {\n return openBlock(), createElementBlock(Fragment, null, [\n group.caption ? (openBlock(), createBlock(NcActionCaption, {\n key: group.caption,\n name: group.caption\n }, null, 8, [\"name\"])) : createCommentVNode(\"\", true),\n (openBlock(true), createElementBlock(Fragment, null, renderList(group.actions ?? [group], (action) => {\n return openBlock(), createBlock(NcActionButton, {\n key: action.label,\n closeAfterClick: \"\",\n onClick: action.onClick\n }, {\n icon: withCtx(() => [\n createVNode(NcIconSvgWrapper, {\n svg: action.iconSvg\n }, null, 8, [\"svg\"])\n ]),\n default: withCtx(() => [\n createTextVNode(\" \" + toDisplayString(action.label), 1)\n ]),\n _: 2\n }, [\"onClick\"]);\n }), 128))\n ], 64);\n }), 256))\n ]),\n _: 3\n }, 8, [\"aria-label\", \"disabled\", \"menuName\", \"forceName\", \"variant\"]),\n createElementVNode(\"input\", {\n ref: \"input\",\n accept: __props.accept?.join(\", \"),\n \"aria-hidden\": \"true\",\n class: \"hidden-visually\",\n multiple: __props.multiple,\n type: \"file\",\n onChange: onPick\n }, null, 40, _hoisted_1),\n renderSlot(_ctx.$slots, \"default\")\n ], 2);\n };\n }\n});\nconst filePicker = \"_filePicker_Unq7q\";\nconst style0 = {\n filePicker\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFilePicker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFilePicker as N\n};\n//# sourceMappingURL=NcFilePicker-bD2toutn.mjs.map\n","if (!Array.prototype.find) {\n Array.prototype.find = function(predicate) {\n if (this === null) {\n throw new TypeError('Array.prototype.find called on null or undefined')\n }\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function')\n }\n var list = Object(this);\n var length = list.length >>> 0;\n var thisArg = arguments[1];\n var value;\n\n for (var i = 0; i < length; i++) {\n value = list[i];\n if (predicate.call(thisArg, value, i, list)) {\n return value\n }\n }\n return undefined\n };\n}\n\nif (window && typeof window.CustomEvent !== \"function\") {\n function CustomEvent$1(event, params) {\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt\n }\n\n if (typeof window.Event !== 'undefined') {\n CustomEvent$1.prototype = window.Event.prototype;\n }\n\n window.CustomEvent = CustomEvent$1;\n}\n\nclass TributeEvents {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.events = this;\n }\n\n static keys() {\n return [\n {\n key: 9,\n value: \"TAB\"\n },\n {\n key: 8,\n value: \"DELETE\"\n },\n {\n key: 13,\n value: \"ENTER\"\n },\n {\n key: 27,\n value: \"ESCAPE\"\n },\n {\n key: 32,\n value: \"SPACE\"\n },\n {\n key: 38,\n value: \"UP\"\n },\n {\n key: 40,\n value: \"DOWN\"\n }\n ];\n }\n\n bind(element) {\n element.boundKeydown = this.keydown.bind(element, this);\n element.boundKeyup = this.keyup.bind(element, this);\n element.boundInput = this.input.bind(element, this);\n\n element.addEventListener(\"keydown\", element.boundKeydown, false);\n element.addEventListener(\"keyup\", element.boundKeyup, false);\n element.addEventListener(\"input\", element.boundInput, false);\n }\n\n unbind(element) {\n element.removeEventListener(\"keydown\", element.boundKeydown, false);\n element.removeEventListener(\"keyup\", element.boundKeyup, false);\n element.removeEventListener(\"input\", element.boundInput, false);\n\n delete element.boundKeydown;\n delete element.boundKeyup;\n delete element.boundInput;\n }\n\n keydown(instance, event) {\n if (instance.shouldDeactivate(event)) {\n instance.tribute.isActive = false;\n instance.tribute.hideMenu();\n }\n\n let element = this;\n instance.commandEvent = false;\n\n TributeEvents.keys().forEach(o => {\n if (o.key === event.keyCode) {\n instance.commandEvent = true;\n instance.callbacks()[o.value.toLowerCase()](event, element);\n }\n });\n }\n\n input(instance, event) {\n instance.inputEvent = true;\n instance.keyup.call(this, instance, event);\n }\n\n click(instance, event) {\n let tribute = instance.tribute;\n if (tribute.menu && tribute.menu.contains(event.target)) {\n let li = event.target;\n event.preventDefault();\n event.stopPropagation();\n while (li.nodeName.toLowerCase() !== \"li\") {\n li = li.parentNode;\n if (!li || li === tribute.menu) {\n throw new Error(\"cannot find the
  • container for the click\");\n }\n }\n tribute.selectItemAtIndex(li.getAttribute(\"data-index\"), event);\n tribute.hideMenu();\n\n // TODO: should fire with externalTrigger and target is outside of menu\n } else if (tribute.current.element && !tribute.current.externalTrigger) {\n tribute.current.externalTrigger = false;\n setTimeout(() => tribute.hideMenu());\n }\n }\n\n keyup(instance, event) {\n if (instance.inputEvent) {\n instance.inputEvent = false;\n }\n instance.updateSelection(this);\n\n if (event.keyCode === 27) return;\n\n if (!instance.tribute.allowSpaces && instance.tribute.hasTrailingSpace) {\n instance.tribute.hasTrailingSpace = false;\n instance.commandEvent = true;\n instance.callbacks()[\"space\"](event, this);\n return;\n }\n\n if (!instance.tribute.isActive) {\n if (instance.tribute.autocompleteMode) {\n instance.callbacks().triggerChar(event, this, \"\");\n } else {\n let keyCode = instance.getKeyCode(instance, this, event);\n\n if (isNaN(keyCode) || !keyCode) return;\n\n let trigger = instance.tribute.triggers().find(trigger => {\n return trigger.charCodeAt(0) === keyCode;\n });\n\n if (typeof trigger !== \"undefined\") {\n instance.callbacks().triggerChar(event, this, trigger);\n }\n }\n }\n\n if (\n instance.tribute.current.mentionText.length <\n instance.tribute.current.collection.menuShowMinLength\n ) {\n return;\n }\n\n if (\n ((instance.tribute.current.trigger ||\n instance.tribute.autocompleteMode) &&\n instance.commandEvent === false) ||\n (instance.tribute.isActive && event.keyCode === 8)\n ) {\n instance.tribute.showMenuFor(this, true);\n }\n }\n\n shouldDeactivate(event) {\n if (!this.tribute.isActive) return false;\n\n if (this.tribute.current.mentionText.length === 0) {\n let eventKeyPressed = false;\n TributeEvents.keys().forEach(o => {\n if (event.keyCode === o.key) eventKeyPressed = true;\n });\n\n return !eventKeyPressed;\n }\n\n return false;\n }\n\n getKeyCode(instance, el, event) {\n let tribute = instance.tribute;\n let info = tribute.range.getTriggerInfo(\n false,\n tribute.hasTrailingSpace,\n true,\n tribute.allowSpaces,\n tribute.autocompleteMode\n );\n\n if (info) {\n return info.mentionTriggerChar.charCodeAt(0);\n } else {\n return false;\n }\n }\n\n updateSelection(el) {\n this.tribute.current.element = el;\n let info = this.tribute.range.getTriggerInfo(\n false,\n this.tribute.hasTrailingSpace,\n true,\n this.tribute.allowSpaces,\n this.tribute.autocompleteMode\n );\n\n if (info) {\n this.tribute.current.selectedPath = info.mentionSelectedPath;\n this.tribute.current.mentionText = info.mentionText;\n this.tribute.current.selectedOffset = info.mentionSelectedOffset;\n }\n }\n\n callbacks() {\n return {\n triggerChar: (e, el, trigger) => {\n let tribute = this.tribute;\n tribute.current.trigger = trigger;\n\n let collectionItem = tribute.collection.find(item => {\n return item.trigger === trigger;\n });\n\n tribute.current.collection = collectionItem;\n\n if (\n tribute.current.mentionText.length >=\n tribute.current.collection.menuShowMinLength &&\n tribute.inputEvent\n ) {\n tribute.showMenuFor(el, true);\n }\n },\n enter: (e, el) => {\n // choose selection\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n this.tribute.selectItemAtIndex(this.tribute.menuSelected, e);\n this.tribute.hideMenu();\n }, 0);\n }\n },\n escape: (e, el) => {\n if (this.tribute.isActive) {\n e.preventDefault();\n e.stopPropagation();\n this.tribute.isActive = false;\n this.tribute.hideMenu();\n }\n },\n tab: (e, el) => {\n // choose first match\n this.callbacks().enter(e, el);\n },\n space: (e, el) => {\n if (this.tribute.isActive) {\n if (this.tribute.spaceSelectsMatch) {\n this.callbacks().enter(e, el);\n } else if (!this.tribute.allowSpaces) {\n e.stopPropagation();\n setTimeout(() => {\n this.tribute.hideMenu();\n this.tribute.isActive = false;\n }, 0);\n }\n }\n },\n up: (e, el) => {\n // navigate up ul\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n let count = this.tribute.current.filteredItems.length,\n selected = this.tribute.menuSelected;\n\n if (count > selected && selected > 0) {\n this.tribute.menuSelected--;\n this.setActiveLi();\n } else if (selected === 0) {\n this.tribute.menuSelected = count - 1;\n this.setActiveLi();\n this.tribute.menu.scrollTop = this.tribute.menu.scrollHeight;\n }\n }\n },\n down: (e, el) => {\n // navigate down ul\n if (this.tribute.isActive && this.tribute.current.filteredItems) {\n e.preventDefault();\n e.stopPropagation();\n let count = this.tribute.current.filteredItems.length - 1,\n selected = this.tribute.menuSelected;\n\n if (count > selected) {\n this.tribute.menuSelected++;\n this.setActiveLi();\n } else if (count === selected) {\n this.tribute.menuSelected = 0;\n this.setActiveLi();\n this.tribute.menu.scrollTop = 0;\n }\n }\n },\n delete: (e, el) => {\n if (\n this.tribute.isActive &&\n this.tribute.current.mentionText.length < 1\n ) {\n this.tribute.hideMenu();\n } else if (this.tribute.isActive) {\n this.tribute.showMenuFor(el);\n }\n }\n };\n }\n\n setActiveLi(index) {\n let lis = this.tribute.menu.querySelectorAll(\"li\"),\n length = lis.length >>> 0;\n\n if (index) this.tribute.menuSelected = parseInt(index);\n\n for (let i = 0; i < length; i++) {\n let li = lis[i];\n if (i === this.tribute.menuSelected) {\n li.classList.add(this.tribute.current.collection.selectClass);\n\n let liClientRect = li.getBoundingClientRect();\n let menuClientRect = this.tribute.menu.getBoundingClientRect();\n\n if (liClientRect.bottom > menuClientRect.bottom) {\n let scrollDistance = liClientRect.bottom - menuClientRect.bottom;\n this.tribute.menu.scrollTop += scrollDistance;\n } else if (liClientRect.top < menuClientRect.top) {\n let scrollDistance = menuClientRect.top - liClientRect.top;\n this.tribute.menu.scrollTop -= scrollDistance;\n }\n } else {\n li.classList.remove(this.tribute.current.collection.selectClass);\n }\n }\n }\n\n getFullHeight(elem, includeMargin) {\n let height = elem.getBoundingClientRect().height;\n\n if (includeMargin) {\n let style = elem.currentStyle || window.getComputedStyle(elem);\n return (\n height + parseFloat(style.marginTop) + parseFloat(style.marginBottom)\n );\n }\n\n return height;\n }\n}\n\nclass TributeMenuEvents {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.menuEvents = this;\n this.menu = this.tribute.menu;\n }\n\n bind(menu) {\n this.menuClickEvent = this.tribute.events.click.bind(null, this);\n this.menuContainerScrollEvent = this.debounce(\n () => {\n if (this.tribute.isActive) {\n this.tribute.showMenuFor(this.tribute.current.element, false);\n }\n },\n 300,\n false\n );\n this.windowResizeEvent = this.debounce(\n () => {\n if (this.tribute.isActive) {\n this.tribute.range.positionMenuAtCaret(true);\n }\n },\n 300,\n false\n );\n\n // fixes IE11 issues with mousedown\n this.tribute.range\n .getDocument()\n .addEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n this.tribute.range\n .getDocument()\n .addEventListener(\"mousedown\", this.menuClickEvent, false);\n window.addEventListener(\"resize\", this.windowResizeEvent);\n\n if (this.menuContainer) {\n this.menuContainer.addEventListener(\n \"scroll\",\n this.menuContainerScrollEvent,\n false\n );\n } else {\n window.addEventListener(\"scroll\", this.menuContainerScrollEvent);\n }\n }\n\n unbind(menu) {\n this.tribute.range\n .getDocument()\n .removeEventListener(\"mousedown\", this.menuClickEvent, false);\n this.tribute.range\n .getDocument()\n .removeEventListener(\"MSPointerDown\", this.menuClickEvent, false);\n window.removeEventListener(\"resize\", this.windowResizeEvent);\n\n if (this.menuContainer) {\n this.menuContainer.removeEventListener(\n \"scroll\",\n this.menuContainerScrollEvent,\n false\n );\n } else {\n window.removeEventListener(\"scroll\", this.menuContainerScrollEvent);\n }\n }\n\n debounce(func, wait, immediate) {\n var timeout;\n return () => {\n var context = this,\n args = arguments;\n var later = () => {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n }\n}\n\n// Thanks to https://github.com/jeff-collins/ment.io\n\nclass TributeRange {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.range = this;\n }\n\n getDocument() {\n let iframe;\n if (this.tribute.current.collection) {\n iframe = this.tribute.current.collection.iframe;\n }\n\n if (!iframe) {\n return document\n }\n\n return iframe.contentWindow.document\n }\n\n positionMenuAtCaret(scrollTo) {\n let context = this.tribute.current,\n coordinates;\n\n let info = this.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n if (typeof info !== 'undefined') {\n\n if(!this.tribute.positionMenu){\n this.tribute.menu.style.cssText = `display: block;`;\n return\n }\n\n if (!this.isContentEditable(context.element)) {\n coordinates = this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element,\n info.mentionPosition);\n }\n else {\n coordinates = this.getContentEditableCaretPosition(info.mentionPosition);\n }\n\n this.tribute.menu.style.cssText = `top: ${coordinates.top}px;\n left: ${coordinates.left}px;\n right: ${coordinates.right}px;\n bottom: ${coordinates.bottom}px;\n position: absolute;\n display: block;`;\n\n if (coordinates.left === 'auto') {\n this.tribute.menu.style.left = 'auto';\n }\n\n if (coordinates.top === 'auto') {\n this.tribute.menu.style.top = 'auto';\n }\n\n if (scrollTo) this.scrollIntoView();\n\n window.setTimeout(() => {\n let menuDimensions = {\n width: this.tribute.menu.offsetWidth,\n height: this.tribute.menu.offsetHeight\n };\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n let menuIsOffScreenHorizontally = window.innerWidth > menuDimensions.width && (menuIsOffScreen.left || menuIsOffScreen.right);\n let menuIsOffScreenVertically = window.innerHeight > menuDimensions.height && (menuIsOffScreen.top || menuIsOffScreen.bottom);\n if (menuIsOffScreenHorizontally || menuIsOffScreenVertically) {\n this.tribute.menu.style.cssText = 'display: none';\n this.positionMenuAtCaret(scrollTo);\n }\n }, 0);\n\n } else {\n this.tribute.menu.style.cssText = 'display: none';\n }\n }\n\n get menuContainerIsBody() {\n return this.tribute.menuContainer === document.body || !this.tribute.menuContainer;\n }\n\n\n selectElement(targetElement, path, offset) {\n let range;\n let elem = targetElement;\n\n if (path) {\n for (var i = 0; i < path.length; i++) {\n elem = elem.childNodes[path[i]];\n if (elem === undefined) {\n return\n }\n while (elem.length < offset) {\n offset -= elem.length;\n elem = elem.nextSibling;\n }\n if (elem.childNodes.length === 0 && !elem.length) {\n elem = elem.previousSibling;\n }\n }\n }\n let sel = this.getWindowSelection();\n\n range = this.getDocument().createRange();\n range.setStart(elem, offset);\n range.setEnd(elem, offset);\n range.collapse(true);\n\n try {\n sel.removeAllRanges();\n } catch (error) {}\n\n sel.addRange(range);\n targetElement.focus();\n }\n\n replaceTriggerText(text, requireLeadingSpace, hasTrailingSpace, originalEvent, item) {\n let info = this.getTriggerInfo(true, hasTrailingSpace, requireLeadingSpace, this.tribute.allowSpaces, this.tribute.autocompleteMode);\n\n if (info !== undefined) {\n let context = this.tribute.current;\n let replaceEvent = new CustomEvent('tribute-replaced', {\n detail: {\n item: item,\n instance: context,\n context: info,\n event: originalEvent,\n }\n });\n\n if (!this.isContentEditable(context.element)) {\n let myField = this.tribute.current.element;\n let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n ? this.tribute.replaceTextSuffix\n : ' ';\n text += textSuffix;\n let startPos = info.mentionPosition;\n let endPos = info.mentionPosition + info.mentionText.length + textSuffix.length;\n if (!this.tribute.autocompleteMode) {\n endPos += info.mentionTriggerChar.length - 1;\n }\n myField.value = myField.value.substring(0, startPos) + text +\n myField.value.substring(endPos, myField.value.length);\n myField.selectionStart = startPos + text.length;\n myField.selectionEnd = startPos + text.length;\n } else {\n // add a space to the end of the pasted text\n let textSuffix = typeof this.tribute.replaceTextSuffix == 'string'\n ? this.tribute.replaceTextSuffix\n : '\\xA0';\n text += textSuffix;\n let endPos = info.mentionPosition + info.mentionText.length;\n if (!this.tribute.autocompleteMode) {\n endPos += info.mentionTriggerChar.length;\n }\n this.pasteHtml(text, info.mentionPosition, endPos);\n }\n\n context.element.dispatchEvent(new CustomEvent('input', { bubbles: true }));\n context.element.dispatchEvent(replaceEvent);\n }\n }\n\n pasteHtml(html, startPos, endPos) {\n let range, sel;\n sel = this.getWindowSelection();\n range = this.getDocument().createRange();\n range.setStart(sel.anchorNode, startPos);\n range.setEnd(sel.anchorNode, endPos);\n range.deleteContents();\n\n let el = this.getDocument().createElement('div');\n el.innerHTML = html;\n let frag = this.getDocument().createDocumentFragment(),\n node, lastNode;\n while ((node = el.firstChild)) {\n lastNode = frag.appendChild(node);\n }\n range.insertNode(frag);\n\n // Preserve the selection\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n\n getWindowSelection() {\n if (this.tribute.collection.iframe) {\n return this.tribute.collection.iframe.contentWindow.getSelection()\n }\n\n return window.getSelection()\n }\n\n getNodePositionInParent(element) {\n if (element.parentNode === null) {\n return 0\n }\n\n for (var i = 0; i < element.parentNode.childNodes.length; i++) {\n let node = element.parentNode.childNodes[i];\n\n if (node === element) {\n return i\n }\n }\n }\n\n getContentEditableSelectedPath(ctx) {\n let sel = this.getWindowSelection();\n let selected = sel.anchorNode;\n let path = [];\n let offset;\n\n if (selected != null) {\n let i;\n let ce = selected.contentEditable;\n while (selected !== null && ce !== 'true') {\n i = this.getNodePositionInParent(selected);\n path.push(i);\n selected = selected.parentNode;\n if (selected !== null) {\n ce = selected.contentEditable;\n }\n }\n path.reverse();\n\n // getRangeAt may not exist, need alternative\n offset = sel.getRangeAt(0).startOffset;\n\n return {\n selected: selected,\n path: path,\n offset: offset\n }\n }\n }\n\n getTextPrecedingCurrentSelection() {\n let context = this.tribute.current,\n text = '';\n\n if (!this.isContentEditable(context.element)) {\n let textComponent = this.tribute.current.element;\n if (textComponent) {\n let startPos = textComponent.selectionStart;\n if (textComponent.value && startPos >= 0) {\n text = textComponent.value.substring(0, startPos);\n }\n }\n\n } else {\n let selectedElem = this.getWindowSelection().anchorNode;\n\n if (selectedElem != null) {\n let workingNodeContent = selectedElem.textContent;\n let selectStartOffset = this.getWindowSelection().getRangeAt(0).startOffset;\n\n if (workingNodeContent && selectStartOffset >= 0) {\n text = workingNodeContent.substring(0, selectStartOffset);\n }\n }\n }\n\n return text\n }\n\n getLastWordInText(text) {\n text = text.replace(/\\u00A0/g, ' '); // https://stackoverflow.com/questions/29850407/how-do-i-replace-unicode-character-u00a0-with-a-space-in-javascript\n let wordsArray = text.split(/\\s+/);\n let worldsCount = wordsArray.length - 1;\n return wordsArray[worldsCount].trim()\n }\n\n getTriggerInfo(menuAlreadyActive, hasTrailingSpace, requireLeadingSpace, allowSpaces, isAutocomplete) {\n let ctx = this.tribute.current;\n let selected, path, offset;\n\n if (!this.isContentEditable(ctx.element)) {\n selected = this.tribute.current.element;\n } else {\n let selectionInfo = this.getContentEditableSelectedPath(ctx);\n\n if (selectionInfo) {\n selected = selectionInfo.selected;\n path = selectionInfo.path;\n offset = selectionInfo.offset;\n }\n }\n\n let effectiveRange = this.getTextPrecedingCurrentSelection();\n let lastWordOfEffectiveRange = this.getLastWordInText(effectiveRange);\n\n if (isAutocomplete) {\n return {\n mentionPosition: effectiveRange.length - lastWordOfEffectiveRange.length,\n mentionText: lastWordOfEffectiveRange,\n mentionSelectedElement: selected,\n mentionSelectedPath: path,\n mentionSelectedOffset: offset\n }\n }\n\n if (effectiveRange !== undefined && effectiveRange !== null) {\n let mostRecentTriggerCharPos = -1;\n let triggerChar;\n\n this.tribute.collection.forEach(config => {\n let c = config.trigger;\n let idx = config.requireLeadingSpace ?\n this.lastIndexWithLeadingSpace(effectiveRange, c) :\n effectiveRange.lastIndexOf(c);\n\n if (idx > mostRecentTriggerCharPos) {\n mostRecentTriggerCharPos = idx;\n triggerChar = c;\n requireLeadingSpace = config.requireLeadingSpace;\n }\n });\n\n if (mostRecentTriggerCharPos >= 0 &&\n (\n mostRecentTriggerCharPos === 0 ||\n !requireLeadingSpace ||\n /[\\xA0\\s]/g.test(\n effectiveRange.substring(\n mostRecentTriggerCharPos - 1,\n mostRecentTriggerCharPos)\n )\n )\n ) {\n let currentTriggerSnippet = effectiveRange.substring(mostRecentTriggerCharPos + triggerChar.length,\n effectiveRange.length);\n\n triggerChar = effectiveRange.substring(mostRecentTriggerCharPos, mostRecentTriggerCharPos + triggerChar.length);\n let firstSnippetChar = currentTriggerSnippet.substring(0, 1);\n let leadingSpace = currentTriggerSnippet.length > 0 &&\n (\n firstSnippetChar === ' ' ||\n firstSnippetChar === '\\xA0'\n );\n if (hasTrailingSpace) {\n currentTriggerSnippet = currentTriggerSnippet.trim();\n }\n\n let regex = allowSpaces ? /[^\\S ]/g : /[\\xA0\\s]/g;\n\n this.tribute.hasTrailingSpace = regex.test(currentTriggerSnippet);\n\n if (!leadingSpace && (menuAlreadyActive || !(regex.test(currentTriggerSnippet)))) {\n return {\n mentionPosition: mostRecentTriggerCharPos,\n mentionText: currentTriggerSnippet,\n mentionSelectedElement: selected,\n mentionSelectedPath: path,\n mentionSelectedOffset: offset,\n mentionTriggerChar: triggerChar\n }\n }\n }\n }\n }\n\n lastIndexWithLeadingSpace (str, trigger) {\n let reversedStr = str.split('').reverse().join('');\n let index = -1;\n\n for (let cidx = 0, len = str.length; cidx < len; cidx++) {\n let firstChar = cidx === str.length - 1;\n let leadingSpace = /\\s/.test(reversedStr[cidx + 1]);\n\n let match = true;\n for (let triggerIdx = trigger.length - 1; triggerIdx >= 0; triggerIdx--) {\n if (trigger[triggerIdx] !== reversedStr[cidx-triggerIdx]) {\n match = false;\n break\n }\n }\n\n if (match && (firstChar || leadingSpace)) {\n index = str.length - 1 - cidx;\n break\n }\n }\n\n return index\n }\n\n isContentEditable(element) {\n return element.nodeName !== 'INPUT' && element.nodeName !== 'TEXTAREA'\n }\n\n isMenuOffScreen(coordinates, menuDimensions) {\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let menuTop = typeof coordinates.top === 'number' ? coordinates.top : windowTop + windowHeight - coordinates.bottom - menuDimensions.height;\n let menuRight = typeof coordinates.right === 'number' ? coordinates.right : coordinates.left + menuDimensions.width;\n let menuBottom = typeof coordinates.bottom === 'number' ? coordinates.bottom : coordinates.top + menuDimensions.height;\n let menuLeft = typeof coordinates.left === 'number' ? coordinates.left : windowLeft + windowWidth - coordinates.right - menuDimensions.width;\n\n return {\n top: menuTop < Math.floor(windowTop),\n right: menuRight > Math.ceil(windowLeft + windowWidth),\n bottom: menuBottom > Math.ceil(windowTop + windowHeight),\n left: menuLeft < Math.floor(windowLeft)\n }\n }\n\n getMenuDimensions() {\n // Width of the menu depends of its contents and position\n // We must check what its width would be without any obstruction\n // This way, we can achieve good positioning for flipping the menu\n let dimensions = {\n width: null,\n height: null\n };\n\n this.tribute.menu.style.cssText = `top: 0px;\n left: 0px;\n position: fixed;\n display: block;\n visibility; hidden;`;\n dimensions.width = this.tribute.menu.offsetWidth;\n dimensions.height = this.tribute.menu.offsetHeight;\n\n this.tribute.menu.style.cssText = `display: none;`;\n\n return dimensions\n }\n\n getTextAreaOrInputUnderlinePosition(element, position, flipped) {\n let properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX',\n 'overflowY', 'borderTopWidth', 'borderRightWidth',\n 'borderBottomWidth', 'borderLeftWidth', 'paddingTop',\n 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch',\n 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily',\n 'textAlign', 'textTransform', 'textIndent',\n 'textDecoration', 'letterSpacing', 'wordSpacing'\n ];\n\n let isFirefox = (window.mozInnerScreenX !== null);\n\n let div = this.getDocument().createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n this.getDocument().body.appendChild(div);\n\n let style = div.style;\n let computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle;\n\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT') {\n style.wordWrap = 'break-word';\n }\n\n // position off-screen\n style.position = 'absolute';\n style.visibility = 'hidden';\n\n // transfer the element's properties to the div\n properties.forEach(prop => {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n style.width = `${(parseInt(computed.width) - 2)}px`;\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden';\n }\n\n div.textContent = element.value.substring(0, position);\n\n if (element.nodeName === 'INPUT') {\n div.textContent = div.textContent.replace(/\\s/g, ' ');\n }\n\n let span = this.getDocument().createElement('span');\n span.textContent = element.value.substring(position) || '.';\n div.appendChild(span);\n\n let rect = element.getBoundingClientRect();\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let top = 0;\n let left = 0;\n if (this.menuContainerIsBody) {\n top = rect.top;\n left = rect.left;\n }\n\n let coordinates = {\n top: top + windowTop + span.offsetTop + parseInt(computed.borderTopWidth) + parseInt(computed.fontSize) - element.scrollTop,\n left: left + windowLeft + span.offsetLeft + parseInt(computed.borderLeftWidth)\n };\n\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n let menuDimensions = this.getMenuDimensions();\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n if (menuIsOffScreen.right) {\n coordinates.right = windowWidth - coordinates.left;\n coordinates.left = 'auto';\n }\n\n let parentHeight = this.tribute.menuContainer\n ? this.tribute.menuContainer.offsetHeight\n : this.getDocument().body.offsetHeight;\n\n if (menuIsOffScreen.bottom) {\n let parentRect = this.tribute.menuContainer\n ? this.tribute.menuContainer.getBoundingClientRect()\n : this.getDocument().body.getBoundingClientRect();\n let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n\n coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top - span.offsetTop);\n coordinates.top = 'auto';\n }\n\n menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n if (menuIsOffScreen.left) {\n coordinates.left = windowWidth > menuDimensions.width\n ? windowLeft + windowWidth - menuDimensions.width\n : windowLeft;\n delete coordinates.right;\n }\n if (menuIsOffScreen.top) {\n coordinates.top = windowHeight > menuDimensions.height\n ? windowTop + windowHeight - menuDimensions.height\n : windowTop;\n delete coordinates.bottom;\n }\n\n this.getDocument().body.removeChild(div);\n return coordinates\n }\n\n getContentEditableCaretPosition(selectedNodePosition) {\n let range;\n let sel = this.getWindowSelection();\n\n range = this.getDocument().createRange();\n range.setStart(sel.anchorNode, selectedNodePosition);\n range.setEnd(sel.anchorNode, selectedNodePosition);\n\n range.collapse(false);\n\n let rect = range.getBoundingClientRect();\n let doc = document.documentElement;\n let windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);\n let windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);\n\n let left = rect.left;\n let top = rect.top;\n\n let coordinates = {\n left: left + windowLeft,\n top: top + rect.height + windowTop\n };\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n let menuDimensions = this.getMenuDimensions();\n let menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n\n if (menuIsOffScreen.right) {\n coordinates.left = 'auto';\n coordinates.right = windowWidth - rect.left - windowLeft;\n }\n\n let parentHeight = this.tribute.menuContainer\n ? this.tribute.menuContainer.offsetHeight\n : this.getDocument().body.offsetHeight;\n\n if (menuIsOffScreen.bottom) {\n let parentRect = this.tribute.menuContainer\n ? this.tribute.menuContainer.getBoundingClientRect()\n : this.getDocument().body.getBoundingClientRect();\n let scrollStillAvailable = parentHeight - (windowHeight - parentRect.top);\n\n coordinates.top = 'auto';\n coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top);\n }\n\n menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions);\n if (menuIsOffScreen.left) {\n coordinates.left = windowWidth > menuDimensions.width\n ? windowLeft + windowWidth - menuDimensions.width\n : windowLeft;\n delete coordinates.right;\n }\n if (menuIsOffScreen.top) {\n coordinates.top = windowHeight > menuDimensions.height\n ? windowTop + windowHeight - menuDimensions.height\n : windowTop;\n delete coordinates.bottom;\n }\n\n if (!this.menuContainerIsBody) {\n coordinates.left = coordinates.left ? coordinates.left - this.tribute.menuContainer.offsetLeft : coordinates.left;\n coordinates.top = coordinates.top ? coordinates.top - this.tribute.menuContainer.offsetTop : coordinates.top;\n }\n\n return coordinates\n }\n\n scrollIntoView(elem) {\n let reasonableBuffer = 20,\n clientRect;\n let maxScrollDisplacement = 100;\n let e = this.menu;\n\n if (typeof e === 'undefined') return;\n\n while (clientRect === undefined || clientRect.height === 0) {\n clientRect = e.getBoundingClientRect();\n\n if (clientRect.height === 0) {\n e = e.childNodes[0];\n if (e === undefined || !e.getBoundingClientRect) {\n return\n }\n }\n }\n\n let elemTop = clientRect.top;\n let elemBottom = elemTop + clientRect.height;\n\n if (elemTop < 0) {\n window.scrollTo(0, window.pageYOffset + clientRect.top - reasonableBuffer);\n } else if (elemBottom > window.innerHeight) {\n let maxY = window.pageYOffset + clientRect.top - reasonableBuffer;\n\n if (maxY - window.pageYOffset > maxScrollDisplacement) {\n maxY = window.pageYOffset + maxScrollDisplacement;\n }\n\n let targetY = window.pageYOffset - (window.innerHeight - elemBottom);\n\n if (targetY > maxY) {\n targetY = maxY;\n }\n\n window.scrollTo(0, targetY);\n }\n }\n}\n\n// Thanks to https://github.com/mattyork/fuzzy\nclass TributeSearch {\n constructor(tribute) {\n this.tribute = tribute;\n this.tribute.search = this;\n }\n\n simpleFilter(pattern, array) {\n return array.filter(string => {\n return this.test(pattern, string)\n })\n }\n\n test(pattern, string) {\n return this.match(pattern, string) !== null\n }\n\n match(pattern, string, opts) {\n opts = opts || {};\n let len = string.length,\n pre = opts.pre || '',\n post = opts.post || '',\n compareString = opts.caseSensitive && string || string.toLowerCase();\n\n if (opts.skip) {\n return {rendered: string, score: 0}\n }\n\n pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n\n let patternCache = this.traverse(compareString, pattern, 0, 0, []);\n if (!patternCache) {\n return null\n }\n return {\n rendered: this.render(string, patternCache.cache, pre, post),\n score: patternCache.score\n }\n }\n\n traverse(string, pattern, stringIndex, patternIndex, patternCache) {\n // if the pattern search at end\n if (pattern.length === patternIndex) {\n\n // calculate score and copy the cache containing the indices where it's found\n return {\n score: this.calculateScore(patternCache),\n cache: patternCache.slice()\n }\n }\n\n // if string at end or remaining pattern > remaining string\n if (string.length === stringIndex || pattern.length - patternIndex > string.length - stringIndex) {\n return undefined\n }\n\n let c = pattern[patternIndex];\n let index = string.indexOf(c, stringIndex);\n let best, temp;\n\n while (index > -1) {\n patternCache.push(index);\n temp = this.traverse(string, pattern, index + 1, patternIndex + 1, patternCache);\n patternCache.pop();\n\n // if downstream traversal failed, return best answer so far\n if (!temp) {\n return best\n }\n\n if (!best || best.score < temp.score) {\n best = temp;\n }\n\n index = string.indexOf(c, index + 1);\n }\n\n return best\n }\n\n calculateScore(patternCache) {\n let score = 0;\n let temp = 1;\n\n patternCache.forEach((index, i) => {\n if (i > 0) {\n if (patternCache[i - 1] + 1 === index) {\n temp += temp + 1;\n }\n else {\n temp = 1;\n }\n }\n\n score += temp;\n });\n\n return score\n }\n\n render(string, indices, pre, post) {\n var rendered = string.substring(0, indices[0]);\n\n indices.forEach((index, i) => {\n rendered += pre + string[index] + post +\n string.substring(index + 1, (indices[i + 1]) ? indices[i + 1] : string.length);\n });\n\n return rendered\n }\n\n filter(pattern, arr, opts) {\n opts = opts || {};\n return arr\n .reduce((prev, element, idx, arr) => {\n let str = element;\n\n if (opts.extract) {\n str = opts.extract(element);\n\n if (!str) { // take care of undefineds / nulls / etc.\n str = '';\n }\n }\n\n let rendered = this.match(pattern, str, opts);\n\n SPDX-FileCopyrightText: 2020, 2020, 2020, 2020, 2020 Google Inc.\\n - SPDX-License-Identifier: Apache-2.0\\n-->\\n\\n\t\\n\\n';\nconst busySvg = '\\n\\n\t\\n\\n';\nconst dndSvg = '\\n\\n\t\\n\\n';\nconst invisibleSvg = '\\n\\n\t\\n\\n';\nconst onlineSvg = '\\n\\n\t\\n\\n';\nregister(t52);\nregister(t11);\nfunction getUserStatusText(status) {\n switch (status) {\n case \"away\":\n return t(\"away\");\n // TRANSLATORS: User status if the user is currently away from keyboard\n case \"busy\":\n return t(\"busy\");\n case \"dnd\":\n return t(\"do not disturb\");\n case \"online\":\n return t(\"online\");\n case \"invisible\":\n return t(\"invisible\");\n case \"offline\":\n return t(\"offline\");\n default:\n return status;\n }\n}\nconst _hoisted_1 = [\"aria-hidden\", \"aria-label\", \"innerHTML\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcUserStatusIcon\",\n props: /* @__PURE__ */ mergeModels({\n user: { default: void 0 },\n ariaHidden: { type: [Boolean, String], default: false }\n }, {\n \"status\": {},\n \"statusModifiers\": {}\n }),\n emits: [\"update:status\"],\n setup(__props) {\n const status = useModel(__props, \"status\");\n const props = __props;\n const isInvisible = computed(() => status.value && [\"invisible\", \"offline\"].includes(status.value));\n const ariaLabel = computed(() => status.value && (!props.ariaHidden || props.ariaHidden === \"false\") ? t(\"User status: {status}\", { status: getUserStatusText(status.value) }) : void 0);\n watch(() => props.user, async (user) => {\n if (!status.value && user && getCapabilities()?.user_status?.enabled) {\n try {\n const { data } = await axios.get(generateOcsUrl(\"/apps/user_status/api/v1/statuses/{user}\", { user }));\n status.value = data.ocs?.data?.status;\n } catch (error) {\n logger.debug(\"Error while fetching user status\", { error });\n }\n }\n }, { immediate: true });\n const matchSvg = {\n online: onlineSvg,\n away: awaySvg,\n busy: busySvg,\n dnd: dndSvg,\n invisible: invisibleSvg,\n offline: invisibleSvg\n };\n const activeSvg = computed(() => status.value && matchSvg[status.value]);\n return (_ctx, _cache) => {\n return status.value ? (openBlock(), createElementBlock(\"span\", {\n key: 0,\n class: normalizeClass([\"user-status-icon\", {\n \"user-status-icon--invisible\": isInvisible.value\n }]),\n \"aria-hidden\": !ariaLabel.value || void 0,\n \"aria-label\": ariaLabel.value,\n role: \"img\",\n innerHTML: activeSvg.value\n }, null, 10, _hoisted_1)) : createCommentVNode(\"\", true);\n };\n }\n});\nconst NcUserStatusIcon = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-881a79fb\"]]);\nexport {\n NcUserStatusIcon as N,\n getUserStatusText as g\n};\n//# sourceMappingURL=NcUserStatusIcon-BF5OEQFU.mjs.map\n","import '../assets/NcAvatar-Bs7qEhkA.css';\nimport { getCurrentUser } from \"@nextcloud/auth\";\nimport axios from \"@nextcloud/axios\";\nimport { getBuilder } from \"@nextcloud/browser-storage\";\nimport { unsubscribe, subscribe } from \"@nextcloud/event-bus\";\nimport { generateOcsUrl, generateUrl } from \"@nextcloud/router\";\nimport { vOnClickOutside } from \"@vueuse/components\";\nimport { N as NcActions, I as IconDotsHorizontal } from \"./NcActions-C-wDqSrv.mjs\";\nimport { g as getRoute } from \"./autolink-DrIurosL.mjs\";\nimport \"../composables/useFormatDateTime/index.mjs\";\nimport \"../composables/useHotKey/index.mjs\";\nimport { useIsDarkTheme } from \"../composables/useIsDarkTheme/index.mjs\";\nimport \"../composables/useIsFullscreen/index.mjs\";\nimport \"../composables/useIsMobile/index.mjs\";\nimport { getEnabledContactsMenuActions } from \"../functions/contactsMenu/index.mjs\";\nimport { usernameToColor } from \"../functions/usernameToColor/index.mjs\";\nimport { r as register, m as t10, a as t } from \"./_l10n-wdIzZwir.mjs\";\nimport \"escape-html\";\nimport \"striptags\";\nimport { resolveComponent, resolveDirective, withDirectives, openBlock, createElementBlock, normalizeStyle, normalizeClass, renderSlot, createCommentVNode, createBlock, withCtx, createSlots, Fragment, renderList, resolveDynamicComponent, mergeProps, createTextVNode, toDisplayString, createVNode, createElementVNode } from \"vue\";\nimport { g as getAvatarUrl } from \"./NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { getCapabilities } from \"@nextcloud/capabilities\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport { N as NcUserStatusIcon, g as getUserStatusText } from \"./NcUserStatusIcon-BF5OEQFU.mjs\";\nimport { N as NcActionButton } from \"./NcActionButton-BO5T5ePT.mjs\";\nimport { N as NcActionLink } from \"./NcActionLink-BFiaYt9A.mjs\";\nimport { N as NcActionRouter } from \"./NcActionRouter-vYFtIOzD.mjs\";\nimport { N as NcActionText } from \"./NcActionText-CQ9qwJ0p.mjs\";\nimport { N as NcButton } from \"./NcButton-jvoYS2my.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { N as NcLoadingIcon } from \"./NcLoadingIcon-BOVpFVQz.mjs\";\nregister(t10);\nconst userStatus = {\n data() {\n return {\n hasStatus: false,\n userStatus: {\n status: null,\n message: null,\n icon: null\n }\n };\n },\n methods: {\n /**\n * Fetches the user-status from the server\n *\n * @param {string} userId UserId of the user to fetch the status for\n *\n * @return {Promise}\n */\n async fetchUserStatus(userId) {\n if (!userId) {\n return;\n }\n const capabilities = getCapabilities();\n if (!Object.hasOwn(capabilities, \"user_status\") || !capabilities.user_status.enabled) {\n return;\n }\n if (!getCurrentUser()) {\n return;\n }\n try {\n const { data } = await axios.get(generateOcsUrl(\"apps/user_status/api/v1/statuses/{userId}\", { userId }));\n this.setUserStatus(data.ocs.data);\n } catch (e) {\n if (e.response.status === 404 && e.response.data.ocs?.data?.length === 0) {\n return;\n }\n logger.error(\"Failed to fetch user status\", { error: e });\n }\n },\n /**\n * Sets the user status\n *\n * @param {Record} options - Options for setting the user status\n * @param {string} options.status user's status\n * @param {string} options.message user's message\n * @param {string} options.icon user's icon\n */\n setUserStatus({ status, message, icon }) {\n this.userStatus.status = status || \"\";\n this.userStatus.message = message || \"\";\n this.userStatus.icon = icon || \"\";\n this.hasStatus = !!status;\n }\n }\n};\nconst browserStorage = getBuilder(\"nextcloud\").persist().build();\nfunction getUserHasAvatar(userId) {\n const flag = browserStorage.getItem(\"user-has-avatar.\" + userId);\n if (typeof flag === \"string\") {\n return Boolean(flag);\n }\n return null;\n}\nfunction setUserHasAvatar(userId, flag) {\n if (userId) {\n browserStorage.setItem(\"user-has-avatar.\" + userId, flag);\n }\n}\nconst _sfc_main = {\n name: \"NcAvatar\",\n directives: {\n /** @type {import('vue').ObjectDirective} */\n ClickOutside: vOnClickOutside\n },\n components: {\n IconDotsHorizontal,\n NcActions,\n NcButton,\n NcIconSvgWrapper,\n NcLoadingIcon,\n NcUserStatusIcon\n },\n mixins: [userStatus],\n props: {\n /**\n * Set a custom url to the avatar image\n * either the url, user or displayName property must be defined\n */\n url: {\n type: String,\n default: void 0\n },\n /**\n * Set a css icon-class for an icon to be used instead of the avatar.\n */\n iconClass: {\n type: String,\n default: void 0\n },\n /**\n * Set the user id to fetch the avatar\n * either the url, user or displayName property must be defined\n */\n user: {\n type: String,\n default: void 0\n },\n /**\n * Do not show the user status on the avatar.\n */\n hideStatus: {\n type: Boolean,\n default: false\n },\n /**\n * Show the verbose user status (e.g. \"online\" / \"away\") instead of just the status icon.\n */\n verboseStatus: {\n type: Boolean,\n default: false\n },\n /**\n * When the user status was preloaded via another source it can be handed in with this property to save the request.\n * If this property is not set the status will be fetched automatically.\n * If a preloaded no-status is available provide this object with properties \"status\", \"icon\" and \"message\" set to null.\n */\n preloadedUserStatus: {\n type: Object,\n default: void 0\n },\n /**\n * Is the user a guest user (then we have to user a different endpoint)\n */\n isGuest: {\n type: Boolean,\n default: false\n },\n /**\n * Set a display name that will be rendered as a tooltip\n * either the url, user or displayName property must be defined\n * specify just the displayname to generate a placeholder avatar without\n * trying to fetch the avatar based on the user id\n */\n displayName: {\n type: String,\n default: void 0\n },\n /**\n * Set a size in px for the rendered avatar\n */\n size: {\n type: Number,\n default: 32\n },\n /**\n * Do not automatically generate a placeholder avatars if there is no real avatar is available.\n */\n noPlaceholder: {\n type: Boolean,\n default: false\n },\n /**\n * Disable the tooltip\n */\n disableTooltip: {\n type: Boolean,\n default: false\n },\n /**\n * Disable the menu\n */\n disableMenu: {\n type: Boolean,\n default: false\n },\n /**\n * Declares a custom tooltip when not null\n * Fallback will be the displayName\n *\n * requires disableTooltip not to be set to true\n */\n tooltipMessage: {\n type: String,\n default: null\n },\n /**\n * Declares username is not a user's name, when true.\n * Prevents loading user's avatar from server and forces generating colored initials,\n * i.e. if the user is a group\n */\n isNoUser: {\n type: Boolean,\n default: false\n },\n /**\n * Selector for the popover menu container\n */\n menuContainer: {\n type: [Boolean, String, Object, Element],\n default: \"body\"\n }\n },\n setup() {\n const isDarkTheme = useIsDarkTheme();\n return {\n isDarkTheme\n };\n },\n data() {\n return {\n avatarUrlLoaded: null,\n avatarSrcSetLoaded: null,\n userDoesNotExist: false,\n isAvatarLoaded: false,\n isMenuLoaded: false,\n contactsMenuLoading: false,\n contactsMenuData: {},\n contactsMenuActions: [],\n contactsMenuOpenState: false\n };\n },\n computed: {\n avatarAriaLabel() {\n if (!this.hasMenu) {\n return;\n }\n if (this.canDisplayUserStatus || this.showUserStatusIconOnAvatar) {\n return t(\"Avatar of {displayName}, {status}\", { displayName: this.displayName ?? this.user, status: getUserStatusText(this.userStatus.status) });\n }\n return t(\"Avatar of {displayName}\", { displayName: this.displayName ?? this.user });\n },\n canDisplayUserStatus() {\n return !this.hideStatus && this.hasStatus && [\"online\", \"away\", \"busy\", \"dnd\"].includes(this.userStatus.status);\n },\n showUserStatusIconOnAvatar() {\n return !this.hideStatus && !this.verboseStatus && this.hasStatus && this.userStatus.status !== \"dnd\" && this.userStatus.icon;\n },\n /**\n * The user identifier, either the display name if set or the user property\n * If both properties are not set an empty string is returned\n */\n userIdentifier() {\n if (this.isDisplayNameDefined) {\n return this.displayName;\n }\n if (this.isUserDefined) {\n return this.user;\n }\n return \"\";\n },\n isUserDefined() {\n return typeof this.user !== \"undefined\";\n },\n isDisplayNameDefined() {\n return typeof this.displayName !== \"undefined\";\n },\n isUrlDefined() {\n return typeof this.url !== \"undefined\";\n },\n hasMenu() {\n if (this.disableMenu) {\n return false;\n }\n if (this.isMenuLoaded) {\n return this.menu.length > 0;\n }\n return !(this.user === getCurrentUser()?.uid || this.userDoesNotExist || this.url);\n },\n /**\n * True if initials should be shown as the user icon fallback\n */\n showInitials() {\n return !this.noPlaceholder && this.userDoesNotExist && !(this.iconClass || this.$slots.icon);\n },\n avatarStyle() {\n return {\n \"--avatar-size\": this.size + \"px\",\n lineHeight: this.showInitials ? this.size + \"px\" : 0,\n fontSize: Math.round(this.size * 0.45) + \"px\"\n };\n },\n initialsWrapperStyle() {\n const { r, g, b } = usernameToColor(this.userIdentifier);\n return {\n backgroundColor: `rgba(${r}, ${g}, ${b}, 0.1)`\n };\n },\n initialsStyle() {\n const { r, g, b } = usernameToColor(this.userIdentifier);\n return {\n color: `rgb(${r}, ${g}, ${b})`\n };\n },\n tooltip() {\n if (this.disableTooltip) {\n return null;\n }\n if (this.tooltipMessage) {\n return this.tooltipMessage;\n }\n return this.displayName;\n },\n /**\n * Get the (max. two) initials of the user as uppcase string\n */\n initials() {\n let initials = \"?\";\n if (this.showInitials) {\n const user = this.userIdentifier.trim();\n if (user === \"\") {\n return initials;\n }\n const filteredChars = user.match(/[\\p{L}\\p{N}\\s]/gu);\n if (!filteredChars) {\n return initials;\n }\n const filtered = filteredChars.join(\"\");\n const idx = filtered.lastIndexOf(\" \");\n initials = String.fromCodePoint(filtered.codePointAt(0));\n if (idx !== -1) {\n initials = initials.concat(String.fromCodePoint(filtered.codePointAt(idx + 1)));\n }\n }\n return initials.toLocaleUpperCase();\n },\n menu() {\n const actions = this.contactsMenuActions.map((item) => {\n const route = getRoute(this.$router, item.hyperlink);\n return {\n ncActionComponent: route ? NcActionRouter : NcActionLink,\n ncActionComponentProps: route ? {\n to: route,\n icon: item.icon\n } : {\n href: item.hyperlink,\n icon: item.icon\n },\n text: item.title\n };\n });\n for (const action of getEnabledContactsMenuActions(this.contactsMenuData)) {\n try {\n actions.push({\n ncActionComponent: NcActionButton,\n ncActionComponentProps: {\n onClick: () => action.callback(this.contactsMenuData)\n },\n text: action.displayName(this.contactsMenuData),\n iconSvg: action.iconSvg(this.contactsMenuData)\n });\n } catch (error) {\n logger.error(`Failed to render ContactsMenu action ${action.id}`, {\n error,\n action\n });\n }\n }\n function escape(html) {\n const text = document.createTextNode(html);\n const p = document.createElement(\"p\");\n p.appendChild(text);\n return p.innerHTML;\n }\n if (!this.hideStatus && (this.userStatus.icon || this.userStatus.message)) {\n const emojiIcon = `\n\t\t\t\t\t${escape(this.userStatus.icon)}\n\t\t\t\t`;\n return [{\n ncActionComponent: NcActionText,\n ncActionComponentProps: {},\n iconSvg: this.userStatus.icon ? emojiIcon : void 0,\n text: `${this.userStatus.message}`\n }].concat(actions);\n }\n retur SPDX-FileCopyrightText: 2021, 2022, 2022, 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { VueRenderer } from '@tiptap/vue-3'\nimport tippy from 'tippy.js'\n\nexport default ({\n\tlistComponent,\n\titems,\n\tcommand,\n}) => ({\n\titems,\n\tcommand,\n\trender: () => {\n\t\tlet component\n\t\tlet popup\n\n\t\treturn {\n\t\t\tonStart: (props) => {\n\t\t\t\tcomponent = new VueRenderer(listComponent, {\n\t\t\t\t\teditor: props.editor,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\tonSelect: () => popup.length > 0 && popup[0].hide(),\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tif (!props.clientRect) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tpopup = tippy('body', {\n\t\t\t\t\tgetReferenceClientRect: props.clientRect,\n\t\t\t\t\tappendTo: () => document.body,\n\t\t\t\t\tcontent: component.element,\n\t\t\t\t\tshowOnCreate: true,\n\t\t\t\t\tinteractive: true,\n\t\t\t\t\ttrigger: 'manual',\n\t\t\t\t\tplacement: 'bottom-start',\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tonUpdate(props) {\n\t\t\t\tcomponent.updateProps(props)\n\n\t\t\t\tif (!props.clientRect || !popup) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tpopup[0].setProps({\n\t\t\t\t\tgetReferenceClientRect: props.clientRect,\n\t\t\t\t})\n\t\t\t},\n\n\t\t\tonKeyDown(props) {\n\t\t\t\tif (!popup) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (props.event.key === 'Escape') {\n\t\t\t\t\tpopup[0].hide()\n\t\t\t\t\tpopup[0].destroy()\n\t\t\t\t\tcomponent.destroy()\n\t\t\t\t\tpopup = null\n\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\treturn component.ref?.onKeyDown?.(props)\n\t\t\t},\n\n\t\t\tonExit() {\n\t\t\t\tif (!popup) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tpopup[0].destroy()\n\t\t\t\tcomponent.destroy()\n\t\t\t},\n\t\t}\n\t},\n})\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { emojiSearch } from '@nextcloud/vue/functions/emoji'\nimport EmojiList from './EmojiList.vue'\nimport createSuggestions from '../suggestions.js'\n\nexport default () => createSuggestions({\n\tlistComponent: EmojiList,\n\titems: ({ query }) => {\n\t\treturn emojiSearch(query)\n\t},\n\tcommand: ({ editor, range, props }) => {\n\t\teditor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.insertContentAt(range, props.native + ' ')\n\t\t\t.run()\n\t},\n})\n","import { loadState } from \"@nextcloud/initial-state\";\nimport { inject } from \"vue\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\n/*!\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nfunction once(func) {\n let wasCalled = false;\n let result;\n return (...args) => {\n if (!wasCalled) {\n wasCalled = true;\n result = func(...args);\n }\n return result;\n };\n}\nlet realAppName = \"missing-app-name\";\ntry {\n realAppName = appName;\n} catch {\n logger.error(\"The `@nextcloud/vue` library was used without setting / replacing the `appName`.\");\n}\nconst APP_NAME = realAppName;\nlet realAppVersion = \"\";\ntry {\n realAppVersion = appVersion;\n} catch {\n logger.error(\"The `@nextcloud/vue` library was used without setting / replacing the `appVersion`.\");\n}\nconst APP_VERSION = realAppVersion;\nfunction useAppName() {\n return inject(\"appName\", APP_NAME);\n}\nconst useLocalizedAppName = once(() => {\n const apps = loadState(\"core\", \"apps\", []);\n const realAppName2 = useAppName();\n return apps.find(({ id }) => id === realAppName2)?.name ?? realAppName2;\n});\nexport {\n APP_VERSION as A,\n useAppName as a,\n useLocalizedAppName as u\n};\n//# sourceMappingURL=appName-DyNMVZpX.mjs.map\n","import '../assets/NcAppContent-TgcZd4AI.css';\nimport { getBuilder } from \"@nextcloud/browser-storage\";\nimport { getCapabilities } from \"@nextcloud/capabilities\";\nimport { emit } from \"@nextcloud/event-bus\";\nimport { useSwipe } from \"@vueuse/core\";\nimport { Splitpanes, Pane } from \"splitpanes\";\nimport { defineComponent, watch, onMounted, onBeforeUnmount, openBlock, createBlock, unref, normalizeClass, withCtx, createVNode, resolveComponent, createElementBlock, toDisplayString, createCommentVNode, Fragment, withModifiers, withDirectives, createElementVNode, renderSlot, vShow } from \"vue\";\nimport { m as mdiArrowRight } from \"./mdi-CpchYUUV.mjs\";\nimport { useIsMobile } from \"../composables/useIsMobile/index.mjs\";\nimport { r as register, G as t27, a as t } from \"./_l10n-wdIzZwir.mjs\";\nimport { N as NcButton } from \"./NcButton-jvoYS2my.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { u as useLocalizedAppName, a as useAppName } from \"./appName-DyNMVZpX.mjs\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport { i as isRtl } from \"./rtl-v0UOPAM7.mjs\";\nimport \"splitpanes/dist/splitpanes.css\";\nregister(t27);\nconst _sfc_main$1 = /* @__PURE__ */ defineComponent({\n __name: \"NcAppContentDetailsToggle\",\n setup(__props) {\n const isMobile = useIsMobile();\n watch(isMobile, toggleAppNavigationButton);\n onMounted(() => {\n toggleAppNavigationButton(isMobile.value);\n });\n onBeforeUnmount(() => {\n if (isMobile.value) {\n toggleAppNavigationButton(false);\n }\n });\n function toggleAppNavigationButton(hide = true) {\n const appNavigationToggle = document.querySelector(\".app-navigation .app-navigation-toggle\");\n if (appNavigationToggle) {\n appNavigationToggle.style.display = hide ? \"none\" : \"\";\n if (hide === true) {\n emit(\"toggle-navigation\", { open: false });\n }\n }\n }\n return (_ctx, _cache) => {\n return openBlock(), createBlock(unref(NcButton), {\n \"aria-label\": unref(t)(\"Go back to the list\"),\n class: normalizeClass([\"app-details-toggle\", { \"app-details-toggle--mobile\": unref(isMobile) }]),\n title: unref(t)(\"Go back to the list\"),\n variant: \"tertiary\"\n }, {\n icon: withCtx(() => [\n createVNode(unref(NcIconSvgWrapper), {\n directional: \"\",\n path: unref(mdiArrowRight)\n }, null, 8, [\"path\"])\n ]),\n _: 1\n }, 8, [\"aria-label\", \"class\", \"title\"]);\n };\n }\n});\nconst NcAppContentDetailsToggle = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"__scopeId\", \"data-v-a28923a1\"]]);\nconst browserStorage = getBuilder(\"nextcloud\").persist().build();\nconst instanceName = getCapabilities().theming?.name ?? \"Nextcloud\";\nconst _sfc_main = {\n name: \"NcAppContent\",\n components: {\n NcAppContentDetailsToggle,\n Pane,\n Splitpanes\n },\n props: {\n /**\n * Allows to disable the control by swipe of the app navigation open state.\n */\n disableSwipe: {\n type: Boolean,\n default: false\n },\n /**\n * Allows you to set the default width of the resizable list in % on vertical-split\n * or respectively the default height on horizontal-split.\n *\n * Must be between `listMinWidth` and `listMaxWidth`.\n */\n listSize: {\n type: Number,\n default: 20\n },\n /**\n * Allows you to set the minimum width of the list column in % on vertical-split\n * or respectively the minimum height on horizontal-split.\n */\n listMinWidth: {\n type: Number,\n default: 15\n },\n /**\n * Allows you to set the maximum width of the list column in % on vertical-split\n * or respectively the maximum height on horizontal-split.\n */\n listMaxWidth: {\n type: Number,\n default: 40\n },\n /**\n * Specify the config key for the pane config sizes\n * Default is the global var appName if you use the webpack-vue-config\n */\n paneConfigKey: {\n type: String,\n default: \"\"\n },\n /**\n * When in mobile view, only the list or the details are shown.\n *\n * If you provide a list, you need to provide a variable\n * that will be set to true by the user when an element of\n * the list gets selected. The details will then show a back\n * arrow to return to the list that will update this prop to false.\n */\n showDetails: {\n type: Boolean,\n default: true\n },\n /**\n * Content layout used when there is a list together with content:\n * - `vertical-split` - a 2-column layout with list and default content separated vertically\n * - `no-split` - a single column layout; List is shown when `showDetails` is `false`, otherwise the default slot content is shown with a back button to return to the list.\n * - 'horizontal-split' - a 2-column layout with list and default content separated horizontally\n * On mobile screen `no-split` layout is forced.\n */\n layout: {\n type: String,\n default: \"vertical-split\",\n validator(value) {\n return [\"no-split\", \"vertical-split\", \"horizontal-split\"].includes(value);\n }\n },\n /**\n * Specify the `

    ` page heading\n */\n pageHeading: {\n type: String,\n default: null\n },\n /**\n * Allow setting the page's ``\n *\n * If a page heading is set it defaults to `{pageHeading} - {appName} - {instanceName}` e.g. `Favorites - Files - MyPersonalCloud`.\n * When the page heading and the app name is the same only one is used, e.g. `Files - Files - MyPersonalCloud` is shown as `Files - MyPersonalCloud`.\n * When setting the prop then the following format will be used: `{pageTitle} - {instanceName}`\n */\n pageTitle: {\n type: String,\n default: null\n }\n },\n emits: [\n \"update:showDetails\",\n \"resizeList\"\n ],\n setup() {\n return {\n appName: useAppName(),\n localizedAppName: useLocalizedAppName(),\n isMobile: useIsMobile(),\n isRtl\n };\n },\n data() {\n return {\n contentHeight: 0,\n swiping: {},\n listPaneSize: this.restorePaneConfig()\n };\n },\n computed: {\n paneConfigID() {\n if (this.paneConfigKey !== \"\") {\n return `pane-list-size-${this.paneConfigKey}`;\n }\n try {\n return `pane-list-size-${this.appName}`;\n } catch {\n logger.info(\"[NcAppContent]: falling back to global nextcloud pane config\");\n return \"pane-list-size-nextcloud\";\n }\n },\n detailsPaneSize() {\n if (this.listPaneSize) {\n return 100 - this.listPaneSize;\n }\n return this.paneDefaults.details.size;\n },\n paneDefaults() {\n return {\n list: {\n size: this.listSize,\n min: this.listMinWidth,\n max: this.listMaxWidth\n },\n // set the inverse values of the details column\n // based on the provided (or default) values of the list column\n details: {\n size: 100 - this.listSize,\n min: 100 - this.listMaxWidth,\n max: 100 - this.listMinWidth\n }\n };\n },\n realPageTitle() {\n const entries = /* @__PURE__ */ new Set();\n if (this.pageTitle) {\n for (const part of this.pageTitle.split(\" - \")) {\n entries.add(part);\n }\n } else if (this.pageHeading) {\n for (const part of this.pageHeading.split(\" - \")) {\n entries.add(part);\n }\n if (entries.size > 0) {\n entries.add(this.localizedAppName);\n }\n } else {\n return null;\n }\n entries.add(instanceName);\n return [...entries.values()].join(\" - \");\n }\n },\n watch: {\n realPageTitle: {\n immediate: true,\n handler() {\n if (this.realPageTitle !== null) {\n document.title = this.realPageTitle;\n }\n }\n },\n paneConfigKey: {\n immediate: true,\n handler() {\n this.restorePaneConfig();\n }\n }\n },\n mounted() {\n if (!this.disableSwipe) {\n this.swiping = useSwipe(this.$el, {\n onSwipeEnd: this.handleSwipe\n });\n }\n this.restorePaneConfig();\n },\n methods: {\n /**\n * handle the swipe event\n *\n * @param {TouchEvent} e The touch event\n * @param {import('@vueuse/core').SwipeDirection} direction The swipe direction of the event\n */\n handleSwipe(e, direction) {\n const minSwipeX = 70;\n const touchZone = 300;\n if (Math.abs(this.swiping.lengthX) > minSwipeX) {\n if (this.swiping.coordsStart.x < touchZone / 2 && direction === \"right\") {\n emit(\"toggle-navigation\", {\n open: true\n });\n } else if (this.swiping.coordsStart.x < touchZone * 1.5 && direction === \"left\") {\n emit(\"toggle-navigation\", {\n open: false\n });\n }\n }\n },\n handlePaneResize(event) {\n const listPaneSize = parseInt(event.panes[0].size, 10);\n browserStorage.setItem(this.paneConfigID, JSON.stringify(listPaneSize));\n this.listPaneSize = listPaneSize;\n this.$emit(\"resizeList\", { size: listPaneSize });\n logger.debug(\"[NcAppContent] pane config\", { listPaneSize });\n },\n // browserStorage is not reactive, we need to update this manually\n restorePaneConfig() {\n const listPaneSize = parseInt(browserStorage.getItem(this.paneConfigID), 10);\n if (!isNaN(listPaneSize) && listPaneSize !== this.listPaneSize) {\n logger.debug(\"[NcAppContent] pane config\", { listPaneSize });\n this.listPaneSize = listPaneSize;\n return listPaneSize;\n }\n },\n /**\n * The user clicked the back arrow from the details view\n */\n hideDetails() {\n this.$emit(\"update:showDetails\", false);\n }\n }\n};\nconst _hoisted_1 = {\n key: 0,\n class: \"hidden-visually\"\n};\nconst _hoisted_2 = { class: \"app-content-wrapper__list\" };\nconst _hoisted_3 = {\n key: 1,\n class: \"app-content-wrapper\"\n};\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcAppContentDetailsToggle = resolveComponent(\"NcAppContentDetailsToggle\");\n const _component_Pane = resolveComponent(\"Pane\");\n const _component_Splitpanes = resolveComponent(\"Splitpanes\");\n return openBlock(), createElementBlock(\"main\", {\n id: \"app-content-vue\",\n class: normalizeClass([\"app-content no-snapper\", { \"app-content--has-list\": !!_ctx.$slots.list }])\n }, [\n $props.pageHeading ? (openBlock(), createElementBlock(\"h1\", _hoisted_1, toDisplayString($props.pageHeading), 1)) : createCommentVNode(\"\", true),\n !!_ctx.$slots.list ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [\n $setup.isMobile || $props.layout === \"no-split\" ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass([\"app-content-wrapper app-content-wrapper--no-split\", {\n \"app-content-wrapper--show-details\": $props.showDetails,\n \"app-content-wrapper--show-list\": !$props.showDetails,\n \"app-content-wrapper--mobile\": $setup.isMobile\n }])\n }, [\n $props.showDetails ? (openBlock(), createBlock(_component_NcAppContentDetailsToggle, {\n key: 0,\n onClick: withModifiers($options.hideDetails, [\"stop\", \"prevent\"])\n }, null, 8, [\"onClick\"])) : createCommentVNode(\"\", true),\n withDirectives(createElementVNode(\"div\", _hoisted_2, [\n renderSlot(_ctx.$slots, \"list\", {}, void 0, true)\n ], 512), [\n [vShow, !$props.showDetails]\n ]),\n $props.showDetails ? renderSlot(_ctx.$slots, \"default\", { key: 1 }, void 0, true) : createCommentVNode(\"\", true)\n ], 2)) : $props.layout === \"vertical-split\" || $props.layout === \"horizontal-split\" ? (openBlock(), createElementBlock(\"div\", _hoisted_3, [\n createVNode(_component_Splitpanes, {\n horizontal: $props.layout === \"horizontal-split\",\n class: normalizeClass([\"default-theme\", {\n \"splitpanes--horizontal\": $props.layout === \"horizontal-split\",\n \"splitpanes--vertical\": $props.layout === \"vertical-split\"\n }]),\n rtl: $setup.isRtl,\n onResized: $options.handlePaneResize\n }, {\n default: withCtx(() => [\n createVNode(_component_Pane, {\n class: \"splitpanes__pane-list\",\n size: $data.listPaneSize || $options.paneDefaults.list.size,\n minSize: $options.paneDefaults.list.min,\n maxSize: $options.paneDefaults.list.max\n }, {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"list\", {}, void 0, true)\n ]),\n _: 3\n }, 8, [\"size\", \"minSize\", \"maxSize\"]),\n createVNode(_component_Pane, {\n class: \"splitpanes__pane-details\",\n size: $options.detailsPaneSize,\n minSize: $options.paneDefaults.details.min,\n maxSize: $options.paneDefaults.details.max\n }, {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, void 0, true)\n ]),\n _: 3\n }, 8, [\"size\", \"minSize\", \"maxSize\"])\n ]),\n _: 3\n }, 8, [\"horizontal\", \"class\", \"rtl\", \"onResized\"])\n ])) : createCommentVNode(\"\", true)\n ], 64)) : createCommentVNode(\"\", true),\n !_ctx.$slots.list ? renderSlot(_ctx.$slots, \"default\", { key: 2 }, void 0, true) : createCommentVNode(\"\", true)\n ], 2);\n}\nconst NcAppContent = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-51427d61\"]]);\nexport {\n NcAppContent as N\n};\n//# sourceMappingURL=NcAppContent-DavgjaFX.mjs.map\n","import '../assets/NcAppNavigation-OHw55TTZ.css';\nimport { defineComponent, useModel, computed, openBlock, createElementBlock, createVNode, unref, withCtx, inject, warn, useTemplateRef, ref, watchEffect, watch, onMounted, onUnmounted, normalizeClass, createElementVNode, withKeys, renderSlot, createBlock, createCommentVNode } from \"vue\";\nimport { subscribe, emit, unsubscribe } from \"@nextcloud/event-bus\";\nimport { createFocusTrap } from \"focus-trap\";\nimport { N as NcAppNavigationList } from \"./NcAppNavigationList-CGSWabRB.mjs\";\nimport { G as mdiMenuOpen, H as mdiMenu } from \"./mdi-CpchYUUV.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { r as register, P as t20, a as t } from \"./_l10n-wdIzZwir.mjs\";\nimport { N as NcButton } from \"./NcButton-jvoYS2my.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { useIsMobile } from \"../composables/useIsMobile/index.mjs\";\nimport { g as getTrapStack } from \"./focusTrap-HJQ4pqHV.mjs\";\nimport { i as isLegacy34 } from \"./legacy-BoqDmOCa.mjs\";\nimport { H as HAS_APP_NAVIGATION_KEY } from \"./constants-Ciwvl5xb.mjs\";\nregister(t20);\nconst _hoisted_1$1 = { class: \"app-navigation-toggle-wrapper\" };\nconst _sfc_main$1 = /* @__PURE__ */ defineComponent({\n __name: \"NcAppNavigationToggle\",\n props: {\n \"open\": { type: Boolean, ...{ required: true } },\n \"openModifiers\": {}\n },\n emits: [\"update:open\"],\n setup(__props) {\n const open = useModel(__props, \"open\");\n const title = computed(() => open.value ? t(\"Close navigation\") : t(\"Open navigation\"));\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", _hoisted_1$1, [\n createVNode(unref(NcButton), {\n class: \"app-navigation-toggle\",\n \"aria-controls\": \"app-navigation-vue\",\n \"aria-expanded\": open.value ? \"true\" : \"false\",\n \"aria-label\": title.value,\n title: title.value,\n variant: \"tertiary\",\n onClick: _cache[0] || (_cache[0] = ($event) => open.value = !open.value)\n }, {\n icon: withCtx(() => [\n createVNode(NcIconSvgWrapper, {\n path: open.value ? unref(mdiMenuOpen) : unref(mdiMenu)\n }, null, 8, [\"path\"])\n ]),\n _: 1\n }, 8, [\"aria-expanded\", \"aria-label\", \"title\"])\n ]);\n };\n }\n});\nconst NcAppNavigationToggle = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"__scopeId\", \"data-v-5a15295d\"]]);\nconst _hoisted_1 = [\"aria-hidden\", \"aria-label\", \"aria-labelledby\", \"inert\"];\nconst _hoisted_2 = { class: \"app-navigation__search\" };\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcAppNavigation\",\n props: {\n ariaLabel: {},\n ariaLabelledby: {}\n },\n setup(__props) {\n const props = __props;\n let focusTrap;\n const setHasAppNavigation = inject(\n HAS_APP_NAVIGATION_KEY,\n () => warn(\"NcAppNavigation is not mounted inside NcContent, this is probably an error.\"),\n false\n );\n const appNavigationContainerElement = useTemplateRef(\"appNavigationContainer\");\n const isMobile = useIsMobile();\n const open = ref(!isMobile.value);\n const shouldActivateFocusTrap = computed(() => isMobile.value && open.value);\n watchEffect(() => {\n if (!props.ariaLabel && !props.ariaLabelledby) {\n warn(\"NcAppNavigation requires either `ariaLabel` or `ariaLabelledby` to be set for accessibility.\");\n }\n });\n watch(isMobile, () => {\n open.value = !isMobile.value;\n });\n watch(shouldActivateFocusTrap, () => {\n toggleFocusTrap();\n });\n onMounted(() => {\n setHasAppNavigation(true);\n subscribe(\"toggle-navigation\", toggleNavigationByEventBus);\n emit(\"navigation-toggled\", {\n open: open.value\n });\n focusTrap = createFocusTrap(appNavigationContainerElement.value, {\n allowOutsideClick: true,\n clickOutsideDeactivates: () => {\n if (isMobile.value) {\n focusTrap.deactivate({ returnFocus: false });\n toggleNavigation(false);\n }\n return false;\n },\n fallbackFocus: appNavigationContainerElement.value,\n trapStack: getTrapStack(),\n escapeDeactivates: false\n });\n toggleFocusTrap();\n });\n onUnmounted(() => {\n setHasAppNavig SPDX-FileCopyrightText: 2021, 2023, 2025, 2022, 2026, 2026, 2019, 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"suggestion-list\">\n\t\t<template v-if=\"hasResults\">\n\t\t\t<div v-for=\"(groupItems, key, groupIndex) in itemGroups\" :key=\"key\">\n\t\t\t\t<div v-if=\"hasGroups\" class=\"suggestion-list__group\">\n\t\t\t\t\t{{ key }}\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(item, index) in groupItems\"\n\t\t\t\t\t:key=\"combineIndex(groupIndex, index)\"\n\t\t\t\t\tclass=\"suggestion-list__item\"\n\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t'is-selected':\n\t\t\t\t\t\t\tcombineIndex(groupIndex, index) === selectedIndex,\n\t\t\t\t\t}\"\n\t\t\t\t\t@click=\"selectItem(combineIndex(groupIndex, index))\">\n\t\t\t\t\t<slot\n\t\t\t\t\t\t:item=\"item\"\n\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\tcombineIndex(groupIndex, index) === selectedIndex\n\t\t\t\t\t\t\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t\t<div v-else class=\"suggestion-list__item is-empty\">\n\t\t\t{{ t('text', 'No suggestion found') }}\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\n\nexport default {\n\tname: 'SuggestionListWrapper',\n\n\tprops: {\n\t\titems: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcommand: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\temits: ['select'],\n\n\tdata() {\n\t\treturn {\n\t\t\tselectedIndex: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\thasGroups() {\n\t\t\treturn Object.keys(this.itemGroups).includes(undefined)\n\t\t},\n\n\t\thasResults() {\n\t\t\treturn this.items.length > 0\n\t\t},\n\n\t\titemHeight() {\n\t\t\treturn this.$el.scrollHeight / this.items.length\n\t\t},\n\n\t\titemInsideScrollView() {\n\t\t\t// If upper border of item is bigger or equal than scroll top\n\t\t\t// and lower end of item is smaller or equal than scroll bottom\n\t\t\treturn (\n\t\t\t\tthis.selectedIndex * this.itemHeight >= this.$el.scrollTop\n\t\t\t\t&& (this.selectedIndex + 1) * this.itemHeight\n\t\t\t\t<= this.$el.scrollTop + this.$el.clientHeight\n\t\t\t)\n\t\t},\n\n\t\titemGroups() {\n\t\t\tconst groups = {}\n\t\t\tthis.items.forEach((item) => {\n\t\t\t\tif (!groups[item.suggestGroup]) {\n\t\t\t\t\tgroups[item.suggestGroup] = []\n\t\t\t\t}\n\t\t\t\tgroups[item.suggestGroup].push(item)\n\t\t\t})\n\t\t\treturn groups\n\t\t},\n\n\t\tcombineIndex() {\n\t\t\treturn (groupIndex, index) => {\n\t\t\t\tconst previousItemCount = Object.values(this.itemGroups)\n\t\t\t\t\t.slice(0, groupIndex)\n\t\t\t\t\t.reduce((sum, items) => {\n\t\t\t\t\t\treturn sum + items.length\n\t\t\t\t\t}, 0)\n\t\t\t\treturn previousItemCount + index\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\titems() {\n\t\t\tthis.selectedIndex = 0\n\t\t\tthis.$el.scrollTop = 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tonKeyDown({ event }) {\n\t\t\t// Ignore any key modifier combinations\n\t\t\tif (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (event.key === 'ArrowUp') {\n\t\t\t\tthis.selectedIndex\n\t\t\t\t\t= (this.selectedIndex + this.items.length - 1) % this.items.length\n\t\t\t\tif (!this.itemInsideScrollView) {\n\t\t\t\t\tthis.$el.scrollTop = this.selectedIndex * this.itemHeight\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tif (event.key === 'ArrowDown') {\n\t\t\t\tthis.selectedIndex = (this.selectedIndex + 1) % this.items.length\n\t\t\t\tif (!this.itemInsideScrollView) {\n\t\t\t\t\tthis.$el.scrollTop\n\t\t\t\t\t\t= (this.selectedIndex + 1) * this.itemHeight\n\t\t\t\t\t\t\t- this.$el.clientHeight\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tif (event.key === 'Enter' || event.key === 'Tab') {\n\t\t\t\tthis.selectItem(this.selectedIndex)\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\treturn false\n\t\t},\n\n\t\tselectItem(index) {\n\t\t\tconst item = this.items[index]\n\n\t\t\tif (item) {\n\t\t\t\tthis.$emit('select', item)\n\t\t\t\tthis.command(item)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.suggestion-list {\n\tborder-radius: var(--border-radius);\n\tbackground-color: var(--color-main-background);\n\tbox-shadow: 0 1px 5px var(--color-box-shadow);\n\toverflow: auto;\n\n\tmin-width: 200px;\n\tmax-width: 400px;\n\twidth: 80vw;\n\tpadding: 4px;\n\t// Show maximum 5 entries and a half to show scroll\n\tmax-height: 35.5px * 5 + 18px;\n\tmargin: 5px 0;\n\n\t&__group {\n\t\tfont-weight: bold;\n\t\tcolor: var(--color-primary-element);\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: var(--default-clickable-area);\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\topacity: 0.7;\n\t\tbox-shadow: none !important;\n\t\tflex-shrink: 0;\n\t\tpadding-left: 8px;\n\t}\n\n\t&__item {\n\t\tborder-radius: 8px;\n\t\tpadding: 4px 8px;\n\t\tmargin-bottom: 4px;\n\t\topacity: 0.8;\n\t\tcursor: pointer;\n\n\t\t// Take care of long names\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\n\t\t&:last-child {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t&__emoji {\n\t\t\tpadding-right: 8px;\n\t\t}\n\n\t\t&.is-selected,\n\t\t&:focus,\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--color-primary-element-light);\n\t\t}\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<SuggestionListWrapper ref=\"suggestionList\" :command=\"command\" :items=\"items\">\n\t\t<template #default=\"{ item, active }\">\n\t\t\t<NcAutoCompleteResult\n\t\t\t\t:id=\"item.id\"\n\t\t\t\t:label=\"item.label\"\n\t\t\t\ticon=\"icon-user\"\n\t\t\t\tsource=\"users\"\n\t\t\t\t:class=\"active ? 'highlight' : null\" />\n\t\t</template>\n\t\t<template #empty>\n\t\t\t{{ t('text', 'No user found') }}\n\t\t</template>\n\t</SuggestionListWrapper>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport { NcAutoCompleteResult } from '@nextcloud/vue'\nimport SuggestionListWrapper from '../SuggestionListWrapper.vue'\n\nexport default {\n\tcomponents: {\n\t\tNcAutoCompleteResult,\n\t\tSuggestionListWrapper,\n\t},\n\n\tprops: {\n\t\titems: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcommand: {\n\t\t\ttype: Function,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tonKeyDown({ event }) {\n\t\t\t// Ignore any key modifier combinations\n\t\t\treturn this.$refs.suggestionList?.onKeyDown({ event })\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n.items {\n\tposition: relative;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-main-background);\n\toverflow: hidden;\n\tfont-size: 0.9rem;\n\tbox-shadow: 0 1px 5px var(--color-box-shadow);\n\tmin-width: 250px;\n}\n\n.item-empty {\n\tpadding: 4px 8px;\n\topacity: 0.8;\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ShallowRef } from 'vue'\nimport type { Connection } from '../composables/useConnection.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { unref } from 'vue'\nimport { logger } from '../helpers/logger.ts'\n\n/**\n * Let Nextcloud know someone was mentioned\n *\n * @param mention user id of the person that was mentioned\n * @param scope scope the user was mentioned in\n * @param options options\n * @param options.connection connection to the text editing session\n */\nexport function emitMention(\n\tmention: string,\n\tscope: object,\n\t{ connection }: { connection: ShallowRef<Connection> | Connection },\n): Promise<void> {\n\t// TODO: Require actual connection - handle disconnected state early on\n\tconst con = unref(connection)\n\tif (!con) {\n\t\tconst err = new Error('Disconnected. Could not notify user about mention.')\n\t\tlogger.warn(err.message, { err, mention })\n\t\treturn Promise.resolve()\n\t}\n\tconst url = generateUrl(`apps/text/session/${con.documentId}/mention`)\n\treturn axios.put(url, {\n\t\tdocumentId: con.documentId,\n\t\tsessionId: con.sessionId,\n\t\tsessionToken: con.sessionToken,\n\t\tmention,\n\t\tscope,\n\t})\n\t// TODO: handle errors:\n\t// * signal something is wrong with the connection\n\t// * wait for reconnect and fetch again\n}\n\nconst USERS_LIST_ENDPOINT_URL = generateUrl('apps/text/api/v1/users')\n\n/**\n * Look up user names to mention\n *\n * @param filter string to look for in the user names\n * @param options options\n * @param options.connection connection to the text editing session\n */\nexport async function getUsers(\n\tfilter: string,\n\t{ connection }: { connection: ShallowRef<Connection> },\n): Promise<Record<string, string>> {\n\t// TODO: Require actual connection - handle disconnected state early on\n\tconst con = unref(connection)\n\tif (!con) {\n\t\tconst err = new Error('Disconnected. Could not lookup users to mention.')\n\t\tlogger.warn(err.message, { err })\n\t\treturn Promise.resolve({})\n\t}\n\tconst response = await axios.post(USERS_LIST_ENDPOINT_URL, { ...con, filter })\n\t// TODO: handle errors:\n\t// * signal something is wrong with the connection\n\t// * wait for reconnect and fetch again\n\treturn JSON.parse(JSON.stringify(response.data))\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport MentionList from './MentionList.vue'\nimport { emitMention, getUsers } from '../../../apis/mention.ts'\nimport createSuggestions from '../suggestions.js'\n\nexport default ({ connection, options }) => createSuggestions({\n\tlistComponent: MentionList,\n\titems: async ({ query }) => {\n\t\tlet customUsers = {}\n\t\tif (typeof options?.mentionSearch === 'function') {\n\t\t\tcustomUsers = await options.mentionSearch(query)\n\t\t}\n\n\t\tconst entries = Object.entries(customUsers).map(([id, label]) => ({\n\t\t\tid,\n\t\t\tlabel,\n\t\t}))\n\t\tif (entries.length >= 6) {\n\t\t\treturn entries\n\t\t}\n\n\t\tconst serverUsers = await getUsers(query, { connection })\n\t\tconst serverEntries = Object.entries(serverUsers)\n\t\t\t.filter(([id]) => !(id in customUsers))\n\t\t\t.map(([id, label]) => ({ id, label }))\n\t\t\t.slice(0, 6 - entries.length)\n\n\t\treturn [...entries, ...serverEntries]\n\t},\n\n\tcommand: ({ editor, range, props }) => {\n\t\tif (options?.emitMention) {\n\t\t\toptions.emitMention({ props })\n\t\t} else {\n\t\t\temitMention(props.id, window.location, { connection })\n\t\t}\n\n\t\t// Insert mention\n\t\t// from https://github.com/ueberdosis/tiptap/blob/9a254bf9daf6d839bd02c968e14837098b903b38/packages/extension-mention/src/mention.ts\n\n\t\t// increase range.to by one when the next node is of type \"text\"\n\t\t// and starts with a space character\n\t\tconst nodeAfter = editor.view.state.selection.$to.nodeAfter\n\t\tconst overrideSpace = nodeAfter?.text?.startsWith(' ')\n\n\t\tif (overrideSpace) {\n\t\t\trange.to += 1\n\t\t}\n\n\t\teditor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.insertContentAt(range, [\n\t\t\t\t{\n\t\t\t\t\ttype: 'mention',\n\t\t\t\t\tattrs: props,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\ttext: ' ',\n\t\t\t\t},\n\t\t\t])\n\t\t\t.run()\n\n\t\twindow.getSelection()?.collapseToEnd()\n\t},\n\t...options,\n})\n","// src/italic.ts\nimport { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nvar starInputRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))$/;\nvar starPasteRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))/g;\nvar underscoreInputRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))$/;\nvar underscorePasteRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))/g;\nvar Italic = Mark.create({\n name: \"italic\",\n addOptions() {\n return {\n HTMLAttributes: {}\n };\n },\n parseHTML() {\n return [\n {\n tag: \"em\"\n },\n {\n tag: \"i\",\n getAttrs: (node) => node.style.fontStyle !== \"normal\" && null\n },\n {\n style: \"font-style=normal\",\n clearMark: (mark) => mark.type.name === this.name\n },\n {\n style: \"font-style=italic\"\n }\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"em\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n addCommands() {\n return {\n setItalic: () => ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleItalic: () => ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetItalic: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n }\n };\n },\n markdownTokenName: \"em\",\n parseMarkdown: (token, helpers) => {\n return helpers.applyMark(\"italic\", helpers.parseInline(token.tokens || []));\n },\n markdownOptions: {\n htmlReopen: {\n open: \"<em>\",\n close: \"</em>\"\n }\n },\n renderMarkdown: (node, h) => {\n return `*${h.renderChildren(node)}*`;\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-i\": () => this.editor.commands.toggleItalic(),\n \"Mod-I\": () => this.editor.commands.toggleItalic()\n };\n },\n addInputRules() {\n return [\n markInputRule({\n find: starInputRegex,\n type: this.type\n }),\n markInputRule({\n find: underscoreInputRegex,\n type: this.type\n })\n ];\n },\n addPasteRules() {\n return [\n markPasteRule({\n find: starPasteRegex,\n type: this.type\n }),\n markPasteRule({\n find: underscorePasteRegex,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Italic;\nexport {\n Italic,\n index_default as default,\n starInputRegex,\n starPasteRegex,\n underscoreInputRegex,\n underscorePasteRegex\n};\n//# sourceMappingURL=index.js.map","// src/code.ts\nimport { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nvar inputRegex = /(^|[^`])`([^`]+)`(?!`)$/;\nvar pasteRegex = /(^|[^`])`([^`]+)`(?!`)/g;\nvar Code = Mark.create({\n name: \"code\",\n addOptions() {\n return {\n HTMLAttributes: {}\n };\n },\n excludes: \"_\",\n code: true,\n exitable: true,\n parseHTML() {\n return [{ tag: \"code\" }];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"code\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n markdownTokenName: \"codespan\",\n parseMarkdown: (token, helpers) => {\n return helpers.applyMark(\"code\", [{ type: \"text\", text: token.text || \"\" }]);\n },\n renderMarkdown: (node, h) => {\n if (!node.content) {\n return \"\";\n }\n return `\\`${h.renderChildren(node.content)}\\``;\n },\n addCommands() {\n return {\n setCode: () => ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleCode: () => ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetCode: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n }\n };\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-e\": () => this.editor.commands.toggleCode()\n };\n },\n addInputRules() {\n return [\n markInputRule({\n find: inputRegex,\n type: this.type\n })\n ];\n },\n addPasteRules() {\n return [\n markPasteRule({\n find: pasteRegex,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Code;\nexport {\n Code,\n index_default as default,\n inputRegex,\n pasteRegex\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { markInputRule, markPasteRule } from '@tiptap/core'\nimport TipTapCode from '@tiptap/extension-code'\n\n/**\n * Regular expressions to match inline code blocks enclosed in backticks.\n * Reverts upstream PR https://github.com/ueberdosis/tiptap/pull/5916 which\n * introduced isuee https://github.com/nextcloud/text/issues/5483.\n */\nexport const inputRegex = /(?<!`)`([^`]+)`(?!`)/\n\n/**\n * Matches inline code while pasting.\n */\nexport const pasteRegex = /(?<!`)`([^`]+)`(?!`)/g\n\nconst Code = TipTapCode.extend({\n\t// List all enabled marks except 'code' and 'link' (issue #4900)\n\texcludes: 'em strike strong underline',\n\n\taddInputRules() {\n\t\treturn [\n\t\t\tmarkInputRule({\n\t\t\t\tfind: inputRegex,\n\t\t\t\ttype: this.type,\n\t\t\t}),\n\t\t]\n\t},\n\n\taddPasteRules() {\n\t\treturn [\n\t\t\tmarkPasteRule({\n\t\t\t\tfind: pasteRegex,\n\t\t\t\ttype: this.type,\n\t\t\t}),\n\t\t]\n\t},\n})\n\nexport default Code\n","// src/highlight.ts\nimport { getStyleProperty, Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nvar inputRegex = /(?:^|\\s)(==(?!\\s+==)((?:[^=]+))==(?!\\s+==))$/;\nvar pasteRegex = /(?:^|\\s)(==(?!\\s+==)((?:[^=]+))==(?!\\s+==))/g;\nvar Highlight = Mark.create({\n name: \"highlight\",\n addOptions() {\n return {\n multicolor: false,\n HTMLAttributes: {}\n };\n },\n addAttributes() {\n if (!this.options.multicolor) {\n return {};\n }\n return {\n color: {\n default: null,\n // Prefer `data-color` (set by our own `renderHTML`) for lossless\n // round-trips. Otherwise parse the raw inline `style` attribute so\n // the original color format (e.g. `#rrggbb`) is preserved instead of\n // the canonicalized `rgb(...)` value from `element.style.backgroundColor`.\n parseHTML: (element) => element.getAttribute(\"data-color\") || getStyleProperty(element, \"background-color\") || element.style.backgroundColor,\n renderHTML: (attributes) => {\n if (!attributes.color) {\n return {};\n }\n return {\n \"data-color\": attributes.color,\n style: `background-color: ${attributes.color}; color: inherit`\n };\n }\n }\n };\n },\n parseHTML() {\n return [\n {\n tag: \"mark\"\n }\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"mark\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n renderMarkdown: (node, h) => {\n return `==${h.renderChildren(node)}==`;\n },\n parseMarkdown: (token, h) => {\n return h.applyMark(\"highlight\", h.parseInline(token.tokens || []));\n },\n markdownTokenizer: {\n name: \"highlight\",\n level: \"inline\",\n start: (src) => src.indexOf(\"==\"),\n tokenize(src, _, h) {\n const rule = /^(==)([^=]+)(==)/;\n const match = rule.exec(src);\n if (match) {\n const innerContent = match[2].trim();\n const children = h.inlineTokens(innerContent);\n return {\n type: \"highlight\",\n raw: match[0],\n text: innerContent,\n tokens: children\n };\n }\n }\n },\n addCommands() {\n return {\n setHighlight: (attributes) => ({ commands }) => {\n return commands.setMark(this.name, attributes);\n },\n toggleHighlight: (attributes) => ({ commands }) => {\n return commands.toggleMark(this.name, attributes);\n },\n unsetHighlight: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n }\n };\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-Shift-h\": () => this.editor.commands.toggleHighlight()\n };\n },\n addInputRules() {\n return [\n markInputRule({\n find: inputRegex,\n type: this.type\n })\n ];\n },\n addPasteRules() {\n return [\n markPasteRule({\n find: pasteRegex,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Highlight;\nexport {\n Highlight,\n index_default as default,\n inputRegex,\n pasteRegex\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TipTapHighlight from '@tiptap/extension-highlight'\n\nconst Highlight = TipTapHighlight.extend({\n\ttoMarkdown: {\n\t\topen: '==',\n\t\tclose: '==',\n\t\tmixable: true,\n\t\texpelEnclosingWhitespace: true,\n\t},\n})\n\nexport default Highlight\n","// src/strike.ts\nimport { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nvar inputRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))$/;\nvar pasteRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))/g;\nvar Strike = Mark.create({\n name: \"strike\",\n addOptions() {\n return {\n HTMLAttributes: {}\n };\n },\n parseHTML() {\n return [\n {\n tag: \"s\"\n },\n {\n tag: \"del\"\n },\n {\n tag: \"strike\"\n },\n {\n style: \"text-decoration\",\n consuming: false,\n getAttrs: (style) => style.includes(\"line-through\") ? {} : false\n }\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"s\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n markdownTokenName: \"del\",\n parseMarkdown: (token, helpers) => {\n return helpers.applyMark(\"strike\", helpers.parseInline(token.tokens || []));\n },\n renderMarkdown: (node, h) => {\n return `~~${h.renderChildren(node)}~~`;\n },\n addCommands() {\n return {\n setStrike: () => ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleStrike: () => ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetStrike: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n }\n };\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-Shift-s\": () => this.editor.commands.toggleStrike()\n };\n },\n addInputRules() {\n return [\n markInputRule({\n find: inputRegex,\n type: this.type\n })\n ];\n },\n addPasteRules() {\n return [\n markPasteRule({\n find: pasteRegex,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Strike;\nexport {\n Strike,\n index_default as default,\n inputRegex,\n pasteRegex\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TipTapStrike from '@tiptap/extension-strike'\n\nexport default TipTapStrike.extend({\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 's',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'del',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'strike',\n\t\t\t},\n\t\t\t{\n\t\t\t\tstyle: 'text-decoration',\n\t\t\t\tgetAttrs: (value) => value === 'line-through',\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML() {\n\t\treturn ['s', 0]\n\t},\n\n\t/** Strike is currently unsupported by prosemirror-markdown */\n\ttoMarkdown: {\n\t\topen: '~~',\n\t\tclose: '~~',\n\t\tmixable: true,\n\t\texpelEnclosingWhitespace: true,\n\t},\n})\n","// src/bold.tsx\nimport { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nimport { jsx } from \"@tiptap/core/jsx-runtime\";\nvar starInputRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))$/;\nvar starPasteRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))/g;\nvar underscoreInputRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))$/;\nvar underscorePasteRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))/g;\nvar Bold = Mark.create({\n name: \"bold\",\n addOptions() {\n return {\n HTMLAttributes: {}\n };\n },\n parseHTML() {\n return [\n {\n tag: \"strong\"\n },\n {\n tag: \"b\",\n getAttrs: (node) => node.style.fontWeight !== \"normal\" && null\n },\n {\n style: \"font-weight=400\",\n clearMark: (mark) => mark.type.name === this.name\n },\n {\n style: \"font-weight\",\n getAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null\n }\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return /* @__PURE__ */ jsx(\"strong\", { ...mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), children: /* @__PURE__ */ jsx(\"slot\", {}) });\n },\n markdownTokenName: \"strong\",\n parseMarkdown: (token, helpers) => {\n return helpers.applyMark(\"bold\", helpers.parseInline(token.tokens || []));\n },\n markdownOptions: {\n htmlReopen: {\n open: \"<strong>\",\n close: \"</strong>\"\n }\n },\n renderMarkdown: (node, h) => {\n return `**${h.renderChildren(node)}**`;\n },\n addCommands() {\n return {\n setBold: () => ({ commands }) => {\n return commands.setMark(this.name);\n },\n toggleBold: () => ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n unsetBold: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n }\n };\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-b\": () => this.editor.commands.toggleBold(),\n \"Mod-B\": () => this.editor.commands.toggleBold()\n };\n },\n addInputRules() {\n return [\n markInputRule({\n find: starInputRegex,\n type: this.type\n }),\n markInputRule({\n find: underscoreInputRegex,\n type: this.type\n })\n ];\n },\n addPasteRules() {\n return [\n markPasteRule({\n find: starPasteRegex,\n type: this.type\n }),\n markPasteRule({\n find: underscorePasteRegex,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Bold;\nexport {\n Bold,\n index_default as default,\n starInputRegex,\n starPasteRegex,\n underscoreInputRegex,\n underscorePasteRegex\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contri SPDX-FileCopyrightText: 2022, 2019, 2026, 2021, 2020, 2022, 2022, 2023, 2023, 2024, 2024, 2024, 2024, 2024, 2026, 2026, 2026, 2022, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { markInputRule, markPasteRule } from '@tiptap/core'\nimport { underscoreInputRegex, underscorePasteRegex } from '@tiptap/extension-bold'\nimport TipTapUnderline from '@tiptap/extension-underline'\n\nconst Underline = TipTapUnderline.extend({\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'u',\n\t\t\t},\n\t\t\t{\n\t\t\t\tstyle: 'text-decoration',\n\t\t\t\tgetAttrs: (value) => value === 'underline',\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML() {\n\t\treturn ['u', 0]\n\t},\n\n\ttoMarkdown: {\n\t\topen: '__',\n\t\tclose: '__',\n\t\tmixable: true,\n\t\texpelEnclosingWhitespace: true,\n\t},\n\n\taddInputRules() {\n\t\treturn [\n\t\t\tmarkInputRule({\n\t\t\t\tfind: underscoreInputRegex,\n\t\t\t\ttype: this.type,\n\t\t\t}),\n\t\t]\n\t},\n\n\taddPasteRules() {\n\t\treturn [\n\t\t\tmarkPasteRule({\n\t\t\t\tfind: underscorePasteRegex,\n\t\t\t\ttype: this.type,\n\t\t\t}),\n\t\t]\n\t},\n})\n\nexport default Underline\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TipTapItalic from '@tiptap/extension-italic'\nimport Code from './Code.ts'\nimport Highlight from './Highlight.ts'\nimport Link from './Link.ts'\nimport Strike from './Strike.js'\nimport Strong from './Strong.js'\nimport Underline from './Underline.js'\n\nconst Italic = TipTapItalic.extend({\n\tname: 'em',\n})\n\nexport { Code, Highlight, Italic, Link, Strike, Strong, Underline }\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { CommandProps } from '@tiptap/core'\nimport type { Node, NodeType } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\n\nimport { findParentNode, isList } from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\n\ntype ParentList = {\n\tpos: number\n\tnode: Node\n}\n\n/**\n * Rebuild a list node with a new list type and item type, preserving all item content.\n *\n * Used for cross-silo list conversion (bulletList/orderedList ↔ taskList) where a simple\n * setNodeMarkup is not sufficient because the child item types also differ\n * (listItem vs taskItem).\n *\n * Only the direct children of the list are retyped; nested sub-lists are preserved as-is.\n * When converting to taskItem the item receives checked: false.\n * When converting away from taskItem the checked attribute is simply dropped.\n *\n * @param parentList - the parent list node\n * @param targetListType - the target list type\n * @param targetItemType - the target item type\n * @param tr - the ProseMirror transaction\n */\nfunction convertListType(\n\tparentList: ParentList,\n\ttargetListType: NodeType,\n\ttargetItemType: NodeType,\n\ttr: Transaction,\n): void {\n\tconst newItems: Node[] = []\n\tparentList.node.forEach((item) => {\n\t\tconst attrs = targetItemType.name === 'taskItem' ? { checked: false } : {}\n\t\tnewItems.push(targetItemType.create(attrs, item.content))\n\t})\n\tconst newList = targetListType.create(parentList.node.attrs, newItems)\n\ttr.replaceWith(\n\t\tparentList.pos,\n\t\tparentList.pos + parentList.node.nodeSize,\n\t\tnewList,\n\t)\n}\n\n/**\n * Returns a Tiptap command that toggles a given list type.\n * To be used by BulletList, OrderedList and TaskList nodes.\n *\n * Handles cross-type conversion (e.g. bulletList → taskList) that\n * `toggleList` cannot handle due to incompatible item types.\n *\n * @param listTypeName - the target list type\n * @param itemTypeName - the target item type\n */\nexport function toggleListCommand(listTypeName: string, itemTypeName: string) {\n\treturn () => ({ editor, state, tr, dispatch, commands }: CommandProps): boolean => {\n\t\tconst { extensions } = editor.extensionManager\n\n\t\tconst parentList = findParentNode((node) => isList(node.type.name, extensions))(state.selection)\n\n\t\tconst listType = state.schema.nodes[listTypeName]!\n\t\tconst itemType = state.schema.nodes[itemTypeName]!\n\n\t\tif (\n\t\t\tparentList\n\t\t\t&& parentList.node.type !== listType\n\t\t\t&& !listType.validContent(parentList.node.content)\n\t\t) {\n\t\t\tif (!dispatch) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tconst { from, to } = state.selection\n\t\t\tconvertListType(parentList, listType, itemType, tr)\n\t\t\ttr.setSelection(TextSelection.create(tr.doc, from, to))\n\t\t\tdispatch(tr)\n\t\t\treturn true\n\t\t}\n\n\t\treturn commands.toggleList(listType, itemType)\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { InputRule, wrappingInputRule } from '@tiptap/core'\n\ntype FindType = Parameters<typeof wrappingInputRule>[0]['find']\ntype GetAttributesType = Parameters<typeof wrappingInputRule>[0]['getAttributes']\ntype HandlerType = ConstructorParameters<typeof InputRule>[0]['handler']\n\n/**\n * Wrapping input handler that will append the content of the last match\n *\n * @param find find param for the wrapping input rule\n * @param type Node Type object\n * @param getAttributes handler to get the attributes\n */\nexport default function(find: FindType, type: NodeType, getAttributes: GetAttributesType = null) {\n\tconst handler: HandlerType = (props) => {\n\t\tconst wrap = wrappingInputRule({ find, type, getAttributes })\n\t\twrap.handler(props)\n\t\t// Insert the first character after bullet if there is one\n\t\tif (props.match.length >= 3) {\n\t\t\tprops.state.tr.insertText(props.match[2])\n\t\t}\n\t}\n\treturn new InputRule({ find, handler })\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { BulletList as TiptapBulletList } from '@tiptap/extension-list'\nimport { listInputRule, toggleListCommand } from '../commands/index.ts'\n\n/* We want to allow for `* [ ]` as an input rule for bullet lists.\n * Therefore the list input rules need to check the input\n * until the first char after the space.\n * Only there we know the user is not trying to create a task list.\n */\nconst BulletList = TiptapBulletList.extend({\n\taddAttributes() {\n\t\treturn {\n\t\t\t...this.parent?.(),\n\t\t\tisList: {\n\t\t\t\tdefault: true,\n\t\t\t\trendered: false,\n\t\t\t},\n\t\t\tbullet: {\n\t\t\t\tdefault: '-',\n\t\t\t\trendered: false,\n\t\t\t\tparseHTML: (el) => el.getAttribute('data-bullet'),\n\t\t\t},\n\t\t}\n\t},\n\n\taddInputRules() {\n\t\treturn [listInputRule(/^\\s*([-+*])\\s([^\\s[]+)$/, this.type)]\n\t},\n\n\taddCommands() {\n\t\treturn {\n\t\t\t...this.parent?.(),\n\t\t\ttoggleBulletList: toggleListCommand('bulletList', 'listItem'),\n\t\t}\n\t},\n})\n\nexport default BulletList\n","<!--\n - SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<NodeViewWrapper\n\t\tdata-text-el=\"callout\"\n\t\tclass=\"callout\"\n\t\t:class=\"`callout--${type}`\"\n\t\t:dir=\"dir\"\n\t\tas=\"div\">\n\t\t<component :is=\"icon\" class=\"callout__icon\" />\n\t\t<NodeViewContent class=\"callout__content\" />\n\t</NodeViewWrapper>\n</template>\n\n<script>\nimport { NodeViewContent, NodeViewWrapper } from '@tiptap/vue-3'\nimport { Danger, Info, Positive, Warn } from '../components/icons.js'\n\nconst ICONS_MAP = {\n\tinfo: Info,\n\tsuccess: Positive,\n\terror: Danger,\n\twarn: Warn,\n}\n\nexport default {\n\tname: 'CalloutView',\n\tcomponents: {\n\t\tNodeViewWrapper,\n\t\tNodeViewContent,\n\t},\n\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\ticon() {\n\t\t\treturn ICONS_MAP[this.type] || Info\n\t\t},\n\n\t\ttype() {\n\t\t\treturn this.node.attrs.type || 'info'\n\t\t},\n\n\t\tdir() {\n\t\t\treturn this.node.attrs.dir || ''\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.callout {\n\tbackground-color: var(--callout-background, var(--color-background-hover));\n\tborder-inline-start-color: var(--callout-border, var(--color-primary-element));\n\tborder-radius: var(--border-radius);\n\tpadding: 1em;\n\tpadding-inline-start: 0.5em;\n\tborder-inline-start-width: 0.3em;\n\tborder-inline-start-style: solid;\n\tposition: relative;\n\tmargin-bottom: 0.5em;\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\n\t& + * {\n\t\tmargin-top: 0.5em;\n\t}\n\n\t.callout__content {\n\t\tmargin-inline-start: 1em;\n\t\t&:deep(p) {\n\t\t\t&:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t.callout__icon {\n\t\t&,\n\t\t:deep(svg) {\n\t\t\tcolor: var(--callout-border);\n\t\t}\n\t}\n\n\t// Info (default) variables\n\t&,\n\t&--info {\n\t\t--callout-border: var(--color-element-info, #006aa3);\n\t}\n\n\t// Warn variables\n\t&--warn {\n\t\t--callout-border: var(--color-element-warning);\n\t}\n\n\t// Error variables\n\t&--error {\n\t\t--callout-border: var(--color-element-error);\n\t}\n\n\t// Success variables\n\t&--success {\n\t\t--callout-border: var(--color-element-success);\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { isNodeActive, mergeAttributes, Node } from '@tiptap/core'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport CalloutView from './CalloutView.vue'\nimport { typesAvailable } from '../markdownit/callouts.js'\n\nexport default Node.create({\n\tname: 'callout',\n\n\tcontent: 'paragraph+',\n\n\tgroup: 'block',\n\n\tdefining: true,\n\n\taddOptions() {\n\t\treturn {\n\t\t\ttypes: typesAvailable,\n\t\t\tHTMLAttributes: {\n\t\t\t\tclass: 'callout',\n\t\t\t},\n\t\t}\n\t},\n\n\taddAttributes() {\n\t\treturn {\n\t\t\ttype: {\n\t\t\t\tdefault: 'info',\n\t\t\t\trendered: false,\n\t\t\t\tparseHTML: (element) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\telement.getAttribute('data-callout')\n\t\t\t\t\t\t|| typesAvailable.find((type) => element.classList.contains(type))\n\t\t\t\t\t\t|| (element.classList.contains('warning') && 'warn')\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\trenderHTML: (attributes) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t'data-callout': attributes.type,\n\t\t\t\t\t\tclass: `callout-${attributes.type}`,\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'div.callout',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'p.callout',\n\t\t\t\tpriority: 1001,\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ node, HTMLAttributes }) {\n\t\tconst { class: classy } = this.options.HTMLAttributes\n\n\t\tconst attributes = {\n\t\t\t...this.options.HTMLAttributes,\n\t\t\t'data-callout': node.attrs.type,\n\t\t\tclass: `${classy} ${classy}-${node.attrs.type}`,\n\t\t}\n\n\t\treturn ['div', mergeAttributes(attributes, HTMLAttributes), 0]\n\t},\n\n\ttoMarkdown: (state, node) => {\n\t\tstate.write('::: ' + (node.attrs.type || 'info') + '\\n')\n\t\tstate.renderContent(node)\n\t\tstate.ensureNewLine()\n\t\tstate.write(':::')\n\t\tstate.closeBlock(node)\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(CalloutView)\n\t},\n\n\taddCommands() {\n\t\treturn {\n\t\t\tsetCallout:\n\t\t\t\t(attributes) => ({ commands }) => {\n\t\t\t\t\treturn commands.wrapIn(this.name, attributes)\n\t\t\t\t},\n\t\t\ttoggleCallout:\n\t\t\t\t(attributes) => ({ commands, state }) => {\n\t\t\t\t\tif (!isNodeActive(state, this.name)) {\n\t\t\t\t\t\treturn commands.setCallout(attributes)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isNodeActive(state, this.name, attributes)) {\n\t\t\t\t\t\treturn commands.updateAttributes(this.name, attributes)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn commands.unsetCallout()\n\t\t\t\t},\n\t\t\tunsetCallout:\n\t\t\t\t() => ({ commands }) => {\n\t\t\t\t\treturn commands.lift(this.name)\n\t\t\t\t},\n\t\t}\n\t},\n})\n","// src/code-block-lowlight.ts\nimport { CodeBlock } from \"@tiptap/extension-code-block\";\n\n// src/lowlight-plugin.ts\nimport { findChildren } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport highlight from \"highlight.js/lib/core\";\nfunction parseNodes(nodes, className = []) {\n return nodes.flatMap((node) => {\n const classes = [...className, ...node.properties ? node.properties.className : []];\n if (node.children) {\n return parseNodes(node.children, classes);\n }\n return {\n text: node.value,\n classes\n };\n });\n}\nfunction getHighlightNodes(result) {\n return result.value || result.children || [];\n}\nfunction registered(aliasOrLanguage) {\n return Boolean(highlight.getLanguage(aliasOrLanguage));\n}\nfunction getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage\n}) {\n const decorations = [];\n findChildren(doc, (node) => node.type.name === name).forEach((block) => {\n var _a;\n let from = block.pos + 1;\n const language = block.node.attrs.language || defaultLanguage;\n const languages = lowlight.listLanguages();\n const nodes = language && (languages.includes(language) || registered(language) || ((_a = lowlight.registered) == null ? void 0 : _a.call(lowlight, language))) ? getHighlightNodes(lowlight.highlight(language, block.node.textContent)) : getHighlightNodes(lowlight.highlightAuto(block.node.textContent));\n parseNodes(nodes).forEach((node) => {\n const to = from + node.text.length;\n if (node.classes.length) {\n const decoration = Decoration.inline(from, to, {\n class: node.classes.join(\" \")\n });\n decorations.push(decoration);\n }\n from = to;\n });\n });\n return DecorationSet.create(doc, decorations);\n}\nfunction isFunction(param) {\n return typeof param === \"function\";\n}\nfunction LowlightPlugin({\n name,\n lowlight,\n defaultLanguage\n}) {\n if (![\"highlight\", \"highlightAuto\", \"listLanguages\"].every((api) => isFunction(lowlight[api]))) {\n throw Error(\"You should provide an instance of lowlight to use the code-block-lowlight extension\");\n }\n const lowlightPlugin = new Plugin({\n key: new PluginKey(\"lowlight\"),\n state: {\n init: (_, { doc }) => getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage\n }),\n apply: (transaction, decorationSet, oldState, newState) => {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n const oldNodes = findChildren(oldState.doc, (node) => node.type.name === name);\n const newNodes = findChildren(newState.doc, (node) => node.type.name === name);\n if (transaction.docChanged && // Apply decorations if:\n // selection includes named node,\n ([oldNodeName, newNodeName].includes(name) || // OR transaction adds/removes named node,\n newNodes.length !== oldNodes.length || // OR transaction has changes that completely encapsulte a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n transaction.steps.some((step) => {\n return (\n // @ts-ignore\n step.from !== void 0 && // @ts-ignore\n step.to !== void 0 && oldNodes.some((node) => {\n return (\n // @ts-ignore\n node.pos >= step.from && // @ts-ignore\n node.pos + node.node.nodeSize <= step.to\n );\n })\n );\n }))) {\n return getDecorations({\n doc: transaction.doc,\n name,\n lowlight,\n defaultLanguage\n });\n }\n return decorationSet.map(transaction.mapping, transaction.doc);\n }\n },\n props: {\n decorations(state) {\n return lowlightPlugin.getState(state);\n }\n }\n });\n return lowlightPlugin;\n}\n\n// src/code-block-lowlight.ts\nvar CodeBlockLowlight = CodeBlock.extend({\n addOptions() {\n var _a;\n return {\n ...(_a = this.parent) == null ? void 0 : _a.call(this),\n lowlight: {},\n languageClassPrefix: \"language-\",\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n defaultLanguage: null,\n enableTabIndentation: false,\n tabSize: 4,\n HTMLAttributes: {}\n };\n },\n addProseMirrorPlugins() {\n var _a;\n return [\n ...((_a = this.parent) == null ? void 0 : _a.call(this)) || [],\n LowlightPlugin({\n name: this.name,\n lowlight: this.options.lowlight,\n defaultLanguage: this.options.defaultLanguage\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = CodeBlockLowlight;\nexport {\n CodeBlockLowlight,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","const rnds8 = new Uint8Array(16);\nexport default function rng() {\n return crypto.getRandomValues(rnds8);\n}\n","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (!buf && !options && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon code-braces-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=\"M8,3A2,2 0 0,0 6,5V9A2,2 0 0,1 4,11H3V13H4A2,2 0 0,1 6,15V19A2,2 0 0,0 8,21H10V19H8V14A2,2 0 0,0 6,12A2,2 0 0,0 8,10V5H10V3M16,3A2,2 0 0,1 18,5V9A2,2 0 0,0 20,11H21V13H20A2,2 0 0,0 18,15V19A2,2 0 0,1 16,21H14V19H16V14A2,2 0 0,1 18,12A2,2 0 0,1 16,10V5H14V3H16Z\">\n <title v-if=\"title\">{{ title }}\n \n \n \n\n\n","\n\n","\n\n","\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TiptapCodeBlockLowlight from '@tiptap/extension-code-block-lowlight'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport CodeBlockView from './CodeBlock/CodeBlockView.vue'\nimport codeBlockShortcuts from './CodeBlock/codeBlockShortcuts.js'\n\nconst CodeBlock = TiptapCodeBlockLowlight.extend({\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'pre',\n\t\t\t\tpreserveWhitespace: 'full',\n\t\t\t\t// Remove trailing newline from code blocks (#2344)\n\t\t\t\tgetContent: (node, schema) => {\n\t\t\t\t\tconst textContent = node.textContent.replace(/\\n$/, '')\n\t\t\t\t\tconst inner = textContent ? [schema.text(textContent)] : []\n\t\t\t\t\treturn schema.nodes.codeBlock.create(null, inner)\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\t},\n\n\ttoMarkdown(state, node) {\n\t\t// @tiptap/pm/markdown uses `params` instead of `language` attribute\n\t\tnode.attrs.params = node.attrs.language\n\n\t\t// After https://github.com/ProseMirror/prosemirror-markdown/pull/90 the upstream markdown serialization\n\t\t// is no longer comparible with our extraction stripping the last new line, so we keep a reverted copy\n\t\t// to stay consistent with our unit tests\n\n\t\t// Make sure the front matter fences are longer than any dash sequence within it\n\t\tconst backticks = node.textContent.match(/`{3,}/gm)\n\t\tconst fence = backticks ? backticks.sort().slice(-1)[0] + '`' : '```'\n\n\t\tconst language = node.attrs.params !== 'plaintext' ? node.attrs.params : ''\n\t\tstate.write(fence + (language || '') + '\\n')\n\t\tstate.text(node.textContent, false)\n\t\t// Add a newline to the current content before adding closing marker\n\t\tstate.ensureNewLine()\n\t\tstate.write(fence)\n\t\tstate.closeBlock(node)\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(CodeBlockView)\n\t},\n\n\taddKeyboardShortcuts() {\n\t\treturn codeBlockShortcuts\n\t},\n})\n\nexport default CodeBlock\n","\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { mergeAttributes, Node } from '@tiptap/core'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport DetailsContentView from './DetailsContent.vue'\n\nconst DetailsContent = Node.create({\n\tname: 'detailsContent',\n\t// TODO: don't allow nested details\n\tcontent: 'block+',\n\tdefining: true,\n\tselectable: false,\n\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: `div[data-type=\"${this.name}\"]`,\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t'div',\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n\t\t\t\tclass: 'details-content',\n\t\t\t}),\n\t\t\t0,\n\t\t]\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(DetailsContentView)\n\t},\n\n\ttoMarkdown: (state, node) => {\n\t\tstate.renderContent(node)\n\t\tstate.ensureNewLine()\n\t},\n})\n\nexport default DetailsContent\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { mergeAttributes, Node } from '@tiptap/core'\n\nconst DetailsSummary = Node.create({\n\tname: 'detailsSummary',\n\tcontent: 'text*',\n\tdefining: true,\n\tselectable: false,\n\tisolating: true,\n\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'summary',\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t'summary',\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0,\n\t\t]\n\t},\n\n\ttoMarkdown: (state, node) => {\n\t\tstate.write('')\n\t\tstate.renderInline(node)\n\t\tstate.write('\\n')\n\t},\n})\n\nexport default DetailsSummary\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { isNodeActive, mergeAttributes, Node } from '@tiptap/core'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport DetailsView from './DetailsView.vue'\nimport DetailsContent from './DetailsContent.js'\nimport DetailsSummary from './DetailsSummary.js'\n\n/**\n * Get first details node from parent nodes of a resolved position\n *\n * @param {object} resolvedPos - resolved position\n * @param {object} schema - prosemirror editor schema\n */\nfunction detailsParentInfo(resolvedPos, schema) {\n\tfor (let depth = resolvedPos.depth; depth > 0; depth -= 1) {\n\t\tconst node = resolvedPos.node(depth)\n\t\tif (node.type === schema.nodes.details) {\n\t\t\treturn {\n\t\t\t\tpos: depth > 0 ? resolvedPos.before(depth) : 0,\n\t\t\t\tnode,\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Get first child node of a type from descendants of a node\n *\n * @param {object} node - prosemirror node\n * @param {object} nodeType - prosemirror node type\n */\nfunction childFromNode(node, nodeType) {\n\tconst childNodes = []\n\tnode.descendants((childNode) => {\n\t\tif (childNode.type === nodeType) {\n\t\t\tchildNodes.push(childNode)\n\t\t\treturn false\n\t\t}\n\t})\n\treturn childNodes.length > 0 ? childNodes[0] : null\n}\n\nconst Details = Node.create({\n\tname: 'details',\n\tcontent: 'detailsSummary detailsContent',\n\tgroup: 'block',\n\tdefining: true,\n\tisolating: true,\n\tallowGapCursor: false,\n\n\taddExtensions() {\n\t\treturn [DetailsContent, DetailsSummary]\n\t},\n\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t}\n\t},\n\n\taddAttributes() {\n\t\treturn {\n\t\t\topenDetails: {\n\t\t\t\tdefault: false,\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'details',\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t'details',\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0,\n\t\t]\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(DetailsView)\n\t},\n\n\ttoMarkdown: (state, node) => {\n\t\tstate.write('
    \\n')\n\t\tstate.renderContent(node)\n\t\tstate.closeBlock(node)\n\t\tstate.ensureNewLine()\n\t\tstate.write('
    ')\n\t\tstate.ensureNewLine()\n\t},\n\n\taddCommands() {\n\t\treturn {\n\t\t\tsetDetails:\n\t\t\t\t() => ({ state, chain }) => {\n\t\t\t\t\tconst { schema, selection } = state\n\t\t\t\t\tconst { $from, $to } = selection\n\t\t\t\t\tconst blockRange = $from.blockRange($to)\n\t\t\t\t\tif (!blockRange) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\tconst slice = state.doc.slice(blockRange.start, blockRange.end)\n\t\t\t\t\tif (\n\t\t\t\t\t\t!schema.nodes.detailsContent.contentMatch.matchFragment(slice.content)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tconst sliceContent = slice.toJSON()?.content || []\n\n\t\t\t\t\treturn chain()\n\t\t\t\t\t\t.insertContentAt(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfrom: blockRange.start,\n\t\t\t\t\t\t\t\tto: blockRange.end,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: this.name,\n\t\t\t\t\t\t\t\tattrs: {\n\t\t\t\t\t\t\t\t\topenDetails: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{ type: 'detailsSummary' },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'detailsContent',\n\t\t\t\t\t\t\t\t\t\tcontent: sliceContent,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.setTextSelection(blockRange.start + 2)\n\t\t\t\t\t\t.run()\n\t\t\t\t},\n\t\t\tunsetDetails:\n\t\t\t\t() => ({ state, chain }) => {\n\t\t\t\t\tconst { schema, selection } = state\n\t\t\t\t\tconst details = detailsParentInfo(selection.$from, schema)\n\t\t\t\t\tif (!details) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tconst detailsContent = childFromNode(\n\t\t\t\t\t\tdetails.node,\n\t\t\t\t\t\tschema.nodes.detailsContent,\n\t\t\t\t\t)\n\t\t\t\t\tif (!detailsContent) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content = detailsContent.content.toJSON()\n\t\t\t\t\tconst range = {\n\t\t\t\t\t\tfrom: details.pos,\n\t\t\t\t\t\tto: details.pos + details.node.nodeSize,\n\t\t\t\t\t}\n\n\t\t\t\t\treturn chain()\n\t\t\t\t\t\t.insertContentAt(range, content)\n\t\t\t\t\t\t.setTextSelection(details.pos + 1)\n\t\t\t\t\t\t.run()\n\t\t\t\t},\n\t\t\ttoggleDetails:\n\t\t\t\t() => ({ commands, state }) => {\n\t\t\t\t\tif (!isNodeActive(state, this.name)) {\n\t\t\t\t\t\treturn commands.setDetails()\n\t\t\t\t\t}\n\t\t\t\t\treturn commands.unsetDetails()\n\t\t\t\t},\n\t\t}\n\t},\n\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * in summary\n\t\t\t * Expand details and jump to content\n\t\t\t *\n\t\t\t * @param {object} object - object\n\t\t\t * @param {object} object.editor - the editor\n\t\t\t */\n\t\t\tEnter: ({ editor }) => {\n\t\t\t\tconst { state } = editor\n\t\t\t\tconst { schema, selection } = state\n\t\t\t\tconst { $from } = selection\n\t\t\t\tif ($from.parent.type !== schema.nodes.detailsSummary) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst details = detailsParentInfo($from, schema)\n\t\t\t\tif (!details.node.attrs.openDetails) {\n\t\t\t\t\teditor.commands.updateAttributes('details', {\n\t\t\t\t\t\topenDetails: true,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst detailsContent = childFromNode(\n\t\t\t\t\tdetails.node,\n\t\t\t\t\tschema.nodes.detailsContent,\n\t\t\t\t)\n\t\t\t\tif (!detailsContent) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\t// Check if next node is detailsContent\n\t\t\t\tconst nextNode = state.doc.nodeAt($from.after())\n\t\t\t\tif (!nextNode?.type === schema.nodes.detailsContent) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\treturn editor.commands.setTextSelection($from.after())\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * in empty summary\n\t\t\t * Unset details\n\t\t\t *\n\t\t\t * @param {object} object - object\n\t\t\t * @param {object} object.editor - the editor\n\t\t\t */\n\t\t\tBackspace: ({ editor }) => {\n\t\t\t\tconst { state } = editor\n\t\t\t\tconst { schema, selection } = state\n\t\t\t\tconst { $from } = selection\n\t\t\t\tif ($from.parent.type !== schema.nodes.detailsSummary) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif ($from.parent.textContent !== '') {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\treturn editor.commands.unsetDetails()\n\t\t\t},\n\t\t}\n\t},\n})\n\nexport default Details\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { mergeAttributes, Node } from '@tiptap/core'\n\nconst Footnote = Node.create({\n\tname: 'footnote',\n\tcontent: 'block+',\n\tdefining: true,\n\tisolating: true,\n\n\taddAttributes() {\n\t\treturn {\n\t\t\treferenceId: {\n\t\t\t\tdefault: '',\n\t\t\t\tparseHTML: (el) => el.getAttribute('data-reference-id') ?? '',\n\t\t\t\trenderHTML: (attrs) => ({\n\t\t\t\t\t'data-reference-id': attrs.referenceId,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tordinal: {\n\t\t\t\tdefault: 0,\n\t\t\t\trendered: false,\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'div[data-type=\"footnote\"]',\n\t\t\t\t// Skip the label span; recurse into the body wrapper\n\t\t\t\tcontentElement: (dom) => (dom as HTMLElement).querySelector('.footnote-body') ?? (dom as HTMLElement),\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ node, HTMLAttributes }) {\n\t\tconst id = node.attrs.referenceId\n\t\tconst ordinal = node.attrs.ordinal\n\t\treturn [\n\t\t\t'div',\n\t\t\tmergeAttributes(HTMLAttributes, {\n\t\t\t\t'data-type': 'footnote',\n\t\t\t\tid: `fn-${id}`,\n\t\t\t\tstyle: `order: ${ordinal || 0}`,\n\t\t\t}),\n\t\t\t['span', { class: 'footnote-label', contenteditable: 'false', title: id }, String(ordinal || '')],\n\t\t\t[\n\t\t\t\t'div',\n\t\t\t\t{ class: 'footnote-body-wrapper' },\n\t\t\t\t['div', { class: 'footnote-body' }, 0],\n\t\t\t\t['a', { href: `#fnref-${id}`, class: 'footnote-backref', contenteditable: 'false', 'aria-label': 'Back to reference' }, '↩'],\n\t\t\t],\n\t\t]\n\t},\n\n\ttoMarkdown(state, node) {\n\t\tconst marker = `[^${node.attrs.referenceId}]: `\n\t\tconst wrapper = ' '.repeat(marker.length)\n\t\tstate.wrapBlock(wrapper, marker, node, () => state.renderContent(node))\n\t\tstate.closeBlock(node)\n\t},\n})\n\nexport default Footnote\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport { InputRule, mergeAttributes, Node } from '@tiptap/core'\nimport { Plugin, TextSelection } from '@tiptap/pm/state'\n\ndeclare module '@tiptap/core' {\n\tinterface Commands {\n\t\tfootnoteReference: {\n\t\t\t/**\n\t\t\t * Insert a new footnote at the current selection and\n\t\t\t * create a matching definition in the trailing footnotes\n\t\t\t * block.\n\t\t\t */\n\t\t\tinsertFootnote: (options?: { referenceId?: string }) => ReturnType\n\t\t}\n\t}\n}\n\nconst FootnoteReference = Node.create({\n\tname: 'footnoteReference',\n\tgroup: 'inline',\n\tinline: true,\n\tatom: true,\n\n\taddAttributes() {\n\t\treturn {\n\t\t\treferenceId: {\n\t\t\t\tdefault: '',\n\t\t\t\tparseHTML: (el) => el.getAttribute('data-reference-id') ?? '',\n\t\t\t\trenderHTML: (attrs) => ({\n\t\t\t\t\t'data-reference-id': attrs.referenceId,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tordinal: {\n\t\t\t\tdefault: 0,\n\t\t\t\trendered: false,\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [{ tag: 'sup[data-type=\"footnote-reference\"]' }]\n\t},\n\n\trenderHTML({ node, HTMLAttributes }) {\n\t\tconst id = node.attrs.referenceId\n\t\tconst ordinal = node.attrs.ordinal\n\t\treturn [\n\t\t\t'sup',\n\t\t\tmergeAttributes(HTMLAttributes, {\n\t\t\t\t'data-type': 'footnote-reference',\n\t\t\t\tid: `fnref-${id}`,\n\t\t\t}),\n\t\t\t[\n\t\t\t\t'a',\n\t\t\t\t{ href: `#fn-${id}`, class: 'footnote-ref', role: 'doc-noteref', title: id },\n\t\t\t\tString(ordinal || ''),\n\t\t\t],\n\t\t]\n\t},\n\n\ttoMarkdown(state, node) {\n\t\tstate.write(`[^${node.attrs.referenceId}]`)\n\t},\n\n\taddCommands() {\n\t\treturn {\n\t\t\tinsertFootnote: (options?: { referenceId?: string }) => ({ state, chain }) => {\n\t\t\t\tif (isInsideFootnote(state)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst referenceId = options?.referenceId\n\t\t\t\t\t? String(options.referenceId)\n\t\t\t\t\t: generateFootnoteId(state.doc)\n\t\t\t\tif (!referenceId) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst existingFootnote = footnoteExists(state.doc, referenceId)\n\n\t\t\t\tconst footnotesType = state.schema.nodes.footnotes\n\t\t\t\tconst footnoteType = state.schema.nodes.footnote\n\t\t\t\tconst paragraphType = state.schema.nodes.paragraph\n\n\t\t\t\tlet c = chain()\n\t\t\t\t\t.insertContent({ type: 'footnoteReference', attrs: { referenceId } })\n\n\t\t\t\tif (!existingFootnote) {\n\t\t\t\t\t// Create footnote\n\t\t\t\t\tconst newFootnote = footnoteType.create({ referenceId }, paragraphType.create())\n\t\t\t\t\tconst lastChild = state.doc.lastChild\n\t\t\t\t\tconst hasFootnotesBlock = lastChild?.type === footnotesType\n\n\t\t\t\t\tif (hasFootnotesBlock) {\n\t\t\t\t\t\t// Append footnote inside the existing footnotes container\n\t\t\t\t\t\tconst insertPos = state.doc.content.size - 1\n\t\t\t\t\t\tc = c.insertContentAt(insertPos, newFootnote.toJSON())\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Create footnotes container + footnote\n\t\t\t\t\t\tc = c.insertContentAt(state.doc.content.size, {\n\t\t\t\t\t\t\ttype: 'footnotes',\n\t\t\t\t\t\t\tcontent: [newFootnote.toJSON()],\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Jump cursor into existing footnote\n\t\t\t\t\tc = c.command(({ tr }) => {\n\t\t\t\t\t\tlet target: number | null = null\n\t\t\t\t\t\ttr.doc.descendants((node, pos) => {\n\t\t\t\t\t\t\tif (target !== null) {\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (node.type.name === 'footnote' && node.attrs.referenceId === referenceId) {\n\t\t\t\t\t\t\t\ttarget = pos + node.nodeSize - 2\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (target !== null) {\n\t\t\t\t\t\t\ttr.setSelection(TextSelection.near(tr.doc.resolve(target)))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn c\n\t\t\t\t\t.focus()\n\t\t\t\t\t.scrollIntoView()\n\t\t\t\t\t.run()\n\t\t\t},\n\t\t}\n\t},\n\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t'Mod-Shift-f': () => this.editor.commands.insertFootnote(),\n\t\t}\n\t},\n\n\taddInputRules() {\n\t\treturn [\n\t\t\tnew InputRule({\n\t\t\t\tfind: /\\[\\^\\]$/,\n\t\t\t\thandler: ({ state, range, chain }) => {\n\t\t\t\t\tif (isInsideFootnote(state)) {\n\t\t\t\t\t\treturn null\n\t\t\t\t\t}\n\n\t\t\t\t\tchain()\n\t\t\t\t\t\t.deleteRange({ from: range.from, to: range.to })\n\t\t\t\t\t\t.insertFootnote()\n\t\t\t\t\t\t.run()\n\t\t\t\t},\n\t\t\t}),\n\t\t]\n\t},\n\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\t// Highlight target when navigating between footnote references and footnotes\n\t\t\tnew Plugin({\n\t\t\t\tprops: {\n\t\t\t\t\thandleClick(view, _pos, event) {\n\t\t\t\t\t\tconst link = (event.target as HTMLElement).closest('.footnote-ref, .footnote-backref')\n\t\t\t\t\t\tif (!link) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst href = link.getAttribute('href')\n\t\t\t\t\t\tif (!href?.startsWith('#')) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst target = view.dom.ownerDocument.getElementById(href.slice(1))\n\t\t\t\t\t\tif (!target) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttarget.classList.add('footnote-highlight')\n\t\t\t\t\t\tsetTimeout(() => target.classList.remove('footnote-highlight'), 5000)\n\t\t\t\t\t\treturn false\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t]\n\t},\n})\n\n/**\n * Check if selection is inside a footnote\n *\n * @param state the editor state\n */\nfunction isInsideFootnote(state: EditorState): boolean {\n\tconst { $from } = state.selection\n\tfor (let d = $from.depth; d > 0; d--) {\n\t\tif ($from.node(d).type.name === 'footnote') {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n/**\n * Get first unused numeric footnote id\n *\n * @param doc the document node\n */\nfunction generateFootnoteId(doc: ProseMirrorNode): string {\n\tconst existing = new Set()\n\tdoc.descendants((node) => {\n\t\tif (node.type.name === 'footnoteReference' || node.type.name === 'footnote') {\n\t\t\tconst id = node.attrs.referenceId\n\t\t\tif (id) {\n\t\t\t\texisting.add(String(id))\n\t\t\t}\n\t\t}\n\t})\n\tfor (let i = 1; i < 10_000; i++) {\n\t\tconst candidate = String(i)\n\t\tif (!existing.has(candidate)) {\n\t\t\treturn candidate\n\t\t}\n\t}\n\treturn ''\n}\n\n/**\n * Check if footnote with reference id exists\n *\n * @param doc - the ProseMirror node\n * @param id - the searched reference id\n */\nfunction footnoteExists(doc: ProseMirrorNode, id: string): boolean {\n\tlet found = false\n\tdoc.descendants((node) => {\n\t\tif (found) {\n\t\t\treturn false\n\t\t}\n\t\tif (node.type.name === 'footnote' && node.attrs.referenceId === id) {\n\t\t\tfound = true\n\t\t\treturn false\n\t\t}\n\t})\n\treturn found\n}\n\nexport default FootnoteReference\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { mergeAttributes, Node } from '@tiptap/core'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport Footnote from './Footnote.ts'\nimport FootnoteReference from './FootnoteReference.ts'\n\nconst Footnotes = Node.create({\n\tname: 'footnotes',\n\tcontent: 'footnote+',\n\tdefining: true,\n\tisolating: true,\n\tallowGapCursor: false,\n\n\taddExtensions() {\n\t\treturn [Footnote, FootnoteReference]\n\t},\n\n\tparseHTML() {\n\t\treturn [{ tag: 'section[data-type=\"footnotes\"]' }]\n\t},\n\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t'section',\n\t\t\tmergeAttributes(HTMLAttributes, { 'data-type': 'footnotes' }),\n\t\t\t0,\n\t\t]\n\t},\n\n\ttoMarkdown(state, node) {\n\t\tstate.renderContent(node)\n\t},\n\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tkey: new PluginKey('footnoteOrdinals'),\n\t\t\t\tappendTransaction(transactions, _oldState, newState) {\n\t\t\t\t\tif (!transactions.some((tr) => tr.docChanged)) {\n\t\t\t\t\t\treturn null\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute ordinals\n\t\t\t\t\tconst ordinals = new Map()\n\t\t\t\t\tnewState.doc.descendants((node) => {\n\t\t\t\t\t\tif (node.type.name === 'footnoteReference') {\n\t\t\t\t\t\t\tconst id = node.attrs.referenceId\n\t\t\t\t\t\t\tif (id && !ordinals.has(id)) {\n\t\t\t\t\t\t\t\tordinals.set(id, ordinals.size + 1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tconst tr = newState.tr\n\t\t\t\t\tlet hasChange = false\n\t\t\t\t\tnewState.doc.descendants((node, pos) => {\n\t\t\t\t\t\tif (node.type.name !== 'footnoteReference' && node.type.name !== 'footnote') {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst targetOrdinal = ordinals.get(node.attrs.referenceId) ?? 0\n\t\t\t\t\t\tif (node.attrs.ordinal !== targetOrdinal) {\n\t\t\t\t\t\t\ttr.setNodeAttribute(pos, 'ordinal', targetOrdinal)\n\t\t\t\t\t\t\thasChange = true\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tif (!hasChange) {\n\t\t\t\t\t\treturn null\n\t\t\t\t\t}\n\t\t\t\t\ttr.setMeta('addToHistory', false)\n\t\t\t\t\treturn tr\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew Plugin({\n\t\t\t\tkey: new PluginKey('footnotesCleanup'),\n\t\t\t\tappendTransaction(transactions, _oldState, newState) {\n\t\t\t\t\tif (!transactions.some((tr) => tr.docChanged)) {\n\t\t\t\t\t\treturn null\n\t\t\t\t\t}\n\n\t\t\t\t\tconst deletions: { pos: number, size: number }[] = []\n\t\t\t\t\tnewState.doc.forEach((child, offset) => {\n\t\t\t\t\t\tif (child.type.name !== 'footnotes') {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst referencedLabels = new Set()\n\t\t\t\t\t\tnewState.doc.descendants((node) => {\n\t\t\t\t\t\t\tif (node.type.name === 'footnoteReference') {\n\t\t\t\t\t\t\t\treferencedLabels.add(node.attrs.referenceId)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tconst containerPos = offset\n\n\t\t\t\t\t\tconst orphans: { pos: number, size: number }[] = []\n\t\t\t\t\t\tlet remainingNodeCount = 0\n\t\t\t\t\t\tlet inner = 0\n\n\t\t\t\t\t\tchild.forEach((node) => {\n\t\t\t\t\t\t\tif (node.type.name !== 'footnote') {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!referencedLabels.has(node.attrs.referenceId)) {\n\t\t\t\t\t\t\t\torphans.push({ pos: containerPos + 1 + inner, size: node.nodeSize })\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tremainingNodeCount++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinner += node.nodeSize\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (orphans.length === 0) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (remainingNodeCount === 0) {\n\t\t\t\t\t\t\t// Delete the whole footnotes container\n\t\t\t\t\t\t\tdeletions.push({ pos: containerPos, size: child.nodeSize })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Delete only orphaned footnotes\n\t\t\t\t\t\t\tdeletions.push(...orphans)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\tif (deletions.length === 0) {\n\t\t\t\t\t\treturn null\n\t\t\t\t\t}\n\n\t\t\t\t\t// Delete right-to-left so earlier positions remain valid\n\t\t\t\t\tdeletions.sort((a, b) => b.pos - a.pos)\n\t\t\t\t\tconst tr = newState.tr\n\t\t\t\t\tfor (const del of deletions) {\n\t\t\t\t\t\ttr.delete(del.pos, del.pos + del.size)\n\t\t\t\t\t}\n\t\t\t\t\treturn tr\n\t\t\t\t},\n\t\t\t}),\n\t\t]\n\t},\n})\n\nexport default Footnotes\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { t } from '@nextcloud/l10n'\nimport { mergeAttributes } from '@tiptap/core'\nimport TiptapCodeBlock from '@tiptap/extension-code-block'\n\nconst FrontMatter = TiptapCodeBlock.extend({\n\tname: 'frontMatter',\n\t// FrontMatter are only valid at the begin of a document\n\tdraggable: false,\n\n\trenderHTML({ node, HTMLAttributes }) {\n\t\treturn this.parent({\n\t\t\tnode,\n\t\t\tHTMLAttributes: mergeAttributes(HTMLAttributes, {\n\t\t\t\t'data-title': t('text', 'Front matter'),\n\t\t\t\tclass: 'frontmatter',\n\t\t\t}),\n\t\t})\n\t},\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'pre#frontmatter',\n\t\t\t\tpreserveWhitespace: 'full',\n\t\t\t\tpriority: 9001,\n\t\t\t\tattrs: {\n\t\t\t\t\tlanguage: 'yaml',\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\t},\n\ttoMarkdown: (state, node) => {\n\t\tif (!state.out.match(/^\\s*/)) {\n\t\t\tthrow Error('FrontMatter must be the first node of the document!')\n\t\t}\n\t\tconst text = node.textContent\n\t\t// Make sure the front matter fences are longer than any dash sequence within it\n\t\tconst dashes = text.match(/-{3,}/gm)\n\t\tconst separator = dashes ? dashes.sort().slice(-1)[0] + '-' : '---'\n\n\t\tstate.write('')\n\t\tstate.out = ''\n\t\tstate.write(`${separator}\\n`)\n\t\tstate.text(text, false)\n\t\tstate.ensureNewLine()\n\t\tstate.write(separator)\n\t\tstate.closeBlock(node)\n\t},\n\n\t// Allow users to add a FrontMatter, but only at the beginning of the document\n\taddInputRules() {\n\t\treturn [\n\t\t\t{\n\t\t\t\tfind: /^---$/g,\n\t\t\t\thandler: ({ state, range, chain }) => {\n\t\t\t\t\tif (range.from === 1) {\n\t\t\t\t\t\tif (state.doc.resolve(1).parent.type.name === this.name) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchain().deleteRange(range).insertContentAt(0, {\n\t\t\t\t\t\t\ttype: this.name,\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\t},\n\n\t// Override rules from Codeblock\n\taddCommands() {\n\t\treturn {}\n\t},\n\taddPasteRules: () => [],\n\taddProseMirrorPlugins: () => [],\n})\n\nexport default FrontMatter\n","// src/hard-break.ts\nimport { mergeAttributes, Node } from \"@tiptap/core\";\nvar HardBreak = Node.create({\n name: \"hardBreak\",\n markdownTokenName: \"br\",\n addOptions() {\n return {\n keepMarks: true,\n HTMLAttributes: {}\n };\n },\n inline: true,\n group: \"inline\",\n selectable: false,\n linebreakReplacement: true,\n parseHTML() {\n return [{ tag: \"br\" }];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"br\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n },\n renderText() {\n return \"\\n\";\n },\n renderMarkdown: () => ` \n`,\n parseMarkdown: () => {\n return {\n type: \"hardBreak\"\n };\n },\n addCommands() {\n return {\n setHardBreak: () => ({ commands, chain, state, editor }) => {\n return commands.first([\n () => commands.exitCode(),\n () => commands.command(() => {\n const { selection, storedMarks } = state;\n if (selection.$from.parent.type.spec.isolating) {\n return false;\n }\n const { keepMarks } = this.options;\n const { splittableMarks } = editor.extensionManager;\n const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks();\n return chain().insertContent({ type: this.name }).command(({ tr, dispatch }) => {\n if (dispatch && marks && keepMarks) {\n const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n tr.ensureMarks(filteredMarks);\n }\n return true;\n }).run();\n })\n ]);\n }\n };\n },\n addKeyboardShortcuts() {\n return {\n \"Mod-Enter\": () => this.editor.commands.setHardBreak(),\n \"Shift-Enter\": () => this.editor.commands.setHardBreak()\n };\n }\n});\n\n// src/index.ts\nvar index_default = HardBreak;\nexport {\n HardBreak,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TipTapHardBreak from '@tiptap/extension-hard-break'\n\nconst HardBreak = TipTapHardBreak.extend({\n\taddAttribute SPDX-FileCopyrightText: 2022, 2022, 2022, 2022, 2025, 2022, 2026, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/* eslint-disable camelcase */\n\nimport { h } from 'vue'\nimport MDI_Warn from 'vue-material-design-icons/Alert.vue'\nimport MDI_Danger from 'vue-material-design-icons/AlertDecagram.vue'\nimport MDI_AlignHorizontalCenter from 'vue-material-design-icons/AlignHorizontalCenter.vue'\nimport MDI_AlignHorizontalLeft from 'vue-material-design-icons/AlignHorizontalLeft.vue'\nimport MDI_AlignHorizontalRight from 'vue-material-design-icons/AlignHorizontalRight.vue'\nimport MDI_AlphabeticalVariant from 'vue-material-design-icons/AlphabeticalVariant.vue'\nimport MDI_Undo from 'vue-material-design-icons/ArrowULeftTop.vue'\nimport MDI_Redo from 'vue-material-design-icons/ArrowURightTop.vue'\nimport MDI_Asterisk from 'vue-material-design-icons/Asterisk.vue'\nimport MDI_Check from 'vue-material-design-icons/Check.vue'\nimport MDI_Positive from 'vue-material-design-icons/CheckboxMarkedCircle.vue'\nimport MDI_CircleMedium from 'vue-material-design-icons/CircleMedium.vue'\nimport MDI_Close from 'vue-material-design-icons/Close.vue'\nimport MDI_CodeBrackets from 'vue-material-design-icons/CodeBrackets.vue'\nimport MDI_CodeTags from 'vue-material-design-icons/CodeTags.vue'\nimport MDI_DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'\nimport MDI_Emoticon from 'vue-material-design-icons/EmoticonOutline.vue'\nimport MDI_Document from 'vue-material-design-icons/FileDocument.vue'\nimport MDI_Folder from 'vue-material-design-icons/FolderOutline.vue'\nimport MDI_FormatBold from 'vue-material-design-icons/FormatBold.vue'\nimport MDI_FormatColorHighlight from 'vue-material-design-icons/FormatColorHighlight.vue'\nimport MDI_FormatHeader1 from 'vue-material-design-icons/FormatHeader1.vue'\nimport MDI_FormatHeader2 from 'vue-material-design-icons/FormatHeader2.vue'\nimport MDI_FormatHeader3 from 'vue-material-design-icons/FormatHeader3.vue'\nimport MDI_FormatHeader4 from 'vue-material-design-icons/FormatHeader4.vue'\nimport MDI_FormatHeader5 from 'vue-material-design-icons/FormatHeader5.vue'\nimport MDI_FormatHeader6 from 'vue-material-design-icons/FormatHeader6.vue'\nimport MDI_FormatIndentDecrease from 'vue-material-design-icons/FormatIndentDecrease.vue'\nimport MDI_FormatIndentIncrease from 'vue-material-design-icons/FormatIndentIncrease.vue'\nimport MDI_FormatItalic from 'vue-material-design-icons/FormatItalic.vue'\nimport MDI_FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue'\nimport MDI_FormatListCheckbox from 'vue-material-design-icons/FormatListCheckbox.vue'\nimport MDI_FormatListNumbered from 'vue-material-design-icons/FormatListNumbered.vue'\nimport MDI_FormatQuote from 'vue-material-design-icons/FormatQuoteClose.vue'\nimport MDI_FormatSize from 'vue-material-design-icons/FormatSize.vue'\nimport MDI_FormatStrikethrough from 'vue-material-design-icons/FormatStrikethrough.vue'\nimport MDI_FormatUnderline from 'vue-material-design-icons/FormatUnderline.vue'\nimport MDI_Help from 'vue-material-design-icons/HelpCircleOutline.vue'\nimport MDI_Image from 'vue-material-design-icons/ImageOutline.vue'\nimport MDI_Info from 'vue-material-design-icons/InformationOutline.vue'\nimport MDI_Link from 'vue-material-design-icons/Link.vue'\nimport MDI_LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport MDI_LinkVariantPlus from 'vue-material-design-icons/LinkPlus.vue'\nimport MDI_Loading from 'vue-material-design-icons/Loading.vue'\nimport MDI_Lock from 'vue-material-design-icons/LockOutline.vue'\nimport MDI_Paperclip from 'vue-material-design-icons/Paperclip.vue'\nimport MDI_PencilOff from 'vue-material-design-icons/PencilOffOutline.vue'\nimport MDI_Pencil from 'vue-material-design-icons/PencilOutline.vue'\nimport MDI_Plus from 'vue-material-design-icons/Plus.vue'\nimport MDI_Shape from 'vue-material-design-icons/ShapeOutline.vue'\nimport MDI_Sigma from 'vue-material-design-icons/Sigma.vue'\nimport MDI_SortAscending from 'vue-material-design-icons/SortAscending.vue'\nimport MDI_SortDescending from 'vue-material-design-icons/SortDescending.vue'\nimport MDI_Table from 'vue-material-design-icons/Table.vue'\nimport MDI_TableSettings from 'vue-material-design-icons/TableCog.vue'\nimport MDI_TableAddColumnAfter from 'vue-material-design-icons/TableColumnPlusAfter.vue'\nimport MDI_TableAddColumnBefore from 'vue-material-design-icons/TableColumnPlusBefore.vue'\nimport MDI_TableAddRowAfter from 'vue-material-design-icons/TableRowPlusAfter.vue'\nimport MDI_TableAddRowBefore from 'vue-material-design-icons/TableRowPlusBefore.vue'\nimport MDI_TranslateVariant from 'vue-material-design-icons/Translate.vue'\nimport MDI_TrashCan from 'vue-material-design-icons/TrashCanOutline.vue'\nimport MDI_Upload from 'vue-material-design-icons/TrayArrowUp.vue'\nimport MDI_UnfoldMoreHorizontal from 'vue-material-design-icons/UnfoldMoreHorizontal.vue'\nimport MDI_Web from 'vue-material-design-icons/Web.vue'\n\nconst DEFAULT_ICON_SIZE = 20\n\n/**\n * Prepare icon with our default size\n *\n * @param {import('vue').Component} original from vue-material-design-icons\n */\nfunction makeIcon(original) {\n\treturn (_props, { attrs, slots }) => h(original, { size: DEFAULT_ICON_SIZE, ...attrs }, slots)\n}\n\n/**\n * load an icon\n *\n * @param {object} _props - component props (unused)\n * @param {object} context - setup context\n * @param {object} context.attrs - attributes passed to the icon\n * @param {object} context.slots - slots passed to the icon\n */\nexport function Loading(_props, { attrs, slots }) {\n\treturn h(MDI_Loading, {\n\t\tsize: DEFAULT_ICON_SIZE,\n\t\t...attrs,\n\t\tclass: ['animation-rotate', attrs.class],\n\t}, slots)\n}\n\nexport const AlphabeticalVariant = makeIcon(MDI_AlphabeticalVariant)\nexport const AlignHorizontalCenter = makeIcon(MDI_AlignHorizontalCenter)\nexport const AlignHorizontalLeft = makeIcon(MDI_AlignHorizontalLeft)\nexport const AlignHorizontalRight = makeIcon(MDI_AlignHorizontalRight)\nexport const Asterisk = makeIcon(MDI_Asterisk)\nexport const Close = makeIcon(MDI_Close)\nexport const Check = makeIcon(MDI_Check)\nexport const CodeBrackets = makeIcon(MDI_CodeBrackets)\nexport const CodeTags = makeIcon(MDI_CodeTags)\nexport const CircleMedium = makeIcon(MDI_CircleMedium)\nexport const Danger = makeIcon(MDI_Danger)\nexport const Document = makeIcon(MDI_Document)\nexport const DotsHorizontal = makeIcon(MDI_DotsHorizontal)\nexport const Emoticon = makeIcon(MDI_Emoticon)\nexport const Folder = makeIcon(MDI_Folder)\nexport const FormatBold = makeIcon(MDI_FormatBold)\nexport const FormatColorHighlight = makeIcon(MDI_FormatColorHighlight)\nexport const FormatSize = makeIcon(MDI_FormatSize)\nexport const FormatHeader1 = makeIcon(MDI_FormatHeader1)\nexport const FormatHeader2 = makeIcon(MDI_FormatHeader2)\nexport const FormatHeader3 = makeIcon(MDI_FormatHeader3)\nexport const FormatHeader4 = makeIcon(MDI_FormatHeader4)\nexport const FormatHeader5 = makeIcon(MDI_FormatHeader5)\nexport const FormatHeader6 = makeIcon(MDI_FormatHeader6)\nexport const FormatIndentDecrease = makeIcon(MDI_FormatIndentDecrease)\nexport const FormatIndentIncrease = makeIcon(MDI_FormatIndentIncrease)\nexport const FormatItalic = makeIcon(MDI_FormatItalic)\nexport const FormatListBulleted = makeIcon(MDI_FormatListBulleted)\nexport const FormatListCheckbox = makeIcon(MDI_FormatListCheckbox)\nexport const FormatListNumbered = makeIcon(MDI_FormatListNumbered)\nexport const FormatQuote = makeIcon(MDI_FormatQuote)\nexport const FormatStrikethrough = makeIcon(MDI_FormatStrikethrough)\nexport const FormatUnderline = makeIcon(MDI_FormatUnderline)\nexport const Help = makeIcon(MDI_Help)\nexport const Image = makeIcon(MDI_Image)\nexport const Info = makeIcon(MDI_Info)\nexport const LinkIcon = makeIcon(MDI_Link)\nexport const LinkOff = makeIcon(MDI_LinkOff)\nexport const LinkVariantPlus = makeIcon(MDI_LinkVariantPlus)\nexport const Lock = makeIcon(MDI_Lock)\nexport const Paperclip = makeIcon(MDI_Paperclip)\nexport const Pencil = makeIcon(MDI_Pencil)\nexport const PencilOff = makeIcon(MDI_PencilOff)\nexport const Positive = makeIcon(MDI_Positive)\nexport const Redo = makeIcon(MDI_Redo)\nexport const Shape = makeIcon(MDI_Shape)\nexport const Table = makeIcon(MDI_Table)\nexport const TableAddColumnAfter = makeIcon(MDI_TableAddColumnAfter)\nexport const TableAddColumnBefore = makeIcon(MDI_TableAddColumnBefore)\nexport const TableAddRowAfter = makeIcon(MDI_TableAddRowAfter)\nexport const TableAddRowBefore = makeIcon(MDI_TableAddRowBefore)\nexport const TableSettings = makeIcon(MDI_TableSettings)\nexport const TrashCan = makeIcon(MDI_TrashCan)\nexport const TranslateVariant = makeIcon(MDI_TranslateVariant)\nexport const Undo = makeIcon(MDI_Undo)\nexport const UnfoldMoreHorizontal = makeIcon(MDI_UnfoldMoreHorizontal)\nexport const Upload = makeIcon(MDI_Upload)\nexport const Warn = makeIcon(MDI_Warn)\nexport const Web = makeIcon(MDI_Web)\nexport const Plus = makeIcon(MDI_Plus)\nexport const Sigma = makeIcon(MDI_Sigma)\nexport const SortAscending = makeIcon(MDI_SortAscending)\nexport const SortDescending = makeIcon(MDI_SortDescending)\n","/* eslint-disable jsdoc/require-param-type */\n/* eslint-disable jsdoc/require-param-description */\n/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { MODIFIERS, TRANSLATIONS } from './keys.js'\n\n/**\n *\n * @param actionEntry\n * @param isActive\n */\nfunction getEntryClasses(actionEntry, isActive) {\n\treturn {\n\t\t'is-active': isActive,\n\t\t[`action-menu-${actionEntry.key}`]: true,\n\t}\n}\n\n/**\n *\n * @param keyChar\n * @param modifiers\n */\nfunction keysString(keyChar, modifiers = []) {\n\treturn modifiers\n\t\t.map((mod) => TRANSLATIONS[mod])\n\t\t.concat(keyChar.toUpperCase())\n\t\t.join('+')\n}\n\n/**\n *\n * @param root0\n * @param root0.keyChar\n * @param root0.keyModifiers\n */\nfunction getKeyshortcuts({ keyChar, keyModifiers = [] }) {\n\treturn keyModifiers\n\t\t.map((mod) => MODIFIERS[mod])\n\t\t.concat(keyChar)\n\t\t.join('+')\n}\n\n/**\n *\n * @param isMobile\n * @param root0\n * @param root0.keyChar\n * @param root0.keyModifiers\n */\nfunction getKeys(isMobile, { keyChar, keyModifiers }) {\n\treturn !isMobile && keyChar ? `(${keysString(keyChar, keyModifiers)})` : ''\n}\n\n/**\n *\n * @param actionEntry\n * @param editor\n */\nfunction isDisabled(actionEntry, editor) {\n\treturn actionEntry.action && !actionEntry.action(editor.can(), editor)\n}\n\n/**\n *\n * @param root0\n * @param root0.isActive\n * @param editor\n */\nfunction getIsActive({ isActive }, editor) {\n\tif (!isActive) {\n\t\treturn false\n\t}\n\n\t// Supports either one type or an array of types\n\tconst types = Array.isArray(isActive) ? isActive : [isActive]\n\n\tfor (const type of types) {\n\t\tlet args\n\t\t// Supports either a type string or an object with type name and type attributes.\n\t\t// Name can be `null`, only give `attributes` to isActive in this case.\n\t\tif (type !== null && typeof type === 'object') {\n\t\t\targs = type.name\n\t\t\t\t? [type.name, { ...type.attributes }]\n\t\t\t\t: [{ ...type.attributes }]\n\t\t} else {\n\t\t\targs = [type]\n\t\t}\n\t\tif (editor.isActive(...args)) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n/**\n *\n * @param actionEntry\n */\nfunction getActionType(actionEntry) {\n\t// isActive stores the value changing on active state change (on click)\n\n\t// If it is an array, the button is a submenu button.\n\t// Like `['bulletList', 'orderedList']`\n\tif (Array.isArray(actionEntry.isActive)) {\n\t\treturn 'button'\n\t}\n\n\t// If it is an object, the button is one of the list of alternative values for a specific option.\n\t// Like `{ name: 'heading', attributes: { level: 1 } }`\n\tif (actionEntry.isActive && typeof actionEntry.isActive === 'object') {\n\t\treturn 'radio'\n\t}\n\n\t// If it is a string, it toggles a specific option like a checkbox\n\tif (typeof actionEntry.isActive === 'string') {\n\t\treturn 'checkbox'\n\t}\n\n\t// Otherwise it is just a button\n\treturn 'button'\n}\n\n/**\n *\n * @param actionEntry\n * @param editor\n */\nfunction getActionState(actionEntry, editor) {\n\tconst active = getIsActive(actionEntry, editor)\n\n\treturn {\n\t\tdisabled: isDisabled(actionEntry, editor),\n\t\tclass: getEntryClasses(actionEntry, active),\n\t\tactive,\n\t}\n}\n\nexport {\n\tgetActionState,\n\tgetActionType,\n\tgetEntryClasses,\n\tgetIsActive,\n\tgetKeys,\n\tgetKeyshortcuts,\n\tisDisabled,\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'\nimport debounce from 'debounce'\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { useEditorHeadings } from '../../composables/useEditorHeadings.ts'\nimport { useReadOnlyActions } from '../Editor/EditorWrapper.provider.js'\nimport { getActionState, getActionType, getKeys, getKeyshortcuts } from './utils.js'\n\nimport './ActionEntry.scss'\n\n/**\n * @type {import(\"vue\").ComponentOptions} BaseActionEntry\n */\nconst BaseActionEntry = {\n\tmixins: [useReadOnlyActions],\n\tsetup() {\n\t\tconst isMobile = useIsMobile()\n\t\tconst { editor } = useEditor()\n\t\tconst { displayToc } = useEditorHeadings()\n\t\treturn { displayToc, editor, isMobile }\n\t},\n\tprops: {\n\t\tactionEntry: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t\tcanBeFocussed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tstate: getActionState(this.actionEntry, this.editor),\n\t\t\tactionType: getActionType(this.actionEntry),\n\t\t}\n\t},\n\temits: ['disabled'],\n\tcomputed: {\n\t\tlabel() {\n\t\t\tconst { label } = this.actionEntry\n\n\t\t\treturn typeof label === 'function'\n\t\t\t\t? label({ displayToc: this.displayToc })\n\t\t\t\t: label\n\t\t},\n\t\ticon() {\n\t\t\treturn this.actionEntry.icon\n\t\t},\n\t\tkeyshortcuts() {\n\t\t\treturn getKeyshortcuts(this.actionEntry)\n\t\t},\n\t\ttooltip() {\n\t\t\treturn [this.label, getKeys(this.isMobile, this.actionEntry)].join(' ')\n\t\t},\n\t\tlistItemTooltip() {\n\t\t\treturn [getKeys(this.isMobile, this.actionEntry)].join(' ')\n\t\t},\n\t},\n\twatch: {\n\t\t/** Handle tabindex for menu toolbar */\n\t\tcanBeFocussed() {\n\t\t\tthis.setTabIndexOnButton()\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$_updateState = debounce(this.updateState.bind(this), 50)\n\t\tthis.editor.on('update', this.$_updateState)\n\t\tthis.editor.on('selectionUpdate', this.$_updateState)\n\t\t// Initially emit the disabled event to set the state in parent\n\t\tthis.$emit('disabled', this.state.disabled)\n\t\t// Initially set the tabindex\n\t\tthis.setTabIndexOnButton()\n\t},\n\tbeforeUnmount() {\n\t\tthis.editor.off('update', this.$_updateState)\n\t\tthis.editor.off('selectionUpdate', this.$_updateState)\n\t},\n\tmethods: {\n\t\tupdateState() {\n\t\t\tthis.state = getActionState(this.actionEntry, this.editor)\n\t\t\tthis.$emit('disabled', this.state.disabled)\n\t\t},\n\t\tsetTabIndexOnButton() {\n\t\t\t/** @type {HTMLButtonElement} */\n\t\t\tconst button\n\t\t\t\t= this.$el.tagName.toLowerCase() === 'button'\n\t\t\t\t\t? this.$el\n\t\t\t\t\t: this.$el.querySelector('button')\n\n\t\t\tif (this.canBeFocussed === null) {\n\t\t\t\tbutton.removeAttribute('tabindex')\n\t\t\t} else {\n\t\t\t\tbutton.setAttribute('tabindex', this.canBeFocussed ? '0' : '-1')\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Focus the inner button of this action\n\t\t */\n\t\tfocusButton() {\n\t\t\t/** @type {HTMLButtonElement} */\n\t\t\tconst button\n\t\t\t\t= this.$el.tagName.toLowerCase() === 'button'\n\t\t\t\t\t? this.$el\n\t\t\t\t\t: this.$el.querySelector('button')\n\t\t\tbutton.focus()\n\t\t},\n\t},\n}\n\nexport { BaseActionEntry }\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport const MENU_ID = Symbol('menu::id')\n\nexport const useMenuIDMixin = {\n\tinject: {\n\t\t$menuID: { from: MENU_ID, default: null },\n\t},\n\tcomputed: {\n\t\tmenuIDSelector() {\n\t\t\treturn `#${this.$menuID}`\n\t\t},\n\t},\n}\n","import '../assets/NcActionText-Dzegj6AY.css';\nimport { A as ActionTextMixin } from \"./actionText-BXR0sWNu.mjs\";\nimport { a as NC_ACTIONS_IS_SEMANTIC_MENU } from \"./useNcActions-BzPO2c4h.mjs\";\nimport { openBlock, createElementBlock, createElementVNode, renderSlot, normalizeStyle, normalizeClass, createCommentVNode, toDisplayString } from \"vue\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _sfc_main = {\n name: \"NcActionText\",\n mixins: [ActionTextMixin],\n inject: {\n isInSemanticMenu: {\n from: NC_ACTIONS_IS_SEMANTIC_MENU,\n default: false\n }\n }\n};\nconst _hoisted_1 = [\"role\"];\nconst _hoisted_2 = {\n key: 0,\n class: \"action-text__longtext-wrapper\"\n};\nconst _hoisted_3 = { class: \"action-text__name\" };\nconst _hoisted_4 = [\"textContent\"];\nconst _hoisted_5 = [\"textContent\"];\nconst _hoisted_6 = {\n key: 2,\n class: \"action-text__text\"\n};\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"li\", {\n class: \"action\",\n role: $options.isInSemanticMenu && \"presentation\"\n }, [\n createElementVNode(\"span\", {\n class: \"action-text\",\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, [\n renderSlot(_ctx.$slots, \"icon\", {}, () => [\n _ctx.icon !== \"\" ? (openBlock(), createElementBlock(\"span\", {\n key: 0,\n \"aria-hidden\": \"true\",\n class: normalizeClass([\"action-text__icon\", [_ctx.isIconUrl ? \"action-text__icon--url\" : _ctx.icon]]),\n style: normalizeStyle({ backgroundImage: _ctx.isIconUrl ? `url(${_ctx.icon})` : null })\n }, null, 6)) : createCommentVNode(\"\", true)\n ], true),\n _ctx.name ? (openBlock(), createElementBlock(\"span\", _hoisted_2, [\n createElementVNode(\"strong\", _hoisted_3, toDisplayString(_ctx.name), 1),\n createElementVNode(\"span\", {\n class: \"action-text__longtext\",\n textContent: toDisplayString(_ctx.text)\n }, null, 8, _hoisted_4)\n ])) : _ctx.isLongText ? (openBlock(), createElementBlock(\"span\", {\n key: 1,\n class: \"action-text__longtext\",\n textContent: toDisplayString(_ctx.text)\n }, null, 8, _hoisted_5)) : (openBlock(), createElementBlock(\"span\", _hoisted_6, toDisplayString(_ctx.text), 1)),\n createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_1);\n}\nconst NcActionText = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-fa684b48\"]]);\nexport {\n NcActionText as N\n};\n//# sourceMappingURL=NcActionText-CQ9qwJ0p.mjs.map\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/*\n * Handle the state of the full editor width toggle.\n *\n * If the css variable `--text-editor-max-width` is already set\n * for `document.body` it will be left as is and\n * no toggle will be shown in the text ui.\n * This way the collectives app handles it's per document width setting.\n *\n * Otherwise this composable handles the `is_full_width_editor` initial state.\n * It sets the css variable on the document accordingly.\n * The state is stored in a singleton to preserve and reuse it on the next mount.\n * It is persisted in the user settings across page reloads.\n *\n */\n\nimport type { InjectionKey, Ref } from 'vue'\n\nimport axios from '@nextcloud/axios'\nimport { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { generateUrl } from '@nextcloud/router'\nimport { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'\nimport { computed, inject, onUnmounted, provide, readonly, ref, watch } from 'vue'\nimport { useEditorFlags } from './useEditorFlags.ts'\n\n// Keep the current value around when leaving the editor and reopening\nlet valueSingleton = loadState('text', 'is_full_width_editor', false)\n\n// This is either the reactive value of the editor width toggle\n// or null if the width has already been set outside of text.\nexport const editorWidthKey = Symbol('text:editor:width') as InjectionKey<\n\tReadonly | null>\n>\n\n// desktop: leave space for floating buttons and outline (2 * 40px) if necessary\n// wide screen: 80ch content, narrow screen: full width\nconst editorWidthDesktop = 'min(80ch, 100%)'\nconst editorWidthDesktopEnhanced = 'min(80ch, (100% - 2 * 40px))'\nconst fullEditorWidthDesktop = '100%'\nconst fullEditorWidthDesktopEnhanced = 'calc(100% - 2 * 40px)'\nconst editorWidthMobile = 'min(80ch, 100%)'\nconst fullEditorWidthMobile = '100%'\n\n/**\n * Detect if other apps (such as collectives) already configured texts max width.\n *\n * Check if document.body has a css variable `--text-editor-max-width` (either set or inherited).\n * Get the value set by text in the documentElement style.\n * If both values are set and match we assume text is handling the width.\n */\nfunction maxWidthSetOutsideOfText() {\n\tconst alreadySet = getComputedStyle(document.body).getPropertyValue('--text-editor-max-width')\n\tconst setByText = document.documentElement.style.getPropertyValue('--text-editor-max-width')\n\treturn Boolean(alreadySet) && alreadySet !== setByText\n}\n\n/**\n *\n * @param hasTableOfContents does the editor have a table of contents\n */\nexport function provideEditorWidth(hasTableOfContents = true) {\n\tconst isMobile = useIsMobile()\n\t// keep style that is already set - for example by collectives\n\tif (maxWidthSetOutsideOfText()) {\n\t\tprovide(editorWidthKey, null)\n\t\treturn { applyEditorWidth: () => {} }\n\t}\n\tconst isFullWidth = ref(valueSingleton)\n\tprovide(editorWidthKey, readonly(isFullWidth))\n\tconst onFullWidth = ({ value }: { value: boolean }) => {\n\t\tvalueSingleton = value\n\t\tisFullWidth.value = value\n\t}\n\tsubscribe('text:editor:full-width', onFullWidth)\n\tonUnmounted(() => {\n\t\tunsubscribe('text:editor:full-width', onFullWidth)\n\t})\n\tconst defaultEditorWidthDesktop = hasTableOfContents\n\t\t? editorWidthDesktopEnhanced\n\t\t: editorWidthDesktop\n\tconst defaultFullEditorWidthDesktop = hasTableOfContents\n\t\t? fullEditorWidthDesktopEnhanced\n\t\t: fullEditorWidthDesktop\n\tconst defaultEditorWidth = computed(() => isMobile.value ? editorWidthMobile : defaultEditorWidthDesktop)\n\tconst fullEditorWidth = computed(() => isMobile.value ? fullEditorWidthMobile : defaultFullEditorWidthDesktop)\n\tconst width = computed(() => isFullWidth.value ? fullEditorWidth.value : defaultEditorWidth.value)\n\tconst applyEditorWidth = () => {\n\t\tdocument.documentElement.style.setProperty(\n\t\t\t'--text-editor-max-width',\n\t\t\twidth.value,\n\t\t)\n\t}\n\twatch(width, applyEditorWidth)\n\treturn { applyEditorWidth }\n}\n\n/**\n *\n */\nexport function useEditorWidth() {\n\tconst isMobile = useIsMobile()\n\tconst { isRichWorkspace } = useEditorFlags()\n\n\t// This will be null if the width is already configured outside of text.\n\tconst isFullWidth = inject(editorWidthKey)\n\n\t// Disable if `editorWidthKey` got `null` injected or if in rich workspace or mobile view\n\tif (isFullWidth === null || isRichWorkspace || isMobile.value) {\n\t\treturn { canToggleWidth: false }\n\t}\n\tconst setFullWidth = (checked: boolean) => {\n\t\taxios.post(generateUrl('/apps/text/settings'), {\n\t\t\tkey: 'is_full_width_editor',\n\t\t\tvalue: checked ? '1' : '0',\n\t\t})\n\t\temit('text:editor:full-width', { value: checked })\n\t}\n\treturn { canToggleWidth: true, isFullWidth, setFullWidth }\n}\n","\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Node } from '@nextcloud/files'\nimport type { Editor } from '@tiptap/core'\nimport type { FileStat, ResponseDataDetailed } from 'webdav'\n\nimport {\n\tdefaultRootPath,\n\tgetClient,\n\tgetDefaultPropfind,\n\tresultToNode,\n} from '@nextcloud/files/dav'\nimport { generateUrl } from '@nextcloud/router'\nimport { ref } from 'vue'\nimport { buildFilePicker } from '../helpers/filePicker.js'\n\n/**\n *\n * @param options options\n * @param options.editor the editor\n * @param options.relativePath relative path of the file\n */\nexport function useLinkFile({\n\teditor,\n\trelativePath,\n}: {\n\teditor: Editor\n\trelativePath?: string\n}) {\n\tconst parentPath = (relativePath ?? '/').split('/').slice(0, -1).join('/')\n\tconst startPath = ref(parentPath)\n\tconst setLink = (url: string, text: string) => {\n\t\teditor.chain().insertOrSetLink(text, { href: url }).focus().run()\n\t}\n\n\t/**\n\t * Open dialog and ask user which file to link to\n\t */\n\tconst linkFile = async () => {\n\t\tconst node = await pickFile(startPath.value)\n\t\tif (!node) {\n\t\t\treturn\n\t\t}\n\t\tconst url = new URL(generateUrl(`/f/${node.id}`), window.origin)\n\t\tsetLink(url.href, node.displayname)\n\t\tstartPath.value\n\t\t\t= node.path + (node.type === 'folder' ? `/${node.basename}/` : '')\n\t}\n\n\treturn { linkFile }\n}\n\n/**\n * Pick a file with the file picker and return the node\n *\n * @param startPath path to start the file picker on\n */\nasync function pickFile(startPath: string): Promise {\n\tlet file\n\ttry {\n\t\tconst filePicker = buildFilePicker(startPath)\n\t\tfile = await filePicker.pick()\n\t} catch {\n\t\treturn\n\t}\n\tconst client = getClient()\n\tconst result = (await client.stat(`${defaultRootPath}${file}`, {\n\t\tdetails: true,\n\t\tdata: getDefaultPropfind(),\n\t})) as ResponseDataDetailed\n\treturn resultToNode(result.data)\n}\n","\n\n\n\n\n\n\n","import '../assets/NcAssistantIcon-BMLpMaMJ.css';\nimport { defineComponent, useCssVars, computed, openBlock, createElementBlock, normalizeClass, createElementVNode, unref } from \"vue\";\nimport { p as mdiCreation } from \"./mdi-CpchYUUV.mjs\";\nimport { useIsDarkTheme } from \"../composables/useIsDarkTheme/index.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"id\"];\nconst _hoisted_2 = [\"id\"];\nconst _hoisted_3 = [\"d\", \"fill\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcAssistantIcon\",\n props: {\n inline: { type: Boolean },\n size: { default: 20 }\n },\n setup(__props) {\n useCssVars((_ctx) => ({\n \"v6629513e\": sizePx.value\n }));\n const props = __props;\n const isDarkTheme = useIsDarkTheme();\n const gradientId = createElementId();\n const sizePx = computed(() => `${props.size}px`);\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"span\", {\n \"aria-hidden\": \"true\",\n class: normalizeClass([_ctx.$style.assistantIcon, __props.inline && _ctx.$style.assistantIcon_inline]),\n role: \"img\"\n }, [\n (openBlock(), createElementBlock(\"svg\", {\n class: normalizeClass(_ctx.$style.assistantIcon__svg),\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, [\n createElementVNode(\"defs\", null, [\n unref(isDarkTheme) ? (openBlock(), createElementBlock(\"linearGradient\", {\n key: 0,\n id: unref(gradientId),\n gradientTransform: \"rotateX(285)\"\n }, [..._cache[0] || (_cache[0] = [\n createElementVNode(\"stop\", {\n offset: \"15%\",\n \"stop-color\": \"#CDACE7\"\n }, null, -1),\n createElementVNode(\"stop\", {\n offset: \"40%\",\n \"stop-color\": \"#008FDB\"\n }, null, -1),\n createElementVNode(\"stop\", {\n offset: \"82%\",\n \"stop-color\": \"#A180E0\"\n }, null, -1)\n ])], 8, _hoisted_1)) : (openBlock(), createElementBlock(\"linearGradient\", {\n key: 1,\n id: unref(gradientId),\n gradientTransform: \"rotateX(285)\"\n }, [..._cache[1] || (_cache[1] = [\n createElementVNode(\"stop\", {\n offset: \"15%\",\n \"stop-color\": \"#9669D3\"\n }, null, -1),\n createElementVNode(\"stop\", {\n offset: \"40%\",\n \"stop-color\": \"#00679E\"\n }, null, -1),\n createElementVNode(\"stop\", {\n offset: \"80%\",\n \"stop-color\": \"#492083\"\n }, null, -1)\n ])], 8, _hoisted_2))\n ]),\n createElementVNode(\"path\", {\n d: unref(mdiCreation),\n fill: `url('#${unref(gradientId)}')`\n }, null, 8, _hoisted_3)\n ], 2))\n ], 2);\n };\n }\n});\nconst assistantIcon = \"_assistantIcon_DogCI\";\nconst assistantIcon_inline = \"_assistantIcon_inline_UjLu7\";\nconst assistantIcon__svg = \"_assistantIcon__svg_l6I-C\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_XTbWy\",\n assistantIcon,\n assistantIcon_inline,\n assistantIcon__svg\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcAssistantIcon = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcAssistantIcon as N\n};\n//# sourceMappingURL=NcAssistantIcon-C6s4Qm7-.mjs.map\n","import '../assets/NcCounterBubble-ZnteskDR.css';\nimport { defineComponent, computed, openBlock, createElementBlock, normalizeClass, toDisplayString } from \"vue\";\nimport { getCanonicalLocale } from \"@nextcloud/l10n\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _hoisted_1 = [\"title\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcCounterBubble\",\n props: {\n count: {},\n active: { type: Boolean },\n type: { default: \"\" },\n raw: { type: Boolean }\n },\n setup(__props) {\n const props = __props;\n const humanizedCount = computed(() => {\n if (props.raw) {\n return props.count.toString();\n }\n const formatter = new Intl.NumberFormat(getCanonicalLocale(), {\n notation: \"compact\",\n compactDisplay: \"short\"\n });\n return formatter.format(props.count);\n });\n const originalCountAsTitleIfNeeded = computed(() => {\n if (props.raw) {\n return;\n }\n const countAsString = props.count.toString();\n if (countAsString === humanizedCount.value) {\n return;\n }\n return countAsString;\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"counter-bubble__counter\", {\n active: __props.active,\n \"counter-bubble__counter--highlighted\": __props.type === \"highlighted\",\n \"counter-bubble__counter--outlined\": __props.type === \"outlined\"\n }]),\n title: originalCountAsTitleIfNeeded.value\n }, toDisplayString(humanizedCount.value), 11, _hoisted_1);\n };\n }\n});\nconst NcCounterBubble = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-36ffc13f\"]]);\nexport {\n NcCounterBubble as N\n};\n//# sourceMappingURL=NcCounterBubble-CV0YMrXW.mjs.map\n","import { defineComponent } from \"vue\";\nconst _sfc_main = defineComponent({\n name: \"NcVNodes\",\n props: {\n /**\n * The vnodes to render\n */\n vnodes: {\n type: [Array, Object],\n default: null\n }\n },\n /**\n * The render function to display the component\n */\n render() {\n return this.vnodes || this.$slots?.default?.({});\n }\n});\nexport {\n _sfc_main as _\n};\n//# sourceMappingURL=NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs.map\n","import '../assets/NcListItem-BjeejGlB.css';\nimport { i as isLegacy34 } from \"./legacy-BoqDmOCa.mjs\";\nimport { N as NcActions } from \"./NcActions-C-wDqSrv.mjs\";\nimport { N as NcCounterBubble } from \"./NcCounterBubble-CV0YMrXW.mjs\";\nimport { _ as _sfc_main$1 } from \"./NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs\";\nimport { resolveComponent, openBlock, createBlock, resolveDynamicComponent, normalizeProps, guardReactiveProps, withCtx, createElementVNode, mergeProps, normalizeClass, withKeys, renderSlot, createTextVNode, toDisplayString, createElementBlock, createCommentVNode, withDirectives, vShow, createVNode, createSlots } from \"vue\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nconst _sfc_main = {\n name: \"NcListItem\",\n components: {\n NcActions,\n NcCounterBubble,\n NcVNodes: _sfc_main$1\n },\n inheritAttrs: false,\n props: {\n /**\n * The details text displayed in the upper right part of the component\n */\n details: {\n type: String,\n default: \"\"\n },\n /**\n * Name (first line of text)\n */\n name: {\n type: String,\n default: void 0\n },\n /**\n * The route for the router link.\n */\n to: {\n type: [String, Object],\n default: null\n },\n /**\n * The value for the external link\n */\n href: {\n type: String,\n default: \"#\"\n },\n /**\n * The HTML target attribute used for the link\n */\n target: {\n type: String,\n default: \"\"\n },\n /**\n * Id for the `` element\n */\n anchorId: {\n type: String,\n default: \"\"\n },\n /**\n * Make subname bold\n */\n bold: {\n type: Boolean,\n default: false\n },\n /**\n * Show the NcListItem in compact design\n */\n compact: {\n type: Boolean,\n default: false\n },\n /**\n * Toggle the active state of the component\n */\n active: {\n type: Boolean,\n default: void 0\n },\n /**\n * Aria label for the wrapper element\n */\n linkAriaLabel: {\n type: String,\n default: \"\"\n },\n /**\n * Aria label for the actions toggle\n */\n actionsAriaLabel: {\n type: String,\n default: void 0\n },\n /**\n * If different from 0 this component will display the\n * NcCounterBubble component\n */\n counterNumber: {\n type: [Number, String],\n default: 0\n },\n /**\n * Outlined or highlighted state of the counter\n */\n counterType: {\n type: String,\n default: \"\",\n validator(value) {\n return [\"highlighted\", \"outlined\", \"\"].indexOf(value) !== -1;\n }\n },\n /**\n * To be used only when the elements in the actions menu are very important\n */\n forceDisplayActions: {\n type: Boolean,\n default: false\n },\n /**\n * Force the actions to display in a three dot menu\n */\n forceMenu: {\n type: Boolean,\n default: false\n },\n /**\n * Show the list component layout\n */\n oneLine: {\n type: Boolean,\n default: false\n }\n },\n emits: [\n \"click\",\n \"dragstart\",\n \"update:menuOpen\"\n ],\n setup() {\n return { isLegacy34 };\n },\n data() {\n return {\n hovered: false,\n hasActions: false,\n hasSubname: false,\n displayActionsOnHoverFocus: false,\n menuOpen: false,\n hasIndicator: false,\n hasDetails: false\n };\n },\n computed: {\n showAdditionalElements() {\n return !this.displayActionsOnHoverFocus || this.forceDisplayActions;\n },\n showDetails() {\n return (this.details !== \"\" || this.hasDetails) && (!this.displayActionsOnHoverFocus || this.forceDisplayActions);\n }\n },\n watch: {\n menuOpen(newValue) {\n if (!newValue && !this.hovered) {\n this.displayActionsOnHoverFocus = false;\n }\n }\n },\n mounted() {\n this.checkSlots();\n },\n updated() {\n this.checkSlots();\n },\n methods: {\n /**\n * Handle link click\n *\n * @param {MouseEvent|KeyboardEvent} event - Native click or keydown event\n * @param {(event: Event) => void} [navigate] - VueRouter link's navigate if any\n * @param {string} [routerLinkHref] - VueRouter link's href\n */\n onClick(event, navigate, routerLinkHref) {\n this.$emit(\"click\", event);\n if (event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) {\n return;\n }\n if (routerLinkHref) {\n navigate?.(event);\n event.preventDefault();\n }\n },\n showActions() {\n if (this.hasActions) {\n this.displayActionsOnHoverFocus = true;\n }\n this.hovered = false;\n },\n hideActions() {\n this.displayActionsOnHoverFocus = false;\n },\n /**\n * @param {FocusEvent} event UI event\n */\n handleBlur(event) {\n if (this.menuOpen) {\n return;\n }\n if (this.$refs[\"list-item\"]?.contains(event.relatedTarget)) {\n return;\n }\n this.hideActions();\n },\n /**\n * Hide the actions on mouseleave unless the menu is open\n */\n handleMouseleave() {\n if (!this.menuOpen) {\n this.displayActionsOnHoverFocus = false;\n }\n this.hovered = false;\n },\n handleMouseover() {\n this.showActions();\n this.hovered = true;\n },\n handleActionsUpdateOpen(e) {\n this.menuOpen = e;\n this.$emit(\"update:menuOpen\", e);\n },\n // Check if subname and actions slots are populated\n checkSlots() {\n if (this.hasActions !== !!this.$slots.actions) {\n this.hasActions = !!this.$slots.actions;\n }\n if (this.hasSubname !== !!this.$slots.subname) {\n this.hasSubname = !!this.$slots.subname;\n }\n if (this.hasIndicator !== !!this.$slots.indicator) {\n this.hasIndicator = !!this.$slots.indicator;\n }\n if (this.hasDetails !== !!this.$slots.details) {\n this.hasDetails = !!this.$slots.details;\n }\n }\n }\n};\nconst _hoisted_1 = [\"id\", \"aria-label\", \"href\", \"target\", \"rel\", \"onClick\"];\nconst _hoisted_2 = { class: \"list-item-content\" };\nconst _hoisted_3 = { class: \"list-item-content__main\" };\nconst _hoisted_4 = { class: \"list-item-content__name\" };\nconst _hoisted_5 = { class: \"list-item-content__details\" };\nconst _hoisted_6 = {\n key: 0,\n class: \"list-item-details__details\"\n};\nconst _hoisted_7 = {\n key: 1,\n class: \"list-item-details__extra\"\n};\nconst _hoisted_8 = {\n key: 1,\n class: \"list-item-details__indicator\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"list-item-content__extra-actions\"\n};\nconst _hoisted_10 = {\n key: 2,\n class: \"list-item__extra\"\n};\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcCounterBubble = resolveComponent(\"NcCounterBubble\");\n const _component_NcActions = resolveComponent(\"NcActions\");\n return openBlock(), createBlock(resolveDynamicComponent($props.to ? \"router-link\" : \"NcVNodes\"), normalizeProps(guardReactiveProps({ ...$props.to && { custom: true, to: $props.to } })), {\n default: withCtx(({ href: routerLinkHref, navigate, isActive }) => [\n createElementVNode(\"li\", mergeProps({\n class: [\"list-item__wrapper\", {\n \"list-item__wrapper--active\": $props.active ?? isActive,\n \"list-item__wrapper--legacy\": $setup.isLegacy34\n }]\n }, _ctx.$attrs), [\n createElementVNode(\"div\", {\n ref: \"list-item\",\n class: normalizeClass([\"list-item\", {\n \"list-item--compact\": $props.compact,\n \"list-item--one-line\": $props.oneLine\n }]),\n onMouseover: _cache[5] || (_cache[5] = (...args) => $options.handleMouseover && $options.handleMouseover(...args)),\n onMouseleave: _cache[6] || (_cache[6] = (...args) => $options.handleMouseleave && $options.handleMouseleave(...args))\n }, [\n createElementVNode(\"a\", {\n id: $props.anchorId || void 0,\n \"aria-label\": $props.linkAriaLabel,\n class: \"list-item__anchor\",\n href: routerLinkHref || $props.href,\n target: $props.target || ($props.href === \"#\" ? void 0 : \"_blank\"),\n rel: $props.href === \"#\" ? void 0 : \"noopener noreferrer\",\n onFocus: _cache[0] || (_cache[0] = (...args) => $options.showActions && $options.showActions(...args)),\n onFocusout: _cache[1] || (_cache[1] = (...args) => $options.handleBlur && SPDX-FileCopyrightText: 2022, 2022, 2022, 2025, 2025, 2019, 2022, 2022, 2025, 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport const READ_ONLY_ACTIONS = Symbol('wrapper:read-only-actions')\n\nexport const useReadOnlyActions = {\n\tinject: {\n\t\t$readOnlyActions: {\n\t\t\tfrom: READ_ONLY_ACTIONS,\n\t\t\tdefault: {\n\t\t\t\ttoggle: () => {},\n\t\t\t},\n\t\t},\n\t},\n}\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ShallowRef } from 'vue'\nimport type { Connection } from '../composables/useConnection.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { unref } from 'vue'\n\n/**\n * Upload an attachment to the server.\n *\n * @param connection the active connection.\n * @param file upload this file.\n */\nexport function uploadAttachment(\n\tconnection: ShallowRef | Connection,\n\tfile: string | Blob,\n) {\n\tconst {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tshareToken: token,\n\t} = unref(connection)\n\tconst formData = new FormData()\n\tformData.append('file', file)\n\tconst url = generateUrl('apps/text/attachment/upload?')\n\treturn axios.post(url, formData, {\n\t\theaders: { 'Content-Type': 'multipart/form-data' },\n\t\tparams: { documentId, sessionId, sessionToken, token },\n\t})\n}\n\n/**\n * Create a new attachment based on the given template\n *\n * @param connection the active connection\n * @param template create the attachment based on this\n * @param template.app app to create the attachment with\n * @param template.extension extension to use\n */\nexport function createAttachment(\n\tconnection: ShallowRef | Connection,\n\ttemplate: { app: string, extension: string },\n) {\n\tconst { documentId, sessionId, sessionToken } = unref(connection)\n\tconst url = generateUrl('apps/text/attachment/create')\n\treturn axios.post(url, {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tfileName: `${template.app}${template.extension}`,\n\t})\n}\n\n/**\n * Create a new attachment based on the given template\n *\n * @param connection the active connection\n * @param filePath path to the file on the server.\n */\nexport function insertAttachmentFile(\n\tconnection: ShallowRef | Connection,\n\tfilePath: string,\n) {\n\tconst { documentId, sessionId, sessionToken } = unref(connection)\n\tconst url = generateUrl('apps/text/attachment/filepath')\n\treturn axios.post(url, {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tfilePath,\n\t})\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { InjectionKey, ShallowRef } from 'vue'\nimport type { OpenData } from '../apis/connect.ts'\nimport type { Document, Session } from '../services/SyncService.ts'\n\nimport { inject, provide, shallowRef } from 'vue'\nimport { open } from '../apis/connect.ts'\n\nexport interface Connection {\n\tdocumentId: number\n\tsessionId: number\n\tsessionToken: string\n\tbaseVersionEtag: string\n\tfilePath: string\n\tshareToken?: string\n}\n\nexport interface InitialData {\n\tdocument: Document\n\tsession: Session & { token: string }\n\treadOnly: boolean\n\tcontent: string\n\tdocumentState?: string\n\tlock?: object\n\thasOwner: boolean\n}\n\nexport const connectionKey = Symbol('text:connection') as InjectionKey<\n\tShallowRef\n>\n\nexport const openDataKey = Symbol('text:opendata') as InjectionKey<\n\tShallowRef\n>\n\n/**\n * Handle the connection to the text api and provide it to child components\n *\n * @param props Props of the editor component.\n * @param props.fileId Fileid of the file.\n * @param props.relativePath Relative path to the file.\n * @param props.initialSession Initial session handed to the editor in direct editing\n * @param props.shareToken Share token of the file.\n * @param getBaseVersionEtag Async getter function for the base version etag.\n * @param setBaseVersionEtag Async setter function for the base version etag.\n */\nexport function provideConnection(\n\tprops: {\n\t\tfileId: number\n\t\trelativePath: string\n\t\tinitialSession?: InitialData\n\t\tshareToken?: string\n\t},\n\tgetBaseVersionEtag: () => Promise,\n\tsetBaseVersionEtag: (val: string) => Promise,\n) {\n\tconst connection = shallowRef(undefined)\n\tconst openData = shallowRef(undefined)\n\tconst openConnection = async () => {\n\t\tconst baseVersionEtag = await getBaseVersionEtag()\n\t\tconst guestName = localStorage.getItem('nick') ?? ''\n\t\tconst { connection: opened, data }\n\t\t\t= openInitialSession(props, baseVersionEtag)\n\t\t\t\t|| (await open({\n\t\t\t\t\tfileId: props.fileId,\n\t\t\t\t\tguestName,\n\t\t\t\t\ttoken: props.shareToken,\n\t\t\t\t\tfilePath: props.relativePath,\n\t\t\t\t\tbaseVersionEtag,\n\t\t\t\t}))\n\t\tawait setBaseVersionEtag(data.document.baseVersionEtag)\n\t\tconnection.value = opened\n\t\topenData.value = data\n\t\treturn data\n\t}\n\tprovide(connectionKey, connection)\n\tprovide(openDataKey, openData)\n\treturn { connection, openConnection, openData }\n}\n\n/**\n *\n */\nexport function useConnection() {\n\tconst connection = inject(connectionKey)\n\tconst openData = inject(openDataKey)\n\treturn { connection, openData }\n}\n\n/**\n * Mimic axios error for a conflict while creating the session.\n *\n * This will be emitted from the SyncService\n * and trigger conflict handling in CollaborativeEditor.vue\n */\nclass ConflictError extends Error {\n\tresponse = { status: 412 }\n}\n\n/**\n * Get the connection and additional data from the initial session if available.\n *\n * @param props Props of the editor component\n * @param props.relativePath Relative path to the file.\n * @param props.initialSession Initial session handed to the editor in direct editing\n * @param props.shareToken Share token of the file.\n * @param baseVersionEtag Etag from the last editing session.\n */\nfunction openInitialSession(\n\tprops: {\n\t\trelativePath: string\n\t\tinitialSession?: InitialData\n\t\tshareToken?: string\n\t},\n\tbaseVersionEtag: string | undefined,\n) {\n\tif (props.initialSession) {\n\t\tconst { document, session } = props.initialSession\n\t\tif (baseVersionEtag && baseVersionEtag !== document.baseVersionEtag) {\n\t\t\tthrow new ConflictError('Base version etag did not match when opening initial session.')\n\t\t}\n\t\tconst connection = {\n\t\t\tdocumentId: document.id,\n\t\t\tsessionId: session.id,\n\t\t\tsessionToken: session.token,\n\t\t\tbaseVersionEtag: document.baseVersionEtag,\n\t\t\tfilePath: props.relativePath,\n\t\t\tshareToken: props.shareToken,\n\t\t}\n\t\treturn { connection, data: props.initialSession }\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getFilePickerBuilder } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\n\n/**\n * Create a file picker with our defaults\n *\n * @param {string} startPath path to start from\n * @param {boolean} allowDirectories whether to allow selecting directories\n */\nexport function buildFilePicker(startPath, allowDirectories = true) {\n\treturn getFilePickerBuilder(t('text', 'Select file or folder to link to'))\n\t\t.startAt(startPath)\n\t\t.allowDirectories(allowDirectories)\n\t\t.setMultiSelect(false)\n\t\t.setNoMenu(true)\n\t\t.setButtonFactory((nodes) => {\n\t\t\tconst node = nodes?.[0]\n\t\t\tconst nodeName = node?.attributes?.displayName || node?.basename\n\t\t\tconst isRoot = node?.root === node?.attributes?.filename\n\t\t\tconst disabled = isRoot || (!allowDirectories && !node)\n\n\t\t\tlet label = t('text', 'Choose')\n\t\t\tif (nodes.length === 1 && !isRoot) {\n\t\t\t\tlabel = t('text', 'Choose {file}', { file: nodeName })\n\t\t\t}\n\n\t\t\treturn [{\n\t\t\t\tcallback: () => {},\n\t\t\t\tvariant: 'primary',\n\t\t\t\tlabel,\n\t\t\t\tdisabled,\n\t\t\t}]\n\t\t})\n\t\t.build()\n}\n","\n\n\n\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { computed, onUnmounted, ref } from 'vue'\n\ndeclare module '@nextcloud/event-bus' {\n\texport interface NextcloudEvents {\n\t\tnetworkOnline: { success: boolean }\n\t}\n}\n\n/**\n * Get network online/offline state\n */\nexport function useNetworkState() {\n\tconst offlineSince = ref(navigator.onLine ? null : Date.now())\n\tconst networkOnline = computed(() => !offlineSince.value)\n\n\tconst onNetworkOnline = (event: { success: boolean }) => {\n\t\tif (event.success) {\n\t\t\tofflineSince.value = null\n\t\t}\n\t}\n\tconst onNetworkOffline = () => {\n\t\tofflineSince.value = Date.now()\n\t}\n\tsubscribe('networkOnline', onNetworkOnline)\n\tsubscribe('networkOffline', onNetworkOffline)\n\tonUnmounted(() => {\n\t\tunsubscribe('networkOnline', onNetworkOnline)\n\t\tunsubscribe('networkOffline', onNetworkOffline)\n\t})\n\n\treturn { networkOnline, offlineSince }\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { t } from '@nextcloud/l10n'\nconst isMac = navigator.userAgent.includes('Mac')\n\nconst MODIFIERS = {\n\tMod: isMac ? 'Meta' : 'Control',\n\tAlt: 'Alt', // Option key, on Apple computers.\n\tControl: 'Control',\n\tShift: 'Shift',\n\n\t// unused\n\t// AltGraph: 'AltGraph',\n\t// Meta: 'Meta', // Command key on Apple computers\n}\n\nconst TRANSLATIONS = {\n\t[MODIFIERS.Mod]: isMac ? t('text', 'Command') : t('text', 'Ctrl'),\n\t[MODIFIERS.Control]: t('text', 'Ctrl'),\n\t[MODIFIERS.Alt]: t('text', isMac ? 'Option' : 'Alt'),\n\t[MODIFIERS.Shift]: t('text', 'Shift'),\n}\n\nexport { MODIFIERS, TRANSLATIONS }\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { mergeAttributes } from '@tiptap/core'\nimport TipTapMention from '@tiptap/extension-mention'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport MentionView from './MentionView.vue'\n\nexport default TipTapMention.extend({\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'span[data-type=\"user\"]',\n\t\t\t\tgetAttrs: (element) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: decodeURIComponent(element.getAttribute('data-id')),\n\t\t\t\t\t\tlabel:\n\t\t\t\t\t\t\telement.innerText\n\t\t\t\t\t\t\t|| element.textContent\n\t\t\t\t\t\t\t|| element.getAttribute('data-label'),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpriority: 100,\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML({ node, HTMLAttributes }) {\n\t\treturn [\n\t\t\t'span',\n\t\t\tmergeAttributes(\n\t\t\t\t{ 'data-type': 'user', class: 'mention' },\n\t\t\t\tthis.options.HTMLAttributes,\n\t\t\t\tHTMLAttributes,\n\t\t\t),\n\t\t\tthis.options.renderHTML({\n\t\t\t\toptions: this.options,\n\t\t\t\tnode,\n\t\t\t}),\n\t\t]\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(MentionView)\n\t},\n\n\ttoMarkdown(state, node) {\n\t\tstate.write(`@[${node.attrs.label}](mention://user/${encodeURIComponent(node.attrs.id)})`)\n\t},\n})\n","// src/text.ts\nimport { Node } from \"@tiptap/core\";\nvar Text = Node.create({\n name: \"text\",\n group: \"inline\",\n parseMarkdown: (token) => {\n return {\n type: \"text\",\n text: token.text || \"\"\n };\n },\n renderMarkdown: (node) => node.text || \"\"\n});\n\n// src/index.ts\nvar index_default = Text;\nexport {\n Text,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","import '../assets/NcActionButtonGroup-Bt8kRk79.css';\nimport { defineComponent, openBlock, createElementBlock, toDisplayString, createCommentVNode, createElementVNode, renderSlot } from \"vue\";\nimport { r as register, a as t } from \"./_l10n-wdIzZwir.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { a as NC_ACTIONS_IS_SEMANTIC_MENU } from \"./useNcActions-BzPO2c4h.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nregister();\nconst _sfc_main = defineComponent({\n name: \"NcActionButtonGroup\",\n inject: {\n isInSemanticMenu: {\n from: NC_ACTIONS_IS_SEMANTIC_MENU,\n default: false\n }\n },\n props: {\n /**\n * Optional text shown below the button group\n */\n name: {\n required: false,\n default: void 0,\n type: String\n }\n },\n setup() {\n return {\n labelId: createElementId()\n };\n },\n methods: {\n t\n }\n});\nconst _hoisted_1 = [\"role\"];\nconst _hoisted_2 = [\"id\"];\nconst _hoisted_3 = [\"aria-labelledby\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"li\", {\n class: \"nc-button-group-base\",\n role: _ctx.isInSemanticMenu && \"presentation\"\n }, [\n _ctx.name ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n id: _ctx.labelId\n }, toDisplayString(_ctx.name), 9, _hoisted_2)) : createCommentVNode(\"\", true),\n createElementVNode(\"ul\", {\n class: \"nc-button-group-content\",\n role: \"group\",\n \"aria-labelledby\": _ctx.name ? _ctx.labelId : void 0\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 8, _hoisted_3)\n ], 8, _hoisted_1);\n}\nconst NcActionButtonGroup = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-6a2b8de0\"]]);\nexport {\n NcActionButtonGroup as N\n};\n//# sourceMappingURL=NcActionButtonGroup-Dd03Oluy.mjs.map\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","// src/index.ts\nimport { Plugin as Plugin2 } from \"prosemirror-state\";\n\n// src/cellselection.ts\nimport { Fragment, Slice } from \"prosemirror-model\";\nimport {\n NodeSelection as NodeSelection2,\n Selection,\n SelectionRange,\n TextSelection\n} from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\n\n// src/tablemap.ts\nvar readFromCache;\nvar addToCache;\nif (typeof WeakMap != \"undefined\") {\n let cache = /* @__PURE__ */ new WeakMap();\n readFromCache = (key) => cache.get(key);\n addToCache = (key, value) => {\n cache.set(key, value);\n return value;\n };\n} else {\n const cache = [];\n const cacheSize = 10;\n let cachePos = 0;\n readFromCache = (key) => {\n for (let i = 0; i < cache.length; i += 2)\n if (cache[i] == key) return cache[i + 1];\n };\n addToCache = (key, value) => {\n if (cachePos == cacheSize) cachePos = 0;\n cache[cachePos++] = key;\n return cache[cachePos++] = value;\n };\n}\nvar TableMap = class {\n constructor(width, height, map, problems) {\n this.width = width;\n this.height = height;\n this.map = map;\n this.problems = problems;\n }\n // Find the dimensions of the cell at the given position.\n findCell(pos) {\n for (let i = 0; i < this.map.length; i++) {\n const curPos = this.map[i];\n if (curPos != pos) continue;\n const left = i % this.width;\n const top = i / this.width | 0;\n let right = left + 1;\n let bottom = top + 1;\n for (let j = 1; right < this.width && this.map[i + j] == curPos; j++) {\n right++;\n }\n for (let j = 1; bottom < this.height && this.map[i + this.width * j] == curPos; j++) {\n bottom++;\n }\n return { left, top, right, bottom };\n }\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n // Find the left side of the cell at the given position.\n colCount(pos) {\n for (let i = 0; i < this.map.length; i++) {\n if (this.map[i] == pos) {\n return i % this.width;\n }\n }\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n // Find the next cell in the given direction, starting from the cell\n // at `pos`, if any.\n nextCell(pos, axis, dir) {\n const { left, right, top, bottom } = this.findCell(pos);\n if (axis == \"horiz\") {\n if (dir < 0 ? left == 0 : right == this.width) return null;\n return this.map[top * this.width + (dir < 0 ? left - 1 : right)];\n } else {\n if (dir < 0 ? top == 0 : bottom == this.height) return null;\n return this.map[left + this.width * (dir < 0 ? top - 1 : bottom)];\n }\n }\n // Get the rectangle spanning the two given cells.\n rectBetween(a, b) {\n const {\n left: leftA,\n right: rightA,\n top: topA,\n bottom: bottomA\n } = this.findCell(a);\n const {\n left: leftB,\n right: rightB,\n top: topB,\n bottom: bottomB\n } = this.findCell(b);\n return {\n left: Math.min(leftA, leftB),\n top: Math.min(topA, topB),\n right: Math.max(rightA, rightB),\n bottom: Math.max(bottomA, bottomB)\n };\n }\n // Return the position of all cells that have the top left corner in\n // the given rectangle.\n cellsInRect(rect) {\n const result = [];\n const seen = {};\n for (let row = rect.top; row < rect.bottom; row++) {\n for (let col = rect.left; col < rect.right; col++) {\n const index = row * this.width + col;\n const pos = this.map[index];\n if (seen[pos]) continue;\n seen[pos] = true;\n if (col == rect.left && col && this.map[index - 1] == pos || row == rect.top && row && this.map[index - this.width] == pos) {\n continue;\n }\n result.push(pos);\n }\n }\n return result;\n }\n // Return the position at which the cell at the given row and column\n // starts, or would start, if a cell started there.\n positionAt(row, col, table) {\n for (let i = 0, rowStart = 0; ; i++) {\n const rowEnd = rowStart + table.child(i).nodeSize;\n if (i == row) {\n let index = col + row * this.width;\n const rowEndIndex = (row + 1) * this.width;\n while (index < rowEndIndex && this.map[index] < rowStart) index++;\n return index == rowEndIndex ? rowEnd - 1 : this.map[index];\n }\n rowStart = rowEnd;\n }\n }\n // Find the table map for the given table node.\n static get(table) {\n return readFromCache(table) || addToCache(table, computeMap(table));\n }\n};\nfunction computeMap(table) {\n if (table.type.spec.tableRole != \"table\")\n throw new RangeError(\"Not a table node: \" + table.type.name);\n const width = findWidth(table), height = table.childCount;\n const map = [];\n let mapPos = 0;\n let problems = null;\n const colWidths = [];\n for (let i = 0, e = width * height; i < e; i++) map[i] = 0;\n for (let row = 0, pos = 0; row < height; row++) {\n const rowNode = table.child(row);\n pos++;\n for (let i = 0; ; i++) {\n while (mapPos < map.length && map[mapPos] != 0) mapPos++;\n if (i == rowNode.childCount) break;\n const cellNode = rowNode.child(i);\n const { colspan, rowspan, colwidth } = cellNode.attrs;\n for (let h = 0; h < rowspan; h++) {\n if (h + row >= height) {\n (problems || (problems = [])).push({\n type: \"overlong_rowspan\",\n pos,\n n: rowspan - h\n });\n break;\n }\n const start = mapPos + h * width;\n for (let w = 0; w < colspan; w++) {\n if (map[start + w] == 0) map[start + w] = pos;\n else\n (problems || (problems = [])).push({\n type: \"collision\",\n row,\n pos,\n n: colspan - w\n });\n const colW = colwidth && colwidth[w];\n if (colW) {\n const widthIndex = (start + w) % width * 2, prev = colWidths[widthIndex];\n if (prev == null || prev != colW && colWidths[widthIndex + 1] == 1) {\n colWidths[widthIndex] = colW;\n colWidths[widthIndex + 1] = 1;\n } else if (prev == colW) {\n colWidths[widthIndex + 1]++;\n }\n }\n }\n }\n mapPos += colspan;\n pos += cellNode.nodeSize;\n }\n const expectedPos = (row + 1) * width;\n let missing = 0;\n while (mapPos < expectedPos) if (map[mapPos++] == 0) missing++;\n if (missing)\n (problems || (problems = [])).push({ type: \"missing\", row, n: missing });\n pos++;\n }\n if (width === 0 || height === 0)\n (problems || (problems = [])).push({ type: \"zero_sized\" });\n const tableMap = new TableMap(width, height, map, problems);\n let badWidths = false;\n for (let i = 0; !badWidths && i < colWidths.length; i += 2)\n if (colWidths[i] != null && colWidths[i + 1] < height) badWidths = true;\n if (badWidths) findBadColWidths(tableMap, colWidths, table);\n return tableMap;\n}\nfunction findWidth(table) {\n let width = -1;\n let hasRowSpan = false;\n for (let row = 0; row < table.childCount; row++) {\n const rowNode = table.child(row);\n let rowWidth = 0;\n if (hasRowSpan)\n for (let j = 0; j < row; j++) {\n const prevRow = table.child(j);\n for (let i = 0; i < prevRow.childCount; i++) {\n const cell = prevRow.child(i);\n if (j + cell.attrs.rowspan > row) rowWidth += cell.attrs.colspan;\n }\n }\n for (let i = 0; i < rowNode.childCount; i++) {\n const cell = rowNode.child(i);\n rowWidth += cell.attrs.colspan;\n if (cell.attrs.rowspan > 1) hasRowSpan = true;\n }\n if (width == -1) width = rowWidth;\n else if (width != rowWidth) width = Math.max(width, rowWidth);\n }\n return width;\n}\nfunction findBadColWidths(map, colWidths, table) {\n if (!map.problems) map.problems = [];\n const seen = {};\n for (let i = 0; i < map.map.length; i++) {\n const pos = map.map[i];\n if (seen[pos]) continue;\n seen[pos] = true;\n const node = table.nodeAt(pos);\n if (!node) {\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n let updated = null;\n const attrs = node.attrs;\n for (let j = 0; j < attrs.colspan; j++) {\n const col = (i + j) % map.width;\n const colWidth = colWidths[col * 2];\n if (colWidth != null && (!attrs.colwidth || attrs.colwidth[j] != colWidth))\n (updated || (updated = freshColWidth(attrs)))[j] = colWidth;\n }\n if (updated)\n map.problems.unshift({\n type: \"colwidth mismatch\",\n pos,\n colwidth: updated\n });\n }\n}\nfunction freshColWidth(attrs) {\n if (attrs.colwidth) return attrs.colwidth.slice();\n const result = [];\n for (let i = 0; i < attrs.colspan; i++) result.push(0);\n return result;\n}\n\n// src/util.ts\nimport { PluginKey } from \"prosemirror-state\";\n\n// src/schema.ts\nfunction getCellAttrs(dom, extraAttrs) {\n if (typeof dom === \"string\") {\n return {};\n }\n const widthAttr = dom.getAttribute(\"data-colwidth\");\n const widths = widthAttr && /^\\d+(,\\d+)*$/.test(widthAttr) ? widthAttr.split(\",\").map((s) => Number(s)) : null;\n const colspan = Number(dom.getAttribute(\"colspan\") || 1);\n const result = {\n colspan,\n rowspan: Number(dom.getAttribute(\"rowspan\") || 1),\n colwidth: widths && widths.length == colspan ? widths : null\n };\n for (const prop in extraAttrs) {\n const getter = extraAttrs[prop].getFromDOM;\n const value = getter && getter(dom);\n if (value != null) {\n result[prop] = value;\n }\n }\n return result;\n}\nfunction setCellAttrs(node, extraAttrs) {\n const attrs = {};\n if (node.attrs.colspan != 1) attrs.colspan = node.attrs.colspan;\n if (node.attrs.rowspan != 1) attrs.rowspan = node.attrs.rowspan;\n if (node.attrs.colwidth)\n attrs[\"data-colwidth\"] = node.attrs.colwidth.join(\",\");\n for (const prop in extraAttrs) {\n const setter = extraAttrs[prop].setDOMAttr;\n if (setter) setter(node.attrs[prop], attrs);\n }\n return attrs;\n}\nfunction validateColwidth(value) {\n if (value === null) {\n return;\n }\n if (!Array.isArray(value)) {\n throw new TypeError(\"colwidth must be null or an array\");\n }\n for (const item of value) {\n if (typeof item !== \"number\") {\n throw new TypeError(\"colwidth must be null or an array of numbers\");\n }\n }\n}\nfunction tableNodes(options) {\n const extraAttrs = options.cellAttributes || {};\n const cellAttrs = {\n colspan: { default: 1, validate: \"number\" },\n rowspan: { default: 1, validate: \"number\" },\n colwidth: { default: null, validate: validateColwidth }\n };\n for (const prop in extraAttrs)\n cellAttrs[prop] = {\n default: extraAttrs[prop].default,\n validate: extraAttrs[prop].validate\n };\n return {\n table: {\n content: \"table_row+\",\n tableRole: \"table\",\n isolating: true,\n group: options.tableGroup,\n parseDOM: [{ tag: \"table\" }],\n toDOM() {\n return [\"table\", [\"tbody\", 0]];\n }\n },\n table_row: {\n content: \"(table_cell | table_header)*\",\n tableRole: \"row\",\n parseDOM: [{ tag: \"tr\" }],\n toDOM() {\n return [\"tr\", 0];\n }\n },\n table_cell: {\n content: options.cellContent,\n attrs: cellAttrs,\n tableRole: \"cell\",\n isolating: true,\n parseDOM: [\n { tag: \"td\", getAttrs: (dom) => getCellAttrs(dom, extraAttrs) }\n ],\n toDOM(node) {\n return [\"td\", setCellAttrs(node, extraAttrs), 0];\n }\n },\n table_header: {\n content: options.cellContent,\n attrs: cellAttrs,\n tableRole: \"header_cell\",\n isolating: true,\n parseDOM: [\n { tag: \"th\", getAttrs: (dom) => getCellAttrs(dom, extraAttrs) }\n ],\n toDOM(node) {\n return [\"th\", setCellAttrs(node, extraAttrs), 0];\n }\n }\n };\n}\nfunction tableNodeTypes(schema) {\n let result = schema.cached.tableNodeTypes;\n if (!result) {\n result = schema.cached.tableNodeTypes = {};\n for (const name in schema.nodes) {\n const type = schema.nodes[name], role = type.spec.tableRole;\n if (role) result[role] = type;\n }\n }\n return result;\n}\n\n// src/util.ts\nvar tableEditingKey = new PluginKey(\"selectingCells\");\nfunction cellAround($pos) {\n for (let d = $pos.depth - 1; d > 0; d--)\n if ($pos.node(d).type.spec.tableRole == \"row\")\n return $pos.node(0).resolve($pos.before(d + 1));\n return null;\n}\nfunction cellWrapping($pos) {\n for (let d = $pos.depth; d > 0; d--) {\n const role = $pos.node(d).type.spec.tableRole;\n if (role === \"cell\" || role === \"header_cell\") return $pos.node(d);\n }\n return null;\n}\nfunction isInTable(state) {\n const $head = state.selection.$head;\n for (let d = $head.depth; d > 0; d--)\n if ($head.node(d).type.spec.tableRole == \"row\") return true;\n return false;\n}\nfunction selectionCell(state) {\n const sel = state.selection;\n if (\"$anchorCell\" in sel && sel.$anchorCell) {\n return sel.$anchorCell.pos > sel.$headCell.pos ? sel.$anchorCell : sel.$headCell;\n } else if (\"node\" in sel && sel.node && sel.node.type.spec.tableRole == \"cell\") {\n return sel.$anchor;\n }\n const $cell = cellAround(sel.$head) || cellNear(sel.$head);\n if ($cell) {\n return $cell;\n }\n throw new RangeError(`No cell found around position ${sel.head}`);\n}\nfunction cellNear($pos) {\n for (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) {\n const role = after.type.spec.tableRole;\n if (role == \"cell\" || role == \"header_cell\") return $pos.doc.resolve(pos);\n }\n for (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) {\n const role = before.type.spec.tableRole;\n if (role == \"cell\" || role == \"header_cell\")\n return $pos.doc.resolve(pos - before.nodeSize);\n }\n}\nfunction pointsAtCell($pos) {\n return $pos.parent.type.spec.tableRole == \"row\" && !!$pos.nodeAfter;\n}\nfunction moveCellForward($pos) {\n return $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize);\n}\nfunction inSameTable($cellA, $cellB) {\n return $cellA.depth == $cellB.depth && $cellA.pos >= $cellB.start(-1) && $cellA.pos <= $cellB.end(-1);\n}\nfunction findCell($pos) {\n return TableMap.get($pos.node(-1)).findCell($pos.pos - $pos.start(-1));\n}\nfunction colCount($pos) {\n return TableMap.get($pos.node(-1)).colCount($pos.pos - $pos.start(-1));\n}\nfunction nextCell($pos, axis, dir) {\n const table = $pos.node(-1);\n const map = TableMap.get(table);\n const tableStart = $pos.start(-1);\n const moved = map.nextCell($pos.pos - tableStart, axis, dir);\n return moved == null ? null : $pos.node(0).resolve(tableStart + moved);\n}\nfunction removeColSpan(attrs, pos, n = 1) {\n const result = { ...attrs, colspan: attrs.colspan - n };\n if (result.colwidth) {\n result.colwidth = result.colwidth.slice();\n result.colwidth.splice(pos, n);\n if (!result.colwidth.some((w) => w > 0)) result.colwidth = null;\n }\n return result;\n}\nfunction addColSpan(attrs, pos, n = 1) {\n const result = { ...attrs, colspan: attrs.colspan + n };\n if (result.colwidth) {\n result.colwidth = result.colwidth.slice();\n for (let i = 0; i < n; i++) result.colwidth.splice(pos, 0, 0);\n }\n return result;\n}\nfunction columnIsHeader(map, table, col) {\n const headerCell = tableNodeTypes(table.type.schema).header_cell;\n for (let row = 0; row < map.height; row++)\n if (table.nodeAt(map.map[col + row * map.width]).type != headerCell)\n return false;\n return true;\n}\n\n// src/cellselection.ts\nvar CellSelection = class _CellSelection extends Selection {\n // A table selection is identified by its anchor and head cells. The\n // positions given to this constructor should point _before_ two\n // cells in the same table. They may be the same, to select a single\n // cell.\n constructor($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const rect = map.rectBetween(\n $anchorCell.pos - tableStart,\n $headCell.pos - tableStart\n );\n const doc = $anchorCell.node(0);\n const cells = map.cellsInRect(rect).filter((p) => p != $headCell.pos - tableStart);\n cells.unshift($headCell.pos - tableStart);\n const ranges = cells.map((pos) => {\n const cell = table.nodeAt(pos);\n if (!cell) {\n throw RangeError(`No cell with offset ${pos} found`);\n }\n const from = tableStart + pos + 1;\n return new SelectionRange(\n doc.resolve(from),\n doc.resolve(from + cell.content.size)\n );\n });\n super(ranges[0].$from, ranges[0].$to, ranges);\n this.$anchorCell = $anchorCell;\n this.$headCell = $headCell;\n }\n map(doc, mapping) {\n const $anchorCell = doc.resolve(mapping.map(this.$anchorCell.pos));\n const $headCell = doc.resolve(mapping.map(this.$headCell.pos));\n if (pointsAtCell($anchorCell) && pointsAtCell($headCell) && inSameTable($anchorCell, $headCell)) {\n const tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1);\n if (tableChanged && this.isRowSelection())\n return _CellSelection.rowSelection($anchorCell, $headCell);\n else if (tableChanged && this.isColSelection())\n return _CellSelection.colSelection($anchorCell, $headCell);\n else return new _CellSelection($anchorCell, $headCell);\n }\n return TextSelection.between($anchorCell, $headCell);\n }\n // Returns a rectangular slice of table rows containing the selected\n // cells.\n content() {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const rect = map.rectBetween(\n this.$anchorCell.pos - tableStart,\n this.$headCell.pos - tableStart\n );\n const seen = {};\n const rows = [];\n for (let row = rect.top; row < rect.bottom; row++) {\n const rowContent = [];\n for (let index = row * map.width + rect.left, col = rect.left; col < rect.right; col++, index++) {\n const pos = map.map[index];\n if (seen[pos]) continue;\n seen[pos] = true;\n const cellRect = map.findCell(pos);\n let cell = table.nodeAt(pos);\n if (!cell) {\n throw RangeError(`No cell with offset ${pos} found`);\n }\n const extraLeft = rect.left - cellRect.left;\n const extraRight = cellRect.right - rect.right;\n if (extraLeft > 0 || extraRight > 0) {\n let attrs = cell.attrs;\n if (extraLeft > 0) {\n attrs = removeColSpan(attrs, 0, extraLeft);\n }\n if (extraRight > 0) {\n attrs = removeColSpan(\n attrs,\n attrs.colspan - extraRight,\n extraRight\n );\n }\n if (cellRect.left < rect.left) {\n cell = cell.type.createAndFill(attrs);\n if (!cell) {\n throw RangeError(\n `Could not create cell with attrs ${JSON.stringify(attrs)}`\n );\n }\n } else {\n cell = cell.type.create(attrs, cell.content);\n }\n }\n if (cellRect.top < rect.top || cellRect.bottom > rect.bottom) {\n const attrs = {\n ...cell.attrs,\n rowspan: Math.min(cellRect.bottom, rect.bottom) - Math.max(cellRect.top, rect.top)\n };\n if (cellRect.top < rect.top) {\n cell = cell.type.createAndFill(attrs);\n } else {\n cell = cell.type.create(attrs, cell.content);\n }\n }\n rowContent.push(cell);\n }\n rows.push(table.child(row).copy(Fragment.from(rowContent)));\n }\n const fragment = this.isColSelection() && this.isRowSelection() ? table : rows;\n return new Slice(Fragment.from(fragment), 1, 1);\n }\n replace(tr, content = Slice.empty) {\n const mapFrom = tr.steps.length, ranges = this.ranges;\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n tr.replace(\n mapping.map($from.pos),\n mapping.map($to.pos),\n i ? Slice.empty : content\n );\n }\n const sel = Selection.findFrom(\n tr.doc.resolve(tr.mapping.slice(mapFrom).map(this.to)),\n -1\n );\n if (sel) tr.setSelection(sel);\n }\n replaceWith(tr, node) {\n this.replace(tr, new Slice(Fragment.from(node), 0, 0));\n }\n forEachCell(f) {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const cells = map.cellsInRect(\n map.rectBetween(\n this.$anchorCell.pos - tableStart,\n this.$headCell.pos - tableStart\n )\n );\n for (let i = 0; i < cells.length; i++) {\n f(table.nodeAt(cells[i]), tableStart + cells[i]);\n }\n }\n // True if this selection goes all the way from the top to the\n // bottom of the table.\n isColSelection() {\n const anchorTop = this.$anchorCell.index(-1);\n const headTop = this.$headCell.index(-1);\n if (Math.min(anchorTop, headTop) > 0) return false;\n const anchorBottom = anchorTop + this.$anchorCell.nodeAfter.attrs.rowspan;\n const headBottom = headTop + this.$headCell.nodeAfter.attrs.rowspan;\n return Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount;\n }\n // Returns the smallest column selection that covers the given anchor\n // and head cell.\n static colSelection($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const anchorRect = map.findCell($anchorCell.pos - tableStart);\n const headRect = map.findCell($headCell.pos - tableStart);\n const doc = $anchorCell.node(0);\n if (anchorRect.top <= headRect.top) {\n if (anchorRect.top > 0)\n $anchorCell = doc.resolve(tableStart + map.map[anchorRect.left]);\n if (headRect.bottom < map.height)\n $headCell = doc.resolve(\n tableStart + map.map[map.width * (map.height - 1) + headRect.right - 1]\n );\n } else {\n if (headRect.top > 0)\n $headCell = doc.resolve(tableStart + map.map[headRect.left]);\n if (anchorRect.bottom < map.height)\n $anchorCell = doc.resolve(\n tableStart + map.map[map.width * (map.height - 1) + anchorRect.right - 1]\n );\n }\n return new _CellSelection($anchorCell, $headCell);\n }\n // True if this selection goes all the way from the left to the\n // right of the table.\n isRowSelection() {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const anchorLeft = map.colCount(this.$anchorCell.pos - tableStart);\n const headLeft = map.colCount(this.$headCell.pos - tableStart);\n if (Math.min(anchorLeft, headLeft) > 0) return false;\n const anchorRight = anchorLeft + this.$anchorCell.nodeAfter.attrs.colspan;\n const headRight = headLeft + this.$headCell.nodeAfter.attrs.colspan;\n return Math.max(anchorRight, headRight) == map.width;\n }\n eq(other) {\n return other instanceof _CellSelection && other.$anchorCell.pos == this.$anchorCell.pos && other.$headCell.pos == this.$headCell.pos;\n }\n // Returns the smallest row selection that covers the given anchor\n // and head cell.\n static rowSelection($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const anchorRect = map.findCell($anchorCell.pos - tableStart);\n const headRect = map.findCell($headCell.pos - tableStart);\n const doc = $anchorCell.node(0);\n if (anchorRect.left <= headRect.left) {\n if (anchorRect.left > 0)\n $anchorCell = doc.resolve(\n tableStart + map.map[anchorRect.top * map.width]\n );\n if (headRect.right < map.width)\n $headCell = doc.resolve(\n tableStart + map.map[map.width * (headRect.top + 1) - 1]\n );\n } else {\n if (headRect.left > 0)\n $headCell = doc.resolve(tableStart + map.map[headRect.top * map.width]);\n if (anchorRect.right < map.width)\n $anchorCell = doc.resolve(\n tableStart + map.map[map.width * (anchorRect.top + 1) - 1]\n );\n }\n return new _CellSelection($anchorCell, $headCell);\n }\n toJSON() {\n return {\n type: \"cell\",\n anchor: this.$anchorCell.pos,\n head: this.$headCell.pos\n };\n }\n static fromJSON(doc, json) {\n return new _CellSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n }\n static create(doc, anchorCell, headCell = anchorCell) {\n return new _CellSelection(doc.resolve(anchorCell), doc.resolve(headCell));\n }\n getBookmark() {\n return new CellBookmark(this.$anchorCell.pos, this.$headCell.pos);\n }\n};\nCellSelection.prototype.visible = false;\nSelection.jsonID(\"cell\", CellSelection);\nvar CellBookmark = class _CellBookmark {\n constructor(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping) {\n return new _CellBookmark(mapping.map(this.anchor), mapping.map(this.head));\n }\n resolve(doc) {\n const $anchorCell = doc.resolve(this.anchor), $headCell = doc.resolve(this.head);\n if ($anchorCell.parent.type.spec.tableRole == \"row\" && $headCell.parent.type.spec.tableRole == \"row\" && $anchorCell.index() < $anchorCell.parent.childCount && $headCell.index() < $headCell.parent.childCount && inSameTable($anchorCell, $headCell))\n return new CellSelection($anchorCell, $headCell);\n else return Selection.near($headCell, 1);\n }\n};\nfunction drawCellSelection(state) {\n if (!(state.selection instanceof CellSelection)) return null;\n const cells = [];\n state.selection.forEachCell((node, pos) => {\n cells.push(\n Decoration.node(pos, pos + node.nodeSize, { class: \"selectedCell\" })\n );\n });\n return DecorationSet.create(state.doc, cells);\n}\nfunction isCellBoundarySelection({ $from, $to }) {\n if ($from.pos == $to.pos || $from.pos < $to.pos - 6) return false;\n let afterFrom = $from.pos;\n let beforeTo = $to.pos;\n let depth = $from.depth;\n for (; depth >= 0; depth--, afterFrom++)\n if ($from.after(depth + 1) < $from.end(depth)) break;\n for (let d = $to.depth; d >= 0; d--, beforeTo--)\n if ($to.before(d + 1) > $to.start(d)) break;\n return afterFrom == beforeTo && /row|table/.test($from.node(depth).type.spec.tableRole);\n}\nfunction isTextSelectionAcrossCells({ $from, $to }) {\n let fromCellBoundaryNode;\n let toCellBoundaryNode;\n for (let i = $from.depth; i > 0; i--) {\n const node = $from.node(i);\n if (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n fromCellBoundaryNode = node;\n break;\n }\n }\n for (let i = $to.depth; i > 0; i--) {\n const node = $to.node(i);\n if (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n toCellBoundaryNode = node;\n break;\n }\n }\n return fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0;\n}\nfunction normalizeSelection(state, tr, allowTableNodeSelection) {\n const sel = (tr || state).selection;\n const doc = (tr || state).doc;\n let normalize;\n let role;\n if (sel instanceof NodeSelection2 && (role = sel.node.type.spec.tableRole)) {\n if (role == \"cell\" || role == \"header_cell\") {\n normalize = CellSelection.create(doc, sel.from);\n } else if (role == \"row\") {\n const $cell = doc.resolve(sel.from + 1);\n normalize = CellSelection.rowSelection($cell, $cell);\n } else if (!allowTableNodeSelection) {\n const map = TableMap.get(sel.node);\n const start = sel.from + 1;\n const lastCell = start + map.map[map.width * map.height - 1];\n normalize = CellSelection.create(doc, start + 1, lastCell);\n }\n } else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) {\n normalize = TextSelection.create(doc, sel.from);\n } else if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) {\n normalize = TextSelection.create(doc, sel.$from.start(), sel.$from.end());\n }\n if (normalize) (tr || (tr = state.tr)).setSelection(normalize);\n return tr;\n}\n\n// src/fixtables.ts\nimport { PluginKey as PluginKey2 } from \"prosemirror-state\";\nvar fixTablesKey = new PluginKey2(\"fix-tables\");\nfunction changedDescendants(old, cur, offset, f) {\n const oldSize = old.childCount, curSize = cur.childCount;\n outer: for (let i = 0, j = 0; i < curSize; i++) { SPDX-FileCopyrightText: 2022, 2023, 2024, 2021, 1000, 2024, 2019, 1000, 2019, 1000, 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/*\n * This helper provides Base64 encoding and decoding for ArrayBuffers.\n *\n * We use lib0/buffer for now as it's a dependency of y.js\n * and does not add new dependencies.\n *\n */\n\nimport { fromBase64, toBase64 } from 'lib0/buffer'\n\n/**\n *\n * @param data - binary data to encode\n */\nexport function encodeArrayBuffer(data: Uint8Array): string {\n\tconst view = new Uint8Array(data)\n\treturn toBase64(view)\n}\n\n/**\n *\n * @param encoded - base64 encoded string to decode\n */\nexport function decodeArrayBuffer(encoded: string): Uint8Array {\n\treturn fromBase64(encoded)\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { OpenData } from '../apis/connect.ts'\nimport type { Step } from '../services/SyncService.ts'\n\nimport * as decoding from 'lib0/decoding.js'\nimport * as encoding from 'lib0/encoding.js'\nimport * as syncProtocol from 'y-protocols/sync'\nimport * as Y from 'yjs'\nimport { messageSync } from '../services/y-websocket.js'\nimport { decodeArrayBuffer, encodeArrayBuffer } from './base64.ts'\nimport { logger } from './logger.ts'\n\n/**\n * Get Document state encode as base64.\n *\n * Used to store yjs state on the server.\n *\n * @param ydoc - encode state of this doc\n */\nexport function getDocumentState(ydoc: Y.Doc): string {\n\tconst update = Y.encodeStateAsUpdate(ydoc)\n\treturn encodeArrayBuffer(update)\n}\n\n/**\n *\n * @param ydoc - apply state to this doc\n * @param documentState - base64 encoded doc state\n * @param origin - initiator object e.g. WebsocketProvider\n */\nexport function applyDocumentState(\n\tydoc: Y.Doc,\n\tdocumentState: string,\n\torigin: object,\n) {\n\tconst update = decodeArrayBuffer(documentState)\n\tY.applyUpdate(ydoc, update, origin)\n}\n\n/**\n * Create a steps from the open response\n * i.e. create a sync protocol update message from the document state\n * and encode it and wrap it in a step data structure.\n *\n * @param data - data returned by the open request\n * @return steps extracted from the open data.\n */\nexport function stepsFromOpenData(data: OpenData): Step[] {\n\tif (!data.documentState) {\n\t\treturn []\n\t}\n\treturn [documentStateToStep(data.documentState, data.document.lastSavedVersion)]\n}\n\n/**\n * Create a step from a document state\n * i.e. create a sync protocol update message from it\n * and encode it and wrap it in a step data structure.\n *\n * @param documentState - base64 encoded doc state\n * @param version - last saved version for the document state\n * @return base64 encoded yjs sync protocol update message and version\n */\nexport function documentStateToStep(documentState: string, version: number): Step {\n\tconst message = documentStateToUpdateMessage(documentState)\n\treturn { data: [encodeArrayBuffer(message)], sessionId: 0, version }\n}\n\n/**\n * Create a message from a document state\n * i.e. decode the base64 encoded yjs update\n * and create a sync protocol update message from it\n *\n * @param documentState - base64 encoded doc state\n */\nfunction documentStateToUpdateMessage(documentState: string): Uint8Array {\n\tconst update = decodeArrayBuffer(documentState)\n\tconst encoder = encoding.createEncoder()\n\tencoding.writeVarUint(encoder, messageSync)\n\tsyncProtocol.writeUpdate(encoder, update)\n\treturn encoding.toUint8Array(encoder)\n}\n\n/**\n * Apply a step to the ydoc.\n *\n * Only used in tests right now.\n *\n * @param ydoc - encode state of this doc\n * @param step - step data\n * @param step.data - array of base64 encoded yjs sync update messages\n * @param origin - initiator object e.g. WebsocketProvider\n */\nexport function applyStep(ydoc: Y.Doc, step: Step, origin = 'origin') {\n\tfor (const encoded of step.data) {\n\t\tconst updateMessage = decodeArrayBuffer(encoded)\n\t\tconst decoder = decoding.createDecoder(updateMessage)\n\t\tconst messageType = decoding.readVarUint(decoder)\n\t\tif (messageType !== messageSync) {\n\t\t\tlogger.error('y.js update message with invalid type', { messageType })\n\t\t\treturn\n\t\t}\n\t\t// There are no responses to updates - so this is a dummy.\n\t\tconst encoder = encoding.createEncoder()\n\t\tsyncProtocol.readSyncMessage(decoder, encoder, ydoc, origin)\n\t}\n}\n\n/**\n * Log y.js messages with their type and initiator call stack\n *\n * @param step - Y.js message\n */\nexport function logStep(step: Uint8Array) {\n\t// Create error for stack trace\n\tconst err = new Error()\n\n\tconst decoder = decoding.createDecoder(step)\n\n\tconst messageType = decoding.readVarUint(decoder)\n\tconst subType = decoding.readVarUint(decoder)\n\n\tconst encodedStep = encodeArrayBuffer(step)\n\tswitch (messageType) {\n\t\tcase 0:\n\t\t\tlogger.debug('y.js message sync', { subType, encodedStep, stack: err.stack })\n\t\t\tbreak\n\t\tcase 3:\n\t\t\tlogger.debug('y.js message awareness_query', { encodedStep, stack: err.stack })\n\t\t\tbreak\n\t\tcase 1:\n\t\t\tlogger.debug('y.js message awareness', { encodedStep, stack: err.stack })\n\t\t\tbreak\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { encodeArrayBuffer } from '../helpers/base64.ts'\nimport { logger } from '../helpers/logger.js'\n\ntype Sendable = {\n\tsteps: string[]\n\tawareness: string\n}\n\nexport default class Outbox {\n\t#awarenessUpdate = ''\n\t#syncUpdate = ''\n\t#syncQuery = ''\n\t#recoveryAttemptCounter = 0\n\t#isRecoveringSync = false\n\n\tstoreStep(step: Uint8Array) {\n\t\tconst encoded = encodeArrayBuffer(step)\n\t\tif (encoded < 'AAA' || encoded > 'Ag') {\n\t\t\tlogger.warn('Unexpected step type:', { step, encoded })\n\t\t\treturn\n\t\t}\n\t\tif (encoded < 'AAE') {\n\t\t\tthis.#syncQuery = encoded\n\t\t\treturn\n\t\t}\n\t\tif (encoded < 'AQ') {\n\t\t\tthis.#syncUpdate = encoded\n\t\t\treturn\n\t\t}\n\t\tthis.#awarenessUpdate = encoded\n\t}\n\n\tsetRecoveringSync() {\n\t\tthis.#isRecoveringSync = true\n\t\tthis.#recoveryAttemptCounter++\n\t}\n\n\tgetDataToSend(): Sendable {\n\t\treturn {\n\t\t\tsteps: [this.#syncUpdate, this.#syncQuery].filter((s) => s),\n\t\t\tawareness: this.#awarenessUpdate,\n\t\t\t...this.recoveryData,\n\t\t}\n\t}\n\n\tget recoveryData(): { recoveryAttempt?: number } {\n\t\treturn this.#isRecoveringSync\n\t\t\t? { recoveryAttempt: this.#recoveryAttemptCounter }\n\t\t\t: {}\n\t}\n\n\tget hasUpdate(): boolean {\n\t\treturn !!this.#syncUpdate\n\t}\n\n\t/*\n\t * Clear data that has just been sent.\n\t *\n\t * Only clear data that has not changed in the meantime.\n\t * @param {Sendable} - data that was to the server\n\t */\n\tclearSentData({ steps, awareness }: Sendable) {\n\t\tif (steps.includes(this.#syncUpdate)) {\n\t\t\tthis.#syncUpdate = ''\n\t\t}\n\t\tif (steps.includes(this.#syncQuery)) {\n\t\t\tthis.#syncQuery = ''\n\t\t\tthis.#isRecoveringSync = false\n\t\t}\n\t\tif (this.#awarenessUpdate === awareness) {\n\t\t\tthis.#awarenessUpdate = ''\n\t\t}\n\t}\n}\n","/*\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getCapabilities } from '@nextcloud/capabilities';\nimport axios from '@nextcloud/axios';\nimport { subscribe } from '@nextcloud/event-bus';\n/**\n * Get the list of supported notification types as reported by the server\n *\n * @return string[]\n */\nexport function getSupportedTypes() {\n const capabilities = getCapabilities();\n if (capabilities.notify_push) {\n return capabilities.notify_push.type;\n }\n else {\n return [];\n }\n}\n/**\n * Register a listener for notify_push events\n *\n * @param name name of the event\n * @param handler callback invoked for every matching event pushed\n * @param [options]\n * @param [options.credentials] optional credentials used instead of the pre_auth request\n * @param [options.credentials.username] username\n * @param [options.credentials.password] app password\n * @return boolean whether push is set up correctly\n */\nexport function listen(name, handler, options = {}) {\n setupGlobals(options);\n if (!window._notify_push_listeners[name]) {\n window._notify_push_listeners[name] = [];\n }\n window._notify_push_listeners[name].push(handler);\n if (window._notify_push_ws !== null && typeof window._notify_push_ws === \"object\" && window._notify_push_ready) {\n window._notify_push_ws.send('listen ' + name);\n }\n else {\n setupSocket(options);\n }\n return window._notify_push_available;\n}\nfunction setupGlobals(options = {}) {\n if (typeof window._notify_push_listeners === \"undefined\") {\n window._notify_push_listeners = {};\n window._notify_push_ws = null;\n window._notify_push_online = true;\n window._notify_push_available = false;\n window._notify_push_error_count = 0;\n window._notify_push_ready = false;\n subscribe('networkOffline', () => {\n window._notify_push_online = false;\n window._notify_push_ws = null;\n window._notify_push_ready = false;\n });\n subscribe('networkOnline', () => {\n window._notify_push_error_count = 0;\n window._notify_push_online = true;\n setupSocket(options);\n });\n }\n}\nasync function setupSocket(options = {}) {\n if (window._notify_push_ws) {\n return true;\n }\n window._notify_push_ws = true;\n const capabilities = getCapabilities();\n if (!capabilities.notify_push) {\n window._notify_push_available = false;\n window._notify_push_ws = null;\n return false;\n }\n window._notify_push_available = true;\n let preAuth;\n if (!options.credentials) {\n const response = await axios.post(capabilities.notify_push.endpoints.pre_auth);\n preAuth = response.data;\n }\n window._notify_push_ws = new WebSocket(capabilities.notify_push.endpoints.websocket);\n window._notify_push_ws.onopen = () => {\n if (typeof window._notify_push_ws === \"object\" && window._notify_push_ws) {\n if (preAuth) {\n window._notify_push_ws.send('');\n window._notify_push_ws.send(preAuth);\n }\n else if (options.credentials) {\n window._notify_push_ws.send(options.credentials.username);\n window._notify_push_ws.send(options.credentials.password);\n }\n window._notify_push_ready = true;\n for (let name in window._notify_push_listeners) {\n window._notify_push_ws.send('listen ' + name);\n }\n }\n };\n window._notify_push_ws.onmessage = message => {\n if (message.data === \"authenticated\") {\n window._notify_push_error_count = 0;\n }\n else {\n const i = message.data.indexOf(' ');\n let [event, body] = i > 0 ? [message.data.slice(0, i), message.data.slice(i + 1)] : [message.data, null];\n if (body) {\n body = JSON.parse(body);\n }\n if (window._notify_push_listeners[event]) {\n for (let cb of window._notify_push_listeners[event]) {\n cb(event, body);\n }\n }\n }\n };\n window._notify_push_ws.onerror = window._notify_push_ws.onclose = () => {\n window._notify_push_ws = null;\n window._notify_push_error_count += 1;\n window._notify_push_ready = false;\n setTimeout(() => {\n if (window._notify_push_online) {\n setupSocket(options);\n }\n } * window._notify_push_error_count);\n };\n return true;\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Emitter } from 'mitt'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { listen } from '@nextcloud/notify_push'\nimport mitt from 'mitt'\n\nexport declare type EventTypes = {\n\tnotify_push: {\n\t\tmessageType: unknown\n\t\tmessageBody: { steps: string[], documentId: number }\n\t}\n}\n\ndeclare global {\n\tinterface Window {\n\t\t_nc_text_notify?: Emitter\n\t}\n}\n\nif (!window._nc_text_notify) {\n\tconst isPushEnabled = loadState('text', 'notify_push', true)\n\tconst useNotifyPush = isPushEnabled\n\t\t? listen(\n\t\t\t\t'text_steps',\n\t\t\t\t(\n\t\t\t\t\tmessageType: string,\n\t\t\t\t\tmessageBody: { steps: string[], documentId: number },\n\t\t\t\t) => {\n\t\t\t\t\twindow._nc_text_notify?.emit('notify_push', {\n\t\t\t\t\t\tmessageType,\n\t\t\t\t\t\tmessageBody,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t)\n\t\t: undefined\n\twindow._nc_text_notify = useNotifyPush ? mitt() : undefined\n}\n\nexport default () => {\n\treturn window._nc_text_notify\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { Emitter } from 'mitt'\nimport type { OpenData } from '../apis/connect.ts'\nimport type { Connection } from '../composables/useConnection.ts'\nimport type { EventTypes } from './NotifyService.ts'\nimport type { Document, Session, Step, SyncService } from './SyncService.js'\n\nimport { sync } from '../apis/sync.ts'\nimport { logger } from '../helpers/logger.js'\nimport getNotifyBus from './NotifyService.ts'\nimport { ERROR_TYPE } from './SyncService.js'\n\n/**\n * Minimum inverval to refetch the document changes in ms.\n */\nconst FETCH_INTERVAL = 300\n\n/**\n * Maximum interval between refetches of document state in ms\n * if multiple users have joined\n */\nconst FETCH_INTERVAL_MAX = 5000\n\n/**\n * Interval to check for changes in ms\n * when there is only one user joined\n */\nconst FETCH_INTERVAL_SINGLE_EDITOR = 5000\n\n/**\n * Interval to check for changes in ms for read only users\n */\nconst FETCH_INTERVAL_READ_ONLY = 30000\n\n/**\n * Interval to fetch for changes in ms\n * when a browser window is considered invisible by the page visibility API\n * https://developer.mozilla.org/de/docs/Web/API/Page_Visibility_API\n */\nconst FETCH_INTERVAL_INVISIBLE = 20000\n\nconst FETCH_INTERVAL_NOTIFY = 30000\n\n/* Maximum number of retries for fetching before emitting a connection error */\nconst MAX_RETRY_FETCH_COUNT = 5\n\n/**\n * Timeout for sessions to be marked as disconnected\n * Make sure that this is higher than any FETCH_INTERVAL_ values\n */\nconst COLLABORATOR_DISCONNECT_TIME = FETCH_INTERVAL_INVISIBLE * 1.5\n\ninterface PollData {\n\tdocument: Document\n\tsessions: Session[]\n\tsteps: Step[]\n\treadOnly?: boolean\n}\n\ninterface ConflictData extends PollData {\n\toutsideChange: string\n}\n\nclass PollingBackend {\n\t#syncService: SyncService\n\t#connection: Connection\n\t#readOnly: boolean\n\n\t#lastPoll\n\t#fetchInterval: number\n\t#fetchRetryCounter: number\n\tfetcher: NodeJS.Timeout | undefined\n\t#pollActive = false\n\t#initialLoadingFinished = false\n\t#notifyPushBus: Emitter | undefined\n\tvisibilitychange = () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tthis.#fetchInterval = FETCH_INTERVAL_INVISIBLE\n\t\t} else {\n\t\t\tthis.resetRefetchTimer()\n\t\t}\n\t}\n\n\tconstructor(\n\t\tsyncService: SyncService,\n\t\tconnection: Connection,\n\t\t{ readOnly }: OpenData,\n\t) {\n\t\tthis.#syncService = syncService\n\t\tthis.#connection = connection\n\t\tthis.#fetchInterval = FETCH_INTERVAL\n\t\tthis.#fetchRetryCounter = 0\n\t\tthis.#lastPoll = 0\n\t\tthis.#readOnly = readOnly\n\t}\n\n\tconnect() {\n\t\tif (this.fetcher) {\n\t\t\tlogger.error('Trying to connect, but already connected')\n\t\t\treturn\n\t\t}\n\t\tthis.#initialLoadingFinished = false\n\t\tthis.fetcher = setInterval(this._fetchSteps.bind(this), 50)\n\t\tdocument.addEventListener('visibilitychange', this.visibilitychange)\n\t\tthis.#notifyPushBus = getNotifyBus()\n\t}\n\n\t/**\n\t * This method is only called though the timer\n\t */\n\tasync _fetchSteps() {\n\t\tif (this.#pollActive) {\n\t\t\treturn\n\t\t}\n\n\t\tconst now = Date.now()\n\n\t\tif (this.#lastPoll > now - this.#fetchInterval) {\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.fetcher) {\n\t\t\tlogger.error('No inverval but triggered')\n\t\t\treturn\n\t\t}\n\n\t\tthis.#pollActive = true\n\n\t\tlogger.debug('[PollingBackend] Fetching steps', {\n\t\t\tversion: this.#syncService.version,\n\t\t})\n\t\tawait sync(this.#connection, {\n\t\t\tversion: this.#syncService.version,\n\t\t}).then(this._handleResponse.bind(this), this._handleError.bind(this))\n\t\tthis.#lastPoll = Date.now()\n\t\tthis.#pollActive = false\n\t}\n\n\t_handleResponse({ data }: { data: PollData }) {\n\t\tconst { document, sessions } = data\n\t\tthis.#fetchRetryCounter = 0\n\n\t\tif (data.readOnly !== undefined && data.readOnly !== this.#readOnly) {\n\t\t\tthis.#readOnly = data.readOnly\n\t\t\tthis.#syncService.bus.emit('permissionChange', {\n\t\t\t\treadOnly: this.#readOnly,\n\t\t\t})\n\t\t\tif (data.readOnly) {\n\t\t\t\tthis.maximumReadOnlyTimer()\n\t\t\t}\n\t\t}\n\n\t\tthis.#syncService.bus.emit('change', { document, sessions })\n\t\tthis.#syncService.receiveSteps(data)\n\n\t\tif (data.steps.length === 0) {\n\t\t\tif (!this.#initialLoadingFinished) {\n\t\t\t\tthis.#initialLoadingFinished = true\n\t\t\t}\n\t\t\tif (this.#syncService.checkIdle()) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst disconnect = Date.now() - COLLABORATOR_DISCONNECT_TIME\n\t\t\tconst alive = sessions.filter((s) => s.lastContact * > disconnect)\n\t\t\tif (this.#readOnly) {\n\t\t\t\tthis.maximumReadOnlyTimer()\n\t\t\t} else if (alive.length < 2) {\n\t\t\t\tthis.maximumRefetchTimer()\n\t\t\t} else {\n\t\t\t\tthis.increaseRefetchTimer()\n\t\t\t}\n\t\t\tthis.#syncService.bus.emit('stateChange', { initialLoading: true })\n\t\t\treturn\n\t\t}\n\n\t\tif (this.#initialLoadingFinished) {\n\t\t\tthis.resetRefetchTimer()\n\t\t}\n\t}\n\n\t_handleError(e: {\n\t\tresponse?: { status: number, data: ConflictData }\n\t\tcode?: string\n\t}) {\n\t\tif (!e.response || e.code === 'ECONNABORTED') {\n\t\t\tif (this.#fetchRetryCounter++ >= MAX_RETRY_FETCH_COUNT) {\n\t\t\t\tthis.increaseRefetchTimer()\n\t\t\t\tlogger.error('[PollingBackend:fetchSteps] Network error when fetching steps, emitting CONNECTION_FAILED')\n\t\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\t\ttype: ERROR_TYPE.CONNECTION_FAILED,\n\t\t\t\t\tdata: {},\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tlogger.error(`[PollingBackend:fetchSteps] Network error when fetching steps, retry ${this.#fetchRetryCounter}`)\n\t\t\t}\n\t\t} else if (e.response.status === 409) {\n\t\t\t// Still apply the steps to update our version of the document\n\t\t\tthis._handleResponse(e.response)\n\t\t\tlogger.error('Conflict during file save, please resolve')\n\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\ttype: ERROR_TYPE.SAVE_COLLISION,\n\t\t\t\tdata: {\n\t\t\t\t\toutsideChange: e.response.data.outsideChange,\n\t\t\t\t},\n\t\t\t})\n\t\t} else if (e.response.status === 412) {\n\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\ttype: ERROR_TYPE.LOAD_ERROR,\n\t\t\t\tdata: e.response,\n\t\t\t})\n\t\t\tthis.disconnect()\n\t\t} else if ([403, 404].includes(e.response.status)) {\n\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\ttype: ERROR_TYPE.SOURCE_NOT_FOUND,\n\t\t\t\tdata: {},\n\t\t\t})\n\t\t\tthis.disconnect()\n\t\t} else if ([502, 503].includes(e.response.status)) {\n\t\t\tthis.increaseRefetchTimer()\n\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\ttype: ERROR_TYPE.CONNECTION_FAILED,\n\t\t\t\tdata: {},\n\t\t\t})\n\t\t\tlogger.error('Failed to fetch steps due to unavailable service', {\n\t\t\t\terror: e,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.disconnect()\n\t\t\tthis.#syncService.bus.emit('error', {\n\t\t\t\ttype: ERROR_TYPE.CONNECTION_FAILED,\n\t\t\t\tdata: {},\n\t\t\t})\n\t\t\tlogger.error('Failed to fetch steps due to other reason', { error: e })\n\t\t}\n\t}\n\n\tdisconnect() {\n\t\tclearInterval(this.fetcher)\n\t\tthis.fetcher = undefined\n\t\tdocument.removeEventListener('visibilitychange', this.visibilitychange)\n\t}\n\n\tresetRefetchTimer() {\n\t\tif (this.#notifyPushBus && this.#initialLoadingFinished) {\n\t\t\tthis.#fetchInterval = FETCH_INTERVAL_NOTIFY\n\t\t\treturn\n\t\t}\n\t\tthis.#fetchInterval = FETCH_INTERVAL\n\t}\n\n\tincreaseRefetchTimer() {\n\t\tif (this.#notifyPushBus && this.#initialLoadingFinished) {\n\t\t\tthis.#fetchInterval = FETCH_INTERVAL_NOTIFY\n\t\t\treturn\n\t\t}\n\t\tthis.#fetchInterval = Math.min(this.#fetchInterval * 2, FETCH_INTERVAL_MAX)\n\t}\n\n\tmaximumRefetchTimer() {\n\t\tif (this.#notifyPushBus && this.#initialLoadingFinished) {\n\t\t\tthis.#fetchInterval = FETCH_INTERVAL_NOTIFY\n\t\t\treturn\n\t\t}\n\t\tthis.#fetchInterval = FETCH_INTERVAL_SINGLE_EDITOR\n\t}\n\n\tmaximumReadOnlyTimer() {\n\t\tthis.#fetchInterval = FETCH_INTERVAL_READ_ONLY\n\t}\n}\n\nexport default PollingBackend\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ShallowRef } from 'vue'\nimport type { OpenData } from '../apis/connect.ts'\nimport type { Connection } from '../composables/useConnection.ts'\n\nimport mitt from 'mitt'\nimport { close } from '../apis/connect.ts'\nimport { push } from '../apis/sync.ts'\nimport { logger } from '../helpers/logger.js'\nimport { awarenessSteps } from '../helpers/steps.ts'\nimport { documentStateToStep } from '../helpers/yjs.ts'\nimport Outbox from './Outbox.ts'\nimport PollingBackend from './PollingBackend.ts'\n\n/**\n * Timeout after which the editor will consider a document without changes being synced as idle\n * The session will be terminated and the document will stay open in read-only mode with a button to reconnect if needed\n *\n */\nconst IDLE_TIMEOUT = 1440\n\nconst COLLABORATOR_IDLE_TIME = 60\n\nconst COLLABORATOR_DISCONNECT_TIME = 90\n\nconst ERROR_TYPE = {\n\t/**\n\t * Failed to save collaborative document due to external change\n\t * collision needs to be resolved manually\n\t */\n\tSAVE_COLLISION: 0,\n\t/**\n\t * Failed to push changes for MAX_REBASE_RETRY times\n\t */\n\tPUSH_FAILURE: 1,\n\n\tLOAD_ERROR: 2,\n\n\tCONNECTION_FAILED: 3,\n\n\tSOURCE_NOT_FOUND: 4,\n\n\tPUSH_FORBIDDEN: 5,\n} as const\n\ntype ErrorType = (typeof ERROR_TYPE)[keyof typeof ERROR_TYPE]\n\n/*\n * Step as what we expect to be returned from the server right now.\n */\nexport interface Step {\n\tdata: string[]\n\tversion: number\n\tsessionId: number\n}\n\nexport interface UserSession {\n\tid: number\n\tuserId: string\n\tcolor: string\n\tlastAwarenessMessage: string\n\tlastContact: number\n\tdocumentId: number\n\tdisplayName: string\n}\n\nexport interface GuestSession {\n\tid: number\n\tcolor: string\n\tlastAwarenessMessage: string\n\tlastContact: number\n\tguestName: string\n\tdocumentId: number\n}\n\nexport type Session = UserSession | GuestSession\n\n/**\n * Test if a session is a guest session\n *\n * @param session to test.\n */\nexport function isGuest(session: Session): session is GuestSession {\n\treturn 'guestName' in session && typeof session.guestName === 'string'\n}\n\n/**\n * Test if a session is a logged in user session\n *\n * @param session to test.\n */\nexport function isUser(session: Session): session is UserSession {\n\treturn 'userId' in session && typeof session.userId === 'string'\n}\n\nexport interface Document {\n\tid: number\n\tlastSavedVersion: number\n\tlastSavedVersionTime: number\n\tbaseVersionEtag: string\n\tinitialVersion: number\n}\n\nexport declare type EventTypes = {\n\t/* Document state */\n\topened: OpenData\n\n\t/* received new steps */\n\tsync: { document?: object, steps: Step[] }\n\n\t/* state changed (dirty) */\n\tstateChange: { initialLoading?: boolean, dirty?: boolean }\n\n\t/* error */\n\terror: { type: ErrorType, data?: object }\n\n\t/* Events for session and document meta data */\n\tchange: { sessions: Session[], document: Document }\n\n\t/* Emitted after successful save */\n\tsave: object\n\n\t/* Emitted once a document becomes idle */\n\tidle: void\n\n\t/* Emitted if the connection has been closed */\n\tclose: void\n\n\t/* Emitted if the read only state of the document has changed */\n\tpermissionChange: { readOnly: boolean }\n}\n\nclass SyncService {\n\tconnection: ShallowRef\n\tversion = -1\n\tpushError = 0\n\tbackend?: PollingBackend\n\t#sendIntervalId?: NodeJS.Timeout\n\t#outbox = new Outbox()\n\tbus = mitt()\n\t#openConnection: () => Promise\n\t#lastStepPush = Date.now()\n\t#sending = false\n\n\tconstructor({\n\t\tconnection,\n\t\topenConnection,\n\t}: {\n\t\tconnection: ShallowRef\n\t\topenConnection: () => Promise\n\t}) {\n\t\tthis.connection = connection\n\t\tthis.#openConnection = openConnection\n\t}\n\n\thasActiveConnection(): this is {\n\t\tconnection: ShallowRef\n\t} {\n\t\treturn Boolean(this.connection.value)\n\t}\n\n\tasync open() {\n\t\tif (this.hasActiveConnection()) {\n\t\t\tlogger.debug('already connected', { connection: this.connection })\n\t\t\treturn\n\t\t}\n\t\tconst data = await this.#openConnection().catch((e) => this.#emitError(e))\n\t\tif (!data) {\n\t\t\t// Error was already emitted above\n\t\t\treturn\n\t\t}\n\t\tif (!this.connection.value) {\n\t\t\tlogger.error('Opened the connection but now it is undefined')\n\t\t\treturn\n\t\t}\n\t\tthis.backend = new PollingBackend(this, this.connection.value, data)\n\t\t// Make sure to only emit this once the backend is in place.\n\t\tthis.bus.emit('opened', data)\n\t}\n\n\tstartSync() {\n\t\tthis.backend?.connect()\n\t}\n\n\tsyncUp() {\n\t\tthis.backend?.resetRefetchTimer()\n\t}\n\n\t#emitError(error: { response?: object, code?: string }) {\n\t\tconst eventData\n\t\t\t= !error.response || error.code === 'ECONNABORTED'\n\t\t\t\t? { type: ERROR_TYPE.CONNECTION_FAILED, data: {} }\n\t\t\t\t: { type: ERROR_TYPE.LOAD_ERROR, data: error.response }\n\t\tthis.bus.emit('error', eventData)\n\t}\n\n\t#emitDocumentStateStep(documentState: string, version: number) {\n\t\tconst documentStateStep = documentStateToStep(documentState, version)\n\t\tthis.bus.emit('sync', {\n\t\t\tsteps: [documentStateStep],\n\t\t})\n\t}\n\n\tsendStep(step: Uint8Array) {\n\t\tthis.#outbox.storeStep(step)\n\t\tthis.sendSteps()\n\t}\n\n\tsendRecoveryStep(step: Uint8Array) {\n\t\tthis.#outbox.setRecoveringSync()\n\t\tthis.#outbox.storeStep(step)\n\t\tthis.sendSteps()\n\t}\n\n\tsendSteps() {\n\t\t// If already waiting to send, do nothing.\n\t\tif (this.#sendIntervalId) {\n\t\t\treturn\n\t\t}\n\t\tthis.#sendIntervalId = setInterval(() => {\n\t\t\tif (this.connection.value && !this.#sending) {\n\t\t\t\tthis.sendStepsNow().catch((err) => logger.error(err))\n\t\t\t}\n\t\t}, 200)\n\t}\n\n\tasync sendStepsNow() {\n\t\tthis.#sending = true\n\t\tclearInterval(this.#sendIntervalId)\n\t\tthis.#sendIntervalId = undefined\n\t\tif (this.#outbox.hasUpdate) {\n\t\t\tthis.bus.emit('stateChange', { dirty: true })\n\t\t}\n\t\tif (!this.hasActiveConnection()) {\n\t\t\treturn\n\t\t}\n\t\tconst sendable = this.#outbox.getDataToSend()\n\t\treturn push(this.connection, {\n\t\t\tversion: this.version,\n\t\t\t...sendable,\n\t\t})\n\t\t\t.then((response) => {\n\t\t\t\tthis.#outbox.clearSentData(sendable)\n\t\t\t\tconst { steps, documentState, version } = response.data as {\n\t\t\t\t\tsteps: Step[]\n\t\t\t\t\tdocumentState: string\n\t\t\t\t\tversion: number\n\t\t\t\t}\n\t\t\t\tif (documentState) {\n\t\t\t\t\tthis.#emitDocumentStateStep(documentState, version)\n\t\t\t\t}\n\t\t\t\tthis.pushError = 0\n\t\t\t\tthis.#sending = false\n\t\t\t\tif (steps?.length > 0) {\n\t\t\t\t\tthis.receiveSteps({ steps })\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tconst { response, code } = err\n\t\t\t\tthis.#sending = false\n\t\t\t\tthis.pushError++\n\t\t\t\tlogger.error('Failed to push the steps to the server', err)\n\t\t\t\tif (!response || code === 'ECONNABORTED') {\n\t\t\t\t\tthis.bus.emit('error', {\n\t\t\t\t\t\ttype: ERROR_TYPE.CONNECTION_FAILED,\n\t\t\t\t\t\tdata: {},\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (response?.status === 412) {\n\t\t\t\t\tthis.bus.emit('error', {\n\t\t\t\t\t\ttype: ERROR_TYPE.LOAD_ERROR,\n\t\t\t\t\t\tdata: response,\n\t\t\t\t\t})\n\t\t\t\t} else if (response?.status === 403) {\n\t\t\t\t\t// either the session is invalid or the document is read only.\n\t\t\t\t\tlogger.error('failed to write to document - not allowed')\n\t\t\t\t\tthis.bus.emit('error', {\n\t\t\t\t\t\ttype: ERROR_TYPE.PUSH_FORBIDDEN,\n\t\t\t\t\t\tdata: {},\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthis.bus.emit('error', {\n\t\t\t\t\t\ttype: ERROR_TYPE.PUSH_FAILURE,\n\t\t\t\t\t\tdata: {},\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthrow new Error('Failed to apply steps. Retry!', { cause: err })\n\t\t\t})\n\t}\n\n\treceiveSteps({\n\t\tsteps,\n\t\tdocument,\n\t\tsessions = [],\n\t}: {\n\t\tsteps: Step[]\n\t\tdocument?: object\n\t\tsessions?: Session[]\n\t}) {\n\t\tconst versionAfter = Math.max(this.version, ...steps.map((s) => s.version))\n\t\tthis.bus.emit('sync', {\n\t\t\tsteps: [...awarenessSteps(sessions), ...steps],\n\t\t\tdocument,\n\t\t})\n\t\tif (this.version < versionAfter) {\n\t\t\t// Steps up to version where emitted but it looks like they were not processed.\n\t\t\t// Otherwise the WebsocketPolyfill would have increased the version counter.\n\t\t\tlogger.warn(`Failed to process steps leading up to version ${versionAfter}.`)\n\t\t}\n\t\tthis.#lastStepPush = Date.now()\n\t}\n\n\tcheckIdle() {\n\t\tconst lastPushMinutesAgo = (Date.now() - this.#lastStepPush) / / 60\n\t\tif (lastPushMinutesAgo > IDLE_TIMEOUT) {\n\t\t\tlogger.debug(`[SyncService] Document is idle for ${IDLE_TIMEOUT} minutes, suspending connection`)\n\t\t\tthis.bus.emit('idle')\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tasync sendRemainingSteps() {\n\t\tif (!this.#outbox.hasUpdate) {\n\t\t\treturn\n\t\t}\n\t\tlogger.debug('sending final steps')\n\t\treturn this.sendStepsNow().catch((err) => logger.error(err))\n\t}\n\n\tasync close() {\n\t\tthis.backend?.disconnect()\n\t\tif (this.hasActiveConnection()) {\n\t\t\tclose(this.connection.value)\n\t\t\t\t// Log and ignore possible network issues.\n\t\t\t\t.catch((e) => {\n\t\t\t\t\tlogger.info('Failed to close connection.', { e })\n\t\t\t\t})\n\t\t}\n\t\t// Clear connection so hasActiveConnection turns false and we can reconnect.\n\t\tthis.connection.value = undefined\n\t\tthis.bus.emit('close')\n\t}\n}\n\nexport default SyncService\nexport {\n\tCOLLABORATOR_DISCONNECT_TIME,\n\tCOLLABORATOR_IDLE_TIME,\n\tERROR_TYPE,\n\tIDLE_TIMEOUT,\n\tSyncService,\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Editor } from '@tiptap/core'\nimport type { AwarenessUser } from '../extensions/CollaborationCaret.ts'\nimport type { Session } from '../services/SyncService.ts'\n\nimport escapeHtml from 'escape-html'\nimport Markdown from '../extensions/Markdown.js'\nimport markdownit from '../markdownit/index.js'\nimport { isUser } from '../services/SyncService.ts'\n\n/**\n *\n * @param editor to apply methods to\n */\nexport function useEditorMethods(editor: Editor) {\n\tconst setEditable = (val: boolean) => {\n\t\tif (editor && editor.isEditable !== val) {\n\t\t\teditor.setEditable(val)\n\t\t}\n\t}\n\n\tconst setContent: (\n\t\tcontent: string,\n\t\toptions?: { addToHistory?: boolean },\n\t) => void = (content, { addToHistory = true } = {}) => {\n\t\tconst hasMarkdownContent\n\t\t\t= editor.extensionManager.extensions.includes(Markdown)\n\t\tconst html = hasMarkdownContent\n\t\t\t? markdownit.render(content) + '

    '\n\t\t\t: `

    \\n${escapeHtml(content)}
    `\n\t\teditor\n\t\t\t.chain()\n\t\t\t.setContent(html, { emitUpdate: addToHistory })\n\t\t\t.command(({ tr }) => {\n\t\t\t\ttr.setMeta('addToHistory', addToHistory)\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.run()\n\t}\n\n\tconst updateUser = (session: Session) => {\n\t\tconst user: AwarenessUser = {\n\t\t\tname: isUser(session) ? session.displayName : session?.guestName || '',\n\t\t\tcolor: session?.color,\n\t\t}\n\t\teditor.commands.updateUser(user)\n\t}\n\n\treturn { setContent, setEditable, updateUser }\n}\n","// src/node-range.ts\nimport { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\n// src/helpers/getNodeRangeDecorations.ts\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nfunction getNodeRangeDecorations(ranges) {\n if (!ranges.length) {\n return DecorationSet.empty;\n }\n const decorations = [];\n const doc = ranges[0].$from.node(0);\n ranges.forEach((range) => {\n const pos = range.$from.pos;\n const node = range.$from.nodeAfter;\n if (!node) {\n return;\n }\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: \"ProseMirror-selectednoderange\"\n })\n );\n });\n return DecorationSet.create(doc, decorations);\n}\n\n// src/helpers/getSelectionRanges.ts\nimport { NodeRange } from \"@tiptap/pm/model\";\nimport { SelectionRange } from \"@tiptap/pm/state\";\nfunction getNodeContentBounds(nodeStart, nodeSize, node) {\n const contentOffset = node.isText || node.isAtom ? 0 : 1;\n return {\n start: nodeStart + contentOffset,\n end: nodeStart + nodeSize - contentOffset\n };\n}\nfunction getSelectionRanges($from, $to, depth, options = {}) {\n const ranges = [];\n const doc = $from.node(0);\n const { extendOnBoundaryOverlap = true } = options;\n if (typeof depth === \"number\" && depth >= 0) {\n } else if ($from.sameParent($to)) {\n depth = Math.max(0, $from.sharedDepth($to.pos) - 1);\n } else {\n depth = $from.sharedDepth($to.pos);\n }\n const nodeRange = new NodeRange($from, $to, depth);\n const offset = nodeRange.depth === 0 ? 0 : doc.resolve(nodeRange.start).posAtIndex(0);\n nodeRange.parent.forEach((node, pos) => {\n const from = offset + pos;\n const to = from + node.nodeSize;\n const contentBounds = getNodeContentBounds(from, node.nodeSize, node);\n const overlapsNodeContent = extendOnBoundaryOverlap ? $to.pos >= contentBounds.start && $from.pos <= contentBounds.end : $to.pos > contentBounds.start && $from.pos < contentBounds.end;\n if (from < nodeRange.start || from >= nodeRange.end) {\n return;\n }\n if (!overlapsNodeContent) {\n return;\n }\n const selectionRange = new SelectionRange(doc.resolve(from), doc.resolve(to));\n ranges.push(selectionRange);\n });\n return ranges;\n}\n\n// src/helpers/NodeRangeSelection.ts\nimport { Selection } from \"@tiptap/pm/state\";\n\n// src/helpers/NodeRangeBookmark.ts\nvar NodeRangeBookmark = class _NodeRangeBookmark {\n constructor(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping) {\n return new _NodeRangeBookmark(mapping.map(this.anchor), mapping.map(this.head));\n }\n resolve(doc) {\n const $anchor = doc.resolve(this.anchor);\n const $head = doc.resolve(this.head);\n return new NodeRangeSelection($anchor, $head);\n }\n};\n\n// src/helpers/NodeRangeSelection.ts\nvar NodeRangeSelection = class _NodeRangeSelection extends Selection {\n constructor($anchor, $head, depth, bias = 1) {\n const { doc } = $anchor;\n const isCursor = $anchor === $head;\n const isCursorAtEnd = $anchor.pos === doc.content.size && $head.pos === doc.content.size;\n const $correctedHead = isCursor && !isCursorAtEnd ? doc.resolve($head.pos + (bias > 0 ? 1 : -1)) : $head;\n const $correctedAnchor = isCursor && isCursorAtEnd ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1)) : $anchor;\n const ranges = getSelectionRanges($correctedAnchor.min($correctedHead), $correctedAnchor.max($correctedHead), depth);\n const $rangeFrom = $correctedHead.pos >= $anchor.pos ? ranges[0].$from : ranges[ranges.length - 1].$to;\n const $rangeTo = $correctedHead.pos >= $anchor.pos ? ranges[ranges.length - 1].$to : ranges[0].$from;\n super($rangeFrom, $rangeTo, ranges);\n this.depth = depth;\n }\n // we can safely ignore this TypeScript error: https://github.com/Microsoft/TypeScript/issues/338\n // @ts-ignore\n get $to() {\n return this.ranges[this.ranges.length - 1].$to;\n }\n eq(other) {\n return other instanceof _NodeRangeSelection && other.$from.pos === this.$from.pos && other.$to.pos === this.$to.pos;\n }\n map(doc, mapping) {\n const $anchor = doc.resolve(mapping.map(this.anchor));\n const $head = doc.resolve(mapping.map(this.head));\n return new _NodeRangeSelection($anchor, $head);\n }\n toJSON() {\n return {\n type: \"nodeRange\",\n anchor: this.anchor,\n head: this.head\n };\n }\n get isForwards() {\n return this.head >= this.anchor;\n }\n get isBackwards() {\n return !this.isForwards;\n }\n extendBackwards() {\n const { doc } = this.$from;\n if (this.isForwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(0, -1);\n const $from2 = ranges[0].$from;\n const $to = ranges[ranges.length - 1].$to;\n return new _NodeRangeSelection($from2, $to, this.depth);\n }\n const firstRange = this.ranges[0];\n const $from = doc.resolve(Math.max(0, firstRange.$from.pos - 1));\n return new _NodeRangeSelection(this.$anchor, $from, this.depth);\n }\n extendForwards() {\n const { doc } = this.$from;\n if (this.isBackwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(1);\n const $from = ranges[0].$from;\n const $to2 = ranges[ranges.length - 1].$to;\n return new _NodeRangeSelection($to2, $from, this.depth);\n }\n const lastRange = this.ranges[this.ranges.length - 1];\n const $to = doc.resolve(Math.min(doc.content.size, lastRange.$to.pos + 1));\n return new _NodeRangeSelection(this.$anchor, $to, this.depth);\n }\n static fromJSON(doc, json) {\n return new _NodeRangeSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n }\n static create(doc, anchor, head, depth, bias = 1) {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias);\n }\n getBookmark() {\n return new NodeRangeBookmark(this.anchor, this.head);\n }\n};\nNodeRangeSelection.prototype.visible = false;\n\n// src/helpers/isNodeRangeSelection.ts\nfunction isNodeRangeSelection(value) {\n return value instanceof NodeRangeSelection;\n}\n\n// src/node-range.ts\nvar NodeRange2 = Extension.create({\n name: \"nodeRange\",\n addOptions() {\n return {\n depth: void 0,\n key: \"Mod\"\n };\n },\n addKeyboardShortcuts() {\n return {\n // extend NodeRangeSelection upwards\n \"Shift-ArrowUp\": ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, selection, tr } = state;\n const { anchor, head } = selection;\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection2 = NodeRangeSelection.create(doc, anchor, head, depth, -1);\n tr.setSelection(nodeRangeSelection2);\n view.dispatch(tr);\n return true;\n }\n const nodeRangeSelection = selection.extendBackwards();\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n },\n // extend NodeRangeSelection downwards\n \"Shift-ArrowDown\": ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, selection, tr } = state;\n const { anchor, head } = selection;\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection2 = NodeRangeSelection.create(doc, anchor, head, depth);\n tr.setSelection(nodeRangeSelection2);\n view.dispatch(tr);\n return true;\n }\n const nodeRangeSelection = selection.extendForwards();\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n },\n // add `NodeRangeSelection` to all nodes\n \"Mod-a\": ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, tr } = state;\n const nodeRangeSelection = NodeRangeSelection.create(doc, 0, doc.content.size, depth);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n }\n };\n },\n onSelectionUpdate() {\n const { selection } = this.editor.state;\n if (isNodeRangeSelection(selection)) {\n this.editor.view.dom.classList.add(\"ProseMirror-noderangeselection\");\n }\n },\n addProseMirrorPlugins() {\n let hideTextSelection = false;\n let activeMouseSelection = false;\n return [\n new Plugin({\n key: new PluginKey(\"nodeRange\"),\n props: {\n attributes: () => {\n if (hideTextSelection) {\n return {\n class: \"ProseMirror-noderangeselection\"\n };\n }\n return { class: \"\" };\n },\n handleDOMEvents: {\n mousedown: (view, event) => {\n const { key } = this.options;\n const isMac = /Mac/.test(navigator.platform);\n const isShift = !!event.shiftKey;\n const isControl = !!event.ctrlKey;\n const isAlt = !!event.altKey;\n const isMeta = !!event.metaKey;\n const isMod = isMac ? isMeta : isControl;\n if (key === null || key === void 0 || key === \"Shift\" && isShift || key === \"Control\" && isControl || key === \"Alt\" && isAlt || key === \"Meta\" && isMeta || key === \"Mod\" && isMod) {\n activeMouseSelection = true;\n }\n if (!activeMouseSelection) {\n return false;\n }\n document.addEventListener(\n \"mouseup\",\n () => {\n activeMouseSelection = false;\n const { state } = view;\n const { doc, selection, tr } = state;\n const { $anchor, $head } = selection;\n if ($anchor.sameParent($head)) {\n return;\n }\n const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n },\n { once: true }\n );\n return false;\n }\n },\n // when selecting some text we want to render some decorations\n // to preview a `NodeRangeSelection`\n decorations: (state) => {\n const { selection } = state;\n const isNodeRange = isNodeRangeSelection(selection);\n hideTextSelection = false;\n if (!activeMouseSelection) {\n if (!isNodeRange) {\n return null;\n }\n hideTextSelection = true;\n return getNodeRangeDecorations(selection.ranges);\n }\n const { $from, $to } = selection;\n if (!isNodeRange && $from.sameParent($to)) {\n return null;\n }\n const nodeRanges = getSelectionRanges($from, $to, this.options.depth);\n if (!nodeRanges.length) {\n return null;\n }\n hideTextSelection = true;\n return getNodeRangeDecorations(nodeRanges);\n }\n }\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = NodeRange2;\nexport {\n NodeRange2 as NodeRange,\n NodeRangeSelection,\n index_default as default,\n getNodeRangeDecorations,\n getSelectionRanges,\n isNodeRangeSelection\n};\n//# sourceMappingURL=index.js.map","// src/drag-handle.ts\nimport { Extension } from \"@tiptap/core\";\n\n// src/drag-handle-plugin.ts\nimport { computePosition } from \"@floating-ui/dom\";\nimport { isFirefox } from \"@tiptap/core\";\nimport { isChangeOrigin } from \"@tiptap/extension-collaboration\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport {\n absolutePositionToRelativePosition,\n relativePositionToAbsolutePosition,\n ySyncPluginKey\n} from \"@tiptap/y-tiptap\";\n\n// src/helpers/dragHandler.ts\nimport { getSelectionRanges, NodeRangeSelection } from \"@tiptap/extension-node-range\";\nimport { NodeSelection } from \"@tiptap/pm/state\";\n\n// src/helpers/cloneElement.ts\nfunction getCSSText(element, properties) {\n const style = getComputedStyle(element);\n if (properties) {\n return properties.filter((p) => p.trim().length > 0).map((p) => `${p}:${style.getPropertyValue(p)};`).join(\"\");\n }\n let value = \"\";\n for (let i = 0; i < style.length; i += 1) {\n value += `${style[i]}:${style.getPropertyValue(style[i])};`;\n }\n return value;\n}\nfunction cloneElement(node, properties) {\n const clonedNode = node.cloneNode(true);\n const sourceElements = [node, ...Array.from(node.getElementsByTagName(\"*\"))];\n const targetElements = [clonedNode, ...Array.from(clonedNode.getElementsByTagName(\"*\"))];\n sourceElements.forEach((sourceElement, index) => {\n targetElements[index].style.cssText = getCSSText(sourceElement, properties);\n });\n return clonedNode;\n}\n\n// src/helpers/defaultRules.ts\nvar listItemFirstChild = {\n id: \"listItemFirstChild\",\n evaluate: ({ parent, isFirst }) => {\n if (!isFirst) {\n return 0;\n }\n const listItemTypes = [\"listItem\", \"taskItem\"];\n if (parent && listItemTypes.includes(parent.type.name)) {\n return 1e3;\n }\n return 0;\n }\n};\nvar listWrapperDeprioritize = {\n id: \"listWrapperDeprioritize\",\n evaluate: ({ node }) => {\n const listItemTypes = [\"listItem\", \"taskItem\"];\n const firstChild = node.firstChild;\n if (firstChild && listItemTypes.includes(firstChild.type.name)) {\n return 1e3;\n }\n return 0;\n }\n};\nvar tableStructure = {\n id: \"tableStructure\",\n evaluate: ({ node, parent }) => {\n const tableStructureTypes = [\"tableRow\", \"tableCell\", \"tableHeader\"];\n if (tableStructureTypes.includes(node.type.name)) {\n return 1e3;\n }\n if (parent && parent.type.name === \"tableHeader\") {\n return 1e3;\n }\n return 0;\n }\n};\nvar inlineContent = {\n id: \"inlineContent\",\n evaluate: ({ node }) => {\n if (node.isInline || node.isText) {\n return 1e3;\n }\n return 0;\n }\n};\nvar defaultRules = [\n listItemFirstChild,\n listWrapperDeprioritize,\n tableStructure,\n inlineContent\n];\n\n// src/helpers/edgeDetection.ts\nvar DEFAULT_EDGE_CONFIG = {\n edges: [\"left\", \"top\"],\n threshold: 12,\n strength: 500\n};\nfunction normalizeEdgeDetection(input) {\n if (input === void 0 || input === \"left\") {\n return { ...DEFAULT_EDGE_CONFIG };\n }\n if (input === \"right\") {\n return { edges: [\"right\", \"top\"], threshold: 12, strength: 500 };\n }\n if (input === \"both\") {\n return { edges: [\"left\", \"right\", \"top\"], threshold: 12, strength: 500 };\n }\n if (input === \"none\") {\n return { edges: [], threshold: 0, strength: 0 };\n }\n return { ...DEFAULT_EDGE_CONFIG, ...input };\n}\nfunction isNearEdge(coords, element, config) {\n if (config.edges.length === 0) {\n return false;\n }\n const rect = element.getBoundingClientRect();\n const { threshold, edges } = config;\n return edges.some((edge) => {\n if (edge === \"left\") {\n return coords.x - rect.left < threshold;\n }\n if (edge === \"right\") {\n return rect.right - coords.x < threshold;\n }\n if (edge === \"top\") {\n return coords.y - rect.top < threshold;\n }\n if (edge === \"bottom\") {\n return rect.bottom - coords.y < threshold;\n }\n return false;\n });\n}\nfunction calculateEdgeDeduction(coords, element, config, depth) {\n if (!element || config.edges.length === 0) {\n return 0;\n }\n if (isNearEdge(coords, element, config)) {\n return config.strength * depth;\n }\n return 0;\n}\n\n// src/helpers/scoring.ts\nvar BASE_SCORE = 1e3;\nfunction calculateScore(context, rules, edgeConfig, coords) {\n let score = BASE_SCORE;\n let excluded = false;\n rules.every((rule) => {\n const deduction = rule.evaluate(context);\n score -= deduction;\n if (score <= 0) {\n excluded = true;\n return false;\n }\n return true;\n });\n if (excluded) {\n return -1;\n }\n const dom = context.view.nodeDOM(context.pos);\n score -= calculateEdgeDeduction(coords, dom, edgeConfig, context.depth);\n if (score <= 0) {\n return -1;\n }\n return score;\n}\n\n// src/helpers/findBestDragTarget.ts\nfunction hasAncestorOfType($pos, depth, allowedTypes) {\n const ancestorDepths = Array.from({ length: depth }, (_, i) => depth - 1 - i);\n return ancestorDepths.some((d) => allowedTypes.includes($pos.node(d).type.name));\n}\nfunction findBestDragTarget(view, coords, options) {\n if (!Number.isFinite(coords.x) || !Number.isFinite(coords.y)) {\n return null;\n }\n const posInfo = view.posAtCoords({ left: coords.x, top: coords.y });\n if (!posInfo) {\n return null;\n }\n const { doc } = view.state;\n const $pos = doc.resolve(posInfo.pos);\n const rules = [];\n if (options.defaultRules) {\n rules.push(...defaultRules);\n }\n rules.push(...options.rules);\n const depthLevels = Array.from({ length: $pos.depth }, (_, i) => $pos.depth - i);\n const candidates = depthLevels.map((depth) => {\n const node = $pos.node(depth);\n const nodePos = $pos.before(depth);\n if (options.allowedContainers && depth > 0) {\n const inAllowedContainer = hasAncestorOfType($pos, depth, options.allowedContainers);\n if (!inAllowedContainer) {\n return null;\n }\n }\n const parent = depth > 0 ? $pos.node(depth - 1) : null;\n const index = depth > 0 ? $pos.index(depth - 1) : 0;\n const siblingCount = parent ? parent.childCount : 1;\n const context = {\n node,\n pos: nodePos,\n depth,\n parent,\n index,\n isFirst: index === 0,\n isLast: index === siblingCount - 1,\n $pos,\n view\n };\n const score = calculateScore(context, rules, options.edgeDetection, coords);\n if (score < 0) {\n return null;\n }\n const dom = view.nodeDOM(nodePos);\n return { node, pos: nodePos, depth, score, dom };\n }).filter((candidate) => candidate !== null);\n const nodeAfter = $pos.nodeAfter;\n if (nodeAfter && nodeAfter.isAtom && !nodeAfter.isInline) {\n const nodePos = posInfo.pos;\n const depth = $pos.depth + 1;\n const parent = $pos.parent;\n const index = $pos.index();\n const siblingCount = parent.childCount;\n let inAllowedContainer = true;\n if (options.allowedContainers) {\n inAllowedContainer = hasAncestorOfType($pos, depth, options.allowedContainers);\n }\n if (inAllowedContainer) {\n const context = {\n node: nodeAfter,\n pos: nodePos,\n depth,\n parent,\n index,\n isFirst: index === 0,\n isLast: index === siblingCount - 1,\n $pos,\n view\n };\n const score = calculateScore(context, rules, options.edgeDetection, coords);\n if (score >= 0) {\n const dom = view.nodeDOM(nodePos);\n if (dom) {\n candidates.push({ node: nodeAfter, pos: nodePos, depth, score, dom });\n }\n }\n }\n }\n if (candidates.length === 0) {\n return null;\n }\n candidates.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n return b.depth - a.depth;\n });\n const winner = candidates[0];\n if (!winner.dom) {\n return null;\n }\n return {\n node: winner.node,\n pos: winner.pos,\n dom: winner.dom\n };\n}\n\n// src/helpers/findNextElementFromCursor.ts\nfunction findClosestTopLevelBlock(element, view) {\n let current = element;\n while ((current == null ? void 0 : current.parentElement) && current.parentElement !== view.dom) {\n current = current.parentElement;\n }\n return (current == null ? void 0 : current.parentElement) === view.dom ? current : void 0;\n}\nfunction isValidRect(rect) {\n return Number.isFinite(rect.top) && Number.isFinite(rect.bottom) && Number.isFinite(rect.left) && Number.isFinite(rect.right) && rect.width > 0 && rect.height > 0;\n}\nfunction clampToContent(view, x, y, inset = 5) {\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n const container = view.dom;\n const firstBlock = container.firstElementChild;\n const lastBlock = container.lastElementChild;\n if (!firstBlock || !lastBlock) {\n return null;\n }\n const topRect = firstBlock.getBoundingClientRect();\n const botRect = lastBlock.getBoundingClientRect();\n if (!isValidRect(topRect) || !isValidRect(botRect)) {\n return null;\n }\n const clampedY = Math.min(Math.max(topRect.top + inset, y), botRect.bottom - inset);\n const epsilon = 0.5;\n const sameLeft = Math.abs(topRect.left - botRect.left) < epsilon;\n const sameRight = Math.abs(topRect.right - botRect.right) < epsilon;\n let rowRect = topRect;\n if (sameLeft && sameRight) {\n rowRect = topRect;\n } else {\n }\n const clampedX = Math.min(Math.max(rowRect.left + inset, x), rowRect.right - inset);\n if (!Number.isFinite(clampedX) || !Number.isFinite(clampedY)) {\n return null;\n }\n return { x: clampedX, y: clampedY };\n}\nvar findElementNextToCoords = (options) => {\n const { x, y, editor, nestedOptions } = options;\n const { view, state } = editor;\n const clamped = clampToContent(view, x, y, 5);\n if (!clamped) {\n return { resultElement: null, resultNode: null, pos: null };\n }\n const { x: clampedX, y: clampedY } = clamped;\n if (nestedOptions == null ? void 0 : nestedOptions.enabled) {\n const target = findBestDragTarget(view, { x: clampedX, y: clampedY }, nestedOptions);\n if (!target) {\n return { resultElement: null, resultNode: null, pos: null };\n }\n return {\n resultElement: target.dom,\n resultNode: target.node,\n pos: target.pos\n };\n }\n const elements = view.root.elementsFromPoint(clampedX, clampedY);\n let block;\n Array.prototype.some.call(elements, (el) => {\n if (!view.dom.contains(el)) {\n return false;\n }\n const candidate = findClosestTopLevelBlock(el, view);\n if (candidate) {\n block = candidate;\n return true;\n }\n return false;\n });\n if (!block) {\n const coords = view.posAtCoords({ left: clampedX, top: clampedY });\n if (coords) {\n const $pos = state.doc.resolve(coords.pos);\n const depth = Math.min($pos.depth, 1);\n const blockPos = depth > 0 ? $pos.before(depth) : $pos.pos;\n const blockNode = state.doc.nodeAt(blockPos);\n if (blockNode) {\n const dom = view.nodeDOM(blockPos);\n return {\n resultElement: dom instanceof HTMLElement ? dom : null,\n resultNode: blockNode,\n pos: blockPos\n };\n }\n }\n return { resultElement: null, resultNode: null, pos: null };\n }\n let pos;\n try {\n pos = view.posAtDOM(block, 0);\n } catch {\n return { resultElement: null, resultNode: null, pos: null };\n }\n const node = state.doc.nodeAt(pos);\n if (!node) {\n const resolvedPos = state.doc.resolve(pos);\n const parent = resolvedPos.parent;\n return {\n resultElement: block,\n resultNode: parent,\n pos: resolvedPos.start()\n };\ SPDX-FileCopyrightText: 2022, 2023, 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst URL_PATTERN = /(\\s|^)(https?:\\/\\/)([-A-Z0-9+_.]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\\s|$)/ig;\nconst URL_PATTERN_AUTOLINK = /(\\s|\\(|^)((https?:\\/\\/)([-A-Z0-9+_.]+[-A-Z0-9]+(?::[0-9]+)?(?:\\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*))(?=\\s|\\)|$)/ig;\nfunction remarkAutolink({ autolink, useMarkdown, useExtendedMarkdown }) {\n return function(tree) {\n if (useExtendedMarkdown || !useMarkdown || !autolink) {\n return;\n }\n visitParents(tree, (node) => node.type === \"text\", (node, ancestors) => {\n if (ancestors.some((ancestor) => ancestor.type === \"link\" || ancestor.type === \"linkReference\")) {\n return;\n }\n const parent = ancestors.at(-1);\n const index = parent.children.indexOf(node) ?? 0;\n const parsed = parseUrl(node.value);\n const parsedNodes = typeof parsed === \"string\" ? [u(\"text\", parsed)] : parsed.map((n) => {\n if (typeof n === \"string\") {\n return u(\"text\", n);\n }\n return u(\"link\", {\n url: n.props.href\n }, [u(\"text\", n.props.href)]);\n }).filter((x) => x).flat();\n parent.children.splice(index, 1, ...parsedNodes);\n return [SKIP, index + parsedNodes.length];\n });\n };\n}\nfunction parseUrl(text) {\n let match = URL_PATTERN_AUTOLINK.exec(text);\n const list = [];\n let start = 0;\n while (match !== null) {\n let href = match[2];\n let textAfter;\n let textBefore = text.substring(start, match.index + match[1].length);\n if (href[0] === \" \") {\n textBefore += href[0];\n href = href.substring(1).trim();\n }\n const lastChar = href[href.length - 1];\n if (lastChar === \".\" || lastChar === \",\" || lastChar === \";\" || match[0][0] === \"(\" && lastChar === \")\") {\n href = href.substring(0, href.length - 1);\n textAfter = lastChar;\n }\n list.push(textBefore);\n list.push({ component: NcRichTextExternalLink, props: { href: href.trim(), decorateExternal: true } });\n if (textAfter) {\n list.push(textAfter);\n }\n start = match.index + match[0].length;\n match = URL_PATTERN_AUTOLINK.exec(text);\n }\n list.push(text.substring(start));\n const joinedText = list.map((item) => typeof item === \"string\" ? item : item.props.href).join(\"\");\n if (text === joinedText) {\n return list;\n }\n logger.error(\"[NcRichText] Failed to reassemble the chunked text: \" + text);\n return text;\n}\nfunction getRoute(router, url) {\n const removePrefix = (str, prefix) => str.startsWith(prefix) ? str.slice(prefix.length) : str;\n const removePrefixes = (str, ...prefixes) => prefixes.reduce((acc, prefix) => removePrefix(acc, prefix), str);\n if (!router) {\n return null;\n }\n const isAbsoluteURL = /^https?:\\/\\//.test(url);\n const isNonHttpLink = /^[a-z][a-z0-9+.-]*:.+/.test(url);\n if (!isAbsoluteURL && isNonHttpLink) {\n return null;\n }\n if (isAbsoluteURL && !url.startsWith(getBaseUrl())) {\n return null;\n }\n if (!isAbsoluteURL && !url.startsWith(\"/\")) {\n return null;\n }\n const relativeUrl = isAbsoluteURL ? removePrefixes(url, getBaseUrl(), \"/index.php\") : url;\n const relativeRouterBase = removePrefixes(router.options.history.base, getRootUrl(), \"/index.php\");\n const potentialRouterPath = removePrefixes(relativeUrl, relativeRouterBase) || \"/\";\n const route = router.resolve(potentialRouterPath);\n if (!route.matched.length) {\n return null;\n }\n return route.fullPath;\n}\nexport {\n NcRichTextExternalLink as N,\n URL_PATTERN as U,\n getRoute as g,\n parseUrl as p,\n remarkAutolink as r\n};\n//# sourceMappingURL=autolink-DrIurosL.mjs.map\n","import '../assets/referencePickerModal-BNPfxyni.css';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode, toDisplayString, createCommentVNode, resolveComponent, createVNode, withCtx, defineComponent, inject, ref, useTemplateRef, nextTick, computed, watch, onBeforeUnmount, normalizeClass, normalizeStyle, withKeys, withModifiers, unref, createBlock, resolveDynamicComponent, createTextVNode, createApp } from \"vue\";\nimport { emit } from \"@nextcloud/event-bus\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { I as IconClose } from \"./Close-CuhcJnX2.mjs\";\nimport { e as renderCustomPickerElement, d as destroyCustomPickerElement, i as isCustomPickerElementRegistered, j as hasFullWidth, k as isResizable, b as isWidgetRegistered, h as hasInteractiveView, f as renderWidget, a as destroyWidget, g as getCustomPickerElementSize } from \"./customPickerElements-BqbDcaEu.mjs\";\nimport axios from \"@nextcloud/axios\";\nimport { loadState } from \"@nextcloud/initial-state\";\nimport { imagePath, generateOcsUrl } from \"@nextcloud/router\";\nimport { r as register, W as t8, a as t, X as t46, Y as t41, Z as t24, _ as t25, q as t43, $ as t32, A as t19, a0 as t12 } from \"./_l10n-wdIzZwir.mjs\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport { N as NcEmptyContent } from \"./NcEmptyContent-CGAPqk4S.mjs\";\nimport { _ as _sfc_main$a } from \"./NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs\";\nimport { N as NcSelect } from \"./NcSelect--kERLlBK.mjs\";\nimport debounce from \"debounce\";\nimport { useElementSize, useIntersectionObserver } from \"@vueuse/core\";\nimport { routerKey, RouterLink } from \"vue-router\";\nimport { N as NcButton } from \"./NcButton-jvoYS2my.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { g as getRoute } from \"./autolink-DrIurosL.mjs\";\nimport { N as NcLoadingIcon } from \"./NcLoadingIcon-BOVpFVQz.mjs\";\nimport { _ as _sfc_main$b } from \"./NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs\";\nimport { I as IconDotsHorizontal } from \"./NcActions-C-wDqSrv.mjs\";\nimport { N as NcModal } from \"./NcModal-DiDvgcU8.mjs\";\nconst _sfc_main$9 = {\n name: \"ArrowLeftIcon\",\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};\nconst _hoisted_1$9 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$7 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$6 = { d: \"M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z\" };\nconst _hoisted_4$5 = { key: 0 };\nfunction _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon arrow-left-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$6, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$5, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$7))\n ], 16, _hoisted_1$9);\n}\nconst ArrowLeftIcon = /* @__PURE__ */ _export_sfc(_sfc_main$9, [[\"render\", _sfc_render$8]]);\nconst _sfc_main$8 = {\n name: \"NcCustomPickerElement\",\n props: {\n /**\n * The reference provider\n */\n provider: {\n type: Object,\n required: true\n }\n },\n emits: [\n \"cancel\",\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n isRegistered: isCustomPickerElementRegistered(this.provider.id),\n renderResult: null\n };\n },\n mounted() {\n if (this.isRegistered) {\n this.renderElement();\n }\n },\n beforeUnmount() {\n if (this.isRegistered) {\n destroyCustomPickerElement(this.provider.id, this.$el, this.renderResult);\n }\n },\n methods: {\n renderElement() {\n if (this.$refs.domElement) {\n this.$refs.domElement.innerHTML = \"\";\n }\n const renderFunctionResult = renderCustomPickerElement(this.$refs.domElement, { providerId: this.provider.id, accessible: false });\n Promise.resolve(renderFunctionResult).then((result) => {\n this.renderResult = result;\n if (this.renderResult.object?._isVue && this.renderResult.object?.$on) {\n this.renderResult.object.$on(\"submit\", this.onSubmit);\n this.renderResult.object.$on(\"pick\", this.onPick);\n this.renderResult.object.$on(\"cancel\", this.onCancel);\n }\n this.renderResult.element.addEventListener(\"submit\", (e) => {\n this.onSubmit(e.detail);\n });\n this.renderResult.element.addEventListener(\"pick\", (e) => {\n this.onPick(e.detail);\n });\n this.renderResult.element.addEventListener(\"cancel\", this.onCancel);\n });\n },\n onSubmit(value) {\n this.$emit(\"submit\", value);\n },\n onPick(value) {\n this.$emit(\"pick\", value);\n },\n onCancel() {\n this.$emit(\"cancel\");\n }\n }\n};\nconst _hoisted_1$8 = { ref: \"domElement\" };\nfunction _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", _hoisted_1$8, null, 512);\n}\nconst NcCustomPickerElement = /* @__PURE__ */ _export_sfc(_sfc_main$8, [[\"render\", _sfc_render$7], [\"__scopeId\", \"data-v-df9d8f84\"]]);\nconst _sfc_main$7 = {\n name: \"LinkVariantIcon\",\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};\nconst _hoisted_1$7 = [\"aria-hidden\", \"aria-label\"];\nconst _hoisted_2$6 = [\"fill\", \"width\", \"height\"];\nconst _hoisted_3$5 = { d: \"M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z\" };\nconst _hoisted_4$4 = { key: 0 };\nfunction _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps(_ctx.$attrs, {\n \"aria-hidden\": $props.title ? null : \"true\",\n \"aria-label\": $props.title,\n class: \"material-design-icon link-variant-icon\",\n role: \"img\",\n onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit(\"click\", $event))\n }), [\n (openBlock(), createElementBlock(\"svg\", {\n fill: $props.fillColor,\n class: \"material-design-icon__svg\",\n width: $props.size,\n height: $props.size,\n viewBox: \"0 0 24 24\"\n }, [\n createElementVNode(\"path\", _hoisted_3$5, [\n $props.title ? (openBlock(), createElementBlock(\"title\", _hoisted_4$4, toDisplayString($props.title), 1)) : createCommentVNode(\"\", true)\n ])\n ], 8, _hoisted_2$6))\n ], 16, _hoisted_1$7);\n}\nconst LinkVariantIcon = /* @__PURE__ */ _export_sfc(_sfc_main$7, [[\"render\", _sfc_render$6]]);\nregister(t8);\nconst anyLinkProviderId = \"any-link\";\nconst anyLinkProvider = {\n id: anyLinkProviderId,\n title: t(\"Any link\"),\n order: 0,\n icon_url: imagePath(\"core\", \"filetypes/link.svg\")\n};\nwindow._vue_richtext_reference_providers ??= loadState(\"core\", \"reference-provider-list\", []);\nwindow._vue_richtext_reference_provider_timestamps ??= loadState(\"core\", \"reference-provider-timestamps\", {});\nfunction getProvider(providerId) {\n if (providerId === anyLinkProviderId) {\n return anyLinkProvider;\n }\n return getProviders().find((p) => p.id === providerId);\n}\nfunction getProviders() {\n return window._vue_richtext_reference_providers.filter((p) => {\n const keep = !!p.search_providers_ids && p.search_providers_ids.length > 0 || isCustomPickerElementRegistered(p.id);\n if (!keep) {\n logger.debug(`[smart picker] ${p.id} reference provider is discoverable but does not have any related search provider or custom picker component registered`);\n }\n return keep;\n });\n}\nfunction sortProviders(providerList) {\n const timestamps = window._vue_richtext_reference_provider_timestamps;\n return providerList.sort((a, b) => {\n return a.order === b.order ? 0 : a.order > b.order ? 1 : -1;\n }).sort((a, b) => {\n const ta = timestamps[a.id];\n const tb = timestamps[b.id];\n return ta === tb ? 0 : tb === void 0 ? -1 : ta === void 0 ? 1 : ta > tb ? -1 : 1;\n });\n}\nfunction searchProvider(query, limit) {\n const providers = getProviders();\n const escapedQuery = query.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n const regexp = new RegExp(escapedQuery, \"i\");\n const sortedProviders = sortProviders(providers);\n const filteredSortedProviders = sortedProviders.filter((p) => {\n return p.title.match(regexp);\n });\n const searchResult = limit ? filteredSortedProviders.slice(0, limit) : filteredSortedProviders;\n if (query === \"\" || searchResult.length === 0) {\n searchResult.push(anyLinkProvider);\n }\n return searchResult;\n}\nasync function touchProvider(providerId) {\n const timestamp = Math.floor(Date.now() / 1e3);\n const url = generateOcsUrl(\"references/provider/{providerId}\", { providerId });\n await axios.put(url, { timestamp });\n window._vue_richtext_reference_provider_timestamps[providerId] = timestamp;\n}\nregister(t41, t46);\n/*!\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nfunction isUrl(str) {\n try {\n return Boolean(new URL(str));\n } catch {\n return false;\n }\n}\nconst _sfc_main$6 = {\n name: \"NcProviderList\",\n components: {\n NcSelect,\n NcHighlight: _sfc_main$a,\n NcEmptyContent,\n LinkVariantIcon\n },\n emits: [\n \"selectProvider\",\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n selectedProvider: null,\n query: \"\",\n multiselectPlaceholder: t(\"Select provider\"),\n providerIconAlt: t(\"Provider icon\")\n };\n },\n computed: {\n options() {\n const result = [];\n if (this.query !== \"\" && isUrl(this.query)) {\n result.push({\n id: this.query,\n title: this.query,\n isLink: true\n });\n }\n result.push(...searchProvider(this.query));\n return result;\n }\n },\n methods: {\n focus() {\n setTimeout(() => {\n this.$refs[\"provider-select\"]?.$el?.querySelector(\"#provider-select-input\")?.focus();\n }, 300);\n },\n onProviderSelected(p) {\n if (p !== null) {\n if (p.isLink) {\n this.$emit(\"submit\", p.title);\n this.$emit(\"pick\", { link: p.title });\n } else {\n this.$emit(\"selectProvider\", p);\n }\n this.selectedProvider = null;\n }\n },\n onSearch(query) {\n this.query = query;\n }\n }\n};\nconst _hoisted_1$6 = { class: \"provider-list\" };\nconst _hoisted_2$5 = {\n key: 0,\n class: \"provider\"\n};\nconst _hoisted_3$4 = {\n key: 1,\n class: \"provider\"\n};\nconst _hoisted_4$3 = [\"src\", \"alt\"];\nfunction _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_LinkVariantIcon = resolveComponent(\"LinkVariantIcon\");\n const _component_NcHighlight = resolveComponent(\"NcHighlight\");\n const _component_NcSelect = resolveComponent(\"NcSelect\");\n const _component_NcEmptyContent = resolveComponent(\"NcEmptyContent\");\n return openBlock(), createElementBlock(\"div\", _hoisted_1$6, [\n createVNode(_component_NcSelect, {\n ref: \"provider-select\",\n modelValue: $data.selectedProvider,\n \"onUpdate:modelValue\": [\n _cache[0] || (_cache[0] = ($event) => $data.selectedProvider = $event),\n $options.onProviderSelected\n ],\n class: \"provider-list--select\",\n inputId: \"provider-select-input\",\n label: \"title\",\n placeholder: $data.multiselectPlaceholder,\n options: $options.options,\n appendToBody: false,\n clearSearchOnSelect: true,\n clearSearchOnBlur: () => false,\n filterable: false,\n onSearch: $options.onSearch\n }, {\n option: withCtx((option) => [\n option.isLink ? (openBlock(), createElementBlock(\"div\", _hoisted_2$5, [\n createVNode(_component_LinkVariantIcon, {\n class: \"link-icon\",\n size: 20\n }),\n createElementVNode(\"span\", null, toDisplayString(option.title), 1)\n ])) : (openBlock(), createElementBlock(\"div\", _hoisted_3$4, [\n createElementVNode(\"img\", {\n class: \"provider-icon\",\n src: option.icon_url,\n alt: $data.providerIconAlt\n }, null, 8, _hoisted_4$3),\n createVNode(_component_NcHighlight, {\n class: \"option-text\",\n search: $data.query,\n text: option.title\n }, null, 8, [\"search\", \"text\"])\n ]))\n ]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"options\", \"onSearch\", \"onUpdate:modelValue\"]),\n createVNode(_component_NcEmptyContent, { class: \"provider-list--empty-content\" }, {\n icon: withCtx(() => [\n createVNode(_component_LinkVariantIcon)\n ]),\n _: 1\n })\n ]);\n}\nconst NcProviderList = /* @__PURE__ */ _export_sfc(_sfc_main$6, [[\"render\", _sfc_render$5], [\"__scopeId\", \"data-v-c9740c42\"]]);\nregister(t24);\nconst _hoisted_1$5 = [\"aria-label\", \"aria-valuenow\", \"aria-valuemin\", \"aria-valuemax\"];\nconst _hoisted_2$4 = [\"src\"];\nconst _hoisted_3$3 = { class: \"widget-default--details\" };\nconst _hoisted_4$2 = { class: \"widget-default--name\" };\nconst _hoisted_5$2 = { class: \"widget-default--link\" };\nconst IDLE_TIMEOUT = 3 * 60 * 1e3;\nconst RESIZE_KEYBOARD_STEP = 10;\nconst _sfc_main$5 = /* @__PURE__ */ defineComponent({\n __name: \"NcReferenceWidget\",\n props: {\n reference: {},\n interactive: { type: Boolean, default: true },\n interactiveOptIn: { type: Boolean, default: false }\n },\n setup(__props) {\n const props = __props;\n const router = inject(routerKey, null);\n const widgetId = `nc-reference-widget-${createElementId()}`;\n const isVisible = ref(false);\n const customWidget = useTemplateRef(\"customWidget\");\n const customWidgetContent = useTemplateRef(\"customWidgetContent\");\n const widgetRoot = useTemplateRef(\"widgetRoot\");\n const { width } = useElementSize(widgetRoot);\n const { height: customWidgetHeight } = useElementSize(customWidget);\n useIntersectionObserver(widgetRoot, ([entry]) => {\n nextTick(() => {\n isVisible.value = entry.isIntersecting;\n });\n });\n const showInteractive = ref(false);\n const rendered = ref(false);\n let idleTimeout = null;\n const isResizing = ref(false);\n const resizedHeight = ref(null);\n const resizeStartY = ref(0);\n const resizeStartHeight = ref(0);\n const resizeMinHeight = ref(100);\n const resizeMaxHeight = ref(window.innerHeight - 120);\n const isInteractive = computed(() => {\n return !props.interactiveOptIn && props.interactive || showInteractive.value;\n });\n const referenceHasFullWidth = computed(() => {\n return hasFullWidth(props.reference.richObjectType);\n });\n const isWidgetResizable = computed(() => {\n return isResizable(props.reference.richObjectType);\n });\n const hasCustomWidget = computed(() => {\n return isWidgetRegistered(props.reference.richObjectType);\n });\n const customWidgetStyle = computed(() => {\n if (!resizedHeight.value) {\n return null;\n }\n return { height: `${resizedHeight.value}px !important` };\n });\n const ariaValueNow = computed(() => {\n return Math.round(resizedHeight.value ?? customWidgetHeight.value);\n });\n const referenceHasInteractiveView = computed(() => {\n return hasCustomWidget.value && hasInteractiveView(props.reference.richObjectType);\n });\n const noAccess = computed(() => {\n return !props.reference.accessible;\n });\n const numberOfLines = computed(() => {\n const lineCountOffsets = [450, 550, 650, Infinity];\n return lineCountOffsets.findIndex((max) => width.value < max);\n });\n const descriptionStyle = computed(() => {\n if (numberOfLines.value === 0) {\n return {\n display: \"none\"\n };\n }\n const lineClamp = numberOfLines.value;\n return {\n lineClamp,\n webkitLineClamp: lineClamp\n };\n });\n const compactLink = computed(() => {\n const link = props.reference.openGraphObject.link;\n if (!link) {\n return \"\";\n }\n if (link.startsWith(\"https://\")) {\n return link.substring(8);\n }\n if (link.startsWith(\"http://\")) {\n return link.substring(7);\n }\n return link;\n });\n const route = computed(() => {\n return getRoute(router, props.reference.openGraphObject.link);\n });\n const referenceWidgetLinkComponent = computed(() => {\n return route.value ? RouterLink : \"a\";\n });\n const referenceWidgetLinkProps = computed(() => {\n return route.value ? { to: route.value } : { href: props.reference.openGraphObject.link, target: \"_blank\" };\n });\n watch(isVisible, (val) => {\n if (!val) {\n idleTimeout = setTimeout(() => {\n if (!isVisible.value) {\n destroyReferenceWidget();\n }\n }, IDLE_TIMEOUT);\n return;\n }\n if (idleTimeout) {\n clearTimeout(idleTimeout);\n idleTimeout = null;\n }\n if (!rendered.value) {\n renderReferenceWidget();\n }\n }, { immediate: true });\n onBeforeUnmount(() => {\n if (idleTimeout) {\n clearTimeout(idleTimeout);\n idleTimeout = null;\n }\n stopResize();\n destroyReferenceWidget();\n });\n function enableInteractive() {\n showInteractive.value = true;\n renderReferenceWidget();\n }\n function renderReferenceWidget() {\n if (!customWidgetContent.value) {\n return;\n }\n if (props.reference.richObjectType === \"open-graph\") {\n return;\n }\n customWidgetContent.value.innerHTML = \"\";\n const widget = document.createElement(\"div\");\n widget.style.width = \"100%\";\n customWidgetContent.value.appendChild(widget);\n nextTick(() => {\n renderWidget(widget, {\n ...props.reference,\n interactive: isInteractive.value\n });\n rendered.value = true;\n });\n }\n function destroyReferenceWidget() {\n if (rendered.value && widgetRoot.value) {\n destroyWidget(props.reference.richObjectType, widgetRoot.value);\n rendered.value = false;\n }\n }\n function initResizeLimits() {\n const widgetEl = customWidgetContent.value?.firstElementChild;\n if (widgetEl) {\n const computedStyle = window.getComputedStyle(widgetEl);\n const parsedMin = parseFloat(computedStyle.minHeight);\n const parsedMax = parseFloat(computedStyle.maxHeight);\n resizeMinHeight.value = parsedMin > 0 ? parsedMin : 100;\n resizeMaxHeight.value = Number.isFinite(parsedMax) && parsedMax > 0 ? parsedMax : window.innerHeight - 120;\n } else {\n resizeMinHeight.value = 100;\n resizeMaxHeight.value = window.innerHeight - 120;\n }\n }\n function startResize(event) {\n if (!isWidgetResizable.value || !customWidget.value) {\n return;\n }\n initResizeLimits();\n isResizing.value = true;\n resizeStartY.value = event.clientY;\n resizeStartHeight.value = customWidget.value.getBoundingClientRect().height;\n window.addEventListener(\"pointermove\", onResize);\n window.addEventListener(\"pointerup\", stopResize);\n }\n function onResizeKeydown(delta) {\n if (!isWidgetResizable.value || !customWidget.value) {\n return;\n }\n initResizeLimits();\n const currentHeight = resizedHeight.value ?? resizeStartHeight.value;\n const next = currentHeight + delta;\n resizedHeight.value = Math.min(resizeMaxHeight.value, Math.max(resizeMinHeight.value, next));\n }\n function onResize(event) {\n if (!isResizing.value || !customWidget.value) {\n return;\n }\n const deltaY = event.clientY - resizeStartY.value;\n resizedHeight.value = Math.min(resizeMaxHeight.value, Math.max(resizeMinHeight.value, resizeStartHeight.value + deltaY));\n }\n function stopResize() {\n if (!isResizing.value) {\n return;\n }\n isResizing.value = false;\n window.removeEventListener(\"pointermove\", onResize);\n window.removeEventListener(\"pointerup\", stopResize);\n }\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n ref_key: \"widgetRoot\",\n ref: widgetRoot,\n class: normalizeClass({ \"toggle-interactive\": referenceHasInteractiveView.value && !isInteractive.value })\n }, [\n __props.reference && hasCustomWidget.value ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n id: widgetId,\n ref_key: \"customWidget\",\n ref: customWidget,\n class: normalizeClass([\"widget-custom\", { \"full-width\": referenceHasFullWidth.value }]),\n style: normalizeStyle(customWidgetStyle.value)\n }, [\n createElementVNode(\"div\", {\n ref_key: \"customWidgetContent\",\n ref: customWidgetContent,\n class: \"widget-custom__content\"\n }, null, 512),\n isWidgetResizable.value ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: \"widget-custom__resize-handle\",\n role: \"slider\",\n tabindex: \"0\",\n \"aria-orientation\": \"vertical\",\n \"aria-label\": unref(t)(\"Widget height\"),\n \"aria-valuenow\": ariaValueNow.value,\n \"aria-valuemin\": resizeMinHeight.value,\n \"aria-valuemax\": resizeMaxHeight.value,\n \"aria-controls\": widgetId,\n onPointerdown: withModifiers(startResize, [\"stop\", \"prevent\"]),\n onKeydown: [\n _cache[0] || (_cache[0] = withKeys(withModifiers(($event) => onResizeKeydown(-RESIZE_KEYBOARD_STEP), [\"stop\", \"prevent\"]), [\"up\"])),\n _cache[1] || (_cache[1] = withKeys(withModifiers(($event) => onResizeKeydown(RESIZE_KEYBOARD_STEP), [\"stop\", \"prevent\"]), [\"down\"]))\n ]\n }, null, 40, _hoisted_1$5)) : createCommentVNode(\"\", true)\n ], 6)) : !noAccess.value && __props.reference && __props.reference.openGraphObject && !hasCustomWidget.value ? (openBlock(), createBlock(resolveDynamicComponent(referenceWidgetLinkComponent.value), mergeProps({ key: 1 }, referenceWidgetLinkProps.value, {\n rel: \"noopener noreferrer\",\n class: \"widget-default\"\n }), {\n default: withCtx(() => [\n __props.reference.openGraphObject.thumb ? (openBlock(), createElementBlock(\"img\", {\n key: 0,\n class: \"widget-default--image\",\n src: __props.reference.openGraphObject.thumb\n }, null, 8, _hoisted_2$4)) : createCommentVNode(\"\", true),\n createElementVNode(\"div\", _hoisted_3$3, [\n createElementVNode(\"p\", _hoisted_4$2, toDisplayString(__props.reference.openGraphObject.name), 1),\n createElementVNode(\"p\", {\n class: \"widget-default--description\",\n style: normalizeStyle(descriptionStyle.value)\n }, toDisplayString(__props.reference.openGraphObject.description), 5),\n createElementVNode(\"p\", _hoisted_5$2, toDisplayString(compactLink.value), 1)\n ])\n ]),\n _: 1\n }, 16)) : createCommentVNode(\"\", true),\n __props.interactiveOptIn && referenceHasInteractiveView.value && !isInteractive.value ? (openBlock(), createBlock(NcButton, {\n key: 2,\n class: \"toggle-interactive--button\",\n onClick: enableInteractive\n }, {\n default: withCtx(() => [\n createTextVNode(toDisplayString(unref(t)(\"Enable interactive view\")), 1)\n ]),\n _: 1\n })) : createCommentVNode(\"\", true)\n ], 2);\n };\n }\n});\nconst NcReferenceWidget = /* @__PURE__ */ _export_sfc(_sfc_main$5, [[\"__scopeId\", \"data-v-4b144346\"]]);\nregister(t25);\nconst _sfc_main$4 = {\n name: \"NcRawLinkInput\",\n components: {\n LinkVariantIcon,\n NcEmptyContent,\n NcLoadingIcon,\n NcReferenceWidget,\n NcTextField: _sfc_main$b\n },\n props: {\n /**\n * The reference provider\n */\n provider: {\n type: Object,\n required: true\n }\n },\n emits: [\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n inputValue: \"\",\n loading: false,\n reference: null,\n abortController: null,\n inputPlaceholder: t(\"Enter link\")\n };\n },\n computed: {\n isLinkValid() {\n return isUrl(this.inputValue);\n },\n debouncedUpdateReference() {\n return debounce(this.updateReference, 500);\n }\n },\n methods: {\n focus() {\n this.$refs[\"url-input\"].$el.getElementsByTagName(\"input\")[0]?.focus();\n },\n onSubmit(e) {\n const value = e.target.value;\n if (this.isLinkValid) {\n this.$emit(\"submit\", value);\n this.$emit(\"pick\", { link: value });\n }\n },\n onClear() {\n this.inputValue = \"\";\n this.reference = null;\n },\n onInput() {\n this.reference = null;\n if (this.abortController) {\n this.abortController.abort();\n }\n if (this.isLinkValid) {\n this.debouncedUpdateReference();\n }\n },\n updateReference() {\n this.loading = true;\n this.abortController = new AbortController();\n axios.get(generateOcsUrl(\"references/resolve\", 2) + \"?reference=\" + encodeURIComponent(this.inputValue), {\n signal: this.abortController.signal\n }).then((response) => {\n this.reference = response.data.ocs.data.references[this.inputValue];\n }).catch((error) => {\n logger.error(\"[NcRawLinkInput] Failed to update reference\", { error });\n }).then(() => {\n this.loading = false;\n });\n }\n }\n};\nconst _hoisted_1$4 = { class: \"raw-link\" };\nconst _hoisted_2$3 = { class: \"input-wrapper\" };\nconst _hoisted_3$2 = [\"src\"];\nfunction _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcLoadingIcon = resolveComponent(\"NcLoadingIcon\");\n const _component_LinkVariantIcon = resolveComponent(\"LinkVariantIcon\");\n const _component_NcTextField = resolveComponent(\"NcTextField\");\n const _component_NcReferenceWidget = resolveComponent(\"NcReferenceWidget\");\n const _component_NcEmptyContent = resolveComponent(\"NcEmptyContent\");\n return openBlock(), createElementBlock(\"div\", _hoisted_1$4, [\n createElementVNode(\"div\", _hoisted_2$3, [\n createVNode(_component_NcTextField, {\n ref: \"url-input\",\n modelValue: $data.inputValue,\n \"onUpdate:modelValue\": [\n _cache[0] || (_cache[0] = ($event) => $data.inputValue = $event),\n $options.onInput\n ],\n showTrailingButton: $data.inputValue !== \"\",\n label: $data.inputPlaceholder,\n onTrailingButtonClick: $options.onClear,\n onKeyup: withKeys($options.onSubmit, [\"enter\"])\n }, {\n default: withCtx(() => [\n $data.loading ? (openBlock(), createBlock(_component_NcLoadingIcon, {\n key: 0,\n size: 16\n })) : (openBlock(), createBlock(_component_LinkVariantIcon, {\n key: 1,\n size: 16\n }))\n ]),\n _: 1\n }, 8, [\"modelValue\", \"showTrailingButton\", \"label\", \"onTrailingButtonClick\", \"onUpdate:modelValue\", \"onKeyup\"])\n ]),\n $data.reference !== null ? (openBlock(), createBlock(_component_NcReferenceWidget, {\n key: 0,\n class: \"reference-widget\",\n reference: $data.reference\n }, null, 8, [\"reference\"])) : (openBlock(), createBlock(_component_NcEmptyContent, {\n key: 1,\n class: \"raw-link--empty-content\"\n }, {\n icon: withCtx(() => [\n $props.provider.icon_url ? (openBlock(), createElementBlock(\"img\", {\n key: 0,\n class: \"provider-icon\",\n src: $props.provider.icon_url\n }, null, 8, _hoisted_3$2)) : (openBlock(), createBlock(_component_LinkVariantIcon, { key: 1 }))\n ]),\n _: 1\n }))\n ]);\n}\nconst NcRawLinkInput = /* @__PURE__ */ _export_sfc(_sfc_main$4, [[\"render\", _sfc_render$4], [\"__scopeId\", \"data-v-fb24b594\"]]);\nconst _sfc_main$3 = {\n name: \"NcSearchResult\",\n components: {\n NcHighlight: _sfc_main$a\n },\n props: {\n /**\n * Unified search result entry\n */\n entry: {\n type: Object,\n required: true\n },\n /**\n * The query that led to getting this result\n * Used to highlight the entry text\n */\n query: {\n type: String,\n required: true\n }\n }\n};\nconst _hoisted_1$3 = { class: \"result\" };\nconst _hoisted_2$2 = [\"src\"];\nconst _hoisted_3$1 = { class: \"result--content\" };\nconst _hoisted_4$1 = { class: \"result--content--name\" };\nconst _hoisted_5$1 = { class: \"result--content--subline\" };\nfunction _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcHighlight = resolveComponent(\"NcHighlight\");\n return openBlock(), createElementBlock(\"div\", _hoisted_1$3, [\n $props.entry.icon ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass([{ [$props.entry.icon]: true, rounded: $props.entry.rounded }, \"result--icon-class\"])\n }, null, 2)) : (openBlock(), createElementBlock(\"img\", {\n key: 1,\n class: normalizeClass([\"result--image\", { rounded: $props.entry.rounded }]),\n src: $props.entry.thumbnailUrl\n }, null, 10, _hoisted_2$2)),\n createElementVNode(\"div\", _hoisted_3$1, [\n createElementVNode(\"span\", _hoisted_4$1, [\n createVNode(_component_NcHighlight, {\n search: $props.query,\n text: $props.entry.title\n }, null, 8, [\"search\", \"text\"])\n ]),\n createElementVNode(\"span\", _hoisted_5$1, [\n createVNode(_component_NcHighlight, {\n search: $props.query,\n text: $props.entry.subline\n }, null, 8, [\"search\", \"text\"])\n ])\n ])\n ]);\n}\nconst NcSearchResult = /* @__PURE__ */ _export_sfc(_sfc_main$3, [[\"render\", _sfc_render$3], [\"__scopeId\", \"data-v-059edcfb\"]]);\nregister(t32, t41, t43);\nconst LIMIT = 5;\nconst _sfc_main$2 = {\n name: \"NcSearch\",\n components: {\n LinkVariantIcon,\n DotsHorizontalIcon: IconDotsHorizontal,\n NcEmptyContent,\n NcSelect,\n NcSearchResult\n },\n /* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n props: {\n /**\n * The selected reference provider\n */\n provider: {\n type: Object,\n required: true\n },\n /**\n * Whether to show the empty content when there are no search results\n */\n showEmptyContent: {\n type: Boolean,\n default: true\n },\n /**\n * Placeholder of the search\n */\n searchPlaceholder: {\n type: String,\n default: null\n }\n },\n emits: [\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n searchQuery: \"\",\n selectedResult: null,\n resultsBySearchProvider: {},\n searching: false,\n searchingMoreOf: null,\n abortController: null,\n noOptionsText: t(\"Start typing to search\"),\n providerIconAlt: t(\"Provider icon\")\n };\n },\n computed: {\n mySearchPlaceholder() {\n return this.searchPlaceholder || t(\"Search\");\n },\n searchProviderIds() {\n return this.provider.search_providers_ids;\n },\n options() {\n if (this.searchQuery === \"\") {\n return [];\n }\n const options = [];\n if (isUrl(this.searchQuery)) {\n options.push(this.rawLinkEntry);\n }\n options.push(...this.formattedSearchResults);\n return options;\n },\n rawLinkEntry() {\n return {\n id: \"rawLinkEntry\",\n resourceUrl: this.searchQuery,\n isRawLink: true\n };\n },\n formattedSearchResults() {\n const results = [];\n this.searchProviderIds.forEach((pid) => {\n if (this.resultsBySearchProvider[pid].entries.length > 0) {\n if (this.searchProviderIds.length > 1 || this.resultsBySearchProvider[pid].entries.length > 1) {\n results.push({\n id: \"groupTitle-\" + pid,\n name: this.resultsBySearchProvider[pid].name,\n isCustomGroupTitle: true,\n providerId: pid\n });\n }\n const providerEntriesWithId = this.resultsBySearchProvider[pid].entries.map((entry, index) => {\n return {\n id: \"provider-\" + pid + \"-entry-\" + index,\n ...entry\n };\n });\n results.push(...providerEntriesWithId);\n if (this.resultsBySearchProvider[pid].isPaginated) {\n results.push({\n id: \"moreOf-\" + pid,\n name: this.resultsBySearchProvider[pid].name,\n isMore: true,\n providerId: pid,\n isLoading: this.searchingMoreOf === pid\n });\n }\n }\n });\n return results;\n },\n debouncedUpdateSearch() {\n return debounce(this.updateSearch, 500);\n }\n },\n mounted() {\n this.resetResults();\n },\n beforeUnmount() {\n this.cancelSearchRequests();\n },\n methods: {\n t,\n resetResults() {\n const resultsBySearchProvider = {};\n this.searchProviderIds.forEach((pid) => {\n resultsBySearchProvider[pid] = {\n entries: []\n };\n });\n this.resultsBySearchProvider = resultsBySearchProvider;\n },\n focus() {\n setTimeout(() => {\n this.$refs[\"search-select\"]?.$el?.querySelector(\"#search-select-input\")?.focus();\n }, 300);\n },\n cancelSearchRequests() {\n if (this.abortController) {\n this.abortController.abort();\n }\n },\n onSearchInput(query) {\n this.searchQuery = query;\n this.debouncedUpdateSearch();\n },\n onSelectResultSelected(item) {\n if (item !== null) {\n if (item.resourceUrl) {\n this.cancelSearchRequests();\n this.$emit(\"submit\", item.resourceUrl);\n const reference = { link: item.resourceUrl };\n if (item.title) {\n reference.title = item.title;\n }\n this.$emit(\"pick\", reference);\n } else if (item.isMore) {\n this.searchMoreOf(item.providerId).then(() => {\n this.selectedResult = null;\n });\n }\n }\n },\n searchMoreOf(searchProviderId) {\n this.searchingMoreOf = searchProviderId;\n this.cancelSearchRequests();\n return this.searchProviders(searchProviderId);\n },\n updateSearch() {\n this.cancelSearchRequests();\n this.resetResults();\n if (this.searchQuery === \"\") {\n this.searching = false;\n return;\n }\n return this.searchProviders();\n },\n searchProviders(searchProviderId = null) {\n this.abortController = new AbortController();\n this.searching = true;\n const searchPromises = searchProviderId === null ? [...this.searchProviderIds].map((pid) => {\n return this.searchOneProvider(pid);\n }) : [this.searchOneProvider(searchProviderId, this.resultsBySearchProvider[searchProviderId]?.cursor ?? null)];\n return Promise.allSettled(searchPromises).then((promises) => {\n const isOneCanceled = !!promises.find((p) => {\n return p.status === \"rejected\" && (p.reason.name === \"CanceledError\" || p.reason.code === \"ERR_CANCELED\");\n });\n if (!isOneCanceled) {\n this.searching = false;\n this.searchingMoreOf = null;\n }\n });\n },\n searchOneProvider(providerId, cursor = null) {\n const url = cursor === null ? generateOcsUrl(\"search/providers/{providerId}/search?term={term}&limit={limit}\", { providerId, term: this.searchQuery, limit: LIMIT }) : generateOcsUrl(\"search/providers/{providerId}/search?term={term}&limit={limit}&cursor={cursor}\", { providerId, term: this.searchQuery, limit: LIMIT, cursor });\n return axios.get(url, {\n signal: this.abortController.signal\n }).then((response) => {\n const data = response.data.ocs.data;\n this.resultsBySearchProvider[providerId].name = data.name;\n this.resultsBySearchProvider[providerId].cursor = data.cursor;\n this.resultsBySearchProvider[providerId].isPaginated = data.isPaginated;\n this.resultsBySearchProvider[providerId].entries.push(...data.entries);\n });\n }\n }\n};\nconst _hoisted_1$2 = {\n key: 0,\n class: \"custom-option\"\n};\nconst _hoisted_2$1 = { class: \"option-text\" };\nconst _hoisted_3 = {\n key: 2,\n class: \"custom-option group-name\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = { class: \"option-text\" };\nconst _hoisted_6 = {\n key: 3,\n class: \"custom-option\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"option-simple-icon icon-loading-small\"\n};\nconst _hoisted_8 = { class: \"option-text\" };\nconst _hoisted_9 = [\"alt\", \"src\"];\nfunction _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_LinkVariantIcon = resolveComponent(\"LinkVariantIcon\");\n const _component_NcSearchResult = resolveComponent(\"NcSearchResult\");\n const _component_DotsHorizontalIcon = resolveComponent(\"DotsHorizontalIcon\");\n const _component_NcSelect = resolveComponent(\"NcSelect\");\n const _component_NcEmptyContent = resolveComponent(\"NcEmptyContent\");\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"smart-picker-search\", { \"with-empty-content\": $props.showEmptyContent }])\n }, [\n createVNode(_component_NcSelect, {\n ref: \"search-select\",\n modelValue: $data.selectedResult,\n \"onUpdate:modelValue\": [\n _cache[0] || (_cache[0] = ($event) => $data.selectedResult = $event),\n $options.onSelectResultSelected\n ],\n class: \"smart-picker-search--select\",\n inputId: \"search-select-input\",\n label: \"name\",\n placeholder: $options.mySearchPlaceholder,\n options: $options.options,\n appendToBody: false,\n closeOnSelect: false,\n clearSearchOnSelect: false,\n clearSearchOnBlur: () => false,\n resetFocusOnOptionsChange: false,\n filterable: false,\n autoscroll: true,\n resetOnOptionsChange: false,\n loading: $data.searching,\n onSearch: $options.onSearchInput\n }, {\n option: withCtx((option) => [\n option.isRawLink ? (openBlock(), createElementBlock(\"div\", _hoisted_1$2, [\n createVNode(_component_LinkVariantIcon, {\n class: \"option-simple-icon\",\n size: 20\n }),\n createElementVNode(\"span\", _hoisted_2$1, toDisplayString($options.t(\"Raw link {options}\", { options: option.resourceUrl })), 1)\n ])) : option.resourceUrl ? (openBlock(), createBlock(_component_NcSearchResult, {\n key: 1,\n class: \"search-result\",\n entry: option,\n query: $data.searchQuery\n }, null, 8, [\"entry\", \"query\"])) : option.isCustomGroupTitle ? (openBlock(), createElementBlock(\"span\", _hoisted_3, [\n $props.provider.icon_url ? (openBlock(), createElementBlock(\"img\", {\n key: 0,\n class: \"provider-icon group-name-icon\",\n src: $props.provider.icon_url\n }, null, 8, _hoisted_4)) : createCommentVNode(\"\", true),\n createElementVNode(\"span\", _hoisted_5, [\n createElementVNode(\"strong\", null, toDisplayString(option.name), 1)\n ])\n ])) : option.isMore ? (openBlock(), createElementBlock(\"span\", _hoisted_6, [\n option.isLoading ? (openBlock(), createElementBlock(\"span\", _hoisted_7)) : (openBlock(), createBlock(_component_DotsHorizontalIcon, {\n key: 1,\n class: \"option-simple-icon\",\n size: 20\n })),\n createElementVNode(\"span\", _hoisted_8, toDisplayString($options.t('Load more \"{options}\"', { options: option.name })), 1)\n ])) : createCommentVNode(\"\", true)\n ]),\n \"no-options\": withCtx(() => [\n createTextVNode(toDisplayString($data.noOptionsText), 1)\n ]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"options\", \"loading\", \"onSearch\", \"onUpdate:modelValue\"]),\n $props.showEmptyContent ? (openBlock(), createBlock(_component_NcEmptyContent, {\n key: 0,\n class: \"smart-picker-search--empty-content\"\n }, {\n icon: withCtx(() => [\n $props.provider.icon_url ? (openBlock(), createElementBlock(\"img\", {\n key: 0,\n class: \"provider-icon\",\n alt: $data.providerIconAlt,\n src: $props.provider.icon_url\n }, null, 8, _hoisted_9)) : (openBlock(), createBlock(_component_LinkVariantIcon, { key: 1 }))\n ]),\n _: 1\n })) : createCommentVNode(\"\", true)\n ], 2);\n}\nconst NcSearch = /* @__PURE__ */ _export_sfc(_sfc_main$2, [[\"render\", _sfc_render$2], [\"__scopeId\", \"data-v-d965b4c7\"]]);\nconst MODES = {\n providerList: 1,\n standardLinkInput: 2,\n searchInput: 3,\n customElement: 4\n};\nconst _sfc_main$1 = {\n name: \"NcReferencePicker\",\n components: {\n NcCustomPickerElement,\n NcProviderList,\n NcRawLinkInput,\n NcSearch\n },\n props: {\n /**\n * Provider to select on creation\n * Default: null. Show the provider list\n */\n initialProvider: {\n type: Object,\n default: () => null\n },\n /**\n * Optional width in pixels\n * Default: 100%\n */\n width: {\n type: Number,\n default: null\n },\n /**\n * Focus on the provider list select input on creation\n * Default: true\n */\n focusOnCreate: {\n type: Boolean,\n default: true\n }\n },\n emits: [\n \"cancel\",\n \"cancelRawLink\",\n \"cancelSearch\",\n \"providerSelected\",\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n MODES,\n selectedProvider: this.initialProvider\n };\n },\n computed: {\n mode() {\n return this.selectedProvider === null ? MODES.providerList : isCustomPickerElementRegistered(this.selectedProvider.id) ? MODES.customElement : this.selectedProvider.search_providers_ids ? MODES.searchInput : MODES.standardLinkInput;\n },\n pickerWrapperStyle() {\n return {\n width: this.width ? this.width + \"px\" : void 0\n };\n }\n },\n mounted() {\n if (this.focusOnCreate) {\n if (this.initialProvider) {\n setTimeout(() => {\n this.$refs[\"url-input\"]?.focus();\n }, 300);\n } else {\n this.$nextTick(() => {\n this.$refs[\"provider-list\"]?.focus();\n });\n }\n }\n },\n methods: {\n onEscapePressed() {\n if (this.selectedProvider !== null) {\n this.deselectProvider();\n } else {\n this.cancelProviderSelection();\n }\n },\n onProviderSelected(provider) {\n this.selectedProvider = provider;\n this.$emit(\"providerSelected\", provider);\n this.$nextTick(() => {\n this.$refs[\"url-input\"]?.focus();\n });\n },\n cancelCustomElement() {\n this.deselectProvider();\n },\n cancelSearch() {\n this.$emit(\"cancelSearch\", this.selectedProvider?.title);\n this.deselectProvider();\n },\n cancelRawLinkInput() {\n this.$emit(\"cancelRawLink\", this.selectedProvider?.title);\n this.deselectProvider();\n },\n cancelProviderSelection() {\n this.$emit(\"cancel\");\n },\n submitLink(link) {\n if (this.selectedProvider !== null) {\n touchProvider(this.selectedProvider.id);\n }\n this.$emit(\"submit\", link);\n this.deselectProvider();\n },\n pickLink(reference) {\n if (this.selectedProvider !== null) {\n touchProvider(this.selectedProvider.id);\n }\n this.$emit(\"pick\", reference);\n this.deselectProvider();\n },\n deselectProvider() {\n this.selectedProvider = null;\n this.$emit(\"providerSelected\", null);\n setTimeout(() => {\n this.$refs[\"provider-list\"]?.focus();\n }, 300);\n }\n }\n};\nconst _hoisted_1$1 = {\n key: 3,\n class: \"custom-element-wrapper\"\n};\nfunction _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_NcProviderList = resolveComponent(\"NcProviderList\");\n const _component_NcRawLinkInput = resolveComponent(\"NcRawLinkInput\");\n const _component_NcSearch = resolveComponent(\"NcSearch\");\n const _component_NcCustomPickerElement = resolveComponent(\"NcCustomPickerElement\");\n return openBlock(), createElementBlock(\"div\", {\n class: \"reference-picker\",\n style: normalizeStyle($options.pickerWrapperStyle),\n tabindex: \"-1\",\n onKeydown: _cache[0] || (_cache[0] = withKeys(withModifiers((...args) => $options.onEscapePressed && $options.onEscapePressed(...args), [\"stop\", \"prevent\"]), [\"esc\"]))\n }, [\n $options.mode === $data.MODES.providerList ? (openBlock(), createBlock(_component_NcProviderList, {\n key: 0,\n ref: \"provider-list\",\n onSelectProvider: $options.onProviderSelected,\n onSubmit: $options.submitLink,\n onPick: $options.pickLink,\n onCancel: $options.cancelProviderSelection\n }, null, 8, [\"onSelectProvider\", \"onSubmit\", \"onPick\", \"onCancel\"])) : $options.mode === $data.MODES.standardLinkInput ? (openBlock(), createBlock(_component_NcRawLinkInput, {\n key: 1,\n ref: \"url-input\",\n provider: $data.selectedProvider,\n onSubmit: $options.submitLink,\n onPick: $options.pickLink,\n onCancel: $options.cancelRawLinkInput\n }, null, 8, [\"provider\", \"onSubmit\", \"onPick\", \"onCancel\"])) : $options.mode === $data.MODES.searchInput ? (openBlock(), createBlock(_component_NcSearch, {\n key: 2,\n ref: \"url-input\",\n provider: $data.selectedProvider,\n onSubmit: $options.submitLink,\n onPick: $options.pickLink,\n onCancel: $options.cancelSearch\n }, null, 8, [\"provider\", \"onSubmit\", \"onPick\", \"onCancel\"])) : $options.mode === $data.MODES.customElement ? (openBlock(), createElementBlock(\"div\", _hoisted_1$1, [\n createVNode(_component_NcCustomPickerElement, {\n provider: $data.selectedProvider,\n class: \"custom-element\",\n onSubmit: $options.submitLink,\n onPick: $options.pickLink,\n onCancel: $options.cancelCustomElement\n }, null, 8, [\"provider\", \"onSubmit\", \"onPick\", \"onCancel\"])\n ])) : createCommentVNode(\"\", true)\n ], 36);\n}\nconst NcReferencePicker = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"render\", _sfc_render$1], [\"__scopeId\", \"data-v-40667c6c\"]]);\nregister(t12, t19);\nconst _sfc_main = {\n name: \"NcReferencePickerModal\",\n components: {\n NcReferencePicker,\n NcModal,\n NcButton,\n ArrowLeftIcon,\n CloseIcon: IconClose\n },\n props: {\n /**\n * Provider to select on creation\n * Show the provider list if no initial one is provided\n */\n initialProvider: {\n type: Object,\n default: () => null\n },\n /**\n * Focus on the input item on create\n */\n focusOnCreate: {\n type: Boolean,\n default: true\n },\n /**\n * If true, add the modal content to the Viewer trap elements via the event-bus\n */\n isInsideViewer: {\n type: Boolean,\n default: false\n }\n },\n emits: [\n \"cancel\",\n \"submit\",\n \"pick\"\n ],\n data() {\n return {\n show: true,\n selectedProvider: this.initialProvider,\n backButtonTitle: t(\"Back to provider selection\"),\n closeButtonTitle: t(\"Close\"),\n closeButtonLabel: t(\"Close Smart Picker\")\n };\n },\n computed: {\n isProviderSelected() {\n return this.selectedProvider !== null;\n },\n showBackButton() {\n return this.initialProvider === null && this.isProviderSelected;\n },\n modalSize() {\n return this.isProviderSelected && isCustomPickerElementRegistered(this.selectedProvider.id) ? getCustomPickerElementSize(this.selectedProvider.id) ?? \"large\" : \"normal\";\n },\n showModalName() {\n return !this.isProviderSelected || !isCustomPickerElementRegistered(this.selectedProvider.id);\n },\n modalName() {\n return this.isProviderSelected ? this.selectedProvider.title : t(\"Smart Picker\");\n }\n },\n mounted() {\n if (this.isInsideViewer) {\n const elem = this.$refs.modal_content;\n emit(\"viewer:trapElements:changed\", elem);\n }\n },\n methods: {\n onCancel() {\n this.show = false;\n this.$emit(\"cancel\");\n },\n onSubmit(value) {\n this.show = false;\n this.$emit(\"submit\", value);\n },\n onPick(value) {\n this.show = false;\n this.$emit(\"pick\", value);\n },\n onProviderSelect(provider) {\n this.selectedProvider = provider;\n if (provider === null && this.initialProvider !== null) {\n this.onCancel();\n }\n },\n onBackClicked() {\n this.$refs.referencePicker.deselectProvider();\n }\n }\n};\nconst _hoisted_1 = {\n ref: \"modal_content\",\n class: \"reference-picker-modal--content\"\n};\nconst _hoisted_2 = { key: 1 };\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ArrowLeftIcon = resolveComponent(\"ArrowLeftIcon\");\n const _component_NcButton = resolveComponent(\"NcButton\");\n const _component_CloseIcon = resolveComponent(\"CloseIcon\");\n const _component_NcReferencePicker = resolveComponent(\"NcReferencePicker\");\n const _component_NcModal = resolveComponent(\"NcModal\");\n return $data.show ? (openBlock(), createBlock(_component_NcModal, {\n key: 0,\n size: $options.modalSize,\n class: \"reference-picker-modal\",\n onClose: $options.onCancel\n }, {\n default: withCtx(() => [\n createElementVNode(\"div\", _hoisted_1, [\n $options.showBackButton ? (openBlock(), createBlock(_component_NcButton, {\n key: 0,\n \"aria-label\": $data.backButtonTitle,\n title: $data.backButtonTitle,\n class: \"back-button\",\n onClick: $options.onBackClicked\n }, {\n icon: withCtx(() => [\n createVNode(_component_ArrowLeftIcon)\n ]),\n _: 1\n }, 8, [\"aria-label\", \"title\", \"onClick\"])) : createCommentVNode(\"\", true),\n createVNode(_component_NcButton, {\n class: \"close-button\",\n \"aria-label\": $data.closeButtonLabel,\n title: $data.closeButtonTitle,\n variant: \"tertiary\",\n onClick: $options.onCancel\n }, {\n icon: withCtx(() => [\n createVNode(_component_CloseIcon)\n ]),\n _: 1\n }, 8, [\"aria-label\", \"title\", \"onClick\"]),\n $options.showModalName ? (openBlock(), createElementBlock(\"h2\", _hoisted_2, toDisplayString($options.modalName), 1)) : createCommentVNode(\"\", true),\n createVNode(_component_NcReferencePicker, {\n ref: \"referencePicker\",\n initialProvider: $props.initialProvider,\n focusOnCreate: $props.focusOnCreate,\n onProviderSelected: $options.onProviderSelect,\n onSubmit: $options.onSubmit,\n onPick: $options.onPick,\n onCancel: $options.onCancel\n }, null, 8, [\"initialProvider\", \"focusOnCreate\", \"onProviderSelected\", \"onSubmit\", \"onPick\", \"onCancel\"])\n ], 512)\n ]),\n _: 1\n }, 8, [\"size\", \"onClose\"])) : createCommentVNode(\"\", true);\n}\nconst NcReferencePickerModal = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-58d45f81\"]]);\nasync function getLinkWithPicker(providerId, isInsideViewer) {\n const modalId = \"referencePickerModal\";\n const modalElement = document.createElement(\"div\");\n modalElement.id = modalId;\n document.body.append(modalElement);\n const { promise, reject, resolve } = Promise.withResolvers();\n const initialProvider = providerId && getProvider(providerId) || null;\n const view = createApp(NcReferencePickerModal, {\n initialProvider,\n isInsideViewer,\n onCancel() {\n view.unmount();\n reject(new Error(\"User cancellation\"));\n },\n onSubmit(link) {\n view.unmount();\n resolve(link);\n }\n });\n view.mount(modalElement);\n return promise;\n}\nasync function getReferenceWithPicker(providerId, isInsideViewer) {\n const modalId = \"referencePickerModal\";\n const modalElement = document.createElement(\"div\");\n modalElement.id = modalId;\n document.body.append(modalElement);\n const { promise, reject, resolve } = Promise.withResolvers();\n const initialProvider = providerId && getProvider(providerId) || null;\n const view = createApp(NcReferencePickerModal, {\n initialProvider,\n isInsideViewer,\n onCancel() {\n view.unmount();\n reject(new Error(\"User cancellation\"));\n },\n onPick(reference) {\n view.unmount();\n resolve(reference);\n }\n });\n view.mount(modalElement);\n return promise;\n}\nexport {\n NcReferencePicker as N,\n anyLinkProviderId as a,\n getProvider as b,\n getProviders as c,\n getReferenceWithPicker as d,\n sortProviders as e,\n NcReferencePickerModal as f,\n getLinkWithPicker as g,\n NcReferenceWidget as h,\n NcSearch as i,\n searchProvider as s\n};\n//# sourceMappingURL=referencePickerModal-CnKdEDwu.mjs.map\n","import { d as mdiCheck, e as mdiContentCopy } from \"./mdi-CpchYUUV.mjs\";\nimport { ref, computed, toValue } from \"vue\";\nimport { r as register, e as t22, a as t } from \"./_l10n-wdIzZwir.mjs\";\nregister(t22);\n/*!\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nconst DELAY = 2e3;\nfunction useCopy(content) {\n const isCopied = ref(false);\n const icon = computed(() => isCopied.value ? mdiCheck : mdiContentCopy);\n const altText = computed(() => isCopied.value ? t(\"Copied\") : t(\"Copy to clipboard\"));\n async function copy() {\n if (isCopied.value) {\n return;\n }\n const value = toValue(content);\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n prompt(\"\", value);\n }\n isCopied.value = true;\n setTimeout(() => {\n isCopied.value = false;\n }, DELAY);\n }\n return {\n isCopied,\n copy,\n icon,\n altText\n };\n}\nexport {\n useCopy as u\n};\n//# sourceMappingURL=useCopy-6F-qWHq0.mjs.map\n","import '../assets/NcRichText-D0Bu5bbu.css';\nimport { toString } from \"mdast-util-to-string\";\nimport rehypeExternalLinks from \"rehype-external-links\";\nimport rehype2react from \"rehype-react\";\nimport breaks from \"remark-breaks\";\nimport remarkParse from \"remark-parse\";\nimport remark2rehype from \"remark-rehype\";\nimport remarkUnlinkProtocols from \"remark-unlink-protocols\";\nimport { unified } from \"unified\";\nimport { resolveComponent, openBlock, createElementBlock, normalizeClass, Fragment, renderList, createBlock, createCommentVNode, defineComponent, unref, withCtx, createVNode, ref, h } from \"vue\";\nimport { RouterLink } from \"vue-router\";\nimport { N as NcCheckboxRadioSwitch } from \"./NcCheckboxRadioSwitch-DVdt5Hkq.mjs\";\nimport { getCurrentUser } from \"@nextcloud/auth\";\nimport axios from \"@nextcloud/axios\";\nimport { generateOcsUrl } from \"@nextcloud/router\";\nimport { getSharingToken } from \"@nextcloud/sharing/public\";\nimport { h as NcReferenceWidget } from \"./referencePickerModal-CnKdEDwu.mjs\";\nimport { l as logger } from \"./logger-D3RVzcfQ.mjs\";\nimport { U as URL_PATTERN, g as getRoute, N as NcRichTextExternalLink, p as parseUrl, r as remarkAutolink } from \"./autolink-DrIurosL.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper-1tPrXgE0.mjs\";\nimport { N as NcButton } from \"./NcButton-jvoYS2my.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper-g8ubWhoz.mjs\";\nimport { u as useCopy } from \"./useCopy-6F-qWHq0.mjs\";\nimport { c as createElementId } from \"./createElementId-DhjFt1I9.mjs\";\nimport { u } from \"unist-builder\";\nimport { visitParents, EXIT, SKIP } from \"unist-util-visit-parents\";\nconst _sfc_main$2 = {\n name: \"NcReferenceList\",\n components: {\n NcReferenceWidget\n },\n props: {\n /**\n * The text to extract references from\n */\n text: {\n type: String,\n default: \"\"\n },\n /**\n * The data of the references to display.\n */\n referenceData: {\n type: Array,\n default: null\n },\n /**\n * The maximum number of references to display\n */\n limit: {\n type: Number,\n default: 1\n },\n /**\n * Show the fallback reference if no references are found\n */\n displayFallback: {\n type: Boolean,\n default: false\n },\n /**\n * Whether to render the widgets in interactive mode (if available)\n */\n interactive: {\n type: Boolean,\n default: true\n },\n /**\n * Whether to show user an option to enable to interactive mode for widgets (if available)\n */\n interactiveOptIn: {\n type: Boolean,\n default: false\n }\n },\n emits: [\"loaded\"],\n data() {\n return {\n references: null,\n loading: true\n };\n },\n computed: {\n isVisible() {\n return this.loading || this.displayedReferences.length !== 0;\n },\n values() {\n if (this.referenceData) {\n return this.referenceData;\n }\n if (this.displayFallback && !this.loading && !this.references) {\n return [this.fallbackReference];\n }\n return this.references ? Object.values(this.references) : [];\n },\n firstReference() {\n return this.values[0] ?? null;\n },\n displayedReferences() {\n return this.values.filter(Boolean).slice(0, this.limit);\n },\n fallbackReference() {\n return {\n accessible: true,\n openGraphObject: {\n id: this.text,\n link: this.text,\n name: this.text\n },\n richObjectType: \"open-graph\"\n };\n }\n },\n watch: {\n text: \"fetch\"\n },\n mounted() {\n this.fetch();\n },\n methods: {\n fetch() {\n this.loading = true;\n if (this.referenceData) {\n this.references = null;\n this.loading = false;\n return;\n }\n if (!new RegExp(URL_PATTERN).exec(this.text)) {\n this.references = null;\n this.loading = false;\n return;\n }\n this.resolve().then((response) => {\n this.references = response.data.ocs.data.references;\n this.loading = false;\n this.$emit(\"loaded\");\n }).catch( SPDX-FileCopyrightText: 2022, 2024, 2026, 2022, 2022, 2026, 2024, 2026, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport container from 'markdown-it-container'\n\nexport const typesAvailable = ['info', 'warn', 'error', 'success']\n\n/**\n *\n * @param {string} type one of 'info', 'warn', 'error' and 'success'\n */\nfunction buildRender(type) {\n\treturn (tokens, idx, options, env, slf) => {\n\t\tconst tag = tokens[idx]\n\n\t\t// add attributes to the opening tag\n\t\tif (tag.nesting === 1) {\n\t\t\ttag.attrSet('data-callout', type)\n\t\t\ttag.attrJoin('class', `callout callout-${type}`)\n\t\t}\n\n\t\treturn slf.renderToken(tokens, idx, options, env, slf)\n\t}\n}\n\n/**\n * @param {object} md Markdown object\n */\nexport default (md) => {\n\t// create a custom container to each callout type\n\ttypesAvailable.forEach((type) => {\n\t\tmd.use(container, type, {\n\t\t\trender: buildRender(type),\n\t\t})\n\t})\n\n\treturn md\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type MarkdownIt from 'markdown-it'\nimport type StateBlock from 'markdown-it/lib/rules_block/state_block.mjs'\nimport type Token from 'markdown-it/lib/token.mjs'\n\nconst DETAILS_START_REGEX = /^
    \\s*$/\nconst DETAILS_AND_SUMMARY_START_REGEX\n\t= /(?<=^
    \\s*).*(?=<\\/summary>\\s*$)/\nconst DETAILS_END_REGEX = /^<\\/details>\\s*$/\nconst SUMMARY_REGEX = /(?<=^).*(?=<\\/summary>\\s*$)/\n\n/**\n *\n * @param state - MarkdownIt state\n * @param startLine - start line number\n * @param endLine - end line number\n * @param silent - validation mode\n */\nfunction parseDetails(\n\tstate: StateBlock,\n\tstartLine: number,\n\tendLine: number,\n\tsilent: boolean,\n) {\n\t// let autoClosedBlock = false\n\tlet start = state.bMarks[startLine] + state.tShift[startLine]\n\tlet max = state.eMarks[startLine]\n\n\tlet detailsFound = false\n\tlet detailsSummary = null\n\tlet startLineCount = 2\n\n\tconst m = state.src.slice(start, max).match(DETAILS_AND_SUMMARY_START_REGEX)\n\tif (m) {\n\t\t// Details block start and summary in same line\n\t\tdetailsSummary = m[0].trim()\n\t\tstartLineCount = 1\n\t} else if (!state.src.slice(start, max).match(DETAILS_START_REGEX)) {\n\t\t// Details block start in separate line\n\t\treturn false\n\t}\n\n\t// Since start is found, we can report success here in validation mode\n\tif (silent) {\n\t\treturn true\n\t}\n\n\tlet nestedCount = 0\n\tlet nextLine = startLine\n\tfor (;;) {\n\t\tnextLine++\n\t\tif (nextLine >= endLine) {\n\t\t\tbreak\n\t\t}\n\n\t\tstart = state.bMarks[nextLine] + state.tShift[nextLine]\n\t\tmax = state.eMarks[nextLine]\n\n\t\t// Details summary\n\t\tconst m = state.src.slice(start, max).match(SUMMARY_REGEX)\n\t\tif (m && detailsSummary === null) {\n\t\t\t// Only set `detailsSummary` the first time\n\t\t\t// Ignore future summary tags (in nested/broken details)\n\t\t\tdetailsSummary = m[0].trim()\n\t\t\tcontinue\n\t\t}\n\n\t\t// Nested details\n\t\tif (state.src.slice(start, max).match(DETAILS_START_REGEX)) {\n\t\t\tnestedCount++\n\t\t}\n\n\t\t// Details block end\n\t\tif (!state.src.slice(start, max).match(DETAILS_END_REGEX)) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Regard nested details blocks\n\t\tif (nestedCount > 0) {\n\t\t\tnestedCount--\n\t\t} else {\n\t\t\tdetailsFound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (!detailsFound || detailsSummary === null) {\n\t\treturn false\n\t}\n\n\tconst oldParent = state.parentType\n\tconst oldLineMax = state.lineMax\n\tstate.parentType = 'reference'\n\n\t// This will prevent lazy continuations from ever going past our end marker\n\tstate.lineMax = nextLine\n\n\t// Push tokens to the state\n\n\tlet token = state.push('details_open', 'details', 1)\n\ttoken.block = true\n\ttoken.info = detailsSummary\n\ttoken.map = [startLine, nextLine]\n\n\ttoken = state.push('details_summary', 'summary', 1)\n\ttoken.block = false\n\n\t// Parse and push summary to preserve markup\n\tconst tokens: Token[] = []\n\tstate.md.inline.parse(detailsSummary, state.md, state.env, tokens)\n\tfor (const t of tokens) {\n\t\ttoken = state.push(t.type, t.tag, t.nesting)\n\t\ttoken.block = t.block\n\t\ttoken.markup = t.markup\n\t\ttoken.content = t.content\n\t}\n\n\tstate.push('details_summary', 'summary', -1)\n\n\tstate.md.block.tokenize(state, startLine + startLineCount, nextLine)\n\n\ttoken = state.push('details_close', 'details', -1)\n\ttoken.block = true\n\n\tstate.parentType = oldParent\n\tstate.lineMax = oldLineMax\n\tstate.line = nextLine + 1\n\n\treturn true\n}\n\n/**\n * @param md - Markdown object\n */\nexport default function details(md: MarkdownIt) {\n\tmd.block.ruler.before('fence', 'details', parseDetails, {\n\t\talt: ['paragraph', 'reference', 'blockquote', 'list'],\n\t})\n}\n","// Process footnotes\n//\n'use strict'\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Renderer partials\n\nfunction render_footnote_anchor_name (tokens, idx, options, env/*, slf */) {\n const n = Number(tokens[idx].meta.id + 1).toString()\n let prefix = ''\n\n if (typeof env.docId === 'string') prefix = `-${env.docId}-`\n\n return prefix + n\n}\n\nfunction render_footnote_caption (tokens, idx/*, options, env, slf */) {\n let n = Number(tokens[idx].meta.id + 1).toString()\n\n if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}`\n\n return `[${n}]`\n}\n\nfunction render_footnote_ref (tokens, idx, options, env, slf) {\n const id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf)\n const caption = slf.rules.footnote_caption(tokens, idx, options, env, slf)\n let refid = id\n\n if (tokens[idx].meta.subId > 0) refid += `:${tokens[idx].meta.subId}`\n\n return `${caption}`\n}\n\nfunction render_footnote_block_open (tokens, idx, options) {\n return (options.xhtmlOut ? '
    \\n' : '
    \\n') +\n '
    \\n' +\n '
      \\n'\n}\n\nfunction render_footnote_block_close () {\n return '
    \\n
    \\n'\n}\n\nfunction render_footnote_open (tokens, idx, options, env, slf) {\n let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf)\n\n if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`\n\n return `
  • `\n}\n\nfunction render_footnote_close () {\n return '
  • \\n'\n}\n\nfunction render_footnote_anchor (tokens, idx, options, env, slf) {\n let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf)\n\n if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`\n\n /* ↩ with escape code to prevent display as Apple Emoji on iOS */\n return ` \\u21a9\\uFE0E`\n}\n\nexport default function footnote_plugin (md) {\n const parseLinkLabel = md.helpers.parseLinkLabel\n const isSpace = md.utils.isSpace\n\n md.renderer.rules.footnote_ref = render_footnote_ref\n md.renderer.rules.footnote_block_open = render_footnote_block_open\n md.renderer.rules.footnote_block_close = render_footnote_block_close\n md.renderer.rules.footnote_open = render_footnote_open\n md.renderer.rules.footnote_close = render_footnote_close\n md.renderer.rules.footnote_anchor = render_footnote_anchor\n\n // helpers (only used in other rules, no tokens are attached to those)\n md.renderer.rules.footnote_caption = render_footnote_caption\n md.renderer.rules.footnote_anchor_name = render_footnote_anchor_name\n\n // Process footnote block definition\n function footnote_def (state, startLine, endLine, silent) {\n const start = state.bMarks[startLine] + state.tShift[startLine]\n const max = state.eMarks[startLine]\n\n // line should be at least 5 chars - \"[^x]:\"\n if (start + 4 > max) return false\n\n if (state.src.charCodeAt(start) !== 0x5B/* [ */) return false\n if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) return false\n\n let pos\n\n for (pos = start + 2; pos < max; pos++) {\n if (state.src.charCodeAt(pos) === 0x20) return false\n if (state.src.charCodeAt(pos) === 0x5D /* ] */) {\n break\n }\n }\n\n if (pos === start + 2) return false // no empty footnote labels\n if (pos + 1 >= max || state.src.charCodeAt(++pos) !== 0x3A /* : */) return false\n if (silent) return true\n pos++\n\n if (!state.env.footnotes) state.env.footnotes = {}\n if (!state.env.footnotes.refs) state.env.footnotes.refs = {}\n const label = state.src.slice(start + 2, pos - 2)\n state.env.footnotes.refs[`:${label}`] = -1\n\n const token_fref_o = new state.Token('footnote_reference_open', '', 1)\n token_fref_o.meta = { label }\n token_fref_o.level = state.level++\n state.tokens.push(token_fref_o)\n\n const oldBMark = state.bMarks[startLine]\n const oldTShift = state.tShift[startLine]\n const oldSCount = state.sCount[startLine]\n const oldParentType = state.parentType\n\n const posAfterColon = pos\n const initial = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine])\n let offset = initial\n\n while (pos < max) {\n const ch = state.src.charCodeAt(pos)\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - offset % 4\n } else {\n offset++\n }\n } else {\n break\n }\n\n pos++\n }\n\n state.tShift[startLine] = pos - posAfterColon\n state.sCount[startLine] = offset - initial\n\n state.bMarks[startLine] = posAfterColon\n state.blkIndent += 4\n state.parentType = 'footnote'\n\n if (state.sCount[startLine] < state.blkIndent) {\n state.sCount[startLine] += state.blkIndent\n }\n\n state.md.block.tokenize(state, startLine, endLine, true)\n\n state.parentType = oldParentType\n state.blkIndent -= 4\n state.tShift[startLine] = oldTShift\n state.sCount[startLine] = oldSCount\n state.bMarks[startLine] = oldBMark\n\n const token_fref_c = new state.Token('footnote_reference_close', '', -1)\n token_fref_c.level = --state.level\n state.tokens.push(token_fref_c)\n\n return true\n }\n\n // Process inline footnotes (^[...])\n function footnote_inline (state, silent) {\n const max = state.posMax\n const start = state.pos\n\n if (start + 2 >= max) return false\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) return false\n if (state.src.charCodeAt(start + 1) !== 0x5B/* [ */) return false\n\n const labelStart = start + 2\n const labelEnd = parseLinkLabel(state, start + 1)\n\n // parser failed to find ']', so it's not a valid note\n if (labelEnd < 0) return false\n\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n if (!state.env.footnotes) state.env.footnotes = {}\n if (!state.env.footnotes.list) state.env.footnotes.list = []\n const footnoteId = state.env.footnotes.list.length\n const tokens = []\n\n state.md.inline.parse(\n state.src.slice(labelStart, labelEnd),\n state.md,\n state.env,\n tokens\n )\n\n const token = state.push('footnote_ref', '', 0)\n token.meta = { id: footnoteId }\n\n state.env.footnotes.list[footnoteId] = {\n content: state.src.slice(labelStart, labelEnd),\n tokens\n }\n }\n\n state.pos = labelEnd + 1\n state.posMax = max\n return true\n }\n\n // Process footnote references ([^...])\n function footnote_ref (state, silent) {\n const max = state.posMax\n const start = state.pos\n\n // should be at least 4 chars - \"[^x]\"\n if (start + 3 > max) return false\n\n if (!state.env.footnotes || !state.env.footnotes.refs) return false\n if (state.src.charCodeAt(start) !== 0x5B/* [ */) return false\n if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) return false\n\n let pos\n\n for (pos = start + 2; pos < max; pos++) {\n if (state.src.charCodeAt(pos) === 0x20) return false\n if (state.src.charCodeAt(pos) === 0x0A) return false\n if (state.src.charCodeAt(pos) === 0x5D /* ] */) {\n break\n }\n }\n\n if (pos === start + 2) return false // no empty footnote labels\n if (pos >= max) return false\n pos++\n\n const label = state.src.slice(start + 2, pos - 1)\n if (typeof state.env.footnotes.refs[`:${label}`] === 'undefined') return false\n\n if (!silent) {\n if (!state.env.footnotes.list) state.env.footnotes.list = []\n\n let footnoteId\n\n if (state.env.footnotes.refs[`:${label}`] < 0) {\n footnoteId = state.env.footnotes.list.length\n state.env.footnotes.list[footnoteId] = { label, count: 0 }\n state.env.footnotes.refs[`:${label}`] = footnoteId\n } else {\n footnoteId = state.env.footnotes.refs[`:${label}`]\n }\n\n const footnoteSubId = state.env.footnotes.list[footnoteId].count\n state.env.footnotes.list[footnoteId].count++\n\n const token = state.push('footnote_ref', '', 0)\n token.meta = { id: footnoteId, subId: footnoteSubId, label }\n }\n\n state.pos = pos\n state.posMax = max\n return true\n }\n\n // Glue footnote tokens to end of token stream\n function footnote_tail (state) {\n let tokens\n let current\n let currentLabel\n let insideRef = false\n const refTokens = {}\n\n if (!state.env.footnotes) { return }\n\n state.tokens = state.tokens.filter(function (tok) {\n if (tok.type === 'footnote_reference_open') {\n insideRef = true\n current = []\n currentLabel = tok.meta.label\n return false\n }\n if (tok.type === 'footnote_reference_close') {\n insideRef = false\n // prepend ':' to avoid conflict with Object.prototype members\n refTokens[':' + currentLabel] = current\n return false\n }\n if (insideRef) { current.push(tok) }\n return !insideRef\n })\n\n if (!state.env.footnotes.list) { return }\n const list = state.env.footnotes.list\n\n state.tokens.push(new state.Token('footnote_block_open', '', 1))\n\n for (let i = 0, l = list.length; i < l; i++) {\n const token_fo = new state.Token('footnote_open', '', 1)\n token_fo.meta = { id: i, label: list[i].label }\n state.tokens.push(token_fo)\n\n if (list[i].tokens) {\n tokens = []\n\n const token_po = new state.Token('paragraph_open', 'p', 1)\n token_po.block = true\n tokens.push(token_po)\n\n const token_i = new state.Token('inline', '', 0)\n token_i.children = list[i].tokens\n token_i.content = list[i].content\n tokens.push(token_i)\n\n const token_pc = new state.Token('paragraph_close', 'p', -1)\n token_pc.block = true\n tokens.push(token_pc)\n } else if (list[i].label) {\n tokens = refTokens[`:${list[i].label}`]\n }\n\n if (tokens) state.tokens = state.tokens.concat(tokens)\n\n let lastParagraph\n\n if (state.tokens[state.tokens.length - 1].type === 'paragraph_close') {\n lastParagraph = state.tokens.pop()\n } else {\n lastParagraph = null\n }\n\n const t = list[i].count > 0 ? list[i].count : 1\n for (let j = 0; j < t; j++) {\n const token_a = new state.Token('footnote_anchor', '', 0)\n token_a.meta = { id: i, subId: j, label: list[i].label }\n state.tokens.push(token_a)\n }\n\n if (lastParagraph) {\n state.tokens.push(lastParagraph)\n }\n\n state.tokens.push(new state.Token('footnote_close', '', -1))\n }\n\n state.tokens.push(new state.Token('footnote_block_close', '', -1))\n }\n\n md.block.ruler.before('reference', 'footnote_def', footnote_def, { alt: ['paragraph', 'reference'] })\n md.inline.ruler.after('image', 'footnote_inline', footnote_inline)\n md.inline.ruler.after('footnote_inline', 'footnote_ref', footnote_ref)\n md.core.ruler.after('inline', 'footnote_tail', footnote_tail)\n};\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type MarkdownIt from 'markdown-it'\nimport type Token from 'markdown-it/lib/token.mjs'\n\nimport footnote from 'markdown-it-footnote'\nimport { escapeHtml } from 'markdown-it/lib/common/utils.mjs'\n\n/**\n * Return footnote label\n *\n * @param token markdown-it token\n */\nfunction labelOf(token: Token): string {\n\treturn token.meta?.label || String(token.meta?.id ?? '')\n}\n\n/**\n * Customized markdown-it footnotes extension\n *\n * @param md markdown-it markdown object\n */\nexport default function footnotes(md: MarkdownIt): void {\n\tmd.use(footnote)\n\n\tmd.renderer.rules.footnote_ref = (tokens, idx) => {\n\t\tconst label = labelOf(tokens[idx])\n\t\treturn ``\n\t}\n\tmd.renderer.rules.footnote_block_open = () => '
    \\n'\n\tmd.renderer.rules.footnote_block_close = () => '
    \\n'\n\tmd.renderer.rules.footnote_open = (tokens, idx) => {\n\t\tconst label = labelOf(tokens[idx])\n\t\treturn `
    \\n`\n\t}\n\tmd.renderer.rules.footnote_close = () => '
    \\n'\n\tmd.renderer.rules.footnote_anchor = () => ''\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport markdownitEscape from 'markdown-it/lib/rules_inline/escape.mjs'\nimport markdownitNewline from 'markdown-it/lib/rules_inline/newline.mjs'\n\n/**\n * Add information about used markdown syntax to HTML hard breaks\n *\n * @param {import('markdown-it')} md Markdown object\n */\nexport default function keepHardbreakSyntax(md) {\n\t// Add syntax information to hard line breaks using double spaces\n\tmd.inline.ruler.at('newline', (state, silent) => {\n\t\tconst rval = markdownitNewline(state, silent)\n\t\tif (\n\t\t\trval\n\t\t\t&& state.tokens.length\n\t\t\t&& state.tokens[state.tokens.length - 1].type === 'hardbreak'\n\t\t) { state.tokens[state.tokens.length - 1].attrSet('syntax', ' ') }\n\t\treturn rval\n\t})\n\n\t// Add syntax information to hard line breaks using a backslash\n\tmd.inline.ruler.at('escape', (state, silent) => {\n\t\tconst rval = markdownitEscape(state, silent)\n\t\tif (\n\t\t\trval\n\t\t\t&& state.tokens.length\n\t\t\t&& state.tokens[state.tokens.length - 1].type === 'hardbreak'\n\t\t) { state.tokens[state.tokens.length - 1].attrSet('syntax', '\\\\') }\n\t\treturn rval\n\t})\n\n\t// Add rule for parsing `
    ` tags (as we have HTML disabled)\n\tmd.inline.ruler.after('html_inline', 'html_breaks', (state) => {\n\t\tconst res = state.src.slice(state.pos).match(/^\\s*/)\n\n\t\tif (res) {\n\t\t\tconst token = state.push('hardbreak', 'br', 0)\n\t\t\ttoken.attrPush(['syntax', 'html'])\n\t\t\tstate.pos += res[0].length\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t})\n\n\t// Adds syntax attribute to `
    ` and fixes issue #3370 (no additional newline after `
    `)\n\tmd.renderer.rules.hardbreak = (tokens, idx, options) => `
    `\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Add a mark for keeping special markdown syntax unescaped\n *\n * @param {object} md Markdown object\n */\nexport default function keepSyntax(md) {\n\t// Extracting named groups as positive lookbehind patterns are not supported by Safari\n\tconst escaped = /(\\n(?[#\\-*+>])|(?[`*\\\\~[\\]]+))/\n\n\tmd.core.ruler.before('text_join', 'tag-markdown-syntax', (state) => {\n\t\tconst open = new state.Token('keep_md_open', 'span', 1)\n\t\topen.attrSet('class', 'keep-md')\n\t\tconst close = new state.Token('keep_md_close', 'span', -1)\n\n\t\tfor (let i = 0; i < state.tokens.length; i++) {\n\t\t\tconst block = state.tokens[i]\n\t\t\tif (block.type !== 'inline') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfor (let j = 0; j < block.children.length; j++) {\n\t\t\t\tconst token = block.children[j]\n\t\t\t\tif (token.type === 'text') {\n\t\t\t\t\tconst match = escaped.exec(token.content)\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst index = match.groups.linestart\n\t\t\t\t\t\t\t? match.index + 1\n\t\t\t\t\t\t\t: match.index\n\t\t\t\t\t\tconst matchChars\n\t\t\t\t\t\t\t= match.groups.linestart ?? match.groups.special\n\t\t\t\t\t\tconst contentNext = index + matchChars.length\n\t\t\t\t\t\tblock.children.splice(\n\t\t\t\t\t\t\tj,\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t{ ...token, content: token.content.slice(0, index) },\n\t\t\t\t\t\t\t{ ...open },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...token,\n\t\t\t\t\t\t\t\tcontent: token.content.slice(index, contentNext),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ ...close },\n\t\t\t\t\t\t\t{ ...token, content: token.content.slice(contentNext) },\n\t\t\t\t\t\t)\n\t\t\t\t\t\tj += 3\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t})\n}\n","const e=String.raw`\\[`,t=String.raw`\\(`,n=(e,t,n=0)=>{let r=0,i=t-1;for(;i>=n&&e.charCodeAt(i)===92;)r++,i--;return r},r=(e,t,n)=>{let r=e.src.charCodeAt(t-1),i=e.src.charCodeAt(t+1),a=e.md.utils.isSpace;return{canOpen:n||!a(i),canClose:!(i>=48&&i<=57)&&(n||!a(r))}},i=e=>(t,n)=>{if(t.src[t.pos]!==`$`)return!1;let i=r(t,t.pos,e);if(!i.canOpen)return n||(t.pending+=`$`),t.pos++,!0;let a=t.pos+1,o;for(;(a=t.src.indexOf(`$`,a))!==-1;){for(o=a-1;t.src.charCodeAt(o)===92;)o--;if((a-o)%2==1)break;a++}if(a===-1)return n||(t.pending+=`$`),t.pos+=1,!0;if(a-(t.pos+1)===0)return n||(t.pending+=`$$`),t.pos+=2,!0;if(i=r(t,a,e),!i.canClose)return n||(t.pending+=`$`),t.pos+=1,!0;if(!n){let e=t.push(`math_inline`,`math`,0);e.markup=`$`,e.content=t.src.slice(t.pos+1,a)}return t.pos=a+1,!0},a=()=>(e,r)=>{let i=e.pos;if(e.src.charCodeAt(i)!==92||e.src.charCodeAt(i+1)!==40)return!1;let a=i+2,o=!1,s=e.src.length;for(;a{let i=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];if(e.src.charCodeAt(i)!==36||e.src.charCodeAt(i+1)!==36)return!1;if(r)return!0;let o=e.skipSpacesBack(a,i),s=i+2,c,l=!1;o-s>=2&&e.src.charCodeAt(o-1)===36&&e.src.charCodeAt(o-2)===36?(c=e.src.slice(s,o-2),l=!0):c=e.src.slice(s,a);let u=t,d=``;for(;!l&&(u++,!(u>=n||(s=e.bMarks[u]+e.tShift[u],a=e.eMarks[u],s=2&&e.src.charCodeAt(o-1)===36&&e.src.charCodeAt(o-2)===36&&(d=e.src.slice(s,o-2),l=!0);e.line=l?u+1:u;let f=e.push(`math_block`,`math`,0);return f.block=!0,f.content=(c?`${c}\\n`:``)+e.getLines(t+1,u,e.tShift[t],!0)+(d?`${d}\\n`:``),f.map=[t,e.line],f.markup=`$$`,!0},s=(t,n,r,i)=>{let a=t.bMarks[n]+t.tShift[n],o=t.eMarks[n];if(t.src.charCodeAt(a)!==92||t.src.charCodeAt(a+1)!==91)return!1;if(i)return!0;let s=t.skipSpacesBack(o,a),c=a+2,l,u=!1;s-c>=2&&t.src.charCodeAt(s-1)===93&&t.src.charCodeAt(s-2)===92?(l=t.src.slice(c,s-2),u=!0):l=t.src.slice(c,o);let d=n,f=``;for(;!u&&(d++,!(d>=r||(c=t.bMarks[d]+t.tShift[d],o=t.eMarks[d],c=2&&t.src.charCodeAt(s-1)===93&&t.src.charCodeAt(s-2)===92&&(f=t.src.slice(c,s-2).trimEnd(),u=!0);if(!u)return!1;t.line=d+1;let p=t.push(`math_block`,`math`,0);return p.block=!0,p.content=(l?`${l}\\n`:``)+t.getLines(n+1,d,t.tShift[n],!0)+(f?`${f}\\n`:``),p.map=[n,t.line],p.markup=e,!0},c={alt:[`paragraph`,`reference`,`blockquote`,`list`]},l=(e,t)=>{if(typeof t?.render!=`function`)throw TypeError(`[@mdit/plugin-tex]: \"render\" option should be a function`);let{allowInlineWithSpace:n=!1,mathFence:r=!1,delimiters:l=`dollars`,render:u}=t;if(r){let t=e.renderer.rules.fence;e.renderer.rules.fence=(e,n,r,i,a)=>{let o=e[n];return o.info.trim()===`math`?u(o.content,!0,i):t(e,n,r,i,a)}}(l===`dollars`||l===`all`)&&(e.inline.ruler.after(`escape`,`math_inline_dollar`,i(n)),e.block.ruler.after(`blockquote`,`math_block_dollar`,o,c)),(l===`brackets`||l===`all`)&&(e.inline.ruler.before(`escape`,`math_inline_bracket`,a()),e.block.ruler.after(`blockquote`,`math_block_bracket`,s,c)),e.renderer.rules.math_inline=(e,t,n,r)=>u(e[t].content,!1,r),e.renderer.rules.math_block=(e,t,n,r)=>u(e[t].content,!0,r)};export{l as tex};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Turn tex expressions into divs and spans with data-latex set.\n *\n * These will then be picked up by the mathematics nodes.\n */\n\nimport type MarkdownIt from 'markdown-it'\n\nimport { tex } from '@mdit/plugin-tex'\n\n/**\n *\n * @param unsafe string to escape\n */\nfunction escapeHtml(unsafe: string) {\n\treturn unsafe\n\t\t.replace(/&/g, '&')\n\t\t.replace(//g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''')\n}\n\n/**\n *\n * @param content latex to be rendered\n */\nfunction renderBlock(content: string) {\n\treturn `
    `\n}\n\n/**\n *\n * @param content latex to be rendered\n */\nfunction renderInline(content: string) {\n\treturn `${escapeHtml(content)}`\n}\n\n/**\n *\n * @param content latex to be rendered\n * @param displayMode will render as block, otherwise inline.\n */\nfunction render(content: string, displayMode: boolean) {\n\treturn displayMode ? renderBlock(content) : renderInline(content)\n}\n\nexport default (md: MarkdownIt) => md.use(tex, { render })\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Check if the given tokens represent a preview in a paragraph\n *\n * @param {Array} tokens - tokens to check\n * @param {number} i - offset into the tokens\n */\nfunction isPreviewLinkInParagraph(tokens, i) {\n\tconst [prev, cur, next] = tokens.slice(i - 1, i + 2)\n\treturn (\n\t\tprev?.type === 'paragraph_open'\n\t\t&& cur.type === 'inline'\n\t\t&& cur.children\n\t\t&& cur.children.length === 3\n\t\t&& cur.children[0].type === 'link_open'\n\t\t&& cur.children[0].attrGet('title') === 'preview'\n\t\t&& cur.children[1].type === 'text'\n\t\t&& cur.children[2].type === 'link_close'\n\t\t&& next.type === 'paragraph_close'\n\t)\n}\n\n/**\n * Remove wrapping tokens\n *\n * @param {Array} tokens - the token stream to modify\n * @param {number} i - index of the token to unwrap\n */\nfunction unwrapToken(tokens, i) {\n\t// Start from the end so indexes stay the same.\n\ttokens.splice(i + 1, 1)\n\ttokens.splice(i - 1, 1)\n}\n\n/**\n * @param {object} md Markdown object\n */\nexport default (md) => {\n\t/**\n\t * Markdownit plugin to unwrap previews from a paragraph\n\t *\n\t * @param {object} state handed to the plugin\n\t * @param {Array} state.tokens current token stream\n\t */\n\tfunction linkPreviews({ tokens }) {\n\t\t// do not process first and last token\n\t\tfor (let i = 1, l = tokens.length; i < l - 1; ++i) {\n\t\t\tif (isPreviewLinkInParagraph(tokens, i)) {\n\t\t\t\tunwrapToken(tokens, i)\n\t\t\t}\n\t\t}\n\t}\n\n\tmd.core.ruler.before('linkify', 'link_previews', linkPreviews)\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type MarkdownIt from 'markdown-it'\nimport type StateInline from 'markdown-it/lib/rules_inline/state_inline.mjs'\n\nimport linkRule from 'markdown-it/lib/rules_inline/link.mjs'\n\ntype RefType = 'full' | 'collapsed' | 'shortcut'\n\n/**\n * Decide which reference form (if any) the wrapped link rule matched,\n * by inspecting the source range it consumed.\n *\n * @param state - markdown-it inline parser state\n * @param startPos - position the rule started at\n * @param endPos - position the rule ended at\n */\nfunction detectReferenceForm(\n\tstate: StateInline,\n\tstartPos: number,\n\tendPos: number,\n): { label: string, type: RefType } | undefined {\n\tconst savedPos = state.pos\n\tconst labelEnd = state.md.helpers.parseLinkLabel(state, startPos)\n\tstate.pos = savedPos\n\tif (labelEnd < 0) {\n\t\treturn undefined\n\t}\n\n\tconst labelStart = startPos + 1\n\tconst displayLabel = state.src.slice(labelStart, labelEnd)\n\tconst after = labelEnd + 1\n\n\tif (after >= endPos) {\n\t\treturn { label: displayLabel, type: 'shortcut' }\n\t}\n\n\tconst code = state.src.charCodeAt(after)\n\n\tif (code === 0x28 /* ( */) {\n\t\t// inline form\n\t\treturn undefined\n\t}\n\n\tif (code !== 0x5b /* [ */) {\n\t\treturn { label: displayLabel, type: 'shortcut' }\n\t}\n\n\tif (endPos === after + 2) {\n\t\treturn { label: displayLabel, type: 'collapsed' }\n\t}\n\n\treturn { label: state.src.slice(after + 1, endPos - 1), type: 'full' }\n}\n\n/**\n * Wrap an existing inline rule so that, when it succeeds via the reference\n * branch, the freshly pushed token is tagged with reference metadata.\n *\n * @param original - upstream inline link rule\n */\nfunction wrap(original: (state: StateInline, silent: boolean) => boolean) {\n\treturn (state: StateInline, silent: boolean): boolean => {\n\t\tconst start = state.pos\n\t\tif (!original(state, silent)) {\n\t\t\treturn false\n\t\t}\n\t\tif (silent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst info = detectReferenceForm(state, start, state.pos)\n\t\tif (!info) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst targetType = 'link_open'\n\t\tconst target = state.tokens.findLast((t) => t.type === targetType)\n\t\tif (target) {\n\t\t\ttarget.attrSet('data-md-reference-label', info.label)\n\t\t\ttarget.attrSet('data-md-reference-type', info.type)\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n/**\n * markdown-it plugin: preserve reference-style link syntax across\n * the parse/serialize round-trip.\n *\n * Adds `data-md-reference-label` / `data-md-reference-type` attributes to\n * `link_open` tokens emitted via the reference branch.\n *\n * @param md - markdown-it instance to extend\n */\nexport default function referenceLinks(md: MarkdownIt): void {\n\tmd.inline.ruler.at('link', wrap(linkRule))\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * @param {import('markdown-it')} md Markdown object\n */\nexport default function splitMixedLists(md) {\n\tmd.core.ruler.after('task-lists', 'split-mixed-task-lists', (state) => {\n\t\tconst tokens = state.tokens\n\n\t\tfor (let i = 0; i < tokens.length; i++) {\n\t\t\tconst token = tokens[i]\n\t\t\tif (!includesClass(token, 'contains-task-list')) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst firstChild = tokens[i + 1]\n\t\t\tconst startsWithTask = includesClass(firstChild, 'task-list-item')\n\t\t\tif (!startsWithTask) {\n\t\t\t\ttoken.attrs.splice(token.attrIndex('class'))\n\t\t\t\tif (token.attrs.length === 0) {\n\t\t\t\t\ttoken.attrs = null\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst splitBefore = findChildOf(tokens, i, (child) => {\n\t\ SPDX-FileCopyrightText: 2022, 2026, 2022, 2019, 2026, 2019, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport TipTapHeading from '@tiptap/extension-heading'\nimport headingAnchor from '../plugins/headingAnchor.ts'\n\nconst Heading = TipTapHeading.extend({\n\taddKeyboardShortcuts() {\n\t\treturn this.options.levels.reduce(\n\t\t\t(items, level) => ({\n\t\t\t\t...items,\n\t\t\t\t[`Mod-Shift-${level}`]: () => this.editor.commands.toggleHeading({ level }),\n\t\t\t}),\n\t\t\t{},\n\t\t)\n\t},\n\n\taddProseMirrorPlugins() {\n\t\treturn [headingAnchor()]\n\t},\n})\n\nexport default Heading\n","// src/horizontal-rule.ts\nimport { canInsertNode, isNodeSelection, mergeAttributes, Node, nodeInputRule } from \"@tiptap/core\";\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\";\nvar HorizontalRule = Node.create({\n name: \"horizontalRule\",\n addOptions() {\n return {\n HTMLAttributes: {},\n nextNodeType: \"paragraph\"\n };\n },\n group: \"block\",\n parseHTML() {\n return [{ tag: \"hr\" }];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"hr\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n },\n markdownTokenName: \"hr\",\n parseMarkdown: (token, helpers) => {\n return helpers.createNode(\"horizontalRule\");\n },\n renderMarkdown: () => {\n return \"---\";\n },\n addCommands() {\n return {\n setHorizontalRule: () => ({ chain, state }) => {\n if (!canInsertNode(state, state.schema.nodes[this.name])) {\n return false;\n }\n const { selection } = state;\n const { $to: $originTo } = selection;\n const currentChain = chain();\n if (isNodeSelection(selection)) {\n currentChain.insertContentAt($originTo.pos, {\n type: this.name\n });\n } else {\n currentChain.insertContent({ type: this.name });\n }\n return currentChain.command(({ state: chainState, tr, dispatch }) => {\n if (dispatch) {\n const { $to } = tr.selection;\n const posAfter = $to.end();\n if ($to.nodeAfter) {\n if ($to.nodeAfter.isTextblock) {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1));\n } else if ($to.nodeAfter.isBlock) {\n tr.setSelection(NodeSelection.create(tr.doc, $to.pos));\n } else {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n }\n } else {\n const nodeType = chainState.schema.nodes[this.options.nextNodeType] || $to.parent.type.contentMatch.defaultType;\n const node = nodeType == null ? void 0 : nodeType.create();\n if (node) {\n tr.insert(posAfter, node);\n tr.setSelection(TextSelection.create(tr.doc, posAfter + 1));\n }\n }\n tr.scrollIntoView();\n }\n return true;\n }).run();\n }\n };\n },\n addInputRules() {\n return [\n nodeInputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n type: this.type\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = HorizontalRule;\nexport {\n HorizontalRule,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { nodeInputRule } from '@tiptap/core'\nimport TiptapHorizontalRule from '@tiptap/extension-horizontal-rule'\n\nconst HorizontalRule = TiptapHorizontalRule.extend({\n\taddAttributes() {\n\t\treturn {\n\t\t\tmarkup: {\n\t\t\t\tdefault: '---',\n\t\t\t\tparseHTML: (el) => el.getAttribute('data-markup') || '---',\n\t\t\t\trenderHTML: (attrs) => {\n\t\t\t\t\tif (!attrs.markup || attrs.markup === '---') {\n\t\t\t\t\t\treturn {}\n\t\t\t\t\t}\n\t\t\t\t\treturn { 'data-markup': attrs.markup }\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t},\n\n\t// Same triggers as upsream, but capture typed marker so it can be preserved\n\taddInputRules() {\n\t\treturn [\n\t\t\tnodeInputRule({\n\t\t\t\tfind: /^(?:(---|—-)|(___|\\*\\*\\*)\\s)$/,\n\t\t\t\ttype: this.type,\n\t\t\t\tgetAttributes: (match) => ({\n\t\t\t\t\tmarkup: match[2] ?? '---',\n\t\t\t\t}),\n\t\t\t}),\n\t\t]\n\t},\n})\n\nexport default HorizontalRule\n","// src/image.ts\nimport { mergeAttributes, Node, nodeInputRule, ResizableNodeView } from \"@tiptap/core\";\nvar inputRegex = /(?:^|\\s)(!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\))$/;\nvar Image = Node.create({\n name: \"image\",\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n resize: false\n };\n },\n inline() {\n return this.options.inline;\n },\n group() {\n return this.options.inline ? \"inline\" : \"block\";\n },\n draggable: true,\n addAttributes() {\n return {\n src: {\n default: null\n },\n alt: {\n default: null\n },\n title: {\n default: null\n },\n width: {\n default: null\n },\n height: {\n default: null\n }\n };\n },\n parseHTML() {\n return [\n {\n tag: this.options.allowBase64 ? \"img[src]\" : 'img[src]:not([src^=\"data:\"])'\n }\n ];\n },\n renderHTML({ HTMLAttributes }) {\n return [\"img\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n },\n parseMarkdown: (token, helpers) => {\n return helpers.createNode(\"image\", {\n src: token.href,\n title: token.title,\n alt: token.text\n });\n },\n renderMarkdown: (node) => {\n var _a, _b, _c, _d, _e, _f;\n const src = (_b = (_a = node.attrs) == null ? void 0 : _a.src) != null ? _b : \"\";\n const alt = (_d = (_c = node.attrs) == null ? void 0 : _c.alt) != null ? _d : \"\";\n const title = (_f = (_e = node.attrs) == null ? void 0 : _e.title) != null ? _f : \"\";\n return title ? `![${alt}](${src} \"${title}\")` : `![${alt}](${src})`;\n },\n addNodeView() {\n if (!this.options.resize || !this.options.resize.enabled || typeof document === \"undefined\") {\n return null;\n }\n const { directions, minWidth, minHeight, alwaysPreserveAspectRatio } = this.options.resize;\n return ({ node, getPos, HTMLAttributes, editor }) => {\n const el = document.createElement(\"img\");\n Object.entries(HTMLAttributes).forEach(([key, value]) => {\n if (value != null) {\n switch (key) {\n case \"width\":\n case \"height\":\n break;\n default:\n el.setAttribute(key, value);\n break;\n }\n }\n });\n el.src = HTMLAttributes.src;\n const nodeView = new ResizableNodeView({\n element: el,\n editor,\n node,\n getPos,\n onResize: (width, height) => {\n el.style.width = `${width}px`;\n el.style.height = `${height}px`;\n },\n onCommit: (width, height) => {\n const pos = getPos();\n if (pos === void 0) {\n return;\n }\n this.editor.chain().setNodeSelection(pos).updateAttributes(this.name, {\n width,\n height\n }).run();\n },\n onUpdate: (updatedNode, _decorations, _innerDecorations) => {\n if (updatedNode.type !== node.type) {\n return false;\n }\n return true;\n },\n options: {\n directions,\n min: {\n width: minWidth,\n height: minHeight\n },\n preserveAspectRatio: alwaysPreserveAspectRatio === true\n }\n });\n const dom = nodeView.dom;\n dom.style.visibility = \"hidden\";\n dom.style.pointerEvents = \"none\";\n el.onload = () => {\n dom.style.visibility = \"\";\n dom.style.pointerEvents = \"\";\n };\n return nodeView;\n };\n },\n addCommands() {\n return {\n setImage: (options) => ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options\n });\n }\n };\n },\n addInputRules() {\n return [\n nodeInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: (match) => {\n const [, , alt, src, title] = match;\n return { src, alt, title };\n }\n })\n ];\n }\n});\n\n// src/index.ts\nvar index_default = Image;\nexport {\n Image,\n index_default as default,\n inputRegex\n};\n//# sourceMappingURL=index.js.map","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Node } from '@tiptap/pm/model'\n\n/**\n * Extract attachment src attributes from doc\n *\n * @param doc - the prosemirror doc\n * @return src attributes of attachments found in the doc\n */\nexport default function extractAttachmentSrcs(doc: Node) {\n\tconst attachmentSrcs: string[] = []\n\n\tdoc.descendants((node) => {\n\t\tif (node.type.name !== 'image' && node.type.name !== 'imageInline') {\n\t\t\treturn\n\t\t}\n\n\t\t// ignore empty src\n\t\tif (!node.attrs.src) {\n\t\t\treturn\n\t\t}\n\n\t\tattachmentSrcs.push(node.attrs.src)\n\t})\n\n\treturn attachmentSrcs\n}\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { ImageOptions as TiptapImageOptions } from '@tiptap/extension-image'\nimport type { Node } from '@tiptap/pm/model'\nimport type { MarkdownSerializerState } from 'prosemirror-markdown'\n\nimport { emit } from '@nextcloud/event-bus'\nimport TiptapImage from '@tiptap/extension-image'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport ImageView from './ImageView.vue'\nimport extractAttachmentSrcs from '../plugins/extractAttachmentSrcs.js'\n\nconst imageFileDropPluginKey = new PluginKey('imageFileDrop')\nconst imageExtractAttachmentsKey = new PluginKey('imageExtractAttachments')\n\ninterface ImageOptions extends TiptapImageOptions {\n\tnoLazyImages: boolean\n}\n\nconst Image = TiptapImage.extend({\n\tselectable: false,\n\n\taddAttributes() {\n\t\treturn {\n\t\t\t...this.parent?.(),\n\t\t\tisWikiLink: {\n\t\t\t\tdefault: false,\n\t\t\t\tparseHTML: (element) => element.getAttribute('data-wiki-image') === 'true',\n\t\t\t\trenderHTML: (attrs) => attrs.isWikiLink ? { 'data-wiki-image': 'true' } : {},\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: this.options.allowBase64\n\t\t\t\t\t? 'figure img[src]'\n\t\t\t\t\t: 'figure img[src]:not([src^=\"data:\"])',\n\t\t\t},\n\t\t]\n\t},\n\n\trenderHTML() {\n\t\t// Avoid the prosemirror node creation to trigger image loading as we use a custom node view anyways\n\t\t// Otherwise it would attempt to load the image from the current location before the node view is even initialized\n\t\treturn ['img']\n\t},\n\n\taddOptions() {\n\t\treturn {\n\t\t\t...this.parent?.() as ImageOptions,\n\t\t\tnoLazyImages: false,\n\t\t}\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(ImageView)\n\t},\n\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tkey: imageFileDropPluginKey,\n\t\t\t\tprops: {\n\t\t\t\t\thandleDrop: (view, event) => {\n\t\t\t\t\t\t// only catch the drop if it contains files\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tevent.target\n\t\t\t\t\t\t\t&& event.dataTransfer?.files\n\t\t\t\t\t\t\t&& event.dataTransfer.files.length > 0\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst coordinates = view.posAtCoords({\n\t\t\t\t\t\t\t\tleft: event.clientX,\n\t\t\t\t\t\t\t\ttop: event.clientY,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tconst customEvent = new CustomEvent('file-drop', {\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\t\tfiles: event.dataTransfer.files,\n\t\t\t\t\t\t\t\t\tposition: coordinates?.pos,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tevent.target.dispatchEvent(customEvent)\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\thandlePaste: (view, event) => {\n\t\t\t\t\t\t// only catch the paste if it contains files\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tevent.target\n\t\t\t\t\t\t\t&& event.clipboardData?.files\n\t\t\t\t\t\t\t&& event.clipboardData.files.length > 0\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// let the editor wrapper catch this custom event\n\t\t\t\t\t\t\tconst customEvent = new CustomEvent('image-paste', {\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\t\tfiles: event.clipboardData.files,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tevent.target.dispatchEvent(customEvent)\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\tnew Plugin({\n\t\t\t\tkey: imageExtractAttachmentsKey,\n\t\t\t\tstate: {\n\t\t\t\t\tinit(_, { doc }) {\n\t\t\t\t\t\tconst attachmentSrcs = extractAttachmentSrcs(doc)\n\t\t\t\t\t\temit('text:editor:attachments:updated', { attachmentSrcs })\n\t\t\t\t\t\treturn { attachmentSrcs }\n\t\t\t\t\t},\n\t\t\t\t\tapply(tr, value, _oldState, newState) {\n\t\t\t\t\t\tif (!tr.docChanged) {\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst attachmentSrcs = extractAttachmentSrcs(newState.doc)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tJSON.stringify(attachmentSrcs)\n\t\t\t\t\t\t\t=== JSON.stringify(value?.attachmentSrcs)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\temit('text:editor:attachments:updated', { attachmentSrcs })\n\t\t\t\t\t\treturn { attachmentSrcs }\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t]\n\t},\n\n\t/* Serializes an image node as a block image, so it ensures an image is always a block by itself */\n\ttoMarkdown(state: MarkdownSerializerState, node: Node) {\n\t\tif (node.attrs.isWikiLink) {\n\t\t\tstate.write(`![[${node.attrs.src}]]`)\n\t\t} else {\n\t\t\tconst alt = node.attrs.alt?.toString() || ''\n\t\t\t// same as in prosemirror-markdown, only with alt changes as above.\n\t\t\tstate.write('![' + state.esc(alt) + ']('\n\t\t\t\t+ node.attrs.src.replace(/[()]/g, '\\\\$&')\n\t\t\t\t+ (node.attrs.title ? ' \"' + node.attrs.title.replace(/\"/g, '\\\\\"') + '\"' : '')\n\t\t\t\t+ ')')\n\t\t}\n\t\tstate.closeBlock(node)\n\t},\n})\n\nexport default Image\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { ImageOptions as TiptapImageOptions } from '@tiptap/extension-image'\n\nimport TiptapImage from '@tiptap/extension-image'\nimport { VueNodeViewRenderer } from '@tiptap/vue-3'\nimport { defaultMarkdownSerializer } from 'prosemirror-markdown'\nimport ImageView from './ImageView.vue'\n\ninterface ImageOptions extends TiptapImageOptions {\n\tnoLazyImages: boolean\n}\n\n// Inline image extension. Needed if markdown contains inline images.\n// Not supported to be created from our UI (we default to block images).\nconst ImageInline = TiptapImage.extend({\n\tname: 'imageInline',\n\n\t// Lower priority than (block) Image extension\n\tpriority: 99,\n\n\tselectable: false,\n\n\taddAttributes() {\n\t\treturn {\n\t\t\t...this.parent?.(),\n\t\t\tisWikiLink: {\n\t\t\t\tdefault: false,\n\t\t\t\tparseHTML: (element) => element.getAttribute('data-wiki-image') === 'true',\n\t\t\t\trenderHTML: (attrs) => attrs.isWikiLink ? { 'data-wiki-image': 'true' } : {},\n\t\t\t},\n\t\t}\n\t},\n\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: this.options.allowBase64\n\t\t\t\t\t? 'img[src]'\n\t\t\t\t\t: 'img[src]:not([src^=\"data:\"])',\n\t\t\t},\n\t\t]\n\t},\n\n\taddOptions() {\n\t\treturn {\n\t\t\t...this.parent?.() as ImageOptions,\n\t\t\tnoLazyImages: false,\n\t\t\tinline: true,\n\t\t}\n\t},\n\n\t// Empty commands, we want only those from (block) Image extension\n\taddCommands() {\n\t\treturn {}\n\t},\n\n\t// Empty input rules, we want only those from (block) Image extension\n\taddInputRules() {\n\t\treturn []\n\t},\n\n\taddNodeView() {\n\t\treturn VueNodeViewRenderer(ImageView)\n\t},\n\n\ttoMarkdown(state, node, parent, index) {\n\t\tif (node.attrs.isWikiLink) {\n\t\t\tstate.write(`![[${node.attrs.src}]]`)\n\t\t} else {\n\t\t\treturn defaultMarkdownSerializer.nodes.image(state, node, parent, index)\n\t\t}\n\t},\n})\n\nexport default ImageInline\n","/**\n * This is the ParseError class, which is the main error thrown by KaTeX\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError extends Error {\n // The underlying error message without any context added.\n constructor(message,\n // The error message\n token) {\n var error = \"KaTeX parse error: \" + message;\n var start;\n var end;\n var loc = token && token.loc;\n if (loc && loc.start <= loc.end) {\n // If we have the input and a position, make the error a bit fancier\n // Get the input\n var input = loc.lexer.input;\n // Prepend some information\n start = loc.start;\n end = loc.end;\n if (start === input.length) {\n error += \" at end of input: \";\n } else {\n error += \" at position \" + (start + 1) + \": \";\n }\n // Underline token in question using combining underscores\n var underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n // Extract some context from the input and add it to the error\n var left;\n if (start > 15) {\n left = \"…\" + input.slice(start - 15, start);\n } else {\n left = input.slice(0, start);\n }\n var right;\n if (end + 15 < input.length) {\n right = input.slice(end, end + 15) + \"…\";\n } else {\n right = input.slice(end);\n }\n error += left + underlined + right;\n }\n super(error);\n this.name = \"ParseError\";\n this.position = void 0;\n // Error start position based on passed-in Token or ParseNode.\n this.length = void 0;\n // Length of affected text based on passed-in Token or ParseNode.\n this.rawMessage = void 0;\n Object.setPrototypeOf(this, ParseError.prototype);\n this.position = start;\n if (start != null && end != null) {\n this.length = end - start;\n }\n this.rawMessage = message;\n }\n}\n\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\nvar uppercase = /([A-Z])/g;\nvar hyphenate = str => str.replace(uppercase, \"-$1\").toLowerCase();\nvar ESCAPE_LOOKUP = {\n \"&\": \"&\",\n \">\": \">\",\n \"<\": \"<\",\n \"\\\"\": \""\",\n \"'\": \"'\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\nvar escape = text => String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nvar getBaseElem = group => {\n if (group.type === \"ordgroup\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"color\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"font\") {\n return getBaseElem(group.body);\n } else {\n return group;\n }\n};\nvar characterNodesTypes = new Set([\"mathord\", \"textord\", \"atom\"]);\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nvar isCharacterBox = group => characterNodesTypes.has(getBaseElem(group).type);\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nvar protocolFromUrl = url => {\n // Check for possible leading protocol.\n // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n // (U+20) or C0 control (U+00-U+1F) characters.\n var protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url);\n if (!protocol) {\n return \"_relative\";\n }\n // Reject weird colons\n if (protocol[2] !== \":\") {\n return null;\n }\n // Reject invalid characters in scheme according to\n // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n return null;\n }\n // Lowercase the protocol\n return protocol[1].toLowerCase();\n};\n\n/* eslint no-console:0 */\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n displayMode: {\n type: \"boolean\",\n description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n cli: \"-d, --display-mode\"\n },\n output: {\n type: {\n enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n },\n description: \"Determines the markup language of the output.\",\n cli: \"-F, --format \"\n },\n leqno: {\n type: \"boolean\",\n description: \"Render display math in leqno style (left-justified tags).\"\n },\n fleqn: {\n type: \"boolean\",\n description: \"Render display math flush left.\"\n },\n throwOnError: {\n type: \"boolean\",\n default: true,\n cli: \"-t, --no-throw-on-error\",\n cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n },\n errorColor: {\n type: \"string\",\n default: \"#cc0000\",\n cli: \"-c, --error-color \",\n cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n cliProcessor: color => \"#\" + color\n },\n macros: {\n type: \"object\",\n cli: \"-m, --macro \",\n cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n cliDefault: [],\n cliProcessor: (def, defs) => {\n defs.push(def);\n return defs;\n }\n },\n minRuleThickness: {\n type: \"number\",\n description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n processor: t => Math.max(0, t),\n cli: \"--min-rule-thickness \",\n cliProcessor: parseFloat\n },\n colorIsTextColor: {\n type: \"boolean\",\n description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n cli: \"-b, --color-is-text-color\"\n },\n strict: {\n type: [{\n enum: [\"warn\", \"ignore\", \"error\"]\n }, \"boolean\", \"function\"],\n description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n cli: \"-S, --strict\",\n cliDefault: false\n },\n trust: {\n type: [\"boolean\", \"function\"],\n description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n cli: \"-T, --trust\"\n },\n maxSize: {\n type: \"number\",\n default: Infinity,\n description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n processor: s => Math.max(0, s),\n cli: \"-s, --max-size \",\n cliProcessor: parseInt\n },\n maxExpand: {\n type: \"number\",\n default: 1000,\n description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n processor: n => Math.max(0, n),\n cli: \"-e, --max-expand \",\n cliProcessor: n => n === \"Infinity\" ? Infinity : parseInt(n)\n },\n globalGroup: {\n type: \"boolean\",\n cli: false\n }\n};\nfunction getImplicitDefault(type) {\n if (typeof type !== 'string') {\n return type.enum[0];\n }\n switch (type) {\n case 'boolean':\n return false;\n case 'string':\n return '';\n case 'number':\n return 0;\n case 'object':\n return {};\n default:\n throw new Error(\"Unexpected schema type; settings must declare an explicit default.\");\n }\n}\nfunction getDefaultValue(schema) {\n if (schema.default !== undefined) {\n return schema.default;\n }\n var type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n return getImplicitDefault(type);\n}\nfunction applySetting(target, prop, options, schema) {\n var optionValue = options[prop];\n target[prop] = optionValue !== undefined ? schema.processor ? schema.processor(optionValue) : optionValue : getDefaultValue(schema);\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n * - displayMode: Whether the expression should be typeset as inline math\n * (false, the default), meaning that the math starts in\n * \\textstyle and is placed in an inline-block); or as display\n * math (true), meaning that the math starts in \\displaystyle\n * and is placed in a block with vertical margin.\n */\nclass Settings {\n constructor(options) {\n if (options === void 0) {\n options = {};\n }\n this.displayMode = void 0;\n this.output = void 0;\n this.leqno = void 0;\n this.fleqn = void 0;\n this.throwOnError = void 0;\n this.errorColor = void 0;\n this.macros = void 0;\n this.minRuleThickness = void 0;\n this.colorIsTextColor = void 0;\n this.strict = void 0;\n this.trust = void 0;\n this.maxSize = void 0;\n this.maxExpand = void 0;\n this.globalGroup = void 0;\n // allow null options\n options = options || {};\n for (var prop of Object.keys(SETTINGS_SCHEMA)) {\n var schema = SETTINGS_SCHEMA[prop];\n if (schema) {\n // TODO: validate options\n applySetting(this, prop, options, schema);\n }\n }\n }\n /**\n * Report nonstrict (non-LaTeX-compatible) input.\n * Can safely not be called if `this.strict` is false in JavaScript.\n */\n reportNonstrict(errorCode, errorMsg, token) {\n var strict = this.strict;\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n strict = strict(errorCode, errorMsg, token);\n }\n if (!strict || strict === \"ignore\") {\n return;\n } else if (strict === true || strict === \"error\") {\n throw new ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n }\n }\n /**\n * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n * input (like `\\\\`). Unlike `nonstrict`, will not throw an error;\n * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n * translates to a return value of `false`. May still print a warning:\n * \"warn\" prints a warning and returns `false`.\n * This is for the second category of `errorCode`s listed in the README.\n */\n useStrictBehavior(errorCode, errorMsg, token) {\n var strict = this.strict;\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n // But catch any exceptions thrown by function, treating them\n // like \"error\".\n try {\n strict = strict(errorCode, errorMsg, token);\n } catch (error) {\n strict = \"error\";\n }\n }\n if (!strict || strict === \"ignore\") {\n return false;\n } else if (strict === true || strict === \"error\") {\n return true;\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n }\n }\n /**\n * Check whether to test potentially dangerous input, and return\n * `true` (trusted) or `false` (untrusted). The sole argument `context`\n * should be an object with `command` field specifying the relevant LaTeX\n * command (as a string starting with `\\`), and any other arguments, etc.\n * If `context` has a `url` field, a `protocol` field will automatically\n * get added by this function (changing the specified object).\n */\n isTrusted(context) {\n if (\"url\" in context && context.url && !context.protocol) {\n var protocol = protocolFromUrl(context.url);\n if (protocol == null) {\n return false;\n }\n context.protocol = protocol;\n }\n var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n return Boolean(trust);\n }\n}\n\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nclass Style {\n constructor(id, size, cramped) {\n this.id = void 0;\n this.size = void 0;\n this.cramped = void 0;\n this.id = id;\n this.size = size;\n this.cramped = cramped;\n }\n /**\n * Get the style of a superscript given a base in the current style.\n */\n sup() {\n return styles[sup[this.id]];\n }\n /**\n * Get the style of a subscript given a base in the current style.\n */\n sub() {\n return styles[sub[this.id]];\n }\n /**\n * Get the style of a fraction numerator given the fraction in the current\n * style.\n */\n fracNum() {\n return styles[fracNum[this.id]];\n }\n /**\n * Get the style of a fraction denominator given the fraction in the current\n * style.\n */\n fracDen() {\n return styles[fracDen[this.id]];\n }\n /**\n * Get the cramped version of a style (in particular, cramping a cramped style\n * doesn't change the style).\n */\n cramp() {\n return styles[cramp[this.id]];\n }\n /**\n * Get a text or display version of this style.\n */\n text() {\n return styles[text$1[this.id]];\n }\n /**\n * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n */\n isTight() {\n return this.size >= 2;\n }\n}\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7;\n// Instances of the different styles\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)];\n// Lookup tables for switching from one style to another\nvar sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar text$1 = [D, Dc, T, Tc, T, Tc, T, Tc];\n// We only export some of the styles.\nvar Style$1 = {\n DISPLAY: styles[D],\n TEXT: styles[T],\n SCRIPT: styles[S],\n SCRIPTSCRIPT: styles[SS]\n};\n\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n // Latin characters beyond the Latin-1 characters we have metrics for.\n // Needed for Czech, Hungarian and Turkish text, for example.\n name: 'latin',\n blocks: [[0x0100, 0x024f],\n // Latin Extended-A and Latin Extended-B\n [0x0300, 0x036f] // Combining Diacritical marks\n ]\n}, {\n // The Cyrillic script used by Russian and related languages.\n // A Cyrillic subset used to be supported as explicitly defined\n // symbols in symbols.js\n name: 'cyrillic',\n blocks: [[0x0400, 0x04ff]]\n}, {\n // Armenian\n name: 'armenian',\n blocks: [[0x0530, 0x058F]]\n}, {\n // The Brahmic scripts of South and Southeast Asia\n // Devanagari (0900–097F)\n // Bengali (0980–09FF)\n // Gurmukhi (0A00–0A7F)\n // Gujarati (0A80–0AFF)\n // Oriya (0B00–0B7F)\n // Tamil (0B80–0BFF)\n // Telugu (0C00–0C7F)\n // Kannada (0C80–0CFF)\n // Malayalam (0D00–0D7F)\n // Sinhala (0D80–0DFF)\n // Thai (0E00–0E7F)\n // Lao (0E80–0EFF)\n // Tibetan (0F00–0FFF)\n // Myanmar (1000–109F)\n name: 'brahmic',\n blocks: [[0x0900, 0x109F]]\n}, {\n name: 'georgian',\n blocks: [[0x10A0, 0x10ff]]\n}, {\n // Chinese and Japanese.\n // The \"k\" in cjk is for Korean, but we've separated Korean out\n name: \"cjk\",\n blocks: [[0x3000, 0x30FF],\n // CJK symbols and punctuation, Hiragana, Katakana\n [0x4E00, 0x9FAF],\n // CJK ideograms\n [0xFF00, 0xFF60] // Fullwidth punctuation\n // TODO: add halfwidth Katakana and Romanji glyphs\n ]\n}, {\n // Korean\n name: 'hangul',\n blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\nfunction scriptFromCodepoint(codepoint) {\n for (var i = 0; i < scriptData.length; i++) {\n var script = scriptData[i];\n for (var _i = 0; _i < script.blocks.length; _i++) {\n var block = script.blocks[_i];\n if (codepoint >= block[0] && codepoint <= block[1]) {\n return script.name;\n }\n }\n }\n return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\nvar allBlocks = [];\nscriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\nfunction supportedCodepoint(codepoint) {\n for (var i = 0; i < allBlocks.length; i += 2) {\n if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\n// Second Brush Stroke\n// Low resolution monitors struggle to display images in fine detail.\n// So browsers apply anti-aliasing. A long straight arrow shaft therefore\n// will sometimes appear as if it has a blurred edge.\n// To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n// arrow shafts. That is, a second long thin rectangular SVG path has been\n// written directly on top of each arrow shaft. This reinforcement causes\n// some of the screen pixels to display as black instead of the anti-aliased\n// gray pixel that a single path would generate. So we get arrow shafts\n// whose edges appear to be sharper.\nvar doubleBrushStroke = svgPath => svgPath + \" \" + svgPath;\nvar hLinePad = 80; // padding above a sqrt vinculum. Prevents image cropping.\n// The vinculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraVinculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraVinculum below.\n// The detour proceeds one extraVinculum distance up and slightly to the right,\n// displacing the radiused corner between surd and vinculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long vinculum, then down one extraVinculum distance,\n// after which it resumes regular path geometry for the radical.\n/* vinculum\n /\n /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraVinculum\n / █████████████████████←0.04em (40 unit) std vinculum thickness\n / /\n / /\n / /\\\n / / surd\n*/\nvar sqrtMain = function sqrtMain(extraVinculum, hLinePad) {\n // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n return \"M95,\" + (622 + extraVinculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraVinculum / 2.075 + \" -\" + extraVinculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraVinculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize1 = function sqrtSize1(extraVinculum, hLinePad) {\n // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n return \"M263,\" + (601 + extraVinculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraVinculum / 2.084 + \" -\" + extraVinculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraVinculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize2 = function sqrtSize2(extraVinculum, hLinePad) {\n // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n return \"M983 \" + (10 + extraVinculum + hLinePad) + \"\\nl\" + extraVinculum / 3.13 + \" -\" + extraVinculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraVinculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize3 = function sqrtSize3(extraVinculum, hLinePad) {\n // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n return \"M424,\" + (2398 + extraVinculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraVinculum / 4.223 + \" -\" + extraVinculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraVinculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraVinculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize4 = function sqrtSize4(extraVinculum, hLinePad) {\n // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n return \"M473,\" + (2713 + extraVinculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraVinculum / 5.298 + \" -\" + extraVinculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraVinculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"H1017.7z\";\n};\nvar phasePath = function phasePath(y) {\n var x = y / 2; // x coordinate at top of angle\n return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\nvar sqrtTall = function sqrtTall(extraVinculum, hLinePad, viewBoxHeight) {\n // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n // One path edge has a variable length. It runs vertically from the vinculum\n // to a point near (14 units) the bottom of the surd. The vinculum\n // is normally 40 units thick. So the length of the line in question is:\n var vertSegment = viewBoxHeight - 54 - hLinePad - extraVinculum;\n return \"M702 \" + (extraVinculum + hLinePad) + \"H400000\" + (40 + extraVinculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" SPDX-FileCopyrightText: 2023, 2021, 2024, 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { t } from '@nextcloud/l10n'\nimport { CollaborationCaret as TiptapCollaborationCaret } from '@tiptap/extension-collaboration-caret'\n\nexport interface AwarenessUser {\n\tcolor: string\n\tname: string\n}\n\n/**\n * @param clientId The Yjs client ID\n */\nfunction showCaretLabel(clientId: number) {\n\tsetTimeout(() => {\n\t\tconst el = document.getElementById(`collaboration-carets__label__${clientId}`)\n\t\tif (!el) {\n\t\t\treturn\n\t\t}\n\n\t\tel.classList.add('collaboration-carets__label__active')\n\t\tsetTimeout(() => {\n\t\t\tel?.classList.remove('collaboration-carets__label__active')\n\t\t}, 50)\n\t}, 50)\n}\n\n/**\n * Unix timestamp in seconds.\n */\nfunction getTimestamp() {\n\treturn Math.floor(Date.now() / 1000)\n}\n\n/**\n * Render the caret decoration\n *\n * @param user the users awareness data\n * @param clientId not part of the tiptap type signature but provided by y-prosemirror\n */\nfunction render(user: AwarenessUser, clientId?: number): HTMLElement {\n\tconst cursor = document.createElement('span')\n\n\tcursor.classList.add('collaboration-carets__caret')\n\tcursor.setAttribute('style', `border-color: ${user.color}`)\n\n\tconst label = document.createElement('div')\n\tlabel.id = `collaboration-carets__label__${clientId}`\n\n\tlabel.classList.add('collaboration-carets__label')\n\tlabel.setAttribute('style', `background-color: ${user.color}`)\n\tconst text = document.createTextNode(user.name || t('text', 'Guest'))\n\tlabel.insertBefore(text, null)\n\tcursor.insertBefore(label, null)\n\n\treturn cursor\n}\n\nconst CollaborationCaret = TiptapCollaborationCaret.extend({\n\taddOptions() {\n\t\treturn {\n\t\t\t...this.parent?.(),\n\t\t\trender,\n\t\t}\n\t},\n\n\tonCreate() {\n\t\tthis.options.provider.awareness.on(\n\t\t\t'change',\n\t\t\t(\n\t\t\t\t{ added, updated }: { added: number[], updated: number[] },\n\t\t\t\torigin: unknown,\n\t\t\t) => {\n\t\t\t\tif (origin !== 'local') {\n\t\t\t\t\tfor (const clientId of [...added, ...updated]) {\n\t\t\t\t\t\tif (clientId !== this.options.provider.awareness.clientID) {\n\t\t\t\t\t\t\tshowCaretLabel(clientId)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t},\n\n\t// Flag own caret as active on undoable changes to the document state\n\tonTransaction({ transaction, editor }) {\n\t\tconst addToHistory = transaction.getMeta('addToHistory') ?? true\n\t\tconst pointer = transaction.getMeta('pointer')\n\t\tconst updated = transaction.docChanged\n\t\tif (updated && addToHistory && !pointer) {\n\t\t\teditor.commands.updateUser({\n\t\t\t\t...this.options.provider.awareness.getLocalState().user,\n\t\t\t\tlastUpdate: getTimestamp(),\n\t\t\t})\n\t\t}\n\t},\n})\n\nexport default CollaborationCaret\n","// src/suggestion.ts\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\n\n// src/findSuggestionMatch.ts\nimport { escapeForRegEx } from \"@tiptap/core\";\nfunction findSuggestionMatch(config) {\n var _a;\n const { char, allowSpaces: allowSpacesOption, allowToIncludeChar, allowedPrefixes, startOfLine, $position } = config;\n const allowSpaces = allowSpacesOption && !allowToIncludeChar;\n const escapedChar = escapeForRegEx(char);\n const suffix = new RegExp(`\\\\s${escapedChar}$`);\n const prefix = startOfLine ? \"^\" : \"\";\n const finalEscapedChar = allowToIncludeChar ? \"\" : escapedChar;\n const regexp = allowSpaces ? new RegExp(`${prefix}${escapedChar}.*?(?=\\\\s${finalEscapedChar}|$)`, \"gm\") : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\\\s${finalEscapedChar}]*`, \"gm\");\n const text = ((_a = $position.nodeBefore) == null ? void 0 : _a.isText) && $position.nodeBefore.text;\n if (!text) {\n return null;\n }\n const textFrom = $position.pos - text.length;\n const match = Array.from(text.matchAll(regexp)).pop();\n if (!match || match.input === void 0 || match.index === void 0) {\n return null;\n }\n const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);\n const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes == null ? void 0 : allowedPrefixes.join(\"\")}\\0]?$`).test(matchPrefix);\n if (allowedPrefixes !== null && !matchPrefixIsAllowed) {\n return null;\n }\n const from = textFrom + match.index;\n let to = from + match[0].length;\n if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {\n match[0] += \" \";\n to += 1;\n }\n if (from < $position.pos && to >= $position.pos) {\n return {\n range: {\n from,\n to\n },\n query: match[0].slice(char.length),\n text: match[0]\n };\n }\n return null;\n}\n\n// src/suggestion.ts\nfunction hasInsertedWhitespace(transaction) {\n if (!transaction.docChanged) {\n return false;\n }\n return transaction.steps.some((step) => {\n const slice = step.slice;\n if (!(slice == null ? void 0 : slice.content)) {\n return false;\n }\n const inserted = slice.content.textBetween(0, slice.content.size, \"\\n\");\n return /\\s/.test(inserted);\n });\n}\nvar SuggestionPluginKey = new PluginKey(\"suggestion\");\nfunction Suggestion({\n pluginKey = SuggestionPluginKey,\n editor,\n char = \"@\",\n allowSpaces = false,\n allowToIncludeChar = false,\n allowedPrefixes = [\" \"],\n startOfLine = false,\n decorationTag = \"span\",\n decorationClass = \"suggestion\",\n decorationContent = \"\",\n decorationEmptyClass = \"is-empty\",\n command = () => null,\n items = () => [],\n render = () => ({}),\n allow = () => true,\n findSuggestionMatch: findSuggestionMatch2 = findSuggestionMatch,\n shouldShow,\n shouldResetDismissed\n}) {\n let props;\n const renderer = render == null ? void 0 : render();\n const effectiveAllowSpaces = allowSpaces && !allowToIncludeChar;\n const getAnchorClientRect = () => {\n const pos = editor.state.selection.$anchor.pos;\n const coords = editor.view.coordsAtPos(pos);\n const { top, right, bottom, left } = coords;\n try {\n return new DOMRect(left, top, right - left, bottom - top);\n } catch {\n return null;\n }\n };\n const clientRectFor = (view, decorationNode) => {\n if (!decorationNode) {\n return getAnchorClientRect;\n }\n return () => {\n const state = pluginKey.getState(editor.state);\n const decorationId = state == null ? void 0 : state.decorationId;\n const currentDecorationNode = view.dom.querySelector(`[data-decoration-id=\"${decorationId}\"]`);\n return (currentDecorationNode == null ? void 0 : currentDecorationNode.getBoundingClientRect()) || null;\n };\n };\n const shouldKeepDismissed = ({\n match,\n dismissedRange,\n state,\n transaction\n }) => {\n if (shouldResetDismissed == null ? void 0 : shouldResetDismissed({\n editor,\n state,\n range: dismissedRange,\n match,\n transaction,\n allowSpaces: effectiveAllowSpaces\n })) {\n return false;\n }\n if (effectiveAllowSpaces) {\n return match.range.from === dismissedRange.from;\n }\n return match.range.from === dismissedRange.from && !hasInsertedWhitespace(transaction);\n };\n function dispatchExit(view, pluginKeyRef) {\n var _a;\n try {\n const state = pluginKey.getState(view.state);\n const decorationNode = (state == null ? void 0 : state.decorationId) ? view.dom.querySelector(`[data-decoration-id=\"${state.decorationId}\"]`) : null;\n const exitProps = {\n // @ts-ignore editor is available in closure\n editor,\n range: (state == null ? void 0 : state.range) || { from: 0, to: 0 },\n query: (state == null ? void 0 : state.query) || null,\n text: (state == null ? void 0 : state.text) || null,\n items: [],\n command: (commandProps) => {\n return command({ editor, range: (state == null ? void 0 : state.range) || { from: 0, to: 0 }, props: commandProps });\n },\n decorationNode,\n clientRect: clientRectFor(view, decorationNode)\n };\n (_a = renderer == null ? void 0 : renderer.onExit) == null ? void 0 : _a.call(renderer, exitProps);\n } catch {\n }\n const tr = view.state.tr.setMeta(pluginKeyRef, { exit: true });\n view.dispatch(tr);\n }\n const plugin = new Plugin({\n key: pluginKey,\n view() {\n return {\n update: async (view, prevState) => {\n var _a, _b, _c, _d, _e, _f, _g;\n const prev = (_a = this.key) == null ? void 0 : _a.getState(prevState);\n const next = (_b = this.key) == null ? void 0 : _b.getState(view.state);\n const moved = prev.active && next.active && prev.range.from !== next.range.from;\n const started = !prev.active && next.active;\n const stopped = prev.active && !next.active;\n const changed = !started && !stopped && prev.query !== next.query;\n const handleStart = started || moved && changed;\n const handleChange = changed || moved;\n const handleExit = stopped || moved && changed;\n if (!handleStart && !handleChange && !handleExit) {\n return;\n }\n const state = handleExit && !handleStart ? prev : next;\n const decorationNode = view.dom.querySelector(`[data-decoration-id=\"${state.decorationId}\"]`);\n props = {\n editor,\n range: state.range,\n query: state.query,\n text: state.text,\n items: [],\n command: (commandProps) => {\n return command({\n editor,\n range: state.range,\n props: commandProps\n });\n },\n decorationNode,\n clientRect: clientRectFor(view, decorationNode)\n };\n if (handleStart) {\n (_c = renderer == null ? void 0 : renderer.onBeforeStart) == null ? void 0 : _c.call(renderer, props);\n }\n if (handleChange) {\n (_d = renderer == null ? void 0 : renderer.onBeforeUpdate) == null ? void 0 : _d.call(renderer, props);\n }\n if (handleChange || handleStart) {\n props.items = await items({\n editor,\n query: state.query\n });\n }\n if (handleExit) {\n (_e = renderer == null ? void 0 : renderer.onExit) == null ? void 0 : _e.call(renderer, props);\n }\n if (handleChange) {\n (_f = renderer == null ? void 0 : renderer.onUpdate) == null ? void 0 : _f.call(renderer, props);\n }\n if (handleStart) {\n (_g = renderer == null ? void 0 : renderer.onStart) == null ? void 0 : _g.call(renderer, props);\n }\n },\n destroy: () => {\n var _a;\n if (!props) {\n return;\n }\n (_a = renderer == null ? void 0 : renderer.onExit) == null ? void 0 : _a.call(renderer, props);\n }\n };\n },\n state: {\n // Initialize the plugin's internal state.\n init() {\n const state = {\n active: false,\n range: {\n from: 0,\n to: 0\n },\n query: null,\n text: null,\n composing: false,\n dismissedRange: null\n };\n return state;\n },\n // Apply changes to the plugin state from a view transaction.\n apply(transaction, prev, _oldState, state) {\n const { isEditable } = editor;\n const { composing } = editor.view;\n const { selection } = transaction;\n const { empty, from } = selection;\n const next = { ...prev };\n const meta = transaction.getMeta(pluginKey);\n if (meta && meta.exit) {\n next.active = false;\n next.decorationId = null;\n next.range = { from: 0, to: 0 };\n next.query = null;\n next.text = null;\n next.dismissedRange = prev.active ? { ...prev.range } : prev.dismissedRange;\n return next;\n }\n next.composing = composing;\n if (transaction.docChanged && next.dismissedRange !== null) {\n next.dismissedRange = {\n from: transaction.mapping.map(next.dismissedRange.from),\n to: transaction.mapping.map(next.dismissedRange.to)\n };\n }\n if (isEditable && (empty || editor.view.composing)) {\n if ((from < prev.range.from || from > prev.range.to) && !composing && !prev.composing) {\n next.active = false;\n }\n const match = findSuggestionMatch2({\n char,\n allowSpaces,\n allowToIncludeChar,\n allowedPrefixes,\n startOfLine,\n $position: selection.$from\n });\n const decorationId = `id_${Math.floor(Math.random() * 4294967295)}`;\n if (match && allow({\n editor,\n state,\n range: match.range,\n isActive: prev.active\n }) && (!shouldShow || shouldShow({\n editor,\n range: match.range,\n query: match.query,\n text: match.text,\n transaction\n }))) {\n if (next.dismissedRange !== null && !shouldKeepDismissed({\n match,\n dismissedRange: next.dismissedRange,\n state,\n transaction\n })) {\n next.dismissedRange = null;\n }\n if (next.dismissedRange === null) {\n next.active = true;\n next.decorationId = prev.decorationId ? prev.decorationId : decorationId;\n next.range = match.range;\n next.query = match.query;\n next.text = match.text;\n } else {\n next.active = false;\n }\n } else {\n if (!match) {\n next.dismissedRange = null;\n }\n next.active = false;\n }\n } else {\n next.active = false;\n }\n if (!next.active) {\n next.decorationId = null;\n next.range = { from: 0, to: 0 };\n next.query = null;\n next.text = null;\n }\n return next;\n }\n },\n props: {\n // Call the keydown hook if suggestion is active.\n handleKeyDown(view, event) {\n var _a, _b;\n const { active, range } = plugin.getState(view.state);\n if (!active) {\n return false;\n }\n if (event.key === \"Escape\" || event.key === \"Esc\") {\n const state = plugin.getState(view.state);\n (_a = renderer == null ? void 0 : renderer.onKeyDown) == null ? void 0 : _a.call(renderer, { view, event, range: state.range });\n dispatchExit(view, pluginKey);\n return true;\n }\n const handled = ((_b = renderer == null ? void 0 : renderer.onKeyDown) == null ? void 0 : _b.call(renderer, { view, event, range })) || false;\n return handled;\n },\n // Setup decorator on the currently active suggestion.\n decorations(state) {\n const { active, range, decorationId, query } = plugin.getState(state);\n if (!active) {\n return null;\n }\n const isEmpty = !(query == null ? void 0 : query.length);\n const classNames = [decorationClass];\n if (isEmpty) {\n classNames.push(decorationEmptyClass);\n }\n return DecorationSet.create(state.doc, [\n Decoration.inline(range.from, range.to, {\n nodeName: decorationTag,\n class: classNames.join(\" \"),\n \"data-decoration-id\": decorationId,\n \"data-decoration-content\": decorationContent\n })\n ]);\n }\n }\n });\n return plugin;\n}\nfunction exitSuggestion(view, pluginKeyRef = SuggestionPluginKey) {\n const tr = view.state.tr.setMeta(pluginKeyRef, { exit: true });\n view.dispatch(tr);\n}\n\n// src/index.ts\nvar index_default = Suggestion;\nexport {\n Suggestion,\n SuggestionPluginKey,\n index_default as default,\n exitSuggestion,\n findSuggestionMatch\n};\n//# sourceMappingURL=index.js.map","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { SuggestionOptions } from '@tiptap/suggestion'\n\nimport { Node } from '@tiptap/core'\nimport { PluginKey } from '@tiptap/pm/state'\nimport Suggestion from '@tiptap/suggestion'\n\nexport const EmojiPluginKey = new PluginKey('emoji')\n\ninterface EmojiObject {\n\tnative: string\n}\n\ndeclare module '@tiptap/core' {\n\tinterface Commands {\n\t\temoji: {\n\t\t\t/**\n\t\t\t * Set the text direction attribute\n\t\t\t */\n\t\t\temoji: (emojiObject: EmojiObject) => ReturnType\n\t\t}\n\t}\n}\n\ninterface EmojiOptions {\n\tHTMLAttributes: object\n\tsuggestion: Omit\n}\n\nconst defaultOptions = {\n\tchar: ':',\n\tallowedPrefixes: [' '],\n\tpluginKey: EmojiPluginKey,\n}\n\nconst Emoji = Node.create({\n\tname: 'emoji',\n\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t\tsuggestion: defaultOptions,\n\t\t}\n\t},\n\n\tcontent: 'text*',\n\n\taddCommands() {\n\t\treturn {\n\t\t\temoji:\n\t\t\t\t(emojiObject) => ({ commands }) => {\n\t\t\t\t\treturn commands.insertContent(emojiObject.native + ' ')\n\t\t\t\t},\n\t\t}\n\t},\n\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tSuggestion({\n\t\t\t\teditor: this.editor,\n\t\t\t\t...defaultOptions,\n\t\t\t\t...this.options.suggestion,\n\t\t\t}),\n\t\t]\n\t},\n})\n\nexport default Emoji\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/* eslint-disable jsdoc/require-param-type */\n/* eslint-disable jsdoc/require-param-description */\n\nimport { Extension } from '@tiptap/core'\n\nlet ownPaused = false\n\n/**\n *\n * @param editor\n * @param extensionName\n */\nfunction checkHasExtension(editor, extensionName) {\n\treturn editor.extensionManager.extensions.some((extension) => extension.name === extensionName)\n}\n\n/**\n *\n * @param editor\n */\nfunction checkHasListExtension(editor) {\n\treturn (\n\t\tcheckHasExtension(editor, 'bulletList')\n\t\t|| checkHasExtension(editor, 'orderedList')\n\t\t|| checkHasExtension(editor, 'taskList')\n\t)\n}\n\n/**\n *\n * @param root0\n * @param root0.editor\n */\nfunction toggleFocusTrap({ editor }) {\n\tconst trapStack = window._nc_focus_trap ?? []\n\tconst activeTrap = trapStack[trapStack.length - 1]\n\n\tconst possibleEditorTabCommand\n\t\t= (checkHasListExtension(editor) && editor.can().sinkListItem('listItem'))\n\t\t\t|| (checkHasExtension(editor, 'table') && editor.can().goToNextCell())\n\t\t\t|| (checkHasExtension(editor, 'table') && editor.can().goToPreviousCell())\n\t\t\t|| (checkHasExtension(editor, 'codeBlock') && editor.isActive('codeBlock'))\n\n\tif (possibleEditorTabCommand) {\n\t\tactiveTrap?.pause()\n\t\townPaused = true\n\t} else {\n\t\tif (ownPaused) {\n\t\t\townPaused = false\n\t\t\tactiveTrap?.unpause()\n\t\t}\n\t}\n}\n\n/**\n *\n */\nfunction unpauseFocusTrap() {\n\tconst trapStack = window._nc_focus_trap ?? []\n\tconst activeTrap = trapStack[trapStack.length - 1]\n\n\tactiveTrap?.unpause()\n}\n\n/**\n * The viewer focus trap needs to be paused on the fly in order to properly handle tab commands in the editor,\n * as we have no control over if a tab key event is reaching the editor otherwise. This is because the focus trap\n * registeres a capture listener (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#capture), so whenever we reach a tab command in the editor the focus trap will already have captured the event.\n *\n * We also cannot work around this by pushing our own focus trap to the stack, as the focus trap package does not offer any reliable way to programmatically focus the next element of the parent trap if we allow tabbing out of the editor.\n */\nconst FocusTrap = Extension.create({\n\tname: 'focustrap',\n\tonFocus: toggleFocusTrap,\n\tonBlur: unpauseFocusTrap,\n\tonSelectionUpdate: toggleFocusTrap,\n\tonTransaction: toggleFocusTrap,\n\tonUpdate: toggleFocusTrap,\n})\n\nexport default FocusTrap\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { Mark } from '@tiptap/core'\n\n/**\n * Keep markdown untouched\n */\nconst KeepSyntax = Mark.create({\n\tname: 'keep-syntax',\n\tparseHTML() {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttag: 'span.keep-md',\n\t\t\t},\n\t\t]\n\t},\n\trenderHTML() {\n\t\treturn ['span', { class: 'keep-md' }, 0]\n\t},\n\ttoMarkdown: {\n\t\topen: '',\n\t\tclose: '',\n\t\tmixable: true,\n\t\tescape: false,\n\t\texpelEnclosingWhitespace: true,\n\t},\n\n\t/**\n\t * Remove mark if there were manual changes\n\t */\n\tonUpdate() {\n\t\tconst tr = this.editor.state.tr\n\n\t\tthis.editor.state.doc.descendants((node, pos) => {\n\t\t\tif (\n\t\t\t\tnode.marks.findIndex((mark) => mark.type.name === this.name) !== -1\n\t\t\t) {\n\t\t\t\tif (node.type.name !== 'text' || node.text.length !== 1) {\n\t\t\t\t\ttr.removeMark(pos, pos + node.nodeSize, this.type)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\tif (tr.docChanged) {\n\t\t\ttr.setMeta('addToHistory', false)\n\t\t\ttr.setMeta('preventUpdate', true)\n\t\t\tthis.editor.view.dispatch(tr)\n\t\t}\n\t},\n})\n\nexport default KeepSyntax\n","// src/mention.ts\nimport { createInlineMarkdownSpec, mergeAttributes, Node } from \"@tiptap/core\";\nimport { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Suggestion } from \"@tiptap/suggestion\";\n\n// src/utils/get-default-suggestion-attributes.ts\nimport { PluginKey } from \"@tiptap/pm/state\";\nfunction getSuggestionOptions({\n editor: tiptapEditor,\n overrideSuggestionOptions,\n extensionName,\n char = \"@\"\n}) {\n const pluginKey = new PluginKey();\n return {\n editor: tiptapEditor,\n char,\n pluginKey,\n command: ({ editor, range, props }) => {\n var _a, _b, _c;\n const nodeAfter = editor.view.state.selection.$to.nodeAfter;\n const overrideSpace = (_a = nodeAfter == null ? void 0 : nodeAfter.text) == null ? void 0 : _a.startsWith(\" \");\n if (overrideSpace) {\n range.to += 1;\n }\n editor.chain().focus().insertContentAt(range, [\n {\n type: extensionName,\n attrs: { ...props, mentionSuggestionChar: char }\n },\n {\n type: \"text\",\n text: \" \"\n }\n ]).run();\n (_c = (_b = editor.view.dom.ownerDocument.defaultView) == null ? void 0 : _b.getSelection()) == null ? void 0 : _c.collapseToEnd();\n },\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from);\n const type = state.schema.nodes[extensionName];\n const allow = !!$from.parent.type.contentMatch.matchType(type);\n return allow;\n },\n ...overrideSuggestionOptions\n };\n}\n\n// src/mention.ts\nfunction getSuggestions(options) {\n return (options.options.suggestions.length ? options.options.suggestions : [options.options.suggestion]).map(\n (suggestion) => getSuggestionOptions({\n // @ts-ignore `editor` can be `undefined` when converting the document to HTML with the HTML utility\n editor: options.editor,\n overrideSuggestionOptions: suggestion,\n extensionName: options.name,\n char: suggestion.char\n })\n );\n}\nfunction getSuggestionFromChar(options, char) {\n const suggestions = getSuggestions(options);\n const suggestion = suggestions.find((s) => s.char === char);\n if (suggestion) {\n return suggestion;\n }\n if (suggestions.length) {\n return suggestions[0];\n }\n return null;\n}\nvar Mention = Node.create({\n name: \"mention\",\n priority: 101,\n addOptions() {\n return {\n HTMLAttributes: {},\n renderText({ node, suggestion }) {\n var _a, _b;\n return `${(_a = suggestion == null ? void 0 : suggestion.char) != null ? _a : \"@\"}${(_b = node.attrs.label) != null ? _b : node.attrs.id}`;\n },\n deleteTriggerWithBackspace: false,\n renderHTML({ options, node, suggestion }) {\n var _a, _b;\n return [\n \"span\",\n mergeAttributes(this.HTMLAttributes, options.HTMLAttributes),\n `${(_a = suggestion == null ? void 0 : suggestion.char) != null ? _a : \"@\"}${(_b = node.attrs.label) != null ? _b : node.attrs.id}`\n ];\n },\n suggestions: [],\n suggestion: {}\n };\n },\n group: \"inline\",\n inline: true,\n selectable: false,\n atom: true,\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n return {\n \"data-id\": attributes.id\n };\n }\n },\n label: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => {\n if (!attributes.label) {\n return {};\n }\n return {\n \"data-label\": attributes.label\n };\n }\n },\n // When there are multiple types of mentions, this attribute helps distinguish them\n mentionSuggestionChar: {\n default: \"@\",\n parseHTML: (element) => element.getAttribute(\"data-mention-suggestion-char\"),\n renderHTML: (attributes) => {\n return {\n \"data-mention-suggestion-char\": attributes.mentionSuggestionChar\n };\n }\n }\n };\n },\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`\n }\n ];\n },\n renderHTML({ node, HTMLAttributes }) {\n const suggestion = getSuggestionFromChar(this, node.attrs.mentionSuggestionChar);\n if (this.options.renderLabel !== void 0) {\n console.warn(\"renderLabel is deprecated use renderText and renderHTML instead\");\n return [\n \"span\",\n mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes),\n this.options.renderLabel({\n options: this.options,\n node,\n suggestion\n })\n ];\n }\n const mergedOptions = { ...this.options };\n mergedOptions.HTMLAttributes = mergeAttributes(\n { \"data-type\": this.name },\n this.options.HTMLAttributes,\n HTMLAttributes\n );\n const html = this.options.renderHTML({\n options: mergedOptions,\n node,\n suggestion\n });\n if (typeof html === \"string\") {\n return [\"span\", mergeAttributes({ \"data-type\": this.name }, this.options.HTMLAttributes, HTMLAttributes), html];\n }\n return html;\n },\n ...createInlineMarkdownSpec({\n nodeName: \"mention\",\n name: \"@\",\n selfClosing: true,\n allowedAttributes: [\"id\", \"label\", { name: \"mentionSuggestionChar\", skipIfDefault: \"@\" }],\n parseAttributes: (attrString) => {\n const attrs = {};\n const regex = /(\\w+)=(?:\"([^\"]*)\"|'([^']*)')/g;\n let match = regex.exec(attrString);\n while (match !== null) {\n const [, key, doubleQuoted, singleQuoted] = match;\n const value = doubleQuoted != null ? doubleQuoted : singleQuoted;\n attrs[key === \"char\" ? \"mentionSuggestionChar\" : key] = value;\n match = regex.exec(attrString);\n }\n return attrs;\n },\n serializeAttributes: (attrs) => {\n return Object.entries(attrs).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => {\n const serializedKey = key === \"mentionSuggestionChar\" ? \"char\" : key;\n return `${serializedKey}=\"${value}\"`;\n }).join(\" \");\n }\n }),\n renderText({ node }) {\n const args = {\n options: this.options,\n node,\n suggestion: getSuggestionFromChar(this, node.attrs.mentionSuggestionChar)\n };\n if (this.options.renderLabel !== void 0) {\n console.warn(\"renderLabel is deprecated use renderText and renderHTML instead\");\n return this.options.renderLabel(args);\n }\n return this.options.renderText(args);\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () => this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n if (!empty) {\n return false;\n }\n let mentionNode = new ProseMirrorNode();\n let mentionPos = 0;\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n mentionNode = node;\n mentionPos = pos;\n return false;\n }\n });\n if (isMention) {\n tr.insertText(\n this.options.deleteTriggerWithBackspace ? \"\" : mentionNode.attrs.mentionSuggestionChar,\n mentionPos,\n mentionPos + mentionNode.nodeSize\n );\n }\n return isMention;\n })\n };\n },\n addProseMirrorPlugins() {\n return getSuggestions(this).map(Suggestion);\n }\n});\n\n// src/index.ts\nvar index_default = Mention;\nexport {\n Mention,\n index_default as default\n};\n//# sourceMappingURL=index.js.map","import { defaultWindow, isClient, onClickOutside, onKeyStroke, onLongPress, useActiveElement, useBattery, useBrowserLocation, useClipboard, useColorMode, useDark, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDocumentVisibility, useDraggable, useElementBounding, useElementHover, useElementSize, useElementVisibility, useEyeDropper, useFullscreen, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useMouse, useMouseInElement, useMousePressed, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, usePointer, usePointerLock, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, useResizeObserver, useScreenSafeArea, useScroll, useScrollLock, useStorage, useTimeAgo, useTimestamp, useVirtualList, useWindowFocus, useWindowSize } from \"@vueuse/core\";\nimport { computed, defineComponent, h, reactive, shallowRef, toRefs, toValue, watch } from \"vue\";\nimport { createDisposableDirective, reactiveOmit, toRefs as toRefs$1, useToggle } from \"@vueuse/shared\";\n//#region ../core/onClickOutside/component.ts\nconst OnClickOutside = /* @__PURE__ */ defineComponent((props, { slots, emit }) => {\n\tconst target = shallowRef();\n\tonClickOutside(target, (e) => {\n\t\temit(\"trigger\", e);\n\t}, props.options);\n\treturn () => {\n\t\tif (slots.default) return h(props.as || \"div\", { ref: target }, slots.default());\n\t};\n}, {\n\tname: \"OnClickOutside\",\n\tprops: [\"as\", \"options\"],\n\temits: [\"trigger\"]\n});\n//#endregion\n//#region ../core/onClickOutside/directive.ts\nconst stopClickOutsideMap = /* @__PURE__ */ new WeakMap();\nconst vOnClickOutside = {\n\tmounted(el, binding) {\n\t\tconst capture = !binding.modifiers.bubble;\n\t\tlet stop;\n\t\tif (typeof binding.value === \"function\") stop = onClickOutside(el, binding.value, { capture });\n\t\telse {\n\t\t\tconst [handler, options] = binding.value;\n\t\t\tstop = onClickOutside(el, handler, Object.assign({ capture }, options));\n\t\t}\n\t\tstopClickOutsideMap.set(el, stop);\n\t},\n\tunmounted(el) {\n\t\tconst stop = stopClickOutsideMap.get(el);\n\t\tif (stop && typeof stop === \"function\") stop();\n\t\telse stop === null || stop === void 0 || stop.stop();\n\t\tstopClickOutsideMap.delete(el);\n\t}\n};\n/** @deprecated use `vOnClickOutside` instead */\nconst VOnClickOutside = vOnClickOutside;\n//#endregion\n//#region ../core/onKeyStroke/directive.ts\nconst vOnKeyStroke = createDisposableDirective({ mounted(el, binding) {\n\tvar _binding$arg$split, _binding$arg;\n\tconst keys = (_binding$arg$split = (_binding$arg = binding.arg) === null || _binding$arg === void 0 ? void 0 : _binding$arg.split(\",\")) !== null && _binding$arg$split !== void 0 ? _binding$arg$split : true;\n\tif (typeof binding.value === \"function\") onKeyStroke(keys, binding.value, { target: el });\n\telse {\n\t\tconst [handler, options] = binding.value;\n\t\tonKeyStroke(keys, handler, {\n\t\t\ttarget: el,\n\t\t\t...options\n\t\t});\n\t}\n} });\n//#endregion\n//#region ../core/onLongPress/component.ts\nconst OnLongPress = /* @__PURE__ */ defineComponent((props, { slots, emit }) => {\n\tconst target = shallowRef();\n\tconst data = onLongPress(target, (e) => {\n\t\temit(\"trigger\", e);\n\t}, props.options);\n\treturn () => {\n\t\tif (slots.default) return h(props.as || \"div\", { ref: target }, slots.default(data));\n\t};\n}, {\n\tname: \"OnLongPress\",\n\tprops: [\"as\", \"options\"],\n\temits: [\"trigger\"]\n});\n//#endregion\n//#region ../core/onLongPress/directive.ts\nconst vOnLongPress = createDisposableDirective({ mounted(el, binding) {\n\tif (typeof binding.value === \"function\") onLongPress(el, binding.value, { modifiers: binding.modifiers });\n\telse onLongPress(el, ...binding.value);\n} });\n/** @deprecated use `vOnLongPress` instead */\nconst VOnLongPress = vOnLongPress;\n//#endregion\n//#region ../core/useActiveElement/component.ts\nconst UseActiveElement = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive({ element: useActiveElement(props) });\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseActiveElement\",\n\tprops: [\n\t\t\"deep\",\n\t\t\"triggerOnRemoval\",\n\t\t\"window\",\n\t\t\"document\"\n\t]\n});\n//#endregion\n//#region ../core/useBattery/component.ts\nconst UseBattery = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useBattery(props));\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseBattery\",\n\tprops: [\"navigator\"]\n});\n//#endregion\n//#region ../core/useBrowserLocation/component.ts\nconst UseBrowserLocation = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useBrowserLocation(props));\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseBrowserLocation\",\n\tprops: [\"window\"]\n});\n//#endregion\n//#region ../core/useClipboard/component.ts\nconst UseClipboard = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useClipboard(props));\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseClipboard\",\n\tprops: [\n\t\t\"source\",\n\t\t\"read\",\n\t\t\"navigator\",\n\t\t\"copiedDuring\",\n\t\t\"legacy\"\n\t]\n});\n//#endregion\n//#region ../core/useColorMode/component.ts\nconst UseColorMode = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst mode = useColorMode(props);\n\tconst data = reactive({\n\t\tmode,\n\t\tsystem: mode.system,\n\t\tstore: mode.store\n\t});\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseColorMode\",\n\tprops: [\n\t\t\"attribute\",\n\t\t\"deep\",\n\t\t\"disableTransition\",\n\t\t\"emitAuto\",\n\t\t\"eventFilter\",\n\t\t\"flush\",\n\t\t\"initOnMounted\",\n\t\t\"initialValue\",\n\t\t\"listenToStorageChanges\",\n\t\t\"mergeDefaults\",\n\t\t\"modes\",\n\t\t\"onChanged\",\n\t\t\"onError\",\n\t\t\"selector\",\n\t\t\"serializer\",\n\t\t\"shallow\",\n\t\t\"storage\",\n\t\t\"storageKey\",\n\t\t\"storageRef\",\n\t\t\"window\",\n\t\t\"writeDefaults\"\n\t]\n});\n//#endregion\n//#region ../core/useDark/component.ts\nconst UseDark = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst isDark = useDark(props);\n\tconst data = reactive({\n\t\tisDark,\n\t\ttoggleDark: useToggle(isDark)\n\t});\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseDark\",\n\tprops: [\n\t\t\"attribute\",\n\t\t\"deep\",\n\t\t\"disableTransition\",\n\t\t\"emitAuto\",\n\t\t\"eventFilter\",\n\t\t\"flush\",\n\t\t\"initOnMounted\",\n\t\t\"initialValue\",\n\t\t\"listenToStorageChanges\",\n\t\t\"mergeDefaults\",\n\t\t\"onChanged\",\n\t\t\"onError\",\n\t\t\"selector\",\n\t\t\"serializer\",\n\t\t\"shallow\",\n\t\t\"storage\",\n\t\t\"storageKey\",\n\t\t\"storageRef\",\n\t\t\"valueDark\",\n\t\t\"valueLight\",\n\t\t\"window\",\n\t\t\"writeDefaults\"\n\t]\n});\n//#endregion\n//#region ../core/useDeviceMotion/component.ts\nconst UseDeviceMotion = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = useDeviceMotion(props);\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseDeviceMotion\",\n\tprops: [\n\t\t\"eventFilter\",\n\t\t\"requestPermissions\",\n\t\t\"window\"\n\t]\n});\n//#endregion\n//#region ../core/useDeviceOrientation/component.ts\nconst UseDeviceOrientation = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useDeviceOrientation(props));\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseDeviceOrientation\",\n\tprops: [\"window\"]\n});\n//#endregion\n//#region ../core/useDevicePixelRatio/component.ts\nconst UseDevicePixelRatio = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useDevicePixelRatio(props));\n\treturn () => {\n\t\tif (slots.default) return slots.default(data);\n\t};\n}, {\n\tname: \"UseDevicePixelRatio\",\n\tprops: [\"window\"]\n});\n//#endregion\n//#region ../core/useDevicesList/component.ts\nconst UseDevicesList = /* @__PURE__ */ defineComponent((props, { slots }) => {\n\tconst data = reactive(useDevicesList(props));\ SPDX-FileCopyrightText: 2023, 2022, 2026, 2022 The HedgeDoc developers (see AUTHORS file)\n *\n * SPDX-License-Identifier: MIT\n */\n\n// Markdown-it plugin to render GitHub-style task lists; see\n//\n// https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments\n// https://github.com/blog/1825-task-lists-in-all-markdown-documents\n\nimport type MarkdownIt from 'markdown-it'\nimport type StateCore from 'markdown-it/lib/rules_core/state_core.mjs'\n\nimport Token from 'markdown-it/lib/token.mjs'\n\ninterface TaskListsOptions {\n\tenabled: boolean\n\tlabel: boolean\n\tlineNumber: boolean\n}\n\nconst checkboxRegex = /^ *\\[([\\sx])] /i\n\n/**\n *\n * @param md -\n * @param options - taskLists plugin options\n */\nexport default function taskLists(\n\tmd: MarkdownIt,\n\toptions: TaskListsOptions = { enabled: false, label: false, lineNumber: false },\n): void {\n\tmd.core.ruler.after('inline', 'task-lists', (state) => processToken(state, options))\n\tmd.renderer.rules.taskListItemCheckbox = (tokens) => {\n\t\tconst token = tokens[0]\n\t\tconst checkedAttribute = token.attrGet('checked') ? 'checked=\"\" ' : ''\n\t\tconst disabledAttribute = token.attrGet('disabled') ? 'disabled=\"\" ' : ''\n\t\tconst line = token.attrGet('line')\n\t\tconst idAttribute = `id=\"${token.attrGet('id')}\" `\n\t\tconst dataLineAttribute\n\t\t\t= line && options.lineNumber ? `data-line=\"${line}\" ` : ''\n\n\t\treturn ``\n\t}\n\n\tmd.renderer.rules.taskListItemLabel_close = () => {\n\t\treturn ''\n\t}\n\n\tmd.renderer.rules.taskListItemLabel_open = (tokens: Token[]) => {\n\t\tconst token = tokens[0]\n\t\tconst id = token.attrGet('id')\n\t\treturn `