From ffb5ba4a2e6e1e97b11bf1dca9cd206fbc6e0188 Mon Sep 17 00:00:00 2001 From: Bubble <49866759+BubbleDK@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:50:10 +0200 Subject: [PATCH] uploaded MDT --- LICENSE | 674 ++++ README.md | 53 + client/alerts.lua | 250 ++ client/blips.lua | 35 + client/camera.lua | 199 + client/eventHandlers.lua | 115 + client/framework/qb_core.lua | 40 + client/main.lua | 457 +++ client/utils.lua | 267 ++ config.lua | 6 + fxmanifest.lua | 40 + locales/en.json | 170 + server/calls.lua | 103 + server/charges.lua | 33 + server/commands.lua | 36 + server/db.lua | 444 +++ server/framework/qb_core.lua | 630 ++++ server/main.lua | 337 ++ server/officers.lua | 55 + server/profileCards.lua | 121 + server/units.lua | 167 + server/utils.lua | 22 + sql/data.sql | 124 + sql/import.sql | 180 + web/.eslintrc.cjs | 18 + web/.gitignore | 24 + web/index.html | 16 + web/package.json | 58 + web/pnpm-lock.yaml | 3270 +++++++++++++++++ web/public/blips/111.png | Bin 0 -> 1464 bytes web/public/blips/162.png | Bin 0 -> 1364 bytes web/public/blips/310.png | Bin 0 -> 1704 bytes web/public/blips/51.png | Bin 0 -> 1023 bytes web/public/blips/60.png | Bin 0 -> 1081 bytes web/public/blips/67.png | Bin 0 -> 1283 bytes web/public/vite.svg | 1 + web/src/App.css | 19 + web/src/App.tsx | 19 + web/src/assets/lspd.png | Bin 0 -> 51110 bytes web/src/assets/police-logo.png | Bin 0 -> 117044 bytes web/src/assets/react.svg | 1 + web/src/helpers/capitalizeFirstLetter.ts | 7 + web/src/helpers/convert.ts | 20 + web/src/helpers/index.ts | 2 + web/src/helpers/shuffleArray.ts | 17 + web/src/hooks/useExitListener.ts | 30 + web/src/hooks/useNuiEvent.ts | 49 + web/src/index.css | 26 + web/src/layers/dev/Dev.tsx | 92 + web/src/layers/dispatch/Disptach.tsx | 223 ++ web/src/layers/dispatch/dispatch.css | 39 + web/src/layers/mdt/MDT.css | 20 + web/src/layers/mdt/MDT.tsx | 150 + web/src/layers/mdt/assets/lspd.png | Bin 0 -> 51110 bytes web/src/layers/mdt/assets/police-logo.png | Bin 0 -> 117044 bytes web/src/layers/mdt/assets/react.svg | 1 + .../Charges/components/ChargeCard.tsx | 136 + .../components/modals/EditChargeModal.tsx | 96 + .../layers/mdt/components/Charges/index.css | 80 + .../layers/mdt/components/Charges/index.tsx | 243 ++ .../mdt/components/CodesAndCommands/index.css | 34 + .../mdt/components/CodesAndCommands/index.tsx | 170 + .../layers/mdt/components/CreateBoloModal.tsx | 78 + .../layers/mdt/components/CustomLoader.tsx | 31 + .../components/AnnouncementsCard.tsx | 99 + .../Dashboard/components/BolosCard.tsx | 96 + .../components/Dashboard/components/Card.tsx | 53 + .../Dashboard/components/DispatchesCard.tsx | 87 + .../Dashboard/components/RecentActivity.css | 13 + .../Dashboard/components/RecentActivity.tsx | 116 + .../Dashboard/components/WarrantsCard.tsx | 84 + .../components/modals/AnnoucementModal.tsx | 46 + .../Dashboard/components/modals/BoloModal.tsx | 78 + .../modals/CreateAnnouncementModal.tsx | 52 + .../modals/ViewAllAnnouncements.tsx | 34 + .../layers/mdt/components/Dashboard/index.css | 161 + .../layers/mdt/components/Dashboard/index.tsx | 104 + .../Dispatch/components/CallMarkers.tsx | 103 + .../components/Dispatch/components/Map.tsx | 32 + .../Dispatch/components/MapLayerSettings.tsx | 48 + .../Dispatch/components/MapWrapper.tsx | 74 + .../Dispatch/components/MarkerPopup.tsx | 36 + .../Dispatch/components/OfficerMarkers.tsx | 132 + .../Dispatch/components/calls/CallCard.tsx | 213 ++ .../components/calls/CallCardTitle.tsx | 18 + .../Dispatch/components/calls/Calls.tsx | 25 + .../Dispatch/components/calls/CallsList.tsx | 39 + .../components/modals/CreateUnitModal.tsx | 45 + .../components/modals/ManageOfficersModal.tsx | 83 + .../components/units/CreateUnitButton.tsx | 32 + .../Dispatch/components/units/UnitCard.tsx | 163 + .../Dispatch/components/units/Units.tsx | 27 + .../Dispatch/components/units/UnitsList.tsx | 38 + .../Dispatch/components/units/UnitsTitle.tsx | 18 + .../layers/mdt/components/Dispatch/index.css | 47 + .../layers/mdt/components/Dispatch/index.tsx | 27 + .../components/ConfirmSelectedCharges.tsx | 61 + .../Incidents/components/CriminalCard.tsx | 226 ++ .../Incidents/components/EvidenceImage.tsx | 95 + .../Incidents/components/IncidentList.tsx | 128 + .../Incidents/components/IncidentMiddle.tsx | 197 + .../Incidents/components/IncidentRight.tsx | 40 + .../components/SelectedChargeCard.tsx | 153 + .../components/modals/AddCriminalModal.tsx | 132 + .../components/modals/AddEvidenceModal.tsx | 68 + .../components/modals/AddOfficerModal.tsx | 118 + .../components/modals/CreateIncidentModal.tsx | 51 + .../components/modals/EditChargesModal.tsx | 197 + .../layers/mdt/components/Incidents/index.css | 228 ++ .../layers/mdt/components/Incidents/index.tsx | 43 + .../Profiles/components/ProfileCard.tsx | 35 + .../components/ProfileExtraInformation.tsx | 151 + .../components/ProfileInformation.tsx | 131 + .../Profiles/components/ProfileList.tsx | 111 + .../components/modals/AvatarModal.tsx | 42 + .../layers/mdt/components/Profiles/index.css | 179 + .../layers/mdt/components/Profiles/index.tsx | 50 + .../Reports/components/EvidenceImage.tsx | 95 + .../Reports/components/ReportList.tsx | 127 + .../Reports/components/ReportMiddle.tsx | 62 + .../Reports/components/ReportRight.tsx | 195 + .../components/modals/AddCitizenModal.tsx | 125 + .../components/modals/AddEvidenceModal.tsx | 69 + .../components/modals/AddOfficerModal.tsx | 118 + .../components/modals/CreateReportModal.tsx | 51 + .../layers/mdt/components/Reports/index.css | 228 ++ .../layers/mdt/components/Reports/index.tsx | 43 + .../Roster/components/RosterTable.tsx | 239 ++ .../components/modals/HireOfficerModal.tsx | 52 + .../components/modals/SetCallSignModal.tsx | 53 + .../Roster/components/modals/SetRankModal.tsx | 55 + .../components/modals/SetRolesModal.tsx | 61 + .../layers/mdt/components/Roster/index.css | 19 + .../layers/mdt/components/Roster/index.tsx | 121 + web/src/layers/mdt/components/Sidebar.tsx | 209 ++ web/src/layers/mdt/components/TextEditor.tsx | 152 + web/src/layers/mdt/components/UnitBadge.tsx | 32 + .../components/VehicleInformation.tsx | 218 ++ .../Vehicles/components/VehicleList.tsx | 101 + .../layers/mdt/components/Vehicles/index.css | 100 + .../layers/mdt/components/Vehicles/index.tsx | 52 + .../Vehicles/modals/AvatarModal.tsx | 42 + web/src/layers/mdt/components/index.ts | 7 + .../notifications/DispatchNotifications.tsx | 57 + .../components/DispatchNotification.tsx | 85 + .../components/NotificationInfo.tsx | 56 + web/src/locales.ts | 31 + web/src/main.tsx | 26 + web/src/stores/announcementStore.ts | 87 + web/src/stores/appVisibilityStore.ts | 22 + web/src/stores/bolosStore.ts | 38 + web/src/stores/chargesStore.ts | 103 + web/src/stores/dispatch/calls.ts | 157 + web/src/stores/dispatch/map.ts | 16 + web/src/stores/dispatch/units.ts | 51 + web/src/stores/incidents/addCriminal.ts | 44 + web/src/stores/incidents/editCharges.ts | 26 + web/src/stores/incidents/incident.ts | 132 + web/src/stores/incidents/incidentsList.ts | 50 + web/src/stores/index.ts | 5 + web/src/stores/officersStore.ts | 65 + web/src/stores/personalDataStore.ts | 36 + web/src/stores/profilesStore.ts | 112 + web/src/stores/recentActivityStore.ts | 47 + web/src/stores/reports/report.ts | 104 + web/src/stores/reports/reportsList.ts | 40 + web/src/stores/roster/roster.ts | 67 + web/src/stores/rosterStore.ts | 0 web/src/stores/vehicles/vehicles.ts | 74 + web/src/stores/warrantStore.ts | 44 + web/src/typings/announcement.ts | 11 + web/src/typings/character.ts | 9 + web/src/typings/charges.ts | 12 + web/src/typings/config.ts | 8 + web/src/typings/dispatch.ts | 26 + web/src/typings/incident.ts | 41 + web/src/typings/index.ts | 11 + web/src/typings/officer.ts | 9 + web/src/typings/profile.ts | 33 + web/src/typings/report.ts | 19 + web/src/typings/roster.ts | 12 + web/src/typings/vehicle.ts | 13 + web/src/typings/warrant.ts | 8 + web/src/utils/debugData.ts | 31 + web/src/utils/fetchNui.ts | 37 + web/src/utils/formatNumber.ts | 3 + web/src/utils/gameToMap.ts | 9 + web/src/utils/misc.ts | 7 + web/src/vite-env.d.ts | 1 + web/tsconfig.json | 21 + web/tsconfig.node.json | 9 + web/vite.config.ts | 16 + 192 files changed, 18734 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 client/alerts.lua create mode 100644 client/blips.lua create mode 100644 client/camera.lua create mode 100644 client/eventHandlers.lua create mode 100644 client/framework/qb_core.lua create mode 100644 client/main.lua create mode 100644 client/utils.lua create mode 100644 config.lua create mode 100644 fxmanifest.lua create mode 100644 locales/en.json create mode 100644 server/calls.lua create mode 100644 server/charges.lua create mode 100644 server/commands.lua create mode 100644 server/db.lua create mode 100644 server/framework/qb_core.lua create mode 100644 server/main.lua create mode 100644 server/officers.lua create mode 100644 server/profileCards.lua create mode 100644 server/units.lua create mode 100644 server/utils.lua create mode 100644 sql/data.sql create mode 100644 sql/import.sql create mode 100644 web/.eslintrc.cjs create mode 100644 web/.gitignore create mode 100644 web/index.html create mode 100644 web/package.json create mode 100644 web/pnpm-lock.yaml create mode 100644 web/public/blips/111.png create mode 100644 web/public/blips/162.png create mode 100644 web/public/blips/310.png create mode 100644 web/public/blips/51.png create mode 100644 web/public/blips/60.png create mode 100644 web/public/blips/67.png create mode 100644 web/public/vite.svg create mode 100644 web/src/App.css create mode 100644 web/src/App.tsx create mode 100644 web/src/assets/lspd.png create mode 100644 web/src/assets/police-logo.png create mode 100644 web/src/assets/react.svg create mode 100644 web/src/helpers/capitalizeFirstLetter.ts create mode 100644 web/src/helpers/convert.ts create mode 100644 web/src/helpers/index.ts create mode 100644 web/src/helpers/shuffleArray.ts create mode 100644 web/src/hooks/useExitListener.ts create mode 100644 web/src/hooks/useNuiEvent.ts create mode 100644 web/src/index.css create mode 100644 web/src/layers/dev/Dev.tsx create mode 100644 web/src/layers/dispatch/Disptach.tsx create mode 100644 web/src/layers/dispatch/dispatch.css create mode 100644 web/src/layers/mdt/MDT.css create mode 100644 web/src/layers/mdt/MDT.tsx create mode 100644 web/src/layers/mdt/assets/lspd.png create mode 100644 web/src/layers/mdt/assets/police-logo.png create mode 100644 web/src/layers/mdt/assets/react.svg create mode 100644 web/src/layers/mdt/components/Charges/components/ChargeCard.tsx create mode 100644 web/src/layers/mdt/components/Charges/components/modals/EditChargeModal.tsx create mode 100644 web/src/layers/mdt/components/Charges/index.css create mode 100644 web/src/layers/mdt/components/Charges/index.tsx create mode 100644 web/src/layers/mdt/components/CodesAndCommands/index.css create mode 100644 web/src/layers/mdt/components/CodesAndCommands/index.tsx create mode 100644 web/src/layers/mdt/components/CreateBoloModal.tsx create mode 100644 web/src/layers/mdt/components/CustomLoader.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/AnnouncementsCard.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/BolosCard.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/Card.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/DispatchesCard.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/RecentActivity.css create mode 100644 web/src/layers/mdt/components/Dashboard/components/RecentActivity.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/WarrantsCard.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/modals/AnnoucementModal.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/modals/BoloModal.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/modals/CreateAnnouncementModal.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/components/modals/ViewAllAnnouncements.tsx create mode 100644 web/src/layers/mdt/components/Dashboard/index.css create mode 100644 web/src/layers/mdt/components/Dashboard/index.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/CallMarkers.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/Map.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/MapLayerSettings.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/MapWrapper.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/MarkerPopup.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/OfficerMarkers.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/calls/CallCard.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/calls/CallCardTitle.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/calls/Calls.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/calls/CallsList.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/modals/CreateUnitModal.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/modals/ManageOfficersModal.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/units/CreateUnitButton.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/units/UnitCard.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/units/Units.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/units/UnitsList.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/components/units/UnitsTitle.tsx create mode 100644 web/src/layers/mdt/components/Dispatch/index.css create mode 100644 web/src/layers/mdt/components/Dispatch/index.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/ConfirmSelectedCharges.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/CriminalCard.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/EvidenceImage.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/IncidentList.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/IncidentMiddle.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/IncidentRight.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/SelectedChargeCard.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/modals/AddCriminalModal.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/modals/AddEvidenceModal.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/modals/AddOfficerModal.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/modals/CreateIncidentModal.tsx create mode 100644 web/src/layers/mdt/components/Incidents/components/modals/EditChargesModal.tsx create mode 100644 web/src/layers/mdt/components/Incidents/index.css create mode 100644 web/src/layers/mdt/components/Incidents/index.tsx create mode 100644 web/src/layers/mdt/components/Profiles/components/ProfileCard.tsx create mode 100644 web/src/layers/mdt/components/Profiles/components/ProfileExtraInformation.tsx create mode 100644 web/src/layers/mdt/components/Profiles/components/ProfileInformation.tsx create mode 100644 web/src/layers/mdt/components/Profiles/components/ProfileList.tsx create mode 100644 web/src/layers/mdt/components/Profiles/components/modals/AvatarModal.tsx create mode 100644 web/src/layers/mdt/components/Profiles/index.css create mode 100644 web/src/layers/mdt/components/Profiles/index.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/EvidenceImage.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/ReportList.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/ReportMiddle.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/ReportRight.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/modals/AddCitizenModal.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/modals/AddEvidenceModal.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/modals/AddOfficerModal.tsx create mode 100644 web/src/layers/mdt/components/Reports/components/modals/CreateReportModal.tsx create mode 100644 web/src/layers/mdt/components/Reports/index.css create mode 100644 web/src/layers/mdt/components/Reports/index.tsx create mode 100644 web/src/layers/mdt/components/Roster/components/RosterTable.tsx create mode 100644 web/src/layers/mdt/components/Roster/components/modals/HireOfficerModal.tsx create mode 100644 web/src/layers/mdt/components/Roster/components/modals/SetCallSignModal.tsx create mode 100644 web/src/layers/mdt/components/Roster/components/modals/SetRankModal.tsx create mode 100644 web/src/layers/mdt/components/Roster/components/modals/SetRolesModal.tsx create mode 100644 web/src/layers/mdt/components/Roster/index.css create mode 100644 web/src/layers/mdt/components/Roster/index.tsx create mode 100644 web/src/layers/mdt/components/Sidebar.tsx create mode 100644 web/src/layers/mdt/components/TextEditor.tsx create mode 100644 web/src/layers/mdt/components/UnitBadge.tsx create mode 100644 web/src/layers/mdt/components/Vehicles/components/VehicleInformation.tsx create mode 100644 web/src/layers/mdt/components/Vehicles/components/VehicleList.tsx create mode 100644 web/src/layers/mdt/components/Vehicles/index.css create mode 100644 web/src/layers/mdt/components/Vehicles/index.tsx create mode 100644 web/src/layers/mdt/components/Vehicles/modals/AvatarModal.tsx create mode 100644 web/src/layers/mdt/components/index.ts create mode 100644 web/src/layers/notifications/DispatchNotifications.tsx create mode 100644 web/src/layers/notifications/components/DispatchNotification.tsx create mode 100644 web/src/layers/notifications/components/NotificationInfo.tsx create mode 100644 web/src/locales.ts create mode 100644 web/src/main.tsx create mode 100644 web/src/stores/announcementStore.ts create mode 100644 web/src/stores/appVisibilityStore.ts create mode 100644 web/src/stores/bolosStore.ts create mode 100644 web/src/stores/chargesStore.ts create mode 100644 web/src/stores/dispatch/calls.ts create mode 100644 web/src/stores/dispatch/map.ts create mode 100644 web/src/stores/dispatch/units.ts create mode 100644 web/src/stores/incidents/addCriminal.ts create mode 100644 web/src/stores/incidents/editCharges.ts create mode 100644 web/src/stores/incidents/incident.ts create mode 100644 web/src/stores/incidents/incidentsList.ts create mode 100644 web/src/stores/index.ts create mode 100644 web/src/stores/officersStore.ts create mode 100644 web/src/stores/personalDataStore.ts create mode 100644 web/src/stores/profilesStore.ts create mode 100644 web/src/stores/recentActivityStore.ts create mode 100644 web/src/stores/reports/report.ts create mode 100644 web/src/stores/reports/reportsList.ts create mode 100644 web/src/stores/roster/roster.ts create mode 100644 web/src/stores/rosterStore.ts create mode 100644 web/src/stores/vehicles/vehicles.ts create mode 100644 web/src/stores/warrantStore.ts create mode 100644 web/src/typings/announcement.ts create mode 100644 web/src/typings/character.ts create mode 100644 web/src/typings/charges.ts create mode 100644 web/src/typings/config.ts create mode 100644 web/src/typings/dispatch.ts create mode 100644 web/src/typings/incident.ts create mode 100644 web/src/typings/index.ts create mode 100644 web/src/typings/officer.ts create mode 100644 web/src/typings/profile.ts create mode 100644 web/src/typings/report.ts create mode 100644 web/src/typings/roster.ts create mode 100644 web/src/typings/vehicle.ts create mode 100644 web/src/typings/warrant.ts create mode 100644 web/src/utils/debugData.ts create mode 100644 web/src/utils/fetchNui.ts create mode 100644 web/src/utils/formatNumber.ts create mode 100644 web/src/utils/gameToMap.ts create mode 100644 web/src/utils/misc.ts create mode 100644 web/src/vite-env.d.ts create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.node.json create mode 100644 web/vite.config.ts diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7a3b7c2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..afb34ff --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +

This is still relatively untested, and bugs are likely to occur. You should only use this if you're comfortable with programming and fixing the bugs yourself. I will provide limited support and cannot guarantee that any bugs or issues will be fixed within a typical timeframe.

+ +bub-mdt-image + +You can watch a preview [here](https://streamable.com/m91u9u) + +# Bubble MDT & Dispatch + +A police MDT with built-in dispatch functionalities. The MDT consists of the following pages: + +- Dashboard +- Profiles +- Incidents +- Reports +- Vehicles +- Dispatch +- Roster +- Charges + +# Frameworks + +- [qbx_core](https://github.com/Qbox-project/qbx_core) + +# Dependencies + +- [oxmysql](https://github.com/overextended/oxmysql) +- [ox_lib](https://github.com/overextended/ox_lib) + +# Installation + +- Install all the dependencies and have them started before bub-mdt +- Import the SQL provided +- Drag and drop the resource into your resources folder +- Add `start bub-mdt` to your `server.cfg` file + +# Credits + +Without the creation of the following resources, this MDT would not have seen the light of day, as this MDT is heavily inspired by these: + +- [ox_mdt](https://github.com/overextended/ox_mdt) - Dispatch, Some events and function, Code structure and data flow + +# Feature Request, Issue Reporting & Contribution + +- Contributions are always welcome - Open a pull request. +- Found a bug? Open an issue. +- Want a feature implemented? Open an issue. + +# The resource state + +- LUA part needs some refactoring. +- A lot of the UI needs to be refactored, more modular and simply be optimized. +- The drivers license points system needs to be revamped, as of right now it does not function properly. +- Probably a lot more which i have forgotten about, but i guess it will get mentioned if people end up using this MDT. diff --git a/client/alerts.lua b/client/alerts.lua new file mode 100644 index 0000000..cb93ebe --- /dev/null +++ b/client/alerts.lua @@ -0,0 +1,250 @@ +local config = require 'config' +local framework = require(('client.framework.%s'):format(config.framework)) +local utils = require 'client.utils' + +local function CustomAlert(data) + local coords = data.coords + local disptachInfo = {} + + for i = 1, #data.info do + disptachInfo[#disptachInfo+1] = { + label = data.info[i].label, + icon = data.info[i].icon + } + end + + local dispatchData = { + code = data.code or '10-80', + offense = data.offense, + coords = { + coords.x, + coords.y + }, + info = disptachInfo, + blip = data.blip or 162, + isEmergency = data.isEmergency or false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('CustomAlert', CustomAlert) + +local function VehicleTheft() + local coords = GetEntityCoords(cache.ped) + local closestVehicle = lib.getClosestVehicle(GetEntityCoords(cache.ped)) + + local dispatchData = { + code = '10-35', + offense = "Vehicle Theft", + coords = { + coords.x, + coords.y + }, + info = { + { + label = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(closestVehicle))), + icon = 'car', + }, + { + label = GetVehicleNumberPlateText(closestVehicle), + icon = 'badge-tm', + }, + { + label = utils.GetVehicleColor(closestVehicle), + icon = 'palette' + } + }, + blip = 67, + isEmergency = false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('VehicleTheft', VehicleTheft) + +local function Shooting() + local coords = GetEntityCoords(cache.ped) + + local dispatchData = { + code = '10-11', + offense = "Shooting in progress", + coords = { + coords.x, + coords.y + }, + info = { + { + label = utils.GetWeaponName(), + icon = 'gun', + }, + { + label = framework.getPlayerGender(), + icon = 'gender-bigender', + } + }, + blip = 60, + isEmergency = false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('Shooting', Shooting) + +local function VehicleShooting() + local coords = GetEntityCoords(cache.ped) + + local dispatchData = { + code = '10-60', + offense = "Shots Fired from Vehicle", + coords = { + coords.x, + coords.y + }, + info = { + { + label = utils.GetWeaponName(), + icon = 'gun', + }, + { + label = framework.getPlayerGender(), + icon = 'gender-bigender', + }, + { + label = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(cache.vehicle))), + icon = 'car', + }, + { + label = GetVehicleNumberPlateText(cache.vehicle), + icon = 'badge-tm', + }, + { + label = utils.GetVehicleColor(cache.vehicle), + icon = 'palette' + } + }, + blip = 60, + isEmergency = false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('VehicleShooting', VehicleShooting) + +local function SpeedingVehicle() + local coords = GetEntityCoords(cache.ped) + + local dispatchData = { + code = '10-11', + offense = "Reckless driving", + coords = { + coords.x, + coords.y + }, + info = { + { + label = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(cache.vehicle))), + icon = 'car', + }, + { + label = GetVehicleNumberPlateText(cache.vehicle), + icon = 'badge-tm', + }, + { + label = utils.GetVehicleColor(cache.vehicle), + icon = 'palette' + } + }, + blip = 162, + isEmergency = false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('SpeedingVehicle', SpeedingVehicle) + +local function CarJacking(vehicle) + local coords = GetEntityCoords(cache.ped) + + local dispatchData = { + code = '10-35', + offense = "Car Jacking", + coords = { + coords.x, + coords.y + }, + info = { + { + label = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))), + icon = 'car', + }, + { + label = GetVehicleNumberPlateText(vehicle), + icon = 'badge-tm', + }, + { + label = utils.GetVehicleColor(vehicle), + icon = 'palette' + } + }, + blip = 67, + isEmergency = false, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('CarJacking', CarJacking) + +local function OfficerDown() + local coords = GetEntityCoords(cache.ped) + + local dispatchData = { + code = '10-99', + offense = "Officer Down", + coords = { + coords.x, + coords.y + }, + info = { + { + label = framework.getPlayerGender(), + icon = 'gender-bigender', + }, + }, + blip = 310, + isEmergency = true, + blipCoords = coords, + } + + TriggerServerEvent('mdt:server:CreateCall', dispatchData) +end +exports('OfficerDown', OfficerDown) +RegisterNetEvent("mdt:client:officerdown", OfficerDown) + +RegisterCommand('testcall', function() + local random = math.random(1, 3) + + if random == 1 then + OfficerDown() + elseif random == 2 then + Shooting() + else + CustomAlert({ + coords = vec3(0, 0, 0), + info = { + { + label = framework.getPlayerGender(), + icon = 'gender-bigender', + }, + }, + code = '10-90', + offense = 'A cool offense', + blip = 310, + }) + end +end) \ No newline at end of file diff --git a/client/blips.lua b/client/blips.lua new file mode 100644 index 0000000..37b5802 --- /dev/null +++ b/client/blips.lua @@ -0,0 +1,35 @@ +RegisterNetEvent('mdt:addBlip', function(data) + local street1, street2 = GetStreetNameAtCoord(data.blipCoords.x, data.blipCoords.y, data.blipCoords.z) + local street1name = GetStreetNameFromHashKey(street1) + local street2name = GetStreetNameFromHashKey(street2) + local transG = 250 + local blip = AddBlipForCoord(data.blipCoords.x, data.blipCoords.y, data.blipCoords.z) + local blip2 = AddBlipForCoord(data.blipCoords.x, data.blipCoords.y, data.blipCoords.z) + + SetBlipSprite(blip, 60) + SetBlipSprite(blip2, 161) + SetBlipColour(blip, 38) + SetBlipColour(blip2, 38) + SetBlipDisplay(blip, 4) + SetBlipDisplay(blip2, 8) + SetBlipAlpha(blip, transG) + SetBlipAlpha(blip2, transG) + SetBlipScale(blip, 0.8) + SetBlipScale(blip2, 2.0) + SetBlipAsShortRange(blip, false) + SetBlipAsShortRange(blip2, false) + PulseBlip(blip2) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(data.text) + EndTextCommandSetBlipName(blip) + while transG ~= 0 do + Wait(180 * 4) + transG = transG - 1 + SetBlipAlpha(blip, transG) + SetBlipAlpha(blip2, transG) + if transG == 0 then + RemoveBlip(blip) + return + end + end +end) \ No newline at end of file diff --git a/client/camera.lua b/client/camera.lua new file mode 100644 index 0000000..5f23e69 --- /dev/null +++ b/client/camera.lua @@ -0,0 +1,199 @@ +local config = require 'config' +local framework = require(('client.framework.%s'):format(config.framework)) + +camera = false +local cameraprop = nil +local inPrompt = false +local inTakePicture = false +local takePicture = false + +local FOV_MAX = 80.0 +local FOV_MIN = 5.0 -- max zoom level (smaller fov is more zoom) +local ZOOM_SPEED = 10.0 -- camera zoom speed +local SPEED_LEFT_RIGHT = 8.0 -- speed by which the camera pans left-right +local SPEED_UP_DOWN = 8.0 -- speed by which the camera pans up-down + +local fov = (FOV_MAX+FOV_MIN) * 0.5 + +local function hideHUDThisFrame() + HideHelpTextThisFrame() + HideHudAndRadarThisFrame() + HideHudComponentThisFrame(1) + HideHudComponentThisFrame(2) + HideHudComponentThisFrame(3) + HideHudComponentThisFrame(4) + HideHudComponentThisFrame(6) + HideHudComponentThisFrame(7) + HideHudComponentThisFrame(8) + HideHudComponentThisFrame(9) + HideHudComponentThisFrame(13) + HideHudComponentThisFrame(11) + HideHudComponentThisFrame(12) + HideHudComponentThisFrame(15) + HideHudComponentThisFrame(18) + HideHudComponentThisFrame(19) +end + +local function checkInputRotation(cam, zoomvalue) + local rightAxisX = GetDisabledControlNormal(0, 220) + local rightAxisY = GetDisabledControlNormal(0, 221) + local rotation = GetCamRot(cam, 2) + if rightAxisX ~= 0.0 or rightAxisY ~= 0.0 then + local new_z = rotation.z + rightAxisX * -1.0 * (SPEED_UP_DOWN) * (zoomvalue + 0.1) + local new_x = math.max(math.min(20.0, rotation.x + rightAxisY * -1.0 * (SPEED_LEFT_RIGHT) * (zoomvalue + 0.1)), -89.5) + SetCamRot(cam, new_x, 0.0, new_z, 2) + -- Moves the entities body if they are not in a vehicle (else the whole vehicle will rotate as they look around) + if not IsPedSittingInAnyVehicle(cache.ped) then + SetEntityHeading(cache.ped, new_z) + end + end +end + +local function handleZoom(cam) + if not IsPedSittingInAnyVehicle(cache.ped) then + if IsControlJustPressed(0,241) then + fov = math.max(fov - ZOOM_SPEED, FOV_MIN) + end + if IsControlJustPressed(0,242) then + fov = math.min(fov + ZOOM_SPEED, FOV_MAX) + end + local current_fov = GetCamFov(cam) + if math.abs(fov-current_fov) < 0.1 then + fov = current_fov + end + SetCamFov(cam, current_fov + (fov - current_fov)*0.05) + else + if IsControlJustPressed(0,17) then + fov = math.max(fov - ZOOM_SPEED, FOV_MIN) + end + if IsControlJustPressed(0,16) then + fov = math.min(fov + ZOOM_SPEED, FOV_MAX) + end + local current_fov = GetCamFov(cam) + if math.abs(fov - current_fov) < 0.1 then + fov = current_fov + end + SetCamFov(cam, current_fov + (fov - current_fov)*0.05) + end +end + +function CameraLoop(data) + lib.requestAnimDict("amb@world_human_paparazzi@male@base") + TaskPlayAnim(cache.ped, "amb@world_human_paparazzi@male@base", 'base', 6.0, 3.0, -1, 49, 1.0, false, false, false) + + local model = lib.requestModel(`prop_pap_camera_01`) + + if model then + local coords = GetEntityCoords(cache.ped) + + cameraprop = CreateObject(model, coords.x, coords.y, coords.z + 0.2, true, true, true) + AttachEntityToEntity(cameraprop, cache.ped, GetPedBoneIndex(cache.ped, 28422), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, true, true, false, true, 1, true) + end + + CreateThread(function() + Wait(500) + + SetTimecycleModifier("default") + SetTimecycleModifierStrength(0.3) + + local cam = CreateCam("DEFAULT_SCRIPTED_FLY_CAMERA", true) + AttachCamToEntity(cam, cache.ped, 0.0, 1.0, 0.8, true) + SetCamRot(cam, 0.0, 0.0, GetEntityHeading(cache.ped), 2) + SetCamFov(cam, fov) + RenderScriptCams(true, false, 0, true, false) + + while camera and not IsEntityDead(cache.ped) do + DisablePlayerFiring(cache.ped, true) + if IsControlJustPressed(0, 177) then + camera = false + PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false) + ClearPedTasks(cache.ped) + DisablePlayerFiring(cache.ped, false) + + if cameraprop then + DeleteEntity(cameraprop) + end + elseif IsControlJustPressed(1, 176) then + PlaySoundFrontend(-1, "Camera_Shoot", "Phone_Soundset_Franklin", false) + exports['screenshot-basic']:requestScreenshotUpload('https://api.fivemanage.com/api/image?apiKey=' .. config.fivemanageAPIKey, 'image', function(imageData) + local resp = json.decode(imageData) + if resp then + camera = false + + if cameraprop then + DeleteEntity(cameraprop) + end + + ClearPedTasks(cache.ped) + + local ImageData = { + id = data.id, + imageLabel = data.imageLabel, + imageURL = resp.url + } + + if (data.type == 'report') then + lib.callback.await('mdt:addReportEvidenceFromPictureTaking', false, ImageData) + SendNUIMessage({ + action = 'updateReportEvidence', + data = { + imageLabel = data.imageLabel, + imageURL = resp.url + } + }) + else + lib.callback.await('mdt:addEvidenceFromPictureTaking', false, ImageData) + SendNUIMessage({ + action = 'updateIncidentEvidence', + data = { + imageLabel = data.imageLabel, + imageURL = resp.url + } + }) + end + + if not IsEntityPlayingAnim(cache.ped, tabletAnimDict, 'base', 3) then + lib.requestAnimDict(tabletAnimDict) + TaskPlayAnim(cache.ped, tabletAnimDict, 'base', 6.0, 3.0, -1, 49, 1.0, false, false, false) + end + + if not tablet then + local model = lib.requestModel(`prop_cs_tablet`) + + if not model then return end + + local coords = GetEntityCoords(cache.ped) + tablet = CreateObject(model, coords.x, coords.y, coords.z, true, true, true) + AttachEntityToEntity(tablet, cache.ped, GetPedBoneIndex(cache.ped, 28422), 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, true, true, false, true, 0, true) + end + + SendNUIMessage({ + action = 'setVisible', + data = { + visible = true, + } + }) + SetNuiFocus(true, true) + isMdtOpen = true + DisablePlayerFiring(cache.ped, false) + end + end) + end + + local zoomvalue = (1.0 / (FOV_MAX - FOV_MIN)) * (fov - FOV_MIN) + checkInputRotation(cam, zoomvalue) + handleZoom(cam) + hideHUDThisFrame() + Wait(0) + end + + DisablePlayerFiring(cache.ped, false) + camera = false + ClearTimecycleModifier() + fov = (FOV_MAX + FOV_MIN) * 0.5 + RenderScriptCams(false, false, 0, true, false) + DestroyCam(cam, false) + SetNightvision(false) + SetSeethrough(false) + end) +end \ No newline at end of file diff --git a/client/eventHandlers.lua b/client/eventHandlers.lua new file mode 100644 index 0000000..b8cb04d --- /dev/null +++ b/client/eventHandlers.lua @@ -0,0 +1,115 @@ +local config = require 'config' +local framework = require(('client.framework.%s'):format(config.framework)) +local timer = {} + +local function WaitTimer(name, action, ...) + if not timer[name] then + timer[name] = true + action(...) + Wait(config.defaultAlertsDelay * 1000) + timer[name] = false + end +end + +local function isPedAWitness(witnesses, ped) + for k, v in pairs(witnesses) do + if v == ped then + return true + end + end + return false +end + +AddEventHandler('CEventGunShot', function(witnesses, ped) + if IsPedCurrentWeaponSilenced(cache.ped) then return end + + WaitTimer('Shooting', function() + if cache.ped ~= ped then return end + + if framework.isJobPolice() then + if not config.debug then + return + end + end + + if witnesses and not isPedAWitness(witnesses, ped) then return end + + if cache.vehicle then + exports['x-mdt']:VehicleShooting() + else + exports['x-mdt']:Shooting() + end + end) +end) + +AddEventHandler('CEventPedJackingMyVehicle', function(_, ped) + WaitTimer('Autotheft', function() + if cache.ped ~= ped then return end + + local vehicle = GetVehiclePedIsUsing(ped, true) + exports['x-mdt']:CarJacking(vehicle) + end) +end) + +AddEventHandler('CEventShockingCarAlarm', function(_, ped) + WaitTimer('Autotheft', function() + if cache.ped ~= ped then return end + + local vehicle = GetVehiclePedIsUsing(ped, true) + exports['x-mdt']:VehicleTheft(vehicle) + end) +end) + +AddEventHandler('gameEventTriggered', function(name, args) + if name ~= 'CEventNetworkEntityDamage' then return end + local victim = args[1] + local isDead = args[6] == 1 + + WaitTimer('PlayerDowned', function() + if not victim or victim ~= cache.ped then return end + if not isDead then return end + + if framework.isJobPolice() then + exports['x-mdt']:OfficerDown() + end + end) +end) + +local SpeedingEvents = { + 'CEventShockingCarChase', + 'CEventShockingDrivingOnPavement', + 'CEventShockingBicycleOnPavement', + 'CEventShockingMadDriverBicycle', + 'CEventShockingMadDriverExtreme', + 'CEventShockingEngineRevved', + 'CEventShockingInDangerousVehicle' +} + +local SpeedTrigger = 0 +for i = 1, #SpeedingEvents do + local event = SpeedingEvents[i] + AddEventHandler(event, function(_, ped) + WaitTimer('Speeding', function() + local currentTime = GetGameTimer() + + if currentTime - SpeedTrigger < 10000 then + return + end + + if cache.ped ~= ped then return end + + if framework.isJobPolice() then + if not config.debug then + return + end + end + + if GetEntitySpeed(cache.vehicle) * 3.6 < (80 + math.random(0, 20)) then return end + + if cache.ped ~= GetPedInVehicleSeat(cache.vehicle, -1) then return end + + exports['x-mdt']:SpeedingVehicle() + SpeedTrigger = GetGameTimer() + end) + end) +end \ No newline at end of file diff --git a/client/framework/qb_core.lua b/client/framework/qb_core.lua new file mode 100644 index 0000000..b120467 --- /dev/null +++ b/client/framework/qb_core.lua @@ -0,0 +1,40 @@ +local QBCore = exports['qb-core']:GetCoreObject() +local qb = {} +local officer = {} + +qb.loadedEvent = 'QBCore:Client:OnPlayerLoaded' +qb.logoutEvent = 'QBCore:Client:OnPlayerUnload' +qb.setGroupEvent = 'QBCore:Client:OnJobUpdate' + +function qb.getOfficerData() + local playerData = QBCore.Functions.GetPlayerData() + + officer.citizenid = playerData.citizenid + officer.firstname = playerData.charinfo.firstname + officer.lastname = playerData.charinfo.lastname + officer.role = playerData.job.grade.name + + return officer +end + +function qb.notify(text, type) + exports.qbx_core:Notify(text, type) +end + +function qb.isJobPolice() + return QBCore.Functions.GetPlayerData().job.type == 'leo' and true or false +end + +function qb.isOnDuty() + return QBCore.Functions.GetPlayerData().job.onduty and true or false +end + +function qb.GetVehiclesByName() + return exports.qbx_core:GetVehiclesByName() +end + +function qb.getPlayerGender() + return QBCore.Functions.GetPlayerData().charinfo.gender == 1 and "Female" or "Male" +end + +return qb diff --git a/client/main.lua b/client/main.lua new file mode 100644 index 0000000..88d9517 --- /dev/null +++ b/client/main.lua @@ -0,0 +1,457 @@ +if not lib then return end + +isMdtOpen = false + +local hasLoadedUi = false +local config = require 'config' +local utils = require 'client.utils' +local framework = require(('client.framework.%s'):format(config.framework)) +local player = nil +local isMiniDispatchOpen = false +local VEHICLES = framework.GetVehiclesByName() +local officerBlips = {} +local respondKey + +require 'client.alerts' +require 'client.blips' +require 'client.camera' +require 'client.eventHandlers' + +tabletAnimDict = 'amb@world_human_seat_wall_tablet@female@base' +tablet = nil + +local function closeMdt(hideUi) + if not isMdtOpen then return end + + isMdtOpen = false + + if hideUi then + SendNUIMessage({ + action = 'setVisible', + data = { + visible = false, + } + }) + + SetNuiFocus(false, false) + end + + if IsEntityPlayingAnim(cache.ped, tabletAnimDict, 'base', 3) then + ClearPedTasks(cache.ped) + end + + if tablet then + if DoesEntityExist(tablet) then + Wait(300) + DeleteEntity(tablet) + end + + tablet = nil + end +end + +local function openMdt() + local isAuthorised, callSign = lib.callback.await('mdt:openMdt', 500) + + if not isAuthorised then return framework.notify('You do not have access to the MDT', 'error') end + + isMdtOpen = true + + if not IsEntityPlayingAnim(cache.ped, tabletAnimDict, 'base', 3) then + lib.requestAnimDict(tabletAnimDict) + TaskPlayAnim(cache.ped, tabletAnimDict, 'base', 6.0, 3.0, -1, 49, 1.0, false, false, false) + end + + if not tablet then + local model = lib.requestModel(`prop_cs_tablet`) + + if not model then return end + + local coords = GetEntityCoords(cache.ped) + tablet = CreateObject(model, coords.x, coords.y, coords.z, true, true, true) + AttachEntityToEntity(tablet, cache.ped, GetPedBoneIndex(cache.ped, 28422), 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, true, true, false, true, 0, true) + end + + if not hasLoadedUi then + local profileCards = lib.callback.await('mdt:getCustomProfileCards') + local charges = lib.callback.await('mdt:getAllCharges') + + player.unit = LocalPlayer.state.mdtUnitId + player.callSign = callSign + + SendNUIMessage({ + action = 'setInitData', + data = { + locale = GetConvar('ox:locale', 'en'), + locales = lib.getLocales(), + profileCards = profileCards, + charges = charges + } + }) + + hasLoadedUi = true + end + + SetNuiFocus(true, true) + SendNUIMessage({ + action = 'openMDT', + data = { + personalData = player, + } + }) +end +exports('openMdt', openMdt) + +lib.addKeybind({ + defaultKey = 'm', + description = 'Open the Police MDT', + name = 'openMdt', + onPressed = openMdt +}) + +local function openMiniDispatch() + if isMdtOpen then return end + + local isAuthorised = lib.callback.await('mdt:openDispatch', 500) + + if not isAuthorised then return end + + isMiniDispatchOpen = true + + SetNuiFocus(true, true) + SendNUIMessage({ + action = 'showMiniDispatch', + data = { + currentRespondKey = respondKey:getCurrentKey() + } + }) +end + +lib.addKeybind({ + defaultKey = 'i', + description = 'Open the mini dispatch', + name = 'openMiniDispatch', + onPressed = openMiniDispatch +}) + +local function respondToCall() + if (not isMiniDispatchOpen) then return end + + SendNUIMessage({ + action = 'respondToCall', + data = { + currentRespondKey = respondKey:getCurrentKey() + } + }) +end + +respondKey = lib.addKeybind({ + deafultKey = 'g', + description = 'Reponds to call', + name = 'respondToCall', + onPressed = respondToCall +}) + +lib.addKeybind({ + name = 'NextDisptachCall', + description = 'Go to the next dispatch call', + defaultKey = 'RIGHT', + onPressed = function() + SendNUIMessage({ + action = 'handleRightArrowPress' + }) + end +}) + +lib.addKeybind({ + name = 'PreviousDisptachCall', + description = 'Go to the previous dispatch call', + defaultKey = 'LEFT', + onPressed = function() + SendNUIMessage({ + action = 'handleLeftArrowPress' + }) + end +}) + +RegisterNetEvent(framework.loadedEvent, function() + player = framework.getOfficerData() +end) + +RegisterNetEvent(framework.logoutEvent, function() + hasLoadedUi = false + + if player.group then closeMdt(true) end +end) + +RegisterNetEvent(framework.setGroupEvent, function() + local lastGroup = player.group + + framework.getOfficerData() + + if not player.group and lastGroup or (lastGroup and lastGroup ~= player.group) then + closeMdt(true) + end +end) + +RegisterNetEvent('mdt:OpenMDT', function() + openMdt() +end) + +RegisterNetEvent('mdt:client:CloseMiniDispatch', function() + isMiniDispatchOpen = false + SetNuiFocus(false, false) + + SendNUIMessage({ + action = "hideMiniDispatch" + }) +end) + +RegisterNetEvent('mdt:client:CloseMDT', function() + closeMdt(true) +end) + +RegisterNetEvent('mdt:updateOfficerPositions', function(data) + for i = 1, #data do + local officer = data[i] + + if officer.citizenid ~= player.citizenid then + local blip = officerBlips[officer.citizenid] + + if not blip then + local name = ('police:%s'):format(officer.citizenid) + + blip = AddBlipForCoord(officer.position[2], officer.position[1], officer.position[3]) + officerBlips[officer.citizenid] = blip + + SetBlipSprite(blip, 1) + SetBlipDisplay(blip, 3) + SetBlipColour(blip, 42) + ShowFriendIndicatorOnBlip(blip, true) + AddTextEntry(name, ('%s %s (%s)'):format(officer.firstname, officer.lastname, officer.callsign)) + BeginTextCommandSetBlipName(name) + EndTextCommandSetBlipName(blip) + SetBlipCategory(blip, 7) + else + SetBlipCoords(blip, officer.position[2], officer.position[1], officer.position[3]) + end + end + end + + SendNUIMessage({ + action = 'updateOfficerPositions', + data = data + }) +end) + +RegisterNetEvent('mdt:refreshUnits', function(data) + SendNUIMessage({ + action = 'refreshUnits', + data = data + }) +end) + +RegisterNetEvent('mdt:createCall', function(data) + data.call.id = data.id + data.call.location = GetStreetNameFromHashKey(GetStreetNameAtCoord(data.call.coords[2], data.call.coords[1], 0)) + + PlaySoundFrontend(-1, 'Near_Miss_Counter_Reset', 'GTAO_FM_Events_Soundset', false) + + SendNUIMessage({ + action = 'addCall', + data = data.call + }) +end) + +RegisterNetEvent('mdt:updateCallCoords', function(data) + SendNUIMessage({ + action = 'updateCallCoords', + data = data + }) +end) + +RegisterNetEvent('mdt:updateCalls', function(data) + for i = 1, #data.calls do + data.calls[i].location = GetStreetNameFromHashKey(GetStreetNameAtCoord(data.calls[i].coords[2], data.calls[i].coords[1], 0)) + end + + SendNUIMessage({ + action = 'updateCalls', + data = data + }) +end) + +RegisterNetEvent('mdt:editCallUnits', function(data) + SendNUIMessage({ + action = 'editCallUnits', + data = data + }) +end) + +RegisterNetEvent('mdt:setCallUnits', function(data) + SendNUIMessage({ + action = 'setCallUnits', + data = data + }) +end) + +RegisterNetEvent('mdt:client:notify', function(text, type) + framework.notify(text, type) +end) + +RegisterNUICallback('hideMiniDisptach', function(_, cb) + if isMdtOpen then return end + + SetNuiFocus(false, false) + cb(1) +end) + +RegisterNuiCallback('takePicture', function(data, cb) + SetNuiFocus(false, false); + closeMdt(true); + camera = true + CameraLoop(data); + cb(1) +end) + +RegisterNuiCallback('setWaypoint', function(data, cb) + SetNewWaypoint(data[2], data[1]) + cb(1) +end) + +RegisterNUICallback('exit', function(_, cb) + cb(1) + SetNuiFocus(false, false) + closeMdt(true) +end) + +AddEventHandler('onResourceStop', function(resource) + if resource == cache.resource then + player.unit = nil + closeMdt() + end +end) + +AddEventHandler("onResourceStart", function(resource) + if resource == cache.resource then + player = framework.getOfficerData() + end +end) + +local function serverNuiCallback(event, clientCb) + RegisterNuiCallback(event, function(data, cb) + local response = lib.callback.await('mdt:' .. event, false, data) + if clientCb then return clientCb(response, cb) end + cb(response) + end) +end + +-- Dashboard +serverNuiCallback('getAnnouncements') +serverNuiCallback('createAnnouncement') +serverNuiCallback('getRecentActivity') +serverNuiCallback('getActiveOfficers') +serverNuiCallback('getWarrants') + +-- Profiles +serverNuiCallback('getAllProfiles') +serverNuiCallback('getProfile') +serverNuiCallback('saveProfileNotes') +serverNuiCallback('isProfileWanted') +serverNuiCallback('updateProfileImage') + +-- Incidents +serverNuiCallback('getIncidents') +serverNuiCallback('deleteIncident') +serverNuiCallback('createIncident') +serverNuiCallback('getIncident') +serverNuiCallback('addOfficer') +serverNuiCallback('removeOfficer') +serverNuiCallback('addCriminal') +serverNuiCallback('removeCriminal') +serverNuiCallback('addEvidence') +serverNuiCallback('getRecommendedWarrantExpiry') +serverNuiCallback('saveCriminal') +serverNuiCallback('removeEvidence') +serverNuiCallback('getOfficers') +serverNuiCallback('getCriminalProfiles') +serverNuiCallback('saveIncidentContents') + +-- Reports +serverNuiCallback('getReports') +serverNuiCallback('getReport') +serverNuiCallback('removeReportOfficer') +serverNuiCallback('removeReportCitizen') +serverNuiCallback('saveReportContents') +serverNuiCallback('removeReportEvidence') +serverNuiCallback('createReport') +serverNuiCallback('addReportOfficer') +serverNuiCallback('addReportEvidence') +serverNuiCallback('addReportCitizen') + +-- Vehicles +serverNuiCallback('getAllVehicles', function(data, cb) + local vehicles = {} + for i = 1, #data do + vehicles[#vehicles+1] = { + plate = data[i].plate, + model = VEHICLES[data[i].vehicle].model, + } + end + + cb(vehicles) +end) + +serverNuiCallback('getVehicle', function(data, cb) + local vehicle = { + plate = data.plate, + model = VEHICLES[data.vehicle].model, + color = utils.GetColor(json.decode(data.mods).color1) or 'Blue', + owner = data.owner, + notes = data.notes, + class = utils.GetVehicleClassById(GetVehicleClassFromName(VEHICLES[data.vehicle].hash)) or 'Unknown', + image = data.image, + knownInformation = json.decode(data.known_information) or {}, + } + + cb(vehicle) +end) +serverNuiCallback('saveVehicleInformation') +serverNuiCallback('saveVehicleNotes') +serverNuiCallback('updateVehicleImage') +serverNuiCallback('createBOLO') +serverNuiCallback('isVehicleBOLO') +serverNuiCallback('getBOLOExpirationDate') +serverNuiCallback('deleteBOLO') +serverNuiCallback('getBolos') +serverNuiCallback('getBolo') + +-- Dispatch +serverNuiCallback('respondToCall') +serverNuiCallback('detachFromCall') +serverNuiCallback('getCalls', function(data, cb) + for _, call in pairs(data) do + call.location = GetStreetNameFromHashKey(GetStreetNameAtCoord(call.coords[1], call.coords[2], 0)) + end + + cb(data) +end) +serverNuiCallback('getUnits') +serverNuiCallback('createUnit') +serverNuiCallback('leaveUnit') +serverNuiCallback('setCallUnits') +serverNuiCallback('setUnitOfficers') +serverNuiCallback('setUnitType') + +-- Roster +serverNuiCallback('fetchRoster') +serverNuiCallback('hireOfficer') +serverNuiCallback('fireOfficer') +serverNuiCallback('setOfficerCallSign') +serverNuiCallback('setOfficerRoles') +serverNuiCallback('setOfficerRank') + +-- Charges +serverNuiCallback('deleteCharge') +serverNuiCallback('createCharge') +serverNuiCallback('editCharge') \ No newline at end of file diff --git a/client/utils.lua b/client/utils.lua new file mode 100644 index 0000000..91ca270 --- /dev/null +++ b/client/utils.lua @@ -0,0 +1,267 @@ +local utils = {} + +local Colors = { + ['0'] = "Metallic Black", + ['1'] = "Metallic Graphite Black", + ['2'] = "Metallic Black Steel", + ['3'] = "Metallic Dark Silver", + ['4'] = "Metallic Silver", + ['5'] = "Metallic Blue Silver", + ['6'] = "Metallic Steel Gray", + ['7'] = "Metallic Shadow Silver", + ['8'] = "Metallic Stone Silver", + ['9'] = "Metallic Midnight Silver", + ['10'] = "Metallic Gun Metal", + ['11'] = "Metallic Anthracite Grey", + ['12'] = "Matte Black", + ['13'] = "Matte Gray", + ['14'] = "Matte Light Grey", + ['15'] = "Util Black", + ['16'] = "Util Black Poly", + ['17'] = "Util Dark silver", + ['18'] = "Util Silver", + ['19'] = "Util Gun Metal", + ['20'] = "Util Shadow Silver", + ['21'] = "Worn Black", + ['22'] = "Worn Graphite", + ['23'] = "Worn Silver Grey", + ['24'] = "Worn Silver", + ['25'] = "Worn Blue Silver", + ['26'] = "Worn Shadow Silver", + ['27'] = "Metallic Red", + ['28'] = "Metallic Torino Red", + ['29'] = "Metallic Formula Red", + ['30'] = "Metallic Blaze Red", + ['31'] = "Metallic Graceful Red", + ['32'] = "Metallic Garnet Red", + ['33'] = "Metallic Desert Red", + ['34'] = "Metallic Cabernet Red", + ['35'] = "Metallic Candy Red", + ['36'] = "Metallic Sunrise Orange", + ['37'] = "Metallic Classic Gold", + ['38'] = "Metallic Orange", + ['39'] = "Matte Red", + ['40'] = "Matte Dark Red", + ['41'] = "Matte Orange", + ['42'] = "Matte Yellow", + ['43'] = "Util Red", + ['44'] = "Util Bright Red", + ['45'] = "Util Garnet Red", + ['46'] = "Worn Red", + ['47'] = "Worn Golden Red", + ['48'] = "Worn Dark Red", + ['49'] = "Metallic Dark Green", + ['50'] = "Metallic Racing Green", + ['51'] = "Metallic Sea Green", + ['52'] = "Metallic Olive Green", + ['53'] = "Metallic Green", + ['54'] = "Metallic Gasoline Blue Green", + ['55'] = "Matte Lime Green", + ['56'] = "Util Dark Green", + ['57'] = "Util Green", + ['58'] = "Worn Dark Green", + ['59'] = "Worn Green", + ['60'] = "Worn Sea Wash", + ['61'] = "Metallic Midnight Blue", + ['62'] = "Metallic Dark Blue", + ['63'] = "Metallic Saxony Blue", + ['64'] = "Metallic Blue", + ['65'] = "Metallic Mariner Blue", + ['66'] = "Metallic Harbor Blue", + ['67'] = "Metallic Diamond Blue", + ['68'] = "Metallic Surf Blue", + ['69'] = "Metallic Nautical Blue", + ['70'] = "Metallic Bright Blue", + ['71'] = "Metallic Purple Blue", + ['72'] = "Metallic Spinnaker Blue", + ['73'] = "Metallic Ultra Blue", + ['74'] = "Metallic Bright Blue", + ['75'] = "Util Dark Blue", + ['76'] = "Util Midnight Blue", + ['77'] = "Util Blue", + ['78'] = "Util Sea Foam Blue", + ['79'] = "Uil Lightning blue", + ['80'] = "Util Maui Blue Poly", + ['81'] = "Util Bright Blue", + ['82'] = "Matte Dark Blue", + ['83'] = "Matte Blue", + ['84'] = "Matte Midnight Blue", + ['85'] = "Worn Dark blue", + ['86'] = "Worn Blue", + ['87'] = "Worn Light blue", + ['88'] = "Metallic Taxi Yellow", + ['89'] = "Metallic Race Yellow", + ['90'] = "Metallic Bronze", + ['91'] = "Metallic Yellow Bird", + ['92'] = "Metallic Lime", + ['93'] = "Metallic Champagne", + ['94'] = "Metallic Pueblo Beige", + ['95'] = "Metallic Dark Ivory", + ['96'] = "Metallic Choco Brown", + ['97'] = "Metallic Golden Brown", + ['98'] = "Metallic Light Brown", + ['99'] = "Metallic Straw Beige", + ['100'] = "Metallic Moss Brown", + ['101'] = "Metallic Biston Brown", + ['102'] = "Metallic Beechwood", + ['103'] = "Metallic Dark Beechwood", + ['104'] = "Metallic Choco Orange", + ['105'] = "Metallic Beach Sand", + ['106'] = "Metallic Sun Bleeched Sand", + ['107'] = "Metallic Cream", + ['108'] = "Util Brown", + ['109'] = "Util Medium Brown", + ['110'] = "Util Light Brown", + ['111'] = "Metallic White", + ['112'] = "Metallic Frost White", + ['113'] = "Worn Honey Beige", + ['114'] = "Worn Brown", + ['115'] = "Worn Dark Brown", + ['116'] = "Worn straw beige", + ['117'] = "Brushed Steel", + ['118'] = "Brushed Black Steel", + ['119'] = "Brushed Aluminium", + ['120'] = "Chrome", + ['121'] = "Worn Off White", + ['122'] = "Util Off White", + ['123'] = "Worn Orange", + ['124'] = "Worn Light Orange", + ['125'] = "Metallic Securicor Green", + ['126'] = "Worn Taxi Yellow", + ['127'] = "Police Car Blue", + ['128'] = "Matte Green", + ['129'] = "Matte Brown", + ['130'] = "Worn Orange", + ['131'] = "Matte White", + ['132'] = "Worn White", + ['133'] = "Worn Olive Army Green", + ['134'] = "Pure White", + ['135'] = "Hot Pink", + ['136'] = "Salmon pink", + ['137'] = "Metallic Vermillion Pink", + ['138'] = "Orange", + ['139'] = "Green", + ['140'] = "Blue", + ['141'] = "Mettalic Black Blue", + ['142'] = "Metallic Black Purple", + ['143'] = "Metallic Black Red", + ['144'] = "hunter green", + ['145'] = "Metallic Purple", + ['146'] = "Metallic Dark Blue", + ['147'] = "Black", + ['148'] = "Matte Purple", + ['149'] = "Matte Dark Purple", + ['150'] = "Metallic Lava Red", + ['151'] = "Matte Forest Green", + ['152'] = "Matte Olive Drab", + ['153'] = "Matte Desert Brown", + ['154'] = "Matte Desert Tan", + ['155'] = "Matte Foilage Green", + ['156'] = "Default Alloy Color", + ['157'] = "Epsilon Blue", + ['158'] = "Pure Gold", + ['159'] = "Brushed Gold", + ['160'] = "MP100" +} + +local Classlist = { + ["0"] = "Compacts", + ["1"] = "Sedans", + ["2"] = "SUVs", + ["3"] = "Coupes", + ["4"] = "Muscle", + ["5"] = "Sport-Classic", + ["6"] = "Sports", + ["7"] = "Super", + ["8"] = "Motorcycles", + ["9"] = "Off-road", + ["10"] = "Industrial", + ["11"] = "Utility", + ["12"] = "Vans", + ["13"] = "Cycles", + ["14"] = "Boats", + ["15"] = "Helicopters", + ["16"] = "Planes", + ["17"] = "Service", + ["18"] = "Emergency", + ["19"] = "Military", + ["20"] = "Commercial", + ["21"] = "Trains", +} + +local weaponTable = { + [584646201] = "CLASS 2: AP-Pistol", + [453432689] = "CLASS 1: Pistol", + [3219281620] = "CLASS 1: Pistol MK2", + [1593441988] = "CLASS 1: Combat Pistol", + [-1716589765] = "CLASS 1: Heavy Pistol", + [-1076751822] = "CLASS 1: SNS-Pistol", + [-771403250] = "CLASS 2: Desert Eagle", + [137902532] = "CLASS 2: Vintage Pistol", + [-598887786] = "CLASS 2: Marksman Pistol", + [-1045183535] = "CLASS 2: Revolver", + [911657153] = "Taser", + [324215364] = "CLASS 2: Micro-SMG", + [-619010992] = "CLASS 2: Machine-Pistol", + [736523883] = "CLASS 2: SMG", + [2024373456] = "CLASS 2: SMG MK2", + [-270015777] = "CLASS 2: Assault SMG", + [171789620] = "CLASS 2: Combat PDW", + [-1660422300] = "CLASS 4: Combat MG", + [3686625920] = "CLASS 4: Combat MG MK2", + [1627465347] = "CLASS 4: Gusenberg", + [-1121678507] = "CLASS 2: Mini SMG", + [-1074790547] = "CLASS 3: Assaultrifle", + [961495388] = "CLASS 3: Assaultrifle MK2", + [-2084633992] = "CLASS 3: Carbinerifle", + [4208062921] = "CLASS 3: Carbinerifle MK2", + [-1357824103] = "CLASS 3: Advancedrifle", + [-1063057011] = "CLASS 3: Specialcarbine", + [2132975508] = "CLASS 3: Bulluprifle", + [1649403952] = "CLASS 3: Compactrifle", + [100416529] = "CLASS 4: Sniperrifle", + [205991906] = "CLASS 4: Heavy Sniper", + [177293209] = "CLASS 4: Heavy Sniper MK2", + [-952879014] = "CLASS 4: Marksmanrifle", + [487013001] = "CLASS 2: Pumpshotgun", + [2017895192] = "CLASS 2: Sawnoff Shotgun", + [-1654528753] = "CLASS 3: Bullupshotgun", + [-494615257] = "CLASS 3: Assaultshotgun", + [-1466123874] = "CLASS 3: Musket", + [984333226] = "CLASS 3: Heavyshotgun", + [-275439685] = "CLASS 2: Doublebarrel Shotgun", + [317205821] = "CLASS 2: Autoshotgun", + [-1568386805] = "CLASS 5: GRENADE LAUNCHER", + [-1312131151] = "CLASS 5: RPG", + [125959754] = "CLASS 5: Compactlauncher" +} + +function utils.GetVehicleClassById(classId) + return Classlist[tostring(classId)] +end + +function utils.GetColor(color) + return Colors[tostring(color)] +end + +function utils.GetVehicleColor(vehicle) + local vehicleColor1, vehicleColor2 = GetVehicleColours(vehicle) + local color1 = Colors[tostring(vehicleColor1)] + local color2 = Colors[tostring(vehicleColor2)] + + if color1 and color2 then return color2 .. " on " .. color1 end + + if color1 then return color1 end + + if color2 then return color2 end + + + return "Unknown" +end + +function utils.GetWeaponName() + local currentWeapon = GetSelectedPedWeapon(cache.ped) + return weaponTable[currentWeapon] or "Unknown" +end + +return utils \ No newline at end of file diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..7e9f162 --- /dev/null +++ b/config.lua @@ -0,0 +1,6 @@ +return { + debug = true, + framework = 'qb_core', + defaultAlertsDelay = 10, + fivemanageAPIKey = 'Aw5ZTKQ1x7SHnqc2CfpzaU9cdwp3yFMj', +} \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua new file mode 100644 index 0000000..c9a03b8 --- /dev/null +++ b/fxmanifest.lua @@ -0,0 +1,40 @@ +--[[ FX Information ]]-- +fx_version 'cerulean' +use_experimental_fxv2_oal 'yes' +lua54 'yes' +game 'gta5' + +--[[ Resource Information ]]-- +name 'bub-mdt' +version '0.0.0' +license 'GPL-3.0-or-later' +author 'Bubble' + +--[[ Manifest ]]-- +ox_libs { + 'locale', +} + +shared_scripts { + '@ox_lib/init.lua', +} + +client_scripts { + 'client/main.lua', +} + +server_scripts { + '@oxmysql/lib/MySQL.lua', + 'server/main.lua', +} + +ui_page 'web/build/index.html' + +files { + 'web/build/index.html', + 'web/build/**/*', + 'locales/*.json', + 'client/*.lua', + 'client/framework/*.lua', + 'config.lua' +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 0000000..e3ad47c --- /dev/null +++ b/locales/en.json @@ -0,0 +1,170 @@ +{ + "configuration": "Configuration", + "logout": "Logout", + "welcome_back": "Welcome back, %s %s", + "active_officers": "Active Officers", + "callsign": "Callsign", + "attached_unit": "Attached Unit", + "active_warrants": "Active Warrants", + "expires_in": "Expires in", + "no_warrants_found": "No warrants found", + "recent_activity": "Recent Activity", + "type": "Type", + "category": "Category", + "done_by": "Done by", + "time_ago": "Time ago", + "dispatch": "Dispatch", + "responding_units": "Responding Units", + "no_recent_calls_found": "No recent calls found", + "announcements": "Announcements", + "create_announcement": "Create announcement", + "all_announcements": "All Announcements", + "no_announcements_found": "No announcements found", + "create": "Create", + "view_all": "View all", + "profiles": "Profiles", + "search": "Search...", + "dob": "DOB", + "citizen_id": "Citizen ID", + "no_profiles_found": "No profiles found", + "no_profile_selected": "No profile selected", + "edit_citizen": "Edit Citizen", + "no_cardid_registered": "No %s registered", + "related_reports": "Related reports", + "no_related_reports": "No related reports", + "related_incidents": "Related incidents", + "no_related_incidents": "No related incidents", + "remove_charge": "Remove Charge", + "no_incident_selected": "No incident selected", + "add_criminal": "Add Criminal", + "unlink": "Unlink", + "officers_involved": "Officers involved", + "add_officer": "Add officer", + "remove_officer": "Remove officer", + "remove_officer_confirm": "Are you sure you want to remove %s %s (%s) from involved officers?", + "confirm": "Confirm", + "cancel": "Cancel", + "evidence": "Evidence", + "add_evidence": "Add evidence", + "incidents": "Incidents", + "create_incident": "Create incident", + "remove_evidence": "Remove evidence", + "remove_evidence_confirm": "Are you sure you want to remove %s from evidence?", + "months": "month(s)", + "remove_criminal": "Remove criminal", + "remove_criminal_confirm": "Remove %s %s? Removing them will also remove the charges from their profile.", + "go_to_profile": "Go to profile", + "save_criminal": "Save criminal", + "edit_charges": "Edit charges", + "issue_warrant": "Issue warrant", + "issue_warrant_description": "Suspect hasn't been processed and charged", + "warrant_expiration_date": "Warrant expiration date", + "reduction": "Reduction", + "no_reduction": "No reduction", + "time": "Time", + "fine": "Fine", + "pleaded_guilty": "Pleaded guilty", + "processed": "Processed", + "current_charges": "Current Charges", + "all_charges": "All Charges", + "points": "point(s)", + "add_charge": "Add Charge", + "incident_title": "Incident title", + "incident_title_required": "Incident title is required", + "no_officers_found": "No officers found", + "image_label_required": "Image label is required", + "image_url_required": "Image URL is required", + "image_label": "Image label", + "image_url": "Image URL", + "take_picture": "Take picture", + "no_report_selected": "No report selected", + "citizens_involved": "Citizens involved", + "add_citizen": "Add citizen", + "remove_citizen_confirm": "Are you sure you want to remove %s %s from involved citizens", + "images": "Images", + "add_image": "Add image", + "reports": "Reports", + "create_report": "Create report", + "report_title": "Report title", + "report_title_required": "Report title is required", + "no_citizens_found": "No citizens found", + "units": "Units", + "manage_members": "Manage members", + "leave_unit": "Leave Unit", + "create_unit": "Create unit", + "unit_officers": "Unit officers", + "unit_officers_description": "Set officers assigned to this unit", + "unit_vehicle_type": "Unit vehicle type", + "active_calls": "Active Calls", + "respond_units_amount": "Responding units (%s)", + "find_on_map": "Find on map", + "set_waypoint": "Set waypoint", + "detach_from_call": "Detach from call", + "respond": "Respond", + "manage_roster": "Manage roster", + "roster": "Roster", + "members": "members", + "members_capitalized": "Members", + "hire_officer": "Hire officer", + "today": "Today", + "yesterday": "Yesterday", + "set_callsign": "Set callsign", + "set_rank": "Set rank", + "set_roles": "Set roles", + "fire_officer": "Fire officer", + "fire_officer_description": "Are you sure you want to fire %s %s?", + "officer": "Officer", + "apu": "APU", + "air": "AIR", + "mc": "MC", + "k9": "K9", + "fto": "FTO", + "last_active": "Last active", + "role": "Role", + "rank": "Rank", + "callsign_in_use": "Callsign already in use", + "citizen_id_already_hired": "The citizen with this citizen id is already hired", + "citizen_id_you_want_to_hire": "Citizen ID of the citizen you want to hire", + "callsign_you_want_to_hire": "Callsign of the new officer you want to hire", + "create_charge": "Create Charge", + "charge_label": "Charge Label", + "charge_description": "Charge Description", + "charge_category": "Charge Category", + "charge_fine": "Charge Fine", + "charge_jailtime": "Charge Jailtime", + "charge_points": "Charge Points", + "charge_type": "Charge Type", + "delete_charge": "Delete charge", + "delete_charge_confirm": "Are you sure you want to delete %s", + "edit_charge": "Edit Charge", + "edit": "Edit", + "delete_incident": "Delete Incident", + "delete_incident_confirm": "Are you sure you want to delete %s", + "change_picture": "Change picture", + "image": "Image", + "avatar_description": "Image URL to use as the profile image", + "vehicles": "Vehicles", + "no_vehicle_selected": "No vehicle selected", + "vehicle_information": "Vehicle Information", + "save_vehicle": "Save vehicle", + "known_information": "Known information", + "wanted": "Wanted", + "mark_unwanted": "MARK UNWANTED", + "mark_wanted": "MARK WANTED", + "select_items": "Select items", + "create_bolo": "Create BOLO", + "plate": "Plate", + "reason": "Reason", + "bolo_expiration_date": "BOLO expiration date", + "delete_bolo": "Delete BOLO", + "delete_bolo_confirm": "Are you sure you want to delete the BOLO for: %s", + "avatar_description_vehicle": "Image URL to use as the vehicle image", + "bolo": "BOLO", + "bolos": "BOLOS", + "bolo_expires_at": "BOLO expires at:", + "expires_at": "Expires at:", + "no_bolos_found": "No bolos found", + "goto_vehicle": "Go to vehicle", + "already_responding_or_part_of_unit": "You are already responding or not a part of a unit", + "responded_to_recent_call": "You responded to the recent call" +} diff --git a/server/calls.lua b/server/calls.lua new file mode 100644 index 0000000..b7cc754 --- /dev/null +++ b/server/calls.lua @@ -0,0 +1,103 @@ +local activeCalls = {} + +local callId = 0 +local units = require 'server.units' +local officers = require 'server.officers' +local utils = require 'server.utils' + +function createCall(data) + activeCalls[callId] = { + id = callId, + code = data.code, + offense = data.offense, + units = {}, + coords = {data.coords[2], data.coords[1]}, + blip = data.blip, + isEmergency = data.isEmergency, + time = os.time() * 1000, + location = '', + info = data.info + } + + officers.triggerEvent('mdt:createCall', { id = callId, call = activeCalls[callId] }) + officers.triggerEvent('mdt:addBlip', { blipCoords = data.blipCoords, text = '(' .. data.code .. ') ' .. data.offense }) + callId += 1 + + return callId - 1 +end + +exports('createCall', createCall) + +function updateCallCoords(callId, coords) + if not activeCalls[callId] then return end + + activeCalls[callId].coords = coords + + officers.triggerEvent('mdt:updateCallCoords', { id = callId, coords = coords }) +end + +exports('updateCallCoords', updateCallCoords) + +local function removeExpiredCalls() + local currentTime = os.time() * 1000 -- Får nuværende tid i millisekunder + local amountRemoved = 0 + for id, call in pairs(activeCalls) do + if currentTime - call.time >= 1800000 then -- 1800000 millisekunder svarer til 30 minutter + activeCalls[id] = nil + amountRemoved += 1 + end + end + + officers.triggerEvent('mdt:updateCalls', { calls = utils.cleanTable(activeCalls) }) +end + +utils.registerCallback('mdt:getCalls', function(source, data) + return activeCalls +end) + +utils.registerCallback('mdt:respondToCall', function(source, id) + local playerUnitId = Player(source).state.mdtUnitId + + if not playerUnitId or activeCalls[id].units[playerUnitId] then + TriggerClientEvent('mdt:client:notify', source, locale('already_responding_or_part_of_unit'), 'error') + return false + end + + activeCalls[id].units[playerUnitId] = units.getUnit(playerUnitId) + + officers.triggerEvent('mdt:editCallUnits', { id = id, units = activeCalls[id].units }) + TriggerClientEvent('mdt:client:notify', source, locale('responded_to_recent_call'), 'success') + + return true +end) + +utils.registerCallback('mdt:detachFromCall', function(source, id) + local playerUnitId = Player(source).state.mdtUnitId + if not playerUnitId then return false end + + if not activeCalls[id].units[playerUnitId] then return false end + + activeCalls[id].units[playerUnitId] = nil + + officers.triggerEvent('mdt:editCallUnits', { id = id, units = activeCalls[id].units }) + + return true +end) + +utils.registerCallback('mdt:setCallUnits', function(source, data) + local officer = officers.get(source) + + activeCalls[data.id].units = {} + for i = 1, #data.units do + local unitId = data.units[i] + activeCalls[data.id].units[unitId] = units.getUnit(tostring(unitId)) + end + + officers.triggerEvent('mdt:setCallUnits', { id = data.id, units = activeCalls[data.id].units }) + + return true +end) + +lib.cron.new('*/5 * * * *', function() + removeExpiredCalls() +end) \ No newline at end of file diff --git a/server/charges.lua b/server/charges.lua new file mode 100644 index 0000000..f31bdd4 --- /dev/null +++ b/server/charges.lua @@ -0,0 +1,33 @@ +local utils = require 'server.utils' + +local chargeCategories = { + ['OFFENSES AGAINST PERSONS'] = 'Offenses Against Persons', + ['OFFENSES INVOLVING THEFT'] = 'Offenses Involving Theft', + ['OFFENSES INVOLVING FRAUD'] = 'Offenses Involving Fraud', + ['OFFENSES INVOLVING DAMAGE TO PROPERTY'] = 'Offenses Involving Damage To Property', + ['OFFENSES AGAINST PUBLIC ADMINISTRATION'] = 'Offenses Against Public Administration', + ['OFFENSES AGAINST PUBLIC ORDER'] = 'Offenses Against Public Order', + ['OFFENSES AGAINST HEALTH AND MORALS'] = 'Offenses Agaisnt Health And Morals', + ['OFFENSES AGAINST PUBLIC SAFETY'] = 'Offenses Against Public Safety', + ['OFFENSES INVOLVING THE OPERATION OF A VEHICLE'] = 'Offenses Involving The Operation Of A Vehicle', + ['OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE'] = 'Offenses Involving The Well-Being Of Wildlife', +} + +local charges = {} + +for category in pairs(chargeCategories) do + charges[category] = {} +end + +MySQL.ready(function() + local dbCharges = MySQL.rawExecute.await('SELECT * FROM `mdt_offenses`') + + for i = 1, #dbCharges do + local charge = dbCharges[i] + charges[charge.category][#charges[charge.category]+1] = charge + end +end) + +utils.registerCallback('mdt:getAllCharges', function() + return charges +end) \ No newline at end of file diff --git a/server/commands.lua b/server/commands.lua new file mode 100644 index 0000000..62d2887 --- /dev/null +++ b/server/commands.lua @@ -0,0 +1,36 @@ +local officers = require 'server.officers' + +lib.addCommand('mdt', { + help = 'Opens MDT' +}, function(source) + TriggerClientEvent('mdt:OpenMDT', source) +end) + +lib.addCommand('createOfficer', { + help = 'Creates a new officer in the MDT', + params = { + { name = 'citizenid', type = 'string', help = 'The citizenid of the player' }, + { name = 'callsign', help = 'The callsign for the officer' }, + }, + restricted = 'group.admin', +}, function(source, args) + TriggerEvent('mdt:server:CreateMDTProfile', { citizenid = args.citizenid, callsign = args.callsign }) +end) + +lib.addCommand('closeMDT', { + help = 'Closes MDT' +}, function(source) + local hasPerms = officers.get(source) and true or false + if hasPerms then + TriggerClientEvent('mdt:client:CloseMDT', source) + end +end) + +lib.addCommand('closeDispatch', { + help = 'Closes Mini Dispatch' +}, function(source) + local hasPerms = officers.get(source) and true or false + if hasPerms then + TriggerClientEvent('mdt:client:CloseMiniDispatch', source) + end +end) \ No newline at end of file diff --git a/server/db.lua b/server/db.lua new file mode 100644 index 0000000..4ff3259 --- /dev/null +++ b/server/db.lua @@ -0,0 +1,444 @@ +local db = {} +local config = require 'config' +local framework = require(('server.framework.%s'):format(config.framework)) +local profileCards = require 'server.profileCards' + +function createRecentActivity(citizenid, category, type, activityid) + local insertRecentActivityQuery = [[ + INSERT INTO `mdt_recent_activity` (`citizenid`, `category`, `type`, `activityid`) + VALUES (?, ?, ?, ?); + ]] + + local success = MySQL.prepare.await(insertRecentActivityQuery, { citizenid, category, type, activityid }) + return success +end + +-- Dashboard +function db.selectAnnouncements() + return framework.getAnnouncements() +end + +function db.createAnnouncement(creator, contents) + return MySQL.prepare.await('INSERT INTO `mdt_announcements` (`creator`, `contents`) VALUES (?, ?)', { creator, contents }) +end + +local selectRecentActivities = [[ + SELECT + activity.citizenid, + p.charinfo, + activity.category, + activity.type, + DATE_FORMAT(activity.date, "%Y-%m-%d %T") as date, + activity.activityid + FROM + mdt_recent_activity activity + JOIN + players p + ON + activity.citizenid = p.citizenid + ORDER BY + activity.date DESC + LIMIT 6; +]] + +function db.getRecentActivity() + local queryResult = MySQL.rawExecute.await(selectRecentActivities) + local recentActivity = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + recentActivity[#recentActivity+1] = { + type = v.type, + category = v.category, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + date = v.date, + activityid = v.activityid, + citizenid = v.citizenid, + } + end + + return recentActivity +end + +function db.getWarrants() + return framework.getWarrants() +end + +-- Profiles +function db.selectAllProfiles() + return framework.getAllProfiles() +end + +function db.selectCharacterProfile(citizenid) + local parameters = { citizenid } + local profile = framework.getCharacterProfile(parameters) + + if not profile then return end + + local cards = profileCards.getAll() + + for i = 1, #cards do + local card = cards[i] + profile[card.id] = card.getData(profile) + end + + profile.relatedReports = MySQL.rawExecute.await('SELECT DISTINCT `id`, `title`, `author`, DATE_FORMAT(`date`, "%Y-%m-%d") as date FROM `mdt_reports` r JOIN `mdt_reports_citizens` rc ON r.id = rc.reportid WHERE `citizenid` = ?', parameters) or {} + profile.relatedIncidents = MySQL.rawExecute.await('SELECT DISTINCT `id`, `title`, `author`, DATE_FORMAT(`date`, "%Y-%m-%d") as date FROM `mdt_incidents` a LEFT JOIN `mdt_incidents_charges` b ON b.incidentid = a.id WHERE `citizenid` = ?', parameters) or {} + + return profile +end + +function db.updateProfileNotes(citizenid, notes) + createRecentActivity(citizenid, 'profiles', 'updated') + return MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `image`, `notes`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `notes` = ?', { citizenid, nil, notes, notes }) +end + +function db.isProfileWanted(citizenId) + return framework.isProfileWanted(citizenId) +end + +function db.updateProfileImage(citizenid, imageURL) + return MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `image`, `notes`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `image` = ?', { citizenid, imageURL, nil, imageURL }) +end + +function db.addFingerprintToProfile(citizenid, fingerprint) + return MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `fingerprint`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `fingerprint` = ?', { citizenid, fingerprint, fingerprint }) +end + +function db.createMDTProfile(data) + return MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `callsign`, `lastActive`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `callsign` = ?, `lastActive` = ?', { data.citizenid, data.callsign, os.date("%Y-%m-%d %H:%M:%S"), data.callsign, os.date("%Y-%m-%d %H:%M:%S") }) +end + +-- Incidents + +local selectIncidents = 'SELECT `id`, `title`, `author`, DATE_FORMAT(`date`, "%Y-%m-%d %T") as date FROM `mdt_incidents`' +local selectIncidentsById = selectIncidents .. 'WHERE `id` = ?' + +function db.selectIncidentById(id) + return MySQL.prepare.await('SELECT `id`, `title`, `description` FROM `mdt_incidents` WHERE `id` = ?', { id }) +end + +local selectIncidentsDesc = selectIncidents .. 'ORDER BY `id` DESC' + +function db.selectIncidents() + return MySQL.rawExecute.await(selectIncidentsDesc) +end + +function db.createIncident(title, author, citizenid) + local response = MySQL.insert.await('INSERT INTO `mdt_incidents` (`title`, `author`) VALUES (?, ?)', { title, author }) + + createRecentActivity(citizenid, 'incidents', 'created', response) + + return response +end + +function db.deleteIncident(incidentId, citizenid) + local queries = { + { 'DELETE FROM `mdt_recent_activity` WHERE `activityid` = ?', { incidentId } }, + { 'DELETE FROM `mdt_incidents_evidence` WHERE `incidentid` = ?', { incidentId } }, + { 'DELETE FROM `mdt_incidents_charges` WHERE `incidentid` = ?', { incidentId } }, + { 'DELETE FROM `mdt_incidents_officers` WHERE `incidentid` = ?', { incidentId } }, + { 'DELETE FROM `mdt_incidents_criminals` WHERE `incidentid` = ?', { incidentId } }, + { 'DELETE FROM `mdt_incidents` WHERE `id` = ?', { incidentId } }, + } + + local result = MySQL.transaction.await(queries) + + -- Add logs + createRecentActivity(citizenid, 'incidents', 'deleted', incidentId) + + return result +end + +function db.selectOfficersInvolved(incidentId) + return framework.getOfficersInvolved({ incidentId }) +end + +function db.selectEvidence(incidentId) + return MySQL.rawExecute.await('SELECT `label`, `image` FROM `mdt_incidents_evidence` WHERE incidentid = ?', { incidentId }) +end + +function db.selectCriminalsInvolved(incidentId) + local parameters = { incidentId } + local criminals = framework.getCriminalsInvolved(parameters) or {} + local charges = framework.getCriminalCharges(parameters) or {} + + for _, criminal in pairs(criminals) do + criminal.charges = {} + local chargesN = 0 + + criminal.penalty = { + time = 0, + fine = 0, + reduction = criminal.reduction, + points = 0 + } + + for _, charge in pairs(charges) do + if charge.label and charge.citizenid == criminal.citizenid then + charge.citizenid = nil + criminal.penalty.time += charge.time or 0 + criminal.penalty.fine += charge.fine or 0 + criminal.penalty.points += charge.points or 0 + chargesN += 1 + criminal.charges[chargesN] = charge + end + end + + if criminal.warrantExpiry then + criminal.issueWarrant = true + end + + criminal.processed = criminal.processed or false + criminal.pleadedGuilty = criminal.pleadedGuilty or false + end + + return criminals +end + +function db.addOfficer(incidentId, citizenId) + return MySQL.prepare.await('INSERT INTO `mdt_incidents_officers` (`incidentid`, `citizenid`) VALUES (?, ?)', { incidentId, citizenId }) +end + +function db.removeOfficer(incidentId, citizenId) + return MySQL.prepare.await('DELETE FROM `mdt_incidents_officers` WHERE `incidentid` = ? AND `citizenid` = ?', { incidentId, citizenId }) +end + +function db.addCriminal(incidentId, citizenId) + return MySQL.prepare.await('INSERT INTO `mdt_incidents_criminals` (`incidentid`, `citizenid`) VALUES (?, ?)', { incidentId, citizenId }) +end + +function db.removeCriminal(incidentId, citizenId) + return MySQL.prepare.await('DELETE FROM `mdt_incidents_criminals` WHERE `incidentid` = ? AND `citizenid` = ?', { incidentId, citizenId }) +end + +function db.addEvidence(id, label, image) + return MySQL.prepare.await('INSERT INTO `mdt_incidents_evidence` (`incidentid`, `label`, `image`) VALUES (?, ?, ?)', { id, label, image }) +end + +function db.removeEvidence(id, label, image) + return MySQL.prepare.await('DELETE FROM `mdt_incidents_evidence` WHERE `incidentid` = ? AND `label` = ? AND `image` = ?', { id, label, image }) +end + +function db.updateIncidentContents(id, value) + return MySQL.prepare.await('UPDATE `mdt_incidents` SET `description` = ? WHERE `id` = ?', { value, id }) +end + +function db.createWarrant(incidentId, citizenId, expiry) + local warrantExists = MySQL.prepare.await('SELECT COUNT(1) FROM `mdt_warrants` WHERE `incidentid` = ? AND `citizenid` = ?', { incidentId, citizenId }) > 0 + + if warrantExists then + return MySQL.prepare.await('UPDATE `mdt_warrants` SET `expiresAt` = ? WHERE `incidentid` = ? AND `citizenid` = ?', { expiry, incidentId, citizenId }) + end + + return MySQL.prepare.await('INSERT INTO `mdt_warrants` (`incidentid`, `citizenid`, `expiresAt`) VALUES (?, ?, ?)', { incidentId, citizenId, expiry }) +end + +function db.removeWarrant(incidentId, citizenId) + return MySQL.prepare.await('DELETE FROM `mdt_warrants` WHERE `incidentid` = ? AND `citizenid` = ?', { incidentId, citizenId }) +end + +function db.removeOldWarrants() + return MySQL.prepare.await('DELETE FROM `mdt_warrants` WHERE `expiresAt` < (NOW() - INTERVAL 1 HOUR)') +end + +function db.saveCriminal(incidentId, criminal, officerCitizenid) + createRecentActivity(officerCitizenid, 'incidents', 'updated', incidentId) + local queries = { + { 'DELETE FROM `mdt_incidents_charges` WHERE `incidentId` = ? AND `citizenid` = ?', { incidentId, criminal.citizenid } }, + { 'UPDATE IGNORE `mdt_incidents_criminals` SET `reduction` = ?, `warrantExpiry` = ?, `processed` = ?, `pleadedGuilty` = ? WHERE `incidentId` = ? AND `citizenid` = ?', { criminal.penalty.reduction, criminal.issueWarrant and criminal.warrantExpiry or nil, criminal.processed, criminal.pleadedGuilty, incidentId, criminal.citizenid } }, + } + local queryN = #queries + + if next(criminal.charges) then + for _, v in pairs(criminal.charges) do + queryN += 1 + queries[queryN] = { 'INSERT INTO `mdt_incidents_charges` (`incidentId`, `citizenid`, `charge`, `type`, `count`, `time`, `fine`, `points`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', { incidentId, criminal.citizenid, v.label, v.type, v.count, v.time, v.fine, v.points } } + end + end + + return MySQL.transaction.await(queries) +end + +function db.getOfficers() + return framework.getOfficers() +end + +function db.searchCharacters() + return framework.getCharacters() +end + +-- Reports +local selectReports = 'SELECT `id`, `title`, `author`, DATE_FORMAT(`date`, "%Y-%m-%d %T") as date FROM `mdt_reports`' +local selectReports = selectReports .. 'ORDER BY `id` DESC' + +function db.selectReportById(id) + return MySQL.prepare.await('SELECT `id`, `title`, `description` FROM `mdt_reports` WHERE `id` = ?', { id }) +end + +function db.selectReports() + return MySQL.rawExecute.await(selectReports) +end + +function db.selectOfficersInvolvedReport(reportId) + return framework.getOfficersInvolvedReport({ reportId }) +end + +function db.selectEvidenceReport(reportId) + return MySQL.rawExecute.await('SELECT `label`, `image` FROM `mdt_reports_evidence` WHERE reportid = ?', { reportId }) +end + +function db.selectCitizensInvolvedReport(reportId) + return framework.getCitizensInvolvedReport({ reportId }) +end + +function db.removeReportOfficer(reportId, citizenId) + return MySQL.prepare.await('DELETE FROM `mdt_reports_officers` WHERE `reportid` = ? AND `citizenid` = ?', { reportId, citizenId }) +end + +function db.removeReportCitizen(reportId, citizenId) + return MySQL.prepare.await('DELETE FROM `mdt_reports_citizens` WHERE `reportid` = ? AND `citizenid` = ?', { reportId, citizenId }) +end + +function db.updateReportContents(id, value) + return MySQL.prepare.await('UPDATE `mdt_reports` SET `description` = ? WHERE `id` = ?', { value, id }) +end + +function db.removeReportEvidence(id, label, image) + return MySQL.prepare.await('DELETE FROM `mdt_reports_evidence` WHERE `reportid` = ? AND `label` = ? AND `image` = ?', { id, label, image }) +end + +function db.createReport(title, author, citizenid) + local response = MySQL.insert.await('INSERT INTO `mdt_reports` (`title`, `author`) VALUES (?, ?)', { title, author }) + + createRecentActivity(citizenid, 'reports', 'created', response) + + return response +end + +function db.addReportOfficer(reportId, citizenId) + return MySQL.prepare.await('INSERT INTO `mdt_reports_officers` (`reportid`, `citizenid`) VALUES (?, ?)', { reportId, citizenId }) +end + +function db.addReportEvidence(id, label, image) + return MySQL.prepare.await('INSERT INTO `mdt_reports_evidence` (`reportid`, `label`, `image`) VALUES (?, ?, ?)', { id, label, image }) +end + +function db.addReportCitizen(reportId, citizenId) + return MySQL.prepare.await('INSERT INTO `mdt_reports_citizens` (`reportid`, `citizenid`) VALUES (?, ?)', { reportId, citizenId }) +end + +-- Vehicles +function db.selectVehicles() + return framework.getVehicles() +end + +function db.selectVehicle(plate) + return framework.getVehicle(plate) +end + +function db.updateVehicleInformation(plate, knownInformation) + local query = [[ + INSERT INTO `mdt_vehicles` (`plate`, `image`, `notes`, `known_information`) + VALUES (?, NULL, NULL, ?) + ON DUPLICATE KEY UPDATE `known_information` = VALUES(`known_information`) + ]] + + return MySQL.prepare.await(query, { plate, json.encode(knownInformation) }) +end + +function db.updateVehicleNotes(plate, notes) + return MySQL.prepare.await('INSERT INTO `mdt_vehicles` (`plate`, `image`, `notes`, `known_information`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `notes` = ?', { plate, nil, notes, nil, notes }) +end + +function db.isVehicleBOLO(plate) + local response = MySQL.rawExecute.await('SELECT * FROM `mdt_bolos` WHERE `plate` = ?', { + plate + }) + + return response[1] and true or false +end + +function db.getBOLOExpirationDate(plate) + local response = MySQL.prepare.await('SELECT DATE_FORMAT(`expiresAt`, "%d-%m-%Y") FROM `mdt_bolos` WHERE plate = ?', { plate }) + return response +end + +function db.updateVehicleImage(plate, imageURL) + return MySQL.prepare.await('INSERT INTO `mdt_vehicles` (`plate`, `image`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `image` = ?', { plate, imageURL, imageURL }) +end + +function db.createBOLO(plate, expirationDate, reason) + local boloExists = MySQL.prepare.await('SELECT COUNT(1) FROM `mdt_bolos` WHERE `plate` = ?', { plate }) > 0 + + if boloExists then + return MySQL.prepare.await('UPDATE `mdt_bolos` SET `reason` = ?, `expiresAt` = ? WHERE `plate` = ?', { reason, expirationDate, plate }) + end + + return MySQL.prepare.await('INSERT INTO `mdt_bolos` (`plate`, `reason`, `expiresAt`) VALUES (?, ?, ?)', { plate, reason, expirationDate }) +end + +function db.deleteBOLO(plate) + return MySQL.prepare.await('DELETE FROM `mdt_bolos` WHERE `plate` = ?', { plate }) +end + +function db.removeOldBolos() + return MySQL.prepare.await('DELETE FROM `mdt_bolos` WHERE `expiresAt` < (NOW() - INTERVAL 1 HOUR)') +end + +function db.getBolos() + return MySQL.rawExecute.await('SELECT `plate`, `reason`, DATE_FORMAT(`expiresAt`, "%d-%m-%Y") as expiresAt FROM `mdt_bolos`') +end + +function db.getBolo(plate) + return MySQL.prepare.await('SELECT `plate`, `reason`, DATE_FORMAT(`expiresAt`, "%d-%m-%Y") as expiresAt FROM `mdt_bolos` WHERE plate = ?', { + plate + }) +end + +-- Roster +function db.selectOfficerCallSign(callsign) + return MySQL.prepare.await('SELECT `callsign` FROM `mdt_profiles` WHERE callsign = ?', { callsign }) +end + +function db.updateOfficerCallSign(citizenid, callsign) + return MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `image`, `notes`, `callSign`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `callsign` = ?', { citizenid, nil, nil, callsign, callsign }) +end + +-- Charges +function db.deleteCharge(label) + return MySQL.prepare.await('DELETE FROM `mdt_offenses` WHERE `label` = ?', { label }) +end + +function db.createCharge(data) + return MySQL.prepare.await('INSERT INTO `mdt_offenses` (`label`, `type`, `category`, `description`, `time`, `fine`, `points`) VALUES (?, ?, ?, ?, ?, ?, ?)', { + data.label, + data.type, + data.category, + data.description, + data.time, + data.fine, + data.points + }) +end + +function db.editCharge(label, fine, time, points) + return MySQL.prepare.await('UPDATE `mdt_offenses` SET `time` = ?, `fine` = ?, `points` = ? WHERE `label` = ?', { fine, time, points, label }) +end + +function db.setOfficerRoles(data) + MySQL.prepare.await('UPDATE `mdt_profiles` SET `apu` = ?, `air` = ?, `mc` = ?, `k9` = ?, `fto` = ? WHERE `citizenid` = ?', + { + data.roles.apu, + data.roles.air, + data.roles.mc, + data.roles.k9, + data.roles.fto, + data.citizenid + }) + + return true +end + +return db \ No newline at end of file diff --git a/server/framework/qb_core.lua b/server/framework/qb_core.lua new file mode 100644 index 0000000..deee4ea --- /dev/null +++ b/server/framework/qb_core.lua @@ -0,0 +1,630 @@ +local officers = require 'server.officers' +local utils = require 'server.utils' +local config = require 'config' +local QBCore = exports['qb-core']:GetCoreObject() + +local function addOfficer(playerId) + if officers.get(playerId) then return end + + local player = exports.qbx_core:GetPlayer(playerId) + if player and player.PlayerData.job.type == 'leo' then + officers.add(playerId, player.PlayerData.charinfo.firstname, player.PlayerData.charinfo.lastname, player.PlayerData.citizenid) + MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `image`, `notes`, `lastActive`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `lastActive` = NOW()', { player.PlayerData.citizenid, nil, nil }) + end +end + +CreateThread(function() + for _, playerId in pairs(GetPlayers()) do + addOfficer(tonumber(playerId)) + end +end) + +RegisterNetEvent('QBCore:Server:OnPlayerLoaded', function() + addOfficer(source) +end) + +AddEventHandler("QBCore:Server:OnJobUpdate", function(src, job) + local officer = officers.get(src) + + if officer then + if job.name ~= 'police' then + return officers.remove(src) + end + + return + end + + addOfficer(src) +end) + +RegisterNetEvent('QBCore:Server:OnPlayerUnload', function(playerId) + local officer = officers.get(playerId) + + if officer then + officers.remove(playerId) + end +end) + +local qb = {} + +-- Dashboard +function qb.getAnnouncements() + local announcements = MySQL.rawExecute.await([[ + SELECT + a.id, + a.contents, + a.creator AS citizenid, + b.charinfo, + c.image, + DATE_FORMAT(a.createdAt, "%Y-%m-%d %T") AS createdAt + FROM + `mdt_announcements` a + LEFT JOIN + `players` b + ON + b.citizenid = a.creator + LEFT JOIN + `mdt_profiles` c + ON + c.citizenid = a.creator + ]]) + + local result = {} + for i = 1, #announcements do + local charinfo = json.decode(announcements[i].charinfo) + table.insert(result, { + id = announcements[i].id, + contents = announcements[i].contents, + citizenid = announcements[i].citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + image = announcements[i].image, + createdAt = announcements[i].createdAt + }) + end + + return result +end + +local selectWarrants = [[ + SELECT + warrants.incidentid, + players.citizenid, + players.charinfo, + DATE_FORMAT(warrants.expiresAt, "%Y-%m-%d %T") AS expiresAt, + c.image + FROM + `mdt_warrants` warrants + LEFT JOIN + `players` + ON + warrants.citizenid = players.citizenid + LEFT JOIN + `mdt_profiles` c + ON + c.citizenid = players.citizenid +]] + +function qb.getWarrants() + local queryResult = MySQL.rawExecute.await(selectWarrants, {}) + local warrants = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + warrants[#warrants+1] = { + incidentid = v.incidentid, + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + expiresAt = v.expiresAt, + image = v.image + } + end + + return warrants +end + +function qb.getCharacterProfile(parameters) + local result = MySQL.rawExecute.await([[ + SELECT + a.charinfo, + a.metadata, + a.citizenid, + b.image, + b.notes, + b.fingerprint + FROM + `players` a + LEFT JOIN + `mdt_profiles` b + ON + b.citizenid = a.citizenid + WHERE + a.citizenid = ? + ]], parameters)?[1] + local profile + + if result then + local charinfo = json.decode(result.charinfo) + local metadata = json.decode(result.metadata) + + profile = { + citizenid = result.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + dob = charinfo.birthdate, + phoneNumber = '', -- Get phone number, example: exports["lb-phone"]:GetEquippedPhoneNumber(result.citizenid) + fingerprint = result.fingerprint or 'Unknown', + notes = result.notes, + image = result.image, + } + end + + return profile +end + +-- Profiles +local selectProfiles = [[ + SELECT + players.citizenid, + players.charinfo, + profile.image + FROM + players + LEFT JOIN + mdt_profiles profile + ON + profile.citizenid = players.citizenid +]] + +function qb.getAllProfiles() + local profilesResult = MySQL.rawExecute.await(selectProfiles, {}) + local profiles = {} + + for _, v in pairs(profilesResult) do + local charinfo = json.decode(v.charinfo) + profiles[#profiles+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + dob = charinfo.birthdate, + image = v.image, + } + end + + return profiles +end + +function qb.getDriverPoints(citizenid) + local result = MySQL.rawExecute.await('SELECT SUM(COALESCE(points, 0) * COALESCE(count, 1)) AS total_points FROM mdt_incidents_charges WHERE citizenid = ?', { citizenid })?[1] + if (result.total_points) then return result.total_points end + + return 0 +end + +function qb.isProfileWanted(citizenid) + local response = MySQL.rawExecute.await('SELECT * FROM `mdt_warrants` WHERE `citizenid` = ?', { + citizenid + }) + + return response[1] and true or false +end + +function qb.getVehiclesForProfile(parameters) + local vehicles = MySQL.rawExecute.await('SELECT `plate`, `vehicle` FROM `player_vehicles` WHERE `citizenid` = ?', parameters) or {} + + for _, v in pairs(vehicles) do + v.label = QBCore.Shared.Vehicles[v.vehicle]?.name or v.vehicle + v.vehicle = nil + end + + return vehicles +end + +function qb.getLicenses(citizenid) + local player = exports.qbx_core:GetPlayerByCitizenId(citizenid) + if not player then + local result = MySQL.rawExecute.await([[ + SELECT + metadata + FROM + players + WHERE + citizenid = ? + ]], { citizenid })?[1] + local metadata = json.decode(result.metadata) + + return metadata.licences + end + + return player.PlayerData.metadata.licences +end + +function qb.getJobs(parameters) + local result = MySQL.rawExecute.await([[ + SELECT + job, + metadata + FROM + players + WHERE + citizenid = ? + ]], parameters)?[1] + local job = json.decode(result.job) + local metadata = json.decode(result.metadata) + local jobs = {} + + table.insert(jobs, { job = job.label, gradeLabel = job.grade.name }) + + if metadata.otherjobs then + for k, v in pairs(metadata.otherjobs) do + if not QBCore.Shared.Jobs[k] then goto continue end + + table.insert(jobs, { job = k, gradeLabel = QBCore.Shared.Jobs[k].grades['' .. v .. ''].name }) + ::continue:: + end + end + + return jobs +end + +-- Still needs implementation +function qb.getProperties(parameters) + local properties = {} + + return properties +end + +function qb.getOfficersInvolved(parameters) + local queryResult = MySQL.rawExecute.await([[ + SELECT + players.citizenid, + players.charinfo, + profile.callSign + FROM + mdt_incidents_officers officer + LEFT JOIN + players + ON + players.citizenid = officer.citizenid + LEFT JOIN + mdt_profiles profile + ON + players.citizenid = profile.citizenid + WHERE + incidentid = ? + ]], parameters) + + local officers = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + officers[#officers+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + callsign = v.callSign, + } + end + + return officers +end + +function qb.getOfficersInvolvedReport(parameters) + local queryResult = MySQL.rawExecute.await([[ + SELECT + players.citizenid, + players.charinfo, + profile.callSign + FROM + mdt_reports_officers officer + LEFT JOIN + players + ON + players.citizenid = officer.citizenid + LEFT JOIN + mdt_profiles profile + ON + players.citizenid = profile.citizenid + WHERE + reportid = ? + ]], parameters) + + local officers = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + officers[#officers+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + callsign = v.callSign, + } + end + + return officers +end + +function qb.getCitizensInvolvedReport(parameters) + local queryResult = MySQL.rawExecute.await([[ + SELECT + players.citizenid, + players.charinfo + FROM + mdt_reports_citizens officer + LEFT JOIN + players + ON + players.citizenid = officer.citizenid + LEFT JOIN + mdt_profiles profile + ON + players.citizenid = profile.citizenid + WHERE + reportid = ? + ]], parameters) + + local citizens = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + citizens[#citizens+1] = { + firstname = charinfo.firstname, + lastname = charinfo.lastname, + citizenid = v.citizenid, + dob = charinfo.birthdate + } + end + + return citizens +end + +function qb.getCriminalsInvolved(parameters) + local queryResult = MySQL.rawExecute.await([[ + SELECT DISTINCT + criminal.citizenid, + criminal.reduction, + players.charinfo, + DATE_FORMAT(criminal.warrantExpiry, "%Y-%m-%d") AS warrantExpiry, + criminal.processed, + criminal.pleadedGuilty + FROM + mdt_incidents_criminals criminal + LEFT JOIN + players + ON + players.citizenid = criminal.citizenid + WHERE + incidentid = ? + ]], parameters) + + local involvedCriminals = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + involvedCriminals[#involvedCriminals+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + reduction = v.reduction, + warrantExpiry = v.warrantExpiry, + processed = v.processed, + pleadedGuilty = v.pleadedGuilty + } + end + + return involvedCriminals +end + +function qb.getCriminalCharges(parameters) + return MySQL.rawExecute.await([[ + SELECT + citizenid, + charge as label, + type, + time, + fine, + count, + points + FROM + mdt_incidents_charges + WHERE + incidentid = ? + GROUP BY + charge, citizenid + ]], parameters) +end + +local selectOfficers = [[ + SELECT + mdt_profiles.id, + players.charinfo, + players.citizenid, + player_groups.group AS `group`, + player_groups.grade, + mdt_profiles.image, + mdt_profiles.callSign + FROM + player_groups + LEFT JOIN + players + ON + player_groups.citizenid = players.citizenid + LEFT JOIN + mdt_profiles + ON + players.citizenid = mdt_profiles.citizenid + WHERE + player_groups.group IN ("police") +]] + +function qb.getOfficers() + local query = selectOfficers + local queryResult = MySQL.rawExecute.await(query) + local officers = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + officers[#officers+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + callsign = v.callSign, + } + end + + return officers +end + +local selectOfficersForRoster = [[ + SELECT + mdt_profiles.id, + players.charinfo, + players.citizenid, + player_groups.group AS `group`, + player_groups.grade, + mdt_profiles.image, + mdt_profiles.callSign, + mdt_profiles.apu, + mdt_profiles.air, + mdt_profiles.mc, + mdt_profiles.k9, + mdt_profiles.fto, + DATE_FORMAT(mdt_profiles.lastActive, "%Y-%m-%d %T") AS formatted_lastActive + FROM + player_groups + LEFT JOIN + players + ON + player_groups.citizenid = players.citizenid + LEFT JOIN + mdt_profiles + ON + players.citizenid = mdt_profiles.citizenid + WHERE + player_groups.group IN ("police") +]] + +utils.registerCallback('mdt:fetchRoster', function() + local query = selectOfficersForRoster + local queryResult = MySQL.rawExecute.await(query) + local rosterOfficers = {} + + local job = exports.qbx_core:GetJob('police') + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + rosterOfficers[#rosterOfficers+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + callsign = v.callSign, + image = v.image, + title = job.grades[v.grade].name, + apu = v.apu, + air = v.air, + mc = v.mc, + k9 = v.k9, + fto = v.fto, + lastActive = v.formatted_lastActive + } + end + + return rosterOfficers +end) + +local selectCharacters = [[ + SELECT + charinfo, + citizenid + FROM + players +]] + +function qb.getCharacters() + local queryResult = MySQL.rawExecute.await(selectCharacters) + local characters = {} + + for _, v in pairs(queryResult) do + local charinfo = json.decode(v.charinfo) + characters[#characters+1] = { + citizenid = v.citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + dob = charinfo.birthdate, + } + end + + return characters +end + +local selectVehicles = [[ + SELECT + plate, + vehicle + FROM + player_vehicles +]] + +function qb.getVehicles() + return MySQL.rawExecute.await(selectVehicles) +end + +local selectVehicle = [[ + SELECT + player_vehicles.citizenid, + player_vehicles.plate, + player_vehicles.vehicle, + player_vehicles.mods, + mdt_vehicles.notes, + mdt_vehicles.image, + mdt_vehicles.known_information + FROM + player_vehicles + LEFT JOIN + mdt_vehicles + ON + mdt_vehicles.plate = player_vehicles.plate + WHERE + player_vehicles.plate = ? +]] + +function qb.getVehicle(plate) + local response = MySQL.rawExecute.await(selectVehicle, {plate})?[1] + local player = exports.qbx_core:GetPlayerByCitizenId(response.citizenid) + local data = { + plate = response.plate, + vehicle = response.vehicle, + mods = response.mods, + notes = response.notes, + image = response.image, + known_information = response.known_information, + owner = player.PlayerData.charinfo.firstname .. " " .. player.PlayerData.charinfo.lastname .. ' (' .. response.citizenid .. ')' + } + + return data +end + +utils.registerCallback('mdt:hireOfficer', function(source, data) + exports.qbx_core:AddPlayerToJob(data.citizenid, 'police', 1) + + local success = MySQL.prepare.await('INSERT INTO `mdt_profiles` (`citizenid`, `callsign`, `lastActive`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `callsign` = ?, `lastActive` = ?', { data.citizenid, data.callsign, os.date("%Y-%m-%d %H:%M:%S"), data.callsign, os.date("%Y-%m-%d %H:%M:%S") }) + + return success +end) + +utils.registerCallback('mdt:fireOfficer', function(source, data) + exports.qbx_core:RemovePlayerFromJob(data, 'police') + MySQL.prepare.await('UPDATE `mdt_profiles` SET `callsign` = ? WHERE `citizenid` = ?', { nil, data }) + + return true +end) + +utils.registerCallback('mdt:setOfficerRank', function(source, data) + exports.qbx_core:AddPlayerToJob(data.citizenId, 'police', data.grade) + + return true +end) + + +return qb \ No newline at end of file diff --git a/server/main.lua b/server/main.lua new file mode 100644 index 0000000..85195c7 --- /dev/null +++ b/server/main.lua @@ -0,0 +1,337 @@ +local utils = require 'server.utils' +local db = require 'server.db' +local officers = require 'server.officers' + +require 'server.commands' +require 'server.units' +require 'server.charges' +require 'server.calls' + +utils.registerCallback('mdt:openMdt', function() + local officerData = officers.get(source) + + if not officerData then return end + + local isAuthorised = officerData and true or false + local callSign = officerData.callsign + + return isAuthorised, callSign +end) + +utils.registerCallback('mdt:openDispatch', function() + return officers.get(source) and true or false +end) + +utils.registerCallback('mdt:getAnnouncements', function(source, page) + local announcements = db.selectAnnouncements() + + return { + announcements = announcements + } +end) + +utils.registerCallback('mdt:createAnnouncement', function(source, data) + local officer = officers.get(source) + + return officer and db.createAnnouncement(officer.citizenid, data.contents) +end) + +utils.registerCallback('mdt:getRecentActivity', function(source) + return db.getRecentActivity() +end) + + +utils.registerCallback('mdt:getAllProfiles', function(source, data) + local profiles = db.selectAllProfiles() + + return { + profiles = profiles + } +end) + +utils.registerCallback('mdt:getProfile', function(source, data) + return db.selectCharacterProfile(data) +end) + +utils.registerCallback('mdt:saveProfileNotes', function(source, data) + return db.updateProfileNotes(data.citizenid, data.notes) +end) + +utils.registerCallback('mdt:isProfileWanted', function(source, data) + return db.isProfileWanted(data) +end) + +utils.registerCallback('mdt:getActiveOfficers', function() + return officers.getAll() +end) + +utils.registerCallback('mdt:getWarrants', function() + return db.getWarrants() +end) + +utils.registerCallback('mdt:getIncidents', function(source, data) + local incidents = db.selectIncidents() + + return { + incidents = incidents + } +end) + +utils.registerCallback('mdt:createIncident', function(source, title) + local officer = officers.get(source) + + return officer and db.createIncident(title, ('%s %s'):format(officer.firstname, officer.lastname), officer.citizenid) +end) + +utils.registerCallback('mdt:deleteIncident', function(source, data) + local officer = officers.get(source) + + return db.deleteIncident(data.id, officer.citizenid) +end) + +utils.registerCallback('mdt:getIncident', function(source, incidentId) + local response = db.selectIncidentById(incidentId) + + if response then + response.officersInvolved = db.selectOfficersInvolved(incidentId) + response.evidence = db.selectEvidence(incidentId) + response.criminals = db.selectCriminalsInvolved(incidentId) + end + + return response +end) + +utils.registerCallback('mdt:saveIncidentContents', function(source, data) + return db.updateIncidentContents(data.incidentId, data.contents) +end) + +utils.registerCallback('mdt:addOfficer', function(source, data) + return db.addOfficer(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:removeOfficer', function(source, data) + return db.removeOfficer(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:addCriminal', function(source, data) + return db.addCriminal(data.id, data.criminalId) +end) + +utils.registerCallback('mdt:removeCriminal', function(source, data) + return db.removeCriminal(data.id, data.criminalId) +end) + +utils.registerCallback('mdt:getCriminalProfiles', function(source) + return db.searchCharacters() +end) + +utils.registerCallback('mdt:saveCriminal', function(source, data) + local officer = officers.get(source) + if data.criminal.issueWarrant then + db.createWarrant(data.id, data.criminal.citizenid, data.criminal.warrantExpiry) + else + db.removeWarrant(data.id, data.criminal.citizenid) + end + + return db.saveCriminal(data.id, data.criminal, officer.citizenid) +end) + +utils.registerCallback('mdt:addEvidence', function(source, data) + return db.addEvidence(data.id, data.evidence.label, data.evidence.image) +end) + +utils.registerCallback('mdt:addEvidenceFromPictureTaking', function(source, data) + return db.addEvidence(data.id, data.imageLabel, data.imageURL) +end) + +utils.registerCallback('mdt:removeEvidence', function(source, data) + return db.removeEvidence(data.id, data.label, data.image) +end) + +utils.registerCallback('mdt:deleteCharge', function(source, data) + return db.deleteCharge(data.label) +end) + +utils.registerCallback('mdt:createCharge', function(source, data) + return db.createCharge(data) +end) + +utils.registerCallback('mdt:editCharge', function(source, data) + return db.editCharge(data.chargelabel, data.fine, data.time, data.points) +end) + +utils.registerCallback('mdt:getRecommendedWarrantExpiry', function(source, charges) + local currentTime = os.time(os.date("!*t")) + local baseWarrantDuration = 259200000 -- 72 hours + local addonTime = 0 + + for i = 1, #charges do + local charge = charges[i] + if charge.time ~= 0 then + addonTime = addonTime + (charge.time * 60 * 60000 * charge.count) -- 1 month of penalty time = 1 hour of warrant time + end + end + + return currentTime * 1000 + addonTime + baseWarrantDuration +end) + +utils.registerCallback('mdt:getReports', function() + local reports = db.selectReports() + + return reports +end) + +utils.registerCallback('mdt:getReport', function(source, reportId) + local response = db.selectReportById(reportId) + + if response then + response.officersInvolved = db.selectOfficersInvolvedReport(reportId) + response.evidence = db.selectEvidenceReport(reportId) + response.citizensInvolved = db.selectCitizensInvolvedReport(reportId) + end + + return response +end) + +utils.registerCallback('mdt:removeReportOfficer', function(source, data) + return db.removeReportOfficer(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:removeReportCitizen', function(source, data) + return db.removeReportCitizen(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:saveReportContents', function(source, data) + return db.updateReportContents(data.reportId, data.contents) +end) + +utils.registerCallback('mdt:removeReportEvidence', function(source, data) + return db.removeReportEvidence(data.id, data.label, data.image) +end) + +utils.registerCallback('mdt:createReport', function(source, title) + local officer = officers.get(source) + + return officer and db.createReport(title, ('%s %s'):format(officer.firstname, officer.lastname), officer.citizenid) +end) + +utils.registerCallback('mdt:addReportOfficer', function(source, data) + return db.addReportOfficer(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:addReportEvidenceFromPictureTaking', function(source, data) + return db.addReportEvidence(data.id, data.imageLabel, data.imageURL) +end) + +utils.registerCallback('mdt:addReportEvidence', function(source, data) + return db.addReportEvidence(data.id, data.evidence.label, data.evidence.image) +end) + +utils.registerCallback('mdt:addReportCitizen', function(source, data) + return db.addReportCitizen(data.id, data.citizenid) +end) + +utils.registerCallback('mdt:getAllVehicles', function(source, data) + return db.selectVehicles() +end) + +utils.registerCallback('mdt:getVehicle', function(source, data) + return db.selectVehicle(data.plate) +end) + +utils.registerCallback('mdt:saveVehicleInformation', function(source, data) + return db.updateVehicleInformation(data.plate, data.knownInformation) +end) + +utils.registerCallback('mdt:saveVehicleNotes', function(source, data) + return db.updateVehicleNotes(data.plate, data.notes) +end) + +utils.registerCallback('mdt:updateVehicleImage', function(source, data) + return db.updateVehicleImage(data.plate, data.image) +end) + +local function isVehicleBOLO(plate) + return db.isVehicleBOLO(plate) +end exports('isVehicleBOLO', isVehicleBOLO) + +utils.registerCallback('mdt:isVehicleBOLO', function(source, data) + return isVehicleBOLO(data.plate) +end) + +utils.registerCallback('mdt:getBOLOExpirationDate', function(source, data) + return db.getBOLOExpirationDate(data.plate) +end) + +utils.registerCallback('mdt:createBOLO', function(source, data) + return db.createBOLO(data.plate, data.expirationDate, data.reason) +end) + +utils.registerCallback('mdt:deleteBOLO', function(source, data) + return db.deleteBOLO(data.plate) +end) + +utils.registerCallback('mdt:getBolos', function(source, data) + return db.getBolos() +end) + +utils.registerCallback('mdt:getBolo', function(source, data) + return db.getBolo(data.plate) +end) + +utils.registerCallback('mdt:getOfficers', function(source, data) + return db.getOfficers() +end) + +utils.registerCallback('mdt:setOfficerCallSign', function(source, data) + if db.selectOfficerCallSign(data.callsign) then return false end + + db.updateOfficerCallSign(data.citizenid, data.callsign) + + return true +end) + +local function updateProfileImage(citizenId, image) + return db.updateProfileImage(citizenId, image) +end exports('updateProfileImage', updateProfileImage) + +utils.registerCallback('mdt:updateProfileImage', function(source, data) + return db.updateProfileImage(data.citizenId, data.image) +end) + +utils.registerCallback('mdt:setOfficerRoles', function(source, data) + return db.setOfficerRoles(data) +end) + +RegisterServerEvent("mdt:updateProfileImage", function(playerId, image) + local player = exports.qbx_core:GetPlayer(playerId) + + db.updateProfileImage(player.PlayerData.citizenid, image) +end) + +RegisterServerEvent("mdt:server:CreateCall", function(data) + createCall(data) +end) + +RegisterServerEvent("mdt:server:CreateMDTProfile", function(data) + db.createMDTProfile(data) +end) + +RegisterServerEvent("mdt:server:AddFingerprintToProfile", function(citizenid, fingerprint) + db.addFingerprintToProfile(citizenid, fingerprint) +end) + +AddEventHandler('onResourceStop', function(resource) + if resource ~= cache.resource then return end + + for playerId, officer in pairs(officers.getAll()) do + if officer.unitId then + Player(playerId).state.mdtUnitId = nil + end + end +end) + +lib.cron.new('0 */1 * * *', function() + db.removeOldWarrants() + db.removeOldBolos() +end) \ No newline at end of file diff --git a/server/officers.lua b/server/officers.lua new file mode 100644 index 0000000..a184800 --- /dev/null +++ b/server/officers.lua @@ -0,0 +1,55 @@ +-- Credit to ox_mdt for this code. Check ox_mdt out here: (https://github.com/overextended/ox_mdt) +local activeOfficers = {} +local officersArray = {} + +local function triggerOfficerEvent(eventName, eventData) + for playerId in pairs(activeOfficers) do + TriggerClientEvent(eventName, playerId, eventData) + end +end + +SetInterval(function() + local n = 0 + + for _, officer in pairs(activeOfficers) do + local coords = GetEntityCoords(officer.ped) + officer.position[1] = coords.y + officer.position[2] = coords.x + officer.position[3] = coords.z + n += 1 + officersArray[n] = officer + end + + triggerOfficerEvent('mdt:updateOfficerPositions', officersArray) + table.wipe(officersArray) +end, math.max(500, 5000)) + +local function addOfficer(playerId, firstName, lastName, citizenid) + activeOfficers[playerId] = { + firstname = firstName, + lastname = lastName, + citizenid = citizenid, + callsign = MySQL.prepare.await('SELECT `callSign` FROM `mdt_profiles` WHERE citizenid = ?', { citizenid }) or 99, + playerId = playerId, + ped = GetPlayerPed(playerId), + position = {}, + } +end + +local function removeOfficer(playerId) + activeOfficers[playerId] = nil +end + +local function getOfficer(playerId) + return activeOfficers[playerId] +end + +local function getAll() return activeOfficers end + +return { + add = addOfficer, + remove = removeOfficer, + get = getOfficer, + getAll = getAll, + triggerEvent = triggerOfficerEvent +} \ No newline at end of file diff --git a/server/profileCards.lua b/server/profileCards.lua new file mode 100644 index 0000000..2938901 --- /dev/null +++ b/server/profileCards.lua @@ -0,0 +1,121 @@ +local utils = require 'server.utils' +local config = require 'config' +local framework = require(('server.framework.%s'):format(config.framework)) + + +-- Credit to ox_mdt for this code. Check ox_mdt out here: (https://github.com/overextended/ox_mdt) +local customProfileCards = {} + +local function checkCardExists(newCard) + for i = 1, #customProfileCards do + local card = customProfileCards[i] + + if card.id == newCard.id then + assert(false, ("Custom card with id `%s` already exists!"):format(card.id)) + return true + end + end + + return false +end + +local function createProfileCard(data) + local arrLength = #data + if arrLength > 0 then + for i = 1, arrLength do + local newCard = data[i] + if not checkCardExists(newCard) then + customProfileCards[#customProfileCards+1] = newCard + end + end + + return + end + + if not checkCardExists(data.id) then + customProfileCards[#customProfileCards+1] = data + end +end + +exports('createProfileCard', createProfileCard) + +local function getAll() + return customProfileCards +end + +createProfileCard({ + { + id = 'licenses', + title = 'Licenses', + icon = 'certificate', + getData = function(profile) + local licenses = framework.getLicenses(profile.citizenid) + local licenseLabels = {} + + for key, value in pairs(licenses) do + if (value and key ~= 'id') then + if (key == 'driver') then + table.insert(licenseLabels, key .. ' (' .. framework.getDriverPoints(profile.citizenid) .. ' points)') + else + table.insert(licenseLabels, key) + end + end + end + + return licenseLabels + end + }, + { + id = 'vehicles', + title = 'Vehicles', + icon = 'car', + getData = function(profile) + local vehicles = framework.getVehiclesForProfile({profile.citizenid}) + local vehicleLabels = {} + for i = 1, #vehicles do + vehicleLabels[#vehicleLabels+1] = vehicles[i].label .. ' (' ..vehicles[i].plate.. ')' + end + + return vehicleLabels + end, + }, + { + id = 'jobs', + title = 'Jobs', + icon = 'briefcase', + getData = function(profile) + local jobs = framework.getJobs({profile.citizenid}) + local jobLabels = {} + + for i = 1, #jobs do + jobLabels[#jobLabels+1] = jobs[i].job .. ' (' ..jobs[i].gradeLabel.. ')' + end + + return jobLabels + end, + }, + { + id = 'properties', + title = 'Properties', + icon = 'building-skyscraper', + getData = function(profile) + local properties = framework.getProperties({profile.citizenid}) + local propertyLabels = {} + + for i = 1, #properties do + propertyLabels[#propertyLabels+1] = properties[i].label .. ' (' ..properties[i].type.. ')' + end + + return propertyLabels + end, + }, +}) + +utils.registerCallback('mdt:getCustomProfileCards', function() + return customProfileCards +end) + +return { + getAll = getAll, + create = createProfileCard +} \ No newline at end of file diff --git a/server/units.lua b/server/units.lua new file mode 100644 index 0000000..7ab36fe --- /dev/null +++ b/server/units.lua @@ -0,0 +1,167 @@ +local units = {} +local officers = require 'server.officers' +local utils = require 'server.utils' + +local function removePlayerFromUnit(officer, state) + local unitId = state.mdtUnitId + + if not unitId then return end + + local unit = units[unitId] + + if not unit then return end + + -- If unit owner leaves, remove everyone from the unit and delete it + if unit.id == officer.callsign then + for i = 1, #unit.members do + local member = unit.members[i] + member.unitId = nil + Player(member.playerId).state.mdtUnitId = nil + end + + units[unitId] = nil + + officers.triggerEvent('mdt:refreshUnits', units) + + return true + end + + for i = 1, #unit.members do + local member = unit.members[i] + + if officer.citizenid == member.citizenid then + state.mdtUnitId = nil + table.remove(unit.members, i) + + if #unit.members == 0 then + units[unitId] = nil + -- TODO: Remove unit from all calls it's attached to + end + + officers.triggerEvent('mdt:refreshUnits', units) + + return true + end + end +end + +local function addPlayerToUnit(playerId, unitId) + local officer = officers.get(playerId) + local unit = units[unitId] + local state = Player(playerId).state + + if not officer or not unit then return end + + if state.mdtUnitId then + removePlayerFromUnit(officer, state) + end + + unit.members[#unit.members + 1] = officer + officer.unitId = unitId + state.mdtUnitId = unitId + + officers.triggerEvent('mdt:refreshUnits', units) + + return true +end + +utils.registerCallback('mdt:createUnit', function(source, unitType) + local officer = officers.get(source) + + if not officer or not officer.callsign then return end + + ---@type string + local unitId = officer.callsign + local unitName = ('Unit %s'):format(unitId) + + + units[unitId] = { + id = unitId, + members = {}, + name = unitName, + type = unitType + } + + return addPlayerToUnit(source, unitId) and { + id = unitId, + name = unitName + } +end) + +utils.registerCallback('mdt:joinUnit', function(source, unitId) + return addPlayerToUnit(source, unitId) +end) + +utils.registerCallback('mdt:leaveUnit', function(source) + local officer = officers.get(source) + + if not officer then return end + + return removePlayerFromUnit(officer, Player(source).state) +end) + +utils.registerCallback('mdt:getUnits', function() + return units +end) + +utils.registerCallback('mdt:setUnitOfficers', function(source, data) + local unit = units[data.id] + local includesCreator = false + local newOfficers = {} + + for i = 1, #data.officers do + newOfficers[#newOfficers +1] = officers.get(tonumber(data.officers[i])) + end + + for i = 1, #unit.members do + local officer = unit.members[i] + + if officer.callsign == data.id then + includesCreator = true + end + end + + if #data.officers == 0 or not includesCreator then + for i = 1, #units[data.id].members do + local officer = units[data.id].members[i] + Player(officer.playerId).state.mdtUnitId = nil + end + + units[data.id] = nil + officers.triggerEvent('mdt:refreshUnits', units) + + return + end + + units[data.id].members = newOfficers + + for i = 1, #newOfficers do + newOfficers[i].unitId = data.id + Player(newOfficers[i].playerId).state.mdtUnitId = data.id + end + + officers.triggerEvent('mdt:refreshUnits', units) + + return true +end) + +utils.registerCallback('mdt:setUnitType', function(source, data) + local officer = officers.get(source) + + if officer.unitId ~= data.id then return end + + units[data.id].type = data.value + + officers.triggerEvent('mdt:refreshUnits', units) + + return true +end) + +local function getUnit(unitId) + return units[unitId] +end + +return { + getUnit = getUnit, + removePlayerFromUnit = removePlayerFromUnit +} \ No newline at end of file diff --git a/server/utils.lua b/server/utils.lua new file mode 100644 index 0000000..2a7730a --- /dev/null +++ b/server/utils.lua @@ -0,0 +1,22 @@ +local utils = {} + +---@param event string +---@param cb fun(playerId: number, ...: any): any +---@param permission string | false | nil +function utils.registerCallback(event, cb, permission) + lib.callback.register(event, function(source, ...) + return cb(source, ...) + end) +end + +function utils.cleanTable(tab) + local newTable = {} + for _, value in ipairs(tab) do + if value ~= nil then + table.insert(newTable, value) + end + end + return newTable +end + +return utils \ No newline at end of file diff --git a/sql/data.sql b/sql/data.sql new file mode 100644 index 0000000..1b0e7b0 --- /dev/null +++ b/sql/data.sql @@ -0,0 +1,124 @@ +INSERT INTO `mdt_offenses` (`label`, `type`, `category`, `description`, `time`, `fine`, `points`) VALUES + -- OFFENSES AGAINST PERSONS + ('Assault', 'misdemeanor', 'OFFENSES AGAINST PERSONS', 'Unlawfully attacking another person.', 30, 1000, 0), + ('Kidnapping', 'felony', 'OFFENSES AGAINST PERSONS', 'Unlawfully seizing and carrying away a person by force.', 360, 20000, 0), + ('Manslaughter', 'felony', 'OFFENSES AGAINST PERSONS', 'Killing another person without intention during the commission of a non-felony.', 180, 15000, 0), + ('Murder', 'felony', 'OFFENSES AGAINST PERSONS', 'Unlawful premeditated killing of one human being by another.', 999, 50000, 0), + ('Hate Crime', 'felony', 'OFFENSES AGAINST PERSONS', 'A crime motivated by racial, sexual, or other prejudice.', 180, 10000, 0), + ('Battery', 'misdemeanor', 'OFFENSES AGAINST PERSONS', 'Applying force to another, resulting in harmful or offensive contact.', 60, 3000, 0), + ('Stalking', 'misdemeanor', 'OFFENSES AGAINST PERSONS', 'Repeatedly following or harassing another person and making threats.', 90, 5000, 0), + ('Human Trafficking', 'felony', 'OFFENSES AGAINST PERSONS', 'Illegal trade of human beings for the purposes of forced labor or sexual exploitation.', 720, 50000, 0), + ('Sexual Assault', 'felony', 'OFFENSES AGAINST PERSONS', 'An act in which a person sexually touches another person without their consent.', 360, 20000, 0), + ('Harassment', 'infraction', 'OFFENSES AGAINST PERSONS', 'Engaging in a pattern of unwanted conduct that alarms or seriously annoys another person, without claiming a legitimate purpose.', 0, 500, 0), + + -- OFFENSES INVOLVING THEFT + ('Petty Theft', 'misdemeanor', 'OFFENSES INVOLVING THEFT', 'The theft of relatively low value items.', 30, 500, 0), + ('Grand Theft Auto', 'felony', 'OFFENSES INVOLVING THEFT', 'Theft of an automobile.', 180, 10000, 0), + ('Burglary', 'felony', 'OFFENSES INVOLVING THEFT', 'Entering a building unlawfully with intent to commit a felony or a theft.', 90, 5000, 0), + ('Shoplifting', 'misdemeanor', 'OFFENSES INVOLVING THEFT', 'The act of stealing goods from a store.', 30, 1000, 0), + ('Armed Robbery', 'felony', 'OFFENSES INVOLVING THEFT', 'Robbery with the use of a weapon.', 360, 25000, 0), + ('Larceny', 'misdemeanor', 'OFFENSES INVOLVING THEFT', 'Unlawful taking of personal property.', 60, 2000, 0), + ('Embezzlement', 'felony', 'OFFENSES INVOLVING THEFT', 'Theft or misappropriation of funds placed in ones trust or belonging to ones employer.', 180, 15000, 0), + ('Receiving Stolen Property', 'misdemeanor', 'OFFENSES INVOLVING THEFT', 'Receiving, buying, or possessing property known to be stolen.', 90, 4000, 0), + ('Identity Theft', 'felony', 'OFFENSES INVOLVING THEFT', 'The fraudulent acquisition and use of a persons private identifying information.', 180, 10000, 0), + ('Ticket Scalping', 'infraction', 'OFFENSES INVOLVING THEFT', 'Selling tickets for an event without a proper license and often at a rate exceeding the face value.', 0, 200, 0), + + -- OFFENSES INVOLVING FRAUD + ('Wire Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'Fraud involving the use of electronic communications.', 180, 15000, 0), + ('Insurance Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'The act of falsifying or exaggerating the facts of an accident to an insurance company to obtain payment that would not otherwise be made.', 180, 10000, 0), + ('Securities Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'Fraudulent practices in the stock and commodities markets, including insider trading.', 360, 25000, 0), + ('Credit Card Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'Unauthorized use of a credit card to obtain goods of value.', 90, 5000, 0), + ('Tax Evasion', 'felony', 'OFFENSES INVOLVING FRAUD', 'The illegal nonpayment or underpayment of tax.', 180, 10000, 0), + ('Healthcare Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'Filing dishonest healthcare claims to obtain a profit.', 180, 15000, 0), + ('Mail Fraud', 'felony', 'OFFENSES INVOLVING FRAUD', 'The use of postal services to commit fraud.', 180, 10000, 0), + ('Misrepresentation', 'misdemeanor', 'OFFENSES INVOLVING FRAUD', 'Deliberately providing false information in a business transaction.', 90, 3000, 0), + ('False Advertising', 'misdemeanor', 'OFFENSES INVOLVING FRAUD', 'Advertising products or services in a misleading or deceptive way.', 30, 2000, 0), + ('Phishing', 'infraction', 'OFFENSES INVOLVING FRAUD', 'Attempting to acquire sensitive information such as usernames, passwords, and credit card details by masquerading as a trustworthy entity in an electronic communication.', 0, 500, 0), + + -- OFFENSES INVOLVING DAMAGE TO PROPERTY + ('Vandalism', 'misdemeanor', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Deliberately destroying or damaging property.', 30, 1000, 0), + ('Arson', 'felony', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'The criminal act of deliberately setting fire to property.', 360, 20000, 0), + ('Graffiti', 'misdemeanor', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Writing or drawings scribbled, scratched, or sprayed illicitly on a wall or other surface in a public place.', 60, 2500, 0), + ('Criminal Mischief', 'misdemeanor', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Intentional or knowing damage to anothers property.', 90, 3000, 0), + ('Trespassing with Damage', 'misdemeanor', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Entering anothers property without permission and causing damage.', 30, 2000, 0), + ('Illegal Dumping', 'misdemeanor', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Disposing of waste illegally in non-designated areas.', 90, 5000, 0), + ('Destruction of Signs', 'infraction', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'The act of destroying or defacing road signs or other public signs.', 0, 500, 0), + ('Littering', 'infraction', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Carelessly discarding trash or other materials on public or private property.', 0, 250, 0), + ('Damaging Public Utilities', 'felony', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Intentionally damaging or interfering with services of public utility providers.', 180, 10000, 0), + ('Sabotage', 'felony', 'OFFENSES INVOLVING DAMAGE TO PROPERTY', 'Deliberately destroying, damaging, or obstructing something, especially for political or military advantage.', 360, 25000, 0), + + -- OFFENSES AGAINST PUBLIC ADMINISTRATION + ('Bribery', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Offering, giving, receiving, or soliciting anything of value to influence the actions of an official or other person in charge of a public or legal duty.', 180, 15000, 0), + ('Perjury', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'The offense of willfully telling an untruth in a court after having taken an oath or affirmation.', 180, 10000, 0), + ('Obstruction of Justice', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'The crime of obstructing prosecutors or other (usually government) officials.', 180, 10000, 0), + ('Public Corruption', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'The abuse of public office for private gain.', 360, 25000, 0), + ('Falsifying Records', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Altering, concealing, falsifying, or destroying a document to obstruct the investigation or other official matters.', 90, 5000, 0), + ('Witness Tampering', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'The attempt to alter or prevent the testimony of witnesses within criminal or civil proceedings.', 240, 15000, 0), + ('Illegal Lobbying', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Lobbying without proper registration or when specifically prohibited.', 120, 8000, 0), + ('Election Fraud', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Illegal interference with the process of an election.', 240, 20000, 0), + ('Misuse of Public Funds', 'felony', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Using public money for unauthorized, illegal, or unethical purposes.', 180, 15000, 0), + ('Unauthorized Disclosure of Confidential Information', 'infraction', 'OFFENSES AGAINST PUBLIC ADMINISTRATION', 'Improperly revealing confidential or classified information without authorization.', 0, 1000, 0), + + -- OFFENSES AGAINST PUBLIC ORDER + ('Disorderly Conduct', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Engaging in behavior that disrupts public peace, including fighting, making excessive noise, or causing a public disturbance.', 30, 1000, 0), + ('Illegal Assembly', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Gathering of people with the intent of engaging in activities that breach public peace or order.', 60, 3000, 0), + ('Public Intoxication', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Appearing in public places while significantly impaired by alcohol or drugs, posing a potential danger to self and others.', 0, 500, 0), + ('Inciting a Riot', 'felony', 'OFFENSES AGAINST PUBLIC ORDER', 'Encouraging, promoting, or participating in violent or disruptive behavior that turns into a mass disturbance.', 90, 7000, 0), + ('Unlawful Protest', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Protesting without required permissions or in violation of legal restrictions, potentially leading to public disorder.', 30, 2000, 0), + ('Loitering', 'infraction', 'OFFENSES AGAINST PUBLIC ORDER', 'Remaining idle in a public place for an extended period without a clear reason, often seen as a nuisance.', 0, 250, 0), + ('Curfew Violation', 'infraction', 'OFFENSES AGAINST PUBLIC ORDER', 'Failing to adhere to government-imposed curfew regulations, typically enforced to maintain public order during emergencies.', 0, 300, 0), + ('Vagrancy', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Living in public spaces without a permanent home or employment, often associated with public nuisance behaviors.', 30, 1000, 0), + ('Public Nudity', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Intentionally exposing oneself in a public space, not complying with local decency laws.', 60, 2000, 0), + ('Illegal Gambling', 'misdemeanor', 'OFFENSES AGAINST PUBLIC ORDER', 'Organizing, participating in, or operating games of chance in public or private settings without legal authorization.', 90, 5000, 0), + + -- OFFENSES AGAINST HEALTH AND MORALS + ('Drug Possession', 'misdemeanor', 'OFFENSES AGAINST HEALTH AND MORALS', 'Possession of illegal drugs or controlled substances without a prescription.', 60, 2000, 0), + ('Prostitution', 'misdemeanor', 'OFFENSES AGAINST HEALTH AND MORALS', 'Engaging in, soliciting, or arranging sexual activities in exchange for payment.', 90, 3000, 0), + ('Illegal Substance Sale', 'felony', 'OFFENSES AGAINST HEALTH AND MORALS', 'Selling or distributing illegal drugs or other prohibited substances.', 180, 10000, 0), + ('Public Indecency', 'misdemeanor', 'OFFENSES AGAINST HEALTH AND MORALS', 'Performing acts of a sexual nature in public spaces or exposing oneself inappropriately.', 30, 1000, 0), + ('Gambling Operation', 'felony', 'OFFENSES AGAINST HEALTH AND MORALS', 'Operating or participating in illegal gambling activities, including unlicensed casinos or sports betting.', 180, 15000, 0), + ('Underage Drinking', 'infraction', 'OFFENSES AGAINST HEALTH AND MORALS', 'Consuming or possessing alcohol by individuals under the legal drinking age.', 0, 500, 0), + ('Smoking Ban Violation', 'infraction', 'OFFENSES AGAINST HEALTH AND MORALS', 'Smoking in non-smoking areas or violating local smoking regulations.', 0, 250, 0), + ('Illegal Fireworks', 'misdemeanor', 'OFFENSES AGAINST HEALTH AND MORALS', 'Possessing, using, or selling fireworks without appropriate authorization.', 30, 2000, 0), + ('Animal Cruelty', 'misdemeanor', 'OFFENSES AGAINST HEALTH AND MORALS', 'Intentionally inflicting harm or failing to provide adequate care to animals.', 90, 5000, 0), + ('Illegal Tattooing', 'infraction', 'OFFENSES AGAINST HEALTH AND MORALS', 'Tattooing individuals without proper licensing or on minors without legal consent.', 0, 1000, 0), + + -- OFFENSES AGAINST PUBLIC SAFETY + ('Firearm Possession without Permit', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Owning or carrying a firearm without the necessary permits.', 180, 10000, 0), + ('Criminal Possession of Weapon Class A', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Possession of a Class A weapon, such as a machine gun, assault rifle, or destructive device.', 360, 20000, 0), + ('Criminal Possession of Weapon Class B', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Possession of a Class B weapon, such as a sawed-off shotgun or handgun.', 180, 15000, 0), + ('Criminal Possession of Weapon Class C', 'misdemeanor', 'OFFENSES AGAINST PUBLIC SAFETY', 'Possession of a Class C weapon, such as a rifle or shotgun.', 90, 5000, 0), + ('Criminal Possession of Weapon Class D', 'misdemeanor', 'OFFENSES AGAINST PUBLIC SAFETY', 'Possession of a Class D weapon, such as a knife or club.', 30, 1000, 0), + ('Reckless Endangerment', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Engaging in conduct that poses a significant risk of serious physical injury to others.', 90, 7000, 0), + ('Traffic Violation', 'infraction', 'OFFENSES AGAINST PUBLIC SAFETY', 'Violating traffic laws such as speeding, running red lights, or illegal parking.', 0, 500, 1), + ('Illegal Hunting', 'misdemeanor', 'OFFENSES AGAINST PUBLIC SAFETY', 'Hunting wildlife in restricted areas or during off-seasons without proper permits.', 60, 3000, 0), + ('Building Code Violation', 'misdemeanor', 'OFFENSES AGAINST PUBLIC SAFETY', 'Violating local building regulations, potentially creating safety hazards.', 30, 2000, 0), + ('DUI with Bodily Injury', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Driving under the influence of alcohol or drugs and causing bodily harm.', 180, 15000, 3), + ('Possession of Explosives', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Illegally possessing or improperly handling explosive materials.', 360, 20000, 0), + ('Hazardous Waste Dumping', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Disposing of hazardous materials in a manner that endangers public health and the environment.', 180, 15000, 0), + ('Negligent Discharge of a Firearm', 'misdemeanor', 'OFFENSES AGAINST PUBLIC SAFETY', 'Accidentally discharging a firearm due to careless handling.', 60, 3000, 0), + ('Improper Transport of Hazardous Materials', 'felony', 'OFFENSES AGAINST PUBLIC SAFETY', 'Transporting hazardous materials without adhering to safety regulations and legal requirements.', 240, 15000, 0), + + -- OFFENSES INVOLVING THE OPERATION OF A VEHICLE + ('Driving Without a License', 'misdemeanor', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Operating a vehicle without a valid driving license.', 0, 1000, 2), + ('Driving with a Suspended License', 'misdemeanor', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Driving when your drivers license has been suspended or revoked.', 30, 2000, 2), + ('Hit and Run', 'felony', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Leaving the scene of an accident without providing contact information or assisting the injured.', 180, 10000, 3), + ('Reckless Driving', 'misdemeanor', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Driving with a willful disregard for the safety of persons or property.', 60, 3000, 4), + ('Vehicle Manslaughter', 'felony', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Causing the death of another through negligent or reckless driving.', 360, 20000, 0), + ('Traffic Obstruction', 'infraction', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Obstructing traffic flow intentionally or unintentionally.', 0, 500, 0), + ('Illegal Street Racing', 'misdemeanor', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Participating in unauthorized speed contests on public roads.', 90, 5000, 3), + ('Driving Under the Influence (DUI)', 'felony', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Operating a vehicle while under the influence of alcohol or drugs.', 90, 7000, 3), + ('Failure to Yield', 'infraction', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Failing to yield the right of way to other road users where required.', 0, 250, 1), + ('Driving with Obstructed View', 'infraction', 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', 'Driving a vehicle with objects blocking the drivers view or control.', 0, 300, 0), + + -- OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE + ('Illegal Fishing', 'misdemeanor', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Fishing without a license or in restricted areas.', 30, 2000, 0), + ('Wildlife Smuggling', 'felony', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Illegally exporting or importing protected or endangered species.', 360, 25000, 0), + ('Destroying Habitat', 'felony', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Deliberate destruction of environments that support wildlife.', 180, 15000, 0), + ('Poaching', 'felony', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Illegal hunting, killing, or capturing of wild animals.', 180, 10000, 0), + ('Illegal Logging', 'felony', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Unauthorized cutting down of trees in protected areas.', 180, 15000, 0), + ('Disrupting Wildlife with Noise Pollution', 'misdemeanor', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Causing noise that can harm wildlife behavior and natural habitat.', 60, 3000, 0), + ('Feeding Wildlife Illegally', 'infraction', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Feeding wildlife in areas where it is prohibited by law.', 0, 500, 0), + ('Illegal Pet Trade', 'felony', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Engaging in the sale or purchase of wild animals as pets illegally.', 360, 20000, 0), + ('Use of Harmful Pesticides', 'misdemeanor', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Using pesticides that are known to cause significant harm to wildlife.', 90, 5000, 0), + ('Littering in Natural Reserves', 'misdemeanor', 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE', 'Disposing of waste in a natural reserve, negatively affecting wildlife.', 30, 2000, 0); \ No newline at end of file diff --git a/sql/import.sql b/sql/import.sql new file mode 100644 index 0000000..8955282 --- /dev/null +++ b/sql/import.sql @@ -0,0 +1,180 @@ +CREATE TABLE + IF NOT EXISTS `mdt_offenses` ( + `label` varchar(100) NOT NULL, + `type` ENUM('misdemeanor', 'felony', 'infraction') NOT NULL, + `category` ENUM( + 'OFFENSES AGAINST PERSONS', + 'OFFENSES INVOLVING THEFT', + 'OFFENSES INVOLVING FRAUD', + 'OFFENSES INVOLVING DAMAGE TO PROPERTY', + 'OFFENSES AGAINST PUBLIC ADMINISTRATION', + 'OFFENSES AGAINST PUBLIC ORDER', + 'OFFENSES AGAINST HEALTH AND MORALS', + 'OFFENSES AGAINST PUBLIC SAFETY', + 'OFFENSES INVOLVING THE OPERATION OF A VEHICLE', + 'OFFENSES INVOLVING THE WELL-BEING OF WILDLIFE') NOT NULL, + `description` varchar(250) NOT NULL, + `time` int UNSIGNED NOT NULL DEFAULT 0, + `fine` int UNSIGNED NOT NULL DEFAULT 0, + `points` int UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`label`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_incidents` ( + `id` int UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL, + `description` text DEFAULT NULL, + `author` varchar(50) DEFAULT NULL, + `date` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_incidents_criminals` ( + `incidentid` INT UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + `reduction` TINYINT UNSIGNED NULL DEFAULT NULL, + `warrantExpiry` DATE NULL DEFAULT NULL, + `processed` TINYINT NULL DEFAULT NULL, + `pleadedGuilty` TINYINT NULL DEFAULT NULL, + INDEX `incidentid` (`incidentid`), + INDEX `FK_mdt_incidents_incidents_players` (`citizenid`), + CONSTRAINT `mdt_incidents_criminals_ibfk_2` FOREIGN KEY (`incidentid`) REFERENCES `mdt_incidents` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_incidents_officers` ( + `incidentid` int UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + KEY `FK_mdt_incidents_officers_players` (`citizenid`), + KEY `incidentid` (`incidentid`), + CONSTRAINT `FK_mdt_incidents_officers_mdt_incidents` FOREIGN KEY (`incidentid`) REFERENCES `mdt_incidents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_incidents_charges` ( + `incidentid` int UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + `charge` VARCHAR(100) DEFAULT NULL, + `type` ENUM('misdemeanor', 'felony', 'infraction') NOT NULL, + `count` int UNSIGNED NOT NULL DEFAULT 1, + `time` int UNSIGNED DEFAULT NULL, + `fine` int UNSIGNED DEFAULT NULL, + `points` int UNSIGNED DEFAULT NULL, + KEY `FK_mdt_incidents_charges_mdt_incidents_criminals` (`incidentid`), + KEY `FK_mdt_incidents_charges_mdt_incidents_criminals_2` (`citizenid`), + KEY `FK_mdt_incidents_charges_mdt_offenses` (`charge`), + CONSTRAINT `FK_mdt_incidents_charges_mdt_offenses` FOREIGN KEY (`charge`) REFERENCES `mdt_offenses` (`label`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `FK_mdt_incidents_charges_mdt_incidents_criminals_2` FOREIGN KEY (`citizenid`) REFERENCES `mdt_incidents_criminals` (`citizenid`) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_incidents_evidence` ( + `incidentid` INT UNSIGNED NOT NULL, + `label` VARCHAR(50) NOT NULL DEFAULT '', + `image` VARCHAR(90) NOT NULL DEFAULT '', + INDEX `incidentid` (`incidentid`), + CONSTRAINT `FK_mdt_incidents_evidence_mdt_incidents` FOREIGN KEY (`incidentid`) REFERENCES `mdt_incidents` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_announcements` ( + `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `creator` VARCHAR(50) NOT NULL, + `contents` TEXT NOT NULL, + `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `FK_mdt_announcements_players` (`creator`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_warrants` ( + `incidentid` INT UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + `expiresAt` DATETIME NOT NULL, + CONSTRAINT `mdt_warrants_mdt_incidents_id_fk` FOREIGN KEY (`incidentid`) REFERENCES `mdt_incidents` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_profiles` ( + `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + `citizenid` VARCHAR(50) NOT NULL, + `image` VARCHAR(90) NULL, + `notes` TEXT NULL, + `callsign` VARCHAR(10) NULL, + `apu` TINYINT NULL DEFAULT NULL, + `air` TINYINT NULL DEFAULT NULL, + `mc` TINYINT NULL DEFAULT NULL, + `k9` TINYINT NULL DEFAULT NULL, + `fto` TINYINT NULL DEFAULT NULL, + `fingerprint` VARCHAR(90) NULL, + `lastActive` DATETIME DEFAULT NULL, + CONSTRAINT `mdt_profiles_pk` UNIQUE (`callsign`), + CONSTRAINT `mdt_profiles_pk2` UNIQUE (`citizenid`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_recent_activity` ( + `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + `citizenid` VARCHAR(50) NOT NULL, + `category` VARCHAR(100) DEFAULT NULL, + `type` ENUM('created', 'updated', 'deleted') NOT NULL, + `date` datetime DEFAULT CURRENT_TIMESTAMP, + `activityid` INT UNSIGNED DEFAULT NULL +); + +CREATE TABLE + IF NOT EXISTS `mdt_reports` ( + `id` int UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL, + `description` text DEFAULT NULL, + `author` varchar(50) DEFAULT NULL, + `date` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_reports_officers` ( + `reportid` int UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + KEY `FK_mdt_reports_officers_players` (`citizenid`), + KEY `reportid` (`reportid`), + CONSTRAINT `FK_mdt_reports_officers_mdt_reports` FOREIGN KEY (`reportid`) REFERENCES `mdt_reports` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_reports_citizens` ( + `reportid` int UNSIGNED NOT NULL, + `citizenid` VARCHAR(50) NOT NULL, + KEY `FK_mdt_reports_players` (`citizenid`), + KEY `reportid` (`reportid`), + CONSTRAINT `FK_mdt_reports_players_mdt_reports` FOREIGN KEY (`reportid`) REFERENCES `mdt_reports` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_reports_evidence` ( + `reportid` INT UNSIGNED NOT NULL, + `label` VARCHAR(50) NOT NULL DEFAULT '', + `image` VARCHAR(90) NOT NULL DEFAULT '', + INDEX `reportid` (`reportid`), + CONSTRAINT `FK_mdt_reports_evidence_mdt_reports` FOREIGN KEY (`reportid`) REFERENCES `mdt_reports` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE + IF NOT EXISTS `mdt_vehicles` ( + `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + `plate` VARCHAR(50) NOT NULL, + `image` VARCHAR(90) NULL, + `notes` TEXT NULL, + `known_information` JSON NULL, + UNIQUE (`plate`) +); + +CREATE TABLE + IF NOT EXISTS `mdt_bolos` ( + `plate` VARCHAR(50) NOT NULL, + `reason` TEXT NOT NULL, + `expiresAt` DATETIME NOT NULL, + UNIQUE (`plate`) +); \ No newline at end of file diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/web/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..823f379 --- /dev/null +++ b/web/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + Bubble MDT + + +
+ + + diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..da54e0e --- /dev/null +++ b/web/package.json @@ -0,0 +1,58 @@ +{ + "name": "mdt", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "start:game": "vite build --watch", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@mantine/core": "^6.0.21", + "@mantine/dates": "^6.0.21", + "@mantine/form": "^6.0.21", + "@mantine/hooks": "^6.0.21", + "@mantine/modals": "^6.0.21", + "@mantine/tiptap": "^6.0.21", + "@mantine/utils": "^6.0.21", + "@tabler/icons-react": "^3.12.0", + "@tiptap/core": "^2.1.11", + "@tiptap/extension-color": "^2.1.11", + "@tiptap/extension-highlight": "^2.1.11", + "@tiptap/extension-image": "^2.1.11", + "@tiptap/extension-link": "^2.1.11", + "@tiptap/extension-subscript": "^2.1.11", + "@tiptap/extension-superscript": "^2.1.11", + "@tiptap/extension-text-align": "^2.1.11", + "@tiptap/extension-text-style": "^2.1.11", + "@tiptap/extension-underline": "^2.1.11", + "@tiptap/pm": "^2.1.11", + "@tiptap/react": "^2.1.11", + "@tiptap/starter-kit": "^2.1.11", + "dayjs": "^1.11.10", + "fast-printf": "^1.6.9", + "leaflet": "^1.9.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.6", + "react-leaflet": "^4.2.1", + "react-router-dom": "^6.16.0", + "zustand": "^4.4.1" + }, + "devDependencies": { + "@types/leaflet": "^1.9.6", + "@types/react": "^18.2.24", + "@types/react-dom": "^18.2.8", + "@typescript-eslint/eslint-plugin": "^6.7.3", + "@typescript-eslint/parser": "^6.7.3", + "@vitejs/plugin-react": "^4.1.0", + "eslint": "^8.50.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "typescript": "^5.2.2", + "vite": "^4.4.9" + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..4d41c00 --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,3270 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@emotion/react': + specifier: ^11.11.1 + version: 11.11.1(@types/react@18.2.24)(react@18.2.0) + '@mantine/core': + specifier: ^6.0.21 + version: 6.0.21(@emotion/react@11.11.1)(@mantine/hooks@6.0.21)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) + '@mantine/dates': + specifier: ^6.0.21 + version: 6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(dayjs@1.11.10)(react@18.2.0) + '@mantine/form': + specifier: ^6.0.21 + version: 6.0.21(react@18.2.0) + '@mantine/hooks': + specifier: ^6.0.21 + version: 6.0.21(react@18.2.0) + '@mantine/modals': + specifier: ^6.0.21 + version: 6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(react-dom@18.2.0)(react@18.2.0) + '@mantine/tiptap': + specifier: ^6.0.21 + version: 6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(@tabler/icons-react@3.12.0)(@tiptap/extension-link@2.1.11)(@tiptap/react@2.1.11)(react@18.2.0) + '@mantine/utils': + specifier: ^6.0.21 + version: 6.0.21(react@18.2.0) + '@tabler/icons-react': + specifier: ^3.12.0 + version: 3.12.0(react@18.2.0) + '@tiptap/core': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-color': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/extension-text-style@2.1.11) + '@tiptap/extension-highlight': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-image': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-link': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-subscript': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-superscript': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-text-align': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-text-style': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-underline': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11) + '@tiptap/pm': + specifier: ^2.1.11 + version: 2.1.11 + '@tiptap/react': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(react-dom@18.2.0)(react@18.2.0) + '@tiptap/starter-kit': + specifier: ^2.1.11 + version: 2.1.11(@tiptap/pm@2.1.11) + dayjs: + specifier: ^1.11.10 + version: 1.11.10 + fast-printf: + specifier: ^1.6.9 + version: 1.6.9 + leaflet: + specifier: ^1.9.4 + version: 1.9.4 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-draggable: + specifier: ^4.4.6 + version: 4.4.6(react-dom@18.2.0)(react@18.2.0) + react-leaflet: + specifier: ^4.2.1 + version: 4.2.1(leaflet@1.9.4)(react-dom@18.2.0)(react@18.2.0) + react-router-dom: + specifier: ^6.16.0 + version: 6.16.0(react-dom@18.2.0)(react@18.2.0) + zustand: + specifier: ^4.4.1 + version: 4.4.1(@types/react@18.2.24)(react@18.2.0) + +devDependencies: + '@types/leaflet': + specifier: ^1.9.6 + version: 1.9.6 + '@types/react': + specifier: ^18.2.24 + version: 18.2.24 + '@types/react-dom': + specifier: ^18.2.8 + version: 18.2.8 + '@typescript-eslint/eslint-plugin': + specifier: ^6.7.3 + version: 6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: ^6.7.3 + version: 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@vitejs/plugin-react': + specifier: ^4.1.0 + version: 4.1.0(vite@4.4.9) + eslint: + specifier: ^8.50.0 + version: 8.50.0 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.50.0) + eslint-plugin-react-refresh: + specifier: ^0.4.3 + version: 0.4.3(eslint@8.50.0) + typescript: + specifier: ^5.2.2 + version: 5.2.2 + vite: + specifier: ^4.4.9 + version: 4.4.9 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.0: + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.1: + resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.1 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react@11.11.1(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.24 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.50.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.9.0: + resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.22.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.50.0: + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@floating-ui/core@1.5.0: + resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + dependencies: + '@floating-ui/utils': 0.1.4 + dev: false + + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + dependencies: + '@floating-ui/core': 1.5.0 + '@floating-ui/utils': 0.1.4 + dev: false + + /@floating-ui/react-dom@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/react@0.19.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react-dom': 1.3.0(react-dom@18.2.0)(react@18.2.0) + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tabbable: 6.2.0 + dev: false + + /@floating-ui/utils@0.1.4: + resolution: {integrity: sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==} + dev: false + + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mantine/core@6.0.21(@emotion/react@11.11.1)(@mantine/hooks@6.0.21)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Kx4RrRfv0I+cOCIcsq/UA2aWcYLyXgW3aluAuW870OdXnbII6qg7RW28D+r9D76SHPxWFKwIKwmcucAG08Divg==} + peerDependencies: + '@mantine/hooks': 6.0.21 + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react': 0.19.2(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 6.0.21(react@18.2.0) + '@mantine/styles': 6.0.21(@emotion/react@11.11.1)(react-dom@18.2.0)(react@18.2.0) + '@mantine/utils': 6.0.21(react@18.2.0) + '@radix-ui/react-scroll-area': 1.0.2(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.6(@types/react@18.2.24)(react@18.2.0) + react-textarea-autosize: 8.3.4(@types/react@18.2.24)(react@18.2.0) + transitivePeerDependencies: + - '@emotion/react' + - '@types/react' + dev: false + + /@mantine/dates@6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(dayjs@1.11.10)(react@18.2.0): + resolution: {integrity: sha512-nSX7MxNkHyyDJqEJOT7Wg930jBfgWz+3pnoWo601cYDvFjh5GgcRz66v36rnMJFK1/56k5G9rWzUOzuM94j6hg==} + peerDependencies: + '@mantine/core': 6.0.21 + '@mantine/hooks': 6.0.21 + dayjs: '>=1.0.0' + react: '>=16.8.0' + dependencies: + '@mantine/core': 6.0.21(@emotion/react@11.11.1)(@mantine/hooks@6.0.21)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 6.0.21(react@18.2.0) + '@mantine/utils': 6.0.21(react@18.2.0) + dayjs: 1.11.10 + react: 18.2.0 + dev: false + + /@mantine/form@6.0.21(react@18.2.0): + resolution: {integrity: sha512-d4tlxyZic7MSDnaPx/WliCX1sRFDkUd2nxx4MxxO2T4OSek0YDqTlSBCxeoveu60P+vrQQN5rbbsVsaOJBe4SQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + fast-deep-equal: 3.1.3 + klona: 2.0.6 + react: 18.2.0 + dev: false + + /@mantine/hooks@6.0.21(react@18.2.0): + resolution: {integrity: sha512-sYwt5wai25W6VnqHbS5eamey30/HD5dNXaZuaVEAJ2i2bBv8C0cCiczygMDpAFiSYdXoSMRr/SZ2CrrPTzeNew==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@mantine/modals@6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gx2D/ZHMUuYF197JKMWey4K9FeGP9rxYp4lmAEXUrjXiST2fEhLZOdiD75KuOHXd1/sYAU9NcNRo9wXrlF/gUA==} + peerDependencies: + '@mantine/core': 6.0.21 + '@mantine/hooks': 6.0.21 + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@mantine/core': 6.0.21(@emotion/react@11.11.1)(@mantine/hooks@6.0.21)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 6.0.21(react@18.2.0) + '@mantine/utils': 6.0.21(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@mantine/styles@6.0.21(@emotion/react@11.11.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PVtL7XHUiD/B5/kZ/QvZOZZQQOj12QcRs3Q6nPoqaoPcOX5+S7bMZLMH0iLtcGq5OODYk0uxlvuJkOZGoPj8Mg==} + peerDependencies: + '@emotion/react': '>=11.9.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@emotion/react': 11.11.1(@types/react@18.2.24)(react@18.2.0) + clsx: 1.1.1 + csstype: 3.0.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@mantine/tiptap@6.0.21(@mantine/core@6.0.21)(@mantine/hooks@6.0.21)(@tabler/icons-react@3.12.0)(@tiptap/extension-link@2.1.11)(@tiptap/react@2.1.11)(react@18.2.0): + resolution: {integrity: sha512-SeVoMN+STXeeVTg2H4bxLJUjDuZ9ykAm6TSTqDi/vTRxp/v3aokAU8DCD8Z207DNXaRfZ50YByxfo1/uIyndYw==} + peerDependencies: + '@mantine/core': 6.0.21 + '@mantine/hooks': 6.0.21 + '@tabler/icons-react': '>=2.1.0' + '@tiptap/extension-link': ^2.0.0-beta.202 + '@tiptap/react': ^2.0.0-beta.202 + react: '>=16.8.0' + dependencies: + '@mantine/core': 6.0.21(@emotion/react@11.11.1)(@mantine/hooks@6.0.21)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 6.0.21(react@18.2.0) + '@mantine/utils': 6.0.21(react@18.2.0) + '@tabler/icons-react': 3.12.0(react@18.2.0) + '@tiptap/extension-link': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/react': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@mantine/utils@6.0.21(react@18.2.0): + resolution: {integrity: sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@radix-ui/number@1.0.0: + resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==} + dependencies: + '@babel/runtime': 7.23.1 + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.23.1 + dev: false + + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + dev: false + + /@radix-ui/react-direction@1.0.0(react@18.2.0): + resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + dev: false + + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-scroll-area@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/number': 1.0.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-direction': 1.0.0(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.1(react@18.2.0): + resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + dev: false + + /@react-leaflet/core@2.1.0(leaflet@1.9.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==} + peerDependencies: + leaflet: ^1.9.0 + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + leaflet: 1.9.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@remirror/core-constants@2.0.2: + resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} + dev: false + + /@remirror/core-helpers@3.0.0: + resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==} + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/types': 1.0.1 + '@types/object.omit': 3.0.1 + '@types/object.pick': 1.3.2 + '@types/throttle-debounce': 2.1.0 + case-anything: 2.1.13 + dash-get: 1.0.2 + deepmerge: 4.3.1 + fast-deep-equal: 3.1.3 + make-error: 1.3.6 + object.omit: 3.0.0 + object.pick: 1.3.0 + throttle-debounce: 3.0.1 + dev: false + + /@remirror/types@1.0.1: + resolution: {integrity: sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==} + dependencies: + type-fest: 2.19.0 + dev: false + + /@remix-run/router@1.9.0: + resolution: {integrity: sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==} + engines: {node: '>=14.0.0'} + dev: false + + /@tabler/icons-react@3.12.0(react@18.2.0): + resolution: {integrity: sha512-RnJl3HrCqInuC8JJEUxWuYP4OFNYnY2EUtBqZFSpYatPKY3AnvJBIrShJLHf3fiLPpo6xEYAIoB7Qow93JX0fQ==} + peerDependencies: + react: '>= 16' + dependencies: + '@tabler/icons': 3.12.0 + react: 18.2.0 + dev: false + + /@tabler/icons@3.12.0: + resolution: {integrity: sha512-Im37ar/mQkqLb6XUXsU7nOc4/66VB9/3KLuZ+6tUsJKHHNLaDUkYfCTNG3pnGDI03laByxVf5+umSNK2yPTx8A==} + dev: false + + /@tiptap/core@2.1.11(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-1W2DdjpPwfphHgQ3Qm4s5wzCnEjiXm1TeZ+6/zBl89yKURXgv8Mw1JGdj/NcImQjtDcsNn97MscACK3GKbEJBA==} + peerDependencies: + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-blockquote@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-IEVe3goA0rgp1G8Wm733BSRJiy71Vh2fmTCyZKWmc2A6GREVSy1X3fCvAo6pMENRObhjIoaBQUCE3p4iJYOxqg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-bold@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-vhdkBtvd029ufOYt2ug49Gz+RLKSczO/CCqKYBqBmpIpsifyK7M6jkgamvAQg3c/vYk0LNcKiL2dp0Jp7L+5Gw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-bubble-menu@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-WFJJpZvl9DP94Y5RQZB/THDxvDbrTo8tuhjT7yWlhseJ6zyhWmRXdutt39wfSZNFxitv/As+s7cO9aYLML/TVg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + tippy.js: 6.3.7 + dev: false + + /@tiptap/extension-bullet-list@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-SOOVH2aSmdMtjWL7TTLbN72xbAFz2G5jifT4UCXb7Qx6LsyhNCyDCu0ukOW8rSosGoSdmBXxAsD9sBJ1jEOmZw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-code-block@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-QhmhCCWqg/5qLXpZ3sl2A0rqJqV8zMOegcxUFaqcJMOqNbsuHcRgc9C+1hWSVLbCmstB7M6sgF02QpTBOkYHxg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-code@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-G0UEbMFunujy/F86yHN0/dumPLbwTis9C+6IQv1XRPNsV28U0MgxBhlPcJUgyO5lwuleePDxiBVcRv2XrysgKw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-color@2.1.11(@tiptap/core@2.1.11)(@tiptap/extension-text-style@2.1.11): + resolution: {integrity: sha512-xfSfZRnNd40YtFfrXvzpGa2OZsRAZapq0Ce09q7bCEpudhiD7yIIVOjOjggagllOFnafKTwKkFaDLIA0K0eIwg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/extension-text-style': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-text-style': 2.1.11(@tiptap/core@2.1.11) + dev: false + + /@tiptap/extension-document@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-L/iLuqxvJep33ycCFNrnUhdR0VtcZyeNnqB+ZvVHzEwLoRud+LBy44lpEdBrAFsvRm3DG14m/FGYL+TfaD0vxA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-dropcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-MiJepRpHlu93aInOMW8NeRCvm9VE5rL0MA9TONY/IspJFGFIqonc/01J6t33JQa3Xh/x3xAfis4nKa/UazeVJw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-floating-menu@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-ExeoOQ6nT0CY0eWx6WjbG+osurXLXa7XrqIdhCAcTmzBAlGiKt8khX9qaZ+QF+BRK1r1lja2KX+5/fpLK7Dt1g==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + tippy.js: 6.3.7 + dev: false + + /@tiptap/extension-gapcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-P/xjyhSOVyop5XXbNtRPgrooQrSlpYblwR67ClI9FAC7uQliuOwi5VcndmEItjWWSe85kJa2IHjOS7mLYvJe8A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-hard-break@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-qhiPe6FA0b6PPb/ITlgSnY0l9tEVmXZ9e7eSjvks12ORfqL/dofSCLtChHWvhZxugzo92xejG2hXLi6lyOLbkg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-heading@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-QBtl0S1aDFB+F1wvTrS5iGdNUEeXp+WuTddj+L2f5EP4KqG2x7sj7e7ENMy20g/l8tbKwzd3AZZydvClH4Ybbw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-highlight@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-pcs55B1lF2vyQ8VvZob9CsYdbFgVpIfG3+qchLsA1WflUJCcIexstTclWTS9N5UocADg4hBOeerZ4ecq1iXs3w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-history@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-88dovV2O9icmBn0IvaArFFeS6X5ts6BxZPu5VbGML8KBL8iAu+Og7RXEPdOy5e13K0K4V21fDpO3n7KdvNOAYQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-horizontal-rule@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-uvHPa2YCKnDhtSBSZB3lk5U4H3wRKP0DNvVx4Y2F7MdQianVzcyOd1pZYO9BQs+lUB1aZots6doE69Zqz3mU2Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + dev: false + + /@tiptap/extension-image@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-dFFRvzl9F4fEcG95nyka72TeV127C1UVaMm816GHoFlVEFGV4yJ8NKgzT3UEDgFcs6OPwPlt8tuHuDeYm7EVOQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-italic@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-QmDsHtnBBit/1KtQpBPxjSPjDC1mVKtoNTgsEwMWK6YAkCKOKPj7oPEqqjaNZIRMKPPzE5XCsfBoS3jtVmo+6A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-link@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-Dn8hq4ld8br53fE4/QUZ7/y6ejY/kqAxeNhtud+OZKRs6VRn/CQd0H6A26opL+mKAK0kzrs0rh7rJPpHvahx/Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + linkifyjs: 4.1.1 + dev: false + + /@tiptap/extension-list-item@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-YhwHaPGhffsFsg/zjCu1G24//j/BTRDRZbZXmMwp77m1yEqPULcWyoWrI+gUzetQxJRD/ruAucqjLtoLLfICmQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-ordered-list@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-/tghfEJ5U7WFbF8xyOqRJks8KxP/lRjnroMXMglaushSMx8PYPo1dZDB/dJZw7ksy47MAaKJfKlx3gyN2CPXBQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-paragraph@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-gXMgJ2CU3X4yh1wKnb8RdbDmhITB76pH6DX0uWprmEgvzNMN3Qw+h5uBD9lgxg1WVghbCmkG9mY9J4PPbPTLxw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-strike@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-UnjeSVgu3bDuyjjUdWsUErRCoQKAHCzH/pAiqTEPEEdFYgZFQPBpcJICRVdlYjRmI2ZKh6d0TMUS55m7ckmwmQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-subscript@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-KXPrcN2i9edOyjsYc+WmXtRNod5rcA402NJEXKsSg/Lr7ezstdeE9CqVVpipdKDRBv5avJcSdCe3TiDLnFggBw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-superscript@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-Lhbg2Yhm0XWcBmdbvbRnF+2oVPWlAkCffMvB8hDRlJlrntzTp5Xv/FqNeO+VzkH6oU0oBiKL5jWYXZG7IQsZdQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-text-align@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-mRUouUZviU7OjzMbW5O728HsRl/T/Gue4DuNWaY2hiddlJWOpDmO/FYRR7JaAQjTr+16NCofRwgfWdJL3nyv5w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-text-style@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-+JDWmcSUyFKzMDm/1xqlk7e0qPJ1nQ/UKIRuDeRtqgbxTyEw4fNlkV2k7GHCoELXqxUoplzweLID+kM1Vk2OaA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-text@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-Iey0EXYv9079+lbHMvZtLc6XcYfKrq++msEXuFFNHxvL0i/XzndhGf+qlDhLROLgEtDiiTqzOBBwFCGlFjbDow==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/extension-underline@2.1.11(@tiptap/core@2.1.11): + resolution: {integrity: sha512-2C/jDNRV3WHfM5kgx6xB/1ooBciQ9j02gJVJkTHeLpz6zUWkxrRgU/u+FvZxGVBVskasJsQnsYMG9pAqwd9R8A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + dev: false + + /@tiptap/pm@2.1.11: + resolution: {integrity: sha512-vBIAic+H8fjHfT8r2qJkAOxdx1Iiss9+qMyujAoIdPkiyjEc4+sXcM0qSYgIr6KL5icITyuK8J7x/V62VfB7Uw==} + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.5.2 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.3.2 + prosemirror-inputrules: 1.2.1 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.11.2 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.19.3 + prosemirror-schema-basic: 1.2.2 + prosemirror-schema-list: 1.3.0 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.3.4 + prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0) + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.0 + dev: false + + /@tiptap/react@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OLU4uqMeCE/LKz/GY2P1JRykUgHJDoPROHUa1IOnVpj/1FbbBHDyurT3eomwsVzScTULbrKGwrS3ada6QAmTTA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-bubble-menu': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-floating-menu': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/pm': 2.1.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@tiptap/starter-kit@2.1.11(@tiptap/pm@2.1.11): + resolution: {integrity: sha512-kZXwuo9yxrs1ASxluRKjXThjdcy90d7owJxnJWD7SyEwXaXYc4h+Ar1M9rP3jieCDBuRTtCgvAOKbVbhnRJ2jg==} + dependencies: + '@tiptap/core': 2.1.11(@tiptap/pm@2.1.11) + '@tiptap/extension-blockquote': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-bold': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-bullet-list': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-code': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-code-block': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-document': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-dropcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-gapcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-hard-break': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-heading': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-history': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-horizontal-rule': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.11) + '@tiptap/extension-italic': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-list-item': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-ordered-list': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-paragraph': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-strike': 2.1.11(@tiptap/core@2.1.11) + '@tiptap/extension-text': 2.1.11(@tiptap/core@2.1.11) + transitivePeerDependencies: + - '@tiptap/pm' + dev: false + + /@types/babel__core@7.20.2: + resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + '@types/babel__generator': 7.6.5 + '@types/babel__template': 7.4.2 + '@types/babel__traverse': 7.20.2 + dev: true + + /@types/babel__generator@7.6.5: + resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@types/babel__template@7.4.2: + resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@types/babel__traverse@7.20.2: + resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@types/geojson@7946.0.11: + resolution: {integrity: sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==} + dev: true + + /@types/json-schema@7.0.13: + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + dev: true + + /@types/leaflet@1.9.6: + resolution: {integrity: sha512-HakGTK5LBBWegNWsAmTlG55zN1zszYec7aG47/z6SzT90bW2vqjmbqk3YKAbrtveO+G7fSTKTYqVbIwAFnTrbg==} + dependencies: + '@types/geojson': 7946.0.11 + dev: true + + /@types/object.omit@3.0.1: + resolution: {integrity: sha512-24XD34UeRWw505TsMNBrQ4bES2s8IxiFC59mmNUFhTz9IX2hAtA7gQ8wVww1i17QmhBYILg5iqYP2y7aqA3pwQ==} + dev: false + + /@types/object.pick@1.3.2: + resolution: {integrity: sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==} + dev: false + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/prop-types@15.7.8: + resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} + + /@types/react-dom@18.2.8: + resolution: {integrity: sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==} + dependencies: + '@types/react': 18.2.24 + dev: true + + /@types/react@18.2.24: + resolution: {integrity: sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==} + dependencies: + '@types/prop-types': 15.7.8 + '@types/scheduler': 0.16.4 + csstype: 3.1.2 + + /@types/scheduler@0.16.4: + resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==} + + /@types/semver@7.5.3: + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + dev: true + + /@types/throttle-debounce@2.1.0: + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + dev: false + + /@typescript-eslint/eslint-plugin@6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.9.0 + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/type-utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.3 + debug: 4.3.4 + eslint: 8.50.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.3 + debug: 4.3.4 + eslint: 8.50.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.7.3: + resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 + dev: true + + /@typescript-eslint/type-utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.50.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.7.3: + resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2): + resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@types/json-schema': 7.0.13 + '@types/semver': 7.5.3 + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + eslint: 8.50.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.7.3: + resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.3 + eslint-visitor-keys: 3.4.3 + dev: true + + /@vitejs/plugin-react@4.1.0(vite@4.4.9): + resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.0) + '@types/babel__core': 7.20.2 + react-refresh: 0.14.0 + vite: 4.4.9 + transitivePeerDependencies: + - supports-color + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.1 + cosmiconfig: 7.1.0 + resolve: 1.22.6 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001541 + electron-to-chromium: 1.4.537 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /caniuse-lite@1.0.30001541: + resolution: {integrity: sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==} + dev: true + + /case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /clsx@1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.0.9: + resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} + dev: false + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /dash-get@1.0.2: + resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} + dev: false + + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /electron-to-chromium@1.4.537: + resolution: {integrity: sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==} + dev: true + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-plugin-react-hooks@4.6.0(eslint@8.50.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-plugin-react-refresh@0.4.3(eslint@8.50.0): + resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/regexpp': 4.9.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.50.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.22.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-printf@1.6.9: + resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} + engines: {node: '>=10.0'} + dependencies: + boolean: 3.2.0 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.22.0: + resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: false + + /leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: false + + /linkifyjs@4.1.1: + resolution: {integrity: sha512-zFN/CTVmbcVef+WaDXT63dNzzkfRBKT1j464NJQkV7iSgJU0sLBus9W0HBwnXK13/hf168pbrx/V/bjEHOXNHA==} + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: false + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object.omit@3.0.0: + resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 1.0.1 + dev: false + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + dependencies: + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + dependencies: + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + dependencies: + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.0 + dev: false + + /prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-view: 1.32.0 + dev: false + + /prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.0 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.2.1: + resolution: {integrity: sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-markdown@1.11.2: + resolution: {integrity: sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==} + dependencies: + markdown-it: 13.0.2 + prosemirror-model: 1.19.3 + dev: false + + /prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.5.2 + prosemirror-history: 1.3.2 + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-model@1.19.3: + resolution: {integrity: sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-basic@1.2.2: + resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} + dependencies: + prosemirror-model: 1.19.3 + dev: false + + /prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + dependencies: + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + dependencies: + prosemirror-model: 1.19.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.0 + dev: false + + /prosemirror-tables@1.3.4: + resolution: {integrity: sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.32.0 + dev: false + + /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0): + resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} + peerDependencies: + prosemirror-model: ^1.19.0 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.31.2 + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/core-helpers': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-view: 1.32.0 + dev: false + + /prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + dependencies: + prosemirror-model: 1.19.3 + dev: false + + /prosemirror-view@1.32.0: + resolution: {integrity: sha512-HwW7IWgca6ehiW2PA48H/8yl0TakA0Ms5LgN5Krc97oar7GfjIKE/NocUsLe74Jq4mwyWKUNoBljE8WkXKZwng==} + dependencies: + prosemirror-model: 1.19.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-draggable@4.4.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-leaflet@4.2.1(leaflet@1.9.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==} + peerDependencies: + leaflet: ^1.9.0 + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@react-leaflet/core': 2.1.0(leaflet@1.9.4)(react-dom@18.2.0)(react@18.2.0) + leaflet: 1.9.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.24)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.6(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.24)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.24)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.0(@types/react@18.2.24)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.24)(react@18.2.0) + dev: false + + /react-router-dom@6.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.9.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.16.0(react@18.2.0) + dev: false + + /react-router@6.16.0(react@18.2.0): + resolution: {integrity: sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.9.0 + react: 18.2.0 + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-textarea-autosize@8.3.4(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.1 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.24)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + + /tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + dependencies: + '@popperjs/core': 2.11.8 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /use-callback-ref@1.3.0(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.24)(react@18.2.0) + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.24 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zustand@4.4.1(@types/react@18.2.24)(react@18.2.0): + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.24 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/web/public/blips/111.png b/web/public/blips/111.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf9c23c149e44009c270b4ab739238525d5f413 GIT binary patch literal 1464 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 yZ)9m^c>ppnF*q$TF)cAMR5CL!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+0817mQ2Plzi}0T#f-zzzfG zvP=xdrp8Q6Oh9pF24*&9Hg;}yAe)Vi4WOgYirxw-2CnLxBvhD|NQxL^3=(FJ$>JPef#$P z+vMq!ot>R0Po8}B($((n?sxCsUATPV-Me?m$;rwJ%8#Etj*O0EU}4~3;qY?vDlI8x zVq~hRsVONb`Ty&Gb!{~V56AMA%m4rT&&0-*otORX+qaV^PYUn|6yz8D{{6eYw*KAc zccEdS92^|C@84dsbjjA8TY;X<&dv^v3}t3!=HTX-K6U!z$B(_dy#xdV>>cg*@7@3R z@84-tr`g)sp1*V+=n*ddmRUebuO!GXn1O{~RhUt-;_|N_*IGrG?H>Gk8RYrqn`6uM z?>|+(Uin#mU;N)2Tc=B`H@>x8m#|3}a0lvSO!9VjVd!9$^#F1>3p^r=fph{Gf5>(M zS;1c7>Fdh=h?`qnMCqztYb{Vul&6bhh{fr-7jH&2IWVw3XmmJygw;q}cdJQm@D;^P zmrhMv=&Nh2yLnUX`@ip*c)6u^e7JM&=lKtY3}1wsWEODT`f?*pK1JgAgvq53&)=2H zH&R`4NwV*F&xJ1=^toM4y)SY6uLs7+w8VA60^ursM}J&h_daJ$Z&ZcpPs2lpv^9Hz z!{S6*9WI>G<`!NuRs84^m5Di8mrB8glbfGSe#2G#D9J8Jj>fyq{6p0o1_Y>FVdQ I&MBb@0PLc9`Tzg` literal 0 HcmV?d00001 diff --git a/web/public/blips/60.png b/web/public/blips/60.png new file mode 100644 index 0000000000000000000000000000000000000000..9b75f75c1f4a44cfeb4f264fa80994c6e43e3109 GIT binary patch literal 1081 zcmZ8fZA@Bc6n^p)mxEk>=>cIyWWur}>l+iDs=wo$Ab z?OfKnKXtPmVNGZ>rP{=7UEEyO&A81*o3z%<8Z&f?A|MDC0gF4dzqaST?|aU9&Ux;A z?#;biS+Qp;ErW&-+Nx5@t0875HkAaY{MMBb2;}2ZwG^R&FX$UON}{P(R;v+e$wSC= z385%ZCKp0Y7(&Zhge2DyVmI{sP*sKy!CtwqMgaqW`M`WE9CNR_Azyw0x7)q!U-tUF z-evF1^o%Fq@vM4GCevng6BZ5#<9HN@u}uIlQ5GeJ6bi?}UY{2R zW@l&J9{2e8IFQrR(=ZSYhkZU@C>DYQ$d~YVJdw2s9>DK^ci$WEf+gIKgEx&v12=4G zX@Qo@<$~da2QU&20}~2_*4Ea5hjL+I0lEW@fnYE=JUooY@VU9U72gV+UBqFky1Tm@&NPTcV(bmf^N98)m^j>6 zU9lgLm{JiTB{z>}i^l^B;?0fd^T4a5p$LyM6vW7->{Q%l~QqrOYjanhw%R1J#u8B zaFtMOX;2Ew6knY%*oyp|zb7%*$^Riz1ERCmBn$wgjex8mpAY9Q>?w$Ld zHQJumzmsRzUQ?_0j#ti`@<%&6Xm!R#UhY38>FJ|Cb=mIGrf8Z$qNPn&byjui#Gz(| zfO??!WW8+Y_gflDRpp&K`IsfI`xBK*T z`q!O>6KMzEEiRv#B9bS?)vlzezXoOV(<|Ie?u{OS^WkrUT$}a5!z1OS^4+BNPmhb` zQagLn0zbD|^5|)5A92&!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081LMU2pAc7|0kDr&17eyB2At*2e0s})JM^r-8!Or@&c@!x z!QLS@I@Zw<=vf$GVh|A&VPj$g^4VC}L`6jzm_SnMYU-QTZ(;-km{Kqev;}SvGMjNm6w+P{rk7L zw0QoU`7`ItoWE%P)vH%IcsQ_r^5x5n*)z_bKAV=FmY$xzdBbLP zb@fH}89oBt7hV$N7tFxO#H>7J&b+xQ^>qy_wKbwUcZkgX_je}it$%-Std=}?o@4)B zc9%cD*00;O=P&oQ!he5D{sF;XATH*MyYjC-q5j|H%76bZUn%44e)@TbzQNuvuRGX| z{^p(sw1P3o+uensgH_f8$l)yTh%5%u31Ivo+vz-z!CvC&>&pI!n_FB&?UJ)&3Q*5> zPZ!4!i_^&o3%C+eQVucAn3?!VXHCwV2nKd-^$^DJ3KtbI0l{;;!2+VP!rh#Y7bS32 zJQCi}RH3KB+Uc30Ai1z%y1uHSsje*Vl2nx=pPm0GD$JNPp>d^xsbZXmgbat$qM4j4 zBO`oHhzO@MX-$|g#mnQwiF1z3J6CdYUNYL_!0NN9@@F9@tAv8$G6R3H6sG1mHGw8( z@yA58Pc+J|ToEGF?&}z{auZiXPt9l$V%&D z(a}*?J>s*$Xd9c>hK*Zi%gi=7dhehhr-h}zXUEJ}N!iSPLF@9~U0zoGLFu_E=XuG? zY3DvAwWQeO%g5XQXSi}lLPA7F=+#+{)3b#V&+ue4So$tZiUuWni!&|2e9L-29Zxv`RD$ bMg~^K77z^@7V>|9HZXX)`njxgN@xNAGOM-` literal 0 HcmV?d00001 diff --git a/web/public/vite.svg b/web/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/web/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/App.css b/web/src/App.css new file mode 100644 index 0000000..31addfa --- /dev/null +++ b/web/src/App.css @@ -0,0 +1,19 @@ +.app-container { + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.opacity { + opacity: 0.5; +} + +.mdt { + display: flex; + height: 900px; + width: 1750px; + background-color: var(--main-bg-color); + border-radius: 5px; +} \ No newline at end of file diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 0000000..a29cb32 --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import MDT from './layers/mdt/MDT'; +import Dev from './layers/dev/Dev'; +import { isEnvBrowser } from './utils/misc'; +import DispatchNotifications from './layers/notifications/DispatchNotifications'; +import Dispatch from './layers/dispatch/Disptach'; + +function App() { + return ( + <> + + + + {isEnvBrowser() && } + + ); +} + +export default App; \ No newline at end of file diff --git a/web/src/assets/lspd.png b/web/src/assets/lspd.png new file mode 100644 index 0000000000000000000000000000000000000000..da54aab1c0b13cb72f1f510019cfd6be2eb73065 GIT binary patch literal 51110 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 TXW{nrng9R*9b?@=0000043DjW literal 0 HcmV?d00001 diff --git a/web/src/assets/police-logo.png b/web/src/assets/police-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..07ba04796aa1f157596b791244586fef38236912 GIT binary patch literal 117044 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%0A06JnFkMu$Oy^*SQgZ>Xxl9pt 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

8snbzH|r(KIUM7N+G>Ydfsx%4Bmjme*>` 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