Repository: compiler-explorer/compiler-explorer
Pull request #7392 (2025-02-13 19:13:45)

Add PyPy 3.11
Infra PR: https://github.com/compiler-explorer/infra/pull/1526


Patch:
diff --git a/.github/workflows/deploy-win.yml b/.github/workflows/deploy-win.yml
index ece5fdbee..fca7c444d 100644
--- a/.github/workflows/deploy-win.yml
+++ b/.github/workflows/deploy-win.yml
@@ -22,10 +22,10 @@ jobs:
         with:
           fetch-depth: 0
           ref: ${{ github.event.inputs.buildnumber }}
-      - name: Use Node.js 20.12.1
+      - name: Use Node.js 22.13.1
         uses: actions/setup-node@v4
         with:
-          node-version: 20.12.1
+          node-version: 22.13.1
           cache: npm
       - name: Build distribution
         id: build_dist
@@ -44,10 +44,10 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      - name: Use Node.js 20.x
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.x
+          node-version: 22.x
           check-latest: true
           cache: npm
       - name: Download the built distribution
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index b45b4e925..db8e13501 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -152,3 +152,5 @@ From oldest to newest contributor, we would like to thank:
 - [Pierre Bayerl](https://github.com/goto40)
 - [James Touton](https://github.com/Bekenn)
 - [Waqar Ahmed](https://github.com/waqar144)
+- [Niles Salter](https://github.com/Validark)
+- [Stephen Heumann](https://github.com/sheumann)
diff --git a/README.md b/README.md
index 1c02e9270..2d4413a60 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ Assuming you have a compatible version of `node` installed, on Linux simply runn
 running with an Explorer running on port 10240 on your local machine:
 [http://localhost:10240/](http://localhost:10240/). If this doesn't work for you, please contact us, as we consider it
 important you can quickly and easily get running. Currently, **Compiler Explorer** requires
-[`node` 20](CONTRIBUTING.md#node-version) installed, either on the path or at `NODE_DIR` (an environment variable or
+[`node` 22](CONTRIBUTING.md#node-version) installed, either on the path or at `NODE_DIR` (an environment variable or
 `make` parameter).
 
 Running with `make EXTRA_ARGS='--language LANG'` will allow you to load `LANG` exclusively, where `LANG` is one for the
diff --git a/compiler-args-app.ts b/compiler-args-app.ts
index d866b0db9..e7a621215 100644
--- a/compiler-args-app.ts
+++ b/compiler-args-app.ts
@@ -61,6 +61,7 @@ const compilerParsers = {
     ghc: Parsers.GHCParser,
     tendra: Parsers.TendraParser,
     golang: Parsers.GolangParser,
+    zig: Parsers.ZigParser,
 };
 
 class CompilerArgsApp {
@@ -119,6 +120,8 @@ class CompilerArgsApp {
             console.log('supportsTargetIs');
         } else if (parser.hasSupportStartsWith(options, '--target ')) {
             console.log('supportsTarget');
+        } else if (parser.hasSupportStartsWith(options, '-target ')) {
+            console.log('supportsHyphenTarget');
         } else if (parser.hasSupportStartsWith(options, '--march=')) {
             console.log('supportsMarch');
         } else {
diff --git a/docs/AddingACompiler.md b/docs/AddingACompiler.md
index d604fcb18..661bb049a 100644
--- a/docs/AddingACompiler.md
+++ b/docs/AddingACompiler.md
@@ -99,6 +99,7 @@ once the site runs on the Amazon environment, the `&clang` group **will not** ha
 | versionRe            | RegExp     | A regular expression used to capture the version from the version output                                                                                           |
 | compilerType         | String     | The name of the class handling this compiler                                                                                                                       |
 | interpreted          | Boolean    | Whether this is an interpreted language, and so the "compiler" is really an interpreter                                                                            |
+| emulated             | Boolean    | Whether the compiler's output is run via an emulator (specified by `executionWrapper`) rather than natively                                                        |
 | executionWrapper     | Path       | Path to script that can execute the compiler's output (e.g. could run under `qemu` or `mpi_run` or similar)                                                        |
 | executionWrapperArgs | String     | List of arguments passed to the execution wrapper (separated by `\|` character)                                                                                    |
 | demangler            | String     | Path to the demangler tool                                                                                                                                         |
diff --git a/etc/config/c.amazon.properties b/etc/config/c.amazon.properties
index 06149ba66..c0b978af6 100644
--- a/etc/config/c.amazon.properties
+++ b/etc/config/c.amazon.properties
@@ -1,4 +1,4 @@
-compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast
+compilers=&cgcc86:&cclang:&nvc_x86:&armcclang32:&armcclang64:&cmosclang-trunk:&rvcclang:&wasmcclang:&ppci:&cicc:&cicx:&ccl:&ccross:&cgcc-classic:&cc65:&sdcc:&ctendra:&tinycc:&zigcc:&cproc86:&chibicc:&z88dk:&compcert:godbolt.org@443/winprod:&movfuscator:&lc3:&upmem-clang:&cvast:&orcac
 defaultCompiler=cg142
 # We use the llvm-trunk demangler for all c/c++ compilers, as c++filt tends to lag behind 
 demangler=/opt/compiler-explorer/clang-trunk/bin/llvm-cxxfilt
@@ -3515,6 +3515,31 @@ compiler.cvast-trunk.exe=/opt/compiler-explorer/vast-trunk/bin/vast-front
 compiler.cvast-trunk.isNightly=true
 compiler.cvast-trunk.options=-resource-dir /opt/compiler-explorer/clang-17.0.1/lib/clang/17/ --gcc-toolchain=/opt/compiler-explorer/gcc-13.2.0
 
+################################
+# ORCA/C (run via Golden Gate emulator)
+group.orcac.groupName=ORCA/C
+group.orcac.compilers=orcac221:orcac220:orcac210
+group.orcac.isSemVer=true
+group.orcac.baseName=ORCA/C
+group.orcac.executionWrapper=/opt/compiler-explorer/goldengate-2.0.9/bin/iix
+group.orcac.compilerType=orca
+group.orcac.objdumper=/opt/compiler-explorer/goldengate-2.0.9/bin/dumpobj
+group.orcac.objdumperType=goldengate
+group.orcac.emulated=true
+group.orcac.instructionSet=wdc65c816
+group.orcac.includeFlag=cc=-I
+group.orcac.versionFlag=compile|dummy.c
+group.orcac.exe=/opt/compiler-explorer/goldengate-2.0.9/bin/iix
+# Disable check for same compiler exe, because these are all run using the
+# same emulator.
+# Disabled: orcac210 orcac220 orcac221
+compiler.orcac210.goldenGate=/opt/compiler-explorer/orca-c-2.1.0
+compiler.orcac210.semver=2.1.0
+compiler.orcac220.goldenGate=/opt/compiler-explorer/orca-c-2.2.0
+compiler.orcac220.semver=2.2.0
+compiler.orcac221.goldenGate=/opt/compiler-explorer/orca-c-2.2.1
+compiler.orcac221.semver=2.2.1
+
 #################################
 #################################
 # Libraries
diff --git a/etc/config/csharp.amazon.properties b/etc/config/csharp.amazon.properties
index 6d486dbec..eb580e2a7 100644
--- a/etc/config/csharp.amazon.properties
+++ b/etc/config/csharp.amazon.properties
@@ -53,15 +53,15 @@ compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcoreclr.buildConfig=Release
 compiler.dotnet70csharpcoreclr.langVersion=latest
 
-compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpcoreclr.buildConfig=Release
 compiler.dotnet80csharpcoreclr.langVersion=latest
 
-compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpcoreclr.buildConfig=Release
 compiler.dotnet90csharpcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcrossgen2.buildConfig=Release
 compiler.dotnet70csharpcrossgen2.langVersion=latest
 
-compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpcrossgen2.buildConfig=Release
 compiler.dotnet80csharpcrossgen2.langVersion=latest
 
-compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpcrossgen2.buildConfig=Release
 compiler.dotnet90csharpcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70csharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpmono.buildConfig=Release
 compiler.dotnet70csharpmono.langVersion=latest
 
-compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpmono.name=.NET 8.0 Mono
-compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpmono.buildConfig=Release
 compiler.dotnet80csharpmono.langVersion=latest
 
-compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpmono.name=.NET 9.0 Mono
-compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpmono.buildConfig=Release
 compiler.dotnet90csharpmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpildasm.buildConfig=Release
 compiler.dotnet70csharpildasm.langVersion=latest
 
-compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpildasm.buildConfig=Release
 compiler.dotnet80csharpildasm.langVersion=latest
 
-compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpildasm.buildConfig=Release
 compiler.dotnet90csharpildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpilspy.buildConfig=Release
 compiler.dotnet70csharpilspy.langVersion=latest
 
-compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpilspy.buildConfig=Release
 compiler.dotnet80csharpilspy.langVersion=latest
 
-compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpilspy.buildConfig=Release
 compiler.dotnet90csharpilspy.langVersion=latest
 
diff --git a/etc/config/csharp.defaults.properties b/etc/config/csharp.defaults.properties
index 6d486dbec..eb580e2a7 100644
--- a/etc/config/csharp.defaults.properties
+++ b/etc/config/csharp.defaults.properties
@@ -53,15 +53,15 @@ compiler.dotnet70csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcoreclr.buildConfig=Release
 compiler.dotnet70csharpcoreclr.langVersion=latest
 
-compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpcoreclr.buildConfig=Release
 compiler.dotnet80csharpcoreclr.langVersion=latest
 
-compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpcoreclr.buildConfig=Release
 compiler.dotnet90csharpcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpcrossgen2.buildConfig=Release
 compiler.dotnet70csharpcrossgen2.langVersion=latest
 
-compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpcrossgen2.buildConfig=Release
 compiler.dotnet80csharpcrossgen2.langVersion=latest
 
-compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpcrossgen2.buildConfig=Release
 compiler.dotnet90csharpcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70csharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpmono.buildConfig=Release
 compiler.dotnet70csharpmono.langVersion=latest
 
-compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpmono.name=.NET 8.0 Mono
-compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpmono.buildConfig=Release
 compiler.dotnet80csharpmono.langVersion=latest
 
-compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpmono.name=.NET 9.0 Mono
-compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpmono.buildConfig=Release
 compiler.dotnet90csharpmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpildasm.buildConfig=Release
 compiler.dotnet70csharpildasm.langVersion=latest
 
-compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpildasm.buildConfig=Release
 compiler.dotnet80csharpildasm.langVersion=latest
 
-compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpildasm.buildConfig=Release
 compiler.dotnet90csharpildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70csharpilspy.buildConfig=Release
 compiler.dotnet70csharpilspy.langVersion=latest
 
-compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80csharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80csharpilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80csharpilspy.buildConfig=Release
 compiler.dotnet80csharpilspy.langVersion=latest
 
-compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90csharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90csharpilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90csharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90csharpilspy.buildConfig=Release
 compiler.dotnet90csharpilspy.langVersion=latest
 
diff --git a/etc/config/execution.amazonwin.properties b/etc/config/execution.amazonwin.properties
index cfb6cc2ed..e498da3c2 100644
--- a/etc/config/execution.amazonwin.properties
+++ b/etc/config/execution.amazonwin.properties
@@ -1,3 +1,4 @@
 sandboxType=cewrapper
 executionType=cewrapper
 cewrapper=C:/cewrapper/cewrapper.exe
+unbufferStdoutExe=
diff --git a/etc/config/execution.defaults.properties b/etc/config/execution.defaults.properties
index 6352ef5f6..4e4261715 100644
--- a/etc/config/execution.defaults.properties
+++ b/etc/config/execution.defaults.properties
@@ -14,3 +14,8 @@ firejail.profile.wine=etc/firejail/wine.profile
 cewrapper=
 cewrapper.config.sandbox=etc/cewrapper/user-execution.json
 cewrapper.config.execute=etc/cewrapper/compilers-and-tools.json
+
+# Prefix execution with `stdbuf -o0` to have stdout output also for crashing executions.
+# Discussed further in https://github.com/compiler-explorer/compiler-explorer/issues/7239
+unbufferStdoutExe=stdbuf
+unbufferStdoutArgs=-o0
diff --git a/etc/config/fsharp.amazon.properties b/etc/config/fsharp.amazon.properties
index 7b152c20b..4f4a6df17 100644
--- a/etc/config/fsharp.amazon.properties
+++ b/etc/config/fsharp.amazon.properties
@@ -53,15 +53,15 @@ compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcoreclr.buildConfig=Release
 compiler.dotnet70fsharpcoreclr.langVersion=latest
 
-compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpcoreclr.buildConfig=Release
 compiler.dotnet80fsharpcoreclr.langVersion=latest
 
-compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpcoreclr.buildConfig=Release
 compiler.dotnet90fsharpcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcrossgen2.buildConfig=Release
 compiler.dotnet70fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpcrossgen2.buildConfig=Release
 compiler.dotnet80fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpcrossgen2.buildConfig=Release
 compiler.dotnet90fsharpcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpmono.buildConfig=Release
 compiler.dotnet70fsharpmono.langVersion=latest
 
-compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpmono.name=.NET 8.0 Mono
-compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpmono.buildConfig=Release
 compiler.dotnet80fsharpmono.langVersion=latest
 
-compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpmono.name=.NET 9.0 Mono
-compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpmono.buildConfig=Release
 compiler.dotnet90fsharpmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpildasm.buildConfig=Release
 compiler.dotnet70fsharpildasm.langVersion=latest
 
-compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpildasm.buildConfig=Release
 compiler.dotnet80fsharpildasm.langVersion=latest
 
-compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpildasm.buildConfig=Release
 compiler.dotnet90fsharpildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpilspy.buildConfig=Release
 compiler.dotnet70fsharpilspy.langVersion=latest
 
-compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpilspy.buildConfig=Release
 compiler.dotnet80fsharpilspy.langVersion=latest
 
-compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpilspy.buildConfig=Release
 compiler.dotnet90fsharpilspy.langVersion=latest
 
diff --git a/etc/config/fsharp.defaults.properties b/etc/config/fsharp.defaults.properties
index 7b152c20b..4f4a6df17 100644
--- a/etc/config/fsharp.defaults.properties
+++ b/etc/config/fsharp.defaults.properties
@@ -53,15 +53,15 @@ compiler.dotnet70fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcoreclr.buildConfig=Release
 compiler.dotnet70fsharpcoreclr.langVersion=latest
 
-compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpcoreclr.buildConfig=Release
 compiler.dotnet80fsharpcoreclr.langVersion=latest
 
-compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpcoreclr.buildConfig=Release
 compiler.dotnet90fsharpcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpcrossgen2.buildConfig=Release
 compiler.dotnet70fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpcrossgen2.buildConfig=Release
 compiler.dotnet80fsharpcrossgen2.langVersion=latest
 
-compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpcrossgen2.buildConfig=Release
 compiler.dotnet90fsharpcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpmono.buildConfig=Release
 compiler.dotnet70fsharpmono.langVersion=latest
 
-compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpmono.name=.NET 8.0 Mono
-compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpmono.buildConfig=Release
 compiler.dotnet80fsharpmono.langVersion=latest
 
-compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpmono.name=.NET 9.0 Mono
-compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpmono.buildConfig=Release
 compiler.dotnet90fsharpmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpildasm.buildConfig=Release
 compiler.dotnet70fsharpildasm.langVersion=latest
 
-compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpildasm.buildConfig=Release
 compiler.dotnet80fsharpildasm.langVersion=latest
 
-compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpildasm.buildConfig=Release
 compiler.dotnet90fsharpildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70fsharpilspy.buildConfig=Release
 compiler.dotnet70fsharpilspy.langVersion=latest
 
-compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80fsharpilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80fsharpilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80fsharpilspy.buildConfig=Release
 compiler.dotnet80fsharpilspy.langVersion=latest
 
-compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90fsharpilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90fsharpilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90fsharpilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90fsharpilspy.buildConfig=Release
 compiler.dotnet90fsharpilspy.langVersion=latest
 
diff --git a/etc/config/il.amazon.properties b/etc/config/il.amazon.properties
index 81fe840ff..46be175cc 100644
--- a/etc/config/il.amazon.properties
+++ b/etc/config/il.amazon.properties
@@ -48,15 +48,15 @@ compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcoreclr.buildConfig=Release
 compiler.dotnet70ilcoreclr.langVersion=latest
 
-compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilcoreclr.buildConfig=Release
 compiler.dotnet80ilcoreclr.langVersion=latest
 
-compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilcoreclr.buildConfig=Release
 compiler.dotnet90ilcoreclr.langVersion=latest
 
@@ -81,15 +81,15 @@ compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcrossgen2.buildConfig=Release
 compiler.dotnet70ilcrossgen2.langVersion=latest
 
-compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilcrossgen2.buildConfig=Release
 compiler.dotnet80ilcrossgen2.langVersion=latest
 
-compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilcrossgen2.buildConfig=Release
 compiler.dotnet90ilcrossgen2.langVersion=latest
 
@@ -114,15 +114,15 @@ compiler.dotnet70ilmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilmono.buildConfig=Release
 compiler.dotnet70ilmono.langVersion=latest
 
-compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilmono.name=.NET 8.0 Mono
-compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilmono.buildConfig=Release
 compiler.dotnet80ilmono.langVersion=latest
 
-compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilmono.name=.NET 9.0 Mono
-compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilmono.buildConfig=Release
 compiler.dotnet90ilmono.langVersion=latest
 
@@ -156,15 +156,15 @@ compiler.dotnet70ilildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilildasm.buildConfig=Release
 compiler.dotnet70ilildasm.langVersion=latest
 
-compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilildasm.buildConfig=Release
 compiler.dotnet80ilildasm.langVersion=latest
 
-compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilildasm.buildConfig=Release
 compiler.dotnet90ilildasm.langVersion=latest
 
@@ -189,15 +189,15 @@ compiler.dotnet70ililspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ililspy.buildConfig=Release
 compiler.dotnet70ililspy.langVersion=latest
 
-compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ililspy.name=.NET 8.0 ILSpy
-compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ililspy.buildConfig=Release
 compiler.dotnet80ililspy.langVersion=latest
 
-compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ililspy.name=.NET 9.0 ILSpy
-compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ililspy.buildConfig=Release
 compiler.dotnet90ililspy.langVersion=latest
 
diff --git a/etc/config/il.defaults.properties b/etc/config/il.defaults.properties
index 81fe840ff..46be175cc 100644
--- a/etc/config/il.defaults.properties
+++ b/etc/config/il.defaults.properties
@@ -48,15 +48,15 @@ compiler.dotnet70ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcoreclr.buildConfig=Release
 compiler.dotnet70ilcoreclr.langVersion=latest
 
-compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilcoreclr.buildConfig=Release
 compiler.dotnet80ilcoreclr.langVersion=latest
 
-compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilcoreclr.buildConfig=Release
 compiler.dotnet90ilcoreclr.langVersion=latest
 
@@ -81,15 +81,15 @@ compiler.dotnet70ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilcrossgen2.buildConfig=Release
 compiler.dotnet70ilcrossgen2.langVersion=latest
 
-compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilcrossgen2.buildConfig=Release
 compiler.dotnet80ilcrossgen2.langVersion=latest
 
-compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilcrossgen2.buildConfig=Release
 compiler.dotnet90ilcrossgen2.langVersion=latest
 
@@ -114,15 +114,15 @@ compiler.dotnet70ilmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilmono.buildConfig=Release
 compiler.dotnet70ilmono.langVersion=latest
 
-compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilmono.name=.NET 8.0 Mono
-compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilmono.buildConfig=Release
 compiler.dotnet80ilmono.langVersion=latest
 
-compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilmono.name=.NET 9.0 Mono
-compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilmono.buildConfig=Release
 compiler.dotnet90ilmono.langVersion=latest
 
@@ -156,15 +156,15 @@ compiler.dotnet70ilildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ilildasm.buildConfig=Release
 compiler.dotnet70ilildasm.langVersion=latest
 
-compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ilildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ilildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ilildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ilildasm.buildConfig=Release
 compiler.dotnet80ilildasm.langVersion=latest
 
-compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ilildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ilildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ilildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ilildasm.buildConfig=Release
 compiler.dotnet90ilildasm.langVersion=latest
 
@@ -189,15 +189,15 @@ compiler.dotnet70ililspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70ililspy.buildConfig=Release
 compiler.dotnet70ililspy.langVersion=latest
 
-compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80ililspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80ililspy.name=.NET 8.0 ILSpy
-compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80ililspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80ililspy.buildConfig=Release
 compiler.dotnet80ililspy.langVersion=latest
 
-compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90ililspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90ililspy.name=.NET 9.0 ILSpy
-compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90ililspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90ililspy.buildConfig=Release
 compiler.dotnet90ililspy.langVersion=latest
 
diff --git a/etc/config/ispc.amazon.properties b/etc/config/ispc.amazon.properties
index 639085c5a..84377ff0f 100644
--- a/etc/config/ispc.amazon.properties
+++ b/etc/config/ispc.amazon.properties
@@ -1,10 +1,13 @@
 compilers=&ispc
-defaultCompiler=ispc1253
+defaultCompiler=ispc1260
 objdumper=/opt/compiler-explorer/gcc-14.2.0/bin/objdump
 
-group.ispc.compilers=ispc1253:ispc1250:ispc1240:ispc1230:ispc1220:ispc1210:ispc1200:ispc1190:ispc1180:ispc1170:ispc1161:ispc1160:ispc1150:ispc1141:ispc1140:ispc1130:ispc1120:ispc1110:ispc1100:ispc192:ispc191:ispc-trunk
+group.ispc.compilers=ispc1260:ispc1253:ispc1250:ispc1240:ispc1230:ispc1220:ispc1210:ispc1200:ispc1190:ispc1180:ispc1170:ispc1161:ispc1160:ispc1150:ispc1141:ispc1140:ispc1130:ispc1120:ispc1110:ispc1100:ispc192:ispc191:ispc-trunk
 group.ispc.isSemVer=true
 group.ispc.baseName=ispc
+compiler.ispc1260.exe=/opt/compiler-explorer/ispc-1.26.0/bin/ispc
+compiler.ispc1260.semver=1.26.0
+compiler.ispc1260.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
 compiler.ispc1253.exe=/opt/compiler-explorer/ispc-1.25.3/bin/ispc
 compiler.ispc1253.semver=1.25.3
 compiler.ispc1253.executableLinker=/opt/compiler-explorer/gcc-14.2.0/bin/gcc
diff --git a/etc/config/python.amazon.properties b/etc/config/python.amazon.properties
index a01c7063a..b420afa76 100644
--- a/etc/config/python.amazon.properties
+++ b/etc/config/python.amazon.properties
@@ -26,7 +26,7 @@ compiler.python312.semver=3.12
 compiler.python313.exe=/opt/compiler-explorer/python-3.13.0/bin/python3.13
 compiler.python313.semver=3.13
 
-group.pypy.compilers=pypy39:pypy310
+group.pypy.compilers=pypy39:pypy310:pypy311
 group.pypy.isSemVer=true
 group.pypy.baseName=PyPy
 group.pypy.licenseLink=https://github.com/pypy/pypy/blob/main/LICENSE
@@ -36,6 +36,8 @@ compiler.pypy39.exe=/opt/compiler-explorer/pypy3.9-v7.3.14/bin/pypy
 compiler.pypy39.semver=3.9
 compiler.pypy310.exe=/opt/compiler-explorer/pypy3.10-v7.3.14/bin/pypy
 compiler.pypy310.semver=3.10
+compiler.pypy311.exe=/opt/compiler-explorer/pypy3.11-v7.3.18/bin/pypy
+compiler.pypy311.semver=3.11
 
 ##  Pythran
 group.pythran.compilers=pythran015
diff --git a/etc/config/rust.amazon.properties b/etc/config/rust.amazon.properties
index 3b59d84da..9d3a38db1 100644
--- a/etc/config/rust.amazon.properties
+++ b/etc/config/rust.amazon.properties
@@ -266,12 +266,12 @@ compiler.rustbpfgtrunk.isNightly=true
 # Rustc CG GCC (GCC backend for rustc compiler)
 group.rustccggcc.compilers=rustccggcc-master
 group.rustccggcc.compilerType=rustc-cg-gcc
-group.rustccggcc.supportsExecute=false
-group.rustccggcc.supportsBinary=false
-group.rustccggcc.supportsBinaryObject=false
+group.rustccggcc.supportsBinary=true
+group.rustccggcc.supportsBinaryObject=true
 group.rustccggcc.unwiseOptions=-Ctarget-cpu=native|target-cpu=native
 compiler.rustccggcc-master.exe=/opt/compiler-explorer/rustc-cg-gcc-master/bin/rustc
 compiler.rustccggcc-master.name=rustc-cg-gcc (master)
+compiler.rustccggcc-master.libPath=${exePath}/../sysroot/lib/rustlib/x86_64-unknown-linux-gnu/lib
 compiler.rustccggcc-master.isNightly=true
 
 # mrustc (compiler used to bootstrap rustc)
diff --git a/etc/config/sponsors.yaml b/etc/config/sponsors.yaml
index 678c58743..8c7a55429 100644
--- a/etc/config/sponsors.yaml
+++ b/etc/config/sponsors.yaml
@@ -517,3 +517,5 @@ levels:
       - woobwoobwoob
       - Drew Dormann
       - Ryan Lee
+      - elliot
+      - Cemalettin Dervis
diff --git a/etc/config/vb.amazon.properties b/etc/config/vb.amazon.properties
index 48b021b2c..dd1cbc742 100644
--- a/etc/config/vb.amazon.properties
+++ b/etc/config/vb.amazon.properties
@@ -53,15 +53,15 @@ compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcoreclr.buildConfig=Release
 compiler.dotnet70vbcoreclr.langVersion=latest
 
-compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbcoreclr.buildConfig=Release
 compiler.dotnet80vbcoreclr.langVersion=latest
 
-compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbcoreclr.buildConfig=Release
 compiler.dotnet90vbcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcrossgen2.buildConfig=Release
 compiler.dotnet70vbcrossgen2.langVersion=latest
 
-compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbcrossgen2.buildConfig=Release
 compiler.dotnet80vbcrossgen2.langVersion=latest
 
-compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbcrossgen2.buildConfig=Release
 compiler.dotnet90vbcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70vbmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbmono.buildConfig=Release
 compiler.dotnet70vbmono.langVersion=latest
 
-compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbmono.name=.NET 8.0 Mono
-compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbmono.buildConfig=Release
 compiler.dotnet80vbmono.langVersion=latest
 
-compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbmono.name=.NET 9.0 Mono
-compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbmono.buildConfig=Release
 compiler.dotnet90vbmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70vbildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbildasm.buildConfig=Release
 compiler.dotnet70vbildasm.langVersion=latest
 
-compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbildasm.buildConfig=Release
 compiler.dotnet80vbildasm.langVersion=latest
 
-compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbildasm.buildConfig=Release
 compiler.dotnet90vbildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70vbilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbilspy.buildConfig=Release
 compiler.dotnet70vbilspy.langVersion=latest
 
-compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbilspy.buildConfig=Release
 compiler.dotnet80vbilspy.langVersion=latest
 
-compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbilspy.buildConfig=Release
 compiler.dotnet90vbilspy.langVersion=latest
 
diff --git a/etc/config/vb.defaults.properties b/etc/config/vb.defaults.properties
index 48b021b2c..dd1cbc742 100644
--- a/etc/config/vb.defaults.properties
+++ b/etc/config/vb.defaults.properties
@@ -53,15 +53,15 @@ compiler.dotnet70vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcoreclr.buildConfig=Release
 compiler.dotnet70vbcoreclr.langVersion=latest
 
-compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcoreclr.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbcoreclr.name=.NET 8.0 CoreCLR
-compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbcoreclr.buildConfig=Release
 compiler.dotnet80vbcoreclr.langVersion=latest
 
-compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcoreclr.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbcoreclr.name=.NET 9.0 CoreCLR
-compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcoreclr.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbcoreclr.buildConfig=Release
 compiler.dotnet90vbcoreclr.langVersion=latest
 
@@ -86,15 +86,15 @@ compiler.dotnet70vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbcrossgen2.buildConfig=Release
 compiler.dotnet70vbcrossgen2.langVersion=latest
 
-compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbcrossgen2.name=.NET 8.0 Crossgen2
-compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbcrossgen2.buildConfig=Release
 compiler.dotnet80vbcrossgen2.langVersion=latest
 
-compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbcrossgen2.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbcrossgen2.name=.NET 9.0 Crossgen2
-compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbcrossgen2.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbcrossgen2.buildConfig=Release
 compiler.dotnet90vbcrossgen2.langVersion=latest
 
@@ -119,15 +119,15 @@ compiler.dotnet70vbmono.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbmono.buildConfig=Release
 compiler.dotnet70vbmono.langVersion=latest
 
-compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbmono.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbmono.name=.NET 8.0 Mono
-compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbmono.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbmono.buildConfig=Release
 compiler.dotnet80vbmono.langVersion=latest
 
-compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbmono.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbmono.name=.NET 9.0 Mono
-compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbmono.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbmono.buildConfig=Release
 compiler.dotnet90vbmono.langVersion=latest
 
@@ -161,15 +161,15 @@ compiler.dotnet70vbildasm.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbildasm.buildConfig=Release
 compiler.dotnet70vbildasm.langVersion=latest
 
-compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbildasm.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbildasm.name=.NET 8.0 ILDasm
-compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbildasm.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbildasm.buildConfig=Release
 compiler.dotnet80vbildasm.langVersion=latest
 
-compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbildasm.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbildasm.name=.NET 9.0 ILDasm
-compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbildasm.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbildasm.buildConfig=Release
 compiler.dotnet90vbildasm.langVersion=latest
 
@@ -194,15 +194,15 @@ compiler.dotnet70vbilspy.clrDir=/opt/compiler-explorer/dotnet-v7.0.20
 compiler.dotnet70vbilspy.buildConfig=Release
 compiler.dotnet70vbilspy.langVersion=latest
 
-compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.11/.dotnet/dotnet
+compiler.dotnet80vbilspy.exe=/opt/compiler-explorer/dotnet-v8.0.13/.dotnet/dotnet
 compiler.dotnet80vbilspy.name=.NET 8.0 ILSpy
-compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.11
+compiler.dotnet80vbilspy.clrDir=/opt/compiler-explorer/dotnet-v8.0.13
 compiler.dotnet80vbilspy.buildConfig=Release
 compiler.dotnet80vbilspy.langVersion=latest
 
-compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.0/.dotnet/dotnet
+compiler.dotnet90vbilspy.exe=/opt/compiler-explorer/dotnet-v9.0.2/.dotnet/dotnet
 compiler.dotnet90vbilspy.name=.NET 9.0 ILSpy
-compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.0
+compiler.dotnet90vbilspy.clrDir=/opt/compiler-explorer/dotnet-v9.0.2
 compiler.dotnet90vbilspy.buildConfig=Release
 compiler.dotnet90vbilspy.langVersion=latest
 
diff --git a/etc/scripts/docenizers/Makefile b/etc/scripts/docenizers/Makefile
index 6ae8d0bf3..735af4759 100644
--- a/etc/scripts/docenizers/Makefile
+++ b/etc/scripts/docenizers/Makefile
@@ -1,6 +1,7 @@
 GEN_DIR := ../../../lib/asm-docs/generated
 all: \
  $(GEN_DIR)/asm-docs-6502.ts \
+ $(GEN_DIR)/asm-docs-65c816.ts \
  $(GEN_DIR)/asm-docs-amd64.ts \
  $(GEN_DIR)/asm-docs-arm32.ts \
  $(GEN_DIR)/asm-docs-aarch64.ts \
@@ -14,7 +15,9 @@ all: \
  $(GEN_DIR)/asm-docs-python.ts
 
 $(GEN_DIR)/asm-docs-6502.ts: docenizer-6502.py
-	python3 $<
+	python3 $< -o $@ -c 6502 -m 65c02
+$(GEN_DIR)/asm-docs-65c816.ts: docenizer-6502.py
+	python3 $< -o $@ -c 65c816 -m 65c816
 $(GEN_DIR)/asm-docs-amd64.ts: docenizer-amd64.py
 	python3 $< -o $@
 $(GEN_DIR)/asm-docs-arm32.ts: docenizer-arm.py arm32.json
@@ -36,4 +39,4 @@ $(GEN_DIR)/asm-docs-sass.ts: docenizer-ptx-sass.py
 $(GEN_DIR)/asm-docs-python.ts: docenizer-python.py
 	python3 $< -o $@
 $(GEN_DIR)/asm-docs-riscv64.ts: docenizer-riscv64.py
-	python3 $< -o $@
\ No newline at end of file
+	python3 $< -o $@
diff --git a/etc/scripts/docenizers/docenizer-6502.py b/etc/scripts/docenizers/docenizer-6502.py
index a038f535e..a8182fa07 100755
--- a/etc/scripts/docenizers/docenizer-6502.py
+++ b/etc/scripts/docenizers/docenizer-6502.py
@@ -6,11 +6,19 @@ import os.path
 import re
 import urllib.request
 
-
-DOC_URL_BASE = "https://raw.githubusercontent.com/mist64/c64ref/4274bd8782c5d3b18c68e6b9479b0ec751eb96b1/Source/6502/"
+parser = argparse.ArgumentParser(description='Docenizes 6502 family CPU documentation')
+parser.add_argument('-o', '--outputpath', type=str, help='Final path of the .ts file. Default is ./asm-docs-6502.ts',
+                    default='./asm-docs-6502.ts')
+parser.add_argument('-c', '--cpu', type=str, help='CPU to generate documentation for. Default is 6502',
+                    default="6502")
+parser.add_argument('-m', '--maxcpu', type=str, help='Maximum CPU to include in documentation. Default is 65c02',
+                    default="65c02")
+
+DOC_URL_BASE = "https://raw.githubusercontent.com/mist64/c64ref/f5792f46cfa9e05d006e5dd4f24199fed9091100/src/6502/"
 doc_files = {f"{DOC_URL_BASE}{filename}":cpu_type for filename, cpu_type in {
     "cpu_6502.txt" : "6502",
     "cpu_65c02.txt" : "65c02",
+    "cpu_65c816.txt" : "65c816",
     }.items()
 }
 mode_change_regex = re.compile(r"\[(?P<mode_name>.*)\]")
@@ -33,9 +41,10 @@ class Instruction:
         self.name = ""
         self.long_name = ""
         self.description = []
+        self.undocumented = False
 
     def html_description(self):
-        if self.description:
+        if self.description and self.cpu_type != "65c816":
             return "".join(
                 f"<p>{escape_quotes(desc_line)}</p>"
                 for desc_line in self.description
@@ -48,11 +57,16 @@ class Instruction:
             return f"<p>{self.mnemonic}</p>"
 
 
-def get_instructions():
+def get_instructions(cpu, maxcpu):
     """Gathers all instruction data and returns it in a dictionary."""
     instructions = {}
+    extra_cpu = False
     for f, t in doc_files.items():
-        instructions_from_file(f, t, instructions)
+        instructions_from_file(f, cpu if not extra_cpu else t, instructions)
+        if t == maxcpu:
+            break
+        if t == cpu:
+            extra_cpu = True
     return instructions
 
 
@@ -70,7 +84,7 @@ def instructions_from_file(filename, cpu_type, instructions):
                 continue
             regex_match = mode_change_regex.match(line)
             if regex_match:
-                parse_mode = mode_change(regex_match.group("mode_name"))
+                parse_mode = mode_change(regex_match.group("mode_name"), cpu_type)
                 continue
             if parse_mode == ParseMode.IGNORE:
                 continue
@@ -96,7 +110,7 @@ def remove_comments(line):
         return line
 
 
-def mode_change(mode_name):
+def mode_change(mode_name, cpu_type):
     if mode_name == "mnemos":
         return ParseMode.MNEMONICS
     elif mode_name == "documentation-mnemos":
@@ -132,6 +146,8 @@ def parse_descriptions(line, line_num, cpu_type, instructions):
         mnemonic = parse_descriptions.last_mnemonic
         description = continue_match.group("description")
         instructions[mnemonic].description.append(description)
+        if re.search("undocumented", description):
+            instructions[mnemonic].undocumented = True
 
 
 def write_script(filename, instructions):
@@ -141,6 +157,8 @@ def write_script(filename, instructions):
               "    if (!opcode) return;",
               "    switch (opcode.toUpperCase()) {"]
     for inst in instructions.values():
+        if inst.undocumented and inst.cpu_type != "6502":
+            continue
         script.append(f"        case \"{inst.mnemonic}\":")
         script.append("            return {")
         html = f"{16 * ' '}\"html\": \""
@@ -155,7 +173,6 @@ def write_script(filename, instructions):
             script.append(f"{16 * ' '}\"tooltip\": \"{safe_n}\",")
         else:
             script.append(f"{16 * ' '}\"tooltip\": \"{inst.mnemonic}\",")
-        # Will need to be replaced when other 65xx CPUs are added
         s = "https://www.pagetable.com/c64ref/6502/?cpu="
         e = "&tab=2#"
         t = inst.cpu_type
@@ -175,23 +192,12 @@ def escape_quotes(string):
     return string.replace("\"", "\\\"")
 
 
-def get_arguments():
-    parser = argparse.ArgumentParser()
-    help_text = "the location to which the script will be written"
-    relative_path = "../../../../lib/asm-docs/generated/asm-docs-6502.ts"
-    script_path = os.path.realpath(__file__)
-    script_dir = os.path.dirname(script_path)
-    default_path = os.path.normpath(script_dir + relative_path)
-    parser.add_argument("-o", "--output", help=help_text, default=default_path)
-    return parser.parse_args()
-
-
 def main():
-    args = get_arguments()
-    instructions = get_instructions()
+    args = parser.parse_args()
+    instructions = get_instructions(args.cpu, args.maxcpu)
     #for inst in instructions.values():
         #print(inst.__dict__)
-    write_script(args.output, instructions)
+    write_script(args.outputpath, instructions)
 
 
 if __name__ == "__main__":
diff --git a/etc/scripts/find-node b/etc/scripts/find-node
index b417df4b3..986114e43 100755
--- a/etc/scripts/find-node
+++ b/etc/scripts/find-node
@@ -24,8 +24,8 @@ find_node() {
 
 NODE="$(find_node)"
 
-NODE_MIN_VERSION=18
-NODE_VERSION_USED=20
+NODE_MIN_VERSION=20
+NODE_VERSION_USED=22
 NODE_VERSION=$(${NODE} --version)
 NODE_MAJOR_VERSION=$(echo "${NODE_VERSION}" | cut -f1 -d. | sed 's/^v//g')
 
diff --git a/lib/asm-docs/_all.ts b/lib/asm-docs/_all.ts
index 4197f0409..7ba601de4 100644
--- a/lib/asm-docs/_all.ts
+++ b/lib/asm-docs/_all.ts
@@ -34,3 +34,4 @@ export {PowerDocumentationProvider} from './power.js';
 export {PythonDocumentationProvider} from './python.js';
 export {Riscv64DocumentationProvider} from './riscv64.js';
 export {SASSDocumentationProvider} from './sass.js';
+export {WDC65c816DocumentationProvider} from './wdc65c816.js';
diff --git a/lib/asm-docs/generated/asm-docs-6502.ts b/lib/asm-docs/generated/asm-docs-6502.ts
index 18a106c6c..0775e999b 100644
--- a/lib/asm-docs/generated/asm-docs-6502.ts
+++ b/lib/asm-docs/generated/asm-docs-6502.ts
@@ -19,7 +19,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "ASL":
             return {
-                "html": "<p>The shift left instruction shifts either the accumulator or the address memory location 1 bit to the left, with the bit 0 always being set to 0 and the the input bit 7 being stored in the carry flag. ASL either shifts the accumulator left 1 bit or is a read/modify/write instruction that affects only memory.</p><p>The instruction does not affect the overflow bit, sets N equal to the result bit 7 (bit 6 in the input), sets Z flag if the result is equal to 0, otherwise resets Z and stores the input bit 7 in the carry flag.</p>",
+                "html": "<p>The shift left instruction shifts either the accumulator or the address memory location 1 bit to the left, with the bit 0 always being set to 0 and the input bit 7 being stored in the carry flag. ASL either shifts the accumulator left 1 bit or is a read/modify/write instruction that affects only memory.</p><p>The instruction does not affect the overflow bit, sets N equal to the result bit 7 (bit 6 in the input), sets Z flag if the result is equal to 0, otherwise resets Z and stores the input bit 7 in the carry flag.</p>",
                 "tooltip": "Arithmetic Shift Left",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ASL",
             };
@@ -40,7 +40,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "BEQ":
             return {
-                "html": "<p>This instruction could also be called \"Branch on Equal.\"</p><p>It takes a conditional branch whenever the Z flag is on or the previ ous result is equal to 0.</p><p>BEQ does not affect any of the flags or registers other than the program counter and only then when the Z flag is set.</p>",
+                "html": "<p>This instruction could also be called \"Branch on Equal.\"</p><p>It takes a conditional branch whenever the Z flag is on or the previous result is equal to 0.</p><p>BEQ does not affect any of the flags or registers other than the program counter and only then when the Z flag is set.</p>",
                 "tooltip": "Branch on Result Zero",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#BEQ",
             };
@@ -75,7 +75,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "BRK":
             return {
-                "html": "<p>The break command causes the microprocessor to go through an inter rupt sequence under program control. This means that the program counter of the second byte after the BRK. is automatically stored on the stack along with the processor status at the beginning of the break instruction. The microprocessor then transfers control to the interrupt vector.</p><p>Other than changing the program counter, the break instruction changes no values in either the registers or the flags.</p>",
+                "html": "<p>The break command causes the microprocessor to go through an interrupt sequence under program control. This means that the program counter of the second byte after the BRK. is automatically stored on the stack along with the processor status at the beginning of the break instruction. The microprocessor then transfers control to the interrupt vector.</p><p>Other than changing the program counter, the break instruction changes no values in either the registers or the flags.</p>",
                 "tooltip": "Break Command",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#BRK",
             };
@@ -96,7 +96,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CLC":
             return {
-                "html": "<p>This instruction initializes the carry flag to a 0. This op eration should normally precede an ADC loop. It is also useful when used with a R0L instruction to clear a bit in memory.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is reset.</p>",
+                "html": "<p>This instruction initializes the carry flag to a 0. This operation should normally precede an ADC loop. It is also useful when used with a R0L instruction to clear a bit in memory.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is reset.</p>",
                 "tooltip": "Clear Carry Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CLC",
             };
@@ -117,7 +117,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CLV":
             return {
-                "html": "<p>This instruction clears the overflow flag to a 0. This com mand is used in conjunction with the set overflow pin which can change the state of the overflow flag with an external signal.</p><p>CLV affects no registers in the microprocessor and no flags other than the overflow flag which is set to a 0.</p>",
+                "html": "<p>This instruction clears the overflow flag to a 0. This command is used in conjunction with the set overflow pin which can change the state of the overflow flag with an external signal.</p><p>CLV affects no registers in the microprocessor and no flags other than the overflow flag which is set to a 0.</p>",
                 "tooltip": "Clear Overflow Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CLV",
             };
@@ -138,7 +138,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "CPY":
             return {
-                "html": "<p>This instruction performs a two's complement subtraction between the index register Y and the specified memory location. The results of the subtraction are not stored anywhere. The instruction is strictly used to set the flags.</p><p>CPY affects no registers in the microprocessor and also does not affect the overflow flag. If the value in the index register Y is equal to or greater than the value in the memory, the carry flag will be set, otherwise it will be cleared. If the results of the subtract- tion contain bit 7 on the N bit will be set, otherwise it will be cleared. If the value in the index register Y and the value in the memory are equal, the zero flag will be set, otherwise it will be cleared.</p>",
+                "html": "<p>This instruction performs a two's complement subtraction between the index register Y and the specified memory location. The results of the subtraction are not stored anywhere. The instruction is strictly used to set the flags.</p><p>CPY affects no registers in the microprocessor and also does not affect the overflow flag. If the value in the index register Y is equal to or greater than the value in the memory, the carry flag will be set, otherwise it will be cleared. If the results of the subtraction contain bit 7 on the N bit will be set, otherwise it will be cleared. If the value in the index register Y and the value in the memory are equal, the zero flag will be set, otherwise it will be cleared.</p>",
                 "tooltip": "Compare Index Register Y To Memory",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#CPY",
             };
@@ -159,7 +159,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "DEY":
             return {
-                "html": "<p>This instruction subtracts one from the current value in the in dex register Y and stores the result into the index register Y. The result does not affect or consider carry so that the value in the index register Y is decremented to 0 and then through 0 to FF.</p><p>Decrement Y does not affect the carry or overflow flags; if the Y register contains bit 7 on as a result of the decrement the N flag is set, otherwise the N flag is reset. If the Y register is 0 as a result of the decrement, the Z flag is set otherwise the Z flag is reset. This instruction only affects the index register Y.</p>",
+                "html": "<p>This instruction subtracts one from the current value in the index register Y and stores the result into the index register Y. The result does not affect or consider carry so that the value in the index register Y is decremented to 0 and then through 0 to FF.</p><p>Decrement Y does not affect the carry or overflow flags; if the Y register contains bit 7 on as a result of the decrement the N flag is set, otherwise the N flag is reset. If the Y register is 0 as a result of the decrement, the Z flag is set otherwise the Z flag is reset. This instruction only affects the index register Y.</p>",
                 "tooltip": "Decrement Index Register Y By One",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#DEY",
             };
@@ -194,14 +194,14 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "JMP":
             return {
-                "html": "<p>In this instruction, the data from the memory location located in the program sequence after the OP CODE is loaded into the low order byte of the program counter (PCL) and the data from the next memory location after that is loaded into the high order byte of the program counter (PCH).</p><p>This instruction establishes a new valne for the program counter.</p><p>It affects only the program counter in the microprocessor and affects no flags in the status register.</p>",
+                "html": "<p>In this instruction, the data from the memory location located in the program sequence after the OP CODE is loaded into the low order byte of the program counter (PCL) and the data from the next memory location after that is loaded into the high order byte of the program counter (PCH).</p><p>This instruction establishes a new value for the program counter.</p><p>It affects only the program counter in the microprocessor and affects no flags in the status register.</p>",
                 "tooltip": "JMP Indirect",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#JMP",
             };
 
         case "JSR":
             return {
-                "html": "<p>This instruction transfers control of the program counter to a subroutine location but leaves a return pointer on the stack to allow the user to return to perform the next instruction in the main program after the subroutine is complete. To accomplish this, JSR instruction stores the program counter address which points to the last byte of the jump instruc tion onto the stack using the stack pointer. The stack byte contains the program count high first, followed by program count low. The JSR then transfers the addresses following the jump instruction to the program counter low and the program counter high, thereby directing the program to begin at that new address.</p><p>The JSR instruction affects no flags, causes the stack pointer to be decremented by 2 and substitutes new values into the program counter low and the program counter high.</p>",
+                "html": "<p>This instruction transfers control of the program counter to a subroutine location but leaves a return pointer on the stack to allow the user to return to perform the next instruction in the main program after the subroutine is complete. To accomplish this, JSR instruction stores the program counter address which points to the last byte of the jump instruction onto the stack using the stack pointer. The stack byte contains the program count high first, followed by program count low. The JSR then transfers the addresses following the jump instruction to the program counter low and the program counter high, thereby directing the program to begin at that new address.</p><p>The JSR instruction affects no flags, causes the stack pointer to be decremented by 2 and substitutes new values into the program counter low and the program counter high.</p>",
                 "tooltip": "Jump To Subroutine",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#JSR",
             };
@@ -257,7 +257,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "PHP":
             return {
-                "html": "<p>This instruction transfers the contents of the processor status reg ister unchanged to the stack, as governed by the stack pointer.</p><p>The PHP instruction affects no registers or flags in the microprocessor.</p>",
+                "html": "<p>This instruction transfers the contents of the processor status register unchanged to the stack, as governed by the stack pointer.</p><p>The PHP instruction affects no registers or flags in the microprocessor.</p>",
                 "tooltip": "Push Processor Status On Stack",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#PHP",
             };
@@ -271,28 +271,28 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "PLP":
             return {
-                "html": "<p>This instruction transfers the next value on the stack to the Proces sor Status register, thereby changing all of the flags and setting the mode switches to the values from the stack.</p><p>The PLP instruction affects no registers in the processor other than the status register. This instruction could affect all flags in the status register.</p>",
+                "html": "<p>This instruction transfers the next value on the stack to the Processor Status register, thereby changing all of the flags and setting the mode switches to the values from the stack.</p><p>The PLP instruction affects no registers in the processor other than the status register. This instruction could affect all flags in the status register.</p>",
                 "tooltip": "Pull Processor Status From Stack",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#PLP",
             };
 
         case "ROL":
             return {
-                "html": "<p>The rotate left instruction shifts either the accumulator or addressed memory left 1 bit, with the input carry being stored in bit 0 and with the input bit 7 being stored in the carry flags.</p><p>The ROL instruction either shifts the accumulator left 1 bit and stores the carry in accumulator bit 0 or does not affect the internal registers at all. The ROL instruction sets carry equal to the input bit 7, sets N equal to the input bit 6 , sets the Z flag if the result of the ro tate is 0, otherwise it resets Z and does not affect the overflow flag at all.</p>",
+                "html": "<p>The rotate left instruction shifts either the accumulator or addressed memory left 1 bit, with the input carry being stored in bit 0 and with the input bit 7 being stored in the carry flags.</p><p>The ROL instruction either shifts the accumulator left 1 bit and stores the carry in accumulator bit 0 or does not affect the internal registers at all. The ROL instruction sets carry equal to the input bit 7, sets N equal to the input bit 6 , sets the Z flag if the result of the rotate is 0, otherwise it resets Z and does not affect the overflow flag at all.</p>",
                 "tooltip": "Rotate Left",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ROL",
             };
 
         case "ROR":
             return {
-                "html": "<p>The rotate right instruction shifts either the accumulator or addressed memory right 1 bit with bit 0 shifted into the carry and carry shifted into bit 7.</p><p>The ROR instruction either shifts the accumulator right 1 bit and stores the carry in accumulator bit 7 or does not affect the internal regis ters at all. The ROR instruction sets carry equal to input bit 0, sets N equal to the input carry and sets the Z flag if the result of the rotate is 0; otherwise it resets Z and does not affect the overflow flag at all.</p><p>(Available on Microprocessors after June, 1976)</p>",
+                "html": "<p>The rotate right instruction shifts either the accumulator or addressed memory right 1 bit with bit 0 shifted into the carry and carry shifted into bit 7.</p><p>The ROR instruction either shifts the accumulator right 1 bit and stores the carry in accumulator bit 7 or does not affect the internal registers at all. The ROR instruction sets carry equal to input bit 0, sets N equal to the input carry and sets the Z flag if the result of the rotate is 0; otherwise it resets Z and does not affect the overflow flag at all.</p><p>(Available on Microprocessors after June, 1976)</p>",
                 "tooltip": "Rotate Right",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#ROR",
             };
 
         case "RTI":
             return {
-                "html": "<p>This instruction transfers from the stack into the microprocessor the processor status and the program counter location for the instruction which was interrupted. By virtue of the interrupt having stored this data before executing the instruction and thei fact that the RTI reinitializes the microprocessor to the same state as when it was interrupted, the combination of interrupt plus RTI allows truly reentrant coding.</p><p>The RTI instruction reinitializes all flags to the position to the point they were at the time the interrupt was taken and sets the program counter back to its pre-interrupt state. It affects no other registers in the microprocessor.</p>",
+                "html": "<p>This instruction transfers from the stack into the microprocessor the processor status and the program counter location for the instruction which was interrupted. By virtue of the interrupt having stored this data before executing the instruction and the fact that the RTI reinitializes the microprocessor to the same state as when it was interrupted, the combination of interrupt plus RTI allows truly reentrant coding.</p><p>The RTI instruction reinitializes all flags to the position to the point they were at the time the interrupt was taken and sets the program counter back to its pre-interrupt state. It affects no other registers in the microprocessor.</p>",
                 "tooltip": "Return From Interrupt",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#RTI",
             };
@@ -300,7 +300,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
         case "RTS":
             return {
                 "html": "<p>This instruction loads the program count low and program count high from the stack into the program counter and increments the program counter so that it points to the instruction following the JSR. The stack pointer is adjusted by incrementing it twice.</p><p>The RTS instruction does not affect any flags and affects only PCL and PCH.</p>",
-                "tooltip": "Return From Subroutme",
+                "tooltip": "Return From Subroutine",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#RTS",
             };
 
@@ -313,7 +313,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SEC":
             return {
-                "html": "<p>This instruction initializes the carry flag to a 1. This op eration should normally precede a SBC loop. It is also useful when used with a ROL instruction to initialize a bit in memory to a 1.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is set.</p>",
+                "html": "<p>This instruction initializes the carry flag to a 1. This operation should normally precede a SBC loop. It is also useful when used with a ROL instruction to initialize a bit in memory to a 1.</p><p>This instruction affects no registers in the microprocessor and no flags other than the carry flag which is set.</p>",
                 "tooltip": "Set Carry Flag",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SEC",
             };
@@ -355,7 +355,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "TAX":
             return {
-                "html": "<p>This instruction takes the value from accumulator A and trans fers or loads it into the index register X without disturbing the content of the accumulator A.</p><p>TAX only affects the index register X, does not affect the carry or overflow flags. The N flag is set if the resultant value in the index register X has bit 7 on, otherwise N is reset. The Z bit is set if the content of the register X is 0 as aresult of theopera tion, otherwise it is reset.</p>",
+                "html": "<p>This instruction takes the value from accumulator A and trans fers or loads it into the index register X without disturbing the content of the accumulator A.</p><p>TAX only affects the index register X, does not affect the carry or overflow flags. The N flag is set if the resultant value in the index register X has bit 7 on, otherwise N is reset. The Z bit is set if the content of the register X is 0 as a result of the operation, otherwise it is reset.</p>",
                 "tooltip": "Transfer Accumulator To Index X",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TAX",
             };
@@ -363,7 +363,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
         case "TAY":
             return {
                 "html": "<p>This instruction moves the value of the accumulator into index register Y without affecting the accumulator.</p><p>TAY instruction only affects the Y register and does not affect either the carry or overflow flags. If the index register Y has bit 7 on, then N is set, otherwise it is reset. If the content of the index register Y equals 0 as a result of the operation, Z is set on, otherwise it is reset.</p>",
-                "tooltip": "Transfer Accumula Tor To Index Y",
+                "tooltip": "Transfer Accumulator To Index Y",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TAY",
             };
 
@@ -390,7 +390,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "TYA":
             return {
-                "html": "<p>This instruction moves the value that is in the index register Y to accumulator A without disturbing the content of the register Y.</p><p>TYA does not affect any other register other than the accumula tor and does not affect the carry or overflow flag. If the result in the accumulator A has bit 7 on, the N flag is set, otherwise it is reset. If the resultant value in the accumulator A is 0, then the Z flag is set, otherwise it is reset.</p>",
+                "html": "<p>This instruction moves the value that is in the index register Y to accumulator A without disturbing the content of the register Y.</p><p>TYA does not affect any other register other than the accumulator and does not affect the carry or overflow flag. If the result in the accumulator A has bit 7 on, the N flag is set, otherwise it is reset. If the resultant value in the accumulator A is 0, then the Z flag is set, otherwise it is reset.</p>",
                 "tooltip": "Transfer Index Y To Accumulator",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#TYA",
             };
@@ -404,7 +404,7 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SHA":
             return {
-                "html": "<p>The undocumented SHA instruction performs a bit-by-bit AND operation of the following three operands: The first two are the accumulator and the index register X.</p><p>The third operand depends on the addressing mode. In the zero page indirect Y-indexed case, the third operand is the data in memory at the given zero page address (ignoring the the addressing mode's Y offset) plus 1. In the Y-indexed absolute case, it is the upper 8 bits of the given address (ignoring the the addressing mode's Y offset), plus 1.</p><p>It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHA instruction performs a bit-by-bit AND operation of the following three operands: The first two are the accumulator and the index register X.</p><p>The third operand depends on the addressing mode. In the zero page indirect Y-indexed case, the third operand is the data in memory at the given zero page address (ignoring the addressing mode's Y offset) plus 1. In the Y-indexed absolute case, it is the upper 8 bits of the given address (ignoring the addressing mode's Y offset), plus 1.</p><p>It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Accumulator \"AND\" Index Register X \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHA",
             };
@@ -488,14 +488,14 @@ export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInf
 
         case "SHX":
             return {
-                "html": "<p>The undocumented SHX instruction performs a bit-by-bit AND operation of the index register X and the upper 8 bits of the given address (ignoring the the addressing mode's Y offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHX instruction performs a bit-by-bit AND operation of the index register X and the upper 8 bits of the given address (ignoring the addressing mode's Y offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Index Register X \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHX",
             };
 
         case "SHY":
             return {
-                "html": "<p>The undocumented SHY instruction performs a bit-by-bit AND operation of the index register Y and the upper 8 bits of the given address (ignoring the the addressing mode's X offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
+                "html": "<p>The undocumented SHY instruction performs a bit-by-bit AND operation of the index register Y and the upper 8 bits of the given address (ignoring the addressing mode's X offset), plus 1. It then transfers the result to the addressed memory location.</p><p>No flags or registers in the microprocessor are affected by the store operation.</p>",
                 "tooltip": "Store Index Register Y \"AND\" Value",
                 "url": "https://www.pagetable.com/c64ref/6502/?cpu=6502&tab=2#SHY",
             };
diff --git a/lib/asm-docs/generated/asm-docs-65c816.ts b/lib/asm-docs/generated/asm-docs-65c816.ts
new file mode 100644
index 000000000..94fdb35da
--- /dev/null
+++ b/lib/asm-docs/generated/asm-docs-65c816.ts
@@ -0,0 +1,644 @@
+import {AssemblyInstructionInfo} from '../base.js';
+
+export function getAsmOpcode(opcode: string | undefined): AssemblyInstructionInfo | undefined {
+    if (!opcode) return;
+    switch (opcode.toUpperCase()) {
+        case "ADC":
+            return {
+                "html": "<p>Add Memory to Accumulator with Carry</p>",
+                "tooltip": "Add Memory to Accumulator with Carry",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ADC",
+            };
+
+        case "AND":
+            return {
+                "html": "<p>\"AND\" Memory with Accumulator</p>",
+                "tooltip": "\"AND\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#AND",
+            };
+
+        case "ASL":
+            return {
+                "html": "<p>Arithmetic Shift Left</p>",
+                "tooltip": "Arithmetic Shift Left",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ASL",
+            };
+
+        case "BCC":
+            return {
+                "html": "<p>Branch on Carry Clear</p>",
+                "tooltip": "Branch on Carry Clear",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BCC",
+            };
+
+        case "BCS":
+            return {
+                "html": "<p>Branch on Carry Set</p>",
+                "tooltip": "Branch on Carry Set",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BCS",
+            };
+
+        case "BEQ":
+            return {
+                "html": "<p>Branch on Result Zero</p>",
+                "tooltip": "Branch on Result Zero",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BEQ",
+            };
+
+        case "BIT":
+            return {
+                "html": "<p>Test Bits in Memory with Accumulator</p>",
+                "tooltip": "Test Bits in Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BIT",
+            };
+
+        case "BMI":
+            return {
+                "html": "<p>Branch on Result Minus</p>",
+                "tooltip": "Branch on Result Minus",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BMI",
+            };
+
+        case "BNE":
+            return {
+                "html": "<p>Branch on Result Not Zero</p>",
+                "tooltip": "Branch on Result Not Zero",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BNE",
+            };
+
+        case "BPL":
+            return {
+                "html": "<p>Branch on Result Plus</p>",
+                "tooltip": "Branch on Result Plus",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BPL",
+            };
+
+        case "BRK":
+            return {
+                "html": "<p>Break Command</p>",
+                "tooltip": "Break Command",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRK",
+            };
+
+        case "BVC":
+            return {
+                "html": "<p>Branch on Overflow Clear</p>",
+                "tooltip": "Branch on Overflow Clear",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BVC",
+            };
+
+        case "BVS":
+            return {
+                "html": "<p>Branch on Overflow Set</p>",
+                "tooltip": "Branch on Overflow Set",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BVS",
+            };
+
+        case "CLC":
+            return {
+                "html": "<p>Clear Carry Flag</p>",
+                "tooltip": "Clear Carry Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLC",
+            };
+
+        case "CLD":
+            return {
+                "html": "<p>Clear Decimal Mode</p>",
+                "tooltip": "Clear Decimal Mode",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLD",
+            };
+
+        case "CLI":
+            return {
+                "html": "<p>Clear Interrupt Disable</p>",
+                "tooltip": "Clear Interrupt Disable",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLI",
+            };
+
+        case "CLV":
+            return {
+                "html": "<p>Clear Overflow Flag</p>",
+                "tooltip": "Clear Overflow Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CLV",
+            };
+
+        case "CMP":
+            return {
+                "html": "<p>Compare Memory and Accumulator</p>",
+                "tooltip": "Compare Memory and Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CMP",
+            };
+
+        case "CPX":
+            return {
+                "html": "<p>Compare Index Register X To Memory</p>",
+                "tooltip": "Compare Index Register X To Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CPX",
+            };
+
+        case "CPY":
+            return {
+                "html": "<p>Compare Index Register Y To Memory</p>",
+                "tooltip": "Compare Index Register Y To Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#CPY",
+            };
+
+        case "DEC":
+            return {
+                "html": "<p>Decrement Memory By One</p>",
+                "tooltip": "Decrement Memory By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEC",
+            };
+
+        case "DEX":
+            return {
+                "html": "<p>Decrement Index Register X By One</p>",
+                "tooltip": "Decrement Index Register X By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEX",
+            };
+
+        case "DEY":
+            return {
+                "html": "<p>Decrement Index Register Y By One</p>",
+                "tooltip": "Decrement Index Register Y By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#DEY",
+            };
+
+        case "EOR":
+            return {
+                "html": "<p>\"Exclusive OR\" Memory with Accumulator</p>",
+                "tooltip": "\"Exclusive OR\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#EOR",
+            };
+
+        case "INC":
+            return {
+                "html": "<p>Increment Memory By One</p>",
+                "tooltip": "Increment Memory By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INC",
+            };
+
+        case "INX":
+            return {
+                "html": "<p>Increment Index Register X By One</p>",
+                "tooltip": "Increment Index Register X By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INX",
+            };
+
+        case "INY":
+            return {
+                "html": "<p>Increment Index Register Y By One</p>",
+                "tooltip": "Increment Index Register Y By One",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#INY",
+            };
+
+        case "JMP":
+            return {
+                "html": "<p>JMP Indirect</p>",
+                "tooltip": "JMP Indirect",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JMP",
+            };
+
+        case "JSR":
+            return {
+                "html": "<p>Jump To Subroutine</p>",
+                "tooltip": "Jump To Subroutine",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JSR",
+            };
+
+        case "LDA":
+            return {
+                "html": "<p>Load Accumulator with Memory</p>",
+                "tooltip": "Load Accumulator with Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDA",
+            };
+
+        case "LDX":
+            return {
+                "html": "<p>Load Index Register X From Memory</p>",
+                "tooltip": "Load Index Register X From Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDX",
+            };
+
+        case "LDY":
+            return {
+                "html": "<p>Load Index Register Y From Memory</p>",
+                "tooltip": "Load Index Register Y From Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LDY",
+            };
+
+        case "LSR":
+            return {
+                "html": "<p>Logical Shift Right</p>",
+                "tooltip": "Logical Shift Right",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#LSR",
+            };
+
+        case "NOP":
+            return {
+                "html": "<p>No Operation</p>",
+                "tooltip": "No Operation",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#NOP",
+            };
+
+        case "ORA":
+            return {
+                "html": "<p>\"OR\" Memory with Accumulator</p>",
+                "tooltip": "\"OR\" Memory with Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ORA",
+            };
+
+        case "PHA":
+            return {
+                "html": "<p>Push Accumulator On Stack</p>",
+                "tooltip": "Push Accumulator On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHA",
+            };
+
+        case "PHP":
+            return {
+                "html": "<p>Push Processor Status On Stack</p>",
+                "tooltip": "Push Processor Status On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHP",
+            };
+
+        case "PLA":
+            return {
+                "html": "<p>Pull Accumulator From Stack</p>",
+                "tooltip": "Pull Accumulator From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLA",
+            };
+
+        case "PLP":
+            return {
+                "html": "<p>Pull Processor Status From Stack</p>",
+                "tooltip": "Pull Processor Status From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLP",
+            };
+
+        case "ROL":
+            return {
+                "html": "<p>Rotate Left</p>",
+                "tooltip": "Rotate Left",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ROL",
+            };
+
+        case "ROR":
+            return {
+                "html": "<p>Rotate Right</p>",
+                "tooltip": "Rotate Right",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#ROR",
+            };
+
+        case "RTI":
+            return {
+                "html": "<p>Return From Interrupt</p>",
+                "tooltip": "Return From Interrupt",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTI",
+            };
+
+        case "RTS":
+            return {
+                "html": "<p>Return From Subroutine</p>",
+                "tooltip": "Return From Subroutine",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTS",
+            };
+
+        case "SBC":
+            return {
+                "html": "<p>Subtract Memory from Accumulator with Borrow</p>",
+                "tooltip": "Subtract Memory from Accumulator with Borrow",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SBC",
+            };
+
+        case "SEC":
+            return {
+                "html": "<p>Set Carry Flag</p>",
+                "tooltip": "Set Carry Flag",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEC",
+            };
+
+        case "SED":
+            return {
+                "html": "<p>Set Decimal Mode</p>",
+                "tooltip": "Set Decimal Mode",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SED",
+            };
+
+        case "SEI":
+            return {
+                "html": "<p>Set Interrupt Disable</p>",
+                "tooltip": "Set Interrupt Disable",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEI",
+            };
+
+        case "STA":
+            return {
+                "html": "<p>Store Accumulator in Memory</p>",
+                "tooltip": "Store Accumulator in Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STA",
+            };
+
+        case "STX":
+            return {
+                "html": "<p>Store Index Register X In Memory</p>",
+                "tooltip": "Store Index Register X In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STX",
+            };
+
+        case "STY":
+            return {
+                "html": "<p>Store Index Register Y In Memory</p>",
+                "tooltip": "Store Index Register Y In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STY",
+            };
+
+        case "TAX":
+            return {
+                "html": "<p>Transfer Accumulator To Index X</p>",
+                "tooltip": "Transfer Accumulator To Index X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TAX",
+            };
+
+        case "TAY":
+            return {
+                "html": "<p>Transfer Accumulator To Index Y</p>",
+                "tooltip": "Transfer Accumulator To Index Y",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TAY",
+            };
+
+        case "TSX":
+            return {
+                "html": "<p>Transfer Stack Pointer To Index X</p>",
+                "tooltip": "Transfer Stack Pointer To Index X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSX",
+            };
+
+        case "TXA":
+            return {
+                "html": "<p>Transfer Index X To Accumulator</p>",
+                "tooltip": "Transfer Index X To Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXA",
+            };
+
+        case "TXS":
+            return {
+                "html": "<p>Transfer Index X To Stack Pointer</p>",
+                "tooltip": "Transfer Index X To Stack Pointer",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXS",
+            };
+
+        case "TYA":
+            return {
+                "html": "<p>Transfer Index Y To Accumulator</p>",
+                "tooltip": "Transfer Index Y To Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TYA",
+            };
+
+        case "BRA":
+            return {
+                "html": "<p>Branch Always</p>",
+                "tooltip": "Branch Always",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRA",
+            };
+
+        case "PHX":
+            return {
+                "html": "<p>Push Index Register X On Stack</p>",
+                "tooltip": "Push Index Register X On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHX",
+            };
+
+        case "PHY":
+            return {
+                "html": "<p>Push Index Register Y On Stack</p>",
+                "tooltip": "Push Index Register Y On Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHY",
+            };
+
+        case "PLX":
+            return {
+                "html": "<p>Pull Index Register X From Stack</p>",
+                "tooltip": "Pull Index Register X From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLX",
+            };
+
+        case "PLY":
+            return {
+                "html": "<p>Pull Index Register Y From Stack</p>",
+                "tooltip": "Pull Index Register Y From Stack",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLY",
+            };
+
+        case "STZ":
+            return {
+                "html": "<p>Store Zero In Memory</p>",
+                "tooltip": "Store Zero In Memory",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STZ",
+            };
+
+        case "TRB":
+            return {
+                "html": "<p>Test And Reset Memory Bits With Accumulator</p>",
+                "tooltip": "Test And Reset Memory Bits With Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TRB",
+            };
+
+        case "TSB":
+            return {
+                "html": "<p>Test And Set Memory Bits With Accumulator</p>",
+                "tooltip": "Test And Set Memory Bits With Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSB",
+            };
+
+        case "BRL":
+            return {
+                "html": "<p>Branch Long</p>",
+                "tooltip": "Branch Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#BRL",
+            };
+
+        case "COP":
+            return {
+                "html": "<p>Coprocessor</p>",
+                "tooltip": "Coprocessor",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#COP",
+            };
+
+        case "JSL":
+            return {
+                "html": "<p>Jump to Subroutine Long</p>",
+                "tooltip": "Jump to Subroutine Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#JSL",
+            };
+
+        case "MVN":
+            return {
+                "html": "<p>Move Memory Negative</p>",
+                "tooltip": "Move Memory Negative",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#MVN",
+            };
+
+        case "MVP":
+            return {
+                "html": "<p>Move Memory Positive</p>",
+                "tooltip": "Move Memory Positive",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#MVP",
+            };
+
+        case "PEA":
+            return {
+                "html": "<p>Push Effective Address</p>",
+                "tooltip": "Push Effective Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PEA",
+            };
+
+        case "PEI":
+            return {
+                "html": "<p>Push Effective Indirect Address</p>",
+                "tooltip": "Push Effective Indirect Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PEI",
+            };
+
+        case "PER":
+            return {
+                "html": "<p>Push Effective Relative Address</p>",
+                "tooltip": "Push Effective Relative Address",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PER",
+            };
+
+        case "PHB":
+            return {
+                "html": "<p>Push Data Bank Register</p>",
+                "tooltip": "Push Data Bank Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHB",
+            };
+
+        case "PHD":
+            return {
+                "html": "<p>Push Direct Register</p>",
+                "tooltip": "Push Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHD",
+            };
+
+        case "PHK":
+            return {
+                "html": "<p>Push K Register</p>",
+                "tooltip": "Push K Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PHK",
+            };
+
+        case "PLB":
+            return {
+                "html": "<p>Pull Data Bank Register</p>",
+                "tooltip": "Pull Data Bank Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLB",
+            };
+
+        case "PLD":
+            return {
+                "html": "<p>Pull Direct Register</p>",
+                "tooltip": "Pull Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#PLD",
+            };
+
+        case "REP":
+            return {
+                "html": "<p>Reset Processor Status Bits</p>",
+                "tooltip": "Reset Processor Status Bits",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#REP",
+            };
+
+        case "RTL":
+            return {
+                "html": "<p>Return From Subroutine Long</p>",
+                "tooltip": "Return From Subroutine Long",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#RTL",
+            };
+
+        case "SEP":
+            return {
+                "html": "<p>Set Processor Status Bits</p>",
+                "tooltip": "Set Processor Status Bits",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#SEP",
+            };
+
+        case "STP":
+            return {
+                "html": "<p>Stop the Clock</p>",
+                "tooltip": "Stop the Clock",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#STP",
+            };
+
+        case "TCD":
+            return {
+                "html": "<p>Transfer C Accumulator to Direct Register</p>",
+                "tooltip": "Transfer C Accumulator to Direct Register",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TCD",
+            };
+
+        case "TCS":
+            return {
+                "html": "<p>Transfer C Accumulator to Stack Pointer</p>",
+                "tooltip": "Transfer C Accumulator to Stack Pointer",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TCS",
+            };
+
+        case "TDC":
+            return {
+                "html": "<p>Transfer Direct Register to C Accumulator</p>",
+                "tooltip": "Transfer Direct Register to C Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TDC",
+            };
+
+        case "TSC":
+            return {
+                "html": "<p>Transfer Stack Pointer to C Accumulator</p>",
+                "tooltip": "Transfer Stack Pointer to C Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TSC",
+            };
+
+        case "TXY":
+            return {
+                "html": "<p>Transfer X to Y</p>",
+                "tooltip": "Transfer X to Y",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TXY",
+            };
+
+        case "TYX":
+            return {
+                "html": "<p>Transfer Y to X</p>",
+                "tooltip": "Transfer Y to X",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#TYX",
+            };
+
+        case "WAI":
+            return {
+                "html": "<p>Wait for Interrupt</p>",
+                "tooltip": "Wait for Interrupt",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#WAI",
+            };
+
+        case "WDM":
+            return {
+                "html": "<p>William D. Mensch, Jr.</p>",
+                "tooltip": "William D. Mensch, Jr.",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#WDM",
+            };
+
+        case "XBA":
+            return {
+                "html": "<p>Exchange B and A Accumulator</p>",
+                "tooltip": "Exchange B and A Accumulator",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#XBA",
+            };
+
+        case "XCE":
+            return {
+                "html": "<p>Exchange Carry and Emulation Flags</p>",
+                "tooltip": "Exchange Carry and Emulation Flags",
+                "url": "https://www.pagetable.com/c64ref/6502/?cpu=65c816&tab=2#XCE",
+            };
+
+    }
+}
\ No newline at end of file
diff --git a/lib/asm-docs/wdc65c816.ts b/lib/asm-docs/wdc65c816.ts
new file mode 100644
index 000000000..9bfeed303
--- /dev/null
+++ b/lib/asm-docs/wdc65c816.ts
@@ -0,0 +1,35 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {AssemblyInstructionInfo, BaseAssemblyDocumentationProvider} from './base.js';
+import {getAsmOpcode} from './generated/asm-docs-65c816.js';
+
+export class WDC65c816DocumentationProvider extends BaseAssemblyDocumentationProvider {
+    public static get key() {
+        return 'wdc65c816';
+    }
+    public override getInstructionInformation(instruction: string): AssemblyInstructionInfo | null {
+        return getAsmOpcode(instruction) || null;
+    }
+}
diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts
index 07c96d948..63b8a826a 100644
--- a/lib/base-compiler.ts
+++ b/lib/base-compiler.ts
@@ -2150,7 +2150,7 @@ export class BaseCompiler {
         }
 
         const execTriple = await RemoteExecutionQuery.guessExecutionTripleForBuildresult(buildResult);
-        if (!matchesCurrentHost(execTriple)) {
+        if (!this.compiler.emulated && !matchesCurrentHost(execTriple)) {
             if (await RemoteExecutionQuery.isPossible(execTriple)) {
                 const result = await this.runExecutableRemotely(executablePackageHash, executeParameters, execTriple);
                 return moveArtifactsIntoResult(buildResult, {
@@ -3667,7 +3667,7 @@ but nothing was dumped. Possible causes are:
         if (this.compiler.supportsMarch) return [`-march=${c_value_placeholder}`];
         if (this.compiler.supportsTargetIs) return [`--target=${c_value_placeholder}`];
         if (this.compiler.supportsTarget) return ['--target', c_value_placeholder];
-
+        if (this.compiler.supportsHyphenTarget) return ['-target', c_value_placeholder];
         return [];
     }
 
@@ -3676,7 +3676,7 @@ but nothing was dumped. Possible causes are:
         if (this.compiler.supportsMarch) all.push([`-march=${c_value_placeholder}`]);
         if (this.compiler.supportsTargetIs) all.push([`--target=${c_value_placeholder}`]);
         if (this.compiler.supportsTarget) all.push(['--target', c_value_placeholder]);
-
+        if (this.compiler.supportsHyphenTarget) all.push(['-target', c_value_placeholder]);
         return all;
     }
 
diff --git a/lib/compiler-finder.ts b/lib/compiler-finder.ts
index d40fcafaa..477f7a512 100644
--- a/lib/compiler-finder.ts
+++ b/lib/compiler-finder.ts
@@ -203,6 +203,7 @@ export class CompilerFinder {
 
         const supportsBinary = !!props('supportsBinary', true);
         const supportsBinaryObject = !!props('supportsBinaryObject', false);
+        const emulated = !!props('emulated', false);
         const interpreted = !!props('interpreted', false);
         const supportsExecute = (interpreted || supportsBinary) && !!props('supportsExecute', true);
         const executionWrapper = props('executionWrapper', '');
@@ -278,6 +279,7 @@ export class CompilerFinder {
             supportsDemangle: !!demangler,
             supportsBinary,
             supportsBinaryObject,
+            emulated,
             interpreted,
             supportsExecute,
             executionWrapper,
diff --git a/lib/compilers/_all.ts b/lib/compilers/_all.ts
index 5131a27e4..230f87529 100644
--- a/lib/compilers/_all.ts
+++ b/lib/compilers/_all.ts
@@ -109,6 +109,7 @@ export {NvccCompiler} from './nvcc.js';
 export {NvcppCompiler} from './nvcpp.js';
 export {NvrtcCompiler} from './nvrtc.js';
 export {OCamlCompiler} from './ocaml.js';
+export {ORCACompiler} from './orca.js';
 export {OSACATool} from './osaca.js';
 export {OdinCompiler} from './odin.js';
 export {OptCompiler} from './opt.js';
diff --git a/lib/compilers/argument-parsers.ts b/lib/compilers/argument-parsers.ts
index a919bdced..2e1600a44 100644
--- a/lib/compilers/argument-parsers.ts
+++ b/lib/compilers/argument-parsers.ts
@@ -1061,6 +1061,16 @@ export class WasmtimeParser extends BaseParser {
     }
 }
 
+export class ZigParser extends GCCParser {
+    static override async parse(compiler: BaseCompiler) {
+        const results = await Promise.all([ZigParser.getOptions(compiler, 'build-obj --help')]);
+        const options = Object.assign({}, ...results);
+        await GCCParser.setCompilerSettingsFromOptions(compiler, options);
+        if (GCCParser.hasSupportStartsWith(options, '-target ')) compiler.compiler.supportsHyphenTarget = true;
+        return compiler;
+    }
+}
+
 export class ZigCxxParser extends ClangParser {
     static override getMainHelpOptions(): string[] {
         return ['c++', '--help'];
diff --git a/lib/compilers/orca.ts b/lib/compilers/orca.ts
new file mode 100644
index 000000000..88698f6bc
--- /dev/null
+++ b/lib/compilers/orca.ts
@@ -0,0 +1,91 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import path from 'node:path';
+
+import {BypassCache, CacheKey, CompilationResult} from '../../types/compilation/compilation.interfaces.js';
+import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
+import {ExecutableExecutionOptions} from '../../types/execution/execution.interfaces.js';
+import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {BaseCompiler} from '../base-compiler.js';
+import {CompilationEnvironment} from '../compilation-env.js';
+import {ORCAAsmParser} from '../parsers/asm-parser-orca.js';
+import * as utils from '../utils.js';
+
+export class ORCACompiler extends BaseCompiler {
+    static get key() {
+        return 'orca';
+    }
+
+    goldenGate: string;
+
+    constructor(compilerInfo: PreliminaryCompilerInfo, env: CompilationEnvironment) {
+        super(compilerInfo, env);
+        this.goldenGate = this.compilerProps<string>(`compiler.${this.compiler.id}.goldenGate`);
+        this.asm = new ORCAAsmParser(this.compilerProps);
+        this.compiler.demangler = '';
+        this.demanglerClass = null;
+    }
+
+    override getDefaultExecOptions() {
+        const execOptions = super.getDefaultExecOptions();
+        if (this.goldenGate) {
+            execOptions.env.GOLDEN_GATE = this.goldenGate;
+        }
+
+        return execOptions;
+    }
+
+    override getOutputFilename(dirPath: string, outputFilebase: string) {
+        return path.join(dirPath, `${outputFilebase}.a`);
+    }
+
+    override getSharedLibraryPathsAsArguments() {
+        return [];
+    }
+
+    override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string, userOptions?: string[]) {
+        let options: string[];
+
+        if (filters.binary) {
+            options = ['cmpl', 'keep=' + this.filename(outputFilename)];
+        } else {
+            filters.binaryObject = true;
+            options = ['compile', 'keep=' + this.filename(utils.changeExtension(outputFilename, ''))];
+        }
+
+        return options;
+    }
+
+    override async handleExecution(
+        key: CacheKey,
+        executeParameters: ExecutableExecutionOptions,
+        bypassCache: BypassCache,
+    ): Promise<CompilationResult> {
+        if (this.goldenGate) {
+            executeParameters.env.GOLDEN_GATE = this.goldenGate;
+        }
+        return super.handleExecution(key, executeParameters, bypassCache);
+    }
+}
diff --git a/lib/compilers/zig.ts b/lib/compilers/zig.ts
index ce8a04303..4370fff2f 100644
--- a/lib/compilers/zig.ts
+++ b/lib/compilers/zig.ts
@@ -33,6 +33,7 @@ import type {SelectedLibraryVersion} from '../../types/libraries/libraries.inter
 import {BaseCompiler} from '../base-compiler.js';
 import {CompilationEnvironment} from '../compilation-env.js';
 import {asSafeVer} from '../utils.js';
+import {ZigParser} from './argument-parsers.js';
 
 export class ZigCompiler extends BaseCompiler {
     private readonly self_hosted_cli: boolean;
@@ -180,6 +181,10 @@ export class ZigCompiler extends BaseCompiler {
         return userOptions.filter(option => !forbiddenOptions.test(option));
     }
 
+    protected override getArgumentParserClass() {
+        return ZigParser;
+    }
+
     override isCfgCompiler(): boolean {
         return true;
     }
diff --git a/lib/exec.ts b/lib/exec.ts
index 1afd2584e..e104c7008 100644
--- a/lib/exec.ts
+++ b/lib/exec.ts
@@ -26,6 +26,9 @@ import buffer from 'buffer';
 import child_process from 'node:child_process';
 import os from 'node:os';
 import path from 'node:path';
+// @ts-ignore
+import which from 'which';
+
 import {Stream} from 'node:stream';
 
 import fs from 'fs-extra';
@@ -35,6 +38,7 @@ import _ from 'underscore';
 import type {ExecutionOptions} from '../types/compilation/compilation.interfaces.js';
 import type {FilenameTransformFunc, UnprocessedExecResult} from '../types/execution/execution.interfaces.js';
 
+import {splitArguments} from '../shared/common-utils.js';
 import {assert, unwrap, unwrapString} from './assert.js';
 import {logger} from './logger.js';
 import {Graceful} from './node-graceful.js';
@@ -49,6 +53,8 @@ type NsJailOptions = {
 
 const execProps = propsFor('execution');
 
+let stdbufPath = null;
+
 function checkExecOptions(options: ExecutionOptions) {
     if (options.env) {
         for (const key of Object.keys(options.env)) {
@@ -68,7 +74,7 @@ function setupOnError(stream: Stream, name: string) {
     });
 }
 
-export function executeDirect(
+export async function executeDirect(
     command: string,
     args: string[],
     options: ExecutionOptions,
@@ -91,6 +97,20 @@ export function executeDirect(
         if (command.startsWith('./')) command = path.join(process.cwd(), command);
     }
 
+    if (stdbufPath == null) {
+        const unbufferStdoutExe = execProps<string>('unbufferStdoutExe', undefined); // by default 'stdout'
+        if (unbufferStdoutExe) {
+            stdbufPath = await which(unbufferStdoutExe);
+            if (!stdbufPath) logger.error(`Could not find ${unbufferStdoutExe} in PATH`);
+        }
+    }
+
+    if (stdbufPath) {
+        const stdbufArgs = splitArguments(execProps<string>('unbufferStdoutArgs', undefined)); // by default ['-o0']
+        args.unshift(...stdbufArgs, command);
+        command = stdbufPath;
+    }
+
     let okToCache = true;
     let timedOut = false;
     // In WSL; run Windows-volume executables in a temp directory.
diff --git a/lib/instructionsets.ts b/lib/instructionsets.ts
index 19e576f51..117ad6c47 100644
--- a/lib/instructionsets.ts
+++ b/lib/instructionsets.ts
@@ -131,6 +131,10 @@ export class InstructionSets {
                 target: [],
                 path: [],
             },
+            wdc65c816: {
+                target: [],
+                path: [],
+            },
             core: {
                 target: [],
                 path: [],
diff --git a/lib/objdumper/_all.ts b/lib/objdumper/_all.ts
index 347831e35..ae8681792 100644
--- a/lib/objdumper/_all.ts
+++ b/lib/objdumper/_all.ts
@@ -27,3 +27,4 @@ export {DefaultObjdumper} from './default.js';
 export {ElfToolChainObjdumper} from './elftoolchain.js';
 export {LlvmObjdumper} from './llvm.js';
 export {Da65Objdumper} from './da65.js';
+export {GoldenGateObjdumper} from './goldengate.js';
diff --git a/lib/objdumper/goldengate.ts b/lib/objdumper/goldengate.ts
new file mode 100644
index 000000000..a97664897
--- /dev/null
+++ b/lib/objdumper/goldengate.ts
@@ -0,0 +1,39 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {BaseObjdumper} from './base.js';
+
+export class GoldenGateObjdumper extends BaseObjdumper {
+    constructor() {
+        super([], []);
+    }
+
+    override getDefaultArgs(outputFilename: string) {
+        return [outputFilename];
+    }
+
+    static override get key() {
+        return 'goldengate';
+    }
+}
diff --git a/lib/parsers/asm-parser-orca.ts b/lib/parsers/asm-parser-orca.ts
new file mode 100644
index 000000000..40e3cf708
--- /dev/null
+++ b/lib/parsers/asm-parser-orca.ts
@@ -0,0 +1,149 @@
+// Copyright (c) 2025, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import {AsmResultLabel, ParsedAsmResultLine} from '../../types/asmresult/asmresult.interfaces.js';
+import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
+import {PropertyGetter} from '../properties.interfaces.js';
+
+import {AsmParser} from './asm-parser.js';
+
+export class ORCAAsmParser extends AsmParser {
+    labelDefinitionRe: RegExp;
+    operandRe: RegExp;
+    labelInOperandRe: RegExp;
+    directiveRe: RegExp;
+    linePreCommentRe: RegExp;
+    labelOpcodeOperandRe: RegExp;
+    buggyLabelRe: RegExp;
+
+    constructor(compilerProps: PropertyGetter) {
+        super(compilerProps);
+
+        this.commentRe = /^[!*;]\s.*/;
+        this.labelDefinitionRe = /^([A-Z_a-z~][\w~]*)/;
+        this.operandRe = /^((?:[A-Z_a-z~][\w~]*)?\s+[A-Za-z]{3}\s+)([^;]+)/;
+        this.labelInOperandRe = /^[#(>|]*([A-Z_a-z~][\w~]*)/;
+        this.directiveRe =
+            /^\s+(?:align|anop|case|codechk|datachk|dynchk|eject|err|expand|ieee|instime|keep|kind|list|longa|longi|mem|merr|msb|numsex|objcase|printer|setcom|symbol|title|65c02|65816)\s+/;
+        this.linePreCommentRe = /^(.{80}[^;]*);/;
+        this.labelOpcodeOperandRe = /^((?:[A-Z_a-z~][\w~]*)?)\s+([\w~]+)\s*(.*)/;
+        this.buggyLabelRe = /^([\w~]{20,})(start|entry)$/;
+    }
+
+    extractLabels(line: string): AsmResultLabel[] | undefined {
+        let match = line.match(this.operandRe);
+        if (match) {
+            const preOperandLength = match[1].length;
+            const operand = match[2];
+
+            if (operand === 'a' || operand === 'A') {
+                return undefined;
+            }
+
+            match = operand.match(this.labelInOperandRe);
+            if (match) {
+                const labelsInLine: AsmResultLabel[] = [];
+
+                const label = match[1];
+
+                const startCol = preOperandLength + operand.indexOf(label) + 1;
+                labelsInLine.push({
+                    name: label,
+                    range: {
+                        startCol: startCol,
+                        endCol: startCol + label.length,
+                    },
+                });
+
+                return labelsInLine;
+            }
+        }
+
+        return undefined;
+    }
+
+    override processBinaryAsm(asm: string, filters: ParseFiltersAndOutputOptions) {
+        const result: ParsedAsmResultLine[] = [];
+        const asmLines = asm.split('\n');
+
+        const labelDefinitions: Record<string, number> = {};
+
+        for (let line of asmLines) {
+            let match = line.match(this.commentRe);
+            if (match) {
+                if (!filters.commentOnly) {
+                    result.push({
+                        text: line,
+                    });
+                }
+                continue;
+            }
+
+            // Insert missing spaces after long labels.
+            // These may be omitted due to a bug in Golden Gate's dumpobj.
+            match = line.match(this.buggyLabelRe);
+            if (match) {
+                line = match[1] + ' ' + match[2];
+            }
+
+            match = line.match(this.labelDefinitionRe);
+            if (match) {
+                labelDefinitions[match[1]] = result.length + 1;
+            }
+
+            if (filters.commentOnly || filters.trim) {
+                match = line.match(this.linePreCommentRe);
+                if (match) {
+                    line = match[1];
+                }
+            }
+
+            if (filters.directives) {
+                match = line.toLowerCase().match(this.directiveRe);
+                if (match) continue;
+            }
+
+            if (filters.trim) {
+                match = line.match(this.labelOpcodeOperandRe);
+                if (match) {
+                    line = match[1] + (match[1].length === 0 ? '  ' : ' ') + match[2] + ' ' + match[3];
+                }
+            }
+
+            if (result.length === 0 || (filters.trim && result[result.length - 1].text.trim() !== 'end')) {
+                if (line.trim() === '') continue;
+            }
+
+            result.push({
+                text: line.trimEnd(),
+                labels: this.extractLabels(line),
+            });
+        }
+
+        return {
+            asm: result,
+            labelDefinitions: labelDefinitions,
+        };
+    }
+}
diff --git a/package-lock.json b/package-lock.json
index 714498641..5bb8ed481 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -100,7 +100,7 @@
         "@types/url-join": "^4.0.3",
         "@types/webpack-env": "^1.18.5",
         "@types/ws": "^8.5.13",
-        "@vitest/coverage-v8": "^2.1.4",
+        "@vitest/coverage-v8": "^2.1.9",
         "aws-sdk-client-mock": "^4.1.0",
         "cheerio": "^1.0.0",
         "css-loader": "^7.1.2",
@@ -113,7 +113,6 @@
         "mock-fs": "^5.4.1",
         "monaco-editor-webpack-plugin": "^7.1.0",
         "nock": "^13.5.5",
-        "prettier": "^3.3.3",
         "sass": "^1.80.6",
         "sass-loader": "^16.0.3",
         "source-map-loader": "^5.0.0",
@@ -121,7 +120,7 @@
         "terser-webpack-plugin": "^5.3.10",
         "ts-loader": "^9.5.1",
         "typescript": "~5.5",
-        "vitest": "^2.1.1",
+        "vitest": "^2.1.9",
         "webpack": "^5.96.1",
         "webpack-cli": "^5.1.4",
         "webpack-dev-middleware": "^7.4.2",
@@ -1720,6 +1719,7 @@
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "aix"
@@ -1736,6 +1736,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1752,6 +1753,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1768,6 +1770,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -1784,6 +1787,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -1800,6 +1804,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -1816,6 +1821,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -1832,6 +1838,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -1848,6 +1855,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1864,6 +1872,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1880,6 +1889,7 @@
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1896,6 +1906,7 @@
         "loong64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1912,6 +1923,7 @@
         "mips64el"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1928,6 +1940,7 @@
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1944,6 +1957,7 @@
         "riscv64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1960,6 +1974,7 @@
         "s390x"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1976,6 +1991,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -1992,6 +2008,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "netbsd"
@@ -2023,6 +2040,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "openbsd"
@@ -2039,6 +2057,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "sunos"
@@ -2055,6 +2074,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2071,6 +2091,7 @@
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2087,6 +2108,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -2972,229 +2994,261 @@
       "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz",
-      "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
+      "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz",
-      "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
+      "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz",
-      "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
+      "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==",
       "cpu": [
         "arm64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz",
-      "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
+      "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz",
-      "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
+      "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz",
-      "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
+      "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz",
-      "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
+      "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz",
-      "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
+      "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz",
-      "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
+      "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz",
-      "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
+      "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
+      "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz",
-      "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
+      "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==",
       "cpu": [
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz",
-      "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
+      "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==",
       "cpu": [
         "riscv64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz",
-      "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
+      "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==",
       "cpu": [
         "s390x"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz",
-      "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
+      "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz",
-      "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
+      "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz",
-      "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
+      "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz",
-      "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
+      "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==",
       "cpu": [
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz",
-      "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
+      "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==",
       "cpu": [
         "x64"
       ],
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -4532,10 +4586,11 @@
       }
     },
     "node_modules/@vitest/coverage-v8": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz",
-      "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz",
+      "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.3.0",
         "@bcoe/v8-coverage": "^0.2.3",
@@ -4546,7 +4601,7 @@
         "istanbul-reports": "^3.1.7",
         "magic-string": "^0.30.12",
         "magicast": "^0.3.5",
-        "std-env": "^3.7.0",
+        "std-env": "^3.8.0",
         "test-exclude": "^7.0.1",
         "tinyrainbow": "^1.2.0"
       },
@@ -4554,8 +4609,8 @@
         "url": "https://opencollective.com/vitest"
       },
       "peerDependencies": {
-        "@vitest/browser": "2.1.4",
-        "vitest": "2.1.4"
+        "@vitest/browser": "2.1.9",
+        "vitest": "2.1.9"
       },
       "peerDependenciesMeta": {
         "@vitest/browser": {
@@ -4564,13 +4619,14 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz",
-      "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz",
+      "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "2.1.4",
-        "@vitest/utils": "2.1.4",
+        "@vitest/spy": "2.1.9",
+        "@vitest/utils": "2.1.9",
         "chai": "^5.1.2",
         "tinyrainbow": "^1.2.0"
       },
@@ -4579,12 +4635,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz",
-      "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz",
+      "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "2.1.4",
+        "@vitest/spy": "2.1.9",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.12"
       },
@@ -4605,10 +4662,11 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz",
-      "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz",
+      "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tinyrainbow": "^1.2.0"
       },
@@ -4617,12 +4675,13 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz",
-      "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz",
+      "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "2.1.4",
+        "@vitest/utils": "2.1.9",
         "pathe": "^1.1.2"
       },
       "funding": {
@@ -4630,12 +4689,13 @@
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz",
-      "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz",
+      "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "2.1.4",
+        "@vitest/pretty-format": "2.1.9",
         "magic-string": "^0.30.12",
         "pathe": "^1.1.2"
       },
@@ -4644,10 +4704,11 @@
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz",
-      "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz",
+      "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tinyspy": "^3.0.2"
       },
@@ -4656,12 +4717,13 @@
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz",
-      "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz",
+      "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "2.1.4",
+        "@vitest/pretty-format": "2.1.9",
         "loupe": "^3.1.2",
         "tinyrainbow": "^1.2.0"
       },
@@ -5092,6 +5154,7 @@
       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
       "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       }
@@ -5466,6 +5529,7 @@
       "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
       "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -5539,6 +5603,7 @@
       "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
       "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "assertion-error": "^2.0.1",
         "check-error": "^2.1.1",
@@ -5602,6 +5667,7 @@
       "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
       "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 16"
       }
@@ -6479,6 +6545,7 @@
       "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
       "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -6803,6 +6870,7 @@
       "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "esbuild": "bin/esbuild"
       },
@@ -6872,6 +6940,7 @@
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
       "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "^1.0.0"
       }
@@ -6951,6 +7020,7 @@
       "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
       "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=12.0.0"
       }
@@ -9055,10 +9125,11 @@
       "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
     },
     "node_modules/loupe": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
-      "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
-      "dev": true
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lru-cache": {
       "version": "11.0.2",
@@ -9077,10 +9148,11 @@
       }
     },
     "node_modules/magic-string": {
-      "version": "0.30.12",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
-      "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+      "version": "0.30.17",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
       }
@@ -9804,13 +9876,15 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/pathval": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
       "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 14.16"
       }
@@ -10454,21 +10528,6 @@
       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
       "dev": true
     },
-    "node_modules/prettier": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
-      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
-      "dev": true,
-      "bin": {
-        "prettier": "bin/prettier.cjs"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/prettier/prettier?sponsor=1"
-      }
-    },
     "node_modules/pretty-bytes": {
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -11029,10 +11088,11 @@
       "dev": true
     },
     "node_modules/rollup": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz",
-      "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
+      "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "1.0.6"
       },
@@ -11044,24 +11104,25 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.24.4",
-        "@rollup/rollup-android-arm64": "4.24.4",
-        "@rollup/rollup-darwin-arm64": "4.24.4",
-        "@rollup/rollup-darwin-x64": "4.24.4",
-        "@rollup/rollup-freebsd-arm64": "4.24.4",
-        "@rollup/rollup-freebsd-x64": "4.24.4",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.24.4",
-        "@rollup/rollup-linux-arm-musleabihf": "4.24.4",
-        "@rollup/rollup-linux-arm64-gnu": "4.24.4",
-        "@rollup/rollup-linux-arm64-musl": "4.24.4",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4",
-        "@rollup/rollup-linux-riscv64-gnu": "4.24.4",
-        "@rollup/rollup-linux-s390x-gnu": "4.24.4",
-        "@rollup/rollup-linux-x64-gnu": "4.24.4",
-        "@rollup/rollup-linux-x64-musl": "4.24.4",
-        "@rollup/rollup-win32-arm64-msvc": "4.24.4",
-        "@rollup/rollup-win32-ia32-msvc": "4.24.4",
-        "@rollup/rollup-win32-x64-msvc": "4.24.4",
+        "@rollup/rollup-android-arm-eabi": "4.34.6",
+        "@rollup/rollup-android-arm64": "4.34.6",
+        "@rollup/rollup-darwin-arm64": "4.34.6",
+        "@rollup/rollup-darwin-x64": "4.34.6",
+        "@rollup/rollup-freebsd-arm64": "4.34.6",
+        "@rollup/rollup-freebsd-x64": "4.34.6",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
+        "@rollup/rollup-linux-arm-musleabihf": "4.34.6",
+        "@rollup/rollup-linux-arm64-gnu": "4.34.6",
+        "@rollup/rollup-linux-arm64-musl": "4.34.6",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
+        "@rollup/rollup-linux-riscv64-gnu": "4.34.6",
+        "@rollup/rollup-linux-s390x-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-musl": "4.34.6",
+        "@rollup/rollup-win32-arm64-msvc": "4.34.6",
+        "@rollup/rollup-win32-ia32-msvc": "4.34.6",
+        "@rollup/rollup-win32-x64-msvc": "4.34.6",
         "fsevents": "~2.3.2"
       }
     },
@@ -11438,7 +11499,8 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
       "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/signal-exit": {
       "version": "3.0.7",
@@ -11631,7 +11693,8 @@
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
       "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/statuses": {
       "version": "2.0.1",
@@ -11642,10 +11705,11 @@
       }
     },
     "node_modules/std-env": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
-      "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
-      "dev": true
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+      "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/streamx": {
       "version": "2.20.1",
@@ -12141,19 +12205,22 @@
       "version": "2.9.0",
       "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
       "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/tinyexec": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
-      "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
-      "dev": true
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+      "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/tinypool": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz",
-      "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+      "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^18.0.0 || >=20.0.0"
       }
@@ -12163,6 +12230,7 @@
       "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
       "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -12172,6 +12240,7 @@
       "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
       "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -13008,13 +13077,15 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz",
-      "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz",
+      "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cac": "^6.7.14",
         "debug": "^4.3.7",
+        "es-module-lexer": "^1.5.4",
         "pathe": "^1.1.2",
         "vite": "^5.0.0"
       },
@@ -13029,30 +13100,31 @@
       }
     },
     "node_modules/vitest": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz",
-      "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==",
+      "version": "2.1.9",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz",
+      "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "2.1.4",
-        "@vitest/mocker": "2.1.4",
-        "@vitest/pretty-format": "^2.1.4",
-        "@vitest/runner": "2.1.4",
-        "@vitest/snapshot": "2.1.4",
-        "@vitest/spy": "2.1.4",
-        "@vitest/utils": "2.1.4",
+        "@vitest/expect": "2.1.9",
+        "@vitest/mocker": "2.1.9",
+        "@vitest/pretty-format": "^2.1.9",
+        "@vitest/runner": "2.1.9",
+        "@vitest/snapshot": "2.1.9",
+        "@vitest/spy": "2.1.9",
+        "@vitest/utils": "2.1.9",
         "chai": "^5.1.2",
         "debug": "^4.3.7",
         "expect-type": "^1.1.0",
         "magic-string": "^0.30.12",
         "pathe": "^1.1.2",
-        "std-env": "^3.7.0",
+        "std-env": "^3.8.0",
         "tinybench": "^2.9.0",
         "tinyexec": "^0.3.1",
         "tinypool": "^1.0.1",
         "tinyrainbow": "^1.2.0",
         "vite": "^5.0.0",
-        "vite-node": "2.1.4",
+        "vite-node": "2.1.9",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -13067,8 +13139,8 @@
       "peerDependencies": {
         "@edge-runtime/vm": "*",
         "@types/node": "^18.0.0 || >=20.0.0",
-        "@vitest/browser": "2.1.4",
-        "@vitest/ui": "2.1.4",
+        "@vitest/browser": "2.1.9",
+        "@vitest/ui": "2.1.9",
         "happy-dom": "*",
         "jsdom": "*"
       },
@@ -13386,6 +13458,7 @@
       "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
       "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "siginfo": "^2.0.0",
         "stackback": "0.0.2"
diff --git a/package.json b/package.json
index 6eeb3ea80..7548b51a9 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
   },
   "version": "0.0.3",
   "engines": {
-    "node": ">=18.19.0"
+    "node": ">=20.0.0"
   },
   "main": "./app.ts",
   "dependencies": {
@@ -109,7 +109,7 @@
     "@types/url-join": "^4.0.3",
     "@types/webpack-env": "^1.18.5",
     "@types/ws": "^8.5.13",
-    "@vitest/coverage-v8": "^2.1.4",
+    "@vitest/coverage-v8": "^2.1.9",
     "aws-sdk-client-mock": "^4.1.0",
     "cheerio": "^1.0.0",
     "css-loader": "^7.1.2",
@@ -122,7 +122,6 @@
     "mock-fs": "^5.4.1",
     "monaco-editor-webpack-plugin": "^7.1.0",
     "nock": "^13.5.5",
-    "prettier": "^3.3.3",
     "sass": "^1.80.6",
     "sass-loader": "^16.0.3",
     "source-map-loader": "^5.0.0",
@@ -130,7 +129,7 @@
     "terser-webpack-plugin": "^5.3.10",
     "ts-loader": "^9.5.1",
     "typescript": "~5.5",
-    "vitest": "^2.1.1",
+    "vitest": "^2.1.9",
     "webpack": "^5.96.1",
     "webpack-cli": "^5.1.4",
     "webpack-dev-middleware": "^7.4.2",
diff --git a/static/styles/colours.scss b/static/styles/colours.scss
index 3101f8952..8dea4e5ee 100644
--- a/static/styles/colours.scss
+++ b/static/styles/colours.scss
@@ -271,21 +271,21 @@
     }
 }*/
 .pink-0 {
-    background: transparentize(#f9d8f9, 0.35);
+    background: adjust-color(#f9d8f9, $alpha: -0.35);
 }
 
 .pink-1 {
-    background: transparentize(#f7d0f7, 0.35);
+    background: adjust-color(#f7d0f7, $alpha: -0.35);
 }
 
 .pink-2 {
-    background: transparentize(#f6c7f6, 0.35);
+    background: adjust-color(#f6c7f6, $alpha: -0.35);
 }
 
 .pink-3 {
-    background: transparentize(#f4bef4, 0.35);
+    background: adjust-color(#f4bef4, $alpha: -0.35);
 }
 
 .pink-4 {
-    background: transparentize(#f3b5f3, 0.35);
+    background: adjust-color(#f3b5f3, $alpha: -0.35);
 }
diff --git a/types/compiler.interfaces.ts b/types/compiler.interfaces.ts
index 99c90189f..a5331c876 100644
--- a/types/compiler.interfaces.ts
+++ b/types/compiler.interfaces.ts
@@ -70,6 +70,7 @@ export type CompilerInfo = {
     supportsBinary?: boolean;
     supportsBinaryObject?: boolean;
     supportsIntel?: boolean;
+    emulated?: boolean;
     interpreted?: boolean;
     // (interpreted || supportsBinary) && supportsExecute
     supportsExecute?: boolean;
@@ -94,6 +95,7 @@ export type CompilerInfo = {
     supportsMarch?: boolean;
     supportsTarget?: boolean;
     supportsTargetIs?: boolean;
+    supportsHyphenTarget?: boolean;
     executionWrapper: string;
     executionWrapperArgs: string[];
     postProcess: string[];
diff --git a/types/instructionsets.ts b/types/instructionsets.ts
index 733e82671..f116a5d9e 100644
--- a/types/instructionsets.ts
+++ b/types/instructionsets.ts
@@ -59,6 +59,7 @@ export const InstructionSetsList = [
     'vax',
     'wasm32',
     'wasm64',
+    'wdc65c816',
     'xtensa',
     'z80',
 ] as const;


Test patch:
diff --git a/.github/workflows/test-and-deploy.yml b/.github/workflows/test-and-deploy.yml
index 1da1b0f6b..2d8a54ae6 100644
--- a/.github/workflows/test-and-deploy.yml
+++ b/.github/workflows/test-and-deploy.yml
@@ -11,10 +11,10 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      - name: Use Node.js 20.x
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.x
+          node-version: 22.x
           check-latest: true
           cache: npm
       - name: Install prerequisites
@@ -37,12 +37,10 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      # We use 18.19.0 because it is the first backport to support --import
-      # https://raw.githubusercontent.com/nodejs/node/main/doc/changelogs/CHANGELOG_V18.md
-      - name: Use Node.js 18.19.0
+      - name: Use Node.js 20
         uses: actions/setup-node@v4
         with:
-          node-version: 18.19.0
+          node-version: 20.18.2
           check-latest: false
           cache: npm
       - name: Install prerequisites
@@ -64,10 +62,10 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      - name: Use Node.js 20.x
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.x
+          node-version: 22.x
           check-latest: true
           cache: npm
       - name: Build distribution
@@ -88,10 +86,10 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      - name: Use Node.js 20.x
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.x
+          node-version: 22.x
           check-latest: true
           cache: npm
       - name: Download the built distribution
diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml
index 5efe113f0..977b35499 100644
--- a/.github/workflows/test-frontend.yml
+++ b/.github/workflows/test-frontend.yml
@@ -11,10 +11,10 @@ jobs:
     steps:
       - name: Checkout repository
         uses: actions/checkout@v4
-      - name: Use Node.js 20.x
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.x
+          node-version: 22.x
           check-latest: true
           cache: npm
       - name: Install prerequisites
diff --git a/.github/workflows/test-win.yml b/.github/workflows/test-win.yml
index c1330e75f..a17cba6e8 100644
--- a/.github/workflows/test-win.yml
+++ b/.github/workflows/test-win.yml
@@ -15,10 +15,11 @@ jobs:
         uses: actions/checkout@v4
         with:
           fetch-depth: 0
-      - name: Use Node.js 20.12.1
+      - name: Use Node.js 22.x
         uses: actions/setup-node@v4
         with:
-          node-version: 20.12.1
+          node-version: 22.x
+          check-latest: true
           cache: npm
       - name: Install prerequisites
         run: make prereqs
diff --git a/test/handlers/asm-docs-tests.ts b/test/handlers/asm-docs-tests.ts
index 274ae73c9..7d9318eb0 100644
--- a/test/handlers/asm-docs-tests.ts
+++ b/test/handlers/asm-docs-tests.ts
@@ -104,6 +104,14 @@ const TEST_MATRIX: Record<PropertyKey, [string, string, string, string][]> = {
         ],
     ],
     sass: [['FADD', 'FP32 Add', 'FP32 Add', 'https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#id14']],
+    wdc65c816: [
+        [
+            'jsl',
+            'Jump to Subroutine Long',
+            '<p>Jump to Subroutine Long</p>',
+            'https://www.pagetable.com/c64ref/6502/?cpu=65c816',
+        ],
+    ],
 };
 
 describe('Assembly Documentation API', () => {