Merged with 'eric7' branch to prepare a new release. eric7-maintenance release-22.02

Tue, 08 Feb 2022 14:15:48 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 08 Feb 2022 14:15:48 +0100
branch
eric7-maintenance
changeset 8941
e1f6a9e53979
parent 8897
a906ba97c1fe (current diff)
parent 8940
e91951ff3bbd (diff)
child 8942
7dde4fcc909b

Merged with 'eric7' branch to prepare a new release.

eric7/i18n/eric7_es.ts file | annotate | diff | comparison | revisions
eric7/i18n/eric7_ru.qm file | annotate | diff | comparison | revisions
eric7/i18n/eric7_ru.ts file | annotate | diff | comparison | revisions
--- a/docs/changelog	Tue Jan 04 15:38:11 2022 +0100
+++ b/docs/changelog	Tue Feb 08 14:15:48 2022 +0100
@@ -1,5 +1,30 @@
 Change Log
 ----------
+Version 22.2:
+- bug fixes
+- General
+  -- dropped support for Python 3.6 because that is end-of-life
+- File Browser
+  -- added capability to open SVG files in the text editor
+- Help Viewer
+  -- added bookmarks to the internal help viewer
+- MicroPython
+  -- updated the list of known CircuitPython boards
+  -- updated the list of known UF2 capable boards
+  -- added support for ESP32-C3, ESP32-S2 and ESP32-S3 chips
+  -- added a dialog to show information for a connected board
+- Project Browser
+  -- added capability to open SVG files in the text editor to the Project
+     Others Browser
+- Styles and Themes
+  -- added a dark blueish style (QSS and Highlighters) and an associated theme
+     (dark_blue.ethj and dark_blue_with_stylesheet.ethj)
+- Third Party packages
+  -- upgraded coverage to 6.2.0
+
+Version 22.1.1:
+- bug fix
+
 Version 22.1:
 - bug fixes
 - Code Style Checker
@@ -10,7 +35,7 @@
   -- added configuration capability
 - QSS Previewer
   -- added disabled widgets in order to show their colors as well
-- Styles and Themes:
+- Styles and Themes
   -- added a dark greenish style (QSS and Highlighters) and an associated theme
      (dark_green.ethj and dark_green_with_stylesheet.ethj)
 
--- a/eric7.epj	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7.epj	Tue Feb 08 14:15:48 2022 +0100
@@ -1,7 +1,7 @@
 {
   "header": {
     "comment": "eric project file for project eric7",
-    "copyright": "Copyright (C) 2021 Detlev Offenbach, detlev@die-offenbachs.de"
+    "copyright": "Copyright (C) 2022 Detlev Offenbach, detlev@die-offenbachs.de"
   },
   "project": {
     "AUTHOR": "Detlev Offenbach",
@@ -715,7 +715,10 @@
       "eric7/UI/FindLocationWidget.ui",
       "eric7/JediInterface/RefactoringPreviewDialog.ui",
       "eric7/QScintilla/EditorOutlineSizesDialog.ui",
-      "eric7/Preferences/ConfigurationPages/InterfaceLightPage.ui"
+      "eric7/Preferences/ConfigurationPages/InterfaceLightPage.ui",
+      "eric7/HelpViewer/HelpBookmarkPropertiesDialog.ui",
+      "eric7/HelpViewer/HelpBookmarksImportDialog.ui",
+      "eric7/MicroPython/BoardDataDialog.ui"
     ],
     "HASH": "df7daa8781250f7664e6ecaeaf1361fa2efd39ee",
     "IDLPARAMS": {
@@ -2305,7 +2308,11 @@
       "eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsEnums.py",
       "eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportNode.py",
       "eric7/Preferences/ThemeManager.py",
-      "eric7/Preferences/ConfigurationPages/InterfaceLightPage.py"
+      "eric7/Preferences/ConfigurationPages/InterfaceLightPage.py",
+      "eric7/HelpViewer/HelpBookmarksWidget.py",
+      "eric7/HelpViewer/HelpBookmarkPropertiesDialog.py",
+      "eric7/HelpViewer/HelpBookmarksImportDialog.py",
+      "eric7/MicroPython/BoardDataDialog.py"
     ],
     "SPELLEXCLUDES": "Dictionaries/excludes.dic",
     "SPELLLANGUAGE": "en_US",
--- a/eric7/APIs/Python3/eric7.api	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/APIs/Python3/eric7.api	Tue Feb 08 14:15:48 2022 +0100
@@ -2083,6 +2083,17 @@
 eric7.Graphics.UMLItem.UMLModel?1(name)
 eric7.Graphics.UMLSceneSizeDialog.UMLSceneSizeDialog.getData?4()
 eric7.Graphics.UMLSceneSizeDialog.UMLSceneSizeDialog?1(w, h, minW, minH, parent=None, name=None)
+eric7.HelpViewer.HelpBookmarkPropertiesDialog.HelpBookmarkPropertiesDialog.getData?4()
+eric7.HelpViewer.HelpBookmarkPropertiesDialog.HelpBookmarkPropertiesDialog?1(title="", url="", parent=None)
+eric7.HelpViewer.HelpBookmarksImportDialog.HelpBookmarksImportDialog.getData?4()
+eric7.HelpViewer.HelpBookmarksImportDialog.HelpBookmarksImportDialog?1(parent=None)
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.UrlRole?7
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.addBookmark?4(title, url)
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.escapePressed?7
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.newBackgroundTab?7
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.newTab?7
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget.openUrl?7
+eric7.HelpViewer.HelpBookmarksWidget.HelpBookmarksWidget?1(parent=None)
 eric7.HelpViewer.HelpViewerImpl.HelpViewerImpl.gotoHistory?4(index)
 eric7.HelpViewer.HelpViewerImpl.HelpViewerImpl.isBackwardAvailable?4()
 eric7.HelpViewer.HelpViewerImpl.HelpViewerImpl.isEmptyPage?4()
@@ -2161,6 +2172,7 @@
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.MaxHistoryItems?7
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.activate?4(searchWord=None, url=None)
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.addPage?4(url=None, background=False)
+eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.bookmarkPage?4(title, url)
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.closeAllPages?4()
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.closeCurrentPage?4()
 eric7.HelpViewer.HelpViewerWidget.HelpViewerWidget.closeOtherPages?4()
@@ -2181,7 +2193,7 @@
 eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.closeAllPages?4()
 eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.closeCurrentPage?4()
 eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.closeOtherPages?4()
-eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.currentChanged?7
+eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.currentPageChanged?7
 eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget.insertPage?4(index, viewer, background=False)
 eric7.HelpViewer.OpenPagesWidget.OpenPagesWidget?1(stack, parent=None)
 eric7.HexEdit.HexEditChunks.HexEditChunk?1()
@@ -2451,6 +2463,7 @@
 eric7.MicroPython.AddEditDevicesDialog.AddEditDevicesDialog.on_deviceTypeComboBox_currentIndexChanged?4(index)
 eric7.MicroPython.AddEditDevicesDialog.AddEditDevicesDialog.on_reportButton_clicked?4()
 eric7.MicroPython.AddEditDevicesDialog.AddEditDevicesDialog?1(vid=0, pid=0, description=0, deviceData=None, parent=None)
+eric7.MicroPython.BoardDataDialog.BoardDataDialog?1(data, parent=None)
 eric7.MicroPython.CircuitPythonDevices.CircuitPythonDevice.DeviceVolumeName?7
 eric7.MicroPython.CircuitPythonDevices.CircuitPythonDevice.addDeviceMenuEntries?4(menu)
 eric7.MicroPython.CircuitPythonDevices.CircuitPythonDevice.canRunScript?4()
@@ -2473,6 +2486,7 @@
 eric7.MicroPython.ConnectionSelectionDialog.ConnectionSelectionDialog.on_deviceTypeComboBox_currentTextChanged?4(txt)
 eric7.MicroPython.ConnectionSelectionDialog.ConnectionSelectionDialog.on_portNameComboBox_currentTextChanged?4(txt)
 eric7.MicroPython.ConnectionSelectionDialog.ConnectionSelectionDialog?1(ports, currentPort, currentType, parent=None)
+eric7.MicroPython.EspBackupRestoreFirmwareDialog.EspBackupRestoreFirmwareDialog.Chips?7
 eric7.MicroPython.EspBackupRestoreFirmwareDialog.EspBackupRestoreFirmwareDialog.FlashModes?7
 eric7.MicroPython.EspBackupRestoreFirmwareDialog.EspBackupRestoreFirmwareDialog.FlashSizes?7
 eric7.MicroPython.EspBackupRestoreFirmwareDialog.EspBackupRestoreFirmwareDialog.getData?4()
@@ -2492,6 +2506,8 @@
 eric7.MicroPython.EspDevices.EspDevice.runScript?4(script)
 eric7.MicroPython.EspDevices.EspDevice.setButtons?4()
 eric7.MicroPython.EspDevices.EspDevice?1(microPythonWidget, deviceType, parent=None)
+eric7.MicroPython.EspFirmwareSelectionDialog.EspFirmwareSelectionDialog.Chips?7
+eric7.MicroPython.EspFirmwareSelectionDialog.EspFirmwareSelectionDialog.FlashAddresses?7
 eric7.MicroPython.EspFirmwareSelectionDialog.EspFirmwareSelectionDialog.FlashModes?7
 eric7.MicroPython.EspFirmwareSelectionDialog.EspFirmwareSelectionDialog.getData?4()
 eric7.MicroPython.EspFirmwareSelectionDialog.EspFirmwareSelectionDialog.on_espComboBox_currentTextChanged?4(chip)
@@ -2518,6 +2534,7 @@
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.executeAsyncFinished?7
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.fileSystemInfo?4()
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.get?4(deviceFileName, hostFileName=None)
+eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.getBoardInformation?4()
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.getImplementation?4()
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.getTime?4()
 eric7.MicroPython.MicroPythonCommandsInterface.MicroPythonCommandsInterface.handlePreferencesChanged?4()
@@ -7721,6 +7738,7 @@
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._contextMenuRequested?5(coord)
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._createPopupMenus?5()
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._editPixmap?5()
+eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._openFileInEditor?5()
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._openHexEditor?5()
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._openItem?5()
 eric7.Project.ProjectOthersBrowser.ProjectOthersBrowser._showContextMenu?5(menu)
@@ -9309,6 +9327,7 @@
 eric7.UI.Browser.Browser._keyboardSearchType?5(item)
 eric7.UI.Browser.Browser._newDirectory?5()
 eric7.UI.Browser.Browser._newFile?5()
+eric7.UI.Browser.Browser._openFileInEditor?5()
 eric7.UI.Browser.Browser._openHexEditor?5()
 eric7.UI.Browser.Browser._openItem?5()
 eric7.UI.Browser.Browser._resizeColumns?5(index)
--- a/eric7/APIs/Python3/eric7.bas	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/APIs/Python3/eric7.bas	Tue Feb 08 14:15:48 2022 +0100
@@ -37,6 +37,7 @@
 AutoScroller QObject
 BackgroundService QTcpServer
 BinaryModel QAbstractTableModel
+BoardDataDialog QDialog Ui_BoardDataDialog
 BookmarkActionSelectionDialog QDialog Ui_BookmarkActionSelectionDialog
 BookmarkInfoDialog QDialog Ui_BookmarkInfoDialog
 BookmarkPropertiesDialog QDialog Ui_BookmarkPropertiesDialog
@@ -411,6 +412,9 @@
 GreaseMonkeyManager QObject
 GreaseMonkeyScript QObject
 GroupEnum enum.IntEnum
+HelpBookmarkPropertiesDialog QDialog Ui_HelpBookmarkPropertiesDialog
+HelpBookmarksImportDialog QDialog Ui_HelpBookmarksImportDialog
+HelpBookmarksWidget QListWidget
 HelpDocsInstaller QThread
 HelpDocumentationPage ConfigurationPageBase Ui_HelpDocumentationPage
 HelpIndexWidget QWidget
@@ -666,7 +670,7 @@
 NsHtmlReader QObject
 NsHtmlWriter QObject
 NumbersWidget QWidget Ui_NumbersWidget
-OpenPagesWidget QWidget
+OpenPagesWidget QListWidget
 OpenSearchDialog QDialog Ui_OpenSearchDialog
 OpenSearchEditDialog QDialog Ui_OpenSearchEditDialog
 OpenSearchEngine QObject
--- a/eric7/CondaInterface/CondaInfoDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/CondaInterface/CondaInfoDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -133,6 +133,3 @@
         if "offline" in infoDict:
             self.offlineCheckBox.setChecked(
                 infoDict["offline"])
-        
-        msh = self.minimumSizeHint()
-        self.resize(max(self.width(), msh.width()), msh.height())
--- a/eric7/DataViews/CodeMetricsDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DataViews/CodeMetricsDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,9 +7,10 @@
 Module implementing a code metrics dialog.
 """
 
-import os
+import collections
 import fnmatch
-import collections
+import os
+import time
 
 from PyQt6.QtCore import pyqtSlot, Qt, QLocale
 from PyQt6.QtWidgets import (
@@ -175,6 +176,7 @@
             self.resultList.setSortingEnabled(False)
             
             # now go through all the files
+            now = time.monotonic()
             for progress, file in enumerate(files, start=1):
                 if self.cancelled:
                     return
@@ -192,7 +194,9 @@
                 self.resultList.expandItem(fitm)
                 
                 self.checkProgress.setValue(progress)
-                QApplication.processEvents()
+                if time.monotonic() - now > 0.01:
+                    QApplication.processEvents()
+                    now = time.monotonic()
         finally:
             # reenable updates of the list
             self.resultList.setSortingEnabled(True)
--- a/eric7/DebugClients/Python/DebugBase.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/DebugBase.py	Tue Feb 08 14:15:48 2022 +0100
@@ -899,7 +899,6 @@
         self.skipFrames = 0
         if (exctype == RuntimeError and
                 str(excval).startswith('maximum recursion depth exceeded') or
-                sys.version_info >= (3, 5) and
                 exctype == RecursionError):  # __IGNORE_WARNING__
             excval = 'maximum recursion depth exceeded'
             depth = 0
--- a/eric7/DebugClients/Python/DebugUtilities.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/DebugUtilities.py	Tue Feb 08 14:15:48 2022 +0100
@@ -397,7 +397,7 @@
     @exception RuntimeError raised to indicate an illegal arguments parsing
         condition
     """
-    # see http:#msdn.microsoft.com/en-us/library/a1y7w461.aspx
+    # see http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
     result = []
     
     DEFAULT = 0
@@ -409,10 +409,12 @@
     buf = ''
     
     argsLen = len(args)
-    for i in range(argsLen):
+    i = 0
+    while i < argsLen:
         ch = args[i]
         if ch == '\\':
             backslashes += 1
+            i += 1
             continue
         elif backslashes != 0:
             if ch == '"':
@@ -425,6 +427,7 @@
                     
                     buf += '"'
                     backslashes = 0
+                    i += 1
                     continue
             else:
                 # false alarm, treat passed backslashes literally...
@@ -438,11 +441,13 @@
         if ch in (' ', '\t'):
             if state == DEFAULT:
                 # skip
+                i += 1
                 continue
             elif state == ARG:
                 state = DEFAULT
                 result.append(buf)
                 buf = ''
+                i += 1
                 continue
         
         if state not in (DEFAULT, ARG, IN_DOUBLE_QUOTE):
@@ -470,6 +475,8 @@
             else:
                 state = ARG
                 buf += ch
+        
+        i += 1
     
     if len(buf) > 0 or state != DEFAULT:
         result.append(buf)
--- a/eric7/DebugClients/Python/ModuleLoader.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/ModuleLoader.py	Tue Feb 08 14:15:48 2022 +0100
@@ -28,7 +28,7 @@
         """
         self.__dbgClient = debugClient
         
-        self.__enableImportHooks = True
+        self.__enableImportHooks = set()
         
         # reset already imported thread module to apply hooks at next import
         for moduleName in ("thread", "_thread", "threading"):
@@ -59,7 +59,7 @@
         """
         module = importlib.import_module(fullname)
         sys.modules[fullname] = module
-        
+        self.__enableImportHooks.remove(fullname)
         ## Add hook for _thread.start_new_thread
         if (
             fullname == '_thread' and
@@ -110,7 +110,6 @@
             self.__dbgClient.patchQThread(module)
             patchQProcess(module, self.__dbgClient)
         
-        self.__enableImportHooks = True
         return module
     
     def find_spec(self, fullname, path, target=None):
@@ -127,15 +126,15 @@
         @return module spec object pointing to the module loader
         @rtype ModuleSpec
         """
-        if fullname in sys.modules or not self.__dbgClient.debugging:
+        if fullname in sys.modules or self.__dbgClient.debugging is False:
             return None
         
         if (
             fullname in self.__modulesToPatch and
-            self.__enableImportHooks
+            fullname not in self.__enableImportHooks
         ):
             # Disable hook to be able to import original module
-            self.__enableImportHooks = False
+            self.__enableImportHooks.add(fullname)
             return importlib.machinery.ModuleSpec(fullname, self)
         
         return None
--- a/eric7/DebugClients/Python/SubprocessExtension.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/SubprocessExtension.py	Tue Feb 08 14:15:48 2022 +0100
@@ -11,7 +11,10 @@
 import os
 import shlex
 
-from DebugUtilities import isPythonProgram, patchArguments
+from DebugUtilities import (
+    isPythonProgram, patchArguments, stringToArgumentsWindows,
+    isWindowsPlatform
+)
 
 _debugClient = None
 
@@ -49,7 +52,11 @@
             ):
                 if isinstance(arguments, str):
                     # convert to arguments list
-                    arguments = shlex.split(arguments)
+                    arguments = (
+                        stringToArgumentsWindows(arguments)
+                        if isWindowsPlatform() else
+                        shlex.split(arguments)
+                    )
                 else:
                     # create a copy of the arguments
                     arguments = arguments[:]
--- a/eric7/DebugClients/Python/coverage/cmdline.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/cmdline.py	Tue Feb 08 14:15:48 2022 +0100
@@ -17,11 +17,11 @@
 from coverage import Coverage
 from coverage import env
 from coverage.collector import CTracer
-from coverage.data import line_counts
+from coverage.config import CoverageConfig
+from coverage.data import combinable_files, debug_data_file
 from coverage.debug import info_formatter, info_header, short_stack
-from coverage.exceptions import BaseCoverageException, ExceptionDuringRun, NoSource
+from coverage.exceptions import _BaseCoverageException, _ExceptionDuringRun, NoSource
 from coverage.execfile import PyRunner
-from coverage.misc import human_sorted
 from coverage.results import Numbers, should_fail_under
 
 
@@ -40,16 +40,12 @@
         '', '--branch', action='store_true',
         help="Measure branch coverage in addition to statement coverage.",
     )
-    CONCURRENCY_CHOICES = [
-        "thread", "gevent", "greenlet", "eventlet", "multiprocessing",
-    ]
     concurrency = optparse.make_option(
-        '', '--concurrency', action='store', metavar="LIB",
-        choices=CONCURRENCY_CHOICES,
+        '', '--concurrency', action='store', metavar="LIBS",
         help=(
             "Properly measure code using a concurrency library. " +
-            "Valid values are: {}."
-        ).format(", ".join(CONCURRENCY_CHOICES)),
+            "Valid values are: {}, or a comma-list of them."
+        ).format(", ".join(sorted(CoverageConfig.CONCURRENCY_CHOICES))),
     )
     context = optparse.make_option(
         '', '--context', action='store', metavar="LABEL",
@@ -571,6 +567,11 @@
         debug = unshell_list(options.debug)
         contexts = unshell_list(options.contexts)
 
+        if options.concurrency is not None:
+            concurrency = options.concurrency.split(",")
+        else:
+            concurrency = None
+
         # Do something.
         self.coverage = Coverage(
             data_suffix=options.parallel_mode,
@@ -582,7 +583,7 @@
             omit=omit,
             include=include,
             debug=debug,
-            concurrency=options.concurrency,
+            concurrency=concurrency,
             check_preimported=True,
             context=options.context,
             messages=not options.quiet,
@@ -601,8 +602,8 @@
         elif options.action == "combine":
             if options.append:
                 self.coverage.load()
-            data_dirs = args or None
-            self.coverage.combine(data_dirs, strict=True, keep=bool(options.keep))
+            data_paths = args or None
+            self.coverage.combine(data_paths, strict=True, keep=bool(options.keep))
             self.coverage.save()
             return OK
 
@@ -778,42 +779,33 @@
         if not args:
             show_help("What information would you like: config, data, sys, premain?")
             return ERR
+        if args[1:]:
+            show_help("Only one topic at a time, please")
+            return ERR
 
-        for info in args:
-            if info == 'sys':
-                sys_info = self.coverage.sys_info()
-                print(info_header("sys"))
-                for line in info_formatter(sys_info):
-                    print(f" {line}")
-            elif info == 'data':
-                self.coverage.load()
-                data = self.coverage.get_data()
-                print(info_header("data"))
-                print(f"path: {data.data_filename()}")
-                if data:
-                    print(f"has_arcs: {data.has_arcs()!r}")
-                    summary = line_counts(data, fullpath=True)
-                    filenames = human_sorted(summary.keys())
-                    print(f"\n{len(filenames)} files:")
-                    for f in filenames:
-                        line = f"{f}: {summary[f]} lines"
-                        plugin = data.file_tracer(f)
-                        if plugin:
-                            line += f" [{plugin}]"
-                        print(line)
-                else:
-                    print("No data collected")
-            elif info == 'config':
-                print(info_header("config"))
-                config_info = self.coverage.config.__dict__.items()
-                for line in info_formatter(config_info):
-                    print(f" {line}")
-            elif info == "premain":
-                print(info_header("premain"))
-                print(short_stack())
-            else:
-                show_help(f"Don't know what you mean by {info!r}")
-                return ERR
+        if args[0] == 'sys':
+            sys_info = self.coverage.sys_info()
+            print(info_header("sys"))
+            for line in info_formatter(sys_info):
+                print(f" {line}")
+        elif args[0] == 'data':
+            print(info_header("data"))
+            data_file = self.coverage.config.data_file
+            debug_data_file(data_file)
+            for filename in combinable_files(data_file):
+                print("-----")
+                debug_data_file(filename)
+        elif args[0] == 'config':
+            print(info_header("config"))
+            config_info = sorted(self.coverage.config.__dict__.items())
+            for line in info_formatter(config_info):
+                print(f" {line}")
+        elif args[0] == "premain":
+            print(info_header("premain"))
+            print(short_stack())
+        else:
+            show_help(f"Don't know what you mean by {args[0]!r}")
+            return ERR
 
         return OK
 
@@ -887,13 +879,13 @@
         argv = sys.argv[1:]
     try:
         status = CoverageScript().command_line(argv)
-    except ExceptionDuringRun as err:
+    except _ExceptionDuringRun as err:
         # An exception was caught while running the product code.  The
-        # sys.exc_info() return tuple is packed into an ExceptionDuringRun
+        # sys.exc_info() return tuple is packed into an _ExceptionDuringRun
         # exception.
         traceback.print_exception(*err.args)    # pylint: disable=no-value-for-parameter
         status = ERR
-    except BaseCoverageException as err:
+    except _BaseCoverageException as err:
         # A controlled error inside coverage.py: print the message to the user.
         msg = err.args[0]
         print(msg)
--- a/eric7/DebugClients/Python/coverage/collector.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/collector.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,9 +7,10 @@
 import sys
 
 from coverage import env
+from coverage.config import CoverageConfig
 from coverage.debug import short_stack
 from coverage.disposition import FileDisposition
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError
 from coverage.misc import human_sorted, isolate_module
 from coverage.pytracer import PyTracer
 
@@ -55,7 +56,7 @@
     _collectors = []
 
     # The concurrency settings we support here.
-    SUPPORTED_CONCURRENCIES = {"greenlet", "eventlet", "gevent", "thread"}
+    LIGHT_THREADS = {"greenlet", "eventlet", "gevent"}
 
     def __init__(
         self, should_trace, check_include, should_start_context, file_mapper,
@@ -93,19 +94,21 @@
 
         `concurrency` is a list of strings indicating the concurrency libraries
         in use.  Valid values are "greenlet", "eventlet", "gevent", or "thread"
-        (the default).  Of these four values, only one can be supplied.  Other
-        values are ignored.
+        (the default).  "thread" can be combined with one of the other three.
+        Other values are ignored.
 
         """
         self.should_trace = should_trace
         self.check_include = check_include
         self.should_start_context = should_start_context
         self.file_mapper = file_mapper
+        self.branch = branch
         self.warn = warn
-        self.branch = branch
+        self.concurrency = concurrency
+        assert isinstance(self.concurrency, list), f"Expected a list: {self.concurrency!r}"
+
         self.threading = None
         self.covdata = None
-
         self.static_context = None
 
         self.origin = short_stack()
@@ -113,39 +116,6 @@
         self.concur_id_func = None
         self.mapped_file_cache = {}
 
-        # We can handle a few concurrency options here, but only one at a time.
-        these_concurrencies = self.SUPPORTED_CONCURRENCIES.intersection(concurrency)
-        if len(these_concurrencies) > 1:
-            raise CoverageException(f"Conflicting concurrency settings: {concurrency}")
-        self.concurrency = these_concurrencies.pop() if these_concurrencies else ''
-
-        try:
-            if self.concurrency == "greenlet":
-                import greenlet
-                self.concur_id_func = greenlet.getcurrent
-            elif self.concurrency == "eventlet":
-                import eventlet.greenthread     # pylint: disable=import-error,useless-suppression
-                self.concur_id_func = eventlet.greenthread.getcurrent
-            elif self.concurrency == "gevent":
-                import gevent                   # pylint: disable=import-error,useless-suppression
-                self.concur_id_func = gevent.getcurrent
-            elif self.concurrency == "thread" or not self.concurrency:
-                # It's important to import threading only if we need it.  If
-                # it's imported early, and the program being measured uses
-                # gevent, then gevent's monkey-patching won't work properly.
-                import threading
-                self.threading = threading
-            else:
-                raise CoverageException(f"Don't understand concurrency={concurrency}")
-        except ImportError as ex:
-            raise CoverageException(
-                "Couldn't trace with concurrency={}, the module isn't installed.".format(
-                    self.concurrency,
-                )
-            ) from ex
-
-        self.reset()
-
         if timid:
             # Being timid: use the simple Python trace function.
             self._trace_class = PyTracer
@@ -163,6 +133,54 @@
             self.supports_plugins = False
             self.packed_arcs = False
 
+        # We can handle a few concurrency options here, but only one at a time.
+        concurrencies = set(self.concurrency)
+        unknown = concurrencies - CoverageConfig.CONCURRENCY_CHOICES
+        if unknown:
+            show = ", ".join(sorted(unknown))
+            raise ConfigError(f"Unknown concurrency choices: {show}")
+        light_threads = concurrencies & self.LIGHT_THREADS
+        if len(light_threads) > 1:
+            show = ", ".join(sorted(light_threads))
+            raise ConfigError(f"Conflicting concurrency settings: {show}")
+        do_threading = False
+
+        try:
+            if "greenlet" in concurrencies:
+                tried = "greenlet"
+                import greenlet
+                self.concur_id_func = greenlet.getcurrent
+            elif "eventlet" in concurrencies:
+                tried = "eventlet"
+                import eventlet.greenthread     # pylint: disable=import-error,useless-suppression
+                self.concur_id_func = eventlet.greenthread.getcurrent
+            elif "gevent" in concurrencies:
+                tried = "gevent"
+                import gevent                   # pylint: disable=import-error,useless-suppression
+                self.concur_id_func = gevent.getcurrent
+
+            if "thread" in concurrencies:
+                do_threading = True
+        except ImportError as ex:
+            msg = f"Couldn't trace with concurrency={tried}, the module isn't installed."
+            raise ConfigError(msg) from ex
+
+        if self.concur_id_func and not hasattr(self._trace_class, "concur_id_func"):
+            raise ConfigError(
+                "Can't support concurrency={} with {}, only threads are supported.".format(
+                    tried, self.tracer_name(),
+                )
+            )
+
+        if do_threading or not concurrencies:
+            # It's important to import threading only if we need it.  If
+            # it's imported early, and the program being measured uses
+            # gevent, then gevent's monkey-patching won't work properly.
+            import threading
+            self.threading = threading
+
+        self.reset()
+
     def __repr__(self):
         return f"<Collector at 0x{id(self):x}: {self.tracer_name()}>"
 
@@ -244,13 +262,6 @@
 
         if hasattr(tracer, 'concur_id_func'):
             tracer.concur_id_func = self.concur_id_func
-        elif self.concur_id_func:
-            raise CoverageException(
-                "Can't support concurrency={} with {}, only threads are supported".format(
-                    self.concurrency, self.tracer_name(),
-                )
-            )
-
         if hasattr(tracer, 'file_tracers'):
             tracer.file_tracers = self.file_tracers
         if hasattr(tracer, 'threading'):
--- a/eric7/DebugClients/Python/coverage/config.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/config.py	Tue Feb 08 14:15:48 2022 +0100
@@ -10,7 +10,7 @@
 import os.path
 import re
 
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError
 from coverage.misc import contract, isolate_module, substitute_variables
 
 from coverage.tomlconfig import TomlConfigParser, TomlDecodeError
@@ -59,7 +59,7 @@
             real_section = section_prefix + section
             if configparser.RawConfigParser.has_section(self, real_section):
                 return configparser.RawConfigParser.options(self, real_section)
-        raise configparser.NoSectionError(section)
+        raise ConfigError(f"No section: {section!r}")
 
     def get_section(self, section):
         """Get the contents of a section, as a dictionary."""
@@ -83,7 +83,7 @@
             if configparser.RawConfigParser.has_option(self, real_section, option):
                 break
         else:
-            raise configparser.NoOptionError(option, section)
+            raise ConfigError(f"No option {option!r} in section: {section!r}")
 
         v = configparser.RawConfigParser.get(self, real_section, option, *args, **kwargs)
         v = substitute_variables(v, os.environ)
@@ -123,7 +123,7 @@
             try:
                 re.compile(value)
             except re.error as e:
-                raise CoverageException(
+                raise ConfigError(
                     f"Invalid [{section}].{option} value {value!r}: {e}"
                 ) from e
             if value:
@@ -233,11 +233,11 @@
         # Options for plugins
         self.plugin_options = {}
 
-    MUST_BE_LIST = [
+    MUST_BE_LIST = {
         "debug", "concurrency", "plugins",
         "report_omit", "report_include",
         "run_omit", "run_include",
-    ]
+    }
 
     def from_args(self, **kwargs):
         """Read config values from `kwargs`."""
@@ -272,7 +272,7 @@
         try:
             files_read = cp.read(filename)
         except (configparser.Error, TomlDecodeError) as err:
-            raise CoverageException(f"Couldn't read config file {filename}: {err}") from err
+            raise ConfigError(f"Couldn't read config file {filename}: {err}") from err
         if not files_read:
             return False
 
@@ -285,7 +285,7 @@
                 if was_set:
                     any_set = True
         except ValueError as err:
-            raise CoverageException(f"Couldn't read config file {filename}: {err}") from err
+            raise ConfigError(f"Couldn't read config file {filename}: {err}") from err
 
         # Check that there are no unrecognized options.
         all_options = collections.defaultdict(set)
@@ -334,6 +334,8 @@
         """Return a copy of the configuration."""
         return copy.deepcopy(self)
 
+    CONCURRENCY_CHOICES = {"thread", "gevent", "greenlet", "eventlet", "multiprocessing"}
+
     CONFIG_FILE_OPTIONS = [
         # These are *args for _set_attr_from_config_option:
         #   (attr, where, type_="")
@@ -443,7 +445,7 @@
             return
 
         # If we get here, we didn't find the option.
-        raise CoverageException(f"No such option: {option_name!r}")
+        raise ConfigError(f"No such option: {option_name!r}")
 
     def get_option(self, option_name):
         """Get an option from the configuration.
@@ -471,7 +473,7 @@
             return self.plugin_options.get(plugin_name, {}).get(key)
 
         # If we get here, we didn't find the option.
-        raise CoverageException(f"No such option: {option_name!r}")
+        raise ConfigError(f"No such option: {option_name!r}")
 
     def post_process_file(self, path):
         """Make final adjustments to a file path to make it usable."""
@@ -546,7 +548,7 @@
             if config_read:
                 break
             if specified_file:
-                raise CoverageException(f"Couldn't read {fname!r} as a config file")
+                raise ConfigError(f"Couldn't read {fname!r} as a config file")
 
     # $set_env.py: COVERAGE_DEBUG - Options for --debug.
     # 3) from environment variables:
--- a/eric7/DebugClients/Python/coverage/control.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/control.py	Tue Feb 08 14:15:48 2022 +0100
@@ -21,7 +21,7 @@
 from coverage.data import CoverageData, combine_parallel_data
 from coverage.debug import DebugControl, short_stack, write_formatted_info
 from coverage.disposition import disposition_debug_msg
-from coverage.exceptions import CoverageException, CoverageWarning
+from coverage.exceptions import ConfigError, CoverageException, CoverageWarning, PluginError
 from coverage.files import PathAliases, abs_file, relative_filename, set_relative_directory
 from coverage.html import HtmlReporter
 from coverage.inorout import InOrOut
@@ -79,6 +79,8 @@
     not part of the public API. They might stop working at any point.  Please
     limit yourself to documented methods to avoid problems.
 
+    Methods can raise any of the exceptions described in :ref:`api_exceptions`.
+
     """
 
     # The stack of started Coverage instances.
@@ -446,10 +448,10 @@
     def _init_for_start(self):
         """Initialization for start()"""
         # Construct the collector.
-        concurrency = self.config.concurrency or ()
+        concurrency = self.config.concurrency or []
         if "multiprocessing" in concurrency:
             if not patch_multiprocessing:
-                raise CoverageException(                    # pragma: only jython
+                raise ConfigError(                      # pragma: only jython
                     "multiprocessing is not supported on this Python"
                 )
             patch_multiprocessing(rcfile=self.config.config_file)
@@ -460,7 +462,7 @@
         elif dycon == "test_function":
             context_switchers = [should_start_context_test_function]
         else:
-            raise CoverageException(f"Don't understand dynamic_context setting: {dycon!r}")
+            raise ConfigError(f"Don't understand dynamic_context setting: {dycon!r}")
 
         context_switchers.extend(
             plugin.dynamic_context for plugin in self._plugins.context_switchers
@@ -480,10 +482,15 @@
             )
 
         suffix = self._data_suffix_specified
-        if suffix or self.config.parallel:
+        if suffix:
             if not isinstance(suffix, str):
                 # if data_suffix=True, use .machinename.pid.random
                 suffix = True
+        elif self.config.parallel:
+            if suffix is None:
+                suffix = True
+            elif not isinstance(suffix, str):
+                suffix = bool(suffix)
         else:
             suffix = None
 
@@ -835,7 +842,7 @@
                 if plugin:
                     file_reporter = plugin.file_reporter(mapped_morf)
                     if file_reporter is None:
-                        raise CoverageException(
+                        raise PluginError(
                             "Plugin {!r} did not provide a file reporter for {!r}.".format(
                                 plugin._coverage_plugin_name, morf
                             )
@@ -933,9 +940,10 @@
         """Annotate a list of modules.
 
         .. note::
-           This method has been obsoleted by more modern reporting tools,
-           including the :meth:`html_report` method.  It will be removed in a
-           future version.
+
+            This method has been obsoleted by more modern reporting tools,
+            including the :meth:`html_report` method.  It will be removed in a
+            future version.
 
         Each module in `morfs` is annotated.  The source is written to a new
         file, named with a ",cover" suffix, with each line prefixed with a
@@ -978,6 +986,7 @@
         Returns a float, the total percentage covered.
 
         .. note::
+
             The HTML report files are generated incrementally based on the
             source files and coverage results. If you modify the report files,
             the changes will not be considered.  You should be careful about
--- a/eric7/DebugClients/Python/coverage/data.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/data.py	Tue Feb 08 14:15:48 2022 +0100
@@ -13,8 +13,8 @@
 import glob
 import os.path
 
-from coverage.exceptions import CoverageException
-from coverage.misc import file_be_gone
+from coverage.exceptions import CoverageException, NoDataError
+from coverage.misc import file_be_gone, human_sorted, plural
 from coverage.sqldata import CoverageData
 
 
@@ -53,11 +53,36 @@
     hasher.update(data.file_tracer(filename))
 
 
+def combinable_files(data_file, data_paths=None):
+    """Make a list of data files to be combined.
+
+    `data_file` is a path to a data file.  `data_paths` is a list of files or
+    directories of files.
+
+    Returns a list of absolute file paths.
+    """
+    data_dir, local = os.path.split(os.path.abspath(data_file))
+
+    data_paths = data_paths or [data_dir]
+    files_to_combine = []
+    for p in data_paths:
+        if os.path.isfile(p):
+            files_to_combine.append(os.path.abspath(p))
+        elif os.path.isdir(p):
+            pattern = os.path.join(os.path.abspath(p), f"{local}.*")
+            files_to_combine.extend(glob.glob(pattern))
+        else:
+            raise NoDataError(f"Couldn't combine from non-existent path '{p}'")
+    return files_to_combine
+
+
 def combine_parallel_data(
     data, aliases=None, data_paths=None, strict=False, keep=False, message=None,
 ):
     """Combine a number of data files together.
 
+    `data` is a CoverageData.
+
     Treat `data.filename` as a file prefix, and combine the data from all
     of the data files starting with that prefix plus a dot.
 
@@ -79,24 +104,10 @@
     raised.
 
     """
-    # Because of the os.path.abspath in the constructor, data_dir will
-    # never be an empty string.
-    data_dir, local = os.path.split(data.base_filename())
-    localdot = local + '.*'
-
-    data_paths = data_paths or [data_dir]
-    files_to_combine = []
-    for p in data_paths:
-        if os.path.isfile(p):
-            files_to_combine.append(os.path.abspath(p))
-        elif os.path.isdir(p):
-            pattern = os.path.join(os.path.abspath(p), localdot)
-            files_to_combine.extend(glob.glob(pattern))
-        else:
-            raise CoverageException(f"Couldn't combine from non-existent path '{p}'")
+    files_to_combine = combinable_files(data.base_filename(), data_paths)
 
     if strict and not files_to_combine:
-        raise CoverageException("No data to combine")
+        raise NoDataError("No data to combine")
 
     files_combined = 0
     for f in files_to_combine:
@@ -127,4 +138,26 @@
                 file_be_gone(f)
 
     if strict and not files_combined:
-        raise CoverageException("No usable data files")
+        raise NoDataError("No usable data files")
+
+
+def debug_data_file(filename):
+    """Implementation of 'coverage debug data'."""
+    data = CoverageData(filename)
+    filename = data.data_filename()
+    print(f"path: {filename}")
+    if not os.path.exists(filename):
+        print("No data collected: file doesn't exist")
+        return
+    data.read()
+    print(f"has_arcs: {data.has_arcs()!r}")
+    summary = line_counts(data, fullpath=True)
+    filenames = human_sorted(summary.keys())
+    nfiles = len(filenames)
+    print(f"{nfiles} file{plural(nfiles)}:")
+    for f in filenames:
+        line = f"{f}: {summary[f]} line{plural(summary[f])}"
+        plugin = data.file_tracer(f)
+        if plugin:
+            line += f" [{plugin}]"
+        print(line)
--- a/eric7/DebugClients/Python/coverage/disposition.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/disposition.py	Tue Feb 08 14:15:48 2022 +0100
@@ -33,7 +33,7 @@
         if disp.original_filename != disp.source_filename:
             msg += f" as {disp.source_filename!r}"
         if disp.file_tracer:
-            msg += ": will be traced by %r" % disp.file_tracer
+            msg += f": will be traced by {disp.file_tracer!r}"
     else:
         msg = f"Not tracing {disp.original_filename!r}: {disp.reason}"
     return msg
--- a/eric7/DebugClients/Python/coverage/doc/CHANGES.rst	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/doc/CHANGES.rst	Tue Feb 08 14:15:48 2022 +0100
@@ -19,6 +19,48 @@
     ..  Version 9.8.1 — 2027-07-27
     ..  --------------------------
 
+.. _changes_62:
+
+Version 6.2 — 2021-11-26
+------------------------
+
+- Feature: Now the ``--concurrency`` setting can now have a list of values, so
+  that threads and another lightweight threading package can be measured
+  together, such as ``--concurrency=gevent,thread``.  Closes `issue 1012`_ and
+  `issue 1082`_.
+
+- Fix: A module specified as the ``source`` setting is imported during startup,
+  before the user program imports it.  This could cause problems if the rest of
+  the program isn't ready yet.  For example, `issue 1203`_ describes a Django
+  setting that is accessed before settings have been configured.  Now the early
+  import is wrapped in a try/except so errors then don't stop execution.
+
+- Fix: A colon in a decorator expression would cause an exclusion to end too
+  early, preventing the exclusion of the decorated function. This is now fixed.
+
+- Fix: The HTML report now will not overwrite a .gitignore file that already
+  exists in the HTML output directory (follow-on for `issue 1244`_).
+
+- API: The exceptions raised by Coverage.py have been specialized, to provide
+  finer-grained catching of exceptions by third-party code.
+
+- API: Using ``suffix=False`` when constructing a Coverage object with
+  multiprocessing wouldn't suppress the data file suffix (`issue 989`_).  This
+  is now fixed.
+
+- Debug: The `coverage debug data` command will now sniff out combinable data
+  files, and report on all of them.
+
+- Debug: The `coverage debug` command used to accept a number of topics at a
+  time, and show all of them, though this was never documented.  This no longer
+  works, to allow for command-line options in the future.
+
+.. _issue 989: https://github.com/nedbat/coveragepy/issues/989
+.. _issue 1012: https://github.com/nedbat/coveragepy/issues/1012
+.. _issue 1082: https://github.com/nedbat/coveragepy/issues/1802
+.. _issue 1203: https://github.com/nedbat/coveragepy/issues/1203
+
+
 .. _changes_612:
 
 Version 6.1.2 — 2021-11-10
--- a/eric7/DebugClients/Python/coverage/env.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/env.py	Tue Feb 08 14:15:48 2022 +0100
@@ -10,6 +10,7 @@
 # Operating systems.
 WINDOWS = sys.platform == "win32"
 LINUX = sys.platform.startswith("linux")
+OSX = sys.platform == "darwin"
 
 # Python implementations.
 CPYTHON = (platform.python_implementation() == "CPython")
--- a/eric7/DebugClients/Python/coverage/exceptions.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/exceptions.py	Tue Feb 08 14:15:48 2022 +0100
@@ -4,13 +4,27 @@
 """Exceptions coverage.py can raise."""
 
 
-class BaseCoverageException(Exception):
-    """The base of all Coverage exceptions."""
+class _BaseCoverageException(Exception):
+    """The base-base of all Coverage exceptions."""
+    pass
+
+
+class CoverageException(_BaseCoverageException):
+    """The base class of all exceptions raised by Coverage.py."""
     pass
 
 
-class CoverageException(BaseCoverageException):
-    """An exception raised by a coverage.py function."""
+class ConfigError(_BaseCoverageException):
+    """A problem with a config file, or a value in one."""
+    pass
+
+
+class DataError(CoverageException):
+    """An error in using a data file."""
+    pass
+
+class NoDataError(CoverageException):
+    """We didn't have data to work with."""
     pass
 
 
@@ -29,7 +43,12 @@
     pass
 
 
-class ExceptionDuringRun(CoverageException):
+class PluginError(CoverageException):
+    """A plugin misbehaved."""
+    pass
+
+
+class _ExceptionDuringRun(CoverageException):
     """An exception happened while running customer code.
 
     Construct it with three arguments, the values from `sys.exc_info`.
@@ -38,7 +57,7 @@
     pass
 
 
-class StopEverything(BaseCoverageException):
+class _StopEverything(_BaseCoverageException):
     """An exception that means everything should stop.
 
     The CoverageTest class converts these to SkipTest, so that when running
--- a/eric7/DebugClients/Python/coverage/execfile.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/execfile.py	Tue Feb 08 14:15:48 2022 +0100
@@ -13,7 +13,7 @@
 import types
 
 from coverage import env
-from coverage.exceptions import CoverageException, ExceptionDuringRun, NoCode, NoSource
+from coverage.exceptions import CoverageException, _ExceptionDuringRun, NoCode, NoSource
 from coverage.files import canonical_filename, python_reported_file
 from coverage.misc import isolate_module
 from coverage.phystokens import compile_unicode
@@ -144,7 +144,7 @@
                     self.arg0 = try_filename
                     break
             else:
-                raise NoSource("Can't find '__main__' module in '%s'" % self.arg0)
+                raise NoSource(f"Can't find '__main__' module in '{self.arg0}'")
 
             # Make a spec. I don't know if this is the right way to do it.
             try_filename = python_reported_file(try_filename)
@@ -233,7 +233,7 @@
                 err2.__traceback__ = err2.__traceback__.tb_next
                 sys.__excepthook__(typ2, err2, tb2.tb_next)
                 sys.stderr.write("\nOriginal exception was:\n")
-                raise ExceptionDuringRun(typ, err, tb.tb_next) from exc
+                raise _ExceptionDuringRun(typ, err, tb.tb_next) from exc
             else:
                 sys.exit(1)
         finally:
@@ -293,7 +293,7 @@
         # match or we won't run the file.
         magic = fpyc.read(4)
         if magic != PYC_MAGIC_NUMBER:
-            raise NoCode(f"Bad magic number in .pyc file: {magic} != {PYC_MAGIC_NUMBER}")
+            raise NoCode(f"Bad magic number in .pyc file: {magic!r} != {PYC_MAGIC_NUMBER!r}")
 
         date_based = True
         if env.PYBEHAVIOR.hashed_pyc_pep552:
--- a/eric7/DebugClients/Python/coverage/files.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/files.py	Tue Feb 08 14:15:48 2022 +0100
@@ -13,7 +13,7 @@
 import sys
 
 from coverage import env
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError
 from coverage.misc import contract, human_sorted, isolate_module, join_regex
 
 
@@ -137,9 +137,9 @@
         return actpath
 
 else:
-    def actual_path(filename):
+    def actual_path(path):
         """The actual path for non-Windows platforms."""
-        return filename
+        return path
 
 
 @contract(returns='unicode')
@@ -356,7 +356,7 @@
 
         # The pattern can't end with a wildcard component.
         if pattern.endswith("*"):
-            raise CoverageException("Pattern must not end with wildcards.")
+            raise ConfigError("Pattern must not end with wildcards.")
 
         # The pattern is meant to match a filepath.  Let's make it absolute
         # unless it already is, or is meant to match any prefix.
--- a/eric7/DebugClients/Python/coverage/html.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/html.py	Tue Feb 08 14:15:48 2022 +0100
@@ -12,10 +12,10 @@
 
 import coverage
 from coverage.data import add_data_to_hash
-from coverage.exceptions import CoverageException
+from coverage.exceptions import NoDataError
 from coverage.files import flat_rootname
 from coverage.misc import ensure_dir, file_be_gone, Hasher, isolate_module, format_local_datetime
-from coverage.misc import human_sorted
+from coverage.misc import human_sorted, plural
 from coverage.report import get_analysis_to_report
 from coverage.results import Numbers
 from coverage.templite import Templite
@@ -208,7 +208,7 @@
             self.html_file(fr, analysis)
 
         if not self.all_files_nums:
-            raise CoverageException("No data to report.")
+            raise NoDataError("No data to report.")
 
         self.totals = sum(self.all_files_nums)
 
@@ -226,8 +226,10 @@
 
         # .gitignore can't be copied from the source tree because it would
         # prevent the static files from being checked in.
-        with open(os.path.join(self.directory, ".gitignore"), "w") as fgi:
-            fgi.write("# Created by coverage.py\n*\n")
+        gitigore_path = os.path.join(self.directory, ".gitignore")
+        if not os.path.exists(gitigore_path):
+            with open(gitigore_path, "w") as fgi:
+                fgi.write("# Created by coverage.py\n*\n")
 
         # The user may have extra CSS they want copied.
         if self.extra_css:
@@ -329,17 +331,11 @@
 
         skipped_covered_msg = skipped_empty_msg = ""
         if self.skipped_covered_count:
-            msg = "{} {} skipped due to complete coverage."
-            skipped_covered_msg = msg.format(
-                self.skipped_covered_count,
-                "file" if self.skipped_covered_count == 1 else "files",
-            )
+            n = self.skipped_covered_count
+            skipped_covered_msg = f"{n} file{plural(n)} skipped due to complete coverage."
         if self.skipped_empty_count:
-            msg = "{} empty {} skipped."
-            skipped_empty_msg = msg.format(
-                self.skipped_empty_count,
-                "file" if self.skipped_empty_count == 1 else "files",
-            )
+            n = self.skipped_empty_count
+            skipped_empty_msg = f"{n} empty file{plural(n)} skipped."
 
         html = index_tmpl.render({
             'files': self.file_summaries,
--- a/eric7/DebugClients/Python/coverage/inorout.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/inorout.py	Tue Feb 08 14:15:48 2022 +0100
@@ -15,7 +15,7 @@
 
 from coverage import env
 from coverage.disposition import FileDisposition, disposition_init
-from coverage.exceptions import CoverageException
+from coverage.exceptions import CoverageException, PluginError
 from coverage.files import TreeMatcher, FnmatchMatcher, ModuleMatcher
 from coverage.files import prep_patterns, find_python_files, canonical_filename
 from coverage.misc import sys_modules_saved
@@ -120,7 +120,7 @@
     path = []
     try:
         spec = importlib.util.find_spec(modulename)
-    except ImportError:
+    except Exception:
         pass
     else:
         if spec is not None:
@@ -243,6 +243,9 @@
             if self.debug:
                 self.debug.write(msg)
 
+        # Generally useful information
+        debug("sys.path:" + "".join(f"\n    {p}" for p in sys.path))
+
         # Create the matchers we need for should_trace
         if self.source or self.source_pkgs:
             against = []
@@ -392,7 +395,7 @@
 
         if not disp.has_dynamic_filename:
             if not disp.source_filename:
-                raise CoverageException(
+                raise PluginError(
                     f"Plugin {plugin!r} didn't set source_filename for '{disp.original_filename}'"
                 )
             reason = self.check_include_omit_etc(disp.source_filename, frame)
--- a/eric7/DebugClients/Python/coverage/misc.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/misc.py	Tue Feb 08 14:15:48 2022 +0100
@@ -12,9 +12,7 @@
 import locale
 import os
 import os.path
-import random
 import re
-import socket
 import sys
 import types
 
@@ -184,7 +182,7 @@
 
 def join_regex(regexes):
     """Combine a list of regexes into one that matches any of them."""
-    return "|".join("(?:%s)" % r for r in regexes)
+    return "|".join(f"(?:{r})" for r in regexes)
 
 
 def file_be_gone(path):
@@ -222,26 +220,6 @@
     return encoding
 
 
-def filename_suffix(suffix):
-    """Compute a filename suffix for a data file.
-
-    If `suffix` is a string or None, simply return it. If `suffix` is True,
-    then build a suffix incorporating the hostname, process id, and a random
-    number.
-
-    Returns a string or None.
-
-    """
-    if suffix is True:
-        # If data_suffix was a simple true value, then make a suffix with
-        # plenty of distinguishing information.  We do this here in
-        # `save()` at the last minute so that the pid will be correct even
-        # if the process forks.
-        dice = random.Random(os.urandom(8)).randint(0, 999999)
-        suffix = "%s.%s.%06d" % (socket.gethostname(), os.getpid(), dice)
-    return suffix
-
-
 class Hasher:
     """Hashes Python data for fingerprinting."""
     def __init__(self):
@@ -415,3 +393,14 @@
     Returns the sorted list of items.
     """
     return sorted(items, key=lambda pair: (human_key(pair[0]), pair[1]), reverse=reverse)
+
+
+def plural(n, thing="", things=""):
+    """Pluralize a word.
+
+    If n is 1, return thing.  Otherwise return things, or thing+s.
+    """
+    if n == 1:
+        return thing
+    else:
+        return things or (thing + "s")
--- a/eric7/DebugClients/Python/coverage/parser.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/parser.py	Tue Feb 08 14:15:48 2022 +0100
@@ -13,7 +13,7 @@
 from coverage import env
 from coverage.bytecode import code_objects
 from coverage.debug import short_stack
-from coverage.exceptions import NoSource, NotPython, StopEverything
+from coverage.exceptions import NoSource, NotPython, _StopEverything
 from coverage.misc import contract, join_regex, new_contract, nice_pair, one_of
 from coverage.phystokens import compile_unicode, generate_tokens, neuter_encoding_declaration
 
@@ -67,9 +67,6 @@
         # The raw line numbers of excluded lines of code, as marked by pragmas.
         self.raw_excluded = set()
 
-        # The line numbers of class and function definitions.
-        self.raw_classdefs = set()
-
         # The line numbers of docstring lines.
         self.raw_docstrings = set()
 
@@ -120,6 +117,7 @@
         first_line = None
         empty = True
         first_on_line = True
+        nesting = 0
 
         tokgen = generate_tokens(self.text)
         for toktype, ttext, (slineno, _), (elineno, _), ltext in tokgen:
@@ -132,14 +130,8 @@
                 indent += 1
             elif toktype == token.DEDENT:
                 indent -= 1
-            elif toktype == token.NAME:
-                if ttext == 'class':
-                    # Class definitions look like branches in the bytecode, so
-                    # we need to exclude them.  The simplest way is to note the
-                    # lines with the 'class' keyword.
-                    self.raw_classdefs.add(slineno)
             elif toktype == token.OP:
-                if ttext == ':':
+                if ttext == ':' and nesting == 0:
                     should_exclude = (elineno in self.raw_excluded) or excluding_decorators
                     if not excluding and should_exclude:
                         # Start excluding a suite.  We trigger off of the colon
@@ -155,6 +147,10 @@
                         excluding_decorators = True
                     if excluding_decorators:
                         self.raw_excluded.add(elineno)
+                elif ttext in "([{":
+                    nesting += 1
+                elif ttext in ")]}":
+                    nesting -= 1
             elif toktype == token.STRING and prev_toktype == token.INDENT:
                 # Strings that are first on an indented line are docstrings.
                 # (a trick from trace.py in the stdlib.) This works for
@@ -296,12 +292,6 @@
                 continue
             exit_counts[l1] += 1
 
-        # Class definitions have one extra exit, so remove one for each:
-        for l in self.raw_classdefs:
-            # Ensure key is there: class definitions can include excluded lines.
-            if l in exit_counts:
-                exit_counts[l] -= 1
-
         return exit_counts
 
     def missing_arc_description(self, start, end, executed_arcs=None):
@@ -366,7 +356,7 @@
         # attributes on code objects that we need to do the analysis.
         for attr in ['co_lnotab', 'co_firstlineno']:
             if not hasattr(self.code, attr):
-                raise StopEverything(                   # pragma: only jython
+                raise _StopEverything(                  # pragma: only jython
                     "This implementation of Python doesn't support code analysis.\n" +
                     "Run coverage.py under another Python for this command."
                 )
--- a/eric7/DebugClients/Python/coverage/plugin.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/plugin.py	Tue Feb 08 14:15:48 2022 +0100
@@ -112,6 +112,8 @@
 
 """
 
+import functools
+
 from coverage import files
 from coverage.misc import contract, _needs_to_implement
 
@@ -315,6 +317,7 @@
         return lineno, lineno
 
 
+@functools.total_ordering
 class FileReporter:
     """Support needed for files during the analysis and reporting phases.
 
@@ -509,25 +512,10 @@
         for line in self.source().splitlines():
             yield [('txt', line)]
 
-    # Annoying comparison operators. Py3k wants __lt__ etc, and Py2k needs all
-    # of them defined.
-
     def __eq__(self, other):
         return isinstance(other, FileReporter) and self.filename == other.filename
 
-    def __ne__(self, other):
-        return not (self == other)
-
     def __lt__(self, other):
-        return self.filename < other.filename
-
-    def __le__(self, other):
-        return self.filename <= other.filename
-
-    def __gt__(self, other):
-        return self.filename > other.filename
-
-    def __ge__(self, other):
-        return self.filename >= other.filename
+        return isinstance(other, FileReporter) and self.filename < other.filename
 
     __hash__ = None     # This object doesn't need to be hashed.
--- a/eric7/DebugClients/Python/coverage/plugin_support.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/plugin_support.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,7 +7,7 @@
 import os.path
 import sys
 
-from coverage.exceptions import CoverageException
+from coverage.exceptions import PluginError
 from coverage.misc import isolate_module
 from coverage.plugin import CoveragePlugin, FileTracer, FileReporter
 
@@ -44,7 +44,7 @@
 
             coverage_init = getattr(mod, "coverage_init", None)
             if not coverage_init:
-                raise CoverageException(
+                raise PluginError(
                     f"Plugin module {module!r} didn't define a coverage_init function"
                 )
 
@@ -110,11 +110,9 @@
         if specialized is not None:
             specialized.append(plugin)
 
-    def __nonzero__(self):
+    def __bool__(self):
         return bool(self.order)
 
-    __bool__ = __nonzero__
-
     def __iter__(self):
         return iter(self.order)
 
--- a/eric7/DebugClients/Python/coverage/report.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/report.py	Tue Feb 08 14:15:48 2022 +0100
@@ -5,7 +5,7 @@
 
 import sys
 
-from coverage.exceptions import CoverageException, NotPython
+from coverage.exceptions import CoverageException, NoDataError, NotPython
 from coverage.files import prep_patterns, FnmatchMatcher
 from coverage.misc import ensure_dir_for_file, file_be_gone
 
@@ -65,7 +65,7 @@
         file_reporters = [fr for fr in file_reporters if not matcher.match(fr.filename)]
 
     if not file_reporters:
-        raise CoverageException("No data to report.")
+        raise NoDataError("No data to report.")
 
     for fr in sorted(file_reporters):
         try:
--- a/eric7/DebugClients/Python/coverage/results.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/results.py	Tue Feb 08 14:15:48 2022 +0100
@@ -6,7 +6,7 @@
 import collections
 
 from coverage.debug import SimpleReprMixin
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError
 from coverage.misc import contract, nice_pair
 
 
@@ -317,7 +317,7 @@
             for ex in sorted(exits):
                 if line not in lines and ex not in lines:
                     dest = (ex if ex > 0 else "exit")
-                    line_items.append((line, "%d->%s" % (line, dest)))
+                    line_items.append((line, f"{line}->{dest}"))
 
     ret = ', '.join(t[-1] for t in sorted(line_items))
     return ret
@@ -337,7 +337,7 @@
     # We can never achieve higher than 100% coverage, or less than zero.
     if not (0 <= fail_under <= 100.0):
         msg = f"fail_under={fail_under} is invalid. Must be between 0 and 100."
-        raise CoverageException(msg)
+        raise ConfigError(msg)
 
     # Special case for fail_under=100, it must really be 100.
     if fail_under == 100.0 and total != 100.0:
--- a/eric7/DebugClients/Python/coverage/sqldata.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/sqldata.py	Tue Feb 08 14:15:48 2022 +0100
@@ -12,16 +12,18 @@
 import glob
 import itertools
 import os
+import random
 import re
+import socket
 import sqlite3
 import sys
 import threading
 import zlib
 
 from coverage.debug import NoDebugging, SimpleReprMixin, clipped_repr
-from coverage.exceptions import CoverageException
+from coverage.exceptions import CoverageException, DataError
 from coverage.files import PathAliases
-from coverage.misc import contract, file_be_gone, filename_suffix, isolate_module
+from coverage.misc import contract, file_be_gone, isolate_module
 from coverage.numbits import numbits_to_nums, numbits_union, nums_to_numbits
 from coverage.version import __version__
 
@@ -191,7 +193,7 @@
 
         Arguments:
             basename (str): the base name of the data file, defaulting to
-                ".coverage".
+                ".coverage". This can be a path to a file in another directory.
             suffix (str or bool): has the same meaning as the `data_suffix`
                 argument to :class:`coverage.Coverage`.
             no_disk (bool): if True, keep all data in memory, and don't
@@ -287,14 +289,14 @@
             try:
                 schema_version, = db.execute_one("select version from coverage_schema")
             except Exception as exc:
-                raise CoverageException(
+                raise DataError(
                     "Data file {!r} doesn't seem to be a coverage data file: {}".format(
                         self._filename, exc
                     )
                 ) from exc
             else:
                 if schema_version != SCHEMA_VERSION:
-                    raise CoverageException(
+                    raise DataError(
                         "Couldn't use data file {!r}: wrong schema: {} instead of {}".format(
                             self._filename, schema_version, SCHEMA_VERSION
                         )
@@ -316,7 +318,7 @@
                 self._create_db()
         return self._dbs[threading.get_ident()]
 
-    def __nonzero__(self):
+    def __bool__(self):
         if (threading.get_ident() not in self._dbs and not os.path.exists(self._filename)):
             return False
         try:
@@ -326,8 +328,6 @@
         except CoverageException:
             return False
 
-    __bool__ = __nonzero__
-
     @contract(returns="bytes")
     def dumps(self):
         """Serialize the current data to a byte string.
@@ -370,9 +370,9 @@
         if self._debug.should("dataio"):
             self._debug.write(f"Loading data into data file {self._filename!r}")
         if data[:1] != b"z":
-            raise CoverageException(
+            raise DataError(
                 f"Unrecognized serialization: {data[:40]!r} (head of {len(data)} bytes)"
-                )
+            )
         script = zlib.decompress(data[1:]).decode("utf-8")
         self._dbs[threading.get_ident()] = db = SqliteDb(self._filename, self._debug)
         with db:
@@ -513,9 +513,9 @@
         assert lines or arcs
         assert not (lines and arcs)
         if lines and self._has_arcs:
-            raise CoverageException("Can't add line measurements to existing branch data")
+            raise DataError("Can't add line measurements to existing branch data")
         if arcs and self._has_lines:
-            raise CoverageException("Can't add branch measurements to existing line data")
+            raise DataError("Can't add branch measurements to existing line data")
         if not self._has_arcs and not self._has_lines:
             self._has_lines = lines
             self._has_arcs = arcs
@@ -541,14 +541,14 @@
             for filename, plugin_name in file_tracers.items():
                 file_id = self._file_id(filename)
                 if file_id is None:
-                    raise CoverageException(
+                    raise DataError(
                         f"Can't add file tracer data for unmeasured file '{filename}'"
                     )
 
                 existing_plugin = self.file_tracer(filename)
                 if existing_plugin:
                     if existing_plugin != plugin_name:
-                        raise CoverageException(
+                        raise DataError(
                             "Conflicting file tracer name for '{}': {!r} vs {!r}".format(
                                 filename, existing_plugin, plugin_name,
                             )
@@ -578,7 +578,7 @@
         self._start_using()
         with self._connect(): # Use this to get one transaction.
             if not self._has_arcs and not self._has_lines:
-                raise CoverageException("Can't touch files in an empty CoverageData")
+                raise DataError("Can't touch files in an empty CoverageData")
 
             for filename in filenames:
                 self._file_id(filename, add=True)
@@ -597,9 +597,9 @@
                 getattr(other_data, "_filename", "???"),
             ))
         if self._has_lines and other_data._has_arcs:
-            raise CoverageException("Can't combine arc data with line data")
+            raise DataError("Can't combine arc data with line data")
         if self._has_arcs and other_data._has_lines:
-            raise CoverageException("Can't combine line data with arc data")
+            raise DataError("Can't combine line data with arc data")
 
         aliases = aliases or PathAliases()
 
@@ -692,7 +692,7 @@
                 other_tracer = tracers.get(path, "")
                 # If there is no tracer, there is always the None tracer.
                 if this_tracer is not None and this_tracer != other_tracer:
-                    raise CoverageException(
+                    raise DataError(
                         "Conflicting file tracer name for '{}': {!r} vs {!r}".format(
                             path, this_tracer, other_tracer
                         )
@@ -1004,6 +1004,26 @@
         ]
 
 
+def filename_suffix(suffix):
+    """Compute a filename suffix for a data file.
+
+    If `suffix` is a string or None, simply return it. If `suffix` is True,
+    then build a suffix incorporating the hostname, process id, and a random
+    number.
+
+    Returns a string or None.
+
+    """
+    if suffix is True:
+        # If data_suffix was a simple true value, then make a suffix with
+        # plenty of distinguishing information.  We do this here in
+        # `save()` at the last minute so that the pid will be correct even
+        # if the process forks.
+        dice = random.Random(os.urandom(8)).randint(0, 999999)
+        suffix = "%s.%s.%06d" % (socket.gethostname(), os.getpid(), dice)
+    return suffix
+
+
 class SqliteDb(SimpleReprMixin):
     """A simple abstraction over a SQLite database.
 
@@ -1035,7 +1055,7 @@
         try:
             self.con = sqlite3.connect(self.filename, check_same_thread=False)
         except sqlite3.Error as exc:
-            raise CoverageException(f"Couldn't use data file {self.filename!r}: {exc}") from exc
+            raise DataError(f"Couldn't use data file {self.filename!r}: {exc}") from exc
 
         self.con.create_function("REGEXP", 2, _regexp)
 
@@ -1068,7 +1088,7 @@
             except Exception as exc:
                 if self.debug:
                     self.debug.write(f"EXCEPTION from __exit__: {exc}")
-                raise CoverageException(f"Couldn't end data file {self.filename!r}: {exc}") from exc
+                raise DataError(f"Couldn't end data file {self.filename!r}: {exc}") from exc
 
     def execute(self, sql, parameters=()):
         """Same as :meth:`python:sqlite3.Connection.execute`."""
@@ -1099,7 +1119,7 @@
                 pass
             if self.debug:
                 self.debug.write(f"EXCEPTION from execute: {msg}")
-            raise CoverageException(f"Couldn't use data file {self.filename!r}: {msg}") from exc
+            raise DataError(f"Couldn't use data file {self.filename!r}: {msg}") from exc
 
     def execute_one(self, sql, parameters=()):
         """Execute a statement and return the one row that results.
--- a/eric7/DebugClients/Python/coverage/summary.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/summary.py	Tue Feb 08 14:15:48 2022 +0100
@@ -5,7 +5,7 @@
 
 import sys
 
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError, NoDataError
 from coverage.misc import human_sorted_items
 from coverage.report import get_analysis_to_report
 from coverage.results import Numbers
@@ -103,7 +103,7 @@
         else:
             position = column_order.get(sort_option)
             if position is None:
-                raise CoverageException(f"Invalid sorting option: {self.config.sort!r}")
+                raise ConfigError(f"Invalid sorting option: {self.config.sort!r}")
             lines.sort(key=lambda l: (l[1][position], l[0]), reverse=reverse)
 
         for line in lines:
@@ -122,7 +122,7 @@
 
         # Write other final lines.
         if not self.total.n_files and not self.skipped_count:
-            raise CoverageException("No data to report.")
+            raise NoDataError("No data to report.")
 
         if self.config.skip_covered and self.skipped_count:
             self.writeout(
--- a/eric7/DebugClients/Python/coverage/tomlconfig.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/tomlconfig.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,7 +7,7 @@
 import os
 import re
 
-from coverage.exceptions import CoverageException
+from coverage.exceptions import ConfigError
 from coverage.misc import import_third_party, substitute_variables
 
 # TOML support is an install-time extra option. (Import typing is here because
@@ -57,7 +57,7 @@
             if self.our_file or has_toml:
                 # Looks like they meant to read TOML, but we can't read it.
                 msg = "Can't read {!r} without TOML support. Install with [toml] extra"
-                raise CoverageException(msg.format(filename))
+                raise ConfigError(msg.format(filename))
             return []
 
     def _get_section(self, section):
@@ -148,7 +148,7 @@
             try:
                 re.compile(value)
             except re.error as e:
-                raise CoverageException(f"Invalid [{name}].{option} value {value!r}: {e}") from e
+                raise ConfigError(f"Invalid [{name}].{option} value {value!r}: {e}") from e
         return values
 
     def getint(self, section, option):
--- a/eric7/DebugClients/Python/coverage/version.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/version.py	Tue Feb 08 14:15:48 2022 +0100
@@ -5,7 +5,7 @@
 # This file is exec'ed in setup.py, don't import anything!
 
 # Same semantics as sys.version_info.
-version_info = (6, 1, 2, "final", 0)
+version_info = (6, 2, 0, "final", 0)
 
 
 def _make_version(major, minor, micro, releaselevel, serial):
@@ -16,7 +16,7 @@
         version += ".%d" % (micro,)
     if releaselevel != 'final':
         short = {'alpha': 'a', 'beta': 'b', 'candidate': 'rc'}[releaselevel]
-        version += "%s%d" % (short, serial)
+        version += f"{short}{serial}"
     return version
 
 
--- a/eric7/DebugClients/Python/coverage/xmlreport.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/DebugClients/Python/coverage/xmlreport.py	Tue Feb 08 14:15:48 2022 +0100
@@ -67,9 +67,9 @@
         xcoverage.setAttribute("version", __version__)
         xcoverage.setAttribute("timestamp", str(int(time.time()*1000)))
         xcoverage.appendChild(self.xml_out.createComment(
-            " Generated by coverage.py: %s " % __url__
+            f" Generated by coverage.py: {__url__} "
             ))
-        xcoverage.appendChild(self.xml_out.createComment(" Based on %s " % DTD_URL))
+        xcoverage.appendChild(self.xml_out.createComment(f" Based on {DTD_URL} "))
 
         # Call xml_file for each file in the data.
         for fr, analysis in get_analysis_to_report(self.coverage, morfs):
Binary file eric7/Documentation/Help/source.qch has changed
--- a/eric7/Documentation/Help/source.qhp	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Help/source.qhp	Tue Feb 08 14:15:48 2022 +0100
@@ -214,6 +214,9 @@
             <section title="eric7.Graphics.UMLSceneSizeDialog" ref="eric7.Graphics.UMLSceneSizeDialog.html" />
           </section>
           <section title="eric7.HelpViewer" ref="index-eric7.HelpViewer.html">
+            <section title="eric7.HelpViewer.HelpBookmarkPropertiesDialog" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html" />
+            <section title="eric7.HelpViewer.HelpBookmarksImportDialog" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html" />
+            <section title="eric7.HelpViewer.HelpBookmarksWidget" ref="eric7.HelpViewer.HelpBookmarksWidget.html" />
             <section title="eric7.HelpViewer.HelpViewerImpl" ref="eric7.HelpViewer.HelpViewerImpl.html" />
             <section title="eric7.HelpViewer.HelpViewerImplQTB" ref="eric7.HelpViewer.HelpViewerImplQTB.html" />
             <section title="eric7.HelpViewer.HelpViewerImplQWE" ref="eric7.HelpViewer.HelpViewerImplQWE.html" />
@@ -244,6 +247,7 @@
           </section>
           <section title="eric7.MicroPython" ref="index-eric7.MicroPython.html">
             <section title="eric7.MicroPython.AddEditDevicesDialog" ref="eric7.MicroPython.AddEditDevicesDialog.html" />
+            <section title="eric7.MicroPython.BoardDataDialog" ref="eric7.MicroPython.BoardDataDialog.html" />
             <section title="eric7.MicroPython.CircuitPythonDevices" ref="eric7.MicroPython.CircuitPythonDevices.html" />
             <section title="eric7.MicroPython.ConnectionSelectionDialog" ref="eric7.MicroPython.ConnectionSelectionDialog.html" />
             <section title="eric7.MicroPython.EspBackupRestoreFirmwareDialog" ref="eric7.MicroPython.EspBackupRestoreFirmwareDialog.html" />
@@ -1999,6 +2003,10 @@
       <keyword name="BinaryModel.setBitsAndValue" id="BinaryModel.setBitsAndValue" ref="eric7.UI.NumbersWidget.html#BinaryModel.setBitsAndValue" />
       <keyword name="BinaryModel.setData" id="BinaryModel.setData" ref="eric7.UI.NumbersWidget.html#BinaryModel.setData" />
       <keyword name="BinaryModel.setValue" id="BinaryModel.setValue" ref="eric7.UI.NumbersWidget.html#BinaryModel.setValue" />
+      <keyword name="BoardDataDialog" id="BoardDataDialog" ref="eric7.MicroPython.BoardDataDialog.html#BoardDataDialog" />
+      <keyword name="BoardDataDialog (Constructor)" id="BoardDataDialog (Constructor)" ref="eric7.MicroPython.BoardDataDialog.html#BoardDataDialog.__init__" />
+      <keyword name="BoardDataDialog (Module)" id="BoardDataDialog (Module)" ref="eric7.MicroPython.BoardDataDialog.html" />
+      <keyword name="BoardDataDialog.__createHeader" id="BoardDataDialog.__createHeader" ref="eric7.MicroPython.BoardDataDialog.html#BoardDataDialog.__createHeader" />
       <keyword name="BookmarkActionSelectionDialog" id="BookmarkActionSelectionDialog" ref="eric7.WebBrowser.UrlBar.BookmarkActionSelectionDialog.html#BookmarkActionSelectionDialog" />
       <keyword name="BookmarkActionSelectionDialog (Constructor)" id="BookmarkActionSelectionDialog (Constructor)" ref="eric7.WebBrowser.UrlBar.BookmarkActionSelectionDialog.html#BookmarkActionSelectionDialog.__init__" />
       <keyword name="BookmarkActionSelectionDialog (Module)" id="BookmarkActionSelectionDialog (Module)" ref="eric7.WebBrowser.UrlBar.BookmarkActionSelectionDialog.html" />
@@ -2257,6 +2265,7 @@
       <keyword name="Browser._keyboardSearchType" id="Browser._keyboardSearchType" ref="eric7.UI.Browser.html#Browser._keyboardSearchType" />
       <keyword name="Browser._newDirectory" id="Browser._newDirectory" ref="eric7.UI.Browser.html#Browser._newDirectory" />
       <keyword name="Browser._newFile" id="Browser._newFile" ref="eric7.UI.Browser.html#Browser._newFile" />
+      <keyword name="Browser._openFileInEditor" id="Browser._openFileInEditor" ref="eric7.UI.Browser.html#Browser._openFileInEditor" />
       <keyword name="Browser._openHexEditor" id="Browser._openHexEditor" ref="eric7.UI.Browser.html#Browser._openHexEditor" />
       <keyword name="Browser._openItem" id="Browser._openItem" ref="eric7.UI.Browser.html#Browser._openItem" />
       <keyword name="Browser._resizeColumns" id="Browser._resizeColumns" ref="eric7.UI.Browser.html#Browser._resizeColumns" />
@@ -7175,6 +7184,35 @@
       <keyword name="HashPrefixList (Constructor)" id="HashPrefixList (Constructor)" ref="eric7.WebBrowser.SafeBrowsing.SafeBrowsingThreatList.html#HashPrefixList.__init__" />
       <keyword name="HashPrefixList.__iter__" id="HashPrefixList.__iter__" ref="eric7.WebBrowser.SafeBrowsing.SafeBrowsingThreatList.html#HashPrefixList.__iter__" />
       <keyword name="HashPrefixList.__len__" id="HashPrefixList.__len__" ref="eric7.WebBrowser.SafeBrowsing.SafeBrowsingThreatList.html#HashPrefixList.__len__" />
+      <keyword name="HelpBookmarkPropertiesDialog" id="HelpBookmarkPropertiesDialog" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html#HelpBookmarkPropertiesDialog" />
+      <keyword name="HelpBookmarkPropertiesDialog (Constructor)" id="HelpBookmarkPropertiesDialog (Constructor)" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html#HelpBookmarkPropertiesDialog.__init__" />
+      <keyword name="HelpBookmarkPropertiesDialog (Module)" id="HelpBookmarkPropertiesDialog (Module)" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html" />
+      <keyword name="HelpBookmarkPropertiesDialog.__updateOkButton" id="HelpBookmarkPropertiesDialog.__updateOkButton" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html#HelpBookmarkPropertiesDialog.__updateOkButton" />
+      <keyword name="HelpBookmarkPropertiesDialog.getData" id="HelpBookmarkPropertiesDialog.getData" ref="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html#HelpBookmarkPropertiesDialog.getData" />
+      <keyword name="HelpBookmarksImportDialog" id="HelpBookmarksImportDialog" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html#HelpBookmarksImportDialog" />
+      <keyword name="HelpBookmarksImportDialog (Constructor)" id="HelpBookmarksImportDialog (Constructor)" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html#HelpBookmarksImportDialog.__init__" />
+      <keyword name="HelpBookmarksImportDialog (Module)" id="HelpBookmarksImportDialog (Module)" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html" />
+      <keyword name="HelpBookmarksImportDialog.__updateOkButton" id="HelpBookmarksImportDialog.__updateOkButton" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html#HelpBookmarksImportDialog.__updateOkButton" />
+      <keyword name="HelpBookmarksImportDialog.getData" id="HelpBookmarksImportDialog.getData" ref="eric7.HelpViewer.HelpBookmarksImportDialog.html#HelpBookmarksImportDialog.getData" />
+      <keyword name="HelpBookmarksWidget" id="HelpBookmarksWidget" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget" />
+      <keyword name="HelpBookmarksWidget (Constructor)" id="HelpBookmarksWidget (Constructor)" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__init__" />
+      <keyword name="HelpBookmarksWidget (Module)" id="HelpBookmarksWidget (Module)" ref="eric7.HelpViewer.HelpBookmarksWidget.html" />
+      <keyword name="HelpBookmarksWidget.__addBookmark" id="HelpBookmarksWidget.__addBookmark" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__addBookmark" />
+      <keyword name="HelpBookmarksWidget.__bookmarkActivated" id="HelpBookmarksWidget.__bookmarkActivated" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__bookmarkActivated" />
+      <keyword name="HelpBookmarksWidget.__bookmarkCurrentPage" id="HelpBookmarksWidget.__bookmarkCurrentPage" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__bookmarkCurrentPage" />
+      <keyword name="HelpBookmarksWidget.__deleteBookmarks" id="HelpBookmarksWidget.__deleteBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__deleteBookmarks" />
+      <keyword name="HelpBookmarksWidget.__editBookmark" id="HelpBookmarksWidget.__editBookmark" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__editBookmark" />
+      <keyword name="HelpBookmarksWidget.__exportBookmarks" id="HelpBookmarksWidget.__exportBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__exportBookmarks" />
+      <keyword name="HelpBookmarksWidget.__importBookmarks" id="HelpBookmarksWidget.__importBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__importBookmarks" />
+      <keyword name="HelpBookmarksWidget.__loadBookmarks" id="HelpBookmarksWidget.__loadBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__loadBookmarks" />
+      <keyword name="HelpBookmarksWidget.__newBookmark" id="HelpBookmarksWidget.__newBookmark" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__newBookmark" />
+      <keyword name="HelpBookmarksWidget.__openBookmarks" id="HelpBookmarksWidget.__openBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__openBookmarks" />
+      <keyword name="HelpBookmarksWidget.__saveBookmarks" id="HelpBookmarksWidget.__saveBookmarks" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__saveBookmarks" />
+      <keyword name="HelpBookmarksWidget.__showBackgroundMenu" id="HelpBookmarksWidget.__showBackgroundMenu" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__showBackgroundMenu" />
+      <keyword name="HelpBookmarksWidget.__showBookmarkContextMenu" id="HelpBookmarksWidget.__showBookmarkContextMenu" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__showBookmarkContextMenu" />
+      <keyword name="HelpBookmarksWidget.__showBookmarksContextMenu" id="HelpBookmarksWidget.__showBookmarksContextMenu" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__showBookmarksContextMenu" />
+      <keyword name="HelpBookmarksWidget.__showContextMenu" id="HelpBookmarksWidget.__showContextMenu" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.__showContextMenu" />
+      <keyword name="HelpBookmarksWidget.addBookmark" id="HelpBookmarksWidget.addBookmark" ref="eric7.HelpViewer.HelpBookmarksWidget.html#HelpBookmarksWidget.addBookmark" />
       <keyword name="HelpDocsInstaller" id="HelpDocsInstaller" ref="eric7.WebBrowser.QtHelp.HelpDocsInstaller.html#HelpDocsInstaller" />
       <keyword name="HelpDocsInstaller (Constructor)" id="HelpDocsInstaller (Constructor)" ref="eric7.WebBrowser.QtHelp.HelpDocsInstaller.html#HelpDocsInstaller.__init__" />
       <keyword name="HelpDocsInstaller (Module)" id="HelpDocsInstaller (Module)" ref="eric7.WebBrowser.QtHelp.HelpDocsInstaller.html" />
@@ -7244,6 +7282,7 @@
       <keyword name="HelpViewerImplQTB" id="HelpViewerImplQTB" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB" />
       <keyword name="HelpViewerImplQTB (Constructor)" id="HelpViewerImplQTB (Constructor)" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB.__init__" />
       <keyword name="HelpViewerImplQTB (Module)" id="HelpViewerImplQTB (Module)" ref="eric7.HelpViewer.HelpViewerImplQTB.html" />
+      <keyword name="HelpViewerImplQTB.__bookmarkPage" id="HelpViewerImplQTB.__bookmarkPage" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB.__bookmarkPage" />
       <keyword name="HelpViewerImplQTB.__canLoadResource" id="HelpViewerImplQTB.__canLoadResource" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB.__canLoadResource" />
       <keyword name="HelpViewerImplQTB.__closeOtherPages" id="HelpViewerImplQTB.__closeOtherPages" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB.__closeOtherPages" />
       <keyword name="HelpViewerImplQTB.__closePage" id="HelpViewerImplQTB.__closePage" ref="eric7.HelpViewer.HelpViewerImplQTB.html#HelpViewerImplQTB.__closePage" />
@@ -7277,6 +7316,7 @@
       <keyword name="HelpViewerImplQWE" id="HelpViewerImplQWE" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE" />
       <keyword name="HelpViewerImplQWE (Constructor)" id="HelpViewerImplQWE (Constructor)" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE.__init__" />
       <keyword name="HelpViewerImplQWE (Module)" id="HelpViewerImplQWE (Module)" ref="eric7.HelpViewer.HelpViewerImplQWE.html" />
+      <keyword name="HelpViewerImplQWE.__bookmarkPage" id="HelpViewerImplQWE.__bookmarkPage" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE.__bookmarkPage" />
       <keyword name="HelpViewerImplQWE.__closeOtherPages" id="HelpViewerImplQWE.__closeOtherPages" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE.__closeOtherPages" />
       <keyword name="HelpViewerImplQWE.__closePage" id="HelpViewerImplQWE.__closePage" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE.__closePage" />
       <keyword name="HelpViewerImplQWE.__copyLink" id="HelpViewerImplQWE.__copyLink" ref="eric7.HelpViewer.HelpViewerImplQWE.html#HelpViewerImplQWE.__copyLink" />
@@ -7366,6 +7406,7 @@
       <keyword name="HelpViewerWidget.__zoomReset" id="HelpViewerWidget.__zoomReset" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.__zoomReset" />
       <keyword name="HelpViewerWidget.activate" id="HelpViewerWidget.activate" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.activate" />
       <keyword name="HelpViewerWidget.addPage" id="HelpViewerWidget.addPage" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.addPage" />
+      <keyword name="HelpViewerWidget.bookmarkPage" id="HelpViewerWidget.bookmarkPage" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.bookmarkPage" />
       <keyword name="HelpViewerWidget.closeAllPages" id="HelpViewerWidget.closeAllPages" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.closeAllPages" />
       <keyword name="HelpViewerWidget.closeCurrentPage" id="HelpViewerWidget.closeCurrentPage" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.closeCurrentPage" />
       <keyword name="HelpViewerWidget.closeOtherPages" id="HelpViewerWidget.closeOtherPages" ref="eric7.HelpViewer.HelpViewerWidget.html#HelpViewerWidget.closeOtherPages" />
@@ -10216,6 +10257,7 @@
       <keyword name="MicroPythonCommandsInterface.executeAsync" id="MicroPythonCommandsInterface.executeAsync" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.executeAsync" />
       <keyword name="MicroPythonCommandsInterface.fileSystemInfo" id="MicroPythonCommandsInterface.fileSystemInfo" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.fileSystemInfo" />
       <keyword name="MicroPythonCommandsInterface.get" id="MicroPythonCommandsInterface.get" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.get" />
+      <keyword name="MicroPythonCommandsInterface.getBoardInformation" id="MicroPythonCommandsInterface.getBoardInformation" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.getBoardInformation" />
       <keyword name="MicroPythonCommandsInterface.getImplementation" id="MicroPythonCommandsInterface.getImplementation" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.getImplementation" />
       <keyword name="MicroPythonCommandsInterface.getTime" id="MicroPythonCommandsInterface.getTime" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.getTime" />
       <keyword name="MicroPythonCommandsInterface.handlePreferencesChanged" id="MicroPythonCommandsInterface.handlePreferencesChanged" ref="eric7.MicroPython.MicroPythonCommandsInterface.html#MicroPythonCommandsInterface.handlePreferencesChanged" />
@@ -10376,6 +10418,7 @@
       <keyword name="MicroPythonWidget.__replEditMouseReleaseEvent" id="MicroPythonWidget.__replEditMouseReleaseEvent" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__replEditMouseReleaseEvent" />
       <keyword name="MicroPythonWidget.__setCharFormat" id="MicroPythonWidget.__setCharFormat" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__setCharFormat" />
       <keyword name="MicroPythonWidget.__setConnected" id="MicroPythonWidget.__setConnected" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__setConnected" />
+      <keyword name="MicroPythonWidget.__showBoardInformation" id="MicroPythonWidget.__showBoardInformation" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showBoardInformation" />
       <keyword name="MicroPythonWidget.__showContextMenu" id="MicroPythonWidget.__showContextMenu" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showContextMenu" />
       <keyword name="MicroPythonWidget.__showDeviceTime" id="MicroPythonWidget.__showDeviceTime" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showDeviceTime" />
       <keyword name="MicroPythonWidget.__showDeviceVersion" id="MicroPythonWidget.__showDeviceVersion" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showDeviceVersion" />
@@ -12198,6 +12241,7 @@
       <keyword name="ProjectOthersBrowser._contextMenuRequested" id="ProjectOthersBrowser._contextMenuRequested" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._contextMenuRequested" />
       <keyword name="ProjectOthersBrowser._createPopupMenus" id="ProjectOthersBrowser._createPopupMenus" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._createPopupMenus" />
       <keyword name="ProjectOthersBrowser._editPixmap" id="ProjectOthersBrowser._editPixmap" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._editPixmap" />
+      <keyword name="ProjectOthersBrowser._openFileInEditor" id="ProjectOthersBrowser._openFileInEditor" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._openFileInEditor" />
       <keyword name="ProjectOthersBrowser._openHexEditor" id="ProjectOthersBrowser._openHexEditor" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._openHexEditor" />
       <keyword name="ProjectOthersBrowser._openItem" id="ProjectOthersBrowser._openItem" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._openItem" />
       <keyword name="ProjectOthersBrowser._showContextMenu" id="ProjectOthersBrowser._showContextMenu" ref="eric7.Project.ProjectOthersBrowser.html#ProjectOthersBrowser._showContextMenu" />
@@ -19250,6 +19294,9 @@
       <file>eric7.Graphics.UMLGraphicsView.html</file>
       <file>eric7.Graphics.UMLItem.html</file>
       <file>eric7.Graphics.UMLSceneSizeDialog.html</file>
+      <file>eric7.HelpViewer.HelpBookmarkPropertiesDialog.html</file>
+      <file>eric7.HelpViewer.HelpBookmarksImportDialog.html</file>
+      <file>eric7.HelpViewer.HelpBookmarksWidget.html</file>
       <file>eric7.HelpViewer.HelpViewerImpl.html</file>
       <file>eric7.HelpViewer.HelpViewerImplQTB.html</file>
       <file>eric7.HelpViewer.HelpViewerImplQWE.html</file>
@@ -19270,6 +19317,7 @@
       <file>eric7.JediInterface.JediServer.html</file>
       <file>eric7.JediInterface.RefactoringPreviewDialog.html</file>
       <file>eric7.MicroPython.AddEditDevicesDialog.html</file>
+      <file>eric7.MicroPython.BoardDataDialog.html</file>
       <file>eric7.MicroPython.CircuitPythonDevices.html</file>
       <file>eric7.MicroPython.ConnectionSelectionDialog.html</file>
       <file>eric7.MicroPython.EspBackupRestoreFirmwareDialog.html</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpBookmarkPropertiesDialog.html	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric7.HelpViewer.HelpBookmarkPropertiesDialog</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric7.HelpViewer.HelpBookmarkPropertiesDialog</h1>
+
+<p>
+Module implementing a dialog to edit the bookmark properties.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarkPropertiesDialog">HelpBookmarkPropertiesDialog</a></td>
+<td>Class implementing a dialog to edit the bookmark properties.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="HelpBookmarkPropertiesDialog" ID="HelpBookmarkPropertiesDialog"></a>
+<h2>HelpBookmarkPropertiesDialog</h2>
+
+<p>
+    Class implementing a dialog to edit the bookmark properties.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_HelpBookmarkPropertiesDialog
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarkPropertiesDialog.__init__">HelpBookmarkPropertiesDialog</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarkPropertiesDialog.__updateOkButton">__updateOkButton</a></td>
+<td>Private method to set the enabled state of the OK button.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarkPropertiesDialog.getData">getData</a></td>
+<td>Public method to retrieve the entered data.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="HelpBookmarkPropertiesDialog.__init__" ID="HelpBookmarkPropertiesDialog.__init__"></a>
+<h4>HelpBookmarkPropertiesDialog (Constructor)</h4>
+<b>HelpBookmarkPropertiesDialog</b>(<i>title="", url="", parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>title</i> (str (optional))</dt>
+<dd>
+title for the bookmark (defaults to "")
+</dd>
+<dt><i>url</i> (str (optional))</dt>
+<dd>
+URL for the bookmark (defaults to "")
+</dd>
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="HelpBookmarkPropertiesDialog.__updateOkButton" ID="HelpBookmarkPropertiesDialog.__updateOkButton"></a>
+<h4>HelpBookmarkPropertiesDialog.__updateOkButton</h4>
+<b>__updateOkButton</b>(<i></i>)
+
+<p>
+        Private method to set the enabled state of the OK button.
+</p>
+<a NAME="HelpBookmarkPropertiesDialog.getData" ID="HelpBookmarkPropertiesDialog.getData"></a>
+<h4>HelpBookmarkPropertiesDialog.getData</h4>
+<b>getData</b>(<i></i>)
+
+<p>
+        Public method to retrieve the entered data.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the title and URL for the bookmark
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (str, str)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpBookmarksImportDialog.html	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric7.HelpViewer.HelpBookmarksImportDialog</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric7.HelpViewer.HelpBookmarksImportDialog</h1>
+
+<p>
+Module implementing a dialog to enter the bookmarks import parameters.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarksImportDialog">HelpBookmarksImportDialog</a></td>
+<td>Class implementing a dialog to enter the bookmarks import parameters.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="HelpBookmarksImportDialog" ID="HelpBookmarksImportDialog"></a>
+<h2>HelpBookmarksImportDialog</h2>
+
+<p>
+    Class implementing a dialog to enter the bookmarks import parameters.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_HelpBookmarksImportDialog
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarksImportDialog.__init__">HelpBookmarksImportDialog</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksImportDialog.__updateOkButton">__updateOkButton</a></td>
+<td>Private method to update the state of the OK button.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksImportDialog.getData">getData</a></td>
+<td>Public method to retrieve the entered data.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="HelpBookmarksImportDialog.__init__" ID="HelpBookmarksImportDialog.__init__"></a>
+<h4>HelpBookmarksImportDialog (Constructor)</h4>
+<b>HelpBookmarksImportDialog</b>(<i>parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="HelpBookmarksImportDialog.__updateOkButton" ID="HelpBookmarksImportDialog.__updateOkButton"></a>
+<h4>HelpBookmarksImportDialog.__updateOkButton</h4>
+<b>__updateOkButton</b>(<i></i>)
+
+<p>
+        Private method to update the state of the OK button.
+</p>
+<a NAME="HelpBookmarksImportDialog.getData" ID="HelpBookmarksImportDialog.getData"></a>
+<h4>HelpBookmarksImportDialog.getData</h4>
+<b>getData</b>(<i></i>)
+
+<p>
+        Public method to retrieve the entered data.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating to replace the existing
+            bookmarks and the path of the bookmarks file to be imported
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpBookmarksWidget.html	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,369 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric7.HelpViewer.HelpBookmarksWidget</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric7.HelpViewer.HelpBookmarksWidget</h1>
+
+<p>
+Module implementing a widget showing the list of bookmarks.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarksWidget">HelpBookmarksWidget</a></td>
+<td>Class implementing a widget showing the list of bookmarks.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="HelpBookmarksWidget" ID="HelpBookmarksWidget"></a>
+<h2>HelpBookmarksWidget</h2>
+
+<p>
+    Class implementing a widget showing the list of bookmarks.
+</p>
+<h3>Signals</h3>
+<dl>
+
+<dt>escapePressed()</dt>
+<dd>
+emitted when the ESC key was pressed
+</dd>
+<dt>newBackgroundTab(QUrl, str)</dt>
+<dd>
+emitted to open an entry in a
+        new background tab
+</dd>
+<dt>newTab(QUrl, str)</dt>
+<dd>
+emitted to open an entry in a new tab
+</dd>
+<dt>openUrl(QUrl, str)</dt>
+<dd>
+emitted to open an entry in the current tab
+</dd>
+</dl>
+<h3>Derived from</h3>
+QListWidget
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>UrlRole</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#HelpBookmarksWidget.__init__">HelpBookmarksWidget</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__addBookmark">__addBookmark</a></td>
+<td>Private slot to add a bookmark entry.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__bookmarkActivated">__bookmarkActivated</a></td>
+<td>Private slot handling the activation of a bookmark.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__bookmarkCurrentPage">__bookmarkCurrentPage</a></td>
+<td>Private slot to bookmark the current page.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__deleteBookmarks">__deleteBookmarks</a></td>
+<td>Private method to delete the given bookmark items.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__editBookmark">__editBookmark</a></td>
+<td>Private slot to edit a bookmark.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__exportBookmarks">__exportBookmarks</a></td>
+<td>Private slot to export the bookmarks into a JSON file.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__importBookmarks">__importBookmarks</a></td>
+<td>Private slot to import bookmarks from a JSON file.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__loadBookmarks">__loadBookmarks</a></td>
+<td>Private method to load the defined bookmarks.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__newBookmark">__newBookmark</a></td>
+<td>Private slot to create a new bookmark.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__openBookmarks">__openBookmarks</a></td>
+<td>Private method to open all or selected bookmarks.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__saveBookmarks">__saveBookmarks</a></td>
+<td>Private method to save the defined bookmarks.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__showBackgroundMenu">__showBackgroundMenu</a></td>
+<td>Private slot to show the background menu (i.e.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__showBookmarkContextMenu">__showBookmarkContextMenu</a></td>
+<td>Private slot to show the context menu for a bookmark.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__showBookmarksContextMenu">__showBookmarksContextMenu</a></td>
+<td>Private slot to show the context menu for multiple bookmark.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.__showContextMenu">__showContextMenu</a></td>
+<td>Private slot to handle the customContextMenuRequested signal of the viewlist.</td>
+</tr>
+<tr>
+<td><a href="#HelpBookmarksWidget.addBookmark">addBookmark</a></td>
+<td>Public slot to add a bookmark with given data.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="HelpBookmarksWidget.__init__" ID="HelpBookmarksWidget.__init__"></a>
+<h4>HelpBookmarksWidget (Constructor)</h4>
+<b>HelpBookmarksWidget</b>(<i>parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__addBookmark" ID="HelpBookmarksWidget.__addBookmark"></a>
+<h4>HelpBookmarksWidget.__addBookmark</h4>
+<b>__addBookmark</b>(<i>title, url</i>)
+
+<p>
+        Private slot to add a bookmark entry.
+</p>
+<dl>
+
+<dt><i>title</i> (str)</dt>
+<dd>
+title for the bookmark
+</dd>
+<dt><i>url</i> (str)</dt>
+<dd>
+URL for the bookmark
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__bookmarkActivated" ID="HelpBookmarksWidget.__bookmarkActivated"></a>
+<h4>HelpBookmarksWidget.__bookmarkActivated</h4>
+<b>__bookmarkActivated</b>(<i>itm</i>)
+
+<p>
+        Private slot handling the activation of a bookmark.
+</p>
+<dl>
+
+<dt><i>itm</i> (QListWidgetItem)</dt>
+<dd>
+reference to the activated item
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__bookmarkCurrentPage" ID="HelpBookmarksWidget.__bookmarkCurrentPage"></a>
+<h4>HelpBookmarksWidget.__bookmarkCurrentPage</h4>
+<b>__bookmarkCurrentPage</b>(<i></i>)
+
+<p>
+        Private slot to bookmark the current page.
+</p>
+<a NAME="HelpBookmarksWidget.__deleteBookmarks" ID="HelpBookmarksWidget.__deleteBookmarks"></a>
+<h4>HelpBookmarksWidget.__deleteBookmarks</h4>
+<b>__deleteBookmarks</b>(<i>items</i>)
+
+<p>
+        Private method to delete the given bookmark items.
+</p>
+<dl>
+
+<dt><i>items</i> (list of QListWidgetItem)</dt>
+<dd>
+list of bookmarks to be deleted
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__editBookmark" ID="HelpBookmarksWidget.__editBookmark"></a>
+<h4>HelpBookmarksWidget.__editBookmark</h4>
+<b>__editBookmark</b>(<i>itm</i>)
+
+<p>
+        Private slot to edit a bookmark.
+</p>
+<dl>
+
+<dt><i>itm</i> (QListWidgetItem)</dt>
+<dd>
+reference to the bookmark item to be edited
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__exportBookmarks" ID="HelpBookmarksWidget.__exportBookmarks"></a>
+<h4>HelpBookmarksWidget.__exportBookmarks</h4>
+<b>__exportBookmarks</b>(<i>selected=False</i>)
+
+<p>
+        Private slot to export the bookmarks into a JSON file.
+</p>
+<dl>
+
+<dt><i>selected</i> (bool (optional))</dt>
+<dd>
+flag indicating to export the selected bookmarks
+            (defaults to False)
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__importBookmarks" ID="HelpBookmarksWidget.__importBookmarks"></a>
+<h4>HelpBookmarksWidget.__importBookmarks</h4>
+<b>__importBookmarks</b>(<i></i>)
+
+<p>
+        Private slot to import bookmarks from a JSON file.
+</p>
+<a NAME="HelpBookmarksWidget.__loadBookmarks" ID="HelpBookmarksWidget.__loadBookmarks"></a>
+<h4>HelpBookmarksWidget.__loadBookmarks</h4>
+<b>__loadBookmarks</b>(<i></i>)
+
+<p>
+        Private method to load the defined bookmarks.
+</p>
+<a NAME="HelpBookmarksWidget.__newBookmark" ID="HelpBookmarksWidget.__newBookmark"></a>
+<h4>HelpBookmarksWidget.__newBookmark</h4>
+<b>__newBookmark</b>(<i></i>)
+
+<p>
+        Private slot to create a new bookmark.
+</p>
+<a NAME="HelpBookmarksWidget.__openBookmarks" ID="HelpBookmarksWidget.__openBookmarks"></a>
+<h4>HelpBookmarksWidget.__openBookmarks</h4>
+<b>__openBookmarks</b>(<i>selected=False</i>)
+
+<p>
+        Private method to open all or selected bookmarks.
+</p>
+<dl>
+
+<dt><i>selected</i> (bool (optional))</dt>
+<dd>
+flag indicating to open the selected bookmarks
+            (defaults to False)
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__saveBookmarks" ID="HelpBookmarksWidget.__saveBookmarks"></a>
+<h4>HelpBookmarksWidget.__saveBookmarks</h4>
+<b>__saveBookmarks</b>(<i></i>)
+
+<p>
+        Private method to save the defined bookmarks.
+</p>
+<a NAME="HelpBookmarksWidget.__showBackgroundMenu" ID="HelpBookmarksWidget.__showBackgroundMenu"></a>
+<h4>HelpBookmarksWidget.__showBackgroundMenu</h4>
+<b>__showBackgroundMenu</b>(<i>point</i>)
+
+<p>
+        Private slot to show the background menu (i.e. no selection).
+</p>
+<dl>
+
+<dt><i>point</i> (QPoint)</dt>
+<dd>
+position to open the menu at
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__showBookmarkContextMenu" ID="HelpBookmarksWidget.__showBookmarkContextMenu"></a>
+<h4>HelpBookmarksWidget.__showBookmarkContextMenu</h4>
+<b>__showBookmarkContextMenu</b>(<i>point</i>)
+
+<p>
+        Private slot to show the context menu for a bookmark.
+</p>
+<dl>
+
+<dt><i>point</i> (QPoint)</dt>
+<dd>
+position to open the menu at
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__showBookmarksContextMenu" ID="HelpBookmarksWidget.__showBookmarksContextMenu"></a>
+<h4>HelpBookmarksWidget.__showBookmarksContextMenu</h4>
+<b>__showBookmarksContextMenu</b>(<i>point</i>)
+
+<p>
+        Private slot to show the context menu for multiple bookmark.
+</p>
+<dl>
+
+<dt><i>point</i> (QPoint)</dt>
+<dd>
+position to open the menu at
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.__showContextMenu" ID="HelpBookmarksWidget.__showContextMenu"></a>
+<h4>HelpBookmarksWidget.__showContextMenu</h4>
+<b>__showContextMenu</b>(<i>point</i>)
+
+<p>
+        Private slot to handle the customContextMenuRequested signal of
+        the viewlist.
+</p>
+<dl>
+
+<dt><i>point</i> (QPoint)</dt>
+<dd>
+position to open the menu at
+</dd>
+</dl>
+<a NAME="HelpBookmarksWidget.addBookmark" ID="HelpBookmarksWidget.addBookmark"></a>
+<h4>HelpBookmarksWidget.addBookmark</h4>
+<b>addBookmark</b>(<i>title, url</i>)
+
+<p>
+        Public slot to add a bookmark with given data.
+</p>
+<dl>
+
+<dt><i>title</i> (str)</dt>
+<dd>
+title for the bookmark
+</dd>
+<dt><i>url</i> (QUrl)</dt>
+<dd>
+URL for the bookmark
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerImplQTB.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerImplQTB.html	Tue Feb 08 14:15:48 2022 +0100
@@ -59,6 +59,10 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#HelpViewerImplQTB.__bookmarkPage">__bookmarkPage</a></td>
+<td>Private method called by the context menu to bookmark the page.</td>
+</tr>
+<tr>
 <td><a href="#HelpViewerImplQTB.__canLoadResource">__canLoadResource</a></td>
 <td>Private method to check, if the given resource can be loaded.</td>
 </tr>
@@ -203,6 +207,20 @@
 reference to the parent widget
 </dd>
 </dl>
+<a NAME="HelpViewerImplQTB.__bookmarkPage" ID="HelpViewerImplQTB.__bookmarkPage"></a>
+<h4>HelpViewerImplQTB.__bookmarkPage</h4>
+<b>__bookmarkPage</b>(<i>act</i>)
+
+<p>
+        Private method called by the context menu to bookmark the page.
+</p>
+<dl>
+
+<dt><i>act</i> (QAction)</dt>
+<dd>
+reference to the action that triggered
+</dd>
+</dl>
 <a NAME="HelpViewerImplQTB.__canLoadResource" ID="HelpViewerImplQTB.__canLoadResource"></a>
 <h4>HelpViewerImplQTB.__canLoadResource</h4>
 <b>__canLoadResource</b>(<i>url</i>)
--- a/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerImplQWE.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerImplQWE.html	Tue Feb 08 14:15:48 2022 +0100
@@ -59,6 +59,10 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#HelpViewerImplQWE.__bookmarkPage">__bookmarkPage</a></td>
+<td>Private method called by the context menu to bookmark the page.</td>
+</tr>
+<tr>
 <td><a href="#HelpViewerImplQWE.__closeOtherPages">__closeOtherPages</a></td>
 <td>Private method called by the context menu to close all other pages.</td>
 </tr>
@@ -255,6 +259,20 @@
 reference to the parent widget
 </dd>
 </dl>
+<a NAME="HelpViewerImplQWE.__bookmarkPage" ID="HelpViewerImplQWE.__bookmarkPage"></a>
+<h4>HelpViewerImplQWE.__bookmarkPage</h4>
+<b>__bookmarkPage</b>(<i>act</i>)
+
+<p>
+        Private method called by the context menu to bookmark the page.
+</p>
+<dl>
+
+<dt><i>act</i> (QAction)</dt>
+<dd>
+reference to the action that triggered
+</dd>
+</dl>
 <a NAME="HelpViewerImplQWE.__closeOtherPages" ID="HelpViewerImplQWE.__closeOtherPages"></a>
 <h4>HelpViewerImplQWE.__closeOtherPages</h4>
 <b>__closeOtherPages</b>(<i></i>)
--- a/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerWidget.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.HelpViewer.HelpViewerWidget.html	Tue Feb 08 14:15:48 2022 +0100
@@ -231,6 +231,10 @@
 <td>Public method to add a new help page with the given URL.</td>
 </tr>
 <tr>
+<td><a href="#HelpViewerWidget.bookmarkPage">bookmarkPage</a></td>
+<td>Public method to bookmark a page with the given data.</td>
+</tr>
+<tr>
 <td><a href="#HelpViewerWidget.closeAllPages">closeAllPages</a></td>
 <td>Public slot to close all pages.</td>
 </tr>
@@ -770,6 +774,24 @@
 HelpViewerImpl
 </dd>
 </dl>
+<a NAME="HelpViewerWidget.bookmarkPage" ID="HelpViewerWidget.bookmarkPage"></a>
+<h4>HelpViewerWidget.bookmarkPage</h4>
+<b>bookmarkPage</b>(<i>title, url</i>)
+
+<p>
+        Public method to bookmark a page with the given data.
+</p>
+<dl>
+
+<dt><i>title</i> (str)</dt>
+<dd>
+title of the page
+</dd>
+<dt><i>url</i> (QUrl)</dt>
+<dd>
+URL of the page
+</dd>
+</dl>
 <a NAME="HelpViewerWidget.closeAllPages" ID="HelpViewerWidget.closeAllPages"></a>
 <h4>HelpViewerWidget.closeAllPages</h4>
 <b>closeAllPages</b>(<i></i>)
--- a/eric7/Documentation/Source/eric7.HelpViewer.OpenPagesWidget.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.HelpViewer.OpenPagesWidget.html	Tue Feb 08 14:15:48 2022 +0100
@@ -41,14 +41,14 @@
 <h3>Signals</h3>
 <dl>
 
-<dt>currentChanged(index)</dt>
+<dt>currentPageChanged(index)</dt>
 <dd>
 emitted to signal a change of the current
         page index
 </dd>
 </dl>
 <h3>Derived from</h3>
-QWidget
+QListWidget
 <h3>Class Attributes</h3>
 
 <table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Documentation/Source/eric7.MicroPython.BoardDataDialog.html	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric7.MicroPython.BoardDataDialog</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric7.MicroPython.BoardDataDialog</h1>
+
+<p>
+Module implementing a dialog to show information about a connected board.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#BoardDataDialog">BoardDataDialog</a></td>
+<td>Class implementing a dialog to show information about a connected board.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="BoardDataDialog" ID="BoardDataDialog"></a>
+<h2>BoardDataDialog</h2>
+
+<p>
+    Class implementing a dialog to show information about a connected board.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_BoardDataDialog
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#BoardDataDialog.__init__">BoardDataDialog</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#BoardDataDialog.__createHeader">__createHeader</a></td>
+<td>Private method to create a header item.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="BoardDataDialog.__init__" ID="BoardDataDialog.__init__"></a>
+<h4>BoardDataDialog (Constructor)</h4>
+<b>BoardDataDialog</b>(<i>data, parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>data</i> (dict)</dt>
+<dd>
+dictionary containing the data to be shown
+</dd>
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="BoardDataDialog.__createHeader" ID="BoardDataDialog.__createHeader"></a>
+<h4>BoardDataDialog.__createHeader</h4>
+<b>__createHeader</b>(<i>headerText</i>)
+
+<p>
+        Private method to create a header item.
+</p>
+<dl>
+
+<dt><i>headerText</i> (str)</dt>
+<dd>
+text for the header item
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+reference to the created header item
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+QTreeWidgetItem
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric7/Documentation/Source/eric7.MicroPython.EspBackupRestoreFirmwareDialog.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.MicroPython.EspBackupRestoreFirmwareDialog.html	Tue Feb 08 14:15:48 2022 +0100
@@ -45,7 +45,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>FlashModes</td></tr><tr><td>FlashSizes</td></tr>
+<tr><td>Chips</td></tr><tr><td>FlashModes</td></tr><tr><td>FlashSizes</td></tr>
 </table>
 <h3>Class Methods</h3>
 
--- a/eric7/Documentation/Source/eric7.MicroPython.EspDevices.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.MicroPython.EspDevices.html	Tue Feb 08 14:15:48 2022 +0100
@@ -204,13 +204,6 @@
 <p>
         Private slot to flash a MicroPython firmware to the device.
 </p>
-<dl>
-
-<dt>Raises <b>ValueError</b>:</dt>
-<dd>
-raised to indicate an unsupported chip type
-</dd>
-</dl>
 <a NAME="EspDevice.__installEspTool" ID="EspDevice.__installEspTool"></a>
 <h4>EspDevice.__installEspTool</h4>
 <b>__installEspTool</b>(<i></i>)
--- a/eric7/Documentation/Source/eric7.MicroPython.EspFirmwareSelectionDialog.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.MicroPython.EspFirmwareSelectionDialog.html	Tue Feb 08 14:15:48 2022 +0100
@@ -45,7 +45,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>FlashModes</td></tr>
+<tr><td>Chips</td></tr><tr><td>FlashAddresses</td></tr><tr><td>FlashModes</td></tr>
 </table>
 <h3>Class Methods</h3>
 
--- a/eric7/Documentation/Source/eric7.MicroPython.MicroPythonCommandsInterface.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.MicroPython.MicroPythonCommandsInterface.html	Tue Feb 08 14:15:48 2022 +0100
@@ -142,6 +142,10 @@
 <td>Public method to copy a file from the connected device.</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonCommandsInterface.getBoardInformation">getBoardInformation</a></td>
+<td>Public method to get some information data of the connected board.</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonCommandsInterface.getImplementation">getImplementation</a></td>
 <td>Public method to get some implementation information of the connected device.</td>
 </tr>
@@ -448,6 +452,32 @@
 raised to indicate an issue with the device
 </dd>
 </dl>
+<a NAME="MicroPythonCommandsInterface.getBoardInformation" ID="MicroPythonCommandsInterface.getBoardInformation"></a>
+<h4>MicroPythonCommandsInterface.getBoardInformation</h4>
+<b>getBoardInformation</b>(<i></i>)
+
+<p>
+        Public method to get some information data of the connected board.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+dictionary containing the determined data
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>OSError</b>:</dt>
+<dd>
+raised to indicate an issue with the device
+</dd>
+</dl>
 <a NAME="MicroPythonCommandsInterface.getImplementation" ID="MicroPythonCommandsInterface.getImplementation"></a>
 <h4>MicroPythonCommandsInterface.getImplementation</h4>
 <b>getImplementation</b>(<i></i>)
--- a/eric7/Documentation/Source/eric7.MicroPython.MicroPythonWidget.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.MicroPython.MicroPythonWidget.html	Tue Feb 08 14:15:48 2022 +0100
@@ -164,6 +164,10 @@
 <td>Private method to set the connection status LED.</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonWidget.__showBoardInformation">__showBoardInformation</a></td>
+<td>Private slot to show all available information about a board.</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonWidget.__showContextMenu">__showContextMenu</a></td>
 <td>Private slot to show the REPL context menu.</td>
 </tr>
@@ -621,6 +625,13 @@
 connection state
 </dd>
 </dl>
+<a NAME="MicroPythonWidget.__showBoardInformation" ID="MicroPythonWidget.__showBoardInformation"></a>
+<h4>MicroPythonWidget.__showBoardInformation</h4>
+<b>__showBoardInformation</b>(<i></i>)
+
+<p>
+        Private slot to show all available information about a board.
+</p>
 <a NAME="MicroPythonWidget.__showContextMenu" ID="MicroPythonWidget.__showContextMenu"></a>
 <h4>MicroPythonWidget.__showContextMenu</h4>
 <b>__showContextMenu</b>(<i>pos</i>)
--- a/eric7/Documentation/Source/eric7.Project.ProjectOthersBrowser.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.Project.ProjectOthersBrowser.html	Tue Feb 08 14:15:48 2022 +0100
@@ -110,6 +110,10 @@
 <td>Protected slot to handle the open in icon editor popup menu entry.</td>
 </tr>
 <tr>
+<td><a href="#ProjectOthersBrowser._openFileInEditor">_openFileInEditor</a></td>
+<td>Protected slot to handle the Open in Editor menu action.</td>
+</tr>
+<tr>
 <td><a href="#ProjectOthersBrowser._openHexEditor">_openHexEditor</a></td>
 <td>Protected slot to handle the open in hex editor popup menu entry.</td>
 </tr>
@@ -225,6 +229,13 @@
 <p>
         Protected slot to handle the open in icon editor popup menu entry.
 </p>
+<a NAME="ProjectOthersBrowser._openFileInEditor" ID="ProjectOthersBrowser._openFileInEditor"></a>
+<h4>ProjectOthersBrowser._openFileInEditor</h4>
+<b>_openFileInEditor</b>(<i></i>)
+
+<p>
+        Protected slot to handle the Open in Editor menu action.
+</p>
 <a NAME="ProjectOthersBrowser._openHexEditor" ID="ProjectOthersBrowser._openHexEditor"></a>
 <h4>ProjectOthersBrowser._openHexEditor</h4>
 <b>_openHexEditor</b>(<i></i>)
--- a/eric7/Documentation/Source/eric7.UI.Browser.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/eric7.UI.Browser.html	Tue Feb 08 14:15:48 2022 +0100
@@ -225,6 +225,10 @@
 <td>Protected slot to create a new file.</td>
 </tr>
 <tr>
+<td><a href="#Browser._openFileInEditor">_openFileInEditor</a></td>
+<td>Protected slot to handle the Open in Editor menu action.</td>
+</tr>
+<tr>
 <td><a href="#Browser._openHexEditor">_openHexEditor</a></td>
 <td>Protected slot to handle the open in hex editor popup menu entry.</td>
 </tr>
@@ -516,6 +520,13 @@
 <p>
         Protected slot to create a new file.
 </p>
+<a NAME="Browser._openFileInEditor" ID="Browser._openFileInEditor"></a>
+<h4>Browser._openFileInEditor</h4>
+<b>_openFileInEditor</b>(<i></i>)
+
+<p>
+        Protected slot to handle the Open in Editor menu action.
+</p>
 <a NAME="Browser._openHexEditor" ID="Browser._openHexEditor"></a>
 <h4>Browser._openHexEditor</h4>
 <b>_openHexEditor</b>(<i></i>)
--- a/eric7/Documentation/Source/index-eric7.HelpViewer.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/index-eric7.HelpViewer.html	Tue Feb 08 14:15:48 2022 +0100
@@ -16,6 +16,18 @@
 <table>
 
 <tr>
+<td><a href="eric7.HelpViewer.HelpBookmarkPropertiesDialog.html">HelpBookmarkPropertiesDialog</a></td>
+<td>Module implementing a dialog to edit the bookmark properties.</td>
+</tr>
+<tr>
+<td><a href="eric7.HelpViewer.HelpBookmarksImportDialog.html">HelpBookmarksImportDialog</a></td>
+<td>Module implementing a dialog to enter the bookmarks import parameters.</td>
+</tr>
+<tr>
+<td><a href="eric7.HelpViewer.HelpBookmarksWidget.html">HelpBookmarksWidget</a></td>
+<td>Module implementing a widget showing the list of bookmarks.</td>
+</tr>
+<tr>
 <td><a href="eric7.HelpViewer.HelpViewerImpl.html">HelpViewerImpl</a></td>
 <td>Module implementing the help viewer base class.</td>
 </tr>
--- a/eric7/Documentation/Source/index-eric7.MicroPython.html	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Documentation/Source/index-eric7.MicroPython.html	Tue Feb 08 14:15:48 2022 +0100
@@ -20,6 +20,10 @@
 <td>Module implementing a dialog to add or edit data of unknown MicroPython devices.</td>
 </tr>
 <tr>
+<td><a href="eric7.MicroPython.BoardDataDialog.html">BoardDataDialog</a></td>
+<td>Module implementing a dialog to show information about a connected board.</td>
+</tr>
+<tr>
 <td><a href="eric7.MicroPython.CircuitPythonDevices.html">CircuitPythonDevices</a></td>
 <td>Module implementing the device interface class for CircuitPython boards.</td>
 </tr>
--- a/eric7/EricNetwork/EricJsonServer.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/EricNetwork/EricJsonServer.py	Tue Feb 08 14:15:48 2022 +0100
@@ -12,7 +12,7 @@
 
 from PyQt6.QtCore import (
     pyqtSlot, QProcess, QProcessEnvironment, QCoreApplication, QEventLoop,
-    QTimer
+    QTimer, QThread
 )
 from PyQt6.QtNetwork import QTcpServer, QHostAddress
 
@@ -255,6 +255,7 @@
                     # connection of the client (= slow start).
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                    QThread.msleep(100)
                     
                     # check if client exited prematurely
                     if proc.state() == QProcess.ProcessState.NotRunning:
@@ -262,6 +263,8 @@
                         proc = None
                         self.__clientProcesses[idString] = None
                         break
+                    
+                    QThread.msleep(500)
         else:
             if proc:
                 timer = QTimer()
--- a/eric7/EricWidgets/EricApplication.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/EricWidgets/EricApplication.py	Tue Feb 08 14:15:48 2022 +0100
@@ -220,7 +220,7 @@
                     styleSheet = f.read()
             except OSError as msg:
                 EricMessageBox.warning(
-                    self,
+                    None,
                     QCoreApplication.translate(
                         "EricApplication", "Loading Style Sheet"),
                     QCoreApplication.translate(
--- a/eric7/EricWidgets/EricSpellCheckedTextEdit.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/EricWidgets/EricSpellCheckedTextEdit.py	Tue Feb 08 14:15:48 2022 +0100
@@ -55,13 +55,19 @@
                     SpellCheckMixin.DefaultUserExceptionList
                 )
             except DictNotFoundError:
-                # Use English dictionary if no locale dictionary is available
-                # or the default one could not be found.
-                spellDict = enchant.DictWithPWL(
-                    "en",
-                    SpellCheckMixin.DefaultUserWordList,
-                    SpellCheckMixin.DefaultUserExceptionList
-                )
+                try:
+                    # Use English dictionary if no locale dictionary is
+                    # available or the default one could not be found.
+                    spellDict = enchant.DictWithPWL(
+                        "en",
+                        SpellCheckMixin.DefaultUserWordList,
+                        SpellCheckMixin.DefaultUserExceptionList
+                    )
+                except DictNotFoundError:
+                    # Still no dictionary could be found. Forget about spell
+                    # checking.
+                    spellDict = None
+            
             self.__highlighter.setDict(spellDict)
         
         def contextMenuEvent(self, evt):
@@ -452,6 +458,7 @@
             QSyntaxHighlighter.__init__(self, *args)
             
             self.__spellDict = None
+            self.__tokenizer = None
             self.__chunkers = []
         
         def chunkers(self):
@@ -489,17 +496,21 @@
             @param spellDict spelling dictionary
             @type enchant.Dict
             """
-            try:
-                self.__tokenizer = enchant.tokenize.get_tokenizer(
-                    spellDict.tag,
-                    chunkers=self.__chunkers,
-                    filters=EnchantHighlighter.TokenFilters)
-            except TokenizerNotFoundError:
-                # Fall back to the "good for most euro languages"
-                # English tokenizer
-                self.__tokenizer = enchant.tokenize.get_tokenizer(
-                    chunkers=self.__chunkers,
-                    filters=EnchantHighlighter.TokenFilters)
+            if spellDict:
+                try:
+                    self.__tokenizer = enchant.tokenize.get_tokenizer(
+                        spellDict.tag,
+                        chunkers=self.__chunkers,
+                        filters=EnchantHighlighter.TokenFilters)
+                except TokenizerNotFoundError:
+                    # Fall back to the "good for most euro languages"
+                    # English tokenizer
+                    self.__tokenizer = enchant.tokenize.get_tokenizer(
+                        chunkers=self.__chunkers,
+                        filters=EnchantHighlighter.TokenFilters)
+            else:
+                self.__tokenizer = None
+            
             self.__spellDict = spellDict
             
             self.rehighlight()
@@ -512,7 +523,7 @@
             @type str
             """
             """Overridden QSyntaxHighlighter method to apply the highlight"""
-            if not self.__spellDict:
+            if self.__spellDict is None or self.__tokenizer is None:
                 return
             
             # Build a list of all misspelled words and highlight them
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/HelpViewer/HelpBookmarkPropertiesDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to edit the bookmark properties.
+"""
+
+from PyQt6.QtCore import pyqtSlot
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox
+
+from .Ui_HelpBookmarkPropertiesDialog import Ui_HelpBookmarkPropertiesDialog
+
+
+class HelpBookmarkPropertiesDialog(QDialog, Ui_HelpBookmarkPropertiesDialog):
+    """
+    Class implementing a dialog to edit the bookmark properties.
+    """
+    def __init__(self, title="", url="", parent=None):
+        """
+        Constructor
+        
+        @param title title for the bookmark (defaults to "")
+        @type str (optional)
+        @param url URL for the bookmark (defaults to "")
+        @type str (optional)
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.titleEdit.textChanged.connect(self.__updateOkButton)
+        self.urlEdit.textChanged.connect(self.__updateOkButton)
+        
+        self.titleEdit.setText(title)
+        self.urlEdit.setText(url)
+        
+        msh = self.minimumSizeHint()
+        self.resize(max(self.width(), msh.width()), msh.height())
+    
+    @pyqtSlot()
+    def __updateOkButton(self):
+        """
+        Private method to set the enabled state of the OK button.
+        """
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(self.titleEdit.text().strip()) and
+            bool(self.urlEdit.text().strip())
+        )
+    
+    def getData(self):
+        """
+        Public method to retrieve the entered data.
+        
+        @return tuple containing the title and URL for the bookmark
+        @rtype tuple of (str, str)
+        """
+        return (
+            self.titleEdit.text().strip(),
+            self.urlEdit.text().strip(),
+        )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/HelpViewer/HelpBookmarkPropertiesDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HelpBookmarkPropertiesDialog</class>
+ <widget class="QDialog" name="HelpBookmarkPropertiesDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>108</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Bookmark</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Title:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QLineEdit" name="titleEdit">
+     <property name="toolTip">
+      <string>Enter the title for the bookmark</string>
+     </property>
+     <property name="placeholderText">
+      <string>Enter Bookmark Title</string>
+     </property>
+     <property name="clearButtonEnabled">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>URL:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QLineEdit" name="urlEdit">
+     <property name="toolTip">
+      <string>Enter the URL for the bookmark</string>
+     </property>
+     <property name="placeholderText">
+      <string>Enter Bookmark URL</string>
+     </property>
+     <property name="clearButtonEnabled">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>HelpBookmarkPropertiesDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>HelpBookmarkPropertiesDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/HelpViewer/HelpBookmarksImportDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to enter the bookmarks import parameters.
+"""
+
+from PyQt6.QtCore import pyqtSlot
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox
+
+from EricWidgets.EricPathPicker import EricPathPickerModes
+
+from .Ui_HelpBookmarksImportDialog import Ui_HelpBookmarksImportDialog
+
+
+class HelpBookmarksImportDialog(QDialog, Ui_HelpBookmarksImportDialog):
+    """
+    Class implementing a dialog to enter the bookmarks import parameters.
+    """
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.bookmarksPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
+        self.bookmarksPicker.setFilters(
+            self.tr("eric Bookmarks Files (*.json);;All Files (*)"))
+        self.bookmarksPicker.textChanged.connect(self.__updateOkButton)
+        
+        msh = self.minimumSizeHint()
+        self.resize(max(self.width(), msh.width()), msh.height())
+        
+        self.__updateOkButton()
+    
+    @pyqtSlot()
+    def __updateOkButton(self):
+        """
+        Private method to update the state of the OK button.
+        """
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(self.bookmarksPicker.text()))
+    
+    def getData(self):
+        """
+        Public method to retrieve the entered data.
+        
+        @return tuple containing a flag indicating to replace the existing
+            bookmarks and the path of the bookmarks file to be imported
+        @rtype tuple of (bool, str)
+        """
+        return (
+            self.replaceCheckBox.isChecked(),
+            self.bookmarksPicker.path(),
+        )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/HelpViewer/HelpBookmarksImportDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HelpBookmarksImportDialog</class>
+ <widget class="QDialog" name="HelpBookmarksImportDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>98</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Import Bookmarks</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0" colspan="2">
+    <widget class="QCheckBox" name="replaceCheckBox">
+     <property name="toolTip">
+      <string>Select to replace the existing bookmarks</string>
+     </property>
+     <property name="text">
+      <string>Replace Existing Bookmarks</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Bookmarks:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="EricPathPicker" name="bookmarksPicker" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="focusPolicy">
+      <enum>Qt::WheelFocus</enum>
+     </property>
+     <property name="toolTip">
+      <string>Enter the path of the bookmarks file</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>EricPathPicker</class>
+   <extends>QWidget</extends>
+   <header>EricWidgets/EricPathPicker.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>HelpBookmarksImportDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>HelpBookmarksImportDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/HelpViewer/HelpBookmarksWidget.py	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,534 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a widget showing the list of bookmarks.
+"""
+
+import contextlib
+import datetime
+import json
+import os
+
+from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QUrl
+from PyQt6.QtGui import QClipboard, QGuiApplication
+from PyQt6.QtWidgets import (
+    QAbstractItemView, QApplication, QDialog, QListWidget, QListWidgetItem,
+    QMenu
+)
+
+from EricWidgets import EricFileDialog, EricMessageBox
+
+import Preferences
+
+from .HelpBookmarkPropertiesDialog import HelpBookmarkPropertiesDialog
+
+
+class HelpBookmarksWidget(QListWidget):
+    """
+    Class implementing a widget showing the list of bookmarks.
+    
+    @signal escapePressed() emitted when the ESC key was pressed
+    @signal openUrl(QUrl, str) emitted to open an entry in the current tab
+    @signal newTab(QUrl, str) emitted to open an entry in a new tab
+    @signal newBackgroundTab(QUrl, str) emitted to open an entry in a
+        new background tab
+    """
+    escapePressed = pyqtSignal()
+    openUrl = pyqtSignal(QUrl)
+    newTab = pyqtSignal(QUrl)
+    newBackgroundTab = pyqtSignal(QUrl)
+    
+    UrlRole = Qt.ItemDataRole.UserRole + 1
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setObjectName("HelpBookmarksWidget")
+        
+        self.__helpViewer = parent
+        
+        self.setAlternatingRowColors(True)
+        self.setSelectionMode(
+            QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.setSortingEnabled(True)
+        
+        self.setContextMenuPolicy(
+            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.customContextMenuRequested.connect(
+            self.__showContextMenu)
+        
+        self.__bookmarks = []
+        self.__loadBookmarks()
+        
+        self.itemDoubleClicked.connect(self.__bookmarkActivated)
+    
+    @pyqtSlot(QPoint)
+    def __showContextMenu(self, point):
+        """
+        Private slot to handle the customContextMenuRequested signal of
+        the viewlist.
+        
+        @param point position to open the menu at
+        @type QPoint
+        """
+        selectedItemsCount = len(self.selectedItems())
+        if selectedItemsCount == 0:
+            # background menu
+            self.__showBackgroundMenu(point)
+        elif selectedItemsCount == 1:
+            # single bookmark menu
+            self.__showBookmarkContextMenu(point)
+        else:
+            # multiple selected bookmarks
+            self.__showBookmarksContextMenu(point)
+    
+    @pyqtSlot(QPoint)
+    def __showBackgroundMenu(self, point):
+        """
+        Private slot to show the background menu (i.e. no selection).
+        
+        @param point position to open the menu at
+        @type QPoint
+        """
+        menu = QMenu()
+        openBookmarks = menu.addAction(self.tr("Open All Bookmarks"))
+        menu.addSeparator()
+        newBookmark = menu.addAction(self.tr("New Bookmark"))
+        addBookmark = menu.addAction(self.tr("Bookmark Page"))
+        menu.addSeparator()
+        deleteBookmarks = menu.addAction(self.tr("Delete All Bookmarks"))
+        menu.addSeparator()
+        exportBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
+        importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
+        
+        act = menu.exec(self.mapToGlobal(point))
+        if act == openBookmarks:
+            self.__openBookmarks(selected=False)
+        elif act == newBookmark:
+            self.__newBookmark()
+        elif act == addBookmark:
+            self.__bookmarkCurrentPage()
+        elif act == deleteBookmarks:
+            self.__deleteBookmarks([
+                self.item(row) for row in range(self.count())
+            ])
+        elif act == exportBookmarks:
+            self.__exportBookmarks(selected=False)
+        elif act == importBookmarks:
+            self.__importBookmarks()
+    
+    @pyqtSlot(QPoint)
+    def __showBookmarkContextMenu(self, point):
+        """
+        Private slot to show the context menu for a bookmark.
+        
+        @param point position to open the menu at
+        @type QPoint
+        """
+        itm = self.selectedItems()[0]
+        url = itm.data(self.UrlRole)
+        validUrl = (
+            url is not None and not url.isEmpty() and url.isValid()
+        )
+        
+        menu = QMenu()
+        curPage = menu.addAction(self.tr("Open Link"))
+        curPage.setEnabled(validUrl)
+        newPage = menu.addAction(self.tr("Open Link in New Page"))
+        newPage.setEnabled(validUrl)
+        newBackgroundPage = menu.addAction(
+            self.tr("Open Link in Background Page"))
+        newBackgroundPage.setEnabled(validUrl)
+        menu.addSeparator()
+        copyUrl = menu.addAction(self.tr("Copy URL to Clipboard"))
+        copyUrl.setEnabled(validUrl)
+        menu.addSeparator()
+        newBookmark = menu.addAction(self.tr("New Bookmark"))
+        addBookmark = menu.addAction(self.tr("Bookmark Page"))
+        menu.addSeparator()
+        editBookmark = menu.addAction(self.tr("Edit Bookmark"))
+        menu.addSeparator()
+        deleteBookmark = menu.addAction(self.tr("Delete Bookmark"))
+        menu.addSeparator()
+        exportBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
+        importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
+        
+        act = menu.exec(self.mapToGlobal(point))
+        if act == curPage:
+            self.openUrl.emit(url)
+        elif act == newPage:
+            self.newTab.emit(url)
+        elif act == newBackgroundPage:
+            self.newBackgroundTab.emit(url)
+        elif act == copyUrl:
+            # copy the URL to both clipboard areas
+            QGuiApplication.clipboard().setText(
+                url.toString(), QClipboard.Mode.Clipboard)
+            QGuiApplication.clipboard().setText(
+                url.toString(), QClipboard.Mode.Selection)
+        elif act == newBookmark:
+            self.__newBookmark()
+        elif act == addBookmark:
+            self.__bookmarkCurrentPage()
+        elif act == editBookmark:
+            self.__editBookmark(itm)
+        elif act == deleteBookmark:
+            self.__deleteBookmarks([itm])
+        elif act == exportBookmarks:
+            self.__exportBookmarks(selected=False)
+        elif act == importBookmarks:
+            self.__importBookmarks()
+    
+    @pyqtSlot(QPoint)
+    def __showBookmarksContextMenu(self, point):
+        """
+        Private slot to show the context menu for multiple bookmark.
+        
+        @param point position to open the menu at
+        @type QPoint
+        """
+        menu = QMenu()
+        openBookmarks = menu.addAction(self.tr("Open Selected Bookmarks"))
+        menu.addSeparator()
+        deleteBookmarks = menu.addAction(self.tr("Delete Selected Bookmarks"))
+        menu.addSeparator()
+        exportBookmarks = menu.addAction(self.tr("Export Selected Bookmarks"))
+        exportAllBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
+        importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
+        
+        act = menu.exec(self.mapToGlobal(point))
+        if act == openBookmarks:
+            self.__openBookmarks(selected=True)
+        elif act == deleteBookmarks:
+            self.__deleteBookmarks(self.selectedItems())
+        elif act == exportBookmarks:
+            self.__exportBookmarks(selected=True)
+        elif act == exportAllBookmarks:
+            self.__exportBookmarks(selected=False)
+        elif act == importBookmarks:
+            self.__importBookmarks()
+    
+    @pyqtSlot(str, str)
+    def __addBookmark(self, title, url):
+        """
+        Private slot to add a bookmark entry.
+        
+        @param title title for the bookmark
+        @type str
+        @param url URL for the bookmark
+        @type str
+        """
+        url = url.strip()
+        
+        itm = QListWidgetItem(title, self)
+        itm.setData(self.UrlRole, QUrl(url))
+        itm.setToolTip(url)
+    
+    @pyqtSlot(str, QUrl)
+    def addBookmark(self, title, url):
+        """
+        Public slot to add a bookmark with given data.
+        
+        @param title title for the bookmark
+        @type str
+        @param url URL for the bookmark
+        @type QUrl
+        """
+        dlg = HelpBookmarkPropertiesDialog(title, url.toString(), self)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            title, url = dlg.getData()
+            self.__addBookmark(title, url)
+            self.sortItems()
+            self.__saveBookmarks()
+    
+    @pyqtSlot()
+    def __bookmarkCurrentPage(self):
+        """
+        Private slot to bookmark the current page.
+        """
+        currentViewer = self.__helpViewer.currentViewer()
+        title = currentViewer.pageTitle()
+        url = currentViewer.link()
+        self.addBookmark(title, url)
+    
+    @pyqtSlot()
+    def __newBookmark(self):
+        """
+        Private slot to create a new bookmark.
+        """
+        dlg = HelpBookmarkPropertiesDialog(parent=self)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            title, url = dlg.getData()
+            self.__addBookmark(title, url)
+            self.sortItems()
+            self.__saveBookmarks()
+    
+    @pyqtSlot()
+    def __editBookmark(self, itm):
+        """
+        Private slot to edit a bookmark.
+        
+        @param itm reference to the bookmark item to be edited
+        @type QListWidgetItem
+        """
+        dlg = HelpBookmarkPropertiesDialog(
+            itm.text(), itm.data(self.UrlRole).toString(), self)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            title, url = dlg.getData()
+            itm.setText(title)
+            itm.setData(self.UrlRole, QUrl(url))
+            itm.setToolTip(url)
+            self.sortItems()
+            self.__saveBookmarks()
+    
+    @pyqtSlot(QListWidgetItem)
+    def __bookmarkActivated(self, itm):
+        """
+        Private slot handling the activation of a bookmark.
+        
+        @param itm reference to the activated item
+        @type QListWidgetItem
+        """
+        url = itm.data(self.UrlRole)
+        if url and not url.isEmpty() and url.isValid():
+            buttons = QApplication.mouseButtons()
+            modifiers = QApplication.keyboardModifiers()
+            
+            if buttons & Qt.MouseButton.MiddleButton:
+                self.newTab.emit(url)
+            else:
+                if (
+                    modifiers & (
+                        Qt.KeyboardModifier.ControlModifier |
+                        Qt.KeyboardModifier.ShiftModifier
+                    ) == (
+                        Qt.KeyboardModifier.ControlModifier |
+                        Qt.KeyboardModifier.ShiftModifier
+                    )
+                ):
+                    self.newBackgroundTab.emit(url)
+                elif modifiers & Qt.KeyboardModifier.ControlModifier:
+                    self.newTab.emit(url)
+                elif (
+                    modifiers & Qt.KeyboardModifier.ShiftModifier and
+                    not self.__internal
+                ):
+                    self.newWindow.emit(url)
+                else:
+                    self.openUrl.emit(url)
+    
+    def __openBookmarks(self, selected=False):
+        """
+        Private method to open all or selected bookmarks.
+        
+        @param selected flag indicating to open the selected bookmarks
+            (defaults to False)
+        @type bool (optional)
+        """
+        items = (
+            self.selectedItems()
+            if selected else
+            [self.item(row) for row in range(self.count())]
+        )
+        
+        for itm in items:
+            url = itm.data(self.UrlRole)
+            if url is not None and not url.isEmpty() and url.isValid():
+                self.newTab.emit(url)
+    
+    def __deleteBookmarks(self, items):
+        """
+        Private method to delete the given bookmark items.
+        
+        @param items list of bookmarks to be deleted
+        @type list of QListWidgetItem
+        """
+        from UI.DeleteFilesConfirmationDialog import (
+            DeleteFilesConfirmationDialog
+        )
+        dlg = DeleteFilesConfirmationDialog(
+            self,
+            self.tr("Delete Bookmarks"),
+            self.tr("Shall these bookmarks really be deleted?"),
+            [itm.text() for itm in items]
+        )
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            for itm in items:
+                self.takeItem(self.row(itm))
+                del itm
+            self.__saveBookmarks()
+    
+    def __loadBookmarks(self):
+        """
+        Private method to load the defined bookmarks.
+        """
+        bookmarksStr = Preferences.getHelp("Bookmarks")
+        with contextlib.suppress(ValueError):
+            bookmarks = json.loads(bookmarksStr)
+        
+        self.clear()
+        for bookmark in bookmarks:
+            self.__addBookmark(bookmark["title"], bookmark["url"])
+        self.sortItems()
+    
+    def __saveBookmarks(self):
+        """
+        Private method to save the defined bookmarks.
+        """
+        bookmarks = []
+        for row in range(self.count()):
+            itm = self.item(row)
+            bookmarks.append({
+                "title": itm.text(),
+                "url": itm.data(self.UrlRole).toString(),
+            })
+        Preferences.setHelp("Bookmarks", json.dumps(bookmarks))
+    
+    @pyqtSlot()
+    def __exportBookmarks(self, selected=False):
+        """
+        Private slot to export the bookmarks into a JSON file.
+        
+        @param selected flag indicating to export the selected bookmarks
+            (defaults to False)
+        @type bool (optional)
+        """
+        filename, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
+            self,
+            self.tr("Export Bookmarks"),
+            "",
+            self.tr("eric Bookmarks Files (*.json);;All Files (*)"),
+            None,
+            EricFileDialog.DontConfirmOverwrite
+        )
+        if filename:
+            ext = os.path.splitext(filename)[1]
+            if not ext:
+                ex = selectedFilter.split("(*")[1].split(")")[0]
+                if ex:
+                    filename += ex
+            
+            if os.path.exists(filename):
+                ok = EricMessageBox.yesNo(
+                    self,
+                    self.tr("Export Bookmarks"),
+                    self.tr("""The file <b>{0}</b> already exists. Do you"""
+                            """ want to overwrite it?""").format(filename))
+                if not ok:
+                    return
+            
+            bookmarksDict = {
+                "creator": "eric7",
+                "version": 1,
+                "created": datetime.datetime.now().isoformat(
+                    sep=" ", timespec="seconds"),
+                "bookmarks": []
+            }
+            bookmarkItems = (
+                self.selectedItems()
+                if selected else
+                [self.item(row) for row in range(self.count())]
+            )
+            for bookmarkItem in bookmarkItems:
+                bookmarksDict["bookmarks"].append({
+                    "type": "url",
+                    "title": bookmarkItem.text(),
+                    "url": bookmarkItem.data(self.UrlRole).toString(),
+                })
+            
+            jsonStr = json.dumps(bookmarksDict, indent=2, sort_keys=True)
+            try:
+                with open(filename, "w") as f:
+                    f.write(jsonStr)
+            except OSError as err:
+                EricMessageBox.critical(
+                    self,
+                    self.tr("Export Bookmarks"),
+                    self.tr("""<p>The bookmarks could not be exported"""
+                            """ to <b>{0}</b>.</p><p>Reason: {1}</p>""")
+                    .format(filename, str(err)))
+    
+    @pyqtSlot()
+    def __importBookmarks(self):
+        """
+        Private slot to import bookmarks from a JSON file.
+        """
+        from .HelpBookmarksImportDialog import HelpBookmarksImportDialog
+        
+        dlg = HelpBookmarksImportDialog(self)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            replace, filename = dlg.getData()
+            
+            try:
+                with open(filename, "r") as f:
+                    jsonStr = f.read()
+                    bookmarks = json.loads(jsonStr)
+            except (OSError, json.JSONDecodeError) as err:
+                EricMessageBox.critical(
+                    self,
+                    self.tr("Import Bookmarks"),
+                    self.tr(
+                        "<p>The bookmarks file <b>{0}</b> could not be "
+                        "read.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return
+            
+            if not isinstance(bookmarks, dict):
+                EricMessageBox.critical(
+                    self,
+                    self.tr("Import Bookmarks"),
+                    self.tr(
+                        "The bookmarks file <b>{0}</b> has invalid contents."
+                    ).format(filename)
+                )
+                return
+            
+            try:
+                if bookmarks["creator"] != "eric7":
+                    EricMessageBox.critical(
+                        self,
+                        self.tr("Import Bookmarks"),
+                        self.tr(
+                            "The bookmarks file <b>{0}</b> was not created"
+                            " with 'eric7'."
+                        ).format(filename)
+                    )
+                    return
+                
+                if bookmarks["version"] != 1:
+                    EricMessageBox.critical(
+                        self,
+                        self.tr("Import Bookmarks"),
+                        self.tr(
+                            "The bookmarks file <b>{0}</b> has an unsupported"
+                            " format version."
+                        ).format(filename)
+                    )
+                    return
+                
+                if replace:
+                    self.clear()
+                
+                for bookmark in bookmarks["bookmarks"]:
+                    if bookmark["type"] == "url":
+                        self.__addBookmark(bookmark["title"], bookmark["url"])
+                self.sortItems()
+                self.__saveBookmarks()
+            
+            except KeyError:
+                EricMessageBox.critical(
+                    self,
+                    self.tr("Import Bookmarks"),
+                    self.tr(
+                        "The bookmarks file <b>{0}</b> has invalid contents."
+                    ).format(filename)
+                )
--- a/eric7/HelpViewer/HelpViewerImplQTB.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/HelpViewer/HelpViewerImplQTB.py	Tue Feb 08 14:15:48 2022 +0100
@@ -487,6 +487,16 @@
         act.triggered.connect(
             functools.partial(self.__copyLink, act))
         
+        act = self.__menu.addAction(
+            UI.PixmapCache.getIcon("bookmark22"),
+            self.tr("Bookmark Page"))
+        act.setData({
+            "title": self.pageTitle(),
+            "url": self.link()
+        })
+        act.triggered.connect(
+            functools.partial(self.__bookmarkPage, act))
+        
         self.__menu.addSeparator()
         
         act = self.__menu.addAction(
@@ -596,6 +606,21 @@
         
         self.__helpViewerWidget.openUrlNewBackgroundPage(url)
     
+    def __bookmarkPage(self, act):
+        """
+        Private method called by the context menu to bookmark the page.
+        
+        @param act reference to the action that triggered
+        @type QAction
+        """
+        data = act.data()
+        if data:
+            with contextlib.suppress(KeyError):
+                url = data["url"]
+                title = data["title"]
+                
+                self.__helpViewerWidget.bookmarkPage(title, url)
+    
     def __copyLink(self, act):
         """
         Private method called by the context menu to copy a link to the
--- a/eric7/HelpViewer/HelpViewerImplQWE.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/HelpViewer/HelpViewerImplQWE.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,6 +7,7 @@
 Module implementing the help viewer base class.
 """
 
+import contextlib
 import functools
 
 from PyQt6.QtCore import pyqtSlot, Qt, QEvent, QTimer, QUrl, QPoint
@@ -612,6 +613,16 @@
         act.triggered.connect(
             functools.partial(self.__copyLink, act))
         
+        act = menu.addAction(
+            UI.PixmapCache.getIcon("bookmark22"),
+            self.tr("Bookmark Page"))
+        act.setData({
+            "title": self.pageTitle(),
+            "url": self.link()
+        })
+        act.triggered.connect(
+            functools.partial(self.__bookmarkPage, act))
+        
         menu.addSeparator()
         
         act = menu.addAction(
@@ -719,6 +730,21 @@
         
         self.__helpViewerWidget.openUrlNewBackgroundPage(url)
     
+    def __bookmarkPage(self, act):
+        """
+        Private method called by the context menu to bookmark the page.
+        
+        @param act reference to the action that triggered
+        @type QAction
+        """
+        data = act.data()
+        if data:
+            with contextlib.suppress(KeyError):
+                url = data["url"]
+                title = data["title"]
+                
+                self.__helpViewerWidget.bookmarkPage(title, url)
+    
     def __copyLink(self, act):
         """
         Private method called by the context menu to copy a link to the
--- a/eric7/HelpViewer/HelpViewerWidget.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/HelpViewer/HelpViewerWidget.py	Tue Feb 08 14:15:48 2022 +0100
@@ -33,13 +33,13 @@
 import Preferences
 
 from .OpenPagesWidget import OpenPagesWidget
+from .HelpBookmarksWidget import HelpBookmarksWidget
 
 from WebBrowser.QtHelp.HelpTocWidget import HelpTocWidget
 from WebBrowser.QtHelp.HelpIndexWidget import HelpIndexWidget
 from WebBrowser.QtHelp.HelpSearchWidget import HelpSearchWidget
 
 
-# TODO: add support for bookmarks
 class HelpViewerWidget(QWidget):
     """
     Class implementing an embedded viewer for QtHelp and local HTML files.
@@ -260,7 +260,8 @@
             "helpIndex", self.tr("Show the help document index"))
         self.__helpSearchButton = self.__addNavigationButton(
             "documentFind", self.tr("Show the help search window"))
-        self.__openPagesButton.setChecked(True)
+        self.__bookmarksButton = self.__addNavigationButton(
+            "bookmark22", self.tr("Show list of bookmarks"))
         
         self.__buttonLayout.addStretch()
         
@@ -320,7 +321,8 @@
         """
         # Open Pages
         self.__openPagesList = OpenPagesWidget(self.__helpStack, self)
-        self.__openPagesList.currentChanged.connect(self.__currentPageChanged)
+        self.__openPagesList.currentPageChanged.connect(
+            self.__currentPageChanged)
         self.__helpNavigationStack.addWidget(self.__openPagesList)
         
         # QtHelp TOC widget
@@ -362,6 +364,15 @@
         self.__helpSearchWidget.newBackgroundTab.connect(
             self.openUrlNewBackgroundPage)
         self.__helpNavigationStack.addWidget(self.__helpSearchWidget)
+        
+        # Bookmarks widget
+        self.__bookmarksList = HelpBookmarksWidget(self)
+        self.__bookmarksList.escapePressed.connect(self.__activateCurrentPage)
+        self.__bookmarksList.openUrl.connect(self.openUrl)
+        self.__bookmarksList.newTab.connect(self.openUrlNewPage)
+        self.__bookmarksList.newBackgroundTab.connect(
+            self.openUrlNewBackgroundPage)
+        self.__helpNavigationStack.addWidget(self.__bookmarksList)
     
     @pyqtSlot(QAbstractButton)
     def __selectNavigationWidget(self, button):
@@ -383,6 +394,9 @@
         elif button == self.__helpSearchButton:
             self.__helpNavigationStack.setCurrentWidget(
                 self.__helpSearchWidget)
+        elif button == self.__bookmarksButton:
+            self.__helpNavigationStack.setCurrentWidget(
+                self.__bookmarksList)
     
     def __populateHelpSelector(self):
         """
@@ -595,6 +609,17 @@
         """
         return self.__helpStack.currentWidget()
     
+    def bookmarkPage(self, title, url):
+        """
+        Public method to bookmark a page with the given data.
+        
+        @param title title of the page
+        @type str
+        @param url URL of the page
+        @type QUrl
+        """
+        self.__bookmarksList.addBookmark(title, url)
+    
     #######################################################################
     ## QtHelp related code below
     #######################################################################
--- a/eric7/HelpViewer/OpenPagesWidget.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/HelpViewer/OpenPagesWidget.py	Tue Feb 08 14:15:48 2022 +0100
@@ -9,21 +9,19 @@
 
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QPoint
 from PyQt6.QtGui import QGuiApplication, QClipboard
-from PyQt6.QtWidgets import (
-    QWidget, QListWidget, QVBoxLayout, QAbstractItemView, QMenu
-)
+from PyQt6.QtWidgets import QListWidget, QAbstractItemView, QMenu
 
 import UI.PixmapCache
 
 
-class OpenPagesWidget(QWidget):
+class OpenPagesWidget(QListWidget):
     """
     Class implementing a widget showing the list of open pages.
     
-    @signal currentChanged(index) emitted to signal a change of the current
+    @signal currentPageChanged(index) emitted to signal a change of the current
         page index
     """
-    currentChanged = pyqtSignal(int)
+    currentPageChanged = pyqtSignal(int)
     
     def __init__(self, stack, parent=None):
         """
@@ -40,30 +38,23 @@
         
         self.__helpViewer = parent
         
-        self.__layout = QVBoxLayout()
-        self.__layout.setContentsMargins(0, 0, 0, 0)
-        
-        self.__openPagesList = QListWidget(self)
-        self.__openPagesList.setAlternatingRowColors(True)
-        self.__openPagesList.setSelectionMode(
+        self.setAlternatingRowColors(True)
+        self.setSelectionMode(
             QAbstractItemView.SelectionMode.SingleSelection)
-        self.__openPagesList.setContextMenuPolicy(
+        self.setContextMenuPolicy(
             Qt.ContextMenuPolicy.CustomContextMenu)
-        self.__openPagesList.currentRowChanged.connect(
+        self.currentRowChanged.connect(
             self.__currentRowChanged)
-        self.__openPagesList.customContextMenuRequested.connect(
+        self.customContextMenuRequested.connect(
             self.__showContextMenu)
-        self.__layout.addWidget(self.__openPagesList)
-        
-        self.setLayout(self.__layout)
         
         self.__stack = stack
         self.__stack.currentChanged.connect(self.__currentPageChanged)
         
         self.__initContextMenu()
         
-        self.__defaultFont = self.__openPagesList.font()
-        self.__boldFont = self.__openPagesList.font()
+        self.__defaultFont = self.font()
+        self.__boldFont = self.font()
         self.__boldFont.setBold(True)
     
     def __initContextMenu(self):
@@ -94,10 +85,10 @@
         @param point position to open the menu at
         @type QPoint
         """
-        itm = self.__openPagesList.itemAt(point)
+        itm = self.itemAt(point)
         self.__copyUrlAct.setEnabled(bool(itm) and itm.text() != "about:blank")
-        self.closeOthersMenuAct.setEnabled(self.__openPagesList.count() > 1)
-        self.__menu.popup(self.__openPagesList.mapToGlobal(point))
+        self.closeOthersMenuAct.setEnabled(self.count() > 1)
+        self.__menu.popup(self.mapToGlobal(point))
     
     @pyqtSlot(int)
     def __currentPageChanged(self, index):
@@ -107,8 +98,8 @@
         @param index index of the current page
         @type int
         """
-        for row in range(self.__openPagesList.count()):
-            itm = self.__openPagesList.item(row)
+        for row in range(self.count()):
+            itm = self.item(row)
             itm.setFont(
                 self.__boldFont if row == index else self.__defaultFont
             )
@@ -122,7 +113,7 @@
         @type int
         """
         self.__stack.setCurrentIndex(row)
-        self.currentChanged.emit(row)
+        self.currentPageChanged.emit(row)
     
     def addPage(self, viewer, background=False):
         """
@@ -134,14 +125,14 @@
             (defaults to False)
         @type bool (optional)
         """
-        self.__openPagesList.addItem(viewer.pageTitle())
+        self.addItem(viewer.pageTitle())
         viewer.titleChanged.connect(
             lambda: self.__viewerTitleChanged(viewer))
         
         if not background:
-            self.__openPagesList.setCurrentRow(
-                self.__openPagesList.count() - 1)
-        if self.__openPagesList.count() == 1:
+            self.setCurrentRow(
+                self.count() - 1)
+        if self.count() == 1:
             self.__currentPageChanged(0)
     
     def insertPage(self, index, viewer, background=False):
@@ -156,15 +147,15 @@
             (defaults to False)
         @type bool (optional)
         """
-        currentRow = self.__openPagesList.currentRow()
-        self.__openPagesList.insertItem(index, viewer.pageTitle())
+        currentRow = self.currentRow()
+        self.insertItem(index, viewer.pageTitle())
         viewer.titleChanged.connect(
             lambda: self.__viewerTitleChanged(viewer))
         
         if not background:
-            self.__openPagesList.setCurrentRow(index)
+            self.setCurrentRow(index)
         else:
-            self.__openPagesList.setCurrentRow(currentRow)
+            self.setCurrentRow(currentRow)
     
     def __viewerTitleChanged(self, viewer):
         """
@@ -174,9 +165,9 @@
         @type HelpViewerImpl
         """
         index = self.__stack.indexOf(viewer)
-        itm = self.__openPagesList.item(index)
+        itm = self.item(index)
         itm.setText(viewer.pageTitle())
-        self.currentChanged.emit(index)
+        self.currentPageChanged.emit(index)
     
     #######################################################################
     ## Context menu action methods
@@ -208,7 +199,7 @@
         """
         Private slot to copy the URL to the clipboard.
         """
-        row = self.__openPagesList.currentRow()
+        row = self.currentRow()
         viewer = self.__stack.widget(row)
         url = viewer.link()
         if url.isValid():
@@ -231,7 +222,7 @@
         self.__stack.removeWidget(viewer)
         viewer.deleteLater()
         
-        itm = self.__openPagesList.takeItem(row)
+        itm = self.takeItem(row)
         del itm
     
     #######################################################################
@@ -243,10 +234,10 @@
         """
         Public slot to close the current page.
         """
-        row = self.__openPagesList.currentRow()
+        row = self.currentRow()
         self.__removeViewer(row)
         
-        if self.__openPagesList.count() == 0:
+        if self.count() == 0:
             self.__helpViewer.addPage()
     
     @pyqtSlot()
@@ -254,8 +245,8 @@
         """
         Public slot to close all other pages.
         """
-        currentRow = self.__openPagesList.currentRow()
-        for row in range(self.__openPagesList.count() - 1, -1, -1):
+        currentRow = self.currentRow()
+        for row in range(self.count() - 1, -1, -1):
             if row != currentRow:
                 self.__removeViewer(row)
     
@@ -264,6 +255,6 @@
         """
         Public slot to close all pages.
         """
-        while self.__openPagesList.count() != 0:
+        while self.count() != 0:
             self.__removeViewer(0)
         self.__helpViewer.addPage()
--- a/eric7/JediInterface/JediServer.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/JediInterface/JediServer.py	Tue Feb 08 14:15:48 2022 +0100
@@ -211,9 +211,9 @@
         for completion in result["Completions"]:
             name = completion['Name']
             context = completion['FullName']
-            if context.endswith(".{0}".format(name)):
-                context = context.rsplit(".", 1)[0]
             if context:
+                if context.endswith(".{0}".format(name)):
+                    context = context.rsplit(".", 1)[0]
                 name = "{0} ({1})".format(name, context)
             
             name += JediServer.PictureIDs.get(completion['CompletionType'], '')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/MicroPython/BoardDataDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to show information about a connected board.
+"""
+
+import contextlib
+
+from PyQt6.QtCore import QLocale
+from PyQt6.QtWidgets import QDialog, QTreeWidgetItem
+
+from .Ui_BoardDataDialog import Ui_BoardDataDialog
+
+
+class BoardDataDialog(QDialog, Ui_BoardDataDialog):
+    """
+    Class implementing a dialog to show information about a connected board.
+    """
+    def __init__(self, data, parent=None):
+        """
+        Constructor
+        
+        @param data dictionary containing the data to be shown
+        @type dict
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        loc = QLocale()
+        
+        self.dataTree.setColumnCount(2)
+        
+        header = self.__createHeader(self.tr("General"))
+        QTreeWidgetItem(header, [
+            self.tr("Board ID"),
+            data["mc_id"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Board Frequency"),
+            self.tr("{0} MHz").format(
+                loc.toString(data["mc_frequency_mhz"], "f", 0))
+        ])
+        with contextlib.suppress(KeyError):
+            QTreeWidgetItem(header, [
+                self.tr("Board Temperature"),
+                self.tr("{0} °C").format(
+                    loc.toString(data["mc_temp_c"], "f", 1))
+            ])
+        
+        header = self.__createHeader(self.tr("Python"))
+        QTreeWidgetItem(header, [
+            self.tr("Python Version"),
+            data["py_version"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Platform"),
+            data["py_platform"]
+        ])
+        if data["mpy_name"] == "micropython":
+            mpyName = "MicroPython"
+        elif data["mpy_name"] == "circuitpython":
+            mpyName = "CircuitPython"
+        elif data["mpy_name"] == "unknown":
+            mpyName = self.tr("unknown")
+        else:
+            mpyName = data["name"]
+        QTreeWidgetItem(header, [
+            self.tr("Implementation"),
+            self.tr("{0} V. {1}").format(
+                mpyName,
+                self.tr("unknown")
+                if data["mpy_version"] == "unknown" else
+                data["mpy_version"]
+            )
+        ])
+        
+        header = self.__createHeader(self.tr("System"))
+        QTreeWidgetItem(header, [
+            self.tr("System Name"),
+            data["sysname"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Node Name"),
+            data["nodename"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Release"),
+            data["release"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Version"),
+            data["version"]
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("Machine"),
+            data["machine"]
+        ])
+        
+        header = self.__createHeader(self.tr("Memory"))
+        QTreeWidgetItem(header, [
+            self.tr("total"),
+            self.tr("{0} KBytes").format(
+                loc.toString(data["mem_total_kb"], "f", 2))
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("used"),
+            self.tr("{0} KBytes ({1}%)").format(
+                loc.toString(data["mem_used_kb"], "f", 2),
+                loc.toString(data["mem_used_pc"], "f", 2))
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("free"),
+            self.tr("{0} KBytes ({1}%)").format(
+                loc.toString(data["mem_free_kb"], "f", 2),
+                loc.toString(data["mem_free_pc"], "f", 2))
+        ])
+        
+        header = self.__createHeader(self.tr("Flash Memory"))
+        QTreeWidgetItem(header, [
+            self.tr("total"),
+            self.tr("{0} KBytes").format(
+                loc.toString(data["flash_total_kb"], "f", 0))
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("used"),
+            self.tr("{0} KBytes ({1}%)").format(
+                loc.toString(data["flash_used_kb"], "f", 0),
+                loc.toString(data["flash_used_pc"], "f", 2))
+        ])
+        QTreeWidgetItem(header, [
+            self.tr("free"),
+            self.tr("{0} KBytes ({1}%)").format(
+                loc.toString(data["flash_free_kb"], "f", 0),
+                loc.toString(data["flash_free_pc"], "f", 2))
+        ])
+        
+        header = self.__createHeader(self.tr("µLab"))
+        if data["ulab"] is not None:
+            QTreeWidgetItem(header, [
+                self.tr("Version"),
+                data["ulab"]
+            ])
+        else:
+            itm = QTreeWidgetItem(header, [
+                self.tr("µLab is not available")
+            ])
+            itm.setFirstColumnSpanned(True)
+        
+        for col in range(self.dataTree.columnCount()):
+            self.dataTree.resizeColumnToContents(col)
+    
+    def __createHeader(self, headerText):
+        """
+        Private method to create a header item.
+        
+        @param headerText text for the header item
+        @type str
+        @return reference to the created header item
+        @rtype QTreeWidgetItem
+        """
+        headerItem = QTreeWidgetItem(self.dataTree, [headerText])
+        headerItem.setExpanded(True)
+        headerItem.setFirstColumnSpanned(True)
+        
+        font = headerItem.font(0)
+        font.setBold(True)
+        
+        headerItem.setFont(0, font)
+        
+        return headerItem
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/MicroPython/BoardDataDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BoardDataDialog</class>
+ <widget class="QDialog" name="BoardDataDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>650</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Board Data</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="font">
+      <font>
+       <pointsize>14</pointsize>
+       <bold>true</bold>
+      </font>
+     </property>
+     <property name="text">
+      <string>Board Data</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTreeWidget" name="dataTree">
+     <property name="headerHidden">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>BoardDataDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>BoardDataDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- a/eric7/MicroPython/EspBackupRestoreFirmwareDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/EspBackupRestoreFirmwareDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -26,21 +26,52 @@
     Class implementing a dialog to select the ESP chip type and the backup and
     restore parameters.
     """
+    Chips = (
+        ("", ""),
+        ("ESP32", "esp32"),
+        ("ESP32-C3", "esp32c3"),
+        ("ESP32-S2", "esp32s2"),
+        ("ESP32-S3", "esp32s3"),
+        ("ESP8266", "esp8266"),
+    )
+    
     FlashModes = [
         ("Quad I/O", "qio"),
         ("Quad Output", "qout"),
         ("Dual I/O", "dio"),
         ("Dual Output", "dout"),
     ]
+    
     FlashSizes = {
-        "ESP32": [
+        "esp32": [
+            (" 1 MB", "0x100000"),
+            (" 2 MB", "0x200000"),
+            (" 4 MB", "0x400000"),
+            (" 8 MB", "0x800000"),
+            ("16 MB", "0x1000000"),
+        ],
+        "esp32c3": [
             (" 1 MB", "0x100000"),
             (" 2 MB", "0x200000"),
             (" 4 MB", "0x400000"),
             (" 8 MB", "0x800000"),
             ("16 MB", "0x1000000"),
         ],
-        "ESP8266": [
+        "esp32s2": [
+            (" 1 MB", "0x100000"),
+            (" 2 MB", "0x200000"),
+            (" 4 MB", "0x400000"),
+            (" 8 MB", "0x800000"),
+            ("16 MB", "0x1000000"),
+        ],
+        "esp32s3": [
+            (" 1 MB", "0x100000"),
+            (" 2 MB", "0x200000"),
+            (" 4 MB", "0x400000"),
+            (" 8 MB", "0x800000"),
+            ("16 MB", "0x1000000"),
+        ],
+        "esp8266": [
             ("256 KB", "0x40000"),
             ("512 KB", "0x80000"),
             (" 1 MB", "0x100000"),
@@ -66,7 +97,8 @@
         
         self.__isBackupMode = backupMode
         
-        self.espComboBox.addItems(["", "ESP32", "ESP8266"])
+        for text, chip in self.Chips:
+            self.espComboBox.addItem(text, chip)
         
         self.firmwarePicker.setFilters(
             self.tr("Firmware Files (*.img);;All Files (*)"))
@@ -108,9 +140,10 @@
         """
         selectedSize = self.sizeComboBox.currentText()
         self.sizeComboBox.clear()
-        if chip and chip in self.FlashSizes:
+        chipType = self.espComboBox.currentData()
+        if chipType and chipType in self.FlashSizes:
             self.sizeComboBox.addItem("")
-            for text, data in self.FlashSizes[chip]:
+            for text, data in self.FlashSizes[chipType]:
                 self.sizeComboBox.addItem(text, data)
             
             self.sizeComboBox.setCurrentText(selectedSize)
@@ -136,7 +169,7 @@
         @rtype tuple of (str, str, str, str)
         """
         return (
-            self.espComboBox.currentText().lower(),
+            self.espComboBox.currentData(),
             self.sizeComboBox.currentData(),
             self.modeComboBox.currentData(),
             self.firmwarePicker.text(),
--- a/eric7/MicroPython/EspBackupRestoreFirmwareDialog.ui	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/EspBackupRestoreFirmwareDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -86,6 +86,12 @@
      </item>
      <item row="3" column="1" colspan="2">
       <widget class="EricPathPicker" name="firmwarePicker" native="true">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="focusPolicy">
         <enum>Qt::WheelFocus</enum>
        </property>
--- a/eric7/MicroPython/EspDevices.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/EspDevices.py	Tue Feb 08 14:15:48 2022 +0100
@@ -195,22 +195,11 @@
     def __flashMicroPython(self):
         """
         Private slot to flash a MicroPython firmware to the device.
-        
-        @exception ValueError raised to indicate an unsupported chip type
         """
         from .EspFirmwareSelectionDialog import EspFirmwareSelectionDialog
         dlg = EspFirmwareSelectionDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            chip, firmware, baudRate, flashMode, _ = dlg.getData()
-            if chip not in ("esp8266", "esp32"):
-                raise ValueError(self.tr("Unsupported chip type '{0}'.")
-                                 .format(chip))
-            
-            if chip == "esp8266":
-                flashAddress = "0x0000"
-            elif chip == "esp32":
-                flashAddress = "0x1000"
-            
+            chip, firmware, baudRate, flashMode, flashAddress = dlg.getData()
             flashArgs = [
                 "-u",
                 "-m", "esptool",
--- a/eric7/MicroPython/EspFirmwareSelectionDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/EspFirmwareSelectionDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -24,6 +24,15 @@
     Class implementing a dialog to select the ESP chip type and the firmware to
     be flashed.
     """
+    Chips = (
+        ("", ""),
+        ("ESP32", "esp32"),
+        ("ESP32-C3", "esp32c3"),
+        ("ESP32-S2", "esp32s2"),
+        ("ESP32-S3", "esp32s3"),
+        ("ESP8266", "esp8266"),
+    )
+    
     FlashModes = (
         ("", ""),
         ("Quad I/O", "qio"),
@@ -32,6 +41,14 @@
         ("Dual Output", "dout"),
     )
     
+    FlashAddresses = {
+        "esp8266": "0x0000",
+        "esp32": "0x1000",
+        "esp32c3": "0x0000",
+        "esp32s2": "0x1000",
+        "esp32s3": "0x1000",
+    }
+    
     def __init__(self, addon=False, parent=None):
         """
         Constructor
@@ -50,7 +67,8 @@
         self.firmwarePicker.setFilters(
             self.tr("Firmware Files (*.bin);;All Files (*)"))
         
-        self.espComboBox.addItems(["", "ESP32", "ESP8266"])
+        for text, chip in self.Chips:
+            self.espComboBox.addItem(text, chip)
         
         self.baudRateComboBox.addItems([
             "74.880", "115.200", "230.400", "460.800", "921.600", "1.500.000"])
@@ -112,10 +130,14 @@
             address
         @rtype tuple of (str, str, str, str, str)
         """
-        address = self.addressEdit.text() if self.__addon else ""
+        chip = self.espComboBox.currentData()
+        address = (
+            self.addressEdit.text()
+            if self.__addon else
+            self.FlashAddresses[chip])
         
         return (
-            self.espComboBox.currentText().lower(),
+            chip,
             self.firmwarePicker.text(),
             self.baudRateComboBox.currentText().replace(".", ""),
             self.modeComboBox.currentData(),
--- a/eric7/MicroPython/EspFirmwareSelectionDialog.ui	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/EspFirmwareSelectionDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -58,6 +58,12 @@
      </item>
      <item row="1" column="1" colspan="2">
       <widget class="EricPathPicker" name="firmwarePicker" native="true">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="focusPolicy">
         <enum>Qt::WheelFocus</enum>
        </property>
--- a/eric7/MicroPython/MicroPythonCommandsInterface.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/MicroPythonCommandsInterface.py	Tue Feb 08 14:15:48 2022 +0100
@@ -750,6 +750,105 @@
             raise OSError(self.__shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
     
+    def getBoardInformation(self):
+        """
+        Public method to get some information data of the connected board.
+        
+        @return dictionary containing the determined data
+        @rtype dict
+        @exception OSError raised to indicate an issue with the device
+        """
+        commands = [
+            "res = {}",                             # __IGNORE_WARNING_M613__
+            
+            "import gc as __gc_",
+            "__gc_.enable()",
+            "__gc_.collect()",
+            "mem_alloc = __gc_.mem_alloc()",
+            "mem_free = __gc_.mem_free()",
+            "mem_total = mem_alloc + mem_free",
+            "res['mem_total_kb'] = mem_total / 1024.0",
+            "res['mem_used_kb'] = mem_alloc / 1024.0",
+            "res['mem_used_pc'] = mem_alloc / mem_total * 100.0",
+            "res['mem_free_kb'] = mem_free / 1024.0",
+            "res['mem_free_pc'] = mem_free / mem_total * 100.0",
+            "del __gc_, mem_alloc, mem_free, mem_total",
+            
+            "import os as __os_",
+            "uname = __os_.uname()",
+            "res['sysname'] = uname.sysname",
+            "res['nodename'] = uname.nodename",
+            "res['release'] = uname.release",
+            "res['version'] = uname.version",
+            "res['machine'] = uname.machine",
+            
+            "import sys as __sys_",
+            "res['py_platform'] = __sys_.platform",
+            "res['py_version'] = __sys_.version",
+            "\n".join([
+                "try:",
+                "    res['mpy_name'] = __sys_.implementation.name",
+                "except AttributeError:",
+                "    res['mpy_name'] = 'unknown'",
+            ]),
+            "\n".join([
+                "try:",
+                "    res['mpy_version'] = '.'.join((str(i) for i in"
+                " __sys_.implementation.version))",
+                "except AttributeError:",
+                "    res['mpy_version'] = 'unknown'",
+            ]),
+            
+            "stat_ = __os_.statvfs('/flash')",
+            "res['flash_total_kb'] = stat_[2] * stat_[0] / 1024.0",
+            "res['flash_free_kb'] = stat_[3] * stat_[0] / 1024.0",
+            "res['flash_used_kb'] = res['flash_total_kb'] -"
+            " res['flash_free_kb']",
+            "res['flash_free_pc'] = res['flash_free_kb'] /"
+            " res['flash_total_kb'] * 100.0",
+            "res['flash_used_pc'] = res['flash_used_kb'] /"
+            " res['flash_total_kb'] * 100.0",
+            
+            "\n".join([
+                "try:",
+                "    import machine as __mc_",
+                "    res['mc_frequency_mhz'] = __mc_.freq() / 1000000.0",
+                "    res['mc_id'] = ':'.join(['{0:X}'.format(x)"
+                " for x in __mc_.unique_id()])",
+                "    del __mc_",
+                "except ImportError:",
+                "\n".join([
+                    "    try:",
+                    "        import microcontroller as __mc_",
+                    "        res['mc_frequency_mhz'] = __mc_.cpu.frequency"
+                    " / 1000000.0",
+                    "        res['mc_temp_c'] = __mc_.cpu.temperature",
+                    "        res['mc_id'] = ':'.join(['{0:X}'.format(x)"
+                    " for x in __mc_.cpu.uid])",
+                    "        del __mc_",
+                    "    except ImportError:",
+                    "        res['mc_frequency'] = None",
+                    "        res['mc_temp'] = None",
+                ]),
+            ]),
+            
+            "\n".join([
+                "try:",
+                "    import ulab as __ulab_",
+                "    res['ulab'] = __ulab_.__version__",
+                "    del __ulab_",
+                "except ImportError:",
+                "    res['ulab'] = None",
+            ]),
+            
+            "print(res)",
+            "del res, stat_, __os_, __sys_",
+        ]
+        out, err = self.execute(commands)
+        if err:
+            raise OSError(self.__shortError(err))
+        return ast.literal_eval(out.decode("utf-8"))
+    
     def syncTime(self, deviceType):
         """
         Public method to set the time of the connected device to the local
--- a/eric7/MicroPython/MicroPythonDevices.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/MicroPythonDevices.py	Tue Feb 08 14:15:48 2022 +0100
@@ -31,7 +31,8 @@
             (0x0403, 0x6015),       # Sparkfun ESP32
             (0x0403, 0x601C),       # FT4222H
             (0x10C4, 0xEA60),       # CP210x
-            (0x1A86, 0x7523),       # HL-340
+            (0x1A86, 0x55D4),       # CH343
+            (0x1A86, 0x7523),       # HL-340, CH340
         ],
         "description": "ESP32, ESP8266",
         "icon": "esp32Device",
@@ -59,15 +60,20 @@
             (0x04D8, 0xEF67),       # senseBox MCU
             (0x054C, 0x0BC2),       # Sony Spresense
             (0x1209, 0x2017),       # Benjamin Shockley Mini SAM M4
+            (0x1209, 0x3141),       # CrumpSpace CrumpS2
             (0x1209, 0x3252),       # Targett Module Clip w/Wroom
             (0x1209, 0x3253),       # Targett Module Clip w/Wrover
             (0x1209, 0x4D43),       # Robotics Masters Robo HAT MM1 M4
             (0x1209, 0x4DDD),       # ODT CP Sapling
             (0x1209, 0x4DDE),       # ODT CP Sapling M0 w/ SPI Flash
             (0x1209, 0x4DDF),       # ODT CP Sapling Rev B
+            (0x1209, 0x4DF0),       # Oak Dev Tech Pixelwing ESP32S2
+            (0x1209, 0x4DF1),       # Oak Dev Tech BREAD2040
+            (0x1209, 0x4DF2),       # Oak Dev Tech CAST AWAY RP2040
             (0x1209, 0x5BF0),       # Foosn Fomu
             (0x1209, 0x7150),       # Electronic Cats Hunter Cat NFC
             (0x1209, 0x805A),       # Electronic Cats BastBLE
+            (0x1209, 0xA182),       # Solder Party RP2040 Stamp
             (0x1209, 0xBAB0),       # Electronic Cats Bast WiFi
             (0x1209, 0xBAB1),       # Electronic Cats Meow Meow
             (0x1209, 0xBAB2),       # Electronic Cats CatWAN USBStick
@@ -78,29 +84,42 @@
             (0x1209, 0xE3E3),       # StackRduino M0 PRO
             (0x1209, 0xF500),       # Silicognition LLC M4-Shim
             (0x16D0, 0x08C6),       # Pimoroni Keybow 2040
-            (0x16D0, 0x08C7),       # Pimoroni Tiny 2040
+            (0x16D0, 0x08C7),       # Pimoroni Tiny 2040 (8MB)
             (0x16D0, 0x08C8),       # Pimoroni PicoSystem
             (0x1915, 0xB001),       # Makerdiary Pitaya Go
+            (0x192F, 0xB1B2),       # WarmBit BluePixel nRF52840
             (0x1B4F, 0x0015),       # SparkFun RedBoard Turbo Board
             (0x1B4F, 0x0016),       # SparkFun SAMD51 Thing+
             (0x1B4F, 0x0017),       # SparkFun LUMIDrive Board
-            (0x1B4F, 0x0020),       # SparkFun MicroMod SAMD51
-            (0x1B4F, 0x0021),       # SparkFun SFE_nRF52840_MicroMod
-            (0x1B4F, 0x0024),       # SparkFun MicroMod RP2040
+            (0x1B4F, 0x0020),       # SparkFun MicroMod SAMD51 Processor
+            (0x1B4F, 0x0021),       # SparkFun MicroMod nRF52840 Processor
+            (0x1B4F, 0x0024),       # SparkFun MicroMod RP2040 Processor
             (0x1B4F, 0x0025),       # SparkFun Thing Plus RP2040
             (0x1B4F, 0x0026),       # SparkFun Pro Micro RP2040
+            (0x1B4F, 0x0027),       # SparkFun STM32 MicroMod Processor
+            (0x1B4F, 0x0028),       # SparkFun Thing Plus - STM32
             (0x1B4F, 0x5289),       # SparkFun SFE_nRF52840_Mini
             (0x1B4F, 0x8D22),       # SparkFun SAMD21 Mini Breakout
             (0x1B4F, 0x8D23),       # SparkFun SAMD21 Dev Breakout
             (0x1B4F, 0x8D24),       # SparkFun Qwiic Micro
             (0x1D50, 0x60E8),       # Radomir Dopieralski PewPew M4
+            (0x1D50, 0x6152),       # nrf52.jpconstantineau.com BlueMicro833
+            (0x1D50, 0x6153),       # JPConstantineau PyKey18
+            (0x1D50, 0x6153),       # JPConstantineau PyKey44
+            (0x1D50, 0x6153),       # JPConstantineau PyKey60
+            (0x1D50, 0x6153),       # JPConstantineau PyKey87
+            (0x1D50, 0x6154),       # JPConstantineau EncoderPad RP2040
+            (0x1D50, 0x6161),       # nrf52.jpconstantineau.com BlueMicro840
             (0x2341, 0x8053),       # Arduino MKR1300
             (0x2341, 0x8057),       # Arduino Nano 33 IoT
             (0x2341, 0x805A),       # Arduino Arduino_Nano_33_BLE
             (0x2341, 0x824D),       # Arduino Zero
             (0x2786, 0x9207),       # Switch Sc. BLE-SS dev board Multi Sensor
             (0x2886, 0x002F),       # Seeed Seeeduino XIAO
+            (0x2886, 0x0042),       # Seeed Seeeduino XIAO RP2040
+            (0x2886, 0x0045),       # Seeed XIAO nRF52840 Sense
             (0x2886, 0x802D),       # Seeed Seeeduino Wio Terminal
+            (0x2886, 0x802F),       # Seeed Seeeduino XIAO KB
             (0x2886, 0xF001),       # Makerdiary nRF52840 M.2 Developer Kit
             (0x2886, 0xF002),       # Makerdiary M60 Keyboard
             (0x2B04, 0xC00C),       # Particle Argon
@@ -109,19 +128,46 @@
             (0x2E8A, 0x1000),       # Cytron Maker Pi RP2040
             (0x2E8A, 0x1002),       # Pimoroni Pico LiPo (4MB)
             (0x2E8A, 0x1003),       # Pimoroni Pico LiPo (16MB)
+            (0x2E8A, 0x1005),       # Melopero Shake RP2040
+            (0x2E8A, 0x1006),       # Invector Labs Challenger RP2040 WiFi
             (0x2E8A, 0x1008),       # Pimoroni PGA2040
+            (0x2E8A, 0x1009),       # Pimoroni Interstate 75
+            (0x2E8A, 0x100A),       # Pimoroni Plasma 2040
+            (0x2E8A, 0x100B),       # Invector Labs Challenger RP2040 LTE
+            (0x2E8A, 0x100D),       # Invector Labs Challenger NB RP2040 WiFi
+            (0x2E8A, 0x100F),       # Cytron Maker Nano RP2040
+            (0x2E8A, 0x1012),       # Raspberry Pi Compute Module 4 IO Board
+            (0x2E8A, 0x1013),       # Raspberry Pi 4B
+            (0x2E8A, 0x1014),       # Raspberry Pi Compute Module 4
+            (0x2E8A, 0x1015),       # Raspberry Pi Zero 2W
+            (0x2E8A, 0x1016),       # Pimoroni Tiny 2040 (2MB)
+            (0x2E8A, 0xF015),       # Raspberry Pi Zero
+            (0x303A, 0x7001),       # Espressif ESP32-S2-HMI-DevKit-1
+            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1
+            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1-nopsram
+            (0x303A, 0x7005),       # Espressif ESP32-S3-Box-2.5
             (0x303A, 0x8002),       # UnexpectedMaker TinyS2
             (0x303A, 0x8007),       # LILYGO TTGO T8 ESP32-S2
+            (0x303A, 0x800D),       # Gravitech Cucumber RS
+            (0x303A, 0x80A1),       # Gravitech Cucumber R
+            (0x303A, 0x80A4),       # Gravitech Cucumber M
+            (0x303A, 0x80A7),       # Gravitech Cucumber MS
             (0x303A, 0x80AA),       # Espressif Franzininho WIFI w/Wroom
             (0x303A, 0x80AD),       # Espressif Franzininho WIFI w/Wrover
             (0x303A, 0x80AF),       # Artisense Reference Design RD00
             (0x303A, 0x80B2),       # Muselab nanoESP32-S2  w/Wrover
+            (0x303A, 0x80B5),       # UnexpectedMaker FeatherS2 Neo
+            (0x303A, 0x80B7),       # MORPHEANS MORPHESP-240
+            (0x303A, 0x80C3),       # Lolin S2 Mini
+            (0x303A, 0x80C6),       # Lolin S2 Pico
+            (0x30A4, 0x0002),       # Blues Inc. Swan R5
             (0x3171, 0x0101),       # 8086.net Commander
             (0x31E2, 0x2001),       # BDMICRO LLC VINA-D21
             (0x31E2, 0x2011),       # BDMICRO LLC VINA-D51
             (0x31E2, 0x2021),       # BDMICRO LLC VINA-D51
             (0x32BD, 0x3001),       # Alorium Tech. AloriumTech Evo M51
             (0x4097, 0x0001),       # TG-Boards Datalore IP M4
+            (0x612B, 0x80A7),       # Ai-Thinker ESP 12k NodeMCU
             
             (0x239A, None),         # Any Adafruit Boards
         ],
--- a/eric7/MicroPython/MicroPythonWidget.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/MicroPythonWidget.py	Tue Feb 08 14:15:48 2022 +0100
@@ -1333,6 +1333,9 @@
         act = self.__superMenu.addAction(
             self.tr("Show Implementation"), self.__showImplementation)
         act.setEnabled(self.__connected)
+        act = self.__superMenu.addAction(
+            self.tr("Show Board Data"), self.__showBoardInformation)
+        act.setEnabled(self.__connected)
         self.__superMenu.addSeparator()
         if hasTime:
             act = self.__superMenu.addAction(
@@ -1444,6 +1447,20 @@
             self.__showError("getImplementation()", str(exc))
     
     @pyqtSlot()
+    def __showBoardInformation(self):
+        """
+        Private slot to show all available information about a board.
+        """
+        try:
+            boardInfo = self.__interface.getBoardInformation()
+            
+            from .BoardDataDialog import BoardDataDialog
+            dlg = BoardDataDialog(boardInfo)
+            dlg.exec()
+        except Exception as exc:
+            self.__showError("getBoardInformation()", str(exc))
+    
+    @pyqtSlot()
     def __synchronizeTime(self, quiet=False):
         """
         Private slot to set the time of the connected device to the local
--- a/eric7/MicroPython/UF2FlashDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/UF2FlashDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -71,6 +71,9 @@
             (0x1209, 0x7102): [
                 "MINISAMBOOT",    # Mini SAM M0
             ],
+            (0x1209, 0x7A01): [
+                "MIKOTO-BOOT",    # Mikoto nRF52840
+            ],
             (0x1209, 0x805A): [
                 "BASTBLE",        # Bast BLE
             ],
@@ -101,14 +104,24 @@
             (0x1D50, 0x6112): [
                 "RCBOOT",         # Wattuino RC
             ],
+            (0x1D50, 0x6157): [
+                "BBOARDBOOT",     # nRF52840 BBoard
+            ],
             (0x1D50, 0x6160): [
                 "BLUEMICRO",      # BlueMicro
             ],
+            (0x1D50, 0x616F): [
+                "BLUEMICRO",      # BlueMicro
+            ],
             (0x1FC9, 0x0094): [
                 "DblM33BOOT",     # Double M33
                 "LPC5528BOOT",    # LPCXpresso 55s28
                 "LPC5569BOOT",    # LPCXpresso 55s69
             ],
+            (0x1FC9, 0x0154): [
+                "K32L2BOOT",      # FRDM-K32L2B3
+                "K32L2BOOT",      # KUIIC
+            ],
             (0x230A, 0x00E9): [
                 "TAU_BOOT",       # Tau
             ],
@@ -272,6 +285,8 @@
                 "ADM840BOOT",     # AtelierDuMaker NRF52840 Breakout
             ],
             (0x239A, 0x00A5): [
+                "S3DKC1BOOT",     # ESP32S3 DevKitC 1
+                "S3DKM1BOOT",     # ESP32S3 DevKitM 1
                 "SAOLA1RBOOT",    # Saola 1R WROVER
             ],
             (0x239A, 0x00A7): [
@@ -292,6 +307,9 @@
             (0x239A, 0x00B9): [
                 "ND7BOOT",        # ndBit7
             ],
+            (0x239A, 0x00BB): [
+                "MDBT50QBOOT",    # Raytac MDBT50Q Demo Board 40
+            ],
             (0x239A, 0x00BF): [
                 "BADGEBOOT",      # BLM Badge
             ],
@@ -356,6 +374,21 @@
             (0x239A, 0x010B): [
                 "MDBT50QBOOT",    # Raytac MDBT50Q-RX
             ],
+            (0x239A, 0x010D): [
+                "GLASSESBOOT",    # LED Glasses Driver nRF52840
+            ],
+            (0x239A, 0x010F): [
+                "FTHRS2BOOT",     # Feather ESP32-S2 TFT
+            ],
+            (0x239A, 0x0111): [
+                "QTPYS2BOOT",     # QT Py ESP32-S2
+            ],
+            (0x239A, 0x0115): [
+                "FEATHERBOOT",    # Feather M4 Adalogger
+            ],
+            (0x239A, 0x0117): [
+                "CAMERABOOT",     # Camera
+            ],
             (0x239A, 0x800B): [
                 "ATMZBOOT",       # ATMegaZero ESP32-S2
             ],
@@ -378,6 +411,9 @@
                 "M60KEYBOARD",    # MakerDiary M60 Mechanical Keyboard
                 "nRF52840M2",     # MakerDiary nRF52840 M.2 Module
             ],
+            (0x303A, 0x7000): [
+                "ESPHMI1BOOT",    # HMI 1
+            ],
             (0x303A, 0x8005): [
                 "TINYS2BOOT",     # TinyS2
             ],
@@ -393,6 +429,21 @@
             (0x303A, 0x80B3): [
                 "NANOESPBOOT",    # nanoESP32-S2 WROVER
             ],
+            (0x303A, 0x80B5): [
+                "FS2NEOBOOT",     # FeatherS2 Neo
+            ],
+            (0x303A, 0x80B6): [
+                "MORPHBOOT",      # MORPHESP-240
+            ],
+            (0x303A, 0x80C4): [
+                "S2MINIBOOT",     # S2 Mini
+            ],
+            (0x303A, 0x80C7): [
+                "S2PICOBOOT",     # S2 Pico
+            ],
+            (0x303A, 0x80DA): [
+                "HEXKYBOOT",      # HexKy-S2
+            ],
             (0x3171, 0x0100): [
                 "CMDBOOT",        # COMMANDER
             ],
--- a/eric7/MicroPython/UF2FlashDialog.ui	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/MicroPython/UF2FlashDialog.ui	Tue Feb 08 14:15:48 2022 +0100
@@ -49,7 +49,7 @@
      <item row="1" column="1">
       <widget class="EricPathPicker" name="firmwarePicker" native="true">
        <property name="sizePolicy">
-        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
@@ -72,7 +72,7 @@
      <item row="2" column="1">
       <widget class="EricPathPicker" name="bootPicker" native="true">
        <property name="sizePolicy">
-        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
--- a/eric7/PluginManager/PluginRepositoryDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/PluginManager/PluginRepositoryDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -109,7 +109,7 @@
             self.__downloadButton = QToolButton(self)
             self.__downloadButton.setIcon(UI.PixmapCache.getIcon("download"))
             self.__downloadButton.setToolTip(self.tr("Download"))
-            self.__updateButton.clicked.connect(self.__downloadButtonClicked)
+            self.__downloadButton.clicked.connect(self.__downloadButtonClicked)
             self.__actionButtonsLayout.addWidget(self.__downloadButton)
             
             self.__downloadInstallButton = QToolButton(self)
@@ -404,7 +404,9 @@
         if self.__isDownloadInstall:
             self.__allDownloadedOk &= status
         
-        self.__pluginsToDownload.pop(0)
+        if len(self.__pluginsToDownload):
+            self.__pluginsToDownload.pop(0)
+        
         if len(self.__pluginsToDownload):
             self.__downloadPlugin()
         else:
--- a/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Tue Feb 08 14:15:48 2022 +0100
@@ -7,11 +7,12 @@
 Module implementing a dialog to show the results of the code style check.
 """
 
-import os
-import fnmatch
+import collections
 import copy
-import collections
+import fnmatch
 import json
+import os
+import time
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QCoreApplication
 from PyQt6.QtGui import QIcon
@@ -194,6 +195,7 @@
         self.__batch = False
         self.__finished = True
         self.__errorItem = None
+        self.__timenow = time.monotonic()
         
         self.__fileOrFileList = ""
         self.__forProject = False
@@ -860,6 +862,8 @@
             # now go through all the files
             self.progress = 0
             self.files.sort()
+            self.__timenow = time.monotonic()
+            
             if len(self.files) == 1:
                 self.__batch = False
                 self.mainWidget.setCurrentWidget(self.resultsTab)
@@ -1003,7 +1007,9 @@
         # reset the progress bar to the checked files
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(self.tr("Transferring data..."))
-        QApplication.processEvents()
+        if time.monotonic() - self.__timenow > 0.01:
+            QApplication.processEvents()
+            self.__timenow = time.monotonic()
         
         self.__finished = False
         self.styleCheckService.styleBatchCheck(argumentsList)
@@ -1124,7 +1130,9 @@
             row = self.progressList.row(fileItems[0])
             self.progressList.takeItem(row)
         
-        QApplication.processEvents()
+        if time.monotonic() - self.__timenow > 0.01:
+            QApplication.processEvents()
+            self.__timenow = time.monotonic()
     
     def __finish(self):
         """
--- a/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Tue Feb 08 14:15:48 2022 +0100
@@ -280,8 +280,8 @@
             self.__styleSample(colour, paper)
             for selItem in self.styleElementList.selectedItems():
                 style, substyle = self.__stylesForItem(selItem)
-                self.lexer.setPaper(colour, style, substyle)
-                selItem.setBackground(0, colour)
+                self.lexer.setPaper(paper, style, substyle)
+                selItem.setBackground(0, paper)
     
     @pyqtSlot()
     def on_allBackgroundColoursButton_clicked(self):
@@ -290,15 +290,15 @@
         selected lexer.
         """
         style, substyle = self.__currentStyles()
-        colour = QColorDialog.getColor(self.lexer.paper(style, substyle))
-        if colour.isValid():
-            paper = self.lexer.paper(style, substyle)
+        paper = QColorDialog.getColor(self.lexer.paper(style, substyle))
+        if paper.isValid():
+            colour = self.lexer.color(style, substyle)
             self.__styleSample(colour, paper)
             
             itm = self.styleElementList.topLevelItem(0)
             while itm is not None:
                 style, substyle = self.__stylesForItem(itm)
-                self.lexer.setPaper(colour, style, substyle)
+                self.lexer.setPaper(paper, style, substyle)
                 itm = self.styleElementList.itemBelow(itm)
             self.__styleAllItems()
     
--- a/eric7/Preferences/__init__.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Preferences/__init__.py	Tue Feb 08 14:15:48 2022 +0100
@@ -913,6 +913,7 @@
         "PySide6DocDir": "",
         "EricDocDir": "",
         "HelpViewerType": 0,    # internal help viewer
+        "Bookmarks": "[]",      # empty JSON list
     }
     
     # defaults for the web browser settings
--- a/eric7/Project/ProjectOthersBrowser.py	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Project/ProjectOthersBrowser.py	Tue Feb 08 14:15:48 2022 +0100
@@ -73,6 +73,8 @@
             self.tr('Open in Hex Editor'), self._openHexEditor)
         self.editPixmapAct = self.menu.addAction(
             self.tr('Open in Icon Editor'), self._editPixmap)
+        self.openInEditorAct = self.menu.addAction(
+            self.tr('Open in Editor'), self._openFileInEditor)
         self.menu.addSeparator()
         self.mimeTypeAct = self.menu.addAction(
             self.tr('Show Mime-Type'), self.__showMimeType)
@@ -162,6 +164,7 @@
                     itm = self.model().item(index)
                     if isinstance(itm, ProjectBrowserFileItem):
                         self.editPixmapAct.setVisible(itm.isPixmapFile())
+                        self.openInEditorAct.setVisible(itm.isSvgFile())
                         self.mimeTypeAct.setVisible(True)
                         self.menu.popup(self.mapToGlobal(coord))
                     elif isinstance(itm, ProjectBrowserDirectoryItem):
@@ -218,7 +221,7 @@
                 self.renameFileAct.setEnabled(False)
         else:
             self.vcsHelper.showContextMenu(menu, self.menuActions)
-        
+    
     def _editPixmap(self):
         """
         Protected slot to handle the open in icon editor popup menu entry.
@@ -261,7 +264,20 @@
                         self.sourceFile.emit(itm.fileName())
                     else:
                         QDesktopServices.openUrl(QUrl(itm.fileName()))
+    
+    def _openFileInEditor(self):
+        """
+        Protected slot to handle the Open in Editor menu action.
+        """
+        itmList = self.getSelectedItems()
         
+        for itm in itmList:
+            if (
+                isinstance(itm, ProjectBrowserFileItem) and
+                Utilities.MimeTypes.isTextFile(itm.fileName())
+            ):
+                self.sourceFile.emit(itm.fileName())
+    
     def __showMimeType(self):
         """
         Private slot to show the mime type of the selected entry.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Styles/eric7_Dark_Blue.qss	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,1526 @@
+/* ===================== QPalette ======================== */
+/* == This entry is handled by eric == */
+QPalette {
+  alternate-base: #0f0f12;
+  base: #3a3a3a;
+  text: #fcfcfc;
+  bright-text: #ffffff;
+  placeholder-text: #9d9d9d;
+  window: #1b1b20;
+  window-text: #fcfcfc;
+  tooltip-base: #383838;
+  tooltip-text: #fcfcfc;
+  button: #1b1b20;
+  button-text: #fcfcfc;
+  highlight: #4d7fbc;
+  highlighted-text: #e1e1e1;
+  link: #c6c6eb;
+  link-visited: #ebebc6
+}
+/* == End of eric specialties == */
+
+* {
+  outline: 0px;
+  color: #fcfcfc;
+  selection-background-color: #4d7fbc;
+  selection-color: #ffffff;
+}
+
+/* specific reset for elements inside QToolBar */
+QToolBar * {
+  margin: 0px;
+  padding: 0px;
+}
+
+QWidget, QStatusBar, QSvgWidget, QToolBar,
+QGroupBox, QHelpSearchQueryWidget, QHelpSearchResultWidget,
+QDesignerPropertyEditorInterface, QDesignerWidgetBoxInterface, QDesktopWidget,
+QDialog, QDialogButtonBox, QDesignerActionEditorInterface,
+QDesignerFormWindowInterface, QDesignerObjectInspectorInterface, 
+QAbstractButton, QAbstractSlider, QAbstractSpinBox, QAxWidget, QCalendarWidget,
+QComboBox, QMdiSubWindow, QMenu, QMenuBar,QDockWidget, QFocusFrame, QGLWidget,
+QToolBox, QLCDNumber , QSplitter, QStackedWidget, QMainWindow,
+QScrollArea, QAbstractScrollArea {
+    background-color: #1b1b20;
+}
+
+QWidget:disabled {
+  background-color: #1b1b20;
+  color: #9d9d9d;
+  selection-background-color: #4d7fbc;
+  selection-color: #e1e1e1;
+}
+
+QWidget::item:selected {
+  background-color: #4d7fbc;
+}
+
+/* ===================== QMainWindow ======================== */
+
+QMainWindow::separator {
+  background-color: #454564;
+  border: 0px solid #6b6b7e;
+  spacing: 0px;
+  padding: 1px;
+}
+
+QMainWindow::separator:hover {
+  background-color: #9b9bb5;
+}
+
+QMainWindow::separator:horizontal {
+  width: 5px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  image: url("${path}/dark_blue/toolbar_separator_vertical.svg");
+}
+
+QMainWindow::separator:vertical {
+  height: 5px;
+  margin-left: 2px;
+  margin-right: 2px;
+  image: url("${path}/dark_blue/toolbar_separator_horizontal.svg");
+}
+
+/* ===================== QComboxBox ======================== */
+
+QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QDoubleSpinBox, QComboBox,
+QDateEdit, QTimeEdit, QDateTimeEdit {
+  background-color: #3a3a3a;
+  border: 1px solid #6b6b7e;
+  border-radius: 4px;
+  padding-left: 4px;
+  padding-right: 4px;
+  min-height: 1em;
+}
+
+QComboBox::indicator {
+  border: none;
+  border-radius: 0;
+  border-width: 0px;
+  color: transparent;
+  background-color: transparent;
+  selection-color: transparent;
+  selection-background-color: transparent;
+}
+
+QComboBox::indicator:alternate {
+  background: #0f0f12;
+}
+
+QComboBox::indicator:checked {
+  image: url("${path}/dark_blue/combobox_checked.svg");
+}
+
+QComboBox::drop-down, QDateEdit::drop-down, QTimeEdit::drop-down,
+QDateTimeEdit::drop-down {
+  subcontrol-origin: padding;
+  subcontrol-position: top right;
+  width: 15px;
+  border-left-width: 0px;
+  border-left-style: solid;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-left-color: #242424;
+}
+
+QComboBox::drop-down:on {
+  top:1px;
+}
+
+QComboBox::drop-down {
+  subcontrol-origin: padding;
+  subcontrol-position: top right;
+  width: 20px;
+  border-left: 1px solid #6b6b7e;
+}
+
+QComboBox::down-arrow {
+  image: url("${path}/dark_blue/arrow_down_disabled.svg");
+  height: 14px;
+  width: 14px;
+}
+
+QComboBox::down-arrow:on,
+QComboBox::down-arrow:hover,
+QComboBox::down-arrow:focus {
+  image: url("${path}/dark_blue/arrow_down.svg");
+}
+
+
+QLineEdit[text=""] {
+  color: 9d9d9d;
+}
+
+/* ===================== QMenuBar ======================== */
+
+QMenuBar * {
+  background-color: #25252c;
+}
+
+QMenuBar::item {
+  color: #fcfcfc;
+  background-color: #1b1b20;
+  margin: 1px;
+  padding: 4px;
+}
+
+QMenuBar::item:selected {
+  padding: 4px;
+  background: transparent;
+  border: 0px solid #6b6b7e;
+  background-color: #4d7fbc;
+}
+
+QMenuBar::item:pressed {
+  padding: 4px;
+  border: 0px solid #6b6b7e;
+  background-color: #4d7fbc;
+  color: #fcfcfc;
+  margin-bottom: 0px;
+  padding-bottom: 0px;
+}
+
+/* ===================== QMenu ======================== */
+
+QMenu {
+  background-color: #25252c;
+  border: 1px solid #6b6b7e;
+  margin: 2px;
+  padding: 5px;
+}
+
+QMenu * {
+  background-color:#25252c;
+}
+
+QMenu::tearoff {
+  border-top: 2px dashed #6b6b7e;
+  border-bottom: 2px dashed #6b6b7e;
+  height: 0px;
+  margin-top: 3px;
+  margin-bottom: 3px;
+}
+
+QMenu::tearoff:selected {
+  border-top: 2px dashed #bbbbdc;
+  border-bottom: 2px dashed #bbbbdc;
+  background: #4d7fbc;
+  background-clip: margin;
+}
+
+QMenu::item:selected {
+  color: #fcfcfc;
+  border: 0px solid #6b6b7e;
+  background: #4d7fbc;
+}
+
+QMenu::item:checked {
+  color: #fcfcfc;
+  border: 1px solid #4d7fbc;
+  border-radius: 4px;
+  background: #2a2a32;
+}
+
+QMenu::separator {
+  height: 2px;
+  background: #6b6b7e;
+  margin: 5px;
+}
+
+QMenu::indicator {
+  width: 14px;
+  height: 14px;
+  spacing: 4px
+}
+
+/* non-exclusive indicator = check box style indicator (see
+   QActionGroup::setExclusive) */
+
+QMenu::indicator:non-exclusive:unchecked {
+  image: url("${path}/dark_blue/checkbox_unchecked.svg");
+}
+
+QMenu::indicator:non-exclusive:unchecked:hover,
+QMenu::indicator:non-exclusive:unchecked:focus,
+QMenu::indicator:non-exclusive:unchecked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_unchecked_focus.svg");
+}
+
+QMenu::indicator:non-exclusive:unchecked:disabled {
+  image: url("${path}/dark_blue/checkbox_unchecked_disabled.svg");
+}
+
+QMenu::indicator:non-exclusive:checked {
+  image: url("${path}/dark_blue/checkbox_checked.svg");
+}
+
+QMenu::indicator:non-exclusive:checked:hover,
+QMenu::indicator:non-exclusive:checked:focus,
+QMenu::indicator:non-exclusive:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_checked_focus.svg");
+}
+
+QMenu::indicator:non-exclusive:checked:disabled {
+  image: url("${path}/dark_blue/checkbox_checked_disabled.svg");
+}
+
+QMenu::indicator:non-exclusive:indeterminate {
+  image: url("${path}/dark_blue/checkbox_indeterminate.svg");
+}
+
+QMenu::indicator:non-exclusive:indeterminate:disabled {
+  image: url("${path}/dark_blue/checkbox_indeterminate_disabled.svg");
+}
+
+QMenu::indicator:non-exclusive:indeterminate:focus,
+QMenu::indicator:non-exclusive:indeterminate:hover,
+QMenu::indicator:non-exclusive:indeterminate:pressed {
+  image: url("${path}/dark_blue/checkbox_indeterminate_focus.svg");
+}
+
+/* exclusive indicator = radio button style indicator (see
+   QActionGroup::setExclusive) */
+
+QMenu::indicator:exclusive:unchecked {
+  image: url("${path}/dark_blue/radio_unchecked.svg");
+}
+
+QMenu::indicator:exclusive:unchecked:hover,
+QMenu::indicator:exclusive:unchecked:focus,
+QMenu::indicator:exclusive:unchecked:pressed {
+  border: none;
+  outline: none;
+  image: url("${path}/dark_blue/radio_unchecked_focus.svg");
+}
+
+QMenu::indicator:exclusive:unchecked:disabled {
+  image: url("${path}/dark_blue/radio_unchecked_disabled.svg");
+}
+
+QMenu::indicator:exclusive:checked {
+  border: none;
+  outline: none;
+  image: url("${path}/dark_blue/radio_checked.svg");
+}
+
+QMenu::indicator:exclusive:checked:hover,
+QMenu::indicator:exclusive:checked:focus,
+QMenu::indicator:exclusive:checked:pressed {
+  border: none;
+  outline: none;
+  image: url("${path}/dark_blue/radio_checked_focus.svg");
+}
+
+QMenu::indicator:exclusive:checked:disabled {
+  outline: none;
+  image: url("${path}/dark_blue/radio_checked_disabled.svg");
+}
+
+QMenu::right-arrow {
+  image: url("${path}/dark_blue/arrow_right.svg");
+  margin: 5px;
+  padding-left: 12px;
+  height: 10px;
+  width: 10px;
+}
+
+QMenu::right-arrow:disabled {
+  image: url("${path}/dark_blue/arrow_right_disabled.svg");
+}
+/* ===================== QProgressBar ======================== */
+
+QProgressBar {
+  min-height: 10px;
+  background: #3a3a3a;
+  border-radius: 1px;
+  text-align: center;
+  border: 1px solid #3a3a3a;
+  border-radius: 4px;
+}
+
+QProgressBar:chunk {
+  background-color:#355394;
+  border-radius: 4px;
+}
+
+/* ===================== QTabBar ======================== */
+
+QTabBar::tab {
+  border: 1px solid #242424;
+  color: #fcfcfc;
+  margin: 0px;
+  background: qlineargradient(
+    spread: pad, x1: 0, y1: 0, x2: 0, y2: 1,
+    stop: 0 #646464, stop: 1 #525252);
+}
+
+QTabBar::tab:selected, QTabBar::tab:hover {
+  border-style: solid;
+  border-color: #6c6cf5;
+  background: qlineargradient(
+    spread: pad, x1: 0, y1: 0, x2: 0, y2: 1,
+    stop: 0 #484848, stop: 1 #383838);
+}
+
+QTabBar::tab:top, QTabBar::tab:bottom {
+  padding: 3px 8px 3px 8px;
+}
+
+QTabBar::tab:left, QTabBar::tab:right {
+  padding: 8px 3px 8px 3px;
+}
+
+QTabBar::tab:top:selected {
+  border-width: 4px 0px 0px 0px;
+}
+
+QTabBar::tab:right:selected {
+  border-width: 0px 0px 0px 4px;
+}
+
+QTabBar::tab:bottom:selected {
+  border-width:0px 0px 4px 0px;
+}
+
+QTabBar::tab:left:selected {
+  border-width: 0px 4px 0px 0px;
+}
+
+QTabBar::tab:top:hover {
+  border-width: 2px 0px 0px 0px;
+}
+
+QTabBar::tab:right:hover {
+  border-width: 0px 0px 0px 2px;
+}
+
+QTabBar::tab:bottom:hover {
+  border-width:0px 0px 2px 0px;
+}
+
+QTabBar::tab:left:hover {
+  border-width: 0px 2px 0px 0px;
+}
+
+QTabBar::tab:first:top:selected, QTabBar::tab:first:top:hover,
+QTabBar::tab:first:bottom:selected, QTabBar::tab:first:bottom:hover {
+  border-left-width:1px;
+  border-left-color:#242424;
+}
+
+QTabBar::tab:first:left:selected, QTabBar::tab:first:left:hover,
+QTabBar::tab:first:right:selected, QTabBar::tab:first:right:hover {
+  border-top-width:1px;
+  border-top-color:#242424;
+}
+
+QTabBar::tab:last:top:selected, QTabBar::tab:last:top:hover,
+QTabBar::tab:last:bottom:selected, QTabBar::tab:last:bottom:hover {
+  border-right-width:1px;
+  border-right-color:#242424;
+}
+
+QTabBar::tab:last:left:selected, QTabBar::tab:last:left:hover,
+QTabBar::tab:last:right:selected, QTabBar::tab:last:right:hover {
+  border-bottom-width:1px;
+  border-bottom-color:#242424;
+}
+
+QTabBar QToolButton::left-arrow:enabled,
+QDockWidget QTabBar QToolButton::left-arrow:enabled {
+  image: url("${path}/dark_blue/arrow_left.svg");
+}
+
+QTabBar QToolButton::left-arrow:disabled,
+QDockWidget QTabBar QToolButton::left-arrow:disabled {
+  image: url("${path}/dark_blue/arrow_left_disabled.svg");
+}
+
+QTabBar QToolButton::right-arrow:enabled,
+QDockWidget QTabBar QToolButton::right-arrow:enabled {
+  image: url("${path}/dark_blue/arrow_right.svg");
+}
+
+QTabBar QToolButton::right-arrow:disabled,
+QDockWidget QTabBar QToolButton::right-arrow:disabled {
+  image: url("${path}/dark_blue/arrow_right_disabled.svg");
+}
+
+/* ===================== QTabWidget ======================== */
+
+QTabWidget >* {
+    background-color: #25252c;
+}
+
+QTabWidget::pane {
+  border:1px solid #6b6b7e;
+  alternate-background-color:#0f0f12;
+  gridline-color:#242424;
+  background:#3a3a3a;
+}
+QTabWidget::pane:selected {
+  background-color: #455364;
+  border: 1px solid #346792;
+}
+
+/* ===================== QStatusBar ======================== */
+
+QStatusBar::item{
+  border:0px solid #484848;
+  border-radius:3px;
+}
+
+/* ===================== QHeaderView ======================== */
+
+QHeaderView {
+  border: 0px transparent #6b6b7e;
+}
+
+QHeaderView::section {
+  background-color: #5a5a6b;
+  color: #fcfcfc;
+  border-radius: 0;
+  text-align: left;
+  font-size: 13px;
+}
+
+QHeaderView::section::horizontal {
+  padding-top: 0;
+  padding-bottom: 0;
+  padding-left: 4px;
+  padding-right: 4px;
+  border-left: 2px solid #242424;
+}
+
+QHeaderView::section::vertical {
+  padding-top: 0;
+  padding-bottom: 0;
+  padding-left: 4px;
+  padding-right: 4px;
+  border-top: 2px solid #242424;
+}
+
+QHeaderView[sortable="true"]::down-arrow {
+  background-color: #5a5a6b;
+  border: none;
+  height: 10px;
+  width: 10px;
+  padding-left: 2px;
+  padding-right: 2px;
+  image: url("${path}/dark_blue/arrow_down.svg");
+}
+
+QHeaderView[sortable="true"]::up-arrow {
+  background-color: #5a5a6b;
+  border: none;
+  height: 10px;
+  width: 10px;
+  padding-left: 2px;
+  padding-right: 2px;
+  image: url("${path}/dark_blue/arrow_up.svg");
+}
+
+/* ===================== QTreeView ======================== */
+
+QTreeView:branch:has-children:!has-siblings:closed,
+QTreeView:branch:closed:has-children:has-siblings {
+  border-image: none;
+  image: url("${path}/dark_blue/branch_closed.svg");
+}
+
+QTreeView:branch:open:has-children:!has-siblings,
+QTreeView:branch:open:has-children:has-siblings {
+  border-image: none;
+  image: url("${path}/dark_blue/branch_open.svg");
+}
+
+QTreeView:branch:has-children:!has-siblings:closed:hover,
+QTreeView:branch:closed:has-children:has-siblings:hover {
+  image: url("${path}/dark_blue/branch_closed_focus.svg");
+}
+
+QTreeView:branch:open:has-children:!has-siblings:hover,
+QTreeView:branch:open:has-children:has-siblings:hover {
+  image: url("${path}/dark_blue/branch_open_focus.svg");
+}
+
+QTreeView,
+QListView,
+QTableView,
+QColumnView {
+  background-color: #1b1b20; 
+  alternate-background-color: #0f0f12;
+  border: 1px solid #6b6b7e;
+  gridline-color: #6b6b7e;
+}
+
+QTreeView QLabel {
+  background-color: transparent; 
+}
+
+QTreeView::item:selected,
+QListView::item:selected,
+QTableView::item:selected,
+QColumnView::item:selected{
+  background-color: #4d7fbc;
+}
+
+QTreeView::item:hover,
+QListView::item:hover,
+QTableView::item:hover,
+QColumnView::item:hover {
+  background-color: #295e7f;
+}
+
+
+QTreeView::branch:closed:has-children{
+  margin: 4px;
+}
+
+QTreeView::branch:open:has-children {
+  margin:4px;
+}
+
+QTreeView::indicator:checked,
+QListView::indicator:checked,
+QTableView::indicator:checked,
+QColumnView::indicator:checked {
+  image: url("${path}/dark_blue/checkbox_checked.svg");
+}
+
+QTreeView::indicator:checked:hover,
+QTreeView::indicator:checked:focus,
+QTreeView::indicator:checked:pressed,
+QListView::indicator:checked:hover,
+QListView::indicator:checked:focus,
+QListView::indicator:checked:pressed,
+QTableView::indicator:checked:hover,
+QTableView::indicator:checked:focus,
+QTableView::indicator:checked:pressed,
+QColumnView::indicator:checked:hover,
+QColumnView::indicator:checked:focus,
+QColumnView::indicator:checked:pressed {
+  image: url("${path}/dark_blue/checkbox_checked_focus.svg");
+}
+
+QTreeView::indicator:unchecked,
+QListView::indicator:unchecked,
+QTableView::indicator:unchecked,
+QColumnView::indicator:unchecked {
+  image: url("${path}/dark_blue/checkbox_unchecked.svg");
+}
+
+QTreeView::indicator:unchecked:hover,
+QTreeView::indicator:unchecked:focus,
+QTreeView::indicator:unchecked:pressed,
+QListView::indicator:unchecked:hover,
+QListView::indicator:unchecked:focus,
+QListView::indicator:unchecked:pressed,
+QTableView::indicator:unchecked:hover,
+QTableView::indicator:unchecked:focus,
+QTableView::indicator:unchecked:pressed,
+QColumnView::indicator:unchecked:hover,
+QColumnView::indicator:unchecked:focus,
+QColumnView::indicator:unchecked:pressed {
+  image: url("${path}/dark_blue/checkbox_unchecked_focus.svg");
+}
+
+QTreeView::indicator:indeterminate,
+QListView::indicator:indeterminate,
+QTableView::indicator:indeterminate,
+QColumnView::indicator:indeterminate {
+  image: url("${path}/dark_blue/checkbox_indeterminate.svg");
+}
+
+QTreeView::indicator:indeterminate:hover,
+QTreeView::indicator:indeterminate:focus,
+QTreeView::indicator:indeterminate:pressed,
+QListView::indicator:indeterminate:hover,
+QListView::indicator:indeterminate:focus,
+QListView::indicator:indeterminate:pressed,
+QTableView::indicator:indeterminate:hover,
+QTableView::indicator:indeterminate:focus,
+QTableView::indicator:indeterminate:pressed,
+QColumnView::indicator:indeterminate:hover,
+QColumnView::indicator:indeterminate:focus,
+QColumnView::indicator:indeterminate:pressed {
+  image: url("${path}/dark_blue/checkbox_indeterminate_focus.svg");
+}
+
+QTableCornerButton::section {
+  background-color: #1b1b20;
+  border: 1px transparent #242424;
+  border-radius: 0px;
+}
+
+/* ===================== QSlider ======================== */
+
+QSlider::groove:horizontal {
+  background-color: #3a3a3a;
+  height: 6px;
+  border-radius: 2px;
+}
+
+QSlider::sub-page:horizontal {
+  background-color: #303058;
+  height: 6px;
+  border-radius: 4px;
+}
+
+QSlider::handle:horizontal {
+  background: #355394;
+  border: 3px solid #1b1b20;
+  width: 8px;
+  height: 8px;
+  margin: -8px 0px;
+  border-radius: 4px;
+}
+
+QSlider::handle:horizontal:hover {
+  background: #346aa1;
+}
+
+QSlider::groove:vertical {
+  background-color: #3a3a3a;
+  width: 6px;
+  border-radius: 2px;
+}
+
+QSlider::add-page:vertical{
+  background-color: #303058;
+  width: 6px;
+  border-radius: 4px;
+}
+
+QSlider::handle:vertical {
+  background: #355394;
+  border: 3px solid #1b1b20;
+  width: 8px;
+  height: 8px;
+  margin: 0 -8px;
+  border-radius: 4px;
+}
+
+QSlider::handle:vertical:hover {
+  background: #346aa1;
+}
+
+/* ===================== QScrollBar ======================== */
+
+QScrollBar:horizontal,
+QScrollBar:horizontal:disabled {
+  background: #3a3a3a;
+  padding: 0px;
+  max-height: 14px;
+  border: 1px solid #355394;
+  border-radius: 7px;
+  margin: 0px 12px 0px 12px
+}
+
+QScrollBar::handle:horizontal {
+  background: #355394;
+  min-width: 30px;
+  border-radius: 6px;
+}
+
+QScrollBar::handle:horizontal:hover {
+  background: #346aa1;
+}
+
+QScrollBar::handle:horizontal:pressed {
+  background:#346aa1;
+}
+
+QScrollBar::add-page:horizontal{
+  background:none;
+}
+
+QScrollBar::sub-page:horizontal{
+  background:none;
+}
+
+QScrollBar::add-line:horizontal {
+  border-image: url("${path}/dark_blue/arrow_right_disabled.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: right;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:horizontal:hover,
+QScrollBar::add-line:horizontal:on {
+  border-image: url("${path}/dark_blue/arrow_right.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: right;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:horizontal{
+  background:none;
+}
+
+
+QScrollBar::sub-line:horizontal {
+  border-image: url("${path}/dark_blue/arrow_left_disabled.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: left;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal:hover,
+QScrollBar::sub-line:horizontal:on {
+  border-image: url("${path}/dark_blue/arrow_left.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: left;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal{
+  background:none;
+}
+
+QScrollBar:vertical,
+QScrollBar:vertical:disabled {
+  background: #3a3a3a;
+  padding: 0px;
+  max-width: 14px;
+  border: 1px solid #355394;
+  border-radius: 7px;
+  margin: 12px 0px 12px 0px
+}
+
+QScrollBar::handle:vertical {
+  background: #355394;
+  min-height: 30px;
+  border-radius: 6px;
+}
+
+QScrollBar::handle:vertical:hover {
+  background: #346aa1;
+}
+
+QScrollBar::handle:vertical:pressed {
+  background: #346aa1;
+}
+
+QScrollBar::add-page:vertical{
+  background:none;
+}
+
+QScrollBar::sub-page:vertical{
+  background:none;
+}
+QScrollBar::add-line:vertical{
+  background:none;
+}
+
+QScrollBar::add-line:vertical {
+  border-image: url("${path}/dark_blue/arrow_down_disabled.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: bottom;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:vertical:hover,
+QScrollBar::add-line:vertical:on {
+  border-image: url("${path}/dark_blue/arrow_down.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: bottom;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:vertical{
+  background:none;
+}
+
+QScrollBar::sub-line:vertical {
+  border-image: url("${path}/dark_blue/arrow_up_disabled.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: top;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:vertical:hover,
+QScrollBar::sub-line:vertical:on {
+  border-image: url("${path}/dark_blue/arrow_up.svg");
+  height: 12px;
+  width: 12px;
+  subcontrol-position: top;
+  subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow:horizontal,
+QScrollBar::down-arrow:horizontal {
+  background: none;
+}
+
+QScrollBar::up-arrow:vertical,
+QScrollBar::down-arrow:vertical {
+  background: none;
+}
+
+
+/* ===================== QScrollArea ======================== */
+
+QScrollArea {
+  background-color: #1b1b20;
+  border: 1px solid #6b6b7e;
+}
+
+QScrollArea:disabled {
+  color: #9d9d9d;
+}
+
+QScrollArea QWidget QWidget:disabled {
+  background-color: #1b1b20;
+}
+
+QTabWidget QScrollArea QWidget{
+  background-color: #1b1b20;
+}
+
+/* ===================== QFrame ======================== */
+
+.QFrame {
+  border-radius: 2px;
+  border: 1px solid #6b6b7e;
+  /* No frame */
+  /* HLine */
+  /* VLine */
+}
+
+.QFrame[frameShape="0"] {
+  border-radius: 4px;
+  border: 1px transparent #6b6b7e;
+}
+
+.QFrame[frameShape="4"] {
+  max-height: 2px;
+  border: none;
+  background-color: #6b6b7e;
+}
+
+.QFrame[frameShape="5"] {
+  max-width: 2px;
+  border: none;
+  background-color: #6b6b7e;
+}
+
+/* ===================== QToolTip ======================== */
+
+QToolTip {
+  border: 1px solid #6b6b7e;
+  padding: 2px;
+  color: #fcfcfc;
+  background-color: #383838;
+}
+
+/* ===================== QSplitter ======================== */
+
+QSplitter {
+  spacing: 0px;
+  padding: 0px;
+  margin: 0px;
+}
+
+QSplitter::handle {
+  background-color: #454564;
+  border: 0px solid #6b6b7e;
+  spacing: 0px;
+  padding: 1px;
+  margin: 0px;
+}
+
+QSplitter::handle:hover {
+  background-color: #9b9bb5;
+}
+
+QSplitter::handle:horizontal {
+  width: 1px;
+}
+
+QSplitter::handle:vertical {
+  height: 1px;
+}
+
+/* ===================== QGraphicsView ======================== */
+
+QGraphicsView {
+  background-color: #3a3a3a;
+  border: 1px solid #6b6b7e;
+  color: #ffffff;
+  border-radius: 2px;
+}
+
+QGraphicsView:disabled {
+  background-color: #3a3a3a;
+  border: 1px solid #6b6b7e;
+  color: #555564;
+  border-radius: 2px;
+}
+
+QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected,
+QGraphicsView:pressed {
+  border: 1px solid #6b6b7e;
+}
+
+/* ===================== QToolBox ======================== */
+
+QToolBox {
+  padding: 0px;
+  border: 0px;
+  border: 1px solid #6b6b7e;
+}
+
+QToolBox:selected {
+  padding: 0px;
+  border: 1px solid #6b6b7e;
+}
+
+QToolBox::tab {
+  border: 1px solid #6b6b7e;
+  color: #fcfcfc;
+  background-color: #525252;
+}
+
+QToolBox::tab:disabled {
+  color: #9d9d9d;
+}
+
+QToolBox::tab:selected {
+  background-color: #383838;
+  border-bottom: 4px solid #6c6cf5;
+}
+
+QToolBox::tab:selected:disabled {
+  background-color: #9d9d9d;
+}
+
+QToolBox::tab:!selected {
+  background-color: #525252;
+}
+
+QToolBox::tab:!selected:disabled {
+  background-color: #9d9d9d;
+}
+
+QToolBox::tab:hover {
+  border-color: #6b6b7e;
+  border-bottom: 2px solid #6c6cf5;
+}
+
+QToolBox QScrollArea QWidget QWidget {
+  padding: 0px;
+  border: 0px;
+  background-color: #1b1b20;
+}
+
+/* ===================== QDockWidget ======================== */
+
+QDockWidget {
+  outline: 1px solid #455364;
+  background-color: #1b1b20;
+  border: 1px solid #6b6b7e;
+  border-radius: 2px;
+  titlebar-close-icon: url("${path}/dark_blue/transparent.svg");
+  titlebar-normal-icon: url("${path}/dark_blue/transparent.svg");
+}
+
+QDockWidget::title {
+  padding: 3px;
+  spacing: 4px;
+  border: none;
+  background-color: #454564;
+}
+
+QDockWidget::close-button {
+  icon-size: 12px;
+  border: none;
+  background: transparent;
+  background-image: transparent;
+  border: 0;
+  margin: 0;
+  padding: 0;
+  image: url("${path}/dark_blue/window_close.svg");
+}
+
+QDockWidget::close-button:hover {
+  image: url("${path}/dark_blue/window_close_focus.svg");
+}
+
+QDockWidget::close-button:pressed {
+  image: url("${path}/dark_blue/window_close_pressed.svg");
+}
+
+QDockWidget::float-button {
+  icon-size: 12px;
+  border: none;
+  background: transparent;
+  background-image: transparent;
+  border: 0;
+  margin: 0;
+  padding: 0;
+  image: url("${path}/dark_blue/window_undock.svg");
+}
+
+QDockWidget::float-button:hover {
+  image: url("${path}/dark_blue/window_undock_focus.svg");
+}
+
+QDockWidget::float-button:pressed {
+  image: url("${path}/dark_blue/window_undock_pressed.svg");
+}
+
+/* ===================== QLCDNumber ======================== */
+
+QLCDNumber {
+  color: #c6c6eb;
+}
+
+QLCDNumber:disabled {
+  color: #9d9d9d;
+}
+
+/* ===================== QGroupBox ======================== */
+
+QGroupBox {
+  font-weight: bold;
+  border: 1px solid #6b6b7e;
+  border-radius: 2px;
+  padding: 2px;
+  margin-top: 6px;
+  margin-bottom: 4px;
+}
+
+QGroupBox::title {
+  subcontrol-origin: margin;
+  subcontrol-position: top left;
+  left: 4px;
+  padding-left: 2px;
+  padding-right: 4px;
+  padding-top: -4px;
+}
+
+QGroupBox::indicator {
+  margin-left: 2px;
+  margin-top: 2px;
+  padding: 0;
+  height: 14px;
+  width: 14px;
+  border-radius: 2px;
+}
+
+QGroupBox::indicator:unchecked {
+  image: url("${path}/dark_blue/checkbox_unchecked.svg");
+}
+
+QGroupBox::indicator:unchecked:hover,
+QGroupBox::indicator:unchecked:focus {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_unchecked_focus.svg");
+}
+
+QGroupBox::indicator:unchecked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_unchecked_pressed.svg");
+}
+
+QGroupBox::indicator:unchecked:disabled {
+  image: url("${path}/dark_blue/checkbox_unchecked_disabled.svg");
+}
+
+QGroupBox::indicator:checked {
+  image: url("${path}/dark_blue/checkbox_checked.svg");
+}
+
+QGroupBox::indicator:checked:hover,
+QGroupBox::indicator:checked:focus,
+QGroupBox::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_checked_focus.svg");
+}
+
+QGroupBox::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_checked_pressed.svg");
+}
+
+QGroupBox::indicator:checked:disabled {
+  image: url("${path}/dark_blue/checkbox_checked_disabled.svg");
+}
+
+/* ===================== QCheckBox ======================== */
+
+QCheckBox::indicator {
+  width: 14px;
+  height: 14px;
+}
+
+QCheckBox::indicator:unchecked {
+  image: url("${path}/dark_blue/checkbox_unchecked.svg");
+}
+
+QCheckBox::indicator:unchecked:hover,
+QCheckBox::indicator:unchecked:focus {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_unchecked_focus.svg");
+}
+
+QCheckBox::indicator:unchecked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_unchecked_pressed.svg");
+}
+
+QCheckBox::indicator:unchecked:disabled {
+  image: url("${path}/dark_blue/checkbox_unchecked_disabled.svg");
+}
+
+QCheckBox::indicator:indeterminate {
+  image: url("${path}/dark_blue/checkbox_indeterminate.svg");
+}
+
+QCheckBox::indicator:indeterminate:disabled {
+  image: url("${path}/dark_blue/checkbox_indeterminate_disabled.svg");
+}
+
+QCheckBox::indicator:indeterminate:focus,
+QCheckBox::indicator:indeterminate:hover {
+  image: url("${path}/dark_blue/checkbox_indeterminate_focus.svg");
+}
+
+QCheckBox::indicator:indeterminate:pressed {
+  image: url("${path}/dark_blue/checkbox_indeterminate_pressed.svg");
+}
+
+QCheckBox::indicator:checked {
+  image: url("${path}/dark_blue/checkbox_checked.svg");
+}
+
+QCheckBox::indicator:checked:hover,
+QCheckBox::indicator:checked:focus,
+QCheckBox::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_checked_focus.svg");
+}
+
+QCheckBox::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/checkbox_checked_pressed.svg");
+}
+
+QCheckBox::indicator:checked:disabled {
+  image: url("${path}/dark_blue/checkbox_checked_disabled.svg");
+}
+
+/* ===================== QRadioButton ======================== */
+
+QRadioButton::indicator {
+  width: 14px;
+  height: 14px;
+  border: none;
+}
+
+QRadioButton::indicator:checked {
+  image: url("${path}/dark_blue/radio_checked.svg");
+}
+
+QRadioButton::indicator:checked:hover,
+QRadioButton::indicator:checked:focus,
+QRadioButton::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/radio_checked_focus.svg");
+}
+
+QRadioButton::indicator:checked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/radio_checked_pressed.svg");
+}
+
+QRadioButton::indicator:checked:disabled {
+  image: url("${path}/dark_blue/radio_checked_disabled.svg");
+}
+
+QRadioButton::indicator:unchecked {
+  image: url("${path}/dark_blue/radio_unchecked.svg");
+}
+
+QRadioButton::indicator:unchecked:hover,
+QRadioButton::indicator:unchecked:focus {
+  border: none;
+  image: url("${path}/dark_blue/radio_unchecked_focus.svg");
+}
+
+QRadioButton::indicator:unchecked:pressed {
+  border: none;
+  image: url("${path}/dark_blue/radio_unchecked_pressed.svg");
+}
+
+QRadioButton::indicator:unchecked:disabled {
+  image: url("${path}/dark_blue/radio_unchecked_disabled.svg");
+}
+
+/* ===================== QAbstractSpinBox ======================== */
+
+QAbstractSpinBox {
+  background-color: #3a3a3a;
+  border: 1px solid #6b6b7e;
+  color: #e0e1e3;
+  padding-top: 2px;
+  padding-bottom: 2px;
+  padding-left: 4px;
+  padding-right: 4px;
+  border-radius: 4px;
+}
+
+QAbstractSpinBox:up-button {
+  background-color: #1b1b20;
+  subcontrol-origin: border;
+  subcontrol-position: top right;
+  border: 1px solid #6b6b7e;
+  border-bottom: 1px solid #6b6b7e;
+  border-top-left-radius: 0;
+  border-top-right-radius: 4;
+  border-bottom-left-radius: 0;
+  width: 12px;
+  margin-bottom: -1px;
+}
+
+QAbstractSpinBox:down-button {
+  background-color: #1b1b20;
+  subcontrol-origin: border;
+  subcontrol-position: bottom right;
+  border: 1px solid #6b6b7e;
+  border-top: 1px solid #6b6b7e;
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 4;
+  width: 12px;
+  margin-top: -1px;
+}
+
+QAbstractSpinBox::up-arrow {
+  image: url("${path}/dark_blue/arrow_up.svg");
+  height: 10px;
+  width: 10px;
+}
+
+QAbstractSpinBox::up-arrow:disabled,
+QAbstractSpinBox::up-arrow:off {
+  image: url("${path}/dark_blue/arrow_up_disabled.svg");
+}
+
+QAbstractSpinBox::down-arrow {
+  image: url("${path}/dark_blue/arrow_down.svg");
+  height: 10px;
+  width: 10px;
+}
+
+QAbstractSpinBox::down-arrow:disabled,
+QAbstractSpinBox::down-arrow:off {
+  image: url("${path}/dark_blue/arrow_down_disabled.svg");
+}
+
+/* ===================== QToolButton ======================== */
+
+QToolButton {
+  background-color: #2a2a32;
+  border: 1px solid #6b6b7e;
+  border-radius: 4px;
+  padding: 2px;
+}
+
+QToolButton:checked {
+  background-color: #565666;
+  border: 1px solid #6b6b7e;
+}
+
+QToolButton:checked:disabled {
+  background-color: #565666;
+  color: #9d9d9d;
+  border: 1px solid #6b6b7e;
+}
+
+
+QToolButton:hover {
+  background-color: #40404c;
+}
+
+QToolButton:pressed {
+  background-color: #202026;
+  border: 1px solid #6b6b7e;
+}
+
+QToolButton[popupMode="0"] {
+  /* Only for DelayedPopup */
+  padding-right: 2px;
+}
+
+QToolButton[popupMode="1"] {
+  /* Only for MenuButtonPopup */
+  padding-right: 20px;
+}
+
+QToolButton[popupMode="1"]::menu-button {
+  border: none;
+}
+
+QToolButton[popupMode="1"]::menu-button:hover {
+  border: none;
+  border-left: 1px solid #6b6b7e;
+  border-radius: 0;
+}
+
+QToolButton[popupMode="2"] {
+  /* Only for InstantPopup */
+  padding-right: 2px;
+}
+
+QToolButton::menu-button {
+  image: url("${path}/dark_blue/arrow_down.svg");
+  padding: 2px;
+  border-radius: 4px;
+  width: 12px;
+  border: 1px solid #6b6b7e;
+  outline: none;
+}
+
+QToolButton::menu-button:hover {
+  border: 1px solid #346792;
+}
+
+QToolButton::menu-button:checked:hover {
+  border: 1px solid #346792;
+}
+
+QToolButton::menu-indicator {
+  image: url("${path}/dark_blue/arrow_down.svg");
+  height: 6px;
+  width: 6px;
+  top: 0;
+  /* Exclude a shift for better image */
+  left: -2px;
+  /* Shift it a bit */
+}
+
+QToolButton::menu-arrow {
+  image: url("${path}/dark_blue/arrow_down.svg");
+  height: 8px;
+  width: 8px;
+}
+
+QToolButton::menu-arrow:hover {
+  image: url("${path}/dark_blue/arrow_down_focus.svg");
+}
+
+/* ===================== QPushButton ======================== */
+
+QPushButton {
+  background-color: #2a2a32;
+  border: 1px solid #6b6b7e;
+  border-radius: 4px;
+  padding: 2px;
+}
+
+QPushButton:default {
+  border: 2px solid #355394;
+}
+
+QPushButton:checked {
+  background-color: #565666;
+  border: 1px solid #6b6b7e;
+}
+
+QPushButton:checked:disabled {
+  background-color: #565666;
+  color: #9d9d9d;
+  border: 1px solid #6b6b7e;
+}
+
+QPushButton:hover {
+  background-color: #40404c;
+}
+
+QPushButton:pressed {
+    background-color: #202026;
+    border: 1px solid #6b6b7e;
+}
+
+QPushButton::menu-indicator {
+  subcontrol-origin: padding;
+  subcontrol-position: bottom right;
+  bottom: 4px;
+}
+
+QDialogButtonBox QPushButton {
+  min-width: 80px;
+}
+
+/* ===================== QSizeGrip ======================== */
+
+QSizeGrip {
+  background: transparent;
+  width: 20px;
+  height: 20px;
+  image: url("${path}/dark_blue/window_grip.svg");
+}
+
+/* ===================== QToolBar ======================== */
+
+QToolBar {
+  border-bottom: 1px solid #6b6b7e;
+  padding: 1px;
+  font-weight: bold;
+  spacing: 2px;
+}
+
+QToolBar::handle:horizontal {
+  width: 16px;
+  image: url("${path}/dark_blue/toolbar_move_horizontal.svg");
+}
+
+QToolBar::handle:vertical {
+  height: 16px;
+  image: url("${path}/dark_blue/toolbar_move_vertical.svg");
+}
+
+QToolBar::separator:horizontal {
+  width: 8px;
+  image: url("${path}/dark_blue/toolbar_separator_horizontal.svg");
+}
+
+QToolBar::separator:vertical {
+  height: 8px;
+  image: url("${path}/dark_blue/toolbar_separator_vertical.svg");
+}
+
+QToolButton#qt_toolbar_ext_button {
+  image: url("${path}/dark_blue/arrow_right.svg");
+}
+
+QToolBar QToolButton, QToolButton:pressed {
+  border: none
+}
+
+/* ===================== QCommandLinkButton ======================== */
+
+QCommandLinkButton {
+  background-color: transparent;
+  border: 1px solid #6b6b7e;
+  border-radius: 4px;
+  padding: 0px;
+  margin: 0px;
+}
+
+QCommandLinkButton:disabled {
+  background-color: transparent;
+  color: #9da9b5;
+}
--- a/eric7/Styles/eric7_Dark_Green.ehj	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Styles/eric7_Dark_Green.ehj	Tue Feb 08 14:15:48 2022 +0100
@@ -1,7 +1,7 @@
 {
   "header": {
     "comment": "eric highlighting styles file",
-    "saved": "2021-12-22, 19:38:12",
+    "saved": "2022-01-09, 16:46:26",
     "author": "detlev@die-offenbachs.de"
   },
   "lexers": [
@@ -13,7 +13,7 @@
           "style": 0,
           "substyle": -1,
           "color": "#ffffff",
-          "paper": "#262626",
+          "paper": "#1b201b",
           "font": "DejaVu Sans Mono,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1",
           "eolfill": false,
           "words": ""
@@ -8344,7 +8344,7 @@
           "substyle": -1,
           "color": "#f000f0",
           "paper": "#1b201b",
-          "font": "Courier 10 Pitch,9,-1,5,400,1,0,0,0,0,0,0,0,0,0,1,Italic",
+          "font": "Courier 10 Pitch,9,-1,5,400,1,0,0,0,0,0,0,0,0,0,1",
           "eolfill": false,
           "words": ""
         },
--- a/eric7/Styles/eric7_Dark_Green.qss	Tue Jan 04 15:38:11 2022 +0100
+++ b/eric7/Styles/eric7_Dark_Green.qss	Tue Feb 08 14:15:48 2022 +0100
@@ -2,7 +2,7 @@
 /* == This entry is handled by eric == */
 QPalette {
   alternate-base: #0f120f;
-  base: #444444;
+  base: #3a3a3a;
   text: #fcfcfc;
   bright-text: #ffffff;
   placeholder-text: #9d9d9d;
@@ -12,7 +12,7 @@
   tooltip-text: #fcfcfc;
   button: #1b201b;
   button-text: #fcfcfc;
-  highlight: #509330;
+  highlight: #407540;
   highlighted-text: #e1e1e1;
   link: #c6ebc6;
   link-visited: #ebebc6
@@ -22,7 +22,7 @@
 * {
   outline: 0px;
   color: #fcfcfc;
-  selection-background-color: #509330;
+  selection-background-color: #407540;
   selection-color: #ffffff;
 }
 
@@ -47,12 +47,12 @@
 QWidget:disabled {
   background-color: #1b201b;
   color: #9d9d9d;
-  selection-background-color: #509330;
+  selection-background-color: #407540;
   selection-color: #e1e1e1;
 }
 
 QWidget::item:selected {
-  background-color: #509330;
+  background-color: #407540;
 }
 
 /* ===================== QMainWindow ======================== */
@@ -86,7 +86,7 @@
 
 QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QDoubleSpinBox, QComboBox,
 QDateEdit, QTimeEdit, QDateTimeEdit {
-  background-color: #444444;
+  background-color: #3a3a3a;
   border: 1px solid #6b7e6b;
   border-radius: 4px;
   padding-left: 4px;
@@ -169,13 +169,13 @@
   padding: 4px;
   background: transparent;
   border: 0px solid #6b7e6b;
-  background-color: #509330;
+  background-color: #407540;
 }
 
 QMenuBar::item:pressed {
   padding: 4px;
   border: 0px solid #6b7e6b;
-  background-color: #509330;
+  background-color: #407540;
   color: #fcfcfc;
   margin-bottom: 0px;
   padding-bottom: 0px;
@@ -205,19 +205,19 @@
 QMenu::tearoff:selected {
   border-top: 2px dashed #bbdcbb;
   border-bottom: 2px dashed #bbdcbb;
-  background: #509330;
+  background: #407540;
   background-clip: margin;
 }
 
 QMenu::item:selected {
   color: #fcfcfc;
   border: 0px solid #6b7e6b;
-  background: #509330;
+  background: #407540;
 }
 
 QMenu::item:checked {
   color: #fcfcfc;
-  border: 1px solid #509330;
+  border: 1px solid #407540;
   border-radius: 4px;
   background: #2a322a;
 }
@@ -334,10 +334,10 @@
 
 QProgressBar {
   min-height: 10px;
-  background: #444444;
+  background: #3a3a3a;
   border-radius: 1px;
   text-align: center;
-  border: 1px solid #444444;
+  border: 1px solid #3a3a3a;
   border-radius: 4px;
 }
 
@@ -459,7 +459,7 @@
   border:1px solid #6b7e6b;
   alternate-background-color:#0f120f;
   gridline-color:#242424;
-  background:#444444;
+  background:#3a3a3a;
 }
 QTabWidget::pane:selected {
   background-color: #455364;
@@ -565,7 +565,7 @@
 QListView::item:selected,
 QTableView::item:selected,
 QColumnView::item:selected{
-  background-color: #509330;
+  background-color: #407540;
 }
 
 QTreeView::item:hover,
@@ -659,7 +659,7 @@
 /* ===================== QSlider ======================== */
 
 QSlider::groove:horizontal {
-  background-color: #444444;
+  background-color: #3a3a3a;
   height: 6px;
   border-radius: 2px;
 }
@@ -684,7 +684,7 @@
 }
 
 QSlider::groove:vertical {
-  background-color: #444444;
+  background-color: #3a3a3a;
   width: 6px;
   border-radius: 2px;
 }
@@ -712,10 +712,11 @@
 
 QScrollBar:horizontal,
 QScrollBar:horizontal:disabled {
-  background: #444444;
+  background: #3a3a3a;
   padding: 0px;
-  max-height: 12px;
-  border-radius: 4py;
+  max-height: 14px;
+  border: 1px solid #467e2a;
+  border-radius: 7px;
   margin: 0px 12px 0px 12px
 }
 
@@ -786,9 +787,11 @@
 
 QScrollBar:vertical,
 QScrollBar:vertical:disabled {
-  background: #444444;
+  background: #3a3a3a;
   padding: 0px;
-  max-width: 12px;
+  max-width: 14px;
+  border: 1px solid #467e2a;
+  border-radius: 7px;
   margin: 12px 0px 12px 0px
 }
 
@@ -952,14 +955,14 @@
 /* ===================== QGraphicsView ======================== */
 
 QGraphicsView {
-  background-color: #444444;
+  background-color: #3a3a3a;
   border: 1px solid #6b7e6b;
   color: #ffffff;
   border-radius: 2px;
 }
 
 QGraphicsView:disabled {
-  background-color: #444444;
+  background-color: #3a3a3a;
   border: 1px solid #6b7e6b;
   color: #556455;
   border-radius: 2px;
@@ -1024,7 +1027,7 @@
 /* ===================== QDockWidget ======================== */
 
 QDockWidget {
-  outline: 1px solid #455364;
+  outline: 1px solid #476444;
   background-color: #1b201b;
   border: 1px solid #6b7e6b;
   border-radius: 2px;
@@ -1268,9 +1271,9 @@
 /* ===================== QAbstractSpinBox ======================== */
 
 QAbstractSpinBox {
-  background-color: #444444;
+  background-color: #3a3a3a;
   border: 1px solid #6b7e6b;
-  color: #E0E1E3;
+  color: #e0e3e1;
   padding-top: 2px;
   padding-bottom: 2px;
   padding-left: 4px;
@@ -1332,7 +1335,7 @@
   background-color: #2a322a;
   border: 1px solid #6b7e6b;
   border-radius: 4px;
-  padding: 1px;
+  padding: 2px;
 }
 
 QToolButton:checked {
@@ -1391,11 +1394,11 @@
 }
 
 QToolButton::menu-button:hover {
-  border: 1px solid #346792;
+  border: 1px solid #539236;
 }
 
 QToolButton::menu-button:checked:hover {
-  border: 1px solid #346792;
+  border: 1px solid #539236;
 }
 
 QToolButton::menu-indicator {
@@ -1427,6 +1430,10 @@
   padding: 2px;
 }
 
+QPushButton:default {
+  border: 2px solid #467e2a;
+}
+
 QPushButton:checked {
   background-color: #566656;
   border: 1px solid #6b7e6b;
@@ -1500,7 +1507,7 @@
 }
 
 QToolBar QToolButton, QToolButton:pressed {
-    border: none
+  border: none
 }
 
 /* ===================== QCommandLinkButton ======================== */
@@ -1515,5 +1522,5 @@
 
 QCommandLinkButton:disabled {
   background-color: transparent;
-  color: #9DA9B5;
+  color: #9db5a9;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Themes/dark_blue.ethj	Tue Feb 08 14:15:48 2022 +0100
@@ -0,0 +1,2480 @@
+{
+  "colors": {
+    "Debugger/BgColorChanged": "#2870ff66",
+    "Debugger/BgColorNew": "#28ffeeaa",
+    "Diff/AddedColor": "#47934a",
+    "Diff/BadWhitespaceColor": "#c0ab0000",
+    "Diff/ContextColor": "#c19850",
+    "Diff/HeaderColor": "#989542",
+    "Diff/RemovedColor": "#bd4242",
+    "Diff/ReplacedColor": "#565db6",
+    "Diff/TextColor": "#ffffff",
+    "Editor/Colour/AnnotationsErrorBackground": "#ffd0d0",
+    "Editor/Colour/AnnotationsErrorForeground": "#600000",
+    "Editor/Colour/AnnotationsStyleBackground": "#d0d0ff",
+    "Editor/Colour/AnnotationsStyleForeground": "#000060",
+    "Editor/Colour/AnnotationsWarningBackground": "#ffffd0",
+    "Editor/Colour/AnnotationsWarningForeground": "#606000",
+    "Editor/Colour/BookmarksMap": "#f8c700",
+    "Editor/Colour/BreakpointsMap": "#f55c07",
+    "Editor/Colour/CallTipsBackground": "#4f4f4f",
+    "Editor/Colour/CallTipsForeground": "#ffffff",
+    "Editor/Colour/CallTipsHighlight": "#00dac1",
+    "Editor/Colour/CaretForeground": "#ffffff",
+    "Editor/Colour/CaretLineBackground": "#cecece",
+    "Editor/Colour/ChangesMap": "#00b000",
+    "Editor/Colour/CoverageMap": "#ad3636",
+    "Editor/Colour/CurrentMap": "#000000",
+    "Editor/Colour/CurrentMarker": "#646400",
+    "Editor/Colour/Edge": "#704b70",
+    "Editor/Colour/EditAreaBackground": "#232627",
+    "Editor/Colour/EditAreaForeground": "#fcfcfc",
+    "Editor/Colour/ErrorMarker": "#640000",
+    "Editor/Colour/ErrorsMap": "#dd0000",
+    "Editor/Colour/FoldMarkersBackground": "#ffffff",
+    "Editor/Colour/FoldMarkersForeground": "#ffffff",
+    "Editor/Colour/FoldmarginBackground": "#957d5f",
+    "Editor/Colour/HighlightMarker": "#200000ff",
+    "Editor/Colour/IndentationGuidesBackground": "#1b201b",
+    "Editor/Colour/IndentationGuidesForeground": "#dfdfdf",
+    "Editor/Colour/MarginsBackground": "#646464",
+    "Editor/Colour/MarginsForeground": "#ffffff",
+    "Editor/Colour/MarkerMapBackground": "#676767",
+    "Editor/Colour/MatchingBrace": "#009900",
+    "Editor/Colour/MatchingBraceBack": "#ffaa7f",
+    "Editor/Colour/NonmatchingBrace": "#ff0000",
+    "Editor/Colour/NonmatchingBraceBack": "#ffffff",
+    "Editor/Colour/OnlineChangeTraceMarkerSaved": "#68c368",
+    "Editor/Colour/OnlineChangeTraceMarkerUnsaved": "#e67b7b",
+    "Editor/Colour/SearchMarkers": "#00d4ff",
+    "Editor/Colour/SearchMarkersMap": "#0000ff",
+    "Editor/Colour/SelectionBackground": "#805b5bb0",
+    "Editor/Colour/SelectionForeground": "#ffffff",
+    "Editor/Colour/SpellingMarkers": "#ff6161",
+    "Editor/Colour/TasksMap": "#2278f8",
+    "Editor/Colour/VcsConflictMarkersMap": "#dd00dd",
+    "Editor/Colour/WarningsMap": "#939300",
+    "Editor/Colour/WhitespaceBackground": "#1b201b",
+    "Editor/Colour/WhitespaceForeground": "#dfdfdf",
+    "IRC/ChannelInfoColour": "#9e54b3",
+    "IRC/ChannelMessageColour": "#000000",
+    "IRC/ErrorMessageColour": "#ff0000",
+    "IRC/HyperlinkColour": "#0000ff",
+    "IRC/IrcColor0": "#ffff00",
+    "IRC/IrcColor1": "#000000",
+    "IRC/IrcColor10": "#008080",
+    "IRC/IrcColor11": "#00ffff",
+    "IRC/IrcColor12": "#0000ff",
+    "IRC/IrcColor13": "#ffc0cb",
+    "IRC/IrcColor14": "#a0a0a0",
+    "IRC/IrcColor15": "#c0c0c0",
+    "IRC/IrcColor2": "#000080",
+    "IRC/IrcColor3": "#008000",
+    "IRC/IrcColor4": "#ff0000",
+    "IRC/IrcColor5": "#a52a2a",
+    "IRC/IrcColor6": "#800080",
+    "IRC/IrcColor7": "#ff8000",
+    "IRC/IrcColor8": "#808000",
+    "IRC/IrcColor9": "#00ff00",
+    "IRC/JoinChannelColour": "#72d672",
+    "IRC/LeaveChannelColour": "#b00000",
+    "IRC/MarkerLineBackgroundColour": "#7f7f00",
+    "IRC/MarkerLineForegroundColour": "#ffffff",
+    "IRC/NetworkMessageColour": "#5f69fc",
+    "IRC/NickColour": "#18b33c",
+    "IRC/OwnNickColour": "#000000",
+    "IRC/ServerMessageColour": "#91640a",
+    "IRC/TimestampColour": "#709070",
+    "Project/Colour/Highlighted": "#e1a4ff",
+    "Project/Colour/VcsAdded": "#005e98",
+    "Project/Colour/VcsConflict": "#880000",
+    "Project/Colour/VcsModified": "#7c7c00",
+    "Project/Colour/VcsRemoved": "#8f008f",
+    "Project/Colour/VcsReplaced": "#4f8783",
+    "Project/Colour/VcsUpdate": "#008100",
+    "Python/ASTViewerErrorColor": "#ff7f7f",
+    "Python/DisViewerCurrentColor": "#ff7fff",
+    "Python/DisViewerErrorColor": "#ff7f7f",
+    "Python/DisViewerLabeledColor": "#7fff7f",
+    "Scintilla/Bash/defaultcolor": 2303527,
+    "Scintilla/Bash/defaultpaper": 16579836,
+    "Scintilla/Bash/style0/color": 16777215,
+    "Scintilla/Bash/style0/paper": 1776416,
+    "Scintilla/Bash/style1/color": 16776960,
+    "Scintilla/Bash/style1/paper": 16711680,
+    "Scintilla/Bash/style10/color": 16777215,
+    "Scintilla/Bash/style10/paper": 10066271,
+    "Scintilla/Bash/style11/color": 16776960,
+    "Scintilla/Bash/style11/paper": 6576216,
+    "Scintilla/Bash/style12/color": 16777215,
+    "Scintilla/Bash/style12/paper": 11174313,
+    "Scintilla/Bash/style13/color": 16767230,
+    "Scintilla/Bash/style13/paper": 11174313,
+    "Scintilla/Bash/style2/color": 7654502,
+    "Scintilla/Bash/style2/paper": 1776416,
+    "Scintilla/Bash/style3/color": 51400,
+    "Scintilla/Bash/style3/paper": 1776416,
+    "Scintilla/Bash/style4/color": 6333951,
+    "Scintilla/Bash/style4/paper": 1776416,
+    "Scintilla/Bash/style5/color": 12801219,
+    "Scintilla/Bash/style5/paper": 1776416,
+    "Scintilla/Bash/style6/color": 12801219,
+    "Scintilla/Bash/style6/paper": 1776416,
+    "Scintilla/Bash/style7/color": 12235176,
+    "Scintilla/Bash/style7/paper": 1776416,
+    "Scintilla/Bash/style8/color": 16777215,
+    "Scintilla/Bash/style8/paper": 1776416,
+    "Scintilla/Bash/style9/color": 16777215,
+    "Scintilla/Bash/style9/paper": 6576216,
+    "Scintilla/Batch/defaultcolor": 2303527,
+    "Scintilla/Batch/defaultpaper": 16579836,
+    "Scintilla/Batch/style0/color": 16777215,
+    "Scintilla/Batch/style0/paper": 1776416,
+    "Scintilla/Batch/style1/color": 7654502,
+    "Scintilla/Batch/style1/paper": 1776416,
+    "Scintilla/Batch/style2/color": 6333951,
+    "Scintilla/Batch/style2/paper": 1776416,
+    "Scintilla/Batch/style3/color": 16777087,
+    "Scintilla/Batch/style3/paper": 6316128,
+    "Scintilla/Batch/style4/color": 13750528,
+    "Scintilla/Batch/style4/paper": 1776416,
+    "Scintilla/Batch/style5/color": 2867952,
+    "Scintilla/Batch/style5/paper": 1776416,
+    "Scintilla/Batch/style6/color": 13658323,
+    "Scintilla/Batch/style6/paper": 1776416,
+    "Scintilla/Batch/style7/color": 12235176,
+    "Scintilla/Batch/style7/paper": 1776416,
+    "Scintilla/C#/defaultcolor": 2303527,
+    "Scintilla/C#/defaultpaper": 16579836,
+    "Scintilla/C#/style0/color": 16777215,
+    "Scintilla/C#/style0/paper": 1776416,
+    "Scintilla/C#/style1/color": 7654502,
+    "Scintilla/C#/style1/paper": 1776416,
+    "Scintilla/C#/style10/color": 12235176,
+    "Scintilla/C#/style10/paper": 1776416,
+    "Scintilla/C#/style11/color": 12044236,
+    "Scintilla/C#/style11/paper": 1776416,
+    "Scintilla/C#/style12/color": 16777215,
+    "Scintilla/C#/style12/paper": 1776416,
+    "Scintilla/C#/style13/color": 5278790,
+    "Scintilla/C#/style13/paper": 14745568,
+    "Scintilla/C#/style14/color": 4161343,
+    "Scintilla/C#/style14/paper": 1776416,
+    "Scintilla/C#/style15/color": 7985273,
+    "Scintilla/C#/style15/paper": 1776416,
+    "Scintilla/C#/style16/color": 12044236,
+    "Scintilla/C#/style16/paper": 1776416,
+    "Scintilla/C#/style17/color": 5020415,
+    "Scintilla/C#/style17/paper": 1776416,
+    "Scintilla/C#/style18/color": 16744512,
+    "Scintilla/C#/style18/paper": 1776416,
+    "Scintilla/C#/style19/color": 12044236,
+    "Scintilla/C#/style19/paper": 1776416,
+    "Scintilla/C#/style2/color": 7654502,
+    "Scintilla/C#/style2/paper": 1776416,
+    "Scintilla/C#/style20/color": 12801219,
+    "Scintilla/C#/style20/paper": 1776416,
+    "Scintilla/C#/style21/color": 7654502,
+    "Scintilla/C#/style21/paper": 1776416,
+    "Scintilla/C#/style22/color": 7654502,
+    "Scintilla/C#/style22/paper": 1776416,
+    "Scintilla/C#/style23/color": 6658304,
+    "Scintilla/C#/style23/paper": 1776416,
+    "Scintilla/C#/style24/color": 7985273,
+    "Scintilla/C#/style24/paper": 1776416,
+    "Scintilla/C#/style25/color": 12607488,
+    "Scintilla/C#/style25/paper": 1776416,
+    "Scintilla/C#/style26/color": 12453887,
+    "Scintilla/C#/style26/paper": 1776416,
+    "Scintilla/C#/style27/color": 12044236,
+    "Scintilla/C#/style27/paper": 1776416,
+    "Scintilla/C#/style3/color": 7985273,
+    "Scintilla/C#/style3/paper": 1776416,
+    "Scintilla/C#/style4/color": 51400,
+    "Scintilla/C#/style4/paper": 1776416,
+    "Scintilla/C#/style5/color": 6333951,
+    "Scintilla/C#/style5/paper": 1776416,
+    "Scintilla/C#/style6/color": 12801219,
+    "Scintilla/C#/style6/paper": 1776416,
+    "Scintilla/C#/style64/color": 12632256,
+    "Scintilla/C#/style64/paper": 1776416,
+    "Scintilla/C#/style65/color": 9482384,
+    "Scintilla/C#/style65/paper": 1776416,
+    "Scintilla/C#/style66/color": 9482384,
+    "Scintilla/C#/style66/paper": 1776416,
+    "Scintilla/C#/style67/color": 13684944,
+    "Scintilla/C#/style67/paper": 1776416,
+    "Scintilla/C#/style68/color": 9482384,
+    "Scintilla/C#/style68/paper": 1776416,
+    "Scintilla/C#/style69/color": 9474224,
+    "Scintilla/C#/style69/paper": 1776416,
+    "Scintilla/C#/style7/color": 12801219,
+    "Scintilla/C#/style7/paper": 1776416,
+    "Scintilla/C#/style70/color": 11571376,
+    "Scintilla/C#/style70/paper": 1776416,
+    "Scintilla/C#/style71/color": 11571376,
+    "Scintilla/C#/style71/paper": 1776416,
+    "Scintilla/C#/style72/color": 12632256,
+    "Scintilla/C#/style72/paper": 1776416,
+    "Scintilla/C#/style73/color": 11579536,
+    "Scintilla/C#/style73/paper": 1776416,
+    "Scintilla/C#/style74/color": 11579568,
+    "Scintilla/C#/style74/paper": 1776416,
+    "Scintilla/C#/style75/color": 11579568,
+    "Scintilla/C#/style75/paper": 1776416,
+    "Scintilla/C#/style76/color": 16777215,
+    "Scintilla/C#/style76/paper": 1776416,
+    "Scintilla/C#/style77/color": 9482384,
+    "Scintilla/C#/style77/paper": 1776416,
+    "Scintilla/C#/style78/color": 8367999,
+    "Scintilla/C#/style78/paper": 1776416,
+    "Scintilla/C#/style79/color": 12632256,
+    "Scintilla/C#/style79/paper": 1776416,
+    "Scintilla/C#/style8/color": 12044236,
+    "Scintilla/C#/style8/paper": 1776416,
+    "Scintilla/C#/style80/color": 12632256,
+    "Scintilla/C#/style80/paper": 1776416,
+    "Scintilla/C#/style81/color": 12632256,
+    "Scintilla/C#/style81/paper": 1776416,
+    "Scintilla/C#/style82/color": 12632256,
+    "Scintilla/C#/style82/paper": 1776416,
+    "Scintilla/C#/style83/color": 11579568,
+    "Scintilla/C#/style83/paper": 1776416,
+    "Scintilla/C#/style84/color": 11571376,
+    "Scintilla/C#/style84/paper": 1776416,
+    "Scintilla/C#/style85/color": 9482384,
+    "Scintilla/C#/style85/paper": 1776416,
+    "Scintilla/C#/style86/color": 9482384,
+    "Scintilla/C#/style86/paper": 1776416,
+    "Scintilla/C#/style87/color": 10535056,
+    "Scintilla/C#/style87/paper": 1776416,
+    "Scintilla/C#/style88/color": 12632256,
+    "Scintilla/C#/style88/paper": 1776416,
+    "Scintilla/C#/style89/color": 14131344,
+    "Scintilla/C#/style89/paper": 1776416,
+    "Scintilla/C#/style9/color": 14868992,
+    "Scintilla/C#/style9/paper": 1776416,
+    "Scintilla/C#/style90/color": 12820943,
+    "Scintilla/C#/style90/paper": 1776416,
+    "Scintilla/C#/style91/color": 12044236,
+    "Scintilla/C#/style91/paper": 1776416,
+    "Scintilla/C++/defaultcolor": 2303527,
+    "Scintilla/C++/defaultpaper": 16579836,
+    "Scintilla/C++/style0/color": 16777215,
+    "Scintilla/C++/style0/paper": 1776416,
+    "Scintilla/C++/style1/color": 7654502,
+    "Scintilla/C++/style1/paper": 1776416,
+    "Scintilla/C++/style10/color": 12235176,
+    "Scintilla/C++/style10/paper": 1776416,
+    "Scintilla/C++/style11/color": 12044236,
+    "Scintilla/C++/style11/paper": 1776416,
+    "Scintilla/C++/style11/substyle0/paper": 1776416,
+    "Scintilla/C++/style12/color": 0,
+    "Scintilla/C++/style12/paper": 14729440,
+    "Scintilla/C++/style13/color": 5278790,
+    "Scintilla/C++/style13/paper": 14745568,
+    "Scintilla/C++/style14/color": 4161343,
+    "Scintilla/C++/style14/paper": 14741728,
+    "Scintilla/C++/style15/color": 7985273,
+    "Scintilla/C++/style15/paper": 1776416,
+    "Scintilla/C++/style16/color": 12044236,
+    "Scintilla/C++/style16/paper": 1776416,
+    "Scintilla/C++/style17/color": 5020415,
+    "Scintilla/C++/style17/paper": 1776416,
+    "Scintilla/C++/style17/substyle0/paper": 1776416,
+    "Scintilla/C++/style18/color": 16744512,
+    "Scintilla/C++/style18/paper": 1776416,
+    "Scintilla/C++/style19/color": 12044236,
+    "Scintilla/C++/style19/paper": 1776416,
+    "Scintilla/C++/style2/color": 7654502,
+    "Scintilla/C++/style2/paper": 1776416,
+    "Scintilla/C++/style20/color": 8323199,
+    "Scintilla/C++/style20/paper": 16774143,
+    "Scintilla/C++/style21/color": 5278790,
+    "Scintilla/C++/style21/paper": 14745568,
+    "Scintilla/C++/style22/color": 5278790,
+    "Scintilla/C++/style22/paper": 15204311,
+    "Scintilla/C++/style23/color": 6658304,
+    "Scintilla/C++/style23/paper": 1776416,
+    "Scintilla/C++/style24/color": 7985273,
+    "Scintilla/C++/style24/paper": 1776416,
+    "Scintilla/C++/style25/color": 12607488,
+    "Scintilla/C++/style25/paper": 1776416,
+    "Scintilla/C++/style26/color": 12453887,
+    "Scintilla/C++/style26/paper": 1776416,
+    "Scintilla/C++/style27/color": 12044236,
+    "Scintilla/C++/style27/paper": 1776416,
+    "Scintilla/C++/style3/color": 7985273,
+    "Scintilla/C++/style3/paper": 1776416,
+    "Scintilla/C++/style4/color": 51400,
+    "Scintilla/C++/style4/paper": 1776416,
+    "Scintilla/C++/style5/color": 6333951,
+    "Scintilla/C++/style5/paper": 1776416,
+    "Scintilla/C++/style6/color": 12801219,
+    "Scintilla/C++/style6/paper": 1776416,
+    "Scintilla/C++/style64/color": 12632256,
+    "Scintilla/C++/style64/paper": 1776416,
+    "Scintilla/C++/style65/color": 9482384,
+    "Scintilla/C++/style65/paper": 1776416,
+    "Scintilla/C++/style66/color": 9482384,
+    "Scintilla/C++/style66/paper": 1776416,
+    "Scintilla/C++/style67/color": 13684944,
+    "Scintilla/C++/style67/paper": 1776416,
+    "Scintilla/C++/style68/color": 9482384,
+    "Scintilla/C++/style68/paper": 1776416,
+    "Scintilla/C++/style69/color": 9474224,
+    "Scintilla/C++/style69/paper": 1776416,
+    "Scintilla/C++/style7/color": 12801219,
+    "Scintilla/C++/style7/paper": 1776416,
+    "Scintilla/C++/style70/color": 11571376,
+    "Scintilla/C++/style70/paper": 1776416,
+    "Scintilla/C++/style71/color": 11571376,
+    "Scintilla/C++/style71/paper": 1776416,
+    "Scintilla/C++/style72/color": 12632256,
+    "Scintilla/C++/style72/paper": 1776416,
+    "Scintilla/C++/style73/color": 11579536,
+    "Scintilla/C++/style73/paper": 1776416,
+    "Scintilla/C++/style74/color": 11579568,
+    "Scintilla/C++/style74/paper": 1776416,
+    "Scintilla/C++/style75/color": 11579568,
+    "Scintilla/C++/style75/paper": 1776416,
+    "Scintilla/C++/style75/substyle0/paper": 1776416,
+    "Scintilla/C++/style76/color": 0,
+    "Scintilla/C++/style76/paper": 14729440,
+    "Scintilla/C++/style77/color": 6716774,
+    "Scintilla/C++/style77/paper": 14745568,
+    "Scintilla/C++/style78/color": 5600597,
+    "Scintilla/C++/style78/paper": 14741728,
+    "Scintilla/C++/style79/color": 12632256,
+    "Scintilla/C++/style79/paper": 1776416,
+    "Scintilla/C++/style8/color": 12044236,
+    "Scintilla/C++/style8/paper": 1776416,
+    "Scintilla/C++/style80/color": 12632256,
+    "Scintilla/C++/style80/paper": 1776416,
+    "Scintilla/C++/style81/color": 12632256,
+    "Scintilla/C++/style81/paper": 1776416,
+    "Scintilla/C++/style81/substyle0/paper": 1776416,
+    "Scintilla/C++/style82/color": 12632256,
+    "Scintilla/C++/style82/paper": 1776416,
+    "Scintilla/C++/style83/color": 11579568,
+    "Scintilla/C++/style83/paper": 1776416,
+    "Scintilla/C++/style84/color": 11571376,
+    "Scintilla/C++/style84/paper": 16774143,
+    "Scintilla/C++/style85/color": 6716774,
+    "Scintilla/C++/style85/paper": 14745568,
+    "Scintilla/C++/style86/color": 6716774,
+    "Scintilla/C++/style86/paper": 15204311,
+    "Scintilla/C++/style87/color": 10535056,
+    "Scintilla/C++/style87/paper": 1776416,
+    "Scintilla/C++/style88/color": 12632256,
+    "Scintilla/C++/style88/paper": 1776416,
+    "Scintilla/C++/style89/color": 14131344,
+    "Scintilla/C++/style89/paper": 1776416,
+    "Scintilla/C++/style9/color": 14868992,
+    "Scintilla/C++/style9/paper": 1776416,
+    "Scintilla/C++/style90/color": 12820943,
+    "Scintilla/C++/style90/paper": 1776416,
+    "Scintilla/C++/style91/color": 12044236,
+    "Scintilla/C++/style91/paper": 1776416,
+    "Scintilla/CMake/defaultcolor": 2303527,
+    "Scintilla/CMake/defaultpaper": 16579836,
+    "Scintilla/CMake/style0/color": 16777215,
+    "Scintilla/CMake/style0/paper": 1776416,
+    "Scintilla/CMake/style1/color": 5233741,
+    "Scintilla/CMake/style1/paper": 1776416,
+    "Scintilla/CMake/style10/color": 65535,
+    "Scintilla/CMake/style10/paper": 1776416,
+    "Scintilla/CMake/style11/color": 65535,
+    "Scintilla/CMake/style11/paper": 1776416,
+    "Scintilla/CMake/style12/color": 65535,
+    "Scintilla/CMake/style12/paper": 1776416,
+    "Scintilla/CMake/style13/color": 13382400,
+    "Scintilla/CMake/style13/paper": 15658734,
+    "Scintilla/CMake/style14/color": 10551091,
+    "Scintilla/CMake/style14/paper": 1776416,
+    "Scintilla/CMake/style2/color": 5577301,
+    "Scintilla/CMake/style2/paper": 10263708,
+    "Scintilla/CMake/style3/color": 5577301,
+    "Scintilla/CMake/style3/paper": 10263708,
+    "Scintilla/CMake/style4/color": 5577301,
+    "Scintilla/CMake/style4/paper": 10263708,
+    "Scintilla/CMake/style5/color": 65535,
+    "Scintilla/CMake/style5/paper": 1776416,
+    "Scintilla/CMake/style6/color": 16749716,
+    "Scintilla/CMake/style6/paper": 1776416,
+    "Scintilla/CMake/style7/color": 16757349,
+    "Scintilla/CMake/style7/paper": 1776416,
+    "Scintilla/CMake/style8/color": 16711623,
+    "Scintilla/CMake/style8/paper": 1776416,
+    "Scintilla/CMake/style9/color": 65535,
+    "Scintilla/CMake/style9/paper": 1776416,
+    "Scintilla/CSS/defaultcolor": 2303527,
+    "Scintilla/CSS/defaultpaper": 16579836,
+    "Scintilla/CSS/style0/color": 16777215,
+    "Scintilla/CSS/style0/paper": 1776416,
+    "Scintilla/CSS/style1/color": 7733144,
+    "Scintilla/CSS/style1/paper": 1776416,
+    "Scintilla/CSS/style10/color": 56026,
+    "Scintilla/CSS/style10/paper": 1776416,
+    "Scintilla/CSS/style11/color": 16744448,
+    "Scintilla/CSS/style11/paper": 1776416,
+    "Scintilla/CSS/style12/color": 11184640,
+    "Scintilla/CSS/style12/paper": 1776416,
+    "Scintilla/CSS/style13/color": 16711935,
+    "Scintilla/CSS/style13/paper": 1776416,
+    "Scintilla/CSS/style14/color": 16711935,
+    "Scintilla/CSS/style14/paper": 1776416,
+    "Scintilla/CSS/style15/color": 47103,
+    "Scintilla/CSS/style15/paper": 1776416,
+    "Scintilla/CSS/style16/color": 16741749,
+    "Scintilla/CSS/style16/paper": 1776416,
+    "Scintilla/CSS/style17/color": 13172659,
+    "Scintilla/CSS/style17/paper": 1776416,
+    "Scintilla/CSS/style18/color": 14537416,
+    "Scintilla/CSS/style18/paper": 1776416,
+    "Scintilla/CSS/style19/color": 14537416,
+    "Scintilla/CSS/style19/paper": 1776416,
+    "Scintilla/CSS/style2/color": 16777215,
+    "Scintilla/CSS/style2/paper": 1776416,
+    "Scintilla/CSS/style20/color": 14537416,
+    "Scintilla/CSS/style20/paper": 1776416,
+    "Scintilla/CSS/style21/color": 14537416,
+    "Scintilla/CSS/style21/paper": 1776416,
+    "Scintilla/CSS/style22/color": 13092608,
+    "Scintilla/CSS/style22/paper": 1776416,
+    "Scintilla/CSS/style23/color": 14537416,
+    "Scintilla/CSS/style23/paper": 1776416,
+    "Scintilla/CSS/style3/color": 13394787,
+    "Scintilla/CSS/style3/paper": 1776416,
+    "Scintilla/CSS/style4/color": 16757853,
+    "Scintilla/CSS/style4/paper": 1776416,
+    "Scintilla/CSS/style5/color": 16777215,
+    "Scintilla/CSS/style5/paper": 1776416,
+    "Scintilla/CSS/style6/color": 8497663,
+    "Scintilla/CSS/style6/paper": 1776416,
+    "Scintilla/CSS/style7/color": 16711680,
+    "Scintilla/CSS/style7/paper": 1776416,
+    "Scintilla/CSS/style8/color": 16749244,
+    "Scintilla/CSS/style8/paper": 1776416,
+    "Scintilla/CSS/style9/color": 46080,
+    "Scintilla/CSS/style9/paper": 1776416,
+    "Scintilla/CoffeeScript/defaultcolor": 2303527,
+    "Scintilla/CoffeeScript/defaultpaper": 16579836,
+    "Scintilla/CoffeeScript/style0/color": 16777215,
+    "Scintilla/CoffeeScript/style0/paper": 1776416,
+    "Scintilla/CoffeeScript/style1/color": 7654502,
+    "Scintilla/CoffeeScript/style1/paper": 1776416,
+    "Scintilla/CoffeeScript/style10/color": 12235176,
+    "Scintilla/CoffeeScript/style10/paper": 1776416,
+    "Scintilla/CoffeeScript/style11/color": 12044236,
+    "Scintilla/CoffeeScript/style11/paper": 1776416,
+    "Scintilla/CoffeeScript/style12/color": 0,
+    "Scintilla/CoffeeScript/style12/paper": 14729440,
+    "Scintilla/CoffeeScript/style13/color": 5278790,
+    "Scintilla/CoffeeScript/style13/paper": 14745568,
+    "Scintilla/CoffeeScript/style14/color": 4161343,
+    "Scintilla/CoffeeScript/style14/paper": 14741728,
+    "Scintilla/CoffeeScript/style15/color": 7985273,
+    "Scintilla/CoffeeScript/style15/paper": 1776416,
+    "Scintilla/CoffeeScript/style16/color": 12044236,
+    "Scintilla/CoffeeScript/style16/paper": 1776416,
+    "Scintilla/CoffeeScript/style17/color": 5020415,
+    "Scintilla/CoffeeScript/style17/paper": 1776416,
+    "Scintilla/CoffeeScript/style18/color": 16744512,
+    "Scintilla/CoffeeScript/style18/paper": 1776416,
+    "Scintilla/CoffeeScript/style19/color": 12044236,
+    "Scintilla/CoffeeScript/style19/paper": 1776416,
+    "Scintilla/CoffeeScript/style2/color": 7654502,
+    "Scintilla/CoffeeScript/style2/paper": 1776416,
+    "Scintilla/CoffeeScript/style22/color": 7654502,
+    "Scintilla/CoffeeScript/style22/paper": 1776416,
+    "Scintilla/CoffeeScript/style23/color": 5614677,
+    "Scintilla/CoffeeScript/style23/paper": 1776416,
+    "Scintilla/CoffeeScript/style24/color": 7654502,
+    "Scintilla/CoffeeScript/style24/paper": 1776416,
+    "Scintilla/CoffeeScript/style25/color": 12607488,
+    "Scintilla/CoffeeScript/style25/paper": 1776416,
+    "Scintilla/CoffeeScript/style3/color": 7985273,
+    "Scintilla/CoffeeScript/style3/paper": 1776416,
+    "Scintilla/CoffeeScript/style4/color": 51400,
+    "Scintilla/CoffeeScript/style4/paper": 1776416,
+    "Scintilla/CoffeeScript/style5/color": 6333951,
+    "Scintilla/CoffeeScript/style5/paper": 1776416,
+    "Scintilla/CoffeeScript/style6/color": 12801219,
+    "Scintilla/CoffeeScript/style6/paper": 1776416,
+    "Scintilla/CoffeeScript/style7/color": 12801219,
+    "Scintilla/CoffeeScript/style7/paper": 1776416,
+    "Scintilla/CoffeeScript/style8/color": 12044236,
+    "Scintilla/CoffeeScript/style8/paper": 1776416,
+    "Scintilla/CoffeeScript/style9/color": 14868992,
+    "Scintilla/CoffeeScript/style9/paper": 1776416,
+    "Scintilla/Cython/defaultcolor": 2303527,
+    "Scintilla/Cython/defaultpaper": 16579836,
+    "Scintilla/Cython/style0/color": 16777215,
+    "Scintilla/Cython/style0/paper": 1776416,
+    "Scintilla/Cython/style1/color": 7654502,
+    "Scintilla/Cython/style1/paper": 1776416,
+    "Scintilla/Cython/style10/color": 12235176,
+    "Scintilla/Cython/style10/paper": 1776416,
+    "Scintilla/Cython/style11/color": 16777215,
+    "Scintilla/Cython/style11/paper": 1776416,
+    "Scintilla/Cython/style11/substyle0/paper": 1776416,
+    "Scintilla/Cython/style11/substyle1/paper": 1776416,
+    "Scintilla/Cython/style11/substyle2/paper": 1776416,
+    "Scintilla/Cython/style11/substyle3/paper": 1776416,
+    "Scintilla/Cython/style12/color": 2614580,
+    "Scintilla/Cython/style12/paper": 1776416,
+    "Scintilla/Cython/style13/color": 12434877,
+    "Scintilla/Cython/style13/paper": 1776416,
+    "Scintilla/Cython/style14/color": 7456511,
+    "Scintilla/Cython/style14/paper": 1776416,
+    "Scintilla/Cython/style15/color": 14912512,
+    "Scintilla/Cython/style15/paper": 1776416,
+    "Scintilla/Cython/style16/color": 12801219,
+    "Scintilla/Cython/style16/paper": 1776416,
+    "Scintilla/Cython/style17/color": 12801219,
+    "Scintilla/Cython/style17/paper": 1776416,
+    "Scintilla/Cython/style18/color": 14441050,
+    "Scintilla/Cython/style18/paper": 1776416,
+    "Scintilla/Cython/style19/color": 14441050,
+    "Scintilla/Cython/style19/paper": 1776416,
+    "Scintilla/Cython/style2/color": 51400,
+    "Scintilla/Cython/style2/paper": 1776416,
+    "Scintilla/Cython/style3/color": 12801219,
+    "Scintilla/Cython/style3/paper": 1776416,
+    "Scintilla/Cython/style4/color": 12801219,
+    "Scintilla/Cython/style4/paper": 1776416,
+    "Scintilla/Cython/style5/color": 6333951,
+    "Scintilla/Cython/style5/paper": 1776416,
+    "Scintilla/Cython/style6/color": 14441050,
+    "Scintilla/Cython/style6/paper": 1776416,
+    "Scintilla/Cython/style7/color": 14441050,
+    "Scintilla/Cython/style7/paper": 1776416,
+    "Scintilla/Cython/style8/color": 43775,
+    "Scintilla/Cython/style8/paper": 1776416,
+    "Scintilla/Cython/style9/color": 54741,
+    "Scintilla/Cython/style9/paper": 1776416,
+    "Scintilla/D/defaultcolor": 2303527,
+    "Scintilla/D/defaultpaper": 16579836,
+    "Scintilla/D/style0/color": 16777215,
+    "Scintilla/D/style0/paper": 1776416,
+    "Scintilla/D/style1/color": 65280,
+    "Scintilla/D/style1/paper": 1776416,
+    "Scintilla/D/style10/color": 16711935,
+    "Scintilla/D/style10/paper": 1776416,
+    "Scintilla/D/style11/color": 0,
+    "Scintilla/D/style11/paper": 14729440,
+    "Scintilla/D/style12/color": 16711935,
+    "Scintilla/D/style12/paper": 1776416,
+    "Scintilla/D/style13/color": 16777215,
+    "Scintilla/D/style13/paper": 1776416,
+    "Scintilla/D/style14/color": 12833753,
+    "Scintilla/D/style14/paper": 1776416,
+    "Scintilla/D/style15/color": 8315262,
+    "Scintilla/D/style15/paper": 1776416,
+    "Scintilla/D/style16/color": 7974911,
+    "Scintilla/D/style16/paper": 1776416,
+    "Scintilla/D/style17/color": 16750178,
+    "Scintilla/D/style17/paper": 1776416,
+    "Scintilla/D/style18/color": 13097182,
+    "Scintilla/D/style18/paper": 1776416,
+    "Scintilla/D/style19/color": 13097182,
+    "Scintilla/D/style19/paper": 1776416,
+    "Scintilla/D/style2/color": 65280,
+    "Scintilla/D/style2/paper": 1776416,
+    "Scintilla/D/style20/color": 13097182,
+    "Scintilla/D/style20/paper": 1776416,
+    "Scintilla/D/style21/color": 13097182,
+    "Scintilla/D/style21/paper": 1776416,
+    "Scintilla/D/style22/color": 13097182,
+    "Scintilla/D/style22/paper": 1776416,
+    "Scintilla/D/style3/color": 8315262,
+    "Scintilla/D/style3/paper": 1776416,
+    "Scintilla/D/style4/color": 13629647,
+    "Scintilla/D/style4/paper": 1776416,
+    "Scintilla/D/style5/color": 61166,
+    "Scintilla/D/style5/paper": 1776416,
+    "Scintilla/D/style6/color": 64511,
+    "Scintilla/D/style6/paper": 1776416,
+    "Scintilla/D/style7/color": 64511,
+    "Scintilla/D/style7/paper": 1776416,
+    "Scintilla/D/style8/color": 64511,
+    "Scintilla/D/style8/paper": 1776416,
+    "Scintilla/D/style9/color": 64511,
+    "Scintilla/D/style9/paper": 1776416,
+    "Scintilla/Diff/defaultcolor": 2303527,
+    "Scintilla/Diff/defaultpaper": 16579836,
+    "Scintilla/Diff/style0/color": 16777215,
+    "Scintilla/Diff/style0/paper": 1776416,
+    "Scintilla/Diff/style1/color": 7654502,
+    "Scintilla/Diff/style1/paper": 1776416,
+    "Scintilla/Diff/style10/color": 16758132,
+    "Scintilla/Diff/style10/paper": 1776416,
+    "Scintilla/Diff/style11/color": 16758132,
+    "Scintilla/Diff/style11/paper": 1776416,
+    "Scintilla/Diff/style2/color": 16776960,
+    "Scintilla/Diff/style2/paper": 1776416,
+    "Scintilla/Diff/style3/color": 7929343,
+    "Scintilla/Diff/style3/paper": 1776416,
+    "Scintilla/Diff/style4/color": 16727292,
+    "Scintilla/Diff/style4/paper": 1776416,
+    "Scintilla/Diff/style5/color": 16758132,
+    "Scintilla/Diff/style5/paper": 1776416,
+    "Scintilla/Diff/style6/color": 9043867,
+    "Scintilla/Diff/style6/paper": 1776416,
+    "Scintilla/Diff/style7/color": 14869218,
+    "Scintilla/Diff/style7/paper": 1776416,
+    "Scintilla/Diff/style8/color": 9043867,
+    "Scintilla/Diff/style8/paper": 1776416,
+    "Scintilla/Diff/style9/color": 9043867,
+    "Scintilla/Diff/style9/paper": 1776416,
+    "Scintilla/Fortran/defaultcolor": 2303527,
+    "Scintilla/Fortran/defaultpaper": 16579836,
+    "Scintilla/Fortran/style0/color": 16777215,
+    "Scintilla/Fortran/style0/paper": 1776416,
+    "Scintilla/Fortran/style1/color": 7654502,
+    "Scintilla/Fortran/style1/paper": 1776416,
+    "Scintilla/Fortran/style10/color": 11550848,
+    "Scintilla/Fortran/style10/paper": 1776416,
+    "Scintilla/Fortran/style11/color": 14868992,
+    "Scintilla/Fortran/style11/paper": 1776416,
+    "Scintilla/Fortran/style12/color": 12235176,
+    "Scintilla/Fortran/style12/paper": 1776416,
+    "Scintilla/Fortran/style13/color": 14729440,
+    "Scintilla/Fortran/style13/paper": 1776416,
+    "Scintilla/Fortran/style14/color": 0,
+    "Scintilla/Fortran/style14/paper": 15786112,
+    "Scintilla/Fortran/style2/color": 51400,
+    "Scintilla/Fortran/style2/paper": 1776416,
+    "Scintilla/Fortran/style3/color": 12801219,
+    "Scintilla/Fortran/style3/paper": 1776416,
+    "Scintilla/Fortran/style4/color": 12801219,
+    "Scintilla/Fortran/style4/paper": 1776416,
+    "Scintilla/Fortran/style5/color": 0,
+    "Scintilla/Fortran/style5/paper": 14729440,
+    "Scintilla/Fortran/style6/color": 12235176,
+    "Scintilla/Fortran/style6/paper": 1776416,
+    "Scintilla/Fortran/style7/color": 12044236,
+    "Scintilla/Fortran/style7/paper": 1776416,
+    "Scintilla/Fortran/style8/color": 6333951,
+    "Scintilla/Fortran/style8/paper": 1776416,
+    "Scintilla/Fortran/style9/color": 11534400,
+    "Scintilla/Fortran/style9/paper": 1776416,
+    "Scintilla/Fortran77/defaultcolor": 2303527,
+    "Scintilla/Fortran77/defaultpaper": 16579836,
+    "Scintilla/Fortran77/style0/color": 16777215,
+    "Scintilla/Fortran77/style0/paper": 1776416,
+    "Scintilla/Fortran77/style1/color": 7654502,
+    "Scintilla/Fortran77/style1/paper": 1776416,
+    "Scintilla/Fortran77/style10/color": 11550848,
+    "Scintilla/Fortran77/style10/paper": 1776416,
+    "Scintilla/Fortran77/style11/color": 14868992,
+    "Scintilla/Fortran77/style11/paper": 1776416,
+    "Scintilla/Fortran77/style12/color": 12235176,
+    "Scintilla/Fortran77/style12/paper": 1776416,
+    "Scintilla/Fortran77/style13/color": 14729440,
+    "Scintilla/Fortran77/style13/paper": 1776416,
+    "Scintilla/Fortran77/style14/color": 0,
+    "Scintilla/Fortran77/style14/paper": 15786112,
+    "Scintilla/Fortran77/style2/color": 51400,
+    "Scintilla/Fortran77/style2/paper": 1776416,
+    "Scintilla/Fortran77/style3/color": 12801219,
+    "Scintilla/Fortran77/style3/paper": 1776416,
+    "Scintilla/Fortran77/style4/color": 12801219,
+    "Scintilla/Fortran77/style4/paper": 1776416,
+    "Scintilla/Fortran77/style5/color": 0,
+    "Scintilla/Fortran77/style5/paper": 14729440,
+    "Scintilla/Fortran77/style6/color": 12235176,
+    "Scintilla/Fortran77/style6/paper": 1776416,
+    "Scintilla/Fortran77/style7/color": 12044236,
+    "Scintilla/Fortran77/style7/paper": 1776416,
+    "Scintilla/Fortran77/style8/color": 6333951,
+    "Scintilla/Fortran77/style8/paper": 1776416,
+    "Scintilla/Fortran77/style9/color": 11534400,
+    "Scintilla/Fortran77/style9/paper": 1776416,
+    "Scintilla/Guessed/defaultcolor": 2303527,
+    "Scintilla/Guessed/defaultpaper": 16579836,
+    "Scintilla/Guessed/style0/color": 16777215,
+    "Scintilla/Guessed/style0/paper": 1776416,
+    "Scintilla/Guessed/style1/color": 7654502,
+    "Scintilla/Guessed/style1/paper": 1776416,
+    "Scintilla/Guessed/style10/color": 43775,
+    "Scintilla/Guessed/style10/paper": 1776416,
+    "Scintilla/Guessed/style11/color": 43775,
+    "Scintilla/Guessed/style11/paper": 1776416,
+    "Scintilla/Guessed/style12/color": 15160661,
+    "Scintilla/Guessed/style12/paper": 1776416,
+    "Scintilla/Guessed/style13/color": 43775,
+    "Scintilla/Guessed/style13/paper": 1776416,
+    "Scintilla/Guessed/style14/color": 14496049,
+    "Scintilla/Guessed/style14/paper": 1776416,
+    "Scintilla/Guessed/style15/color": 14803200,
+    "Scintilla/Guessed/style15/paper": 1776416,
+    "Scintilla/Guessed/style16/color": 14606046,
+    "Scintilla/Guessed/style16/paper": 1776416,
+    "Scintilla/Guessed/style17/color": 11981115,
+    "Scintilla/Guessed/style17/paper": 1776416,
+    "Scintilla/Guessed/style18/color": 11792301,
+    "Scintilla/Guessed/style18/paper": 1776416,
+    "Scintilla/Guessed/style19/color": 14785535,
+    "Scintilla/Guessed/style19/paper": 1776416,
+    "Scintilla/Guessed/style2/color": 14522624,
+    "Scintilla/Guessed/style2/paper": 1776416,
+    "Scintilla/Guessed/style20/color": 16018283,
+    "Scintilla/Guessed/style20/paper": 1776416,
+    "Scintilla/Guessed/style21/color": 16018283,
+    "Scintilla/Guessed/style21/paper": 1776416,
+    "Scintilla/Guessed/style22/color": 12281480,
+    "Scintilla/Guessed/style22/paper": 1776416,
+    "Scintilla/Guessed/style23/color": 12281378,
+    "Scintilla/Guessed/style23/paper": 1776416,
+    "Scintilla/Guessed/style24/color": 12281480,
+    "Scintilla/Guessed/style24/paper": 1776416,
+    "Scintilla/Guessed/style25/color": 43775,
+    "Scintilla/Guessed/style25/paper": 1776416,
+    "Scintilla/Guessed/style26/color": 54016,
+    "Scintilla/Guessed/style26/paper": 1776416,
+    "Scintilla/Guessed/style27/color": 51400,
+    "Scintilla/Guessed/style27/paper": 1776416,
+    "Scintilla/Guessed/style28/color": 43775,
+    "Scintilla/Guessed/style28/paper": 1776416,
+    "Scintilla/Guessed/style29/color": 14508253,
+    "Scintilla/Guessed/style29/paper": 1776416,
+    "Scintilla/Guessed/style3/color": 11792301,
+    "Scintilla/Guessed/style3/paper": 1776416,
+    "Scintilla/Guessed/style30/color": 14876672,
+    "Scintilla/Guessed/style30/paper": 1776416,
+    "Scintilla/Guessed/style31/color": 56576,
+    "Scintilla/Guessed/style31/paper": 1776416,
+    "Scintilla/Guessed/style4/color": 11792301,
+    "Scintilla/Guessed/style4/paper": 1776416,
+    "Scintilla/Guessed/style40/color": 16711680,
+    "Scintilla/Guessed/style40/paper": 1776416,
+    "Scintilla/Guessed/style41/color": 14603209,
+    "Scintilla/Guessed/style41/paper": 1776416,
+    "Scintilla/Guessed/style42/color": 14603209,
+    "Scintilla/Guessed/style42/paper": 1776416,
+    "Scintilla/Guessed/style43/color": 43775,
+    "Scintilla/Guessed/style43/paper": 1776416,
+    "Scintilla/Guessed/style44/color": 13421772,
+    "Scintilla/Guessed/style44/paper": 1776416,
+    "Scintilla/Guessed/style45/color": 6915562,
+    "Scintilla/Guessed/style45/paper": 1776416,
+    "Scintilla/Guessed/style46/color": 16777215,
+    "Scintilla/Guessed/style46/paper": 16711680,
+    "Scintilla/Guessed/style47/color": 32512,
+    "Scintilla/Guessed/style47/paper": 11075496,
+    "Scintilla/Guessed/style48/color": 2536928,
+    "Scintilla/Guessed/style48/paper": 1776416,
+    "Scintilla/Guessed/style49/color": 14972651,
+    "Scintilla/Guessed/style49/paper": 1776416,
+    "Scintilla/Guessed/style5/color": 14579616,
+    "Scintilla/Guessed/style5/paper": 1776416,
+    "Scintilla/Guessed/style50/color": 8323199,
+    "Scintilla/Guessed/style50/paper": 14536925,
+    "Scintilla/Guessed/style51/color": 16777215,
+    "Scintilla/Guessed/style51/paper": 1776416,
+    "Scintilla/Guessed/style52/color": 49152,
+    "Scintilla/Guessed/style52/paper": 1776416,
+    "Scintilla/Guessed/style53/color": 14291132,
+    "Scintilla/Guessed/style53/paper": 1776416,
+    "Scintilla/Guessed/style54/color": 43775,
+    "Scintilla/Guessed/style54/paper": 1776416,
+    "Scintilla/Guessed/style55/color": 12944120,
+    "Scintilla/Guessed/style55/paper": 1776416,
+    "Scintilla/Guessed/style56/color": 12944120,
+    "Scintilla/Guessed/style56/paper": 1776416,
+    "Scintilla/Guessed/style57/color": 16776960,
+    "Scintilla/Guessed/style57/paper": 10518656,
+    "Scintilla/Guessed/style58/color": 12303291,
+    "Scintilla/Guessed/style58/paper": 1776416,
+    "Scintilla/Guessed/style6/color": 12235176,
+    "Scintilla/Guessed/style6/paper": 1776416,
+    "Scintilla/Guessed/style7/color": 14785535,
+    "Scintilla/Guessed/style7/paper": 1776416,
+    "Scintilla/Guessed/style8/color": 11792301,
+    "Scintilla/Guessed/style8/paper": 1776416,
+    "Scintilla/Guessed/style9/color": 43775,
+    "Scintilla/Guessed/style9/paper": 1776416,
+    "Scintilla/HTML/defaultcolor": 2303527,
+    "Scintilla/HTML/defaultpaper": 16579836,
+    "Scintilla/HTML/style0/color": 16777215,
+    "Scintilla/HTML/style0/paper": 1776416,
+    "Scintilla/HTML/style1/color": 10001919,
+    "Scintilla/HTML/style1/paper": 1776416,
+    "Scintilla/HTML/style10/color": 16711935,
+    "Scintilla/HTML/style10/paper": 1776416,
+    "Scintilla/HTML/style100/color": 65535,
+    "Scintilla/HTML/style100/paper": 4215616,
+    "Scintilla/HTML/style101/color": 16777215,
+    "Scintilla/HTML/style101/paper": 4215616,
+    "Scintilla/HTML/style102/color": 16777215,
+    "Scintilla/HTML/style102/paper": 4215616,
+    "Scintilla/HTML/style105/color": 16777215,
+    "Scintilla/HTML/style105/paper": 1776416,
+    "Scintilla/HTML/style106/color": 8421504,
+    "Scintilla/HTML/style106/paper": 13627343,
+    "Scintilla/HTML/style107/color": 32512,
+    "Scintilla/HTML/style107/paper": 13627343,
+    "Scintilla/HTML/style108/color": 32639,
+    "Scintilla/HTML/style108/paper": 13627343,
+    "Scintilla/HTML/style109/color": 8323199,
+    "Scintilla/HTML/style109/paper": 13627343,
+    "Scintilla/HTML/style11/color": 54783,
+    "Scintilla/HTML/style11/paper": 1776416,
+    "Scintilla/HTML/style110/color": 8323199,
+    "Scintilla/HTML/style110/paper": 13627343,
+    "Scintilla/HTML/style111/color": 127,
+    "Scintilla/HTML/style111/paper": 13627343,
+    "Scintilla/HTML/style112/color": 8323072,
+    "Scintilla/HTML/style112/paper": 13627343,
+    "Scintilla/HTML/style113/color": 8323072,
+    "Scintilla/HTML/style113/paper": 13627343,
+    "Scintilla/HTML/style114/color": 255,
+    "Scintilla/HTML/style114/paper": 13627343,
+    "Scintilla/HTML/style115/color": 32639,
+    "Scintilla/HTML/style115/paper": 13627343,
+    "Scintilla/HTML/style116/color": 0,
+    "Scintilla/HTML/style116/paper": 13627343,
+    "Scintilla/HTML/style117/color": 0,
+    "Scintilla/HTML/style117/paper": 13627343,
+    "Scintilla/HTML/style118/color": 10395903,
+    "Scintilla/HTML/style118/paper": 1776416,
+    "Scintilla/HTML/style119/color": 65280,
+    "Scintilla/HTML/style119/paper": 1776416,
+    "Scintilla/HTML/style12/color": 7582463,
+    "Scintilla/HTML/style12/paper": 1776416,
+    "Scintilla/HTML/style120/color": 65280,
+    "Scintilla/HTML/style120/paper": 1776416,
+    "Scintilla/HTML/style121/color": 16711935,
+    "Scintilla/HTML/style121/paper": 1776416,
+    "Scintilla/HTML/style122/color": 16760576,
+    "Scintilla/HTML/style122/paper": 1776416,
+    "Scintilla/HTML/style123/color": 10066943,
+    "Scintilla/HTML/style123/paper": 1776416,
+    "Scintilla/HTML/style124/color": 16769428,
+    "Scintilla/HTML/style124/paper": 1776416,
+    "Scintilla/HTML/style125/color": 16769428,
+    "Scintilla/HTML/style125/paper": 1776416,
+    "Scintilla/HTML/style126/color": 10066943,
+    "Scintilla/HTML/style126/paper": 1776416,
+    "Scintilla/HTML/style127/color": 16777215,
+    "Scintilla/HTML/style127/paper": 1776416,
+    "Scintilla/HTML/style13/color": 7582463,
+    "Scintilla/HTML/style13/paper": 1776416,
+    "Scintilla/HTML/style14/color": 9430527,
+    "Scintilla/HTML/style14/paper": 1776416,
+    "Scintilla/HTML/style15/color": 0,
+    "Scintilla/HTML/style15/paper": 16776960,
+    "Scintilla/HTML/style16/color": 0,
+    "Scintilla/HTML/style16/paper": 16768768,
+    "Scintilla/HTML/style17/color": 0,
+    "Scintilla/HTML/style17/paper": 16768768,
+    "Scintilla/HTML/style18/color": 255,
+    "Scintilla/HTML/style18/paper": 16773055,
+    "Scintilla/HTML/style19/color": 16711935,
+    "Scintilla/HTML/style19/paper": 16773119,
+    "Scintilla/HTML/style2/color": 16731729,
+    "Scintilla/HTML/style2/paper": 1776416,
+    "Scintilla/HTML/style20/color": 16777215,
+    "Scintilla/HTML/style20/paper": 1776416,
+    "Scintilla/HTML/style21/color": 10001631,
+    "Scintilla/HTML/style21/paper": 1776416,
+    "Scintilla/HTML/style22/color": 10001631,
+    "Scintilla/HTML/style22/paper": 1776416,
+    "Scintilla/HTML/style23/color": 10284700,
+    "Scintilla/HTML/style23/paper": 1776416,
+    "Scintilla/HTML/style24/color": 8388608,
+    "Scintilla/HTML/style24/paper": 15724543,
+    "Scintilla/HTML/style25/color": 10040064,
+    "Scintilla/HTML/style25/paper": 15724543,
+    "Scintilla/HTML/style26/color": 8388608,
+    "Scintilla/HTML/style26/paper": 16737894,
+    "Scintilla/HTML/style27/color": 10010623,
+    "Scintilla/HTML/style27/paper": 1776416,
+    "Scintilla/HTML/style29/color": 8421376,
+    "Scintilla/HTML/style29/paper": 15724543,
+    "Scintilla/HTML/style3/color": 61166,
+    "Scintilla/HTML/style3/paper": 1776416,
+    "Scintilla/HTML/style30/color": 16777215,
+    "Scintilla/HTML/style30/paper": 1776416,
+    "Scintilla/HTML/style31/color": 102,
+    "Scintilla/HTML/style31/paper": 13421792,
+    "Scintilla/HTML/style4/color": 16738924,
+    "Scintilla/HTML/style4/paper": 1776416,
+    "Scintilla/HTML/style40/color": 16776960,
+    "Scintilla/HTML/style40/paper": 1776416,
+    "Scintilla/HTML/style41/color": 16777215,
+    "Scintilla/HTML/style41/paper": 1776416,
+    "Scintilla/HTML/style42/color": 55552,
+    "Scintilla/HTML/style42/paper": 1776416,
+    "Scintilla/HTML/style43/color": 55552,
+    "Scintilla/HTML/style43/paper": 1776416,
+    "Scintilla/HTML/style44/color": 7985273,
+    "Scintilla/HTML/style44/paper": 1776416,
+    "Scintilla/HTML/style45/color": 53199,
+    "Scintilla/HTML/style45/paper": 1776416,
+    "Scintilla/HTML/style46/color": 16777215,
+    "Scintilla/HTML/style46/paper": 1776416,
+    "Scintilla/HTML/style47/color": 7303167,
+    "Scintilla/HTML/style47/paper": 1776416,
+    "Scintilla/HTML/style48/color": 16711935,
+    "Scintilla/HTML/style48/paper": 1776416,
+    "Scintilla/HTML/style49/color": 16711935,
+    "Scintilla/HTML/style49/paper": 1776416,
+    "Scintilla/HTML/style5/color": 58082,
+    "Scintilla/HTML/style5/paper": 1776416,
+    "Scintilla/HTML/style50/color": 16777215,
+    "Scintilla/HTML/style50/paper": 1776416,
+    "Scintilla/HTML/style51/color": 0,
+    "Scintilla/HTML/style51/paper": 12565424,
+    "Scintilla/HTML/style52/color": 0,
+    "Scintilla/HTML/style52/paper": 16759728,
+    "Scintilla/HTML/style55/color": 16777215,
+    "Scintilla/HTML/style55/paper": 1776416,
+    "Scintilla/HTML/style56/color": 0,
+    "Scintilla/HTML/style56/paper": 14671743,
+    "Scintilla/HTML/style57/color": 32512,
+    "Scintilla/HTML/style57/paper": 14671743,
+    "Scintilla/HTML/style58/color": 32512,
+    "Scintilla/HTML/style58/paper": 14671743,
+    "Scintilla/HTML/style59/color": 8355711,
+    "Scintilla/HTML/style59/paper": 14671743,
+    "Scintilla/HTML/style6/color": 16711935,
+    "Scintilla/HTML/style6/paper": 1776416,
+    "Scintilla/HTML/style60/color": 32639,
+    "Scintilla/HTML/style60/paper": 14671743,
+    "Scintilla/HTML/style61/color": 0,
+    "Scintilla/HTML/style61/paper": 14671743,
+    "Scintilla/HTML/style62/color": 127,
+    "Scintilla/HTML/style62/paper": 14671743,
+    "Scintilla/HTML/style63/color": 8323199,
+    "Scintilla/HTML/style63/paper": 14671743,
+    "Scintilla/HTML/style64/color": 8323199,
+    "Scintilla/HTML/style64/paper": 14671743,
+    "Scintilla/HTML/style65/color": 0,
+    "Scintilla/HTML/style65/paper": 14671743,
+    "Scintilla/HTML/style66/color": 0,
+    "Scintilla/HTML/style66/paper": 12565424,
+    "Scintilla/HTML/style67/color": 0,
+    "Scintilla/HTML/style67/paper": 16759728,
+    "Scintilla/HTML/style7/color": 16711935,
+    "Scintilla/HTML/style7/paper": 1776416,
+    "Scintilla/HTML/style70/color": 16777215,
+    "Scintilla/HTML/style70/paper": 1776416,
+    "Scintilla/HTML/style71/color": 16777215,
+    "Scintilla/HTML/style71/paper": 4079166,
+    "Scintilla/HTML/style72/color": 65280,
+    "Scintilla/HTML/style72/paper": 4079166,
+    "Scintilla/HTML/style73/color": 65535,
+    "Scintilla/HTML/style73/paper": 4079166,
+    "Scintilla/HTML/style74/color": 5200127,
+    "Scintilla/HTML/style74/paper": 4079166,
+    "Scintilla/HTML/style75/color": 16711935,
+    "Scintilla/HTML/style75/paper": 4079166,
+    "Scintilla/HTML/style76/color": 5200127,
+    "Scintilla/HTML/style76/paper": 4079166,
+    "Scintilla/HTML/style77/color": 128,
+    "Scintilla/HTML/style77/paper": 8355839,
+    "Scintilla/HTML/style8/color": 16711935,
+    "Scintilla/HTML/style8/paper": 1776416,
+    "Scintilla/HTML/style80/color": 16777215,
+    "Scintilla/HTML/style80/paper": 1776416,
+    "Scintilla/HTML/style81/color": 0,
+    "Scintilla/HTML/style81/paper": 13619183,
+    "Scintilla/HTML/style82/color": 32768,
+    "Scintilla/HTML/style82/paper": 13619183,
+    "Scintilla/HTML/style83/color": 32896,
+    "Scintilla/HTML/style83/paper": 13619183,
+    "Scintilla/HTML/style84/color": 128,
+    "Scintilla/HTML/style84/paper": 13619183,
+    "Scintilla/HTML/style85/color": 8388736,
+    "Scintilla/HTML/style85/paper": 13619183,
+    "Scintilla/HTML/style86/color": 128,
+    "Scintilla/HTML/style86/paper": 13619183,
+    "Scintilla/HTML/style87/color": 128,
+    "Scintilla/HTML/style87/paper": 8355839,
+    "Scintilla/HTML/style9/color": 16776960,
+    "Scintilla/HTML/style9/paper": 1776416,
+    "Scintilla/HTML/style90/color": 16777215,
+    "Scintilla/HTML/style90/paper": 1776416,
+    "Scintilla/HTML/style91/color": 16777215,
+    "Scintilla/HTML/style91/paper": 4215616,
+    "Scintilla/HTML/style92/color": 65280,
+    "Scintilla/HTML/style92/paper": 4215616,
+    "Scintilla/HTML/style93/color": 65535,
+    "Scintilla/HTML/style93/paper": 4215616,
+    "Scintilla/HTML/style94/color": 16711935,
+    "Scintilla/HTML/style94/paper": 4215616,
+    "Scintilla/HTML/style95/color": 16711935,
+    "Scintilla/HTML/style95/paper": 4215616,
+    "Scintilla/HTML/style96/color": 11381503,
+    "Scintilla/HTML/style96/paper": 4215616,
+    "Scintilla/HTML/style97/color": 16742263,
+    "Scintilla/HTML/style97/paper": 4215616,
+    "Scintilla/HTML/style98/color": 16742263,
+    "Scintilla/HTML/style98/paper": 4215616,
+    "Scintilla/HTML/style99/color": 11381503,
+    "Scintilla/HTML/style99/paper": 4215616,
+    "Scintilla/IDL/defaultcolor": 2303527,
+    "Scintilla/IDL/defaultpaper": 16579836,
+    "Scintilla/IDL/style0/color": 16777215,
+    "Scintilla/IDL/style0/paper": 1776416,
+    "Scintilla/IDL/style1/color": 7654502,
+    "Scintilla/IDL/style1/paper": 1776416,
+    "Scintilla/IDL/style10/color": 12235176,
+    "Scintilla/IDL/style10/paper": 1776416,
+    "Scintilla/IDL/style11/color": 12044236,
+    "Scintilla/IDL/style11/paper": 1776416,
+    "Scintilla/IDL/style12/color": 0,
+    "Scintilla/IDL/style12/paper": 14729440,
+    "Scintilla/IDL/style13/color": 5278790,
+    "Scintilla/IDL/style13/paper": 14745568,
+    "Scintilla/IDL/style14/color": 4161343,
+    "Scintilla/IDL/style14/paper": 14741728,
+    "Scintilla/IDL/style15/color": 7985273,
+    "Scintilla/IDL/style15/paper": 1776416,
+    "Scintilla/IDL/style16/color": 12044236,
+    "Scintilla/IDL/style16/paper": 1776416,
+    "Scintilla/IDL/style17/color": 5020415,
+    "Scintilla/IDL/style17/paper": 1776416,
+    "Scintilla/IDL/style18/color": 16744512,
+    "Scintilla/IDL/style18/paper": 1776416,
+    "Scintilla/IDL/style19/color": 12044236,
+    "Scintilla/IDL/style19/paper": 1776416,
+    "Scintilla/IDL/style2/color": 7654502,
+    "Scintilla/IDL/style2/paper": 1776416,
+    "Scintilla/IDL/style20/color": 8323199,
+    "Scintilla/IDL/style20/paper": 16774143,
+    "Scintilla/IDL/style21/color": 5278790,
+    "Scintilla/IDL/style21/paper": 14745568,
+    "Scintilla/IDL/style22/color": 5278790,
+    "Scintilla/IDL/style22/paper": 15204311,
+    "Scintilla/IDL/style23/color": 6658304,
+    "Scintilla/IDL/style23/paper": 1776416,
+    "Scintilla/IDL/style24/color": 7985273,
+    "Scintilla/IDL/style24/paper": 1776416,
+    "Scintilla/IDL/style25/color": 12607488,
+    "Scintilla/IDL/style25/paper": 1776416,
+    "Scintilla/IDL/style26/color": 12453887,
+    "Scintilla/IDL/style26/paper": 1776416,
+    "Scintilla/IDL/style27/color": 12044236,
+    "Scintilla/IDL/style27/paper": 1776416,
+    "Scintilla/IDL/style3/color": 7985273,
+    "Scintilla/IDL/style3/paper": 1776416,
+    "Scintilla/IDL/style4/color": 51400,
+    "Scintilla/IDL/style4/paper": 1776416,
+    "Scintilla/IDL/style5/color": 6333951,
+    "Scintilla/IDL/style5/paper": 1776416,
+    "Scintilla/IDL/style6/color": 12801219,
+    "Scintilla/IDL/style6/paper": 1776416,
+    "Scintilla/IDL/style64/color": 12632256,
+    "Scintilla/IDL/style64/paper": 1776416,
+    "Scintilla/IDL/style65/color": 9482384,
+    "Scintilla/IDL/style65/paper": 1776416,
+    "Scintilla/IDL/style66/color": 9482384,
+    "Scintilla/IDL/style66/paper": 1776416,
+    "Scintilla/IDL/style67/color": 13684944,
+    "Scintilla/IDL/style67/paper": 1776416,
+    "Scintilla/IDL/style68/color": 9482384,
+    "Scintilla/IDL/style68/paper": 1776416,
+    "Scintilla/IDL/style69/color": 9474224,
+    "Scintilla/IDL/style69/paper": 1776416,
+    "Scintilla/IDL/style7/color": 12801219,
+    "Scintilla/IDL/style7/paper": 1776416,
+    "Scintilla/IDL/style70/color": 11571376,
+    "Scintilla/IDL/style70/paper": 1776416,
+    "Scintilla/IDL/style71/color": 11571376,
+    "Scintilla/IDL/style71/paper": 1776416,
+    "Scintilla/IDL/style72/color": 12632256,
+    "Scintilla/IDL/style72/paper": 1776416,
+    "Scintilla/IDL/style73/color": 11579536,
+    "Scintilla/IDL/style73/paper": 1776416,
+    "Scintilla/IDL/style74/color": 11579568,
+    "Scintilla/IDL/style74/paper": 1776416,
+    "Scintilla/IDL/style75/color": 11579568,
+    "Scintilla/IDL/style75/paper": 1776416,
+    "Scintilla/IDL/style76/color": 0,
+    "Scintilla/IDL/style76/paper": 14729440,
+    "Scintilla/IDL/style77/color": 6716774,
+    "Scintilla/IDL/style77/paper": 14745568,
+    "Scintilla/IDL/style78/color": 5600597,
+    "Scintilla/IDL/style78/paper": 14741728,
+    "Scintilla/IDL/style79/color": 12632256,
+    "Scintilla/IDL/style79/paper": 1776416,
+    "Scintilla/IDL/style8/color": 8405120,
+    "Scintilla/IDL/style8/paper": 1776416,
+    "Scintilla/IDL/style80/color": 12632256,
+    "Scintilla/IDL/style80/paper": 1776416,
+    "Scintilla/IDL/style81/color": 12632256,
+    "Scintilla/IDL/style81/paper": 1776416,
+    "Scintilla/IDL/style82/color": 12632256,
+    "Scintilla/IDL/style82/paper": 1776416,
+    "Scintilla/IDL/style83/color": 11579568,
+    "Scintilla/IDL/style83/paper": 1776416,
+    "Scintilla/IDL/style84/color": 11571376,
+    "Scintilla/IDL/style84/paper": 16774143,
+    "Scintilla/IDL/style85/color": 6716774,
+    "Scintilla/IDL/style85/paper": 14745568,
+    "Scintilla/IDL/style86/color": 6716774,
+    "Scintilla/IDL/style86/paper": 15204311,
+    "Scintilla/IDL/style87/color": 10535056,
+    "Scintilla/IDL/style87/paper": 1776416,
+    "Scintilla/IDL/style88/color": 12632256,
+    "Scintilla/IDL/style88/paper": 1776416,
+    "Scintilla/IDL/style89/color": 14131344,
+    "Scintilla/IDL/style89/paper": 1776416,
+    "Scintilla/IDL/style9/color": 14868992,
+    "Scintilla/IDL/style9/paper": 1776416,
+    "Scintilla/IDL/style90/color": 12820943,
+    "Scintilla/IDL/style90/paper": 1776416,
+    "Scintilla/IDL/style91/color": 12044236,
+    "Scintilla/IDL/style91/paper": 1776416,
+    "Scintilla/JSON/defaultcolor": 2303527,
+    "Scintilla/JSON/defaultpaper": 16579836,
+    "Scintilla/JSON/style0/color": 16777215,
+    "Scintilla/JSON/style0/paper": 1776416,
+    "Scintilla/JSON/style1/color": 65535,
+    "Scintilla/JSON/style1/paper": 1776416,
+    "Scintilla/JSON/style10/color": 16734193,
+    "Scintilla/JSON/style10/paper": 1776416,
+    "Scintilla/JSON/style11/color": 917455,
+    "Scintilla/JSON/style11/paper": 1776416,
+    "Scintilla/JSON/style12/color": 16741225,
+    "Scintilla/JSON/style12/paper": 1776416,
+    "Scintilla/JSON/style13/color": 16777215,
+    "Scintilla/JSON/style13/paper": 16711680,
+    "Scintilla/JSON/style2/color": 16605794,
+    "Scintilla/JSON/style2/paper": 1776416,
+    "Scintilla/JSON/style3/color": 16777215,
+    "Scintilla/JSON/style3/paper": 16711680,
+    "Scintilla/JSON/style4/color": 12814335,
+    "Scintilla/JSON/style4/paper": 1776416,
+    "Scintilla/JSON/style5/color": 1245001,
+    "Scintilla/JSON/style5/paper": 1776416,
+    "Scintilla/JSON/style6/color": 3735545,
+    "Scintilla/JSON/style6/paper": 1776416,
+    "Scintilla/JSON/style7/color": 3735545,
+    "Scintilla/JSON/style7/paper": 1776416,
+    "Scintilla/JSON/style8/color": 4062907,
+    "Scintilla/JSON/style8/paper": 1776416,
+    "Scintilla/JSON/style9/color": 16755327,
+    "Scintilla/JSON/style9/paper": 1776416,
+    "Scintilla/Java/defaultcolor": 2303527,
+    "Scintilla/Java/defaultpaper": 16579836,
+    "Scintilla/Java/style0/color": 16777215,
+    "Scintilla/Java/style0/paper": 1776416,
+    "Scintilla/Java/style1/color": 7654502,
+    "Scintilla/Java/style1/paper": 1776416,
+    "Scintilla/Java/style10/color": 12235176,
+    "Scintilla/Java/style10/paper": 1776416,
+    "Scintilla/Java/style11/color": 12044236,
+    "Scintilla/Java/style11/paper": 1776416,
+    "Scintilla/Java/style12/color": 0,
+    "Scintilla/Java/style12/paper": 14729440,
+    "Scintilla/Java/style13/color": 5278790,
+    "Scintilla/Java/style13/paper": 14745568,
+    "Scintilla/Java/style14/color": 4161343,
+    "Scintilla/Java/style14/paper": 14741728,
+    "Scintilla/Java/style15/color": 7985273,
+    "Scintilla/Java/style15/paper": 1776416,
+    "Scintilla/Java/style16/color": 12044236,
+    "Scintilla/Java/style16/paper": 1776416,
+    "Scintilla/Java/style17/color": 5020415,
+    "Scintilla/Java/style17/paper": 1776416,
+    "Scintilla/Java/style18/color": 16744512,
+    "Scintilla/Java/style18/paper": 1776416,
+    "Scintilla/Java/style19/color": 12044236,
+    "Scintilla/Java/style19/paper": 1776416,
+    "Scintilla/Java/style2/color": 7654502,
+    "Scintilla/Java/style2/paper": 1776416,
+    "Scintilla/Java/style20/color": 8323199,
+    "Scintilla/Java/style20/paper": 16774143,
+    "Scintilla/Java/style21/color": 5278790,
+    "Scintilla/Java/style21/paper": 14745568,
+    "Scintilla/Java/style22/color": 5278790,
+    "Scintilla/Java/style22/paper": 15204311,
+    "Scintilla/Java/style23/color": 6658304,
+    "Scintilla/Java/style23/paper": 1776416,
+    "Scintilla/Java/style24/color": 7985273,
+    "Scintilla/Java/style24/paper": 1776416,
+    "Scintilla/Java/style25/color": 12607488,
+    "Scintilla/Java/style25/paper": 1776416,
+    "Scintilla/Java/style26/color": 12453887,
+    "Scintilla/Java/style26/paper": 1776416,
+    "Scintilla/Java/style27/color": 12044236,
+    "Scintilla/Java/style27/paper": 1776416,
+    "Scintilla/Java/style3/color": 7985273,
+    "Scintilla/Java/style3/paper": 1776416,
+    "Scintilla/Java/style4/color": 51400,
+    "Scintilla/Java/style4/paper": 1776416,
+    "Scintilla/Java/style5/color": 6333951,
+    "Scintilla/Java/style5/paper": 1776416,
+    "Scintilla/Java/style6/color": 12801219,
+    "Scintilla/Java/style6/paper": 1776416,
+    "Scintilla/Java/style64/color": 12632256,
+    "Scintilla/Java/style64/paper": 1776416,
+    "Scintilla/Java/style65/color": 9482384,
+    "Scintilla/Java/style65/paper": 1776416,
+    "Scintilla/Java/style66/color": 9482384,
+    "Scintilla/Java/style66/paper": 1776416,
+    "Scintilla/Java/style67/color": 13684944,
+    "Scintilla/Java/style67/paper": 1776416,
+    "Scintilla/Java/style68/color": 9482384,
+    "Scintilla/Java/style68/paper": 1776416,
+    "Scintilla/Java/style69/color": 9474224,
+    "Scintilla/Java/style69/paper": 1776416,
+    "Scintilla/Java/style7/color": 12801219,
+    "Scintilla/Java/style7/paper": 1776416,
+    "Scintilla/Java/style70/color": 11571376,
+    "Scintilla/Java/style70/paper": 1776416,
+    "Scintilla/Java/style71/color": 11571376,
+    "Scintilla/Java/style71/paper": 1776416,
+    "Scintilla/Java/style72/color": 12632256,
+    "Scintilla/Java/style72/paper": 1776416,
+    "Scintilla/Java/style73/color": 11579536,
+    "Scintilla/Java/style73/paper": 1776416,
+    "Scintilla/Java/style74/color": 11579568,
+    "Scintilla/Java/style74/paper": 1776416,
+    "Scintilla/Java/style75/color": 11579568,
+    "Scintilla/Java/style75/paper": 1776416,
+    "Scintilla/Java/style76/color": 0,
+    "Scintilla/Java/style76/paper": 14729440,
+    "Scintilla/Java/style77/color": 6716774,
+    "Scintilla/Java/style77/paper": 14745568,
+    "Scintilla/Java/style78/color": 5600597,
+    "Scintilla/Java/style78/paper": 14741728,
+    "Scintilla/Java/style79/color": 12632256,
+    "Scintilla/Java/style79/paper": 1776416,
+    "Scintilla/Java/style8/color": 12044236,
+    "Scintilla/Java/style8/paper": 1776416,
+    "Scintilla/Java/style80/color": 12632256,
+    "Scintilla/Java/style80/paper": 1776416,
+    "Scintilla/Java/style81/color": 12632256,
+    "Scintilla/Java/style81/paper": 1776416,
+    "Scintilla/Java/style82/color": 12632256,
+    "Scintilla/Java/style82/paper": 1776416,
+    "Scintilla/Java/style83/color": 11579568,
+    "Scintilla/Java/style83/paper": 1776416,
+    "Scintilla/Java/style84/color": 11571376,
+    "Scintilla/Java/style84/paper": 16774143,
+    "Scintilla/Java/style85/color": 6716774,
+    "Scintilla/Java/style85/paper": 14745568,
+    "Scintilla/Java/style86/color": 6716774,
+    "Scintilla/Java/style86/paper": 15204311,
+    "Scintilla/Java/style87/color": 10535056,
+    "Scintilla/Java/style87/paper": 1776416,
+    "Scintilla/Java/style88/color": 12632256,
+    "Scintilla/Java/style88/paper": 1776416,
+    "Scintilla/Java/style89/color": 14131344,
+    "Scintilla/Java/style89/paper": 1776416,
+    "Scintilla/Java/style9/color": 14868992,
+    "Scintilla/Java/style9/paper": 1776416,
+    "Scintilla/Java/style90/color": 12820943,
+    "Scintilla/Java/style90/paper": 1776416,
+    "Scintilla/Java/style91/color": 12044236,
+    "Scintilla/Java/style91/paper": 1776416,
+    "Scintilla/JavaScript/defaultcolor": 2303527,
+    "Scintilla/JavaScript/defaultpaper": 16579836,
+    "Scintilla/JavaScript/style0/color": 16777215,
+    "Scintilla/JavaScript/style0/paper": 1776416,
+    "Scintilla/JavaScript/style1/color": 7654502,
+    "Scintilla/JavaScript/style1/paper": 1776416,
+    "Scintilla/JavaScript/style10/color": 12235176,
+    "Scintilla/JavaScript/style10/paper": 1776416,
+    "Scintilla/JavaScript/style11/color": 12044236,
+    "Scintilla/JavaScript/style11/paper": 1776416,
+    "Scintilla/JavaScript/style12/color": 16777215,
+    "Scintilla/JavaScript/style12/paper": 1776416,
+    "Scintilla/JavaScript/style13/color": 7654502,
+    "Scintilla/JavaScript/style13/paper": 1776416,
+    "Scintilla/JavaScript/style14/color": 4161343,
+    "Scintilla/JavaScript/style14/paper": 14741759,
+    "Scintilla/JavaScript/style15/color": 7985273,
+    "Scintilla/JavaScript/style15/paper": 1776416,
+    "Scintilla/JavaScript/style16/color": 12044236,
+    "Scintilla/JavaScript/style16/paper": 1776416,
+    "Scintilla/JavaScript/style17/color": 5020415,
+    "Scintilla/JavaScript/style17/paper": 1776416,
+    "Scintilla/JavaScript/style18/color": 16744512,
+    "Scintilla/JavaScript/style18/paper": 1776416,
+    "Scintilla/JavaScript/style19/color": 12044236,
+    "Scintilla/JavaScript/style19/paper": 1776416,
+    "Scintilla/JavaScript/style2/color": 7654502,
+    "Scintilla/JavaScript/style2/paper": 1776416,
+    "Scintilla/JavaScript/style20/color": 12801219,
+    "Scintilla/JavaScript/style20/paper": 1776416,
+    "Scintilla/JavaScript/style21/color": 7654502,
+    "Scintilla/JavaScript/style21/paper": 1776416,
+    "Scintilla/JavaScript/style22/color": 7654502,
+    "Scintilla/JavaScript/style22/paper": 1776416,
+    "Scintilla/JavaScript/style23/color": 6658304,
+    "Scintilla/JavaScript/style23/paper": 1776416,
+    "Scintilla/JavaScript/style24/color": 7985273,
+    "Scintilla/JavaScript/style24/paper": 1776416,
+    "Scintilla/JavaScript/style25/color": 12607488,
+    "Scintilla/JavaScript/style25/paper": 1776416,
+    "Scintilla/JavaScript/style26/color": 12453887,
+    "Scintilla/JavaScript/style26/paper": 1776416,
+    "Scintilla/JavaScript/style27/color": 12044236,
+    "Scintilla/JavaScript/style27/paper": 1776416,
+    "Scintilla/JavaScript/style3/color": 7985273,
+    "Scintilla/JavaScript/style3/paper": 1776416,
+    "Scintilla/JavaScript/style4/color": 51400,
+    "Scintilla/JavaScript/style4/paper": 1776416,
+    "Scintilla/JavaScript/style5/color": 6333951,
+    "Scintilla/JavaScript/style5/paper": 1776416,
+    "Scintilla/JavaScript/style6/color": 12801219,
+    "Scintilla/JavaScript/style6/paper": 1776416,
+    "Scintilla/JavaScript/style64/color": 12632256,
+    "Scintilla/JavaScript/style64/paper": 1776416,
+    "Scintilla/JavaScript/style65/color": 9482384,
+    "Scintilla/JavaScript/style65/paper": 1776416,
+    "Scintilla/JavaScript/style66/color": 9482384,
+    "Scintilla/JavaScript/style66/paper": 1776416,
+    "Scintilla/JavaScript/style67/color": 13684944,
+    "Scintilla/JavaScript/style67/paper": 1776416,
+    "Scintilla/JavaScript/style68/color": 9482384,
+    "Scintilla/JavaScript/style68/paper": 1776416,
+    "Scintilla/JavaScript/style69/color": 9474224,
+    "Scintilla/JavaScript/style69/paper": 1776416,
+    "Scintilla/JavaScript/style7/color": 12801219,
+    "Scintilla/JavaScript/style7/paper": 1776416,
+    "Scintilla/JavaScript/style70/color": 11571376,
+    "Scintilla/JavaScript/style70/paper": 1776416,
+    "Scintilla/JavaScript/style71/color": 11571376,
+    "Scintilla/JavaScript/style71/paper": 1776416,
+    "Scintilla/JavaScript/style72/color": 12632256,
+    "Scintilla/JavaScript/style72/paper": 1776416,
+    "Scintilla/JavaScript/style73/color": 11579536,
+    "Scintilla/JavaScript/style73/paper": 1776416,
+    "Scintilla/JavaScript/style74/color": 11579568,
+    "Scintilla/JavaScript/style74/paper": 1776416,
+    "Scintilla/JavaScript/style75/color": 11579568,
+    "Scintilla/JavaScript/style75/paper": 1776416,
+    "Scintilla/JavaScript/style76/color": 16777215,
+    "Scintilla/JavaScript/style76/paper": 1776416,
+    "Scintilla/JavaScript/style77/color": 9482384,
+    "Scintilla/JavaScript/style77/paper": 1776416,
+    "Scintilla/JavaScript/style78/color": 8367999,
+    "Scintilla/JavaScript/style78/paper": 1776416,
+    "Scintilla/JavaScript/style79/color": 12632256,
+    "Scintilla/JavaScript/style79/paper": 1776416,
+    "Scintilla/JavaScript/style8/color": 12044236,
+    "Scintilla/JavaScript/style8/paper": 1776416,
+    "Scintilla/JavaScript/style80/color": 12632256,
+    "Scintilla/JavaScript/style80/paper": 1776416,
+    "Scintilla/JavaScript/style81/color": 12632256,
+    "Scintilla/JavaScript/style81/paper": 1776416,
+    "Scintilla/JavaScript/style82/color": 12632256,
+    "Scintilla/JavaScript/style82/paper": 1776416,
+    "Scintilla/JavaScript/style83/color": 11579568,
+    "Scintilla/JavaScript/style83/paper": 1776416,
+    "Scintilla/JavaScript/style84/color": 11571376,
+    "Scintilla/JavaScript/style84/paper": 1776416,
+    "Scintilla/JavaScript/style85/color": 9482384,
+    "Scintilla/JavaScript/style85/paper": 1776416,
+    "Scintilla/JavaScript/style86/color": 9482384,
+    "Scintilla/JavaScript/style86/paper": 1776416,
+    "Scintilla/JavaScript/style87/color": 10535056,
+    "Scintilla/JavaScript/style87/paper": 1776416,
+    "Scintilla/JavaScript/style88/color": 12632256,
+    "Scintilla/JavaScript/style88/paper": 1776416,
+    "Scintilla/JavaScript/style89/color": 14131344,
+    "Scintilla/JavaScript/style89/paper": 1776416,
+    "Scintilla/JavaScript/style9/color": 14868992,
+    "Scintilla/JavaScript/style9/paper": 1776416,
+    "Scintilla/JavaScript/style90/color": 12820943,
+    "Scintilla/JavaScript/style90/paper": 1776416,
+    "Scintilla/JavaScript/style91/color": 12044236,
+    "Scintilla/JavaScript/style91/paper": 1776416,
+    "Scintilla/Lua/defaultcolor": 2303527,
+    "Scintilla/Lua/defaultpaper": 16579836,
+    "Scintilla/Lua/style0/color": 16777215,
+    "Scintilla/Lua/style0/paper": 1776416,
+    "Scintilla/Lua/style1/color": 5278790,
+    "Scintilla/Lua/style1/paper": 13693168,
+    "Scintilla/Lua/style10/color": 12044236,
+    "Scintilla/Lua/style10/paper": 1776416,
+    "Scintilla/Lua/style11/color": 12044236,
+    "Scintilla/Lua/style11/paper": 1776416,
+    "Scintilla/Lua/style12/color": 2303527,
+    "Scintilla/Lua/style12/paper": 14729440,
+    "Scintilla/Lua/style13/color": 3233153,
+    "Scintilla/Lua/style13/paper": 13696976,
+    "Scintilla/Lua/style14/color": 3233153,
+    "Scintilla/Lua/style14/paper": 13684991,
+    "Scintilla/Lua/style15/color": 3233153,
+    "Scintilla/Lua/style15/paper": 16765136,
+    "Scintilla/Lua/style16/color": 12044236,
+    "Scintilla/Lua/style16/paper": 1776416,
+    "Scintilla/Lua/style17/color": 12044236,
+    "Scintilla/Lua/style17/paper": 1776416,
+    "Scintilla/Lua/style18/color": 12044236,
+    "Scintilla/Lua/style18/paper": 1776416,
+    "Scintilla/Lua/style19/color": 12044236,
+    "Scintilla/Lua/style19/paper": 1776416,
+    "Scintilla/Lua/style2/color": 7654502,
+    "Scintilla/Lua/style2/paper": 1776416,
+    "Scintilla/Lua/style20/color": 14868992,
+    "Scintilla/Lua/style20/paper": 1776416,
+    "Scintilla/Lua/style4/color": 51400,
+    "Scintilla/Lua/style4/paper": 1776416,
+    "Scintilla/Lua/style5/color": 6333951,
+    "Scintilla/Lua/style5/paper": 1776416,
+    "Scintilla/Lua/style6/color": 12801219,
+    "Scintilla/Lua/style6/paper": 1776416,
+    "Scintilla/Lua/style7/color": 12801219,
+    "Scintilla/Lua/style7/paper": 1776416,
+    "Scintilla/Lua/style8/color": 8323199,
+    "Scintilla/Lua/style8/paper": 14745599,
+    "Scintilla/Lua/style9/color": 14868992,
+    "Scintilla/Lua/style9/paper": 1776416,
+    "Scintilla/Makefile/defaultcolor": 2303527,
+    "Scintilla/Makefile/defaultpaper": 16579836,
+    "Scintilla/Makefile/style0/color": 16777215,
+    "Scintilla/Makefile/style0/paper": 1776416,
+    "Scintilla/Makefile/style1/color": 7654502,
+    "Scintilla/Makefile/style1/paper": 1776416,
+    "Scintilla/Makefile/style2/color": 14868992,
+    "Scintilla/Makefile/style2/paper": 1776416,
+    "Scintilla/Makefile/style3/color": 10067711,
+    "Scintilla/Makefile/style3/paper": 1776416,
+    "Scintilla/Makefile/style4/color": 15129551,
+    "Scintilla/Makefile/style4/paper": 1776416,
+    "Scintilla/Makefile/style5/color": 16742777,
+    "Scintilla/Makefile/style5/paper": 1776416,
+    "Scintilla/Makefile/style9/color": 16776960,
+    "Scintilla/Makefile/style9/paper": 16711680,
+    "Scintilla/Markdown/defaultcolor": 2303527,
+    "Scintilla/Markdown/defaultpaper": 16579836,
+    "Scintilla/Markdown/style0/color": 16777215,
+    "Scintilla/Markdown/style0/paper": 1776416,
+    "Scintilla/Markdown/style1/color": 15373823,
+    "Scintilla/Markdown/style1/paper": 1776416,
+    "Scintilla/Markdown/style10/color": 7827541,
+    "Scintilla/Markdown/style10/paper": 1776416,
+    "Scintilla/Markdown/style11/color": 6709333,
+    "Scintilla/Markdown/style11/paper": 1776416,
+    "Scintilla/Markdown/style12/color": 0,
+    "Scintilla/Markdown/style12/paper": 15658666,
+    "Scintilla/Markdown/style13/color": 8543488,
+    "Scintilla/Markdown/style13/paper": 14604483,
+    "Scintilla/Markdown/style14/color": 112,
+    "Scintilla/Markdown/style14/paper": 12108769,
+    "Scintilla/Markdown/style15/color": 26112,
+    "Scintilla/Markdown/style15/paper": 13360331,
+    "Scintilla/Markdown/style16/color": 14540032,
+    "Scintilla/Markdown/style16/paper": 11141120,
+    "Scintilla/Markdown/style17/color": 2038811,
+    "Scintilla/Markdown/style17/paper": 15192521,
+    "Scintilla/Markdown/style18/color": 8554475,
+    "Scintilla/Markdown/style18/paper": 4671303,
+    "Scintilla/Markdown/style19/color": 16766463,
+    "Scintilla/Markdown/style19/paper": 7370864,
+    "Scintilla/Markdown/style2/color": 5020133,
+    "Scintilla/Markdown/style2/paper": 1776416,
+    "Scintilla/Markdown/style20/color": 16766463,
+    "Scintilla/Markdown/style20/paper": 7370864,
+    "Scintilla/Markdown/style21/color": 9686527,
+    "Scintilla/Markdown/style21/paper": 5661291,
+    "Scintilla/Markdown/style3/color": 5020133,
+    "Scintilla/Markdown/style3/paper": 1776416,
+    "Scintilla/Markdown/style4/color": 15565296,
+    "Scintilla/Markdown/style4/paper": 1776416,
+    "Scintilla/Markdown/style5/color": 15565296,
+    "Scintilla/Markdown/style5/paper": 1776416,
+    "Scintilla/Markdown/style6/color": 16763989,
+    "Scintilla/Markdown/style6/paper": 1776416,
+    "Scintilla/Markdown/style7/color": 14531413,
+    "Scintilla/Markdown/style7/paper": 1776416,
+    "Scintilla/Markdown/style8/color": 12294485,
+    "Scintilla/Markdown/style8/paper": 1776416,
+    "Scintilla/Markdown/style9/color": 10061909,
+    "Scintilla/Markdown/style9/paper": 1776416,
+    "Scintilla/Matlab/defaultcolor": 2303527,
+    "Scintilla/Matlab/defaultpaper": 16579836,
+    "Scintilla/Matlab/style0/color": 16777215,
+    "Scintilla/Matlab/style0/paper": 1776416,
+    "Scintilla/Matlab/style1/color": 7654502,
+    "Scintilla/Matlab/style1/paper": 1776416,
+    "Scintilla/Matlab/style2/color": 14868992,
+    "Scintilla/Matlab/style2/paper": 1776416,
+    "Scintilla/Matlab/style3/color": 51400,
+    "Scintilla/Matlab/style3/paper": 1776416,
+    "Scintilla/Matlab/style4/color": 6333951,
+    "Scintilla/Matlab/style4/paper": 1776416,
+    "Scintilla/Matlab/style5/color": 12801219,
+    "Scintilla/Matlab/style5/paper": 1776416,
+    "Scintilla/Matlab/style6/color": 12235176,
+    "Scintilla/Matlab/style6/paper": 1776416,
+    "Scintilla/Matlab/style7/color": 12044236,
+    "Scintilla/Matlab/style7/paper": 1776416,
+    "Scintilla/Matlab/style8/color": 12801219,
+    "Scintilla/Matlab/style8/paper": 1776416,
+    "Scintilla/MicroPython/defaultcolor": 2303527,
+    "Scintilla/MicroPython/defaultpaper": 16579836,
+    "Scintilla/MicroPython/style0/color": 16777215,
+    "Scintilla/MicroPython/style0/paper": 1776416,
+    "Scintilla/MicroPython/style1/color": 7654502,
+    "Scintilla/MicroPython/style1/paper": 1776416,
+    "Scintilla/MicroPython/style10/color": 12235176,
+    "Scintilla/MicroPython/style10/paper": 1776416,
+    "Scintilla/MicroPython/style11/color": 16777215,
+    "Scintilla/MicroPython/style11/paper": 1776416,
+    "Scintilla/MicroPython/style11/substyle0/paper": 1776416,
+    "Scintilla/MicroPython/style11/substyle1/paper": 1776416,
+    "Scintilla/MicroPython/style11/substyle2/paper": 1776416,
+    "Scintilla/MicroPython/style11/substyle3/paper": 1776416,
+    "Scintilla/MicroPython/style12/color": 2614580,
+    "Scintilla/MicroPython/style12/paper": 1776416,
+    "Scintilla/MicroPython/style13/color": 12434877,
+    "Scintilla/MicroPython/style13/paper": 1776416,
+    "Scintilla/MicroPython/style14/color": 7456511,
+    "Scintilla/MicroPython/style14/paper": 1776416,
+    "Scintilla/MicroPython/style15/color": 14912512,
+    "Scintilla/MicroPython/style15/paper": 1776416,
+    "Scintilla/MicroPython/style16/color": 12801219,
+    "Scintilla/MicroPython/style16/paper": 1776416,
+    "Scintilla/MicroPython/style17/color": 12801219,
+    "Scintilla/MicroPython/style17/paper": 1776416,
+    "Scintilla/MicroPython/style18/color": 14441050,
+    "Scintilla/MicroPython/style18/paper": 1776416,
+    "Scintilla/MicroPython/style19/color": 14441050,
+    "Scintilla/MicroPython/style19/paper": 1776416,
+    "Scintilla/MicroPython/style2/color": 51400,
+    "Scintilla/MicroPython/style2/paper": 1776416,
+    "Scintilla/MicroPython/style3/color": 12801219,
+    "Scintilla/MicroPython/style3/paper": 1776416,
+    "Scintilla/MicroPython/style4/color": 12801219,
+    "Scintilla/MicroPython/style4/paper": 1776416,
+    "Scintilla/MicroPython/style5/color": 6333951,
+    "Scintilla/MicroPython/style5/paper": 1776416,
+    "Scintilla/MicroPython/style6/color": 14441050,
+    "Scintilla/MicroPython/style6/paper": 1776416,
+    "Scintilla/MicroPython/style7/color": 14441050,
+    "Scintilla/MicroPython/style7/paper": 1776416,
+    "Scintilla/MicroPython/style8/color": 43775,
+    "Scintilla/MicroPython/style8/paper": 1776416,
+    "Scintilla/MicroPython/style9/color": 54741,
+    "Scintilla/MicroPython/style9/paper": 1776416,
+    "Scintilla/Octave/defaultcolor": 2303527,
+    "Scintilla/Octave/defaultpaper": 16579836,
+    "Scintilla/Octave/style0/color": 16777215,
+    "Scintilla/Octave/style0/paper": 1776416,
+    "Scintilla/Octave/style1/color": 7654502,
+    "Scintilla/Octave/style1/paper": 1776416,
+    "Scintilla/Octave/style2/color": 14868992,
+    "Scintilla/Octave/style2/paper": 1776416,
+    "Scintilla/Octave/style3/color": 51400,
+    "Scintilla/Octave/style3/paper": 1776416,
+    "Scintilla/Octave/style4/color": 6333951,
+    "Scintilla/Octave/style4/paper": 1776416,
+    "Scintilla/Octave/style5/color": 12801219,
+    "Scintilla/Octave/style5/paper": 1776416,
+    "Scintilla/Octave/style6/color": 12235176,
+    "Scintilla/Octave/style6/paper": 1776416,
+    "Scintilla/Octave/style7/color": 12044236,
+    "Scintilla/Octave/style7/paper": 1776416,
+    "Scintilla/Octave/style8/color": 12801219,
+    "Scintilla/Octave/style8/paper": 1776416,
+    "Scintilla/PO/defaultcolor": 2303527,
+    "Scintilla/PO/defaultpaper": 16579836,
+    "Scintilla/PO/style0/color": 14274500,
+    "Scintilla/PO/style0/paper": 1776416,
+    "Scintilla/PO/style1/color": 55552,
+    "Scintilla/PO/style1/paper": 1776416,
+    "Scintilla/PO/style10/color": 14274500,
+    "Scintilla/PO/style10/paper": 1776416,
+    "Scintilla/PO/style11/color": 14274500,
+    "Scintilla/PO/style11/paper": 1776416,
+    "Scintilla/PO/style12/color": 16755200,
+    "Scintilla/PO/style12/paper": 1776416,
+    "Scintilla/PO/style13/color": 16755200,
+    "Scintilla/PO/style13/paper": 1776416,
+    "Scintilla/PO/style14/color": 16755200,
+    "Scintilla/PO/style14/paper": 1776416,
+    "Scintilla/PO/style2/color": 52953,
+    "Scintilla/PO/style2/paper": 1776416,
+    "Scintilla/PO/style3/color": 14274500,
+    "Scintilla/PO/style3/paper": 1776416,
+    "Scintilla/PO/style4/color": 52953,
+    "Scintilla/PO/style4/paper": 1776416,
+    "Scintilla/PO/style5/color": 14274500,
+    "Scintilla/PO/style5/paper": 1776416,
+    "Scintilla/PO/style6/color": 52953,
+    "Scintilla/PO/style6/paper": 1776416,
+    "Scintilla/PO/style7/color": 14274500,
+    "Scintilla/PO/style7/paper": 1776416,
+    "Scintilla/PO/style8/color": 14274500,
+    "Scintilla/PO/style8/paper": 1776416,
+    "Scintilla/PO/style9/color": 55552,
+    "Scintilla/PO/style9/paper": 1776416,
+    "Scintilla/POV/defaultcolor": 2303527,
+    "Scintilla/POV/defaultpaper": 16579836,
+    "Scintilla/POV/style0/color": 16711808,
+    "Scintilla/POV/style0/paper": 1776416,
+    "Scintilla/POV/style1/color": 9567887,
+    "Scintilla/POV/style1/paper": 1776416,
+    "Scintilla/POV/style10/color": 127,
+    "Scintilla/POV/style10/paper": 16765136,
+    "Scintilla/POV/style11/color": 127,
+    "Scintilla/POV/style11/paper": 16777168,
+    "Scintilla/POV/style12/color": 127,
+    "Scintilla/POV/style12/paper": 16777215,
+    "Scintilla/POV/style13/color": 127,
+    "Scintilla/POV/style13/paper": 13684991,
+    "Scintilla/POV/style14/color": 127,
+    "Scintilla/POV/style14/paper": 13696976,
+    "Scintilla/POV/style15/color": 127,
+    "Scintilla/POV/style15/paper": 13684944,
+    "Scintilla/POV/style16/color": 127,
+    "Scintilla/POV/style16/paper": 14737632,
+    "Scintilla/POV/style2/color": 9567887,
+    "Scintilla/POV/style2/paper": 1776416,
+    "Scintilla/POV/style3/color": 7073518,
+    "Scintilla/POV/style3/paper": 1776416,
+    "Scintilla/POV/style4/color": 16777215,
+    "Scintilla/POV/style4/paper": 1776416,
+    "Scintilla/POV/style5/color": 16777215,
+    "Scintilla/POV/style5/paper": 1776416,
+    "Scintilla/POV/style6/color": 14841061,
+    "Scintilla/POV/style6/paper": 1776416,
+    "Scintilla/POV/style7/color": 0,
+    "Scintilla/POV/style7/paper": 14729440,
+    "Scintilla/POV/style8/color": 16711168,
+    "Scintilla/POV/style8/paper": 1776416,
+    "Scintilla/POV/style9/color": 16744512,
+    "Scintilla/POV/style9/paper": 1776416,
+    "Scintilla/Pascal/defaultcolor": 2303527,
+    "Scintilla/Pascal/defaultpaper": 16579836,
+    "Scintilla/Pascal/style0/color": 16777215,
+    "Scintilla/Pascal/style0/paper": 1776416,
+    "Scintilla/Pascal/style1/color": 12044236,
+    "Scintilla/Pascal/style1/paper": 1776416,
+    "Scintilla/Pascal/style10/color": 12801219,
+    "Scintilla/Pascal/style10/paper": 1776416,
+    "Scintilla/Pascal/style11/color": 0,
+    "Scintilla/Pascal/style11/paper": 14729440,
+    "Scintilla/Pascal/style12/color": 12801219,
+    "Scintilla/Pascal/style12/paper": 1776416,
+    "Scintilla/Pascal/style13/color": 12235176,
+    "Scintilla/Pascal/style13/paper": 1776416,
+    "Scintilla/Pascal/style14/color": 8405120,
+    "Scintilla/Pascal/style14/paper": 1776416,
+    "Scintilla/Pascal/style2/color": 7654502,
+    "Scintilla/Pascal/style2/paper": 1776416,
+    "Scintilla/Pascal/style3/color": 7654502,
+    "Scintilla/Pascal/style3/paper": 1776416,
+    "Scintilla/Pascal/style4/color": 7654502,
+    "Scintilla/Pascal/style4/paper": 1776416,
+    "Scintilla/Pascal/style5/color": 14868992,
+    "Scintilla/Pascal/style5/paper": 1776416,
+    "Scintilla/Pascal/style6/color": 14868992,
+    "Scintilla/Pascal/style6/paper": 1776416,
+    "Scintilla/Pascal/style7/color": 51400,
+    "Scintilla/Pascal/style7/paper": 1776416,
+    "Scintilla/Pascal/style8/color": 51400,
+    "Scintilla/Pascal/style8/paper": 1776416,
+    "Scintilla/Pascal/style9/color": 6333951,
+    "Scintilla/Pascal/style9/paper": 1776416,
+    "Scintilla/Perl/defaultcolor": 2303527,
+    "Scintilla/Perl/defaultpaper": 16579836,
+    "Scintilla/Perl/style0/color": 16777215,
+    "Scintilla/Perl/style0/paper": 1776416,
+    "Scintilla/Perl/style1/color": 16776960,
+    "Scintilla/Perl/style1/paper": 16711680,
+    "Scintilla/Perl/style10/color": 12235176,
+    "Scintilla/Perl/style10/paper": 1776416,
+    "Scintilla/Perl/style11/color": 12235176,
+    "Scintilla/Perl/style11/paper": 1776416,
+    "Scintilla/Perl/style12/color": 0,
+    "Scintilla/Perl/style12/paper": 16769248,
+    "Scintilla/Perl/style13/color": 0,
+    "Scintilla/Perl/style13/paper": 16777184,
+    "Scintilla/Perl/style14/color": 0,
+    "Scintilla/Perl/style14/paper": 16769279,
+    "Scintilla/Perl/style15/color": 0,
+    "Scintilla/Perl/style15/paper": 14737632,
+    "Scintilla/Perl/style17/color": 0,
+    "Scintilla/Perl/style17/paper": 10551200,
+    "Scintilla/Perl/style18/color": 0,
+    "Scintilla/Perl/style18/paper": 15786112,
+    "Scintilla/Perl/style2/color": 7654502,
+    "Scintilla/Perl/style2/paper": 1776416,
+    "Scintilla/Perl/style20/color": 16776960,
+    "Scintilla/Perl/style20/paper": 10518656,
+    "Scintilla/Perl/style21/color": 6291456,
+    "Scintilla/Perl/style21/paper": 16773336,
+    "Scintilla/Perl/style22/color": 0,
+    "Scintilla/Perl/style22/paper": 14536925,
+    "Scintilla/Perl/style23/color": 8323199,
+    "Scintilla/Perl/style23/paper": 14536925,
+    "Scintilla/Perl/style24/color": 8323199,
+    "Scintilla/Perl/style24/paper": 14536925,
+    "Scintilla/Perl/style25/color": 8323199,
+    "Scintilla/Perl/style25/paper": 14536925,
+    "Scintilla/Perl/style26/color": 12801219,
+    "Scintilla/Perl/style26/paper": 1776416,
+    "Scintilla/Perl/style27/color": 12801219,
+    "Scintilla/Perl/style27/paper": 1776416,
+    "Scintilla/Perl/style28/color": 16776960,
+    "Scintilla/Perl/style28/paper": 1776416,
+    "Scintilla/Perl/style29/color": 12235176,
+    "Scintilla/Perl/style29/paper": 1776416,
+    "Scintilla/Perl/style3/color": 16384,
+    "Scintilla/Perl/style3/paper": 14745568,
+    "Scintilla/Perl/style30/color": 12235176,
+    "Scintilla/Perl/style30/paper": 1776416,
+    "Scintilla/Perl/style31/color": 16384,
+    "Scintilla/Perl/style31/paper": 12648384,
+    "Scintilla/Perl/style4/color": 51400,
+    "Scintilla/Perl/style4/paper": 1776416,
+    "Scintilla/Perl/style40/color": 12235176,
+    "Scintilla/Perl/style40/paper": 1776416,
+    "Scintilla/Perl/style41/color": 12583104,
+    "Scintilla/Perl/style41/paper": 1776416,
+    "Scintilla/Perl/style42/color": 12583104,
+    "Scintilla/Perl/style42/paper": 16773375,
+    "Scintilla/Perl/style43/color": 13631488,
+    "Scintilla/Perl/style43/paper": 1776416,
+    "Scintilla/Perl/style44/color": 0,
+    "Scintilla/Perl/style44/paper": 15786112,
+    "Scintilla/Perl/style5/color": 6333951,
+    "Scintilla/Perl/style5/paper": 1776416,
+    "Scintilla/Perl/style54/color": 13631488,
+    "Scintilla/Perl/style54/paper": 1776416,
+    "Scintilla/Perl/style55/color": 13631488,
+    "Scintilla/Perl/style55/paper": 1776416,
+    "Scintilla/Perl/style57/color": 13631488,
+    "Scintilla/Perl/style57/paper": 10518656,
+    "Scintilla/Perl/style6/color": 12801219,
+    "Scintilla/Perl/style6/paper": 1776416,
+    "Scintilla/Perl/style61/color": 13631488,
+    "Scintilla/Perl/style61/paper": 14536925,
+    "Scintilla/Perl/style62/color": 13631488,
+    "Scintilla/Perl/style62/paper": 14536925,
+    "Scintilla/Perl/style64/color": 13631488,
+    "Scintilla/Perl/style64/paper": 1776416,
+    "Scintilla/Perl/style65/color": 13631488,
+    "Scintilla/Perl/style65/paper": 10518656,
+    "Scintilla/Perl/style66/color": 13631488,
+    "Scintilla/Perl/style66/paper": 1776416,
+    "Scintilla/Perl/style7/color": 12801219,
+    "Scintilla/Perl/style7/paper": 1776416,
+    "Scintilla/PostScript/defaultcolor": 2303527,
+    "Scintilla/PostScript/defaultpaper": 16579836,
+    "Scintilla/PostScript/style0/color": 16777215,
+    "Scintilla/PostScript/style0/paper": 1776416,
+    "Scintilla/PostScript/style1/color": 7654502,
+    "Scintilla/PostScript/style1/paper": 1776416,
+    "Scintilla/PostScript/style10/color": 5020415,
+    "Scintilla/PostScript/style10/paper": 1776416,
+    "Scintilla/PostScript/style11/color": 12235176,
+    "Scintilla/PostScript/style11/paper": 1776416,
+    "Scintilla/PostScript/style12/color": 12801219,
+    "Scintilla/PostScript/style12/paper": 1776416,
+    "Scintilla/PostScript/style13/color": 4161343,
+    "Scintilla/PostScript/style13/paper": 1776416,
+    "Scintilla/PostScript/style14/color": 12801219,
+    "Scintilla/PostScript/style14/paper": 1776416,
+    "Scintilla/PostScript/style15/color": 16776960,
+    "Scintilla/PostScript/style15/paper": 16711680,
+    "Scintilla/PostScript/style2/color": 7985273,
+    "Scintilla/PostScript/style2/paper": 1776416,
+    "Scintilla/PostScript/style3/color": 5020415,
+    "Scintilla/PostScript/style3/paper": 1776416,
+    "Scintilla/PostScript/style4/color": 51400,
+    "Scintilla/PostScript/style4/paper": 1776416,
+    "Scintilla/PostScript/style5/color": 12235176,
+    "Scintilla/PostScript/style5/paper": 1776416,
+    "Scintilla/PostScript/style6/color": 6333951,
+    "Scintilla/PostScript/style6/paper": 1776416,
+    "Scintilla/PostScript/style7/color": 14868992,
+    "Scintilla/PostScript/style7/paper": 1776416,
+    "Scintilla/PostScript/style8/color": 14868992,
+    "Scintilla/PostScript/style8/paper": 1776416,
+    "Scintilla/PostScript/style9/color": 6333951,
+    "Scintilla/PostScript/style9/paper": 1776416,
+    "Scintilla/Properties/defaultcolor": 2303527,
+    "Scintilla/Properties/defaultpaper": 16579836,
+    "Scintilla/Properties/style0/color": 16777215,
+    "Scintilla/Properties/style0/paper": 1776416,
+    "Scintilla/Properties/style1/color": 7654502,
+    "Scintilla/Properties/style1/paper": 1776416,
+    "Scintilla/Properties/style2/color": 15502063,
+    "Scintilla/Properties/style2/paper": 1776416,
+    "Scintilla/Properties/style3/color": 14912512,
+    "Scintilla/Properties/style3/paper": 1776416,
+    "Scintilla/Properties/style4/color": 14014060,
+    "Scintilla/Properties/style4/paper": 1776416,
+    "Scintilla/Properties/style5/color": 15261138,
+    "Scintilla/Properties/style5/paper": 1776416,
+    "Scintilla/Protocol Buffer/defaultcolor": 2303527,
+    "Scintilla/Protocol Buffer/defaultpaper": 16579836,
+    "Scintilla/Protocol Buffer/style0/color": 16777215,
+    "Scintilla/Protocol Buffer/style0/paper": 1776416,
+    "Scintilla/Protocol Buffer/style1/color": 7654502,
+    "Scintilla/Protocol Buffer/style1/paper": 1776416,
+    "Scintilla/Protocol Buffer/style10/color": 43775,
+    "Scintilla/Protocol Buffer/style10/paper": 1776416,
+    "Scintilla/Protocol Buffer/style11/color": 43775,
+    "Scintilla/Protocol Buffer/style11/paper": 1776416,
+    "Scintilla/Protocol Buffer/style12/color": 15160661,
+    "Scintilla/Protocol Buffer/style12/paper": 1776416,
+    "Scintilla/Protocol Buffer/style13/color": 43775,
+    "Scintilla/Protocol Buffer/style13/paper": 1776416,
+    "Scintilla/Protocol Buffer/style14/color": 14496049,
+    "Scintilla/Protocol Buffer/style14/paper": 1776416,
+    "Scintilla/Protocol Buffer/style15/color": 14803200,
+    "Scintilla/Protocol Buffer/style15/paper": 1776416,
+    "Scintilla/Protocol Buffer/style16/color": 14606046,
+    "Scintilla/Protocol Buffer/style16/paper": 1776416,
+    "Scintilla/Protocol Buffer/style17/color": 11981115,
+    "Scintilla/Protocol Buffer/style17/paper": 1776416,
+    "Scintilla/Protocol Buffer/style18/color": 11792301,
+    "Scintilla/Protocol Buffer/style18/paper": 1776416,
+    "Scintilla/Protocol Buffer/style19/color": 14785535,
+    "Scintilla/Protocol Buffer/style19/paper": 1776416,
+    "Scintilla/Protocol Buffer/style2/color": 14522624,
+    "Scintilla/Protocol Buffer/style2/paper": 1776416,
+    "Scintilla/Protocol Buffer/style20/color": 16018283,
+    "Scintilla/Protocol Buffer/style20/paper": 1776416,
+    "Scintilla/Protocol Buffer/style21/color": 16018283,
+    "Scintilla/Protocol Buffer/style21/paper": 1776416,
+    "Scintilla/Protocol Buffer/style22/color": 12281480,
+    "Scintilla/Protocol Buffer/style22/paper": 1776416,
+    "Scintilla/Protocol Buffer/style23/color": 12281378,
+    "Scintilla/Protocol Buffer/style23/paper": 1776416,
+    "Scintilla/Protocol Buffer/style24/color": 12281480,
+    "Scintilla/Protocol Buffer/style24/paper": 1776416,
+    "Scintilla/Protocol Buffer/style25/color": 43775,
+    "Scintilla/Protocol Buffer/style25/paper": 1776416,
+    "Scintilla/Protocol Buffer/style26/color": 54016,
+    "Scintilla/Protocol Buffer/style26/paper": 1776416,
+    "Scintilla/Protocol Buffer/style27/color": 51400,
+    "Scintilla/Protocol Buffer/style27/paper": 1776416,
+    "Scintilla/Protocol Buffer/style28/color": 43775,
+    "Scintilla/Protocol Buffer/style28/paper": 1776416,
+    "Scintilla/Protocol Buffer/style29/color": 14508253,
+    "Scintilla/Protocol Buffer/style29/paper": 1776416,
+    "Scintilla/Protocol Buffer/style3/color": 11792301,
+    "Scintilla/Protocol Buffer/style3/paper": 1776416,
+    "Scintilla/Protocol Buffer/style30/color": 14876672,
+    "Scintilla/Protocol Buffer/style30/paper": 1776416,
+    "Scintilla/Protocol Buffer/style31/color": 56576,
+    "Scintilla/Protocol Buffer/style31/paper": 1776416,
+    "Scintilla/Protocol Buffer/style4/color": 11792301,
+    "Scintilla/Protocol Buffer/style4/paper": 1776416,
+    "Scintilla/Protocol Buffer/style40/color": 16711680,
+    "Scintilla/Protocol Buffer/style40/paper": 1776416,
+    "Scintilla/Protocol Buffer/style41/color": 14603209,
+    "Scintilla/Protocol Buffer/style41/paper": 1776416,
+    "Scintilla/Protocol Buffer/style42/color": 14603209,
+    "Scintilla/Protocol Buffer/style42/paper": 1776416,
+    "Scintilla/Protocol Buffer/style43/color": 43775,
+    "Scintilla/Protocol Buffer/style43/paper": 1776416,
+    "Scintilla/Protocol Buffer/style44/color": 13421772,
+    "Scintilla/Protocol Buffer/style44/paper": 1776416,
+    "Scintilla/Protocol Buffer/style45/color": 6915562,
+    "Scintilla/Protocol Buffer/style45/paper": 1776416,
+    "Scintilla/Protocol Buffer/style46/color": 16777215,
+    "Scintilla/Protocol Buffer/style46/paper": 16711680,
+    "Scintilla/Protocol Buffer/style47/color": 32512,
+    "Scintilla/Protocol Buffer/style47/paper": 11075496,
+    "Scintilla/Protocol Buffer/style48/color": 2536928,
+    "Scintilla/Protocol Buffer/style48/paper": 1776416,
+    "Scintilla/Protocol Buffer/style49/color": 14972651,
+    "Scintilla/Protocol Buffer/style49/paper": 1776416,
+    "Scintilla/Protocol Buffer/style5/color": 14579616,
+    "Scintilla/Protocol Buffer/style5/paper": 1776416,
+    "Scintilla/Protocol Buffer/style50/color": 8323199,
+    "Scintilla/Protocol Buffer/style50/paper": 14536925,
+    "Scintilla/Protocol Buffer/style51/color": 16777215,
+    "Scintilla/Protocol Buffer/style51/paper": 1776416,
+    "Scintilla/Protocol Buffer/style52/color": 49152,
+    "Scintilla/Protocol Buffer/style52/paper": 1776416,
+    "Scintilla/Protocol Buffer/style53/color": 14291132,
+    "Scintilla/Protocol Buffer/style53/paper": 1776416,
+    "Scintilla/Protocol Buffer/style54/color": 43775,
+    "Scintilla/Protocol Buffer/style54/paper": 1776416,
+    "Scintilla/Protocol Buffer/style55/color": 12944120,
+    "Scintilla/Protocol Buffer/style55/paper": 1776416,
+    "Scintilla/Protocol Buffer/style56/color": 12944120,
+    "Scintilla/Protocol Buffer/style56/paper": 1776416,
+    "Scintilla/Protocol Buffer/style57/color": 16776960,
+    "Scintilla/Protocol Buffer/style57/paper": 10518656,
+    "Scintilla/Protocol Buffer/style58/color": 12303291,
+    "Scintilla/Protocol Buffer/style58/paper": 1776416,
+    "Scintilla/Protocol Buffer/style6/color": 12235176,
+    "Scintilla/Protocol Buffer/style6/paper": 1776416,
+    "Scintilla/Protocol Buffer/style7/color": 14785535,
+    "Scintilla/Protocol Buffer/style7/paper": 1776416,
+    "Scintilla/Protocol Buffer/style8/color": 11792301,
+    "Scintilla/Protocol Buffer/style8/paper": 1776416,
+    "Scintilla/Protocol Buffer/style9/color": 43775,
+    "Scintilla/Protocol Buffer/style9/paper": 1776416,
+    "Scintilla/Python3/defaultcolor": 2303527,
+    "Scintilla/Python3/defaultpaper": 16579836,
+    "Scintilla/Python3/style0/color": 16777215,
+    "Scintilla/Python3/style0/paper": 1776416,
+    "Scintilla/Python3/style1/color": 7654502,
+    "Scintilla/Python3/style1/paper": 1776416,
+    "Scintilla/Python3/style10/color": 12235176,
+    "Scintilla/Python3/style10/paper": 1776416,
+    "Scintilla/Python3/style11/color": 16777215,
+    "Scintilla/Python3/style11/paper": 1776416,
+    "Scintilla/Python3/style11/substyle0/paper": 1776416,
+    "Scintilla/Python3/style11/substyle1/paper": 1776416,
+    "Scintilla/Python3/style11/substyle2/paper": 1776416,
+    "Scintilla/Python3/style11/substyle3/paper": 1776416,
+    "Scintilla/Python3/style12/color": 2614580,
+    "Scintilla/Python3/style12/paper": 1776416,
+    "Scintilla/Python3/style13/color": 12434877,
+    "Scintilla/Python3/style13/paper": 1776416,
+    "Scintilla/Python3/style14/color": 7456511,
+    "Scintilla/Python3/style14/paper": 1776416,
+    "Scintilla/Python3/style15/color": 14912512,
+    "Scintilla/Python3/style15/paper": 1776416,
+    "Scintilla/Python3/style16/color": 12801219,
+    "Scintilla/Python3/style16/paper": 1776416,
+    "Scintilla/Python3/style17/color": 12801219,
+    "Scintilla/Python3/style17/paper": 1776416,
+    "Scintilla/Python3/style18/color": 14441050,
+    "Scintilla/Python3/style18/paper": 1776416,
+    "Scintilla/Python3/style19/color": 14441050,
+    "Scintilla/Python3/style19/paper": 1776416,
+    "Scintilla/Python3/style2/color": 51400,
+    "Scintilla/Python3/style2/paper": 1776416,
+    "Scintilla/Python3/style3/color": 12801219,
+    "Scintilla/Python3/style3/paper": 1776416,
+    "Scintilla/Python3/style4/color": 12801219,
+    "Scintilla/Python3/style4/paper": 1776416,
+    "Scintilla/Python3/style5/color": 6333951,
+    "Scintilla/Python3/style5/paper": 1776416,
+    "Scintilla/Python3/style6/color": 14441050,
+    "Scintilla/Python3/style6/paper": 1776416,
+    "Scintilla/Python3/style7/color": 14441050,
+    "Scintilla/Python3/style7/paper": 1776416,
+    "Scintilla/Python3/style8/color": 43775,
+    "Scintilla/Python3/style8/paper": 1776416,
+    "Scintilla/Python3/style9/color": 54741,
+    "Scintilla/Python3/style9/paper": 1776416,
+    "Scintilla/QSS/defaultcolor": 2303527,
+    "Scintilla/QSS/defaultpaper": 16579836,
+    "Scintilla/QSS/style0/color": 16777215,
+    "Scintilla/QSS/style0/paper": 1776416,
+    "Scintilla/QSS/style1/color": 7733144,
+    "Scintilla/QSS/style1/paper": 1776416,
+    "Scintilla/QSS/style10/color": 56026,
+    "Scintilla/QSS/style10/paper": 1776416,
+    "Scintilla/QSS/style11/color": 16744448,
+    "Scintilla/QSS/style11/paper": 1776416,
+    "Scintilla/QSS/style12/color": 11184640,
+    "Scintilla/QSS/style12/paper": 1776416,
+    "Scintilla/QSS/style13/color": 16711935,
+    "Scintilla/QSS/style13/paper": 1776416,
+    "Scintilla/QSS/style14/color": 16711935,
+    "Scintilla/QSS/style14/paper": 1776416,
+    "Scintilla/QSS/style15/color": 47103,
+    "Scintilla/QSS/style15/paper": 1776416,
+    "Scintilla/QSS/style16/color": 16741749,
+    "Scintilla/QSS/style16/paper": 1776416,
+    "Scintilla/QSS/style17/color": 13172659,
+    "Scintilla/QSS/style17/paper": 1776416,
+    "Scintilla/QSS/style18/color": 14537416,
+    "Scintilla/QSS/style18/paper": 1776416,
+    "Scintilla/QSS/style19/color": 14537416,
+    "Scintilla/QSS/style19/paper": 1776416,
+    "Scintilla/QSS/style2/color": 16777215,
+    "Scintilla/QSS/style2/paper": 1776416,
+    "Scintilla/QSS/style20/color": 14537416,
+    "Scintilla/QSS/style20/paper": 1776416,
+    "Scintilla/QSS/style21/color": 14537416,
+    "Scintilla/QSS/style21/paper": 1776416,
+    "Scintilla/QSS/style22/color": 13092608,
+    "Scintilla/QSS/style22/paper": 1776416,
+    "Scintilla/QSS/style23/color": 14537416,
+    "Scintilla/QSS/style23/paper": 1776416,
+    "Scintilla/QSS/style3/color": 13394787,
+    "Scintilla/QSS/style3/paper": 1776416,
+    "Scintilla/QSS/style4/color": 16757853,
+    "Scintilla/QSS/style4/paper": 1776416,
+    "Scintilla/QSS/style5/color": 16777215,
+    "Scintilla/QSS/style5/paper": 1776416,
+    "Scintilla/QSS/style6/color": 8497663,
+    "Scintilla/QSS/style6/paper": 1776416,
+    "Scintilla/QSS/style7/color": 16711680,
+    "Scintilla/QSS/style7/paper": 1776416,
+    "Scintilla/QSS/style8/color": 16749244,
+    "Scintilla/QSS/style8/paper": 1776416,
+    "Scintilla/QSS/style9/color": 46080,
+    "Scintilla/QSS/style9/paper": 1776416,
+    "Scintilla/Ruby/defaultcolor": 2303527,
+    "Scintilla/Ruby/defaultpaper": 16579836,
+    "Scintilla/Ruby/style0/color": 16777215,
+    "Scintilla/Ruby/style0/paper": 1776416,
+    "Scintilla/Ruby/style1/color": 16579836,
+    "Scintilla/Ruby/style1/paper": 16711680,
+    "Scintilla/Ruby/style10/color": 12044236,
+    "Scintilla/Ruby/style10/paper": 1776416,
+    "Scintilla/Ruby/style11/color": 12044236,
+    "Scintilla/Ruby/style11/paper": 1776416,
+    "Scintilla/Ruby/style12/color": 0,
+    "Scintilla/Ruby/style12/paper": 10551200,
+    "Scintilla/Ruby/style13/color": 15728880,
+    "Scintilla/Ruby/style13/paper": 1776416,
+    "Scintilla/Ruby/style14/color": 12623920,
+    "Scintilla/Ruby/style14/paper": 1776416,
+    "Scintilla/Ruby/style15/color": 10485920,
+    "Scintilla/Ruby/style15/paper": 1776416,
+    "Scintilla/Ruby/style16/color": 11534464,
+    "Scintilla/Ruby/style16/paper": 1776416,
+    "Scintilla/Ruby/style17/color": 8388784,
+    "Scintilla/Ruby/style17/paper": 1776416,
+    "Scintilla/Ruby/style18/color": 16776960,
+    "Scintilla/Ruby/style18/paper": 10518656,
+    "Scintilla/Ruby/style19/color": 6291456,
+    "Scintilla/Ruby/style19/paper": 16773336,
+    "Scintilla/Ruby/style2/color": 7654502,
+    "Scintilla/Ruby/style2/paper": 1776416,
+    "Scintilla/Ruby/style20/color": 0,
+    "Scintilla/Ruby/style20/paper": 14536925,
+    "Scintilla/Ruby/style21/color": 8323199,
+    "Scintilla/Ruby/style21/paper": 14536925,
+    "Scintilla/Ruby/style24/color": 12801219,
+    "Scintilla/Ruby/style24/paper": 1776416,
+    "Scintilla/Ruby/style25/color": 12801219,
+    "Scintilla/Ruby/style25/paper": 1776416,
+    "Scintilla/Ruby/style26/color": 16776960,
+    "Scintilla/Ruby/style26/paper": 10518656,
+    "Scintilla/Ruby/style27/color": 0,
+    "Scintilla/Ruby/style27/paper": 10551200,
+    "Scintilla/Ruby/style28/color": 0,
+    "Scintilla/Ruby/style28/paper": 16777184,
+    "Scintilla/Ruby/style29/color": 6333951,
+    "Scintilla/Ruby/style29/paper": 1776416,
+    "Scintilla/Ruby/style3/color": 16384,
+    "Scintilla/Ruby/style3/paper": 12648384,
+    "Scintilla/Ruby/style30/color": 2303527,
+    "Scintilla/Ruby/style30/paper": 16744576,
+    "Scintilla/Ruby/style31/color": 2303527,
+    "Scintilla/Ruby/style31/paper": 16744576,
+    "Scintilla/Ruby/style4/color": 51400,
+    "Scintilla/Ruby/style4/paper": 1776416,
+    "Scintilla/Ruby/style40/color": 2303527,
+    "Scintilla/Ruby/style40/paper": 16744576,
+    "Scintilla/Ruby/style5/color": 6333951,
+    "Scintilla/Ruby/style5/paper": 1776416,
+    "Scintilla/Ruby/style6/color": 12801219,
+    "Scintilla/Ruby/style6/paper": 1776416,
+    "Scintilla/Ruby/style7/color": 12801219,
+    "Scintilla/Ruby/style7/paper": 1776416,
+    "Scintilla/Ruby/style8/color": 255,
+    "Scintilla/Ruby/style8/paper": 1776416,
+    "Scintilla/Ruby/style9/color": 51400,
+    "Scintilla/Ruby/style9/paper": 1776416,
+    "Scintilla/SQL/defaultcolor": 2303527,
+    "Scintilla/SQL/defaultpaper": 16579836,
+    "Scintilla/SQL/style0/color": 16777215,
+    "Scintilla/SQL/style0/paper": 1776416,
+    "Scintilla/SQL/style1/color": 7654502,
+    "Scintilla/SQL/style1/paper": 1776416,
+    "Scintilla/SQL/style10/color": 12235176,
+    "Scintilla/SQL/style10/paper": 1776416,
+    "Scintilla/SQL/style11/color": 16777215,
+    "Scintilla/SQL/style11/paper": 1776416,
+    "Scintilla/SQL/style13/color": 7654502,
+    "Scintilla/SQL/style13/paper": 1776416,
+    "Scintilla/SQL/style15/color": 7654502,
+    "Scintilla/SQL/style15/paper": 1776416,
+    "Scintilla/SQL/style17/color": 5020415,
+    "Scintilla/SQL/style17/paper": 1776416,
+    "Scintilla/SQL/style18/color": 16744512,
+    "Scintilla/SQL/style18/paper": 1776416,
+    "Scintilla/SQL/style19/color": 12279039,
+    "Scintilla/SQL/style19/paper": 1776416,
+    "Scintilla/SQL/style2/color": 7654502,
+    "Scintilla/SQL/style2/paper": 1776416,
+    "Scintilla/SQL/style20/color": 16711773,
+    "Scintilla/SQL/style20/paper": 1776416,
+    "Scintilla/SQL/style21/color": 16736609,
+    "Scintilla/SQL/style21/paper": 1776416,
+    "Scintilla/SQL/style22/color": 16481535,
+    "Scintilla/SQL/style22/paper": 1776416,
+    "Scintilla/SQL/style23/color": 15392466,
+    "Scintilla/SQL/style23/paper": 1776416,
+    "Scintilla/SQL/style24/color": 15392466,
+    "Scintilla/SQL/style24/paper": 1776416,
+    "Scintilla/SQL/style3/color": 13619151,
+    "Scintilla/SQL/style3/paper": 1776416,
+    "Scintilla/SQL/style4/color": 8376271,
+    "Scintilla/SQL/style4/paper": 1776416,
+    "Scintilla/SQL/style5/color": 6333951,
+    "Scintilla/SQL/style5/paper": 1776416,
+    "Scintilla/SQL/style6/color": 12801219,
+    "Scintilla/SQL/style6/paper": 1776416,
+    "Scintilla/SQL/style7/color": 12801219,
+    "Scintilla/SQL/style7/paper": 1776416,
+    "Scintilla/SQL/style8/color": 15132300,
+    "Scintilla/SQL/style8/paper": 1776416,
+    "Scintilla/SQL/style9/color": 7654502,
+    "Scintilla/SQL/style9/paper": 1776416,
+    "Scintilla/TCL/defaultcolor": 2303527,
+    "Scintilla/TCL/defaultpaper": 16579836,
+    "Scintilla/TCL/style0/color": 16777215,
+    "Scintilla/TCL/style0/paper": 1776416,
+    "Scintilla/TCL/style1/color": 5278790,
+    "Scintilla/TCL/style1/paper": 15794144,
+    "Scintilla/TCL/style10/color": 12801219,
+    "Scintilla/TCL/style10/paper": 1776416,
+    "Scintilla/TCL/style11/color": 6333951,
+    "Scintilla/TCL/style11/paper": 16777088,
+    "Scintilla/TCL/style12/color": 6333951,
+    "Scintilla/TCL/style12/paper": 1776416,
+    "Scintilla/TCL/style13/color": 6333951,
+    "Scintilla/TCL/style13/paper": 14745584,
+    "Scintilla/TCL/style14/color": 6333951,
+    "Scintilla/TCL/style14/paper": 16773360,
+    "Scintilla/TCL/style15/color": 6333951,
+    "Scintilla/TCL/style15/paper": 16765136,
+    "Scintilla/TCL/style16/color": 6333951,
+    "Scintilla/TCL/style16/paper": 1776416,
+    "Scintilla/TCL/style17/color": 6333951,
+    "Scintilla/TCL/style17/paper": 1776416,
+    "Scintilla/TCL/style18/color": 6333951,
+    "Scintilla/TCL/style18/paper": 1776416,
+    "Scintilla/TCL/style19/color": 6333951,
+    "Scintilla/TCL/style19/paper": 1776416,
+    "Scintilla/TCL/style2/color": 7654502,
+    "Scintilla/TCL/style2/paper": 1776416,
+    "Scintilla/TCL/style20/color": 5278790,
+    "Scintilla/TCL/style20/paper": 15794160,
+    "Scintilla/TCL/style21/color": 2303527,
+    "Scintilla/TCL/style21/paper": 15794160,
+    "Scintilla/TCL/style3/color": 51400,
+    "Scintilla/TCL/style3/paper": 1776416,
+    "Scintilla/TCL/style4/color": 8323199,
+    "Scintilla/TCL/style4/paper": 16773360,
+    "Scintilla/TCL/style5/color": 12801219,
+    "Scintilla/TCL/style5/paper": 16773360,
+    "Scintilla/TCL/style6/color": 12235176,
+    "Scintilla/TCL/style6/paper": 1776416,
+    "Scintilla/TCL/style7/color": 6333951,
+    "Scintilla/TCL/style7/paper": 1776416,
+    "Scintilla/TCL/style8/color": 14868992,
+    "Scintilla/TCL/style8/paper": 15728624,
+    "Scintilla/TCL/style9/color": 14868992,
+    "Scintilla/TCL/style9/paper": 1776416,
+    "Scintilla/TeX/defaultcolor": 2303527,
+    "Scintilla/TeX/defaultpaper": 16579836,
+    "Scintilla/TeX/style0/color": 16777215,
+    "Scintilla/TeX/style0/paper": 1776416,
+    "Scintilla/TeX/style1/color": 51400,
+    "Scintilla/TeX/style1/paper": 1776416,
+    "Scintilla/TeX/style2/color": 16747660,
+    "Scintilla/TeX/style2/paper": 1776416,
+    "Scintilla/TeX/style3/color": 14868992,
+    "Scintilla/TeX/style3/paper": 1776416,
+    "Scintilla/TeX/style4/color": 7654502,
+    "Scintilla/TeX/style4/paper": 1776416,
+    "Scintilla/TeX/style5/color": 12044236,
+    "Scintilla/TeX/style5/paper": 1776416,
+    "Scintilla/VHDL/defaultcolor": 2303527,
+    "Scintilla/VHDL/defaultpaper": 16579836,
+    "Scintilla/VHDL/style0/color": 16777215,
+    "Scintilla/VHDL/style0/paper": 1776416,
+    "Scintilla/VHDL/style1/color": 7654502,
+    "Scintilla/VHDL/style1/paper": 1776416,
+    "Scintilla/VHDL/style10/color": 16744512,
+    "Scintilla/VHDL/style10/paper": 1776416,
+    "Scintilla/VHDL/style11/color": 8421408,
+    "Scintilla/VHDL/style11/paper": 1776416,
+    "Scintilla/VHDL/style12/color": 4259648,
+    "Scintilla/VHDL/style12/paper": 1776416,
+    "Scintilla/VHDL/style13/color": 3860455,
+    "Scintilla/VHDL/style13/paper": 1776416,
+    "Scintilla/VHDL/style14/color": 16744512,
+    "Scintilla/VHDL/style14/paper": 1776416,
+    "Scintilla/VHDL/style15/color": 12044236,
+    "Scintilla/VHDL/style15/paper": 1776416,
+    "Scintilla/VHDL/style2/color": 7133804,
+    "Scintilla/VHDL/style2/paper": 1776416,
+    "Scintilla/VHDL/style3/color": 51400,
+    "Scintilla/VHDL/style3/paper": 1776416,
+    "Scintilla/VHDL/style4/color": 12801219,
+    "Scintilla/VHDL/style4/paper": 1776416,
+    "Scintilla/VHDL/style5/color": 12044236,
+    "Scintilla/VHDL/style5/paper": 1776416,
+    "Scintilla/VHDL/style6/color": 12044236,
+    "Scintilla/VHDL/style6/paper": 1776416,
+    "Scintilla/VHDL/style7/color": 0,
+    "Scintilla/VHDL/style7/paper": 1776416,
+    "Scintilla/VHDL/style8/color": 6333951,
+    "Scintilla/VHDL/style8/paper": 1776416,
+    "Scintilla/VHDL/style9/color": 51400,
+    "Scintilla/VHDL/style9/paper": 1776416,
+    "Scintilla/XML/defaultcolor": 2303527,
+    "Scintilla/XML/defaultpaper": 16579836,
+    "Scintilla/XML/style0/color": 16777215,
+    "Scintilla/XML/style0/paper": 1776416,
+    "Scintilla/XML/style1/color": 10001919,
+    "Scintilla/XML/style1/paper": 1776416,
+    "Scintilla/XML/style10/color": 16711935,
+    "Scintilla/XML/style10/paper": 1776416,
+    "Scintilla/XML/style100/color": 65535,
+    "Scintilla/XML/style100/paper": 4215616,
+    "Scintilla/XML/style101/color": 16777215,
+    "Scintilla/XML/style101/paper": 4215616,
+    "Scintilla/XML/style102/color": 16777215,
+    "Scintilla/XML/style102/paper": 4215616,
+    "Scintilla/XML/style105/color": 16777215,
+    "Scintilla/XML/style105/paper": 1776416,
+    "Scintilla/XML/style106/color": 8421504,
+    "Scintilla/XML/style106/paper": 13627343,
+    "Scintilla/XML/style107/color": 32512,
+    "Scintilla/XML/style107/paper": 13627343,
+    "Scintilla/XML/style108/color": 32639,
+    "Scintilla/XML/style108/paper": 13627343,
+    "Scintilla/XML/style109/color": 8323199,
<