git: ae224e77132d - main - editors/imhex: Update to 1.21.2

From: MANTANI Nobutaka <nobutaka_at_FreeBSD.org>
Date: Sat, 20 Aug 2022 17:50:12 UTC
The branch main has been updated by nobutaka:

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

commit ae224e77132da69c16cce9499331de12de1a1d9b
Author:     MANTANI Nobutaka <nobutaka@FreeBSD.org>
AuthorDate: 2022-08-20 17:48:07 +0000
Commit:     MANTANI Nobutaka <nobutaka@FreeBSD.org>
CommitDate: 2022-08-20 17:49:51 +0000

    editors/imhex: Update to 1.21.2
---
 editors/imhex/Makefile                             |  14 +-
 editors/imhex/distinfo                             |  22 +-
 .../imhex/files/patch-cmake_build__helpers.cmake   |   6 +-
 ...xternal_libromfs_generator_include_embedder.hpp |  21 --
 ...b_external_pattern__language_lib_CMakeLists.txt |  11 +
 ...lib_include_pl_core_ast_ast__node__bitfield.hpp |  11 +
 ...pattern__language_lib_include_pl_core_token.hpp | 235 +++++++++++++++++++++
 ...rnal_pattern__language_lib_include_pl_token.hpp | 235 ---------------------
 ...ttern__language_lib_source_pl_helpers_file.cpp} |  14 +-
 ...ern__language_lib_source_pl_lib_std_string.cpp} |   6 +-
 .../imhex/files/patch-lib_libimhex_CMakeLists.txt  |  16 +-
 ...b_libimhex_include_hex_data__processor_node.hpp |  10 +
 .../patch-lib_libimhex_source_api_imhex__api.cpp   |  19 ++
 .../patch-lib_libimhex_source_helpers_file.cpp     |  10 +-
 .../imhex/files/patch-main_source_init_tasks.cpp   |  20 ++
 ...tin_source_content_providers_disk__provider.cpp |   7 +-
 ...ins_builtin_source_content_views_view__find.cpp |   4 +-
 ...ltin_source_content_views_view__hex__editor.cpp |   4 +-
 ..._source_content_views_view__pattern__editor.cpp |  11 +
 ...atch-plugins_builtin_source_pattern__drawer.cpp |  11 +
 editors/imhex/pkg-plist                            |   6 +-
 21 files changed, 385 insertions(+), 308 deletions(-)

diff --git a/editors/imhex/Makefile b/editors/imhex/Makefile
index 4c6d8ef7284d..53cfed07ab71 100644
--- a/editors/imhex/Makefile
+++ b/editors/imhex/Makefile
@@ -1,5 +1,5 @@
 PORTNAME=	imhex
-PORTVERSION=	1.20.0
+PORTVERSION=	1.21.2
 DISTVERSIONPREFIX=	v
 CATEGORIES=	editors
 MASTER_SITES=	https://git.sr.ht/~danyspin97/xdgpp/blob/f01f810714443d0f10c333d4d1d9c0383be41375/:xdg
@@ -24,7 +24,8 @@ EXTRACT_ONLY=	${DISTNAME}${EXTRACT_SUFX} \
 		WerWolv-PatternLanguage-${GH_TAG_PATTERN_LANGUAGE}_GH0${EXTRACT_SUFX}
 
 BUILD_DEPENDS=	glm>0:math/glm \
-		nlohmann-json>0:devel/nlohmann-json
+		nlohmann-json>0:devel/nlohmann-json \
+		${LOCALBASE}/include/range/v3/range.hpp:devel/range-v3
 LIB_DEPENDS=	libcurl.so:ftp/curl \
 		libfreetype.so:print/freetype2 \
 		libglfw.so:graphics/glfw \
@@ -50,14 +51,13 @@ GH_TUPLE=	btzy:nativefiledialog-extended:${GH_TAG_NATIVEFILEDIALOG}:nativefiledi
 
 GH_TAG_CAPSTONE=	d5141c0
 GH_TAG_FMT=	c4ee726
-GH_TAG_IMHEX_PATTERNS=	eda13b2
-GH_TAG_LIBROMFS=	58757f6
-GH_TAG_NATIVEFILEDIALOG=	3311592
-GH_TAG_PATTERN_LANGUAGE=	a8c4479
+GH_TAG_IMHEX_PATTERNS=	15548b9
+GH_TAG_LIBROMFS=	8c8556d
+GH_TAG_NATIVEFILEDIALOG=	6967d28
+GH_TAG_PATTERN_LANGUAGE=	fd6bb38
 GH_TAG_YARA=	d5a7565
 
 CMAKE_ARGS=	-DUSE_SYSTEM_CURL=ON -DUSE_SYSTEM_NLOHMANN_JSON=ON -DIMHEX_STRIP_RELEASE=OFF -DIMHEX_PLUGINS_IN_SHARE=ON
-CXXFLAGS+=	-fPIC
 
 PORTDOCS=	README.md
 
diff --git a/editors/imhex/distinfo b/editors/imhex/distinfo
index ae7979966eaf..ac034b341dc7 100644
--- a/editors/imhex/distinfo
+++ b/editors/imhex/distinfo
@@ -1,19 +1,19 @@
-TIMESTAMP = 1659725742
+TIMESTAMP = 1661008814
 SHA256 (imhex/xdg.hpp) = 2e08ce74adb71ff9b9aa9e1c999733fccd4b00967b9cf0c0e51dbf049392a9ec
 SIZE (imhex/xdg.hpp) = 7674
-SHA256 (imhex/WerWolv-ImHex-v1.20.0_GH0.tar.gz) = 10cd0a696b7de825e2151ae88082c1e9ce8d1ad44aa4fbb9421025c44598beca
-SIZE (imhex/WerWolv-ImHex-v1.20.0_GH0.tar.gz) = 10654355
-SHA256 (imhex/btzy-nativefiledialog-extended-3311592_GH0.tar.gz) = 8485f3ef81f0882f357482178f29360e29a2957507b35dec7057dcf33e6f628b
-SIZE (imhex/btzy-nativefiledialog-extended-3311592_GH0.tar.gz) = 411759
+SHA256 (imhex/WerWolv-ImHex-v1.21.2_GH0.tar.gz) = 621f569ca105b7567ae076b2d6764413e6ac3619833172d7506f994101b86108
+SIZE (imhex/WerWolv-ImHex-v1.21.2_GH0.tar.gz) = 10738148
+SHA256 (imhex/btzy-nativefiledialog-extended-6967d28_GH0.tar.gz) = 67575871aca25f6b448831183851656d95cee5af773ac7b2a1f7f887f6d874d6
+SIZE (imhex/btzy-nativefiledialog-extended-6967d28_GH0.tar.gz) = 412145
 SHA256 (imhex/capstone-engine-capstone-d5141c0_GH0.tar.gz) = 435d40757928fa73dec19c6d0fbf171bd76341391c8525ce1286927dab44c3e7
 SIZE (imhex/capstone-engine-capstone-d5141c0_GH0.tar.gz) = 5761632
 SHA256 (imhex/fmtlib-fmt-c4ee726_GH0.tar.gz) = 05ba66b0a9ed040e5cfb07e845a0aa61fdbbb9a0cbd22a1860a303e8cbf343e4
 SIZE (imhex/fmtlib-fmt-c4ee726_GH0.tar.gz) = 833672
 SHA256 (imhex/VirusTotal-yara-d5a7565_GH0.tar.gz) = 1c908b160f2432a25aefc1e94147949d24bcb79c1412a2be840f767531f3ff7e
 SIZE (imhex/VirusTotal-yara-d5a7565_GH0.tar.gz) = 1287317
-SHA256 (imhex/WerWolv-ImHex-Patterns-eda13b2_GH0.tar.gz) = 4f7d3c39592c2cc53b1ded6e077b053a1c1a8017ba8b0902197fac65298c40ae
-SIZE (imhex/WerWolv-ImHex-Patterns-eda13b2_GH0.tar.gz) = 4666034
-SHA256 (imhex/WerWolv-PatternLanguage-a8c4479_GH0.tar.gz) = a1afee4cb170377296f7d8e4b123e3009cd0054bdb1f52d8011dd297e1afcb60
-SIZE (imhex/WerWolv-PatternLanguage-a8c4479_GH0.tar.gz) = 269760
-SHA256 (imhex/WerWolv-libromfs-58757f6_GH0.tar.gz) = be53d72ac61c75cfb1b6f0cd8d961ab4a25b1cae95c43aae9a67feb0f185e3a1
-SIZE (imhex/WerWolv-libromfs-58757f6_GH0.tar.gz) = 3864
+SHA256 (imhex/WerWolv-ImHex-Patterns-15548b9_GH0.tar.gz) = 0e9abdd115eb9919bc5526f829110c0f31765cb2576eb1e64d9754c1aefda423
+SIZE (imhex/WerWolv-ImHex-Patterns-15548b9_GH0.tar.gz) = 4673034
+SHA256 (imhex/WerWolv-PatternLanguage-fd6bb38_GH0.tar.gz) = acb0721f2c43e0f0e909955fee2e3e8ff9894fedcb945d256edfd56c25a68137
+SIZE (imhex/WerWolv-PatternLanguage-fd6bb38_GH0.tar.gz) = 277785
+SHA256 (imhex/WerWolv-libromfs-8c8556d_GH0.tar.gz) = 46364edcf21a4cbe7c48094e755751aa03704a9c1efe3be5add5f52a15690474
+SIZE (imhex/WerWolv-libromfs-8c8556d_GH0.tar.gz) = 3868
diff --git a/editors/imhex/files/patch-cmake_build__helpers.cmake b/editors/imhex/files/patch-cmake_build__helpers.cmake
index 0d0d1a798f82..658333ed0c52 100644
--- a/editors/imhex/files/patch-cmake_build__helpers.cmake
+++ b/editors/imhex/files/patch-cmake_build__helpers.cmake
@@ -1,6 +1,6 @@
---- cmake/build_helpers.cmake.orig	2022-08-05 10:52:34 UTC
+--- cmake/build_helpers.cmake.orig	2022-08-14 12:54:20 UTC
 +++ cmake/build_helpers.cmake
-@@ -352,17 +352,9 @@ function(downloadImHexPatternsFiles dest)
+@@ -367,17 +367,9 @@ function(downloadImHexPatternsFiles dest)
              set(PATTERNS_BRANCH ImHex-v${IMHEX_VERSION})
          endif ()
  
@@ -19,7 +19,7 @@
          endforeach ()
      endif ()
  
-@@ -370,7 +362,6 @@ endfunction()
+@@ -385,7 +377,6 @@ endfunction()
  
  macro(setupCompilerWarnings target)
      set(IMHEX_COMMON_FLAGS "-Wall -Wextra -Werror")
diff --git a/editors/imhex/files/patch-lib_external_libromfs_generator_include_embedder.hpp b/editors/imhex/files/patch-lib_external_libromfs_generator_include_embedder.hpp
deleted file mode 100644
index 3abd57283287..000000000000
--- a/editors/imhex/files/patch-lib_external_libromfs_generator_include_embedder.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
---- lib/external/libromfs/generator/include/embedder.hpp.orig	2022-07-07 16:28:45 UTC
-+++ lib/external/libromfs/generator/include/embedder.hpp
-@@ -20,13 +20,13 @@ R"embedder(
- 
-     #define RESOURCE(name, path)                        \
-     __asm__ (                                           \
--        ".global _" #name "\n"                          \
--        ".global _" #name "_size\n"                     \
--        "_" #name ":\n"                                 \
-+        ".global " #name "\n"                          \
-+        ".global " #name "_size\n"                     \
-+        #name ":\n"                                 \
-             ".incbin \"" path "\"\n"                    \
-             ".align 8\n"                                \
--        "_" #name "_size:\n"                            \
--            ".int _" #name "_size - _" #name " - 1\n"   \
-+        #name "_size:\n"                            \
-+            ".int " #name "_size - " #name " - 1\n"   \
-             ".align 8\n"                                \
-     )
- 
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_CMakeLists.txt b/editors/imhex/files/patch-lib_external_pattern__language_lib_CMakeLists.txt
new file mode 100644
index 000000000000..871b7d4466b3
--- /dev/null
+++ b/editors/imhex/files/patch-lib_external_pattern__language_lib_CMakeLists.txt
@@ -0,0 +1,11 @@
+--- lib/external/pattern_language/lib/CMakeLists.txt.orig	2022-08-18 14:28:54 UTC
++++ lib/external/pattern_language/lib/CMakeLists.txt
+@@ -1,7 +1,7 @@
+ cmake_minimum_required(VERSION 3.16)
+ project(libpl)
+ 
+-set(CMAKE_CXX_STANDARD 20)
++set(CMAKE_CXX_STANDARD 23)
+ 
+ if (LIBPL_SHARED_LIBRARY)
+     set(LIBRARY_TYPE SHARED)
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_ast_ast__node__bitfield.hpp b/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_ast_ast__node__bitfield.hpp
new file mode 100644
index 000000000000..cc4198d9685b
--- /dev/null
+++ b/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_ast_ast__node__bitfield.hpp
@@ -0,0 +1,11 @@
+--- lib/external/pattern_language/lib/include/pl/core/ast/ast_node_bitfield.hpp.orig	2022-08-18 14:31:33 UTC
++++ lib/external/pattern_language/lib/include/pl/core/ast/ast_node_bitfield.hpp
+@@ -86,7 +86,6 @@ namespace pl::core::ast {
+ 
+     private:
+         std::vector<std::unique_ptr<ASTNode>> m_entries;
+-        mutable size_t m_bitOffset = 0x00;
+     };
+ 
+ }
+\ No newline at end of file
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_token.hpp b/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_token.hpp
new file mode 100644
index 000000000000..3ea7d313dc01
--- /dev/null
+++ b/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_core_token.hpp
@@ -0,0 +1,235 @@
+--- lib/external/pattern_language/lib/include/pl/core/token.hpp.orig	2022-08-20 15:51:46 UTC
++++ lib/external/pattern_language/lib/include/pl/core/token.hpp
+@@ -153,9 +153,9 @@ namespace pl::core {
+ 
+         using Literal    = std::variant<char, bool, u128, i128, double, std::string, ptrn::Pattern *>;
+         using ValueTypes = std::variant<Keyword, Identifier, Operator, Literal, ValueType, Separator>;
++        // These changes are necessary for Clang
++        inline Token(Type type, auto value, u32 line, u32 column) : type(type), value(std::move(value)), line(line), column(column) {}
+ 
+-        constexpr Token(Type type, auto value, u32 line, u32 column) : type(type), value(std::move(value)), line(line), column(column) {}
+-
+         [[nodiscard]] constexpr static inline bool isInteger(const ValueType &type) {
+             return isUnsigned(type) || isSigned(type);
+         }
+@@ -431,128 +431,128 @@ namespace pl::core {
+ 
+     namespace tkn {
+ 
+-        constexpr inline Token createToken(const core::Token::Type type, const core::Token::ValueTypes &value) {
++        inline Token createToken(const core::Token::Type type, const core::Token::ValueTypes &value) {
+             return { type, value, 1, 1 };
+         }
+ 
+         namespace Keyword {
+ 
+-            constexpr auto If           = createToken(core::Token::Type::Keyword, Token::Keyword::If);
+-            constexpr auto Else         = createToken(core::Token::Type::Keyword, Token::Keyword::Else);
+-            constexpr auto While        = createToken(core::Token::Type::Keyword, Token::Keyword::While);
+-            constexpr auto For          = createToken(core::Token::Type::Keyword, Token::Keyword::For);
+-            constexpr auto Return       = createToken(core::Token::Type::Keyword, Token::Keyword::Return);
+-            constexpr auto Break        = createToken(core::Token::Type::Keyword, Token::Keyword::Break);
+-            constexpr auto Continue     = createToken(core::Token::Type::Keyword, Token::Keyword::Continue);
+-            constexpr auto Struct       = createToken(core::Token::Type::Keyword, Token::Keyword::Struct);
+-            constexpr auto Enum         = createToken(core::Token::Type::Keyword, Token::Keyword::Enum);
+-            constexpr auto Union        = createToken(core::Token::Type::Keyword, Token::Keyword::Union);
+-            constexpr auto Function     = createToken(core::Token::Type::Keyword, Token::Keyword::Function);
+-            constexpr auto Bitfield     = createToken(core::Token::Type::Keyword, Token::Keyword::Bitfield);
+-            constexpr auto LittleEndian = createToken(core::Token::Type::Keyword, Token::Keyword::LittleEndian);
+-            constexpr auto BigEndian    = createToken(core::Token::Type::Keyword, Token::Keyword::BigEndian);
+-            constexpr auto Parent       = createToken(core::Token::Type::Keyword, Token::Keyword::Parent);
+-            constexpr auto Namespace    = createToken(core::Token::Type::Keyword, Token::Keyword::Namespace);
+-            constexpr auto Using        = createToken(core::Token::Type::Keyword, Token::Keyword::Using);
+-            constexpr auto This         = createToken(core::Token::Type::Keyword, Token::Keyword::This);
+-            constexpr auto In           = createToken(core::Token::Type::Keyword, Token::Keyword::In);
+-            constexpr auto Out          = createToken(core::Token::Type::Keyword, Token::Keyword::Out);
++            inline auto If           = createToken(core::Token::Type::Keyword, Token::Keyword::If);
++            inline auto Else         = createToken(core::Token::Type::Keyword, Token::Keyword::Else);
++            inline auto While        = createToken(core::Token::Type::Keyword, Token::Keyword::While);
++            inline auto For          = createToken(core::Token::Type::Keyword, Token::Keyword::For);
++            inline auto Return       = createToken(core::Token::Type::Keyword, Token::Keyword::Return);
++            inline auto Break        = createToken(core::Token::Type::Keyword, Token::Keyword::Break);
++            inline auto Continue     = createToken(core::Token::Type::Keyword, Token::Keyword::Continue);
++            inline auto Struct       = createToken(core::Token::Type::Keyword, Token::Keyword::Struct);
++            inline auto Enum         = createToken(core::Token::Type::Keyword, Token::Keyword::Enum);
++            inline auto Union        = createToken(core::Token::Type::Keyword, Token::Keyword::Union);
++            inline auto Function     = createToken(core::Token::Type::Keyword, Token::Keyword::Function);
++            inline auto Bitfield     = createToken(core::Token::Type::Keyword, Token::Keyword::Bitfield);
++            inline auto LittleEndian = createToken(core::Token::Type::Keyword, Token::Keyword::LittleEndian);
++            inline auto BigEndian    = createToken(core::Token::Type::Keyword, Token::Keyword::BigEndian);
++            inline auto Parent       = createToken(core::Token::Type::Keyword, Token::Keyword::Parent);
++            inline auto Namespace    = createToken(core::Token::Type::Keyword, Token::Keyword::Namespace);
++            inline auto Using        = createToken(core::Token::Type::Keyword, Token::Keyword::Using);
++            inline auto This         = createToken(core::Token::Type::Keyword, Token::Keyword::This);
++            inline auto In           = createToken(core::Token::Type::Keyword, Token::Keyword::In);
++            inline auto Out          = createToken(core::Token::Type::Keyword, Token::Keyword::Out);
+ 
+         }
+ 
+         namespace Literal {
+ 
+-            constexpr auto Identifier   = [](const std::string &name = { }) -> Token     { return createToken(core::Token::Type::Identifier, Token::Identifier(name)); };
+-            constexpr auto Numeric      = [](const Token::Literal &value = { }) -> Token { return createToken(core::Token::Type::Integer, value); };
+-            constexpr auto String       = [](const std::string &value = { }) -> Token    { return createToken(core::Token::Type::String, Token::Literal(value)); };
++            inline auto Identifier   = [](const std::string &name = { }) -> Token     { return createToken(core::Token::Type::Identifier, Token::Identifier(name)); };
++            inline auto Numeric      = [](const Token::Literal &value = { }) -> Token { return createToken(core::Token::Type::Integer, value); };
++            inline auto String       = [](const std::string &value = { }) -> Token    { return createToken(core::Token::Type::String, Token::Literal(value)); };
+ 
+         }
+ 
+         namespace Operator {
+ 
+-            constexpr auto Plus                     = createToken(core::Token::Type::Operator, Token::Operator::Plus);
+-            constexpr auto Minus                    = createToken(core::Token::Type::Operator, Token::Operator::Minus);
+-            constexpr auto Star                     = createToken(core::Token::Type::Operator, Token::Operator::Star);
+-            constexpr auto Slash                    = createToken(core::Token::Type::Operator, Token::Operator::Slash);
+-            constexpr auto Percent                  = createToken(core::Token::Type::Operator, Token::Operator::Percent);
+-            constexpr auto LeftShift                = createToken(core::Token::Type::Operator, Token::Operator::LeftShift);
+-            constexpr auto RightShift               = createToken(core::Token::Type::Operator, Token::Operator::RightShift);
+-            constexpr auto BitAnd                   = createToken(core::Token::Type::Operator, Token::Operator::BitAnd);
+-            constexpr auto BitOr                    = createToken(core::Token::Type::Operator, Token::Operator::BitOr);
+-            constexpr auto BitXor                   = createToken(core::Token::Type::Operator, Token::Operator::BitXor);
+-            constexpr auto BitNot                   = createToken(core::Token::Type::Operator, Token::Operator::BitNot);
+-            constexpr auto BoolEqual                = createToken(core::Token::Type::Operator, Token::Operator::BoolEqual);
+-            constexpr auto BoolNotEqual             = createToken(core::Token::Type::Operator, Token::Operator::BoolNotEqual);
+-            constexpr auto BoolLessThan             = createToken(core::Token::Type::Operator, Token::Operator::BoolLessThan);
+-            constexpr auto BoolGreaterThan          = createToken(core::Token::Type::Operator, Token::Operator::BoolGreaterThan);
+-            constexpr auto BoolLessThanOrEqual      = createToken(core::Token::Type::Operator, Token::Operator::BoolLessThanOrEqual);
+-            constexpr auto BoolGreaterThanOrEqual   = createToken(core::Token::Type::Operator, Token::Operator::BoolGreaterThanOrEqual);
+-            constexpr auto BoolAnd                  = createToken(core::Token::Type::Operator, Token::Operator::BoolAnd);
+-            constexpr auto BoolOr                   = createToken(core::Token::Type::Operator, Token::Operator::BoolOr);
+-            constexpr auto BoolNot                  = createToken(core::Token::Type::Operator, Token::Operator::BoolNot);
+-            constexpr auto BoolXor                  = createToken(core::Token::Type::Operator, Token::Operator::BoolXor);
+-            constexpr auto Dollar                   = createToken(core::Token::Type::Operator, Token::Operator::Dollar);
+-            constexpr auto Colon                    = createToken(core::Token::Type::Operator, Token::Operator::Colon);
+-            constexpr auto ScopeResolution          = createToken(core::Token::Type::Operator, Token::Operator::ScopeResolution);
+-            constexpr auto TernaryConditional       = createToken(core::Token::Type::Operator, Token::Operator::TernaryConditional);
+-            constexpr auto AddressOf                = createToken(core::Token::Type::Operator, Token::Operator::AddressOf);
+-            constexpr auto SizeOf                   = createToken(core::Token::Type::Operator, Token::Operator::SizeOf);
+-            constexpr auto At                       = createToken(core::Token::Type::Operator, Token::Operator::At);
+-            constexpr auto Assign                   = createToken(core::Token::Type::Operator, Token::Operator::Assign);
++            inline auto Plus                     = createToken(core::Token::Type::Operator, Token::Operator::Plus);
++            inline auto Minus                    = createToken(core::Token::Type::Operator, Token::Operator::Minus);
++            inline auto Star                     = createToken(core::Token::Type::Operator, Token::Operator::Star);
++            inline auto Slash                    = createToken(core::Token::Type::Operator, Token::Operator::Slash);
++            inline auto Percent                  = createToken(core::Token::Type::Operator, Token::Operator::Percent);
++            inline auto LeftShift                = createToken(core::Token::Type::Operator, Token::Operator::LeftShift);
++            inline auto RightShift               = createToken(core::Token::Type::Operator, Token::Operator::RightShift);
++            inline auto BitAnd                   = createToken(core::Token::Type::Operator, Token::Operator::BitAnd);
++            inline auto BitOr                    = createToken(core::Token::Type::Operator, Token::Operator::BitOr);
++            inline auto BitXor                   = createToken(core::Token::Type::Operator, Token::Operator::BitXor);
++            inline auto BitNot                   = createToken(core::Token::Type::Operator, Token::Operator::BitNot);
++            inline auto BoolEqual                = createToken(core::Token::Type::Operator, Token::Operator::BoolEqual);
++            inline auto BoolNotEqual             = createToken(core::Token::Type::Operator, Token::Operator::BoolNotEqual);
++            inline auto BoolLessThan             = createToken(core::Token::Type::Operator, Token::Operator::BoolLessThan);
++            inline auto BoolGreaterThan          = createToken(core::Token::Type::Operator, Token::Operator::BoolGreaterThan);
++            inline auto BoolLessThanOrEqual      = createToken(core::Token::Type::Operator, Token::Operator::BoolLessThanOrEqual);
++            inline auto BoolGreaterThanOrEqual   = createToken(core::Token::Type::Operator, Token::Operator::BoolGreaterThanOrEqual);
++            inline auto BoolAnd                  = createToken(core::Token::Type::Operator, Token::Operator::BoolAnd);
++            inline auto BoolOr                   = createToken(core::Token::Type::Operator, Token::Operator::BoolOr);
++            inline auto BoolNot                  = createToken(core::Token::Type::Operator, Token::Operator::BoolNot);
++            inline auto BoolXor                  = createToken(core::Token::Type::Operator, Token::Operator::BoolXor);
++            inline auto Dollar                   = createToken(core::Token::Type::Operator, Token::Operator::Dollar);
++            inline auto Colon                    = createToken(core::Token::Type::Operator, Token::Operator::Colon);
++            inline auto ScopeResolution          = createToken(core::Token::Type::Operator, Token::Operator::ScopeResolution);
++            inline auto TernaryConditional       = createToken(core::Token::Type::Operator, Token::Operator::TernaryConditional);
++            inline auto AddressOf                = createToken(core::Token::Type::Operator, Token::Operator::AddressOf);
++            inline auto SizeOf                   = createToken(core::Token::Type::Operator, Token::Operator::SizeOf);
++            inline auto At                       = createToken(core::Token::Type::Operator, Token::Operator::At);
++            inline auto Assign                   = createToken(core::Token::Type::Operator, Token::Operator::Assign);
+ 
+         }
+ 
+         namespace ValueType {
+ 
+-            constexpr auto CustomType       = createToken(core::Token::Type::ValueType, Token::ValueType::CustomType);
+-            constexpr auto Padding          = createToken(core::Token::Type::ValueType, Token::ValueType::Padding);
+-            constexpr auto Unsigned         = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned);
+-            constexpr auto Signed           = createToken(core::Token::Type::ValueType, Token::ValueType::Signed);
+-            constexpr auto FloatingPoint    = createToken(core::Token::Type::ValueType, Token::ValueType::FloatingPoint);
+-            constexpr auto Auto             = createToken(core::Token::Type::ValueType, Token::ValueType::Auto);
+-            constexpr auto Any              = createToken(core::Token::Type::ValueType, Token::ValueType::Any);
++            inline auto CustomType       = createToken(core::Token::Type::ValueType, Token::ValueType::CustomType);
++            inline auto Padding          = createToken(core::Token::Type::ValueType, Token::ValueType::Padding);
++            inline auto Unsigned         = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned);
++            inline auto Signed           = createToken(core::Token::Type::ValueType, Token::ValueType::Signed);
++            inline auto FloatingPoint    = createToken(core::Token::Type::ValueType, Token::ValueType::FloatingPoint);
++            inline auto Auto             = createToken(core::Token::Type::ValueType, Token::ValueType::Auto);
++            inline auto Any              = createToken(core::Token::Type::ValueType, Token::ValueType::Any);
+ 
+-            constexpr auto Unsigned8Bit     = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned8Bit);
+-            constexpr auto Unsigned16Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned16Bit);
+-            constexpr auto Unsigned24Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned24Bit);
+-            constexpr auto Unsigned32Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned32Bit);
+-            constexpr auto Unsigned48Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned48Bit);
+-            constexpr auto Unsigned64Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned64Bit);
+-            constexpr auto Unsigned96Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned96Bit);
+-            constexpr auto Unsigned128Bit   = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned128Bit);
++            inline auto Unsigned8Bit     = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned8Bit);
++            inline auto Unsigned16Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned16Bit);
++            inline auto Unsigned24Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned24Bit);
++            inline auto Unsigned32Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned32Bit);
++            inline auto Unsigned48Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned48Bit);
++            inline auto Unsigned64Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned64Bit);
++            inline auto Unsigned96Bit    = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned96Bit);
++            inline auto Unsigned128Bit   = createToken(core::Token::Type::ValueType, Token::ValueType::Unsigned128Bit);
+ 
+-            constexpr auto Signed8Bit       = createToken(core::Token::Type::ValueType, Token::ValueType::Signed8Bit);
+-            constexpr auto Signed16Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed16Bit);
+-            constexpr auto Signed24Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed24Bit);
+-            constexpr auto Signed32Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed32Bit);
+-            constexpr auto Signed48Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed48Bit);
+-            constexpr auto Signed64Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed64Bit);
+-            constexpr auto Signed96Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed96Bit);
+-            constexpr auto Signed128Bit     = createToken(core::Token::Type::ValueType, Token::ValueType::Signed128Bit);
++            inline auto Signed8Bit       = createToken(core::Token::Type::ValueType, Token::ValueType::Signed8Bit);
++            inline auto Signed16Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed16Bit);
++            inline auto Signed24Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed24Bit);
++            inline auto Signed32Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed32Bit);
++            inline auto Signed48Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed48Bit);
++            inline auto Signed64Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed64Bit);
++            inline auto Signed96Bit      = createToken(core::Token::Type::ValueType, Token::ValueType::Signed96Bit);
++            inline auto Signed128Bit     = createToken(core::Token::Type::ValueType, Token::ValueType::Signed128Bit);
+ 
+-            constexpr auto Float            = createToken(core::Token::Type::ValueType, Token::ValueType::Float);
+-            constexpr auto Double           = createToken(core::Token::Type::ValueType, Token::ValueType::Double);
++            inline auto Float            = createToken(core::Token::Type::ValueType, Token::ValueType::Float);
++            inline auto Double           = createToken(core::Token::Type::ValueType, Token::ValueType::Double);
+ 
+-            constexpr auto Boolean          = createToken(core::Token::Type::ValueType, Token::ValueType::Boolean);
++            inline auto Boolean          = createToken(core::Token::Type::ValueType, Token::ValueType::Boolean);
+ 
+-            constexpr auto Character        = createToken(core::Token::Type::ValueType, Token::ValueType::Character);
+-            constexpr auto Character16      = createToken(core::Token::Type::ValueType, Token::ValueType::Character16);
+-            constexpr auto String           = createToken(core::Token::Type::ValueType, Token::ValueType::String);
++            inline auto Character        = createToken(core::Token::Type::ValueType, Token::ValueType::Character);
++            inline auto Character16      = createToken(core::Token::Type::ValueType, Token::ValueType::Character16);
++            inline auto String           = createToken(core::Token::Type::ValueType, Token::ValueType::String);
+ 
+         }
+ 
+         namespace Separator {
+ 
+-            constexpr auto Comma            = createToken(core::Token::Type::Separator, Token::Separator::Comma);
+-            constexpr auto LeftParenthesis  = createToken(core::Token::Type::Separator, Token::Separator::LeftParenthesis);
+-            constexpr auto RightParenthesis = createToken(core::Token::Type::Separator, Token::Separator::RightParenthesis);
+-            constexpr auto LeftBracket      = createToken(core::Token::Type::Separator, Token::Separator::LeftBracket);
+-            constexpr auto RightBracket     = createToken(core::Token::Type::Separator, Token::Separator::RightBracket);
+-            constexpr auto LeftBrace        = createToken(core::Token::Type::Separator, Token::Separator::LeftBrace);
+-            constexpr auto RightBrace       = createToken(core::Token::Type::Separator, Token::Separator::RightBrace);
+-            constexpr auto Dot              = createToken(core::Token::Type::Separator, Token::Separator::Dot);
+-            constexpr auto Semicolon        = createToken(core::Token::Type::Separator, Token::Separator::Semicolon);
+-            constexpr auto EndOfProgram     = createToken(core::Token::Type::Separator, Token::Separator::EndOfProgram);
++            inline auto Comma            = createToken(core::Token::Type::Separator, Token::Separator::Comma);
++            inline auto LeftParenthesis  = createToken(core::Token::Type::Separator, Token::Separator::LeftParenthesis);
++            inline auto RightParenthesis = createToken(core::Token::Type::Separator, Token::Separator::RightParenthesis);
++            inline auto LeftBracket      = createToken(core::Token::Type::Separator, Token::Separator::LeftBracket);
++            inline auto RightBracket     = createToken(core::Token::Type::Separator, Token::Separator::RightBracket);
++            inline auto LeftBrace        = createToken(core::Token::Type::Separator, Token::Separator::LeftBrace);
++            inline auto RightBrace       = createToken(core::Token::Type::Separator, Token::Separator::RightBrace);
++            inline auto Dot              = createToken(core::Token::Type::Separator, Token::Separator::Dot);
++            inline auto Semicolon        = createToken(core::Token::Type::Separator, Token::Separator::Semicolon);
++            inline auto EndOfProgram     = createToken(core::Token::Type::Separator, Token::Separator::EndOfProgram);
+ 
+         }
+ 
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_token.hpp b/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_token.hpp
deleted file mode 100644
index d8832acb9a55..000000000000
--- a/editors/imhex/files/patch-lib_external_pattern__language_lib_include_pl_token.hpp
+++ /dev/null
@@ -1,235 +0,0 @@
---- lib/external/pattern_language/lib/include/pl/token.hpp.orig	2022-07-26 16:45:45 UTC
-+++ lib/external/pattern_language/lib/include/pl/token.hpp
-@@ -148,9 +148,9 @@ namespace pl {
- 
-         using Literal    = std::variant<char, bool, u128, i128, double, std::string, Pattern *>;
-         using ValueTypes = std::variant<Keyword, Identifier, Operator, Literal, ValueType, Separator>;
-+        // These changes are necessary for Clang
-+        inline Token(Type type, auto value, u32 line, u32 column) : type(type), value(std::move(value)), line(line), column(column) {}
- 
--        constexpr Token(Type type, auto value, u32 line, u32 column) : type(type), value(std::move(value)), line(line), column(column) {}
--
-         [[nodiscard]] constexpr static inline bool isInteger(const ValueType &type) {
-             return isUnsigned(type) || isSigned(type);
-         }
-@@ -306,128 +306,128 @@ namespace pl {
- 
-     namespace tkn {
- 
--        constexpr inline Token createToken(const pl::Token::Type type, const pl::Token::ValueTypes &value) {
-+        inline Token createToken(const pl::Token::Type type, const pl::Token::ValueTypes &value) {
-             return { type, value, 0, 0 };
-         }
- 
-         namespace Keyword {
- 
--            constexpr auto If           = createToken(pl::Token::Type::Keyword, Token::Keyword::If);
--            constexpr auto Else         = createToken(pl::Token::Type::Keyword, Token::Keyword::Else);
--            constexpr auto While        = createToken(pl::Token::Type::Keyword, Token::Keyword::While);
--            constexpr auto For          = createToken(pl::Token::Type::Keyword, Token::Keyword::For);
--            constexpr auto Return       = createToken(pl::Token::Type::Keyword, Token::Keyword::Return);
--            constexpr auto Break        = createToken(pl::Token::Type::Keyword, Token::Keyword::Break);
--            constexpr auto Continue     = createToken(pl::Token::Type::Keyword, Token::Keyword::Continue);
--            constexpr auto Struct       = createToken(pl::Token::Type::Keyword, Token::Keyword::Struct);
--            constexpr auto Enum         = createToken(pl::Token::Type::Keyword, Token::Keyword::Enum);
--            constexpr auto Union        = createToken(pl::Token::Type::Keyword, Token::Keyword::Union);
--            constexpr auto Function     = createToken(pl::Token::Type::Keyword, Token::Keyword::Function);
--            constexpr auto Bitfield     = createToken(pl::Token::Type::Keyword, Token::Keyword::Bitfield);
--            constexpr auto LittleEndian = createToken(pl::Token::Type::Keyword, Token::Keyword::LittleEndian);
--            constexpr auto BigEndian    = createToken(pl::Token::Type::Keyword, Token::Keyword::BigEndian);
--            constexpr auto Parent       = createToken(pl::Token::Type::Keyword, Token::Keyword::Parent);
--            constexpr auto Namespace    = createToken(pl::Token::Type::Keyword, Token::Keyword::Namespace);
--            constexpr auto Using        = createToken(pl::Token::Type::Keyword, Token::Keyword::Using);
--            constexpr auto This         = createToken(pl::Token::Type::Keyword, Token::Keyword::This);
--            constexpr auto In           = createToken(pl::Token::Type::Keyword, Token::Keyword::In);
--            constexpr auto Out          = createToken(pl::Token::Type::Keyword, Token::Keyword::Out);
-+            inline auto If           = createToken(pl::Token::Type::Keyword, Token::Keyword::If);
-+            inline auto Else         = createToken(pl::Token::Type::Keyword, Token::Keyword::Else);
-+            inline auto While        = createToken(pl::Token::Type::Keyword, Token::Keyword::While);
-+            inline auto For          = createToken(pl::Token::Type::Keyword, Token::Keyword::For);
-+            inline auto Return       = createToken(pl::Token::Type::Keyword, Token::Keyword::Return);
-+            inline auto Break        = createToken(pl::Token::Type::Keyword, Token::Keyword::Break);
-+            inline auto Continue     = createToken(pl::Token::Type::Keyword, Token::Keyword::Continue);
-+            inline auto Struct       = createToken(pl::Token::Type::Keyword, Token::Keyword::Struct);
-+            inline auto Enum         = createToken(pl::Token::Type::Keyword, Token::Keyword::Enum);
-+            inline auto Union        = createToken(pl::Token::Type::Keyword, Token::Keyword::Union);
-+            inline auto Function     = createToken(pl::Token::Type::Keyword, Token::Keyword::Function);
-+            inline auto Bitfield     = createToken(pl::Token::Type::Keyword, Token::Keyword::Bitfield);
-+            inline auto LittleEndian = createToken(pl::Token::Type::Keyword, Token::Keyword::LittleEndian);
-+            inline auto BigEndian    = createToken(pl::Token::Type::Keyword, Token::Keyword::BigEndian);
-+            inline auto Parent       = createToken(pl::Token::Type::Keyword, Token::Keyword::Parent);
-+            inline auto Namespace    = createToken(pl::Token::Type::Keyword, Token::Keyword::Namespace);
-+            inline auto Using        = createToken(pl::Token::Type::Keyword, Token::Keyword::Using);
-+            inline auto This         = createToken(pl::Token::Type::Keyword, Token::Keyword::This);
-+            inline auto In           = createToken(pl::Token::Type::Keyword, Token::Keyword::In);
-+            inline auto Out          = createToken(pl::Token::Type::Keyword, Token::Keyword::Out);
- 
-         }
- 
-         namespace Literal {
- 
--            constexpr auto Identifier   = [](const std::string &name = { }) -> Token     { return createToken(pl::Token::Type::Identifier, Token::Identifier(name)); };
--            constexpr auto Numeric      = [](const Token::Literal &value = { }) -> Token { return createToken(pl::Token::Type::Integer, value); };
--            constexpr auto String       = [](const std::string &value = { }) -> Token    { return createToken(pl::Token::Type::String, Token::Literal(value)); };
-+            inline auto Identifier   = [](const std::string &name = { }) -> Token     { return createToken(pl::Token::Type::Identifier, Token::Identifier(name)); };
-+            inline auto Numeric      = [](const Token::Literal &value = { }) -> Token { return createToken(pl::Token::Type::Integer, value); };
-+            inline auto String       = [](const std::string &value = { }) -> Token    { return createToken(pl::Token::Type::String, Token::Literal(value)); };
- 
-         }
- 
-         namespace Operator {
- 
--            constexpr auto Plus                     = createToken(pl::Token::Type::Operator, Token::Operator::Plus);
--            constexpr auto Minus                    = createToken(pl::Token::Type::Operator, Token::Operator::Minus);
--            constexpr auto Star                     = createToken(pl::Token::Type::Operator, Token::Operator::Star);
--            constexpr auto Slash                    = createToken(pl::Token::Type::Operator, Token::Operator::Slash);
--            constexpr auto Percent                  = createToken(pl::Token::Type::Operator, Token::Operator::Percent);
--            constexpr auto LeftShift                = createToken(pl::Token::Type::Operator, Token::Operator::LeftShift);
--            constexpr auto RightShift               = createToken(pl::Token::Type::Operator, Token::Operator::RightShift);
--            constexpr auto BitAnd                   = createToken(pl::Token::Type::Operator, Token::Operator::BitAnd);
--            constexpr auto BitOr                    = createToken(pl::Token::Type::Operator, Token::Operator::BitOr);
--            constexpr auto BitXor                   = createToken(pl::Token::Type::Operator, Token::Operator::BitXor);
--            constexpr auto BitNot                   = createToken(pl::Token::Type::Operator, Token::Operator::BitNot);
--            constexpr auto BoolEqual                = createToken(pl::Token::Type::Operator, Token::Operator::BoolEqual);
--            constexpr auto BoolNotEqual             = createToken(pl::Token::Type::Operator, Token::Operator::BoolNotEqual);
--            constexpr auto BoolLessThan             = createToken(pl::Token::Type::Operator, Token::Operator::BoolLessThan);
--            constexpr auto BoolGreaterThan          = createToken(pl::Token::Type::Operator, Token::Operator::BoolGreaterThan);
--            constexpr auto BoolLessThanOrEqual      = createToken(pl::Token::Type::Operator, Token::Operator::BoolLessThanOrEqual);
--            constexpr auto BoolGreaterThanOrEqual   = createToken(pl::Token::Type::Operator, Token::Operator::BoolGreaterThanOrEqual);
--            constexpr auto BoolAnd                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolAnd);
--            constexpr auto BoolOr                   = createToken(pl::Token::Type::Operator, Token::Operator::BoolOr);
--            constexpr auto BoolNot                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolNot);
--            constexpr auto BoolXor                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolXor);
--            constexpr auto Dollar                   = createToken(pl::Token::Type::Operator, Token::Operator::Dollar);
--            constexpr auto Colon                    = createToken(pl::Token::Type::Operator, Token::Operator::Colon);
--            constexpr auto ScopeResolution          = createToken(pl::Token::Type::Operator, Token::Operator::ScopeResolution);
--            constexpr auto TernaryConditional       = createToken(pl::Token::Type::Operator, Token::Operator::TernaryConditional);
--            constexpr auto AddressOf                = createToken(pl::Token::Type::Operator, Token::Operator::AddressOf);
--            constexpr auto SizeOf                   = createToken(pl::Token::Type::Operator, Token::Operator::SizeOf);
--            constexpr auto At                       = createToken(pl::Token::Type::Operator, Token::Operator::At);
--            constexpr auto Assign                   = createToken(pl::Token::Type::Operator, Token::Operator::Assign);
-+            inline auto Plus                     = createToken(pl::Token::Type::Operator, Token::Operator::Plus);
-+            inline auto Minus                    = createToken(pl::Token::Type::Operator, Token::Operator::Minus);
-+            inline auto Star                     = createToken(pl::Token::Type::Operator, Token::Operator::Star);
-+            inline auto Slash                    = createToken(pl::Token::Type::Operator, Token::Operator::Slash);
-+            inline auto Percent                  = createToken(pl::Token::Type::Operator, Token::Operator::Percent);
-+            inline auto LeftShift                = createToken(pl::Token::Type::Operator, Token::Operator::LeftShift);
-+            inline auto RightShift               = createToken(pl::Token::Type::Operator, Token::Operator::RightShift);
-+            inline auto BitAnd                   = createToken(pl::Token::Type::Operator, Token::Operator::BitAnd);
-+            inline auto BitOr                    = createToken(pl::Token::Type::Operator, Token::Operator::BitOr);
-+            inline auto BitXor                   = createToken(pl::Token::Type::Operator, Token::Operator::BitXor);
-+            inline auto BitNot                   = createToken(pl::Token::Type::Operator, Token::Operator::BitNot);
-+            inline auto BoolEqual                = createToken(pl::Token::Type::Operator, Token::Operator::BoolEqual);
-+            inline auto BoolNotEqual             = createToken(pl::Token::Type::Operator, Token::Operator::BoolNotEqual);
-+            inline auto BoolLessThan             = createToken(pl::Token::Type::Operator, Token::Operator::BoolLessThan);
-+            inline auto BoolGreaterThan          = createToken(pl::Token::Type::Operator, Token::Operator::BoolGreaterThan);
-+            inline auto BoolLessThanOrEqual      = createToken(pl::Token::Type::Operator, Token::Operator::BoolLessThanOrEqual);
-+            inline auto BoolGreaterThanOrEqual   = createToken(pl::Token::Type::Operator, Token::Operator::BoolGreaterThanOrEqual);
-+            inline auto BoolAnd                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolAnd);
-+            inline auto BoolOr                   = createToken(pl::Token::Type::Operator, Token::Operator::BoolOr);
-+            inline auto BoolNot                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolNot);
-+            inline auto BoolXor                  = createToken(pl::Token::Type::Operator, Token::Operator::BoolXor);
-+            inline auto Dollar                   = createToken(pl::Token::Type::Operator, Token::Operator::Dollar);
-+            inline auto Colon                    = createToken(pl::Token::Type::Operator, Token::Operator::Colon);
-+            inline auto ScopeResolution          = createToken(pl::Token::Type::Operator, Token::Operator::ScopeResolution);
-+            inline auto TernaryConditional       = createToken(pl::Token::Type::Operator, Token::Operator::TernaryConditional);
-+            inline auto AddressOf                = createToken(pl::Token::Type::Operator, Token::Operator::AddressOf);
-+            inline auto SizeOf                   = createToken(pl::Token::Type::Operator, Token::Operator::SizeOf);
-+            inline auto At                       = createToken(pl::Token::Type::Operator, Token::Operator::At);
-+            inline auto Assign                   = createToken(pl::Token::Type::Operator, Token::Operator::Assign);
- 
-         }
- 
-         namespace ValueType {
- 
--            constexpr auto CustomType       = createToken(pl::Token::Type::ValueType, Token::ValueType::CustomType);
--            constexpr auto Padding          = createToken(pl::Token::Type::ValueType, Token::ValueType::Padding);
--            constexpr auto Unsigned         = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned);
--            constexpr auto Signed           = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed);
--            constexpr auto FloatingPoint    = createToken(pl::Token::Type::ValueType, Token::ValueType::FloatingPoint);
--            constexpr auto Auto             = createToken(pl::Token::Type::ValueType, Token::ValueType::Auto);
--            constexpr auto Any              = createToken(pl::Token::Type::ValueType, Token::ValueType::Any);
-+            inline auto CustomType       = createToken(pl::Token::Type::ValueType, Token::ValueType::CustomType);
-+            inline auto Padding          = createToken(pl::Token::Type::ValueType, Token::ValueType::Padding);
-+            inline auto Unsigned         = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned);
-+            inline auto Signed           = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed);
-+            inline auto FloatingPoint    = createToken(pl::Token::Type::ValueType, Token::ValueType::FloatingPoint);
-+            inline auto Auto             = createToken(pl::Token::Type::ValueType, Token::ValueType::Auto);
-+            inline auto Any              = createToken(pl::Token::Type::ValueType, Token::ValueType::Any);
- 
--            constexpr auto Unsigned8Bit     = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned8Bit);
--            constexpr auto Unsigned16Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned16Bit);
--            constexpr auto Unsigned24Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned24Bit);
--            constexpr auto Unsigned32Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned32Bit);
--            constexpr auto Unsigned48Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned48Bit);
--            constexpr auto Unsigned64Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned64Bit);
--            constexpr auto Unsigned96Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned96Bit);
--            constexpr auto Unsigned128Bit   = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned128Bit);
-+            inline auto Unsigned8Bit     = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned8Bit);
-+            inline auto Unsigned16Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned16Bit);
-+            inline auto Unsigned24Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned24Bit);
-+            inline auto Unsigned32Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned32Bit);
-+            inline auto Unsigned48Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned48Bit);
-+            inline auto Unsigned64Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned64Bit);
-+            inline auto Unsigned96Bit    = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned96Bit);
-+            inline auto Unsigned128Bit   = createToken(pl::Token::Type::ValueType, Token::ValueType::Unsigned128Bit);
- 
--            constexpr auto Signed8Bit       = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed8Bit);
--            constexpr auto Signed16Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed16Bit);
--            constexpr auto Signed24Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed24Bit);
--            constexpr auto Signed32Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed32Bit);
--            constexpr auto Signed48Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed48Bit);
--            constexpr auto Signed64Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed64Bit);
--            constexpr auto Signed96Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed96Bit);
--            constexpr auto Signed128Bit     = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed128Bit);
-+            inline auto Signed8Bit       = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed8Bit);
-+            inline auto Signed16Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed16Bit);
-+            inline auto Signed24Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed24Bit);
-+            inline auto Signed32Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed32Bit);
-+            inline auto Signed48Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed48Bit);
-+            inline auto Signed64Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed64Bit);
-+            inline auto Signed96Bit      = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed96Bit);
-+            inline auto Signed128Bit     = createToken(pl::Token::Type::ValueType, Token::ValueType::Signed128Bit);
- 
--            constexpr auto Float            = createToken(pl::Token::Type::ValueType, Token::ValueType::Float);
--            constexpr auto Double           = createToken(pl::Token::Type::ValueType, Token::ValueType::Double);
-+            inline auto Float            = createToken(pl::Token::Type::ValueType, Token::ValueType::Float);
-+            inline auto Double           = createToken(pl::Token::Type::ValueType, Token::ValueType::Double);
- 
--            constexpr auto Boolean          = createToken(pl::Token::Type::ValueType, Token::ValueType::Boolean);
-+            inline auto Boolean          = createToken(pl::Token::Type::ValueType, Token::ValueType::Boolean);
- 
--            constexpr auto Character        = createToken(pl::Token::Type::ValueType, Token::ValueType::Character);
--            constexpr auto Character16      = createToken(pl::Token::Type::ValueType, Token::ValueType::Character16);
--            constexpr auto String           = createToken(pl::Token::Type::ValueType, Token::ValueType::String);
-+            inline auto Character        = createToken(pl::Token::Type::ValueType, Token::ValueType::Character);
-+            inline auto Character16      = createToken(pl::Token::Type::ValueType, Token::ValueType::Character16);
-+            inline auto String           = createToken(pl::Token::Type::ValueType, Token::ValueType::String);
- 
-         }
- 
-         namespace Separator {
- 
--            constexpr auto Comma            = createToken(pl::Token::Type::Separator, Token::Separator::Comma);
--            constexpr auto LeftParenthesis  = createToken(pl::Token::Type::Separator, Token::Separator::LeftParenthesis);
--            constexpr auto RightParenthesis = createToken(pl::Token::Type::Separator, Token::Separator::RightParenthesis);
--            constexpr auto LeftBracket      = createToken(pl::Token::Type::Separator, Token::Separator::LeftBracket);
--            constexpr auto RightBracket     = createToken(pl::Token::Type::Separator, Token::Separator::RightBracket);
--            constexpr auto LeftBrace        = createToken(pl::Token::Type::Separator, Token::Separator::LeftBrace);
--            constexpr auto RightBrace       = createToken(pl::Token::Type::Separator, Token::Separator::RightBrace);
--            constexpr auto Dot              = createToken(pl::Token::Type::Separator, Token::Separator::Dot);
--            constexpr auto Semicolon        = createToken(pl::Token::Type::Separator, Token::Separator::Semicolon);
--            constexpr auto EndOfProgram     = createToken(pl::Token::Type::Separator, Token::Separator::EndOfProgram);
-+            inline auto Comma            = createToken(pl::Token::Type::Separator, Token::Separator::Comma);
-+            inline auto LeftParenthesis  = createToken(pl::Token::Type::Separator, Token::Separator::LeftParenthesis);
-+            inline auto RightParenthesis = createToken(pl::Token::Type::Separator, Token::Separator::RightParenthesis);
-+            inline auto LeftBracket      = createToken(pl::Token::Type::Separator, Token::Separator::LeftBracket);
-+            inline auto RightBracket     = createToken(pl::Token::Type::Separator, Token::Separator::RightBracket);
-+            inline auto LeftBrace        = createToken(pl::Token::Type::Separator, Token::Separator::LeftBrace);
-+            inline auto RightBrace       = createToken(pl::Token::Type::Separator, Token::Separator::RightBrace);
-+            inline auto Dot              = createToken(pl::Token::Type::Separator, Token::Separator::Dot);
-+            inline auto Semicolon        = createToken(pl::Token::Type::Separator, Token::Separator::Semicolon);
-+            inline auto EndOfProgram     = createToken(pl::Token::Type::Separator, Token::Separator::EndOfProgram);
- 
-         }
- 
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_source_helpers_file.cpp b/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_helpers_file.cpp
similarity index 81%
rename from editors/imhex/files/patch-lib_external_pattern__language_lib_source_helpers_file.cpp
rename to editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_helpers_file.cpp
index 571fabd78504..493d143c3cf4 100644
--- a/editors/imhex/files/patch-lib_external_pattern__language_lib_source_helpers_file.cpp
+++ b/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_helpers_file.cpp
@@ -1,6 +1,6 @@
---- lib/external/pattern_language/lib/source/helpers/file.cpp.orig	2022-07-05 14:00:57 UTC
-+++ lib/external/pattern_language/lib/source/helpers/file.cpp
-@@ -20,12 +20,12 @@ namespace pl::fs {
+--- lib/external/pattern_language/lib/source/pl/helpers/file.cpp.orig	2022-08-14 15:37:26 UTC
++++ lib/external/pattern_language/lib/source/pl/helpers/file.cpp
+@@ -19,12 +19,12 @@ namespace pl::hlp::fs {
                  this->m_file = _wfopen(path.c_str(), L"w+b");
          #else
              if (mode == File::Mode::Read)
@@ -16,7 +16,7 @@
          #endif
      }
  
-@@ -53,7 +53,7 @@ namespace pl::fs {
+@@ -52,7 +52,7 @@ namespace pl::hlp::fs {
  
  
      void File::seek(u64 offset) {
@@ -25,7 +25,7 @@
      }
  
      void File::close() {
-@@ -138,10 +138,10 @@ namespace pl::fs {
+@@ -137,10 +137,10 @@ namespace pl::hlp::fs {
      size_t File::getSize() const {
          if (!isValid()) return 0;
  
@@ -40,12 +40,12 @@
  
          if (size < 0)
              return 0;
-@@ -152,7 +152,7 @@ namespace pl::fs {
+@@ -151,7 +151,7 @@ namespace pl::hlp::fs {
      void File::setSize(u64 size) {
          if (!isValid()) return;
  
 -        auto result = ftruncate64(fileno(this->m_file), size);
 +        auto result = ftruncate(fileno(this->m_file), size);
-         pl::unused(result);
+         hlp::unused(result);
      }
  
diff --git a/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_libstd_string.cpp b/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_lib_std_string.cpp
similarity index 61%
rename from editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_libstd_string.cpp
rename to editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_lib_std_string.cpp
index 585fca11d7d1..9c419ffccee2 100644
--- a/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_libstd_string.cpp
+++ b/editors/imhex/files/patch-lib_external_pattern__language_lib_source_pl_lib_std_string.cpp
@@ -1,6 +1,6 @@
---- lib/external/pattern_language/lib/source/pl/libstd/string.cpp.orig	2022-07-05 14:26:01 UTC
-+++ lib/external/pattern_language/lib/source/pl/libstd/string.cpp
-@@ -33,7 +33,7 @@ namespace pl::libstd::string {
+--- lib/external/pattern_language/lib/source/pl/lib/std/string.cpp.orig	2022-08-14 15:35:34 UTC
++++ lib/external/pattern_language/lib/source/pl/lib/std/string.cpp
+@@ -35,7 +35,7 @@ namespace pl::lib::libstd::string {
                  const auto signIndex = index >> (sizeof(index) * 8 - 1);
                  const auto absIndex  = (index ^ signIndex) - signIndex;
  #else
diff --git a/editors/imhex/files/patch-lib_libimhex_CMakeLists.txt b/editors/imhex/files/patch-lib_libimhex_CMakeLists.txt
index 1aa13a5835d3..cc5d449b4c4b 100644
--- a/editors/imhex/files/patch-lib_libimhex_CMakeLists.txt
+++ b/editors/imhex/files/patch-lib_libimhex_CMakeLists.txt
@@ -1,10 +1,10 @@
---- lib/libimhex/CMakeLists.txt.orig	2022-08-05 10:52:34 UTC
+--- lib/libimhex/CMakeLists.txt.orig	2022-08-14 12:54:20 UTC
 +++ lib/libimhex/CMakeLists.txt
-@@ -10,7 +10,6 @@ set_target_properties(imgui PROPERTIES POSITION_INDEPE
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../external/microtar ${CMAKE_CURRENT_BINARY_DIR}/external/microtar EXCLUDE_FROM_ALL)
- set_target_properties(microtar PROPERTIES POSITION_INDEPENDENT_CODE ON)
+@@ -26,7 +26,6 @@ set(FPHSA_NAME_MISMATCHED ON CACHE BOOL "")
+ find_package(PkgConfig REQUIRED)
  
--set(NFD_PORTAL ON CACHE BOOL "Use Portals for Linux file dialogs" FORCE)
- set(NFD_USE_ALLOWEDCONTENTTYPES OFF CACHE BOOL "Disable allowedContentTypes for macOS file dialogs" FORCE)
- add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../external/nativefiledialog ${CMAKE_CURRENT_BINARY_DIR}/external/nativefiledialog EXCLUDE_FROM_ALL)
- set_target_properties(nfd PROPERTIES POSITION_INDEPENDENT_CODE ON)
+ if (NOT USE_SYSTEM_NFD)
+-    set(NFD_PORTAL ON CACHE BOOL "Use Portals for Linux file dialogs" FORCE)
+     add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../external/nativefiledialog ${CMAKE_CURRENT_BINARY_DIR}/external/nativefiledialog EXCLUDE_FROM_ALL)
+     set_target_properties(nfd PROPERTIES POSITION_INDEPENDENT_CODE ON)
+     set(NFD_LIBRARIES nfd)
diff --git a/editors/imhex/files/patch-lib_libimhex_include_hex_data__processor_node.hpp b/editors/imhex/files/patch-lib_libimhex_include_hex_data__processor_node.hpp
new file mode 100644
index 000000000000..a42bdab95f2b
--- /dev/null
+++ b/editors/imhex/files/patch-lib_libimhex_include_hex_data__processor_node.hpp
@@ -0,0 +1,10 @@
+--- lib/libimhex/include/hex/data_processor/node.hpp.orig	2022-08-14 15:02:06 UTC
++++ lib/libimhex/include/hex/data_processor/node.hpp
+@@ -45,6 +45,7 @@ namespace hex::dp {
+         struct NodeError {
+             Node *node;
+             std::string message;
++            NodeError(Node *n, std::string m) : node(n), message(m) {};
+         };
+ 
+         void resetOutputData() {
diff --git a/editors/imhex/files/patch-lib_libimhex_source_api_imhex__api.cpp b/editors/imhex/files/patch-lib_libimhex_source_api_imhex__api.cpp
new file mode 100644
index 000000000000..a38d2f10790f
--- /dev/null
+++ b/editors/imhex/files/patch-lib_libimhex_source_api_imhex__api.cpp
@@ -0,0 +1,19 @@
+--- lib/libimhex/source/api/imhex_api.cpp.orig	2022-08-17 21:25:52 UTC
++++ lib/libimhex/source/api/imhex_api.cpp
+@@ -4,6 +4,7 @@
+ #include <hex/api/event.hpp>
+ #include <hex/providers/provider.hpp>
+ 
++#include <range/v3/algorithm.hpp>
+ #include <utility>
+ #include <unistd.h>
+ 
+@@ -260,7 +261,7 @@ namespace hex {
+         }
+ 
+         bool isDirty() {
+-            return std::ranges::any_of(s_providers, [](const auto &provider) {
++            return ranges::any_of(s_providers, [](const auto &provider) {
+                 return provider->isDirty();
+             });
+         }
diff --git a/editors/imhex/files/patch-lib_libimhex_source_helpers_file.cpp b/editors/imhex/files/patch-lib_libimhex_source_helpers_file.cpp
index 2373a25e000c..f0d74435b58e 100644
--- a/editors/imhex/files/patch-lib_libimhex_source_helpers_file.cpp
+++ b/editors/imhex/files/patch-lib_libimhex_source_helpers_file.cpp
@@ -1,6 +1,6 @@
---- lib/libimhex/source/helpers/file.cpp.orig	2022-07-04 19:53:18 UTC
+--- lib/libimhex/source/helpers/file.cpp.orig	2022-08-17 21:25:52 UTC
 +++ lib/libimhex/source/helpers/file.cpp
-@@ -16,12 +16,12 @@ namespace hex::fs {
+@@ -17,12 +17,12 @@ namespace hex::fs {
                  this->m_file = _wfopen(path.c_str(), L"w+b");
          #else
              if (mode == File::Mode::Read)
@@ -16,7 +16,7 @@
          #endif
      }
  
-@@ -49,7 +49,7 @@ namespace hex::fs {
+@@ -50,7 +50,7 @@ namespace hex::fs {
  
  
      void File::seek(u64 offset) {
@@ -25,7 +25,7 @@
      }
  
      void File::close() {
-@@ -134,10 +134,10 @@ namespace hex::fs {
+@@ -135,10 +135,10 @@ namespace hex::fs {
      size_t File::getSize() const {
          if (!isValid()) return 0;
  
@@ -40,7 +40,7 @@
  
          if (size < 0)
              return 0;
-@@ -148,7 +148,7 @@ namespace hex::fs {
+@@ -149,7 +149,7 @@ namespace hex::fs {
      void File::setSize(u64 size) {
          if (!isValid()) return;
  
diff --git a/editors/imhex/files/patch-main_source_init_tasks.cpp b/editors/imhex/files/patch-main_source_init_tasks.cpp
new file mode 100644
index 000000000000..97f2f64982b8
--- /dev/null
+++ b/editors/imhex/files/patch-main_source_init_tasks.cpp
@@ -0,0 +1,20 @@
+--- main/source/init/tasks.cpp.orig	2022-08-20 13:59:16 UTC
++++ main/source/init/tasks.cpp
+@@ -4,6 +4,7 @@
+ #include <imgui_freetype.h>
+ 
+ #include <hex/api/content_registry.hpp>
++#include <hex/api/project_file_manager.hpp>
+ #include <hex/ui/view.hpp>
+ #include <hex/helpers/net.hpp>
+ #include <hex/helpers/fs.hpp>
+@@ -228,6 +229,9 @@ namespace hex::init {
+                 delete visualizer;
+             visualizers.clear();
+         }
++
++        ProjectFile::getHandlers().clear();
++        ProjectFile::getProviderHandlers().clear();
+ 
+         return true;
+     }
diff --git a/editors/imhex/files/patch-plugins_builtin_source_content_providers_disk__provider.cpp b/editors/imhex/files/patch-plugins_builtin_source_content_providers_disk__provider.cpp
index 058bc825f254..2269f67780d5 100644
--- a/editors/imhex/files/patch-plugins_builtin_source_content_providers_disk__provider.cpp
+++ b/editors/imhex/files/patch-plugins_builtin_source_content_providers_disk__provider.cpp
@@ -1,12 +1,13 @@
---- plugins/builtin/source/content/providers/disk_provider.cpp.orig	2022-03-03 13:32:30 UTC
+--- plugins/builtin/source/content/providers/disk_provider.cpp.orig	2022-08-14 12:54:20 UTC
 +++ plugins/builtin/source/content/providers/disk_provider.cpp
-@@ -17,7 +17,9 @@
+@@ -18,8 +18,9 @@
      #include <sys/stat.h>
      #include <sys/types.h>
  
 +# if !defined(__FreeBSD__)
      #define lseek lseek64
+-
 +# endif
  #elif defined(OS_MACOS)
+ 
      #include <fcntl.h>
-     #include <unistd.h>
diff --git a/editors/imhex/files/patch-plugins_builtin_source_content_views_view__find.cpp b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__find.cpp
index 1d4e2b2cf385..f05750165eea 100644
--- a/editors/imhex/files/patch-plugins_builtin_source_content_views_view__find.cpp
+++ b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__find.cpp
@@ -1,6 +1,6 @@
---- plugins/builtin/source/content/views/view_find.cpp.orig	2022-08-05 19:36:42 UTC
+--- plugins/builtin/source/content/views/view_find.cpp.orig	2022-08-17 21:25:52 UTC
 +++ plugins/builtin/source/content/views/view_find.cpp
-@@ -247,7 +247,7 @@ namespace hex::plugin::builtin {
+@@ -236,7 +236,7 @@ namespace hex::plugin::builtin {
          auto sequence = hex::decodeByteString(settings.sequence);
          auto occurrence = reader.begin();
          while (true) {
diff --git a/editors/imhex/files/patch-plugins_builtin_source_content_views_view__hex__editor.cpp b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__hex__editor.cpp
index 57f838771c5e..211e587b0096 100644
--- a/editors/imhex/files/patch-plugins_builtin_source_content_views_view__hex__editor.cpp
+++ b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__hex__editor.cpp
@@ -1,6 +1,6 @@
---- plugins/builtin/source/content/views/view_hex_editor.cpp.orig	2022-07-26 14:13:07 UTC
+--- plugins/builtin/source/content/views/view_hex_editor.cpp.orig	2022-08-17 21:25:52 UTC
 +++ plugins/builtin/source/content/views/view_hex_editor.cpp
-@@ -208,7 +208,7 @@ namespace hex::plugin::builtin {
+@@ -250,7 +250,7 @@ namespace hex::plugin::builtin {
                  reader.seek(this->m_searchPosition.value_or(editor->getSelection().getStartAddress()));
  
              constexpr static auto searchFunction = [](const auto &haystackBegin, const auto &haystackEnd, const auto &needleBegin, const auto &needleEnd) {
diff --git a/editors/imhex/files/patch-plugins_builtin_source_content_views_view__pattern__editor.cpp b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__pattern__editor.cpp
new file mode 100644
index 000000000000..59dc184fb2d7
--- /dev/null
+++ b/editors/imhex/files/patch-plugins_builtin_source_content_views_view__pattern__editor.cpp
@@ -0,0 +1,11 @@
+--- plugins/builtin/source/content/views/view_pattern_editor.cpp.orig	2022-08-20 15:52:06 UTC
++++ plugins/builtin/source/content/views/view_pattern_editor.cpp
+@@ -741,7 +741,7 @@ namespace hex::plugin::builtin {
+                     ImGui::TableNextColumn();
+                     ImGui::TextFormatted("{}", pattern->getEndian() == std::endian::little ? "hex.builtin.common.little"_lang : "hex.builtin.common.big"_lang);
+ 
+-                    if (const auto &comment = pattern->getComment(); comment.has_value()) {
++                    if (const auto &comment = pattern->getComment(); comment != nullptr) {
+                         ImGui::TableNextRow();
+                         ImGui::TableNextColumn();
+                         ImGui::TextFormatted("{}: ", "hex.builtin.common.comment"_lang);
diff --git a/editors/imhex/files/patch-plugins_builtin_source_pattern__drawer.cpp b/editors/imhex/files/patch-plugins_builtin_source_pattern__drawer.cpp
new file mode 100644
index 000000000000..73a8ad7e7f02
--- /dev/null
+++ b/editors/imhex/files/patch-plugins_builtin_source_pattern__drawer.cpp
@@ -0,0 +1,11 @@
+--- plugins/builtin/source/pattern_drawer.cpp.orig	2022-08-20 15:51:56 UTC
++++ plugins/builtin/source/pattern_drawer.cpp
+@@ -277,7 +277,7 @@ namespace hex {
+ 
+ 
+     void PatternDrawer::drawCommentTooltip(const pl::ptrn::Pattern &pattern) const {
+-        if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && pattern.getComment().has_value()) {
++        if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && pattern.getComment() != nullptr) {
+             ImGui::BeginTooltip();
+             ImGui::TextUnformatted(pattern.getComment()->c_str());
+             ImGui::EndTooltip();
diff --git a/editors/imhex/pkg-plist b/editors/imhex/pkg-plist
index 4e07839b195f..d04fe16cc826 100644
--- a/editors/imhex/pkg-plist
+++ b/editors/imhex/pkg-plist
@@ -1,5 +1,5 @@
 bin/imhex
-lib/libimhex.so.1.20.0
+lib/libimhex.so.1.21.2
 share/applications/imhex.desktop
 %%DATADIR%%/constants/_schema.json
 %%DATADIR%%/constants/crc16.json
@@ -31,6 +31,7 @@ share/applications/imhex.desktop
 %%DATADIR%%/encodings/jis_x_0211.tbl
 %%DATADIR%%/encodings/jis_x_0213.tbl
 %%DATADIR%%/encodings/macintosh.tbl
+%%DATADIR%%/encodings/pokegen1_en.tbl
 %%DATADIR%%/encodings/shiftjis.tbl
 %%DATADIR%%/encodings/thai.tbl
 %%DATADIR%%/encodings/turkish_iso.tbl
@@ -40,6 +41,7 @@ share/applications/imhex.desktop
 %%DATADIR%%/includes/cstdint.pat
 %%DATADIR%%/includes/std/bit.pat
 %%DATADIR%%/includes/std/cint.pat
+%%DATADIR%%/includes/std/core.pat
 %%DATADIR%%/includes/std/ctype.pat
 %%DATADIR%%/includes/std/file.pat
 %%DATADIR%%/includes/std/fxpt.pat
@@ -60,6 +62,7 @@ share/applications/imhex.desktop
 %%DATADIR%%/includes/type/ip.pat
 %%DATADIR%%/includes/type/leb128.pat
 %%DATADIR%%/includes/type/mac.pat
+%%DATADIR%%/includes/type/path.pat
 %%DATADIR%%/includes/type/time.pat
 %%DATADIR%%/magic/nintendo_switch_magic
*** 9 LINES SKIPPED ***