git: 1054fc2ae4a8 - main - cad/cura: upgrade to 5.7.0

From: Diane Bruce <db_at_FreeBSD.org>
Date: Wed, 04 Sep 2024 21:03:17 UTC
The branch main has been updated by db:

URL: https://cgit.FreeBSD.org/ports/commit/?id=1054fc2ae4a857c574d61b83e67aab3e723318b6

commit 1054fc2ae4a857c574d61b83e67aab3e723318b6
Author:     Matthieu Volat <mazhe@alkumuna.eu>
AuthorDate: 2024-09-04 21:01:44 +0000
Commit:     Diane Bruce <db@FreeBSD.org>
CommitDate: 2024-09-04 21:01:44 +0000

    cad/cura: upgrade to 5.7.0
    
    - rework build system
    
    PR:             ports/272857
---
 cad/cura/Makefile                                  |   51 +-
 cad/cura/distinfo                                  |    6 +-
 cad/cura/files/CMakeLists.txt                      |  104 +
 cad/cura/files/CuraPluginInstall.cmake             |  105 +
 cad/cura/files/CuraTests.cmake                     |   84 +
 cad/cura/files/CuraVersion.py.in                   |   13 +
 cad/cura/files/com.ultimaker.cura.appdata.xml      |   33 +
 cad/cura/files/com.ultimaker.cura.desktop.in       |   19 +
 cad/cura/files/mod_bundled_packages_json.py        |   73 +
 cad/cura/files/patch-CMakeLists.txt                |   11 -
 .../files/patch-cura_OAuth2_KeyringAttribute.py    |   11 -
 cad/cura/files/patch-cura__app.py                  |    8 -
 ...ns_USBPrinting_USBPrinterOutputDeviceManager.py |   14 -
 cad/cura/pkg-plist                                 | 6571 +++++++++++++++-----
 14 files changed, 5516 insertions(+), 1587 deletions(-)

diff --git a/cad/cura/Makefile b/cad/cura/Makefile
index d9439b86d05a..86e7e0149e2a 100644
--- a/cad/cura/Makefile
+++ b/cad/cura/Makefile
@@ -1,6 +1,5 @@
 PORTNAME=	Cura
-DISTVERSION=	4.13.1
-PORTREVISION=	4
+DISTVERSION=	5.7.0
 PORTEPOCH=	2
 CATEGORIES=	cad
 DIST_SUBDIR=	Ultimaker
@@ -12,46 +11,50 @@ WWW=		https://github.com/Ultimaker/Cura/wiki
 LICENSE=	AGPLv3
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-DEPRECATED=	Depends on expired devel/libsavitar and devel/py-pynest2d
-EXPIRATION_DATE=2024-07-31
-
 BUILD_DEPENDS=	Uranium>0,1:cad/uranium
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}zeroconf>0:net/py-zeroconf@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pyserial>0:comms/py-pyserial@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}shapely>0:devel/py-shapely@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}numpy-stl>0:math/py-numpy-stl@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}keyring>0:security/py-keyring@${PY_FLAVOR} \
-		qt5-graphicaleffects>0:graphics/qt5-graphicaleffects \
-		qt5-quickcontrols>0:x11-toolkits/qt5-quickcontrols \
-		qt5-quickcontrols2>0:x11-toolkits/qt5-quickcontrols2 \
 		Uranium>=${DISTVERSION}:cad/uranium \
-		libCharon>=4.13.0:net/libcharon \
+		libCharon>=5.0.0:net/libcharon \
 		CuraEngine>=${DISTVERSION}:cad/cura-engine \
-		fdm_materials>=4.13.0:cad/fdm_materials \
+		fdm_materials>=${DISTVERSION}:cad/fdm_materials \
 		${PYTHON_PKGNAMEPREFIX}trimesh>0:devel/py-trimesh@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}pynest2d>=4.12.1:devel/py-pynest2d@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pynest2d>=5.3.0:devel/py-pynest2d@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}sentry-sdk>0:devel/py-sentry-sdk@${PY_FLAVOR} \
-		libArcus>=${DISTVERSION}:net/libarcus \
-		libSavitar>=${DISTVERSION}:devel/libsavitar
+		libArcus>=5.3.0:net/libarcus \
+		libSavitar>=5.3.0:devel/libsavitar
 LIB_DEPENDS=	libArcus.so:net/libarcus \
 		libSavitar.so:devel/libsavitar
 
-USES=		cmake gettext shebangfix python pyqt:5 \
+USES=		cmake gettext shebangfix python pyqt:6 \
 		desktop-file-utils shared-mime-info
-USE_PYQT=	pyqt5
-CMAKE_ARGS+=	-DURANIUM_SCRIPTS_DIR:STRING="${LOCALBASE}/share/uranium/scripts" \
-	-DCURA_VERSION=${DISTVERSION}
+USE_PYQT=	pyqt6
+CMAKE_ARGS+=	-DURANIUM_DIR:STRING="${LOCALBASE}/share/uranium" \
+		-DCURA_VERSION:STRING=${DISTVERSION}
 USE_GITHUB=	yes
 GH_ACCOUNT=	Ultimaker
 NO_ARCH=	yes
 SHEBANG_FILES=	cura_app.py
 
-pre-configure:
-	${REINPLACE_CMD} -e 's|%%DISTVERSION%%|${DISTVERSION}|' \
-		${WRKSRC}/CMakeLists.txt
-
-post-patch:
-	${REINPLACE_CMD} -e 's|%%PYTHON_CMD%%|${PYTHON_CMD}|' \
-		${WRKSRC}/cura_app.py
+#pre-configure:
+#	${REINPLACE_CMD} -e 's|%%DISTVERSION%%|${DISTVERSION}|' \
+#		${WRKSRC}/CMakeLists.txt
+#
+#post-patch:
+#	${REINPLACE_CMD} -e 's|%%PYTHON_CMD%%|${PYTHON_CMD}|' \
+#		${WRKSRC}/cura_app.py
+
+post-extract:
+	@${MKDIR} ${WRKSRC}/cmake
+	@for f in CuraPluginInstall.cmake CuraTests.cmake mod_bundled_packages_json.py; do \
+		${CP} ${FILESDIR}/$$f ${WRKSRC}/cmake; \
+		done
+	@for f in CMakeLists.txt com.ultimaker.cura.desktop.in com.ultimaker.cura.appdata.xml; do \
+		${CP} ${FILESDIR}/$$f ${WRKSRC}; \
+		done
+	@${CP} ${FILESDIR}/CuraVersion.py.in ${WRKSRC}/cura
 
 .include <bsd.port.mk>
diff --git a/cad/cura/distinfo b/cad/cura/distinfo
index fe51e1450d13..f1b5d4a41cfa 100644
--- a/cad/cura/distinfo
+++ b/cad/cura/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1645697504
-SHA256 (Ultimaker/Ultimaker-Cura-4.13.1_GH0.tar.gz) = bda67f620a6245d0ddfbf6df7c2dcfdec88be152dfb7290ae06d8dcb35c4459c
-SIZE (Ultimaker/Ultimaker-Cura-4.13.1_GH0.tar.gz) = 42339030
+TIMESTAMP = 1713952778
+SHA256 (Ultimaker/Ultimaker-Cura-5.7.0_GH0.tar.gz) = 95c9abcb3688cae6349a83dadec3e31dead0698a22ec68d93430a0fd4c15d130
+SIZE (Ultimaker/Ultimaker-Cura-5.7.0_GH0.tar.gz) = 53143171
diff --git a/cad/cura/files/CMakeLists.txt b/cad/cura/files/CMakeLists.txt
new file mode 100644
index 000000000000..36a71efa0974
--- /dev/null
+++ b/cad/cura/files/CMakeLists.txt
@@ -0,0 +1,104 @@
+project(cura)
+cmake_minimum_required(VERSION 3.6)
+
+include(GNUInstallDirs)
+
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+
+set(URANIUM_DIR "${CMAKE_SOURCE_DIR}/../Uranium" CACHE PATH "The location of the Uranium repository")
+set(URANIUM_SCRIPTS_DIR "${URANIUM_DIR}/scripts" CACHE PATH "The location of the scripts directory of the Uranium repository")
+
+# Tests
+include(CuraTests)
+
+option(CURA_DEBUGMODE "Enable debug dialog and other debug features" OFF)
+if(CURA_DEBUGMODE)
+    set(_cura_debugmode "ON")
+endif()
+
+option(GENERATE_TRANSLATIONS "Should the translations be generated?" ON)
+
+set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder")
+set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura")
+set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
+set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'")
+set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root")
+set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version")
+set(CURA_CLOUD_ACCOUNT_API_ROOT "" CACHE STRING "Alternative Cura cloud account API version")
+set(CURA_MARKETPLACE_ROOT "" CACHE STRING "Alternative Marketplace location")
+set(CURA_DIGITAL_FACTORY_URL "" CACHE STRING "Alternative Digital Factory location")
+
+configure_file(${CMAKE_SOURCE_DIR}/com.ultimaker.cura.desktop.in ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop @ONLY)
+
+configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
+
+
+# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
+# So we're using the old method here, with FindPythonInterp for now.
+#find_package(PythonInterp 3 REQUIRED)
+#
+#set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+#
+#set(Python3_VERSION ${PYTHON_VERSION_STRING})
+#set(Python3_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
+#set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR})
+#set(Python3_VERSION_PATCH ${PYTHON_VERSION_PATCH})
+find_package(Python3 REQUIRED)
+
+if(NOT ${URANIUM_DIR} STREQUAL "")
+    set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake")
+endif()
+if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
+    list(APPEND CMAKE_MODULE_PATH ${URANIUM_DIR}/cmake)
+    include(UraniumTranslationTools)
+    # Extract Strings
+    add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
+    # Build Translations
+    if(${GENERATE_TRANSLATIONS})
+        CREATE_TRANSLATION_TARGETS()
+    endif()
+endif()
+
+
+install(DIRECTORY resources
+        DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
+
+include(CuraPluginInstall)
+
+if(NOT APPLE AND NOT WIN32)
+    install(FILES cura_app.py
+            DESTINATION ${CMAKE_INSTALL_BINDIR}
+            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+            RENAME cura)
+    if(EXISTS /etc/debian_version)
+        install(DIRECTORY cura
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages
+            FILES_MATCHING PATTERN *.py)
+        install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages/cura)
+    else()
+        install(DIRECTORY cura
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
+            FILES_MATCHING PATTERN *.py)
+        install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
+    endif()
+    install(FILES ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop
+            DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
+    install(FILES ${CMAKE_SOURCE_DIR}/resources/images/cura-icon.png
+            DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/)
+    install(FILES com.ultimaker.cura.appdata.xml
+            DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
+    install(FILES cura.sharedmimeinfo
+            DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/
+            RENAME cura.xml )
+else()
+    install(FILES cura_app.py
+            DESTINATION ${CMAKE_INSTALL_BINDIR}
+            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+    install(DIRECTORY cura
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
+            FILES_MATCHING PATTERN *.py)
+    install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
+            DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
+endif()
diff --git a/cad/cura/files/CuraPluginInstall.cmake b/cad/cura/files/CuraPluginInstall.cmake
new file mode 100644
index 000000000000..8d9efe1f1207
--- /dev/null
+++ b/cad/cura/files/CuraPluginInstall.cmake
@@ -0,0 +1,105 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# CuraPluginInstall.cmake is released under the terms of the LGPLv3 or higher.
+
+#
+# This module detects all plugins that need to be installed and adds them using the CMake install() command.
+# It detects all plugin folder in the path "plugins/*" where there's a "plugin.json" in it.
+#
+# Plugins can be configured to NOT BE INSTALLED via the variable "CURA_NO_INSTALL_PLUGINS" as a list of string in the
+# form of "a;b;c" or "a,b,c". By default all plugins will be installed.
+#
+
+option(PRINT_PLUGIN_LIST "Should the list of plugins that are installed be printed?" ON)
+
+# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
+# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
+# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
+if(${CMAKE_VERSION} VERSION_LESS 3.12)
+    # Use FindPythonInterp and FindPythonLibs for CMake <3.12
+    find_package(PythonInterp 3 REQUIRED)
+
+    set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+else()
+    # Use FindPython3 for CMake >=3.12
+    find_package(Python3 REQUIRED COMPONENTS Interpreter)
+endif()
+
+# Options or configuration variables
+set(CURA_NO_INSTALL_PLUGINS "" CACHE STRING "A list of plugins that should not be installed, separated with ';' or ','.")
+
+file(GLOB_RECURSE _plugin_json_list ${CMAKE_SOURCE_DIR}/plugins/*/plugin.json)
+list(LENGTH _plugin_json_list _plugin_json_list_len)
+
+# Sort the lists alphabetically so we can handle cases like this:
+#   - plugins/my_plugin/plugin.json
+#   - plugins/my_plugin/my_module/plugin.json
+# In this case, only "plugins/my_plugin" should be added via install().
+set(_no_install_plugin_list ${CURA_NO_INSTALL_PLUGINS})
+# Sanitize the string so the comparison will be case-insensitive.
+string(STRIP   "${_no_install_plugin_list}" _no_install_plugin_list)
+string(TOLOWER "${_no_install_plugin_list}" _no_install_plugin_list)
+
+# WORKAROUND counterpart of what's in cura-build.
+string(REPLACE "," ";" _no_install_plugin_list "${_no_install_plugin_list}")
+
+list(LENGTH _no_install_plugin_list _no_install_plugin_list_len)
+
+if(_no_install_plugin_list_len GREATER 0)
+    list(SORT _no_install_plugin_list)
+endif()
+if(_plugin_json_list_len GREATER 0)
+    list(SORT _plugin_json_list)
+endif()
+
+# Check all plugin directories and add them via install() if needed.
+set(_install_plugin_list "")
+foreach(_plugin_json_path ${_plugin_json_list})
+    get_filename_component(_plugin_dir ${_plugin_json_path} DIRECTORY)
+    file(RELATIVE_PATH _rel_plugin_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dir})
+    get_filename_component(_plugin_dir_name ${_plugin_dir} NAME)
+
+    # Make plugin name comparison case-insensitive
+    string(TOLOWER "${_plugin_dir_name}" _plugin_dir_name_lowercase)
+
+    # Check if this plugin needs to be skipped for installation
+    set(_add_plugin ON)  # Indicates if this plugin should be added to the build or not.
+    set(_is_no_install_plugin OFF)  # If this plugin will not be added, this indicates if it's because the plugin is
+                                    # specified in the NO_INSTALL_PLUGINS list.
+    if(_no_install_plugin_list)
+        if("${_plugin_dir_name_lowercase}" IN_LIST _no_install_plugin_list)
+            set(_add_plugin OFF)
+            set(_is_no_install_plugin ON)
+        endif()
+    endif()
+
+    # Make sure this is not a subdirectory in a plugin that's already in the install list
+    if(_add_plugin)
+        foreach(_known_install_plugin_dir ${_install_plugin_list})
+            if(_plugin_dir MATCHES "${_known_install_plugin_dir}.+")
+                set(_add_plugin OFF)
+                break()
+            endif()
+        endforeach()
+    endif()
+
+    if(_add_plugin)
+        if(${PRINT_PLUGIN_LIST})
+            message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}")
+        endif()
+        get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY)
+        install(DIRECTORY ${_rel_plugin_dir}
+                DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir}
+                PATTERN "__pycache__" EXCLUDE
+                PATTERN "*.qmlc" EXCLUDE
+                )
+        list(APPEND _install_plugin_list ${_plugin_dir})
+    elseif(_is_no_install_plugin)
+        if(${PRINT_PLUGIN_LIST})
+            message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}")
+        endif()
+        execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py
+                        -d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages
+                        ${_plugin_dir_name}
+                        RESULT_VARIABLE _mod_json_result)
+    endif()
+endforeach()
diff --git a/cad/cura/files/CuraTests.cmake b/cad/cura/files/CuraTests.cmake
new file mode 100644
index 000000000000..69b13c6a3224
--- /dev/null
+++ b/cad/cura/files/CuraTests.cmake
@@ -0,0 +1,84 @@
+# Copyright (c) 2018 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+include(CTest)
+include(CMakeParseArguments)
+
+# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
+# So we're using the old method here, with FindPythonInterp for now.
+#find_package(PythonInterp 3 REQUIRED)
+#
+#set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+find_package(Python3 REQUIRED)
+
+add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
+
+function(cura_add_test)
+    set(_single_args NAME DIRECTORY PYTHONPATH)
+    cmake_parse_arguments("" "" "${_single_args}" "" ${ARGN})
+
+    if(NOT _NAME)
+        message(FATAL_ERROR "cura_add_test requires a test name argument")
+    endif()
+
+    if(NOT _DIRECTORY)
+        message(FATAL_ERROR "cura_add_test requires a directory to test")
+    endif()
+
+    if(NOT _PYTHONPATH)
+        set(_PYTHONPATH ${_DIRECTORY})
+    endif()
+    
+    if(WIN32)
+        string(REPLACE "|" "\\;" _PYTHONPATH ${_PYTHONPATH})
+        set(_PYTHONPATH "${_PYTHONPATH}\\;$ENV{PYTHONPATH}")
+    else()
+        string(REPLACE "|" ":" _PYTHONPATH ${_PYTHONPATH})
+        set(_PYTHONPATH "${_PYTHONPATH}:$ENV{PYTHONPATH}")
+    endif()
+
+    get_test_property(${_NAME} ENVIRONMENT test_exists) #Find out if the test exists by getting a property from it that always exists (such as ENVIRONMENT because we set that ourselves).
+    if (NOT ${test_exists})
+        add_test(
+            NAME ${_NAME}
+            COMMAND ${Python3_EXECUTABLE} -m pytest --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY}
+        )
+        set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT LANG=C)
+        set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${_PYTHONPATH}")
+    else()
+        message(WARNING "Duplicate test ${_NAME}!")
+    endif()
+endfunction()
+
+
+#Add code style test.
+add_test(
+    NAME "code-style"
+    COMMAND ${Python3_EXECUTABLE} run_mypy.py
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+
+#Add test for import statements which are not compatible with all builds
+add_test(
+    NAME "invalid-imports"
+    COMMAND ${Python3_EXECUTABLE} scripts/check_invalid_imports.py
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+
+cura_add_test(NAME pytest-main DIRECTORY ${CMAKE_SOURCE_DIR}/tests PYTHONPATH "${CMAKE_SOURCE_DIR}|${URANIUM_DIR}")
+
+file(GLOB_RECURSE _plugins plugins/*/__init__.py)
+foreach(_plugin ${_plugins})
+    get_filename_component(_plugin_directory ${_plugin} DIRECTORY)
+    if(EXISTS ${_plugin_directory}/tests)
+        get_filename_component(_plugin_name ${_plugin_directory} NAME)
+        cura_add_test(NAME pytest-${_plugin_name} DIRECTORY ${_plugin_directory} PYTHONPATH "${_plugin_directory}|${CMAKE_SOURCE_DIR}|${URANIUM_DIR}")
+    endif()
+endforeach()
+
+#Add test for whether the shortcut alt-keys are unique in every translation.
+add_test(
+    NAME "shortcut-keys"
+    COMMAND ${Python3_EXECUTABLE} scripts/check_shortcut_keys.py
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
diff --git a/cad/cura/files/CuraVersion.py.in b/cad/cura/files/CuraVersion.py.in
new file mode 100644
index 000000000000..ce2264f5fc9c
--- /dev/null
+++ b/cad/cura/files/CuraVersion.py.in
@@ -0,0 +1,13 @@
+# Copyright (c) 2020 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+CuraAppName = "@CURA_APP_NAME@"
+CuraAppDisplayName = "@CURA_APP_DISPLAY_NAME@"
+CuraVersion = "@CURA_VERSION@"
+CuraBuildType = "@CURA_BUILDTYPE@"
+CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False
+CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@"
+CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@"
+CuraCloudAccountAPIRoot = "@CURA_CLOUD_ACCOUNT_API_ROOT@"
+CuraMarketplaceRoot = "@CURA_MARKETPLACE_ROOT@"
+CuraDigitalFactoryURL = "@CURA_DIGITAL_FACTORY_URL@"
diff --git a/cad/cura/files/com.ultimaker.cura.appdata.xml b/cad/cura/files/com.ultimaker.cura.appdata.xml
new file mode 100644
index 000000000000..bdd25e5242a4
--- /dev/null
+++ b/cad/cura/files/com.ultimaker.cura.appdata.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop">
+  <id>com.ultimaker.cura.desktop</id>
+  <metadata_license>CC0-1.0</metadata_license>
+  <project_license>LGPL-3.0 and CC-BY-SA-4.0</project_license>
+  <name>Cura</name>
+  <summary>The world's most advanced 3d printer software</summary>
+  <description>
+    <p>
+      Cura creates a seamless integration between hardware, software and
+      materials for the best 3D printing experience around.
+      Cura supports the 3MF, OBJ and STL file formats and is available on
+      Windows, Mac and Linux.
+    </p>
+    <ul>
+      <li>Novices can start printing right away</li>
+      <li>Experts are able to customize 300 settings to achieve the best results</li>
+      <li>Optimized profiles for Ultimaker materials</li>
+      <li>Supported by a global network of Ultimaker certified service partners</li>
+      <li>Print multiple objects at once with different settings for each object</li>
+      <li>Cura supports STL, 3MF and OBJ file formats</li>
+      <li>Open source and completely free</li>
+    </ul>
+  </description>
+  <screenshots>
+    <screenshot type="default">
+      <image>https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png</image>
+    </screenshot>
+  </screenshots>
+  <url type="homepage">https://ultimaker.com/software/ultimaker-cura?utm_source=cura&amp;utm_medium=software&amp;utm_campaign=cura-update-linux</url>
+  <translation type="gettext">Cura</translation>
+</component>
diff --git a/cad/cura/files/com.ultimaker.cura.desktop.in b/cad/cura/files/com.ultimaker.cura.desktop.in
new file mode 100644
index 000000000000..1e17e30f4e0c
--- /dev/null
+++ b/cad/cura/files/com.ultimaker.cura.desktop.in
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Name=Ultimaker Cura
+Name[de]=Ultimaker Cura
+Name[nl]=Ultimaker Cura
+GenericName=3D Printing Software
+GenericName[de]=3D-Druck-Software
+GenericName[nl]=3D-printsoftware
+Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great.
+Comment[de]=Cura wandelt 3D-Modelle in Pfade für einen 3D-Drucker um. Es bereitet Ihren Druck für maximale Genauigkeit, minimale Druckzeit und guter Zuverlässigkeit mit vielen zusätzlichen Funktionen vor, damit Ihr Druck großartig wird.
+Comment[nl]=Cura converteert 3D-modellen naar paden voor een 3D printer. Het bereidt je print voor om zeer precies, snel en betrouwbaar te kunnen printen, met veel extra functionaliteit om je print er goed uit te laten komen.
+Exec=@CMAKE_INSTALL_FULL_BINDIR@/cura %F
+TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura
+Icon=cura-icon
+Terminal=false
+Type=Application
+MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip;
+Categories=Graphics;
+Keywords=3D;Printing;Slicer;
+StartupWMClass=cura.real
diff --git a/cad/cura/files/mod_bundled_packages_json.py b/cad/cura/files/mod_bundled_packages_json.py
new file mode 100644
index 000000000000..e03261b4799b
--- /dev/null
+++ b/cad/cura/files/mod_bundled_packages_json.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+#
+# This script removes the given package entries in the bundled_packages JSON files. This is used by the PluginInstall
+# CMake module.
+#
+
+import argparse
+import collections
+import json
+import os
+import sys
+
+
+def find_json_files(work_dir: str) -> list:
+    """Finds all JSON files in the given directory recursively and returns a list of those files in absolute paths.
+
+    :param work_dir: The directory to look for JSON files recursively.
+    :return: A list of JSON files in absolute paths that are found in the given directory.
+    """
+
+    json_file_list = []
+    for root, dir_names, file_names in os.walk(work_dir):
+        for file_name in file_names:
+            abs_path = os.path.abspath(os.path.join(root, file_name))
+            json_file_list.append(abs_path)
+    return json_file_list
+
+
+def remove_entries_from_json_file(file_path: str, entries: list) -> None:
+    """Removes the given entries from the given JSON file. The file will modified in-place.
+
+    :param file_path: The JSON file to modify.
+    :param entries: A list of strings as entries to remove.
+    :return: None
+    """
+
+    try:
+        with open(file_path, "r", encoding = "utf-8") as f:
+            package_dict = json.load(f, object_hook = collections.OrderedDict)
+    except Exception as e:
+        msg = "Failed to load '{file_path}' as a JSON file. This file will be ignored Exception: {e}"\
+            .format(file_path = file_path, e = e)
+        sys.stderr.write(msg + os.linesep)
+        return
+
+    for entry in entries:
+        if entry in package_dict:
+            del package_dict[entry]
+            print("[INFO] Remove entry [{entry}] from [{file_path}]".format(file_path = file_path, entry = entry))
+
+    try:
+        with open(file_path, "w", encoding = "utf-8", newline = "\n") as f:
+            json.dump(package_dict, f, indent = 4)
+    except Exception as e:
+        msg = "Failed to write '{file_path}' as a JSON file. Exception: {e}".format(file_path = file_path, e = e)
+        raise IOError(msg)
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser("mod_bundled_packages_json")
+    parser.add_argument("-d", "--dir", dest = "work_dir",
+                        help = "The directory to look for bundled packages JSON files, recursively.")
+    parser.add_argument("entries", metavar = "ENTRIES", type = str, nargs = "+")
+
+    args = parser.parse_args()
+
+    json_file_list = find_json_files(args.work_dir)
+    for json_file_path in json_file_list:
+        remove_entries_from_json_file(json_file_path, args.entries)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/cad/cura/files/patch-CMakeLists.txt b/cad/cura/files/patch-CMakeLists.txt
deleted file mode 100644
index f3a947f4cfa8..000000000000
--- a/cad/cura/files/patch-CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
---- CMakeLists.txt.orig	2020-12-25 04:46:02 UTC
-+++ CMakeLists.txt
-@@ -20,7 +20,7 @@ option(GENERATE_TRANSLATIONS "Should the translations 
- 
- set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder")
- set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura")
--set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
-+set(CURA_VERSION "%%DISTVERSION%%" CACHE STRING "Version name of Cura")
- set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'")
- set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root")
- set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version")
diff --git a/cad/cura/files/patch-cura_OAuth2_KeyringAttribute.py b/cad/cura/files/patch-cura_OAuth2_KeyringAttribute.py
deleted file mode 100644
index d38210f76b94..000000000000
--- a/cad/cura/files/patch-cura_OAuth2_KeyringAttribute.py
+++ /dev/null
@@ -1,11 +0,0 @@
---- cura/OAuth2/KeyringAttribute.py.orig	2022-04-28 04:59:10 UTC
-+++ cura/OAuth2/KeyringAttribute.py
-@@ -5,7 +5,7 @@ from typing import Type, TYPE_CHECKING, Optional, List
- from io import BlockingIOError
- import keyring
- from keyring.backend import KeyringBackend
--from keyring.errors import NoKeyringError, PasswordSetError, KeyringLocked
-+from keyring.errors import PasswordSetError, KeyringLocked
- 
- from UM.Logger import Logger
- 
diff --git a/cad/cura/files/patch-cura__app.py b/cad/cura/files/patch-cura__app.py
deleted file mode 100644
index 519db7713567..000000000000
--- a/cad/cura/files/patch-cura__app.py
+++ /dev/null
@@ -1,8 +0,0 @@
---- cura_app.py.orig	2020-02-28 16:06:57 UTC
-+++ cura_app.py
-@@ -1,4 +1,4 @@
--#!/usr/bin/env python3.8
-+#!/usr/bin/env %%PYTHON_CMD%%
- 
- # Copyright (c) 2022 Ultimaker B.V.
- # Cura is released under the terms of the LGPLv3 or higher.
diff --git a/cad/cura/files/patch-plugins_USBPrinting_USBPrinterOutputDeviceManager.py b/cad/cura/files/patch-plugins_USBPrinting_USBPrinterOutputDeviceManager.py
deleted file mode 100644
index 553286321d79..000000000000
--- a/cad/cura/files/patch-plugins_USBPrinting_USBPrinterOutputDeviceManager.py
+++ /dev/null
@@ -1,14 +0,0 @@
-We cannot really distinguish between USB and non-USB here,
-as port[2] is 'n/a' on FreeBSD.
-
---- plugins/USBPrinting/USBPrinterOutputDeviceManager.py.orig	2020-07-23 19:29:25 UTC
-+++ plugins/USBPrinting/USBPrinterOutputDeviceManager.py
-@@ -123,8 +123,6 @@
-                 port = (port.device, port.description, port.hwid)
-             if not port[2]:  # HWID may be None if the device is not USB or the system doesn't report the type.
-                 continue
--            if only_list_usb and not port[2].startswith("USB"):
--                continue
- 
-             # To prevent cura from messing with serial ports of other devices,
-             # filter by regular expressions passed in as environment variables.
diff --git a/cad/cura/pkg-plist b/cad/cura/pkg-plist
index 91c63c37cc88..efbb18c24866 100644
--- a/cad/cura/pkg-plist
+++ b/cad/cura/pkg-plist
@@ -1,15 +1,25 @@
 bin/cura
+lib/cura/plugins/3MFReader/SpecificSettingsModel.py
 lib/cura/plugins/3MFReader/ThreeMFReader.py
 lib/cura/plugins/3MFReader/ThreeMFWorkspaceReader.py
-lib/cura/plugins/3MFReader/UpdatableMachinesModel.py
 lib/cura/plugins/3MFReader/WorkspaceDialog.py
 lib/cura/plugins/3MFReader/WorkspaceDialog.qml
+lib/cura/plugins/3MFReader/WorkspaceRow.qml
+lib/cura/plugins/3MFReader/WorkspaceSection.qml
 lib/cura/plugins/3MFReader/__init__.py
 lib/cura/plugins/3MFReader/plugin.json
+lib/cura/plugins/3MFWriter/SettingExport.py
+lib/cura/plugins/3MFWriter/SettingSelection.qml
+lib/cura/plugins/3MFWriter/SettingsExportGroup.py
+lib/cura/plugins/3MFWriter/SettingsExportModel.py
+lib/cura/plugins/3MFWriter/SettingsSelectionGroup.qml
 lib/cura/plugins/3MFWriter/ThreeMFWorkspaceWriter.py
 lib/cura/plugins/3MFWriter/ThreeMFWriter.py
+lib/cura/plugins/3MFWriter/UCPDialog.py
+lib/cura/plugins/3MFWriter/UCPDialog.qml
 lib/cura/plugins/3MFWriter/__init__.py
 lib/cura/plugins/3MFWriter/plugin.json
+lib/cura/plugins/3MFWriter/tests/TestMFWriter.py
 lib/cura/plugins/AMFReader/AMFReader.py
 lib/cura/plugins/AMFReader/__init__.py
 lib/cura/plugins/AMFReader/plugin.json
@@ -26,7 +36,7 @@ lib/cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml
 lib/cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml
 lib/cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml
 lib/cura/plugins/CuraDrive/src/qml/components/BackupListItemDetailsRow.qml
-lib/cura/plugins/CuraDrive/src/qml/images/icon.png
+lib/cura/plugins/CuraDrive/src/qml/images/backup.svg
 lib/cura/plugins/CuraDrive/src/qml/main.qml
 lib/cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml
 lib/cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml
@@ -135,6 +145,52 @@ lib/cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml
 lib/cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml
 lib/cura/plugins/MachineSettingsAction/__init__.py
 lib/cura/plugins/MachineSettingsAction/plugin.json
+lib/cura/plugins/MakerbotWriter/MakerbotWriter.py
+lib/cura/plugins/MakerbotWriter/__init__.py
+lib/cura/plugins/MakerbotWriter/plugin.json
+lib/cura/plugins/Marketplace/CloudApiModel.py
+lib/cura/plugins/Marketplace/CloudSync/CloudApiClient.py
+lib/cura/plugins/Marketplace/CloudSync/CloudPackageChecker.py
+lib/cura/plugins/Marketplace/CloudSync/DiscrepanciesPresenter.py
+lib/cura/plugins/Marketplace/CloudSync/DownloadPresenter.py
+lib/cura/plugins/Marketplace/CloudSync/LicenseModel.py
+lib/cura/plugins/Marketplace/CloudSync/LicensePresenter.py
+lib/cura/plugins/Marketplace/CloudSync/RestartApplicationPresenter.py
+lib/cura/plugins/Marketplace/CloudSync/SubscribedPackagesModel.py
+lib/cura/plugins/Marketplace/CloudSync/SyncOrchestrator.py
+lib/cura/plugins/Marketplace/CloudSync/__init__.py
+lib/cura/plugins/Marketplace/Constants.py
+lib/cura/plugins/Marketplace/InstallMissingPackagesDialog.py
+lib/cura/plugins/Marketplace/LocalPackageList.py
+lib/cura/plugins/Marketplace/Marketplace.py
+lib/cura/plugins/Marketplace/MissingPackageList.py
+lib/cura/plugins/Marketplace/PackageList.py
+lib/cura/plugins/Marketplace/PackageModel.py
+lib/cura/plugins/Marketplace/RemotePackageList.py
+lib/cura/plugins/Marketplace/__init__.py
+lib/cura/plugins/Marketplace/plugin.json
+lib/cura/plugins/Marketplace/resources/images/Plugin.svg
+lib/cura/plugins/Marketplace/resources/images/Spool.svg
+lib/cura/plugins/Marketplace/resources/images/placeholder.svg
+lib/cura/plugins/Marketplace/resources/qml/CompatibilityDialog.qml
+lib/cura/plugins/Marketplace/resources/qml/InstallMissingPackagesDialog.qml
+lib/cura/plugins/Marketplace/resources/qml/LicenseDialog.qml
+lib/cura/plugins/Marketplace/resources/qml/ManageButton.qml
+lib/cura/plugins/Marketplace/resources/qml/ManagePackagesButton.qml
+lib/cura/plugins/Marketplace/resources/qml/ManagedPackages.qml
+lib/cura/plugins/Marketplace/resources/qml/Marketplace.qml
+lib/cura/plugins/Marketplace/resources/qml/Materials.qml
+lib/cura/plugins/Marketplace/resources/qml/MissingPackages.qml
+lib/cura/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml
+lib/cura/plugins/Marketplace/resources/qml/OnboardBanner.qml
+lib/cura/plugins/Marketplace/resources/qml/PackageCard.qml
+lib/cura/plugins/Marketplace/resources/qml/PackageCardHeader.qml
+lib/cura/plugins/Marketplace/resources/qml/PackageDetails.qml
+lib/cura/plugins/Marketplace/resources/qml/PackagePage.qml
+lib/cura/plugins/Marketplace/resources/qml/PackageTypeTab.qml
+lib/cura/plugins/Marketplace/resources/qml/Packages.qml
+lib/cura/plugins/Marketplace/resources/qml/Plugins.qml
+lib/cura/plugins/Marketplace/resources/qml/VerifiedIcon.qml
 lib/cura/plugins/ModelChecker/ModelChecker.py
 lib/cura/plugins/ModelChecker/ModelChecker.qml
 lib/cura/plugins/ModelChecker/__init__.py
@@ -160,14 +216,17 @@ lib/cura/plugins/PostProcessingPlugin/Script.py
 lib/cura/plugins/PostProcessingPlugin/Script.svg
 lib/cura/plugins/PostProcessingPlugin/__init__.py
 lib/cura/plugins/PostProcessingPlugin/plugin.json
+lib/cura/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py
 lib/cura/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py
 lib/cura/plugins/PostProcessingPlugin/scripts/ColorMix.py
 lib/cura/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py
 lib/cura/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
+lib/cura/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py
 lib/cura/plugins/PostProcessingPlugin/scripts/DisplayProgressOnLCD.py
 lib/cura/plugins/PostProcessingPlugin/scripts/ExampleScript.md
 lib/cura/plugins/PostProcessingPlugin/scripts/FilamentChange.py
 lib/cura/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py
+lib/cura/plugins/PostProcessingPlugin/scripts/LimitXYAccelJerk.py
 lib/cura/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py
 lib/cura/plugins/PostProcessingPlugin/scripts/RetractContinue.py
 lib/cura/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py
@@ -227,55 +286,6 @@ lib/cura/plugins/SolidView/xray_overlay.shader
 lib/cura/plugins/SupportEraser/SupportEraser.py
 lib/cura/plugins/SupportEraser/__init__.py
 lib/cura/plugins/SupportEraser/plugin.json
-lib/cura/plugins/Toolbox/__init__.py
-lib/cura/plugins/Toolbox/plugin.json
-lib/cura/plugins/Toolbox/resources/images/Shop.svg
-lib/cura/plugins/Toolbox/resources/images/installed_check.svg
-lib/cura/plugins/Toolbox/resources/images/placeholder.svg
-lib/cura/plugins/Toolbox/resources/qml/Toolbox.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxActionButtonStyle.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxBackColumn.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxCompatibilityChart.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDetailList.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDetailTile.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDetailTileActions.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsGrid.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsGridTile.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcaseTile.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxFooter.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxInstalledTile.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxInstalledTileActions.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxProgressButton.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxShadow.qml
-lib/cura/plugins/Toolbox/resources/qml/components/ToolboxTabButton.qml
-lib/cura/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml
-lib/cura/plugins/Toolbox/resources/qml/dialogs/ToolboxConfirmUninstallResetDialog.qml
-lib/cura/plugins/Toolbox/resources/qml/dialogs/ToolboxLicenseDialog.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxAuthorPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxDetailPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxDownloadsPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxErrorPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml
-lib/cura/plugins/Toolbox/resources/qml/pages/WelcomePage.qml
-lib/cura/plugins/Toolbox/src/AuthorsModel.py
-lib/cura/plugins/Toolbox/src/CloudApiModel.py
-lib/cura/plugins/Toolbox/src/CloudSync/CloudApiClient.py
-lib/cura/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py
-lib/cura/plugins/Toolbox/src/CloudSync/DiscrepanciesPresenter.py
-lib/cura/plugins/Toolbox/src/CloudSync/DownloadPresenter.py
-lib/cura/plugins/Toolbox/src/CloudSync/LicenseModel.py
-lib/cura/plugins/Toolbox/src/CloudSync/LicensePresenter.py
-lib/cura/plugins/Toolbox/src/CloudSync/RestartApplicationPresenter.py
-lib/cura/plugins/Toolbox/src/CloudSync/SubscribedPackagesModel.py
-lib/cura/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py
-lib/cura/plugins/Toolbox/src/CloudSync/__init__.py
-lib/cura/plugins/Toolbox/src/ConfigsModel.py
-lib/cura/plugins/Toolbox/src/PackagesModel.py
-lib/cura/plugins/Toolbox/src/Toolbox.py
-lib/cura/plugins/Toolbox/src/__init__.py
 lib/cura/plugins/TrimeshReader/TrimeshReader.py
 lib/cura/plugins/TrimeshReader/__init__.py
 lib/cura/plugins/TrimeshReader/plugin.json
@@ -288,16 +298,19 @@ lib/cura/plugins/UFPWriter/kitten.png
 lib/cura/plugins/UFPWriter/plugin.json
 lib/cura/plugins/UM3NetworkPrinting/__init__.py
 lib/cura/plugins/UM3NetworkPrinting/plugin.json
+lib/cura/plugins/UM3NetworkPrinting/resources/png/MakerBot Method X.png
+lib/cura/plugins/UM3NetworkPrinting/resources/png/MakerBot Method XL.png
+lib/cura/plugins/UM3NetworkPrinting/resources/png/MakerBot Method.png
 lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker 2+ Connect.png
 lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker 3 Extended.png
 lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker 3.png
 lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker S3.png
 lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker S5.png
+lib/cura/plugins/UM3NetworkPrinting/resources/png/Ultimaker S7.png
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/GenericPopUp.qml
-lib/cura/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
 lib/cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml
@@ -331,28 +344,34 @@ lib/cura/plugins/UM3NetworkPrinting/resources/svg/Warning.svg
 lib/cura/plugins/UM3NetworkPrinting/resources/svg/icons/CameraPhoto.svg
 lib/cura/plugins/UM3NetworkPrinting/resources/svg/icons/Extruder.svg
 lib/cura/plugins/UM3NetworkPrinting/resources/svg/ultibot.svg
+lib/cura/plugins/UM3NetworkPrinting/src/Cloud/AbstractCloudOutputDevice.py
 lib/cura/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py
 lib/cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
 lib/cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
 lib/cura/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py
 lib/cura/plugins/UM3NetworkPrinting/src/Cloud/__init__.py
+lib/cura/plugins/UM3NetworkPrinting/src/Cloud/machine_id_to_name.json
 lib/cura/plugins/UM3NetworkPrinting/src/ClusterOutputController.py
 lib/cura/plugins/UM3NetworkPrinting/src/ExportFileJob.py
 lib/cura/plugins/UM3NetworkPrinting/src/MeshFormatHandler.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py
+lib/cura/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py
+lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobAwaitingApprovalMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
+lib/cura/plugins/UM3NetworkPrinting/src/Messages/RemovedPrintersMessage.py
 lib/cura/plugins/UM3NetworkPrinting/src/Messages/__init__.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/BaseModel.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/ConfigurationChangeModel.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterStatus.py
+lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterWithConfigResponse.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudError.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobResponse.py
 lib/cura/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobUploadRequest.py
@@ -445,6 +464,9 @@ lib/cura/plugins/VersionUpgrade/VersionUpgrade40to41/plugin.json
 lib/cura/plugins/VersionUpgrade/VersionUpgrade411to412/VersionUpgrade411to412.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade411to412/__init__.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade411to412/plugin.json
+lib/cura/plugins/VersionUpgrade/VersionUpgrade413to50/VersionUpgrade413to50.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade413to50/__init__.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade413to50/plugin.json
 lib/cura/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade41to42/__init__.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json
@@ -477,6 +499,18 @@ lib/cura/plugins/VersionUpgrade/VersionUpgrade48to49/plugin.json
 lib/cura/plugins/VersionUpgrade/VersionUpgrade49to410/VersionUpgrade49to410.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade49to410/__init__.py
 lib/cura/plugins/VersionUpgrade/VersionUpgrade49to410/plugin.json
+lib/cura/plugins/VersionUpgrade/VersionUpgrade52to53/VersionUpgrade52to53.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade52to53/__init__.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade52to53/plugin.json
+lib/cura/plugins/VersionUpgrade/VersionUpgrade53to54/VersionUpgrade53to54.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade53to54/__init__.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade53to54/plugin.json
+lib/cura/plugins/VersionUpgrade/VersionUpgrade54to55/VersionUpgrade54to55.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade54to55/__init__.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade54to55/plugin.json
+lib/cura/plugins/VersionUpgrade/VersionUpgrade56to57/VersionUpgrade56to57.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade56to57/__init__.py
+lib/cura/plugins/VersionUpgrade/VersionUpgrade56to57/plugin.json
 lib/cura/plugins/X3DReader/X3DReader.py
 lib/cura/plugins/X3DReader/__init__.py
 lib/cura/plugins/X3DReader/plugin.json
@@ -498,13 +532,14 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/API/Interface/__init__.py
 %%PYTHON_SITELIBDIR%%/cura/API/__init__.py
 %%PYTHON_SITELIBDIR%%/cura/ApplicationMetadata.py
-%%PYTHON_SITELIBDIR%%/cura/Arranging/Arrange.py
-%%PYTHON_SITELIBDIR%%/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py
 %%PYTHON_SITELIBDIR%%/cura/Arranging/ArrangeObjectsJob.py
+%%PYTHON_SITELIBDIR%%/cura/Arranging/Arranger.py
+%%PYTHON_SITELIBDIR%%/cura/Arranging/GridArrange.py
 %%PYTHON_SITELIBDIR%%/cura/Arranging/Nest2DArrange.py
 %%PYTHON_SITELIBDIR%%/cura/Arranging/ShapeArray.py
 %%PYTHON_SITELIBDIR%%/cura/Arranging/__init__.py
 %%PYTHON_SITELIBDIR%%/cura/AutoSave.py
+%%PYTHON_SITELIBDIR%%/cura/BackendPlugin.py
 %%PYTHON_SITELIBDIR%%/cura/Backups/Backup.py
 %%PYTHON_SITELIBDIR%%/cura/Backups/BackupsManager.py
 %%PYTHON_SITELIBDIR%%/cura/Backups/__init__.py
@@ -516,6 +551,7 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/CuraPackageManager.py
 %%PYTHON_SITELIBDIR%%/cura/CuraVersion.py
 %%PYTHON_SITELIBDIR%%/cura/CuraView.py
+%%PYTHON_SITELIBDIR%%/cura/HitChecker.py
 %%PYTHON_SITELIBDIR%%/cura/Layer.py
 %%PYTHON_SITELIBDIR%%/cura/LayerData.py
 %%PYTHON_SITELIBDIR%%/cura/LayerDataBuilder.py
@@ -529,8 +565,10 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/MachineNode.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/MaterialGroup.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/MaterialNode.py
+%%PYTHON_SITELIBDIR%%/cura/Machines/Models/ActiveIntentQualitiesModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/BaseMaterialsModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/BuildPlateModel.py
+%%PYTHON_SITELIBDIR%%/cura/Machines/Models/CompatibleMachineModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/CustomQualityProfilesDropDownMenuModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/DiscoveredCloudPrintersModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/DiscoveredPrintersModel.py
@@ -541,7 +579,9 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/GlobalStacksModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/IntentCategoryModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/IntentModel.py
+%%PYTHON_SITELIBDIR%%/cura/Machines/Models/IntentSelectionModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/IntentTranslations.py
+%%PYTHON_SITELIBDIR%%/cura/Machines/Models/MachineListModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/MachineModelUtils.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/MaterialBrandsModel.py
 %%PYTHON_SITELIBDIR%%/cura/Machines/Models/MaterialManagementModel.py
@@ -577,6 +617,7 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/PlatformPhysics.py
 %%PYTHON_SITELIBDIR%%/cura/PreviewPass.py
 %%PYTHON_SITELIBDIR%%/cura/PrintJobPreviewImageProvider.py
+%%PYTHON_SITELIBDIR%%/cura/PrintOrderManager.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/FirmwareUpdater.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/GenericOutputController.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/Models/ExtruderConfigurationModel.py
@@ -592,10 +633,8 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/PrintJobOutputModel.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/PrinterOutputController.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/PrinterOutputDevice.py
-%%PYTHON_SITELIBDIR%%/cura/PrinterOutput/PrinterOutputModel.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/UploadMaterialsJob.py
 %%PYTHON_SITELIBDIR%%/cura/PrinterOutput/__init__.py
-%%PYTHON_SITELIBDIR%%/cura/PrinterOutputDevice.py
 %%PYTHON_SITELIBDIR%%/cura/ReaderWriters/ProfileReader.py
 %%PYTHON_SITELIBDIR%%/cura/ReaderWriters/ProfileWriter.py
 %%PYTHON_SITELIBDIR%%/cura/ReaderWriters/__init__.py
@@ -609,6 +648,7 @@ lib/cura/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
*** 7865 LINES SKIPPED ***