Import Tint changes from Dawn

Changes:
  - 6b4c1cb76b705e58ba2c158b99b84279c81f66b5 [tint][utils] Add light theme, detect dark / light by Ben Clayton <bclayton@google.com>
  - dd050a5bef8fae62c3c59d29e69e137f0f1372a7 [tint][ast] Reimplement ArrayLengthFromUniform transform ... by Ben Clayton <bclayton@google.com>
  - 875236697debda1c87c1f5e462b566fab3c79767 [tint] Make binding space consistent for array length fro... by Ben Clayton <bclayton@google.com>
  - 1fc1f8fbcf7b603afdc122952efad030b6de9adc [tint][core] Highlight intrinsic table matches / mismatch... by Ben Clayton <bclayton@google.com>
GitOrigin-RevId: 6b4c1cb76b705e58ba2c158b99b84279c81f66b5
Change-Id: I1b48dfc2a407691ea5cbf70a99382436851fee3b
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/177140
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/include/tint/tint.h b/include/tint/tint.h
index 23d1d3e..ac6dd66 100644
--- a/include/tint/tint.h
+++ b/include/tint/tint.h
@@ -35,7 +35,6 @@
 //                headers will need to be moved to include/tint/.
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/array_length_from_uniform.h"
 #include "src/tint/api/options/binding_remapper.h"
 #include "src/tint/api/options/external_texture.h"
 #include "src/tint/api/options/pixel_local.h"
diff --git a/src/tint/api/options/BUILD.bazel b/src/tint/api/options/BUILD.bazel
index c7eba70..7bf8d69 100644
--- a/src/tint/api/options/BUILD.bazel
+++ b/src/tint/api/options/BUILD.bazel
@@ -42,7 +42,6 @@
     "options.cc",
   ],
   hdrs = [
-    "array_length_from_uniform.h",
     "binding_remapper.h",
     "depth_range_offsets.h",
     "external_texture.h",
@@ -70,7 +69,6 @@
   name = "test",
   alwayslink = True,
   srcs = [
-    "array_length_from_uniform_test.cc",
     "binding_remapper_test.cc",
     "external_texture_test.cc",
     "pixel_local_test.cc",
diff --git a/src/tint/api/options/BUILD.cmake b/src/tint/api/options/BUILD.cmake
index 1f0fffa..9629a54 100644
--- a/src/tint/api/options/BUILD.cmake
+++ b/src/tint/api/options/BUILD.cmake
@@ -39,7 +39,6 @@
 # Kind:      lib
 ################################################################################
 tint_add_target(tint_api_options lib
-  api/options/array_length_from_uniform.h
   api/options/binding_remapper.h
   api/options/depth_range_offsets.h
   api/options/external_texture.h
@@ -68,7 +67,6 @@
 # Kind:      test
 ################################################################################
 tint_add_target(tint_api_options_test test
-  api/options/array_length_from_uniform_test.cc
   api/options/binding_remapper_test.cc
   api/options/external_texture_test.cc
   api/options/pixel_local_test.cc
diff --git a/src/tint/api/options/BUILD.gn b/src/tint/api/options/BUILD.gn
index cc35c71..09a0971 100644
--- a/src/tint/api/options/BUILD.gn
+++ b/src/tint/api/options/BUILD.gn
@@ -44,7 +44,6 @@
 
 libtint_source_set("options") {
   sources = [
-    "array_length_from_uniform.h",
     "binding_remapper.h",
     "depth_range_offsets.h",
     "external_texture.h",
@@ -70,7 +69,6 @@
 if (tint_build_unittests) {
   tint_unittests_source_set("unittests") {
     sources = [
-      "array_length_from_uniform_test.cc",
       "binding_remapper_test.cc",
       "external_texture_test.cc",
       "pixel_local_test.cc",
diff --git a/src/tint/api/options/array_length_from_uniform.h b/src/tint/api/options/array_length_from_uniform.h
deleted file mode 100644
index 821b7d3..0000000
--- a/src/tint/api/options/array_length_from_uniform.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2021 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. 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.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// 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.
-
-#ifndef SRC_TINT_API_OPTIONS_ARRAY_LENGTH_FROM_UNIFORM_H_
-#define SRC_TINT_API_OPTIONS_ARRAY_LENGTH_FROM_UNIFORM_H_
-
-#include <unordered_map>
-
-#include "src/tint/api/common/binding_point.h"
-
-namespace tint {
-
-/// Options used to specify a mapping of binding points to indices into a UBO
-/// from which to load buffer sizes.
-struct ArrayLengthFromUniformOptions {
-    /// The binding point to use to generate a uniform buffer from which to read
-    /// buffer sizes.
-    BindingPoint ubo_binding;
-    /// The mapping from storage buffer binding points to the index into the
-    /// uniform buffer where the length of the buffer is stored.
-    std::unordered_map<BindingPoint, uint32_t> bindpoint_to_size_index;
-
-    /// Reflect the fields of this class so that it can be used by tint::ForeachField()
-    TINT_REFLECT(ArrayLengthFromUniformOptions, ubo_binding, bindpoint_to_size_index);
-};
-
-}  // namespace tint
-
-#endif  // SRC_TINT_API_OPTIONS_ARRAY_LENGTH_FROM_UNIFORM_H_
diff --git a/src/tint/api/tint.cc b/src/tint/api/tint.cc
index 3337b23..07254b2 100644
--- a/src/tint/api/tint.cc
+++ b/src/tint/api/tint.cc
@@ -32,7 +32,6 @@
 // dependency from 'tint/api' to the libraries used to make up the Tint API.
 ////////////////////////////////////////////////////////////////////////////////
 #include "src/tint/api/common/override_id.h"
-#include "src/tint/api/options/array_length_from_uniform.h"
 
 #if TINT_BUILD_GLSL_WRITER
 #include "src/tint/lang/glsl/writer/writer.h"  // nogncheck
diff --git a/src/tint/cmd/common/helper.cc b/src/tint/cmd/common/helper.cc
index 2e9ce37..a1fbaf0 100644
--- a/src/tint/cmd/common/helper.cc
+++ b/src/tint/cmd/common/helper.cc
@@ -269,9 +269,13 @@
             PrintWGSL(std::cout, info.program);
         }
 
-        auto printer = tint::StyledTextPrinter::Create(stderr);
         tint::diag::Formatter formatter;
-        printer->Print(formatter.Format(info.program.Diagnostics()));
+        if (opts.printer) {
+            opts.printer->Print(formatter.Format(info.program.Diagnostics()));
+        } else {
+            tint::StyledTextPrinter::Create(stderr)->Print(
+                formatter.Format(info.program.Diagnostics()));
+        }
     }
 
     if (!info.program.IsValid()) {
diff --git a/src/tint/cmd/common/helper.h b/src/tint/cmd/common/helper.h
index 04e6961..dbc8e38 100644
--- a/src/tint/cmd/common/helper.h
+++ b/src/tint/cmd/common/helper.h
@@ -82,6 +82,8 @@
     bool use_ir = false;
     tint::spirv::reader::Options spirv_reader_options;
 #endif
+    /// The text printer to use for output
+    StyledTextPrinter* printer = nullptr;
 };
 
 /// Loads the source and program information for the given file.
diff --git a/src/tint/cmd/loopy/main.cc b/src/tint/cmd/loopy/main.cc
index 89bbcb3..7703f7a 100644
--- a/src/tint/cmd/loopy/main.cc
+++ b/src/tint/cmd/loopy/main.cc
@@ -261,7 +261,7 @@
 
     tint::msl::writer::Options gen_options;
     gen_options.bindings = tint::msl::writer::GenerateBindings(program);
-    gen_options.array_length_from_uniform.ubo_binding = tint::BindingPoint{0, 30};
+    gen_options.array_length_from_uniform.ubo_binding = 30;
     gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 0},
                                                                           0);
     gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 1},
diff --git a/src/tint/cmd/tint/BUILD.bazel b/src/tint/cmd/tint/BUILD.bazel
index d77264b..bdba7b0 100644
--- a/src/tint/cmd/tint/BUILD.bazel
+++ b/src/tint/cmd/tint/BUILD.bazel
@@ -76,6 +76,7 @@
     "//src/tint/utils/rtti",
     "//src/tint/utils/strconv",
     "//src/tint/utils/symbol",
+    "//src/tint/utils/system",
     "//src/tint/utils/text",
     "//src/tint/utils/traits",
   ] + select({
diff --git a/src/tint/cmd/tint/BUILD.cmake b/src/tint/cmd/tint/BUILD.cmake
index f354d49..8ed82d1 100644
--- a/src/tint/cmd/tint/BUILD.cmake
+++ b/src/tint/cmd/tint/BUILD.cmake
@@ -77,6 +77,7 @@
   tint_utils_rtti
   tint_utils_strconv
   tint_utils_symbol
+  tint_utils_system
   tint_utils_text
   tint_utils_traits
 )
diff --git a/src/tint/cmd/tint/BUILD.gn b/src/tint/cmd/tint/BUILD.gn
index e51fbf4..7f3584f 100644
--- a/src/tint/cmd/tint/BUILD.gn
+++ b/src/tint/cmd/tint/BUILD.gn
@@ -76,6 +76,7 @@
     "${tint_src_dir}/utils/rtti",
     "${tint_src_dir}/utils/strconv",
     "${tint_src_dir}/utils/symbol",
+    "${tint_src_dir}/utils/system",
     "${tint_src_dir}/utils/text",
     "${tint_src_dir}/utils/traits",
   ]
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 947355e..5a11673 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -57,6 +57,8 @@
 #include "src/tint/utils/containers/transform.h"
 #include "src/tint/utils/diagnostic/formatter.h"
 #include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/system/env.h"
+#include "src/tint/utils/system/terminal.h"
 #include "src/tint/utils/text/string.h"
 #include "src/tint/utils/text/string_stream.h"
 #include "src/tint/utils/text/styled_text.h"
@@ -151,9 +153,14 @@
 constexpr uint32_t kMinShaderModelForPackUnpack4x8InHLSL = 66u;
 #endif  // TINT_BUILD_HLSL_WRITER
 
+/// An enumerator of color-output modes
+enum class ColorMode { kPlain, kDark, kLight };
+
 struct Options {
     bool verbose = false;
 
+    std::unique_ptr<tint::StyledTextPrinter> printer;
+
     std::string input_filename;
     std::string output_file = "-";  // Default to stdout
 
@@ -209,9 +216,38 @@
 #endif  // TINT_BUILD_SYNTAX_TREE_WRITER
 };
 
+/// @returns the default ColorMode when no `--color` flag is specified.
+ColorMode ColorModeDefault() {
+    if (!tint::TerminalSupportsColors(stdout)) {
+        return ColorMode::kPlain;
+    }
+    if (auto res = tint::TerminalIsDark(stdout)) {
+        return *res ? ColorMode::kDark : ColorMode::kLight;
+    }
+    if (auto env = tint::GetEnvVar("DARK_BACKGROUND_COLOR"); !env.empty()) {
+        return env != "0" ? ColorMode::kDark : ColorMode::kLight;
+    }
+    if (auto env = tint::GetEnvVar("LIGHT_BACKGROUND_COLOR"); !env.empty()) {
+        return env != "0" ? ColorMode::kLight : ColorMode::kDark;
+    }
+    return ColorMode::kDark;
+}
+
+std::unique_ptr<tint::StyledTextPrinter> CreatePrinter(ColorMode mode) {
+    switch (mode) {
+        case ColorMode::kLight:
+            return tint::StyledTextPrinter::Create(stderr, tint::StyledTextTheme::kDefaultLight);
+        case ColorMode::kDark:
+            return tint::StyledTextPrinter::Create(stderr, tint::StyledTextTheme::kDefaultDark);
+        case ColorMode::kPlain:
+            break;
+    }
+    return tint::StyledTextPrinter::CreatePlain(stderr);
+}
+
 /// @param filename the filename to inspect
 /// @returns the inferred format for the filename suffix
-Format infer_format(const std::string& filename) {
+Format InferFormat(const std::string& filename) {
     (void)filename;
 
 #if TINT_BUILD_SPV_WRITER
@@ -272,6 +308,15 @@
                                                 format_enum_names, ShortName{"f"});
     TINT_DEFER(opts->format = fmt.value.value_or(Format::kUnknown));
 
+    auto& col = options.Add<EnumOption<ColorMode>>("color", "Use colored output",
+                                                   tint::Vector{
+                                                       EnumName{ColorMode::kPlain, "off"},
+                                                       EnumName{ColorMode::kDark, "dark"},
+                                                       EnumName{ColorMode::kLight, "light"},
+                                                   },
+                                                   ShortName{"col"}, Default{ColorModeDefault()});
+    TINT_DEFER(opts->printer = CreatePrinter(*col.value));
+
     auto& ep = options.Add<StringOption>("entry-point", "Output single entry point",
                                          ShortName{"ep"}, Parameter{"name"});
     TINT_DEFER({
@@ -790,9 +835,8 @@
         auto source = std::make_unique<tint::Source::File>(options.input_filename, result->wgsl);
         auto reparsed_program = tint::wgsl::reader::Parse(source.get(), parser_options);
         if (!reparsed_program.IsValid()) {
-            auto printer = tint::StyledTextPrinter::Create(stderr);
             tint::diag::Formatter diag_formatter;
-            printer->Print(diag_formatter.Format(reparsed_program.Diagnostics()));
+            options.printer->Print(diag_formatter.Format(reparsed_program.Diagnostics()));
             return false;
         }
     }
@@ -829,7 +873,7 @@
     gen_options.disable_workgroup_init = options.disable_workgroup_init;
     gen_options.pixel_local_options = options.pixel_local_options;
     gen_options.bindings = tint::msl::writer::GenerateBindings(*input_program);
-    gen_options.array_length_from_uniform.ubo_binding = tint::BindingPoint{0, 30};
+    gen_options.array_length_from_uniform.ubo_binding = 30;
 
     // Add array_length_from_uniform entries for all storage buffers with runtime sized arrays.
     std::unordered_set<tint::BindingPoint> storage_bindings;
@@ -1255,7 +1299,7 @@
     // Implement output format defaults.
     if (options.format == Format::kUnknown) {
         // Try inferring from filename.
-        options.format = infer_format(options.output_file);
+        options.format = InferFormat(options.output_file);
     }
     if (options.format == Format::kUnknown) {
         // Ultimately, default to SPIR-V assembly. That's nice for interactive use.
@@ -1264,6 +1308,7 @@
 
     tint::cmd::LoadProgramOptions opts;
     opts.filename = options.input_filename;
+    opts.printer = options.printer.get();
 #if TINT_BUILD_SPV_READER
     opts.use_ir = options.use_ir_reader;
     opts.spirv_reader_options = options.spirv_reader_options;
diff --git a/src/tint/lang/core/constant/eval_binary_op_test.cc b/src/tint/lang/core/constant/eval_binary_op_test.cc
index 7859908..fd4d890 100644
--- a/src/tint/lang/core/constant/eval_binary_op_test.cc
+++ b/src/tint/lang/core/constant/eval_binary_op_test.cc
@@ -1511,8 +1511,8 @@
     EXPECT_EQ(r()->error(), R"(12:34 error: no matching overload for 'operator ! (abstract-int)'
 
 2 candidate operators:
-  'operator ! (bool) -> bool'
-  'operator ! (vecN<bool>) -> vecN<bool>'
+ • 'operator ! (bool  ✗ ) -> bool'
+ • 'operator ! (vecN<bool>  ✗ ) -> vecN<bool>'
 )");
 }
 
@@ -1528,8 +1528,8 @@
     EXPECT_EQ(r()->error(), R"(12:34 error: no matching overload for 'operator ! (abstract-int)'
 
 2 candidate operators:
-  'operator ! (bool) -> bool'
-  'operator ! (vecN<bool>) -> vecN<bool>'
+ • 'operator ! (bool  ✗ ) -> bool'
+ • 'operator ! (vecN<bool>  ✗ ) -> vecN<bool>'
 )");
 }
 
@@ -1577,7 +1577,7 @@
               R"(12:34 error: no matching overload for 'operator && (bool, abstract-int)'
 
 1 candidate operator:
-  'operator && (bool, bool) -> bool'
+ • 'operator && (bool  ✓ , bool  ✗ ) -> bool'
 )");
 }
 
@@ -1621,7 +1621,7 @@
               R"(12:34 error: no matching overload for 'operator || (bool, abstract-int)'
 
 1 candidate operator:
-  'operator || (bool, bool) -> bool'
+ • 'operator || (bool  ✓ , bool  ✗ ) -> bool'
 )");
 }
 
@@ -1675,8 +1675,10 @@
               R"(12:34 error: no matching overload for 'operator == (abstract-float, i32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1726,8 +1728,10 @@
               R"(12:34 error: no matching overload for 'operator == (abstract-float, i32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1787,8 +1791,10 @@
               R"(12:34 error: no matching overload for 'operator == (i32, f32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1844,8 +1850,10 @@
               R"(12:34 error: no matching overload for 'operator == (i32, f32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1898,8 +1906,10 @@
     EXPECT_EQ(r()->error(), R"(12:34 error: no matching overload for 'operator == (f32, i32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1948,8 +1958,10 @@
     EXPECT_EQ(r()->error(), R"(12:34 error: no matching overload for 'operator == (f32, i32)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -1974,21 +1986,40 @@
               R"(12:34 error: no matching constructor for 'vec2<f32>(abstract-float, bool)'
 
 8 candidate constructors:
-  'vec2<T>(x: T, y: T) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2<T>(T) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(T) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2<T>(vec2<T>) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(vec2<T>) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2() -> vec2<abstract-int>'
-  'vec2<T>() -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(x: T, y: T) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(x: T  ✓ , y: T  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(T  ✓ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(vec2<T>  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >() -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2(x: T  ✓ , y: T  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2(T  ✓ ) -> vec2<T>' where:
+      ✗  overload expects 0 template arguments
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2() -> vec2<abstract-int>' where:
+      ✗  overload expects 0 template arguments
+ • 'vec2(vec2<T>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'f32', 'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'f16', 'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'i32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'u32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'bool', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
+ • 'vec2<T  ✓ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'i32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
@@ -2006,21 +2037,40 @@
               R"(12:34 error: no matching constructor for 'vec2<f32>(abstract-float, bool)'
 
 8 candidate constructors:
-  'vec2<T>(x: T, y: T) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2<T>(T) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(T) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2<T>(vec2<T>) -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(vec2<T>) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2() -> vec2<abstract-int>'
-  'vec2<T>() -> vec2<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec2(x: T, y: T) -> vec2<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(x: T  ✓ , y: T  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(T  ✓ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >(vec2<T>  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✓ >() -> vec2<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2(x: T  ✓ , y: T  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2(T  ✓ ) -> vec2<T>' where:
+      ✗  overload expects 0 template arguments
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec2() -> vec2<abstract-int>' where:
+      ✗  overload expects 0 template arguments
+ • 'vec2(vec2<T>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'f32', 'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'f16', 'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'i32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'u32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
-  'vec2<T>(vec2<U>) -> vec2<T>'  where: 'T' is 'bool', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
+ • 'vec2<T  ✓ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✓  'T' is 'f32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'i32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
+ • 'vec2<T  ✗ >(vec2<U>  ✗ ) -> vec2<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
@@ -2083,8 +2133,10 @@
         R"(error: no matching overload for 'operator == (array<abstract-int, 1>, abstract-int)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✗ , T  ✗ ) -> bool' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -2102,8 +2154,10 @@
         R"(error: no matching overload for 'operator == (array<abstract-int, 1>, abstract-int)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✗ , T  ✗ ) -> bool' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -2152,8 +2206,10 @@
               R"(12:34 error: no matching overload for 'operator == (i32, abstract-float)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -2198,8 +2254,10 @@
               R"(12:34 error: no matching overload for 'operator == (i32, abstract-float)'
 
 2 candidate operators:
-  'operator == (T, T) -> bool'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'operator == (vecN<T>, vecN<T>) -> vecN<bool>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (T  ✓ , T  ✗ ) -> bool' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'operator == (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<bool>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
diff --git a/src/tint/lang/core/intrinsic/table.cc b/src/tint/lang/core/intrinsic/table.cc
index 1a9dae9..8c986d2 100644
--- a/src/tint/lang/core/intrinsic/table.cc
+++ b/src/tint/lang/core/intrinsic/table.cc
@@ -34,8 +34,10 @@
 
 #include "src/tint/lang/core/evaluation_stage.h"
 #include "src/tint/lang/core/intrinsic/table_data.h"
+#include "src/tint/lang/core/type/invalid.h"
 #include "src/tint/lang/core/type/manager.h"
 #include "src/tint/lang/core/type/void.h"
+#include "src/tint/utils/containers/slice.h"
 #include "src/tint/utils/ice/ice.h"
 #include "src/tint/utils/macros/defer.h"
 #include "src/tint/utils/text/string_stream.h"
@@ -65,26 +67,11 @@
 namespace {
 
 /// The Vector `N` template argument value for arrays of parameters.
-constexpr const size_t kNumFixedParams = decltype(Overload{}.parameters)::static_length;
+constexpr const size_t kNumFixedParameters = Overload::kNumFixedParameters;
 
 /// The Vector `N` template argument value for arrays of overload candidates.
 constexpr const size_t kNumFixedCandidates = 8;
 
-/// Candidate holds information about an overload evaluated for resolution.
-struct Candidate {
-    /// The match-score of the candidate overload.
-    /// A score of zero indicates an exact match.
-    /// Non-zero scores are used for diagnostics when no overload matches.
-    /// Lower scores are displayed first (top-most).
-    size_t score = 0;
-    /// The candidate overload
-    const OverloadInfo* overload = nullptr;
-    /// The template types and numbers
-    TemplateState templates{};
-    /// The parameter types for the candidate overload
-    Vector<Overload::Parameter, kNumFixedParams> parameters{};
-};
-
 /// A list of candidates
 using Candidates = Vector<Candidate, kNumFixedCandidates>;
 
@@ -181,7 +168,9 @@
 void PrintCandidates(StyledText& err,
                      Context& context,
                      VectorRef<Candidate> candidates,
-                     std::string_view intrinsic_name);
+                     std::string_view intrinsic_name,
+                     VectorRef<const core::type::Type*> template_args,
+                     VectorRef<const core::type::Type*> args);
 
 /// Raises an ICE when no overload is a clear winner of overload resolution
 StyledText ErrAmbiguousOverload(Context& context,
@@ -314,36 +303,33 @@
                                                       std::min(num_parameters, num_arguments)));
     }
 
-    if (score == 0) {
-        // Check that all of the template arguments provided are actually expected by the overload.
-        const size_t expected_templates = overload.num_explicit_templates;
-        const size_t provided_templates = template_args.Length();
-        if (provided_templates != expected_templates) {
-            MATCH_FAILURE(kMismatchedExplicitTemplateCountPenalty *
-                          (std::max(expected_templates, provided_templates) -
-                           std::min(expected_templates, provided_templates)));
-        }
+    // Check that all of the template arguments provided are actually expected by the overload.
+    const size_t expected_templates = overload.num_explicit_templates;
+    const size_t provided_templates = template_args.Length();
+    if (provided_templates != expected_templates) {
+        MATCH_FAILURE(kMismatchedExplicitTemplateCountPenalty *
+                      (std::max(expected_templates, provided_templates) -
+                       std::min(expected_templates, provided_templates)));
     }
 
     TemplateState templates;
 
-    if (score == 0) {
-        // Check that the explicit template arguments match the constraint if specified, otherwise
-        // just set the template type.
-        for (size_t i = 0; i < overload.num_explicit_templates; ++i) {
-            auto& tmpl = context.data[overload.templates + i];
-            auto* type = template_args[i];
-            if (auto* matcher_indices = context.data[tmpl.matcher_indices]) {
-                // Ensure type matches the template's matcher.
-                type = Match(context, templates, overload, matcher_indices, earliest_eval_stage)
-                           .Type(type);
-                if (!type) {
-                    MATCH_FAILURE(kMismatchedExplicitTemplateTypePenalty);
-                    continue;
-                }
+    // Check that the explicit template arguments match the constraint if specified, otherwise
+    // just set the template type.
+    auto num_tmpl_args = std::min<size_t>(overload.num_explicit_templates, template_args.Length());
+    for (size_t i = 0; i < num_tmpl_args; ++i) {
+        auto& tmpl = context.data[overload.templates + i];
+        auto* type = template_args[i];
+        if (auto* matcher_indices = context.data[tmpl.matcher_indices]) {
+            // Ensure type matches the template's matcher.
+            type = Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                       .Type(type);
+            if (!type) {
+                MATCH_FAILURE(kMismatchedExplicitTemplateTypePenalty);
+                continue;
             }
-            templates.SetType(i, type);
         }
+        templates.SetType(i, type);
     }
 
     // Invoke the matchers for each parameter <-> argument pair.
@@ -364,64 +350,61 @@
         }
     }
 
-    if (score == 0) {
-        // Check each of the inferred types and numbers for the implicit templates match their
-        // respective matcher.
-        for (size_t i = overload.num_explicit_templates; i < overload.num_templates; i++) {
-            auto& tmpl = context.data[overload.templates + i];
-            auto* matcher_indices = context.data[tmpl.matcher_indices];
-            if (!matcher_indices) {
-                continue;
+    // Check each of the inferred types and numbers for the implicit templates match their
+    // respective matcher.
+    for (size_t i = overload.num_explicit_templates; i < overload.num_templates; i++) {
+        auto& tmpl = context.data[overload.templates + i];
+        auto* matcher_indices = context.data[tmpl.matcher_indices];
+        if (!matcher_indices) {
+            continue;
+        }
+
+        auto matcher = Match(context, templates, overload, matcher_indices, earliest_eval_stage);
+
+        switch (tmpl.kind) {
+            case TemplateInfo::Kind::kType: {
+                // Check all constrained template types matched their constraint matchers.
+                // If the template type *does not* match any of the types in the constraint
+                // matcher, then `score` is incremented and the template is assigned an invalid
+                // type. If the template type *does* match a type, then the template type is
+                // replaced with the first matching type. The order of types in the template matcher
+                // is important here, which can be controlled with the [[precedence(N)]] decorations
+                // on the types in the def file.
+                if (auto* type = templates.Type(i)) {
+                    if (auto* ty = matcher.Type(type)) {
+                        // Template type matched one of the types in the template type's
+                        // matcher. Replace the template type with this type.
+                        templates.SetType(i, ty);
+                        continue;
+                    }
+                }
+                templates.SetType(i, context.types.invalid());
+                MATCH_FAILURE(kMismatchedImplicitTemplateTypePenalty);
+                break;
             }
 
-            auto matcher =
-                Match(context, templates, overload, matcher_indices, earliest_eval_stage);
-
-            switch (tmpl.kind) {
-                case TemplateInfo::Kind::kType: {
-                    // Check all constrained template types matched their constraint matchers.
-                    // If the template type *does not* match any of the types in the constraint
-                    // matcher, then `score` is incremented. If the template type *does* match a
-                    // type, then the template type is replaced with the first matching type.
-                    // The order of types in the template matcher is important here, which can
-                    // be controlled with the [[precedence(N)]] decorations on the types in the
-                    // def file.
-                    if (auto* type = templates.Type(i)) {
-                        if (auto* ty = matcher.Type(type)) {
-                            // Template type matched one of the types in the template type's
-                            // matcher. Replace the template type with this type.
-                            templates.SetType(i, ty);
-                            continue;
-                        }
-                    }
-                    MATCH_FAILURE(kMismatchedImplicitTemplateTypePenalty);
-                    break;
-                }
-
-                case TemplateInfo::Kind::kNumber: {
-                    // Checking that the inferred number matches the constraints on the
-                    // template. Increments `score` if the template numbers do not match their
-                    // constraint matchers.
-                    auto number = templates.Num(i);
-                    if (!number.IsValid() || !matcher.Num(number).IsValid()) {
-                        MATCH_FAILURE(kMismatchedImplicitTemplateNumberPenalty);
-                    }
+            case TemplateInfo::Kind::kNumber: {
+                // Checking that the inferred number matches the constraints on the
+                // template. Increments `score` and assigns the template an invalid number if the
+                // template numbers do not match their constraint matchers.
+                auto number = templates.Num(i);
+                if (!number.IsValid() || !matcher.Num(number).IsValid()) {
+                    templates.SetNum(i, Number::invalid);
+                    MATCH_FAILURE(kMismatchedImplicitTemplateNumberPenalty);
                 }
             }
         }
     }
 
     // Now that all the template types have been finalized, we can construct the parameters.
-    Vector<Overload::Parameter, kNumFixedParams> parameters;
-    if (score == 0) {
-        parameters.Reserve(num_params);
-        for (size_t p = 0; p < num_params; p++) {
-            auto& parameter = context.data[overload.parameters + p];
-            auto* matcher_indices = context.data[parameter.matcher_indices];
-            auto* ty = Match(context, templates, overload, matcher_indices, earliest_eval_stage)
-                           .Type(args[p]);
-            parameters.Emplace(ty, parameter.usage);
-        }
+    Vector<Overload::Parameter, kNumFixedParameters> parameters;
+    parameters.Reserve(num_params);
+    for (size_t p = 0; p < num_params; p++) {
+        auto& parameter = context.data[overload.parameters + p];
+        auto* matcher_indices = context.data[parameter.matcher_indices];
+        auto* ty =
+            Match(context, templates, overload, matcher_indices, earliest_eval_stage).Type(args[p]);
+        parameters.Emplace(ty, parameter.usage);
     }
 
     return Candidate{score, &overload, templates, parameters};
@@ -433,7 +416,7 @@
                                                std::string_view intrinsic_name,
                                                VectorRef<const core::type::Type*> template_args,
                                                VectorRef<const core::type::Type*> args) {
-    Vector<uint32_t, kNumFixedParams> best_ranks;
+    Vector<uint32_t, kNumFixedParameters> best_ranks;
     best_ranks.Resize(args.Length(), 0xffffffff);
     size_t num_matched = 0;
     Candidate* best = nullptr;
@@ -505,10 +488,12 @@
 void PrintCandidates(StyledText& ss,
                      Context& context,
                      VectorRef<Candidate> candidates,
-                     std::string_view intrinsic_name) {
+                     std::string_view intrinsic_name,
+                     VectorRef<const core::type::Type*> template_args,
+                     VectorRef<const core::type::Type*> args) {
     for (auto& candidate : candidates) {
-        ss << "  ";
-        PrintOverload(ss, context, *candidate.overload, intrinsic_name);
+        ss << " • ";
+        PrintCandidate(ss, context, candidate, intrinsic_name, template_args, args);
         ss << "\n";
     }
 }
@@ -525,7 +510,7 @@
     for (auto& candidate : candidates) {
         if (candidate.score == 0) {
             err << "  ";
-            PrintOverload(err, context, *candidate.overload, intrinsic_name);
+            PrintCandidate(err, context, candidate, intrinsic_name, template_args, args);
             err << "\n";
         }
     }
@@ -535,15 +520,19 @@
 
 }  // namespace
 
-void PrintOverload(StyledText& ss,
-                   Context& context,
-                   const OverloadInfo& overload,
-                   std::string_view intrinsic_name) {
+void PrintCandidate(StyledText& ss,
+                    Context& context,
+                    const Candidate& candidate,
+                    std::string_view intrinsic_name,
+                    VectorRef<const core::type::Type*> template_args,
+                    VectorRef<const core::type::Type*> args) {
     // Restore old style before returning.
     auto prev_style = ss.Style();
     TINT_DEFER(ss << prev_style);
 
-    TemplateState templates;
+    auto& overload = *candidate.overload;
+
+    TemplateState templates = candidate.templates;
 
     // TODO(crbug.com/tint/1730): Use input evaluation stage to output only relevant overloads.
     auto earliest_eval_stage = EvaluationStage::kConstant;
@@ -553,24 +542,57 @@
     if (overload.num_explicit_templates > 0) {
         ss << "<";
         for (size_t i = 0; i < overload.num_explicit_templates; i++) {
+            const auto& tmpl = context.data[overload.templates + i];
+
+            bool matched = false;
+            if (i < template_args.Length()) {
+                auto* matcher_indices = context.data[tmpl.matcher_indices];
+                matched = !matcher_indices ||
+                          Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                              .Type(template_args[i]);
+            }
+
             if (i > 0) {
                 ss << ", ";
             }
-            ss << style::Type(context.data[overload.templates + i].name);
+            ss << style::Type(tmpl.name) << " ";
+            if (matched) {
+                ss << (style::Code + style::Match)(" ✓ ");
+            } else {
+                ss << (style::Code + style::Mismatch)(" ✗ ");
+            }
         }
         ss << ">";
     }
+
+    bool all_params_match = true;
     ss << "(";
-    for (size_t p = 0; p < overload.num_parameters; p++) {
-        auto& parameter = context.data[overload.parameters + p];
-        if (p > 0) {
+    for (size_t i = 0; i < overload.num_parameters; i++) {
+        const auto& parameter = context.data[overload.parameters + i];
+        auto* matcher_indices = context.data[parameter.matcher_indices];
+
+        bool matched = false;
+        if (i < args.Length()) {
+            matched = Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                          .Type(args[i]);
+        }
+        all_params_match = all_params_match && matched;
+
+        if (i > 0) {
             ss << ", ";
         }
+
         if (parameter.usage != ParameterUsage::kNone) {
             ss << style::Variable(parameter.usage, ": ");
         }
-        auto* matcher_indices = context.data[parameter.matcher_indices];
         Match(context, templates, overload, matcher_indices, earliest_eval_stage).PrintType(ss);
+
+        ss << style::Code << " ";
+        if (matched) {
+            ss << (style::Code + style::Match)(" ✓ ");
+        } else {
+            ss << (style::Code + style::Mismatch)(" ✗ ");
+        }
     }
     ss << ")";
     if (overload.return_matcher_indices.IsValid()) {
@@ -581,22 +603,46 @@
 
     bool first = true;
     auto separator = [&] {
-        ss << style::Plain(first ? "  where: " : ", ");
+        ss << style::Plain(first ? " where:\n     " : "\n     ");
         first = false;
     };
 
+    if (all_params_match && template_args.Length() > overload.num_explicit_templates) {
+        separator();
+        ss << style::Mismatch(" ✗ ")
+           << style::Plain(" overload expects ", static_cast<int>(overload.num_explicit_templates),
+                           " template argument", overload.num_explicit_templates != 1 ? "s" : "");
+    }
+
     for (size_t i = 0; i < overload.num_templates; i++) {
         auto& tmpl = context.data[overload.templates + i];
         if (auto* matcher_indices = context.data[tmpl.matcher_indices]) {
-            auto matcher =
-                Match(context, templates, overload, matcher_indices, earliest_eval_stage);
-
             separator();
+            bool matched = false;
+            if (tmpl.kind == TemplateInfo::Kind::kType) {
+                if (auto* ty = templates.Type(i)) {
+                    matched =
+                        Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                            .Type(ty);
+                }
+            } else {
+                matched = Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                              .Num(templates.Num(i))
+                              .IsValid();
+            }
+            if (matched) {
+                ss << style::Match(" ✓ ") << style::Plain(" ");
+            } else {
+                ss << style::Mismatch(" ✗ ") << style::Plain(" ");
+            }
+
             ss << style::Type(tmpl.name) << style::Plain(" is ");
             if (tmpl.kind == TemplateInfo::Kind::kType) {
-                matcher.PrintType(ss);
+                Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                    .PrintType(ss);
             } else {
-                matcher.PrintNum(ss);
+                Match(context, templates, overload, matcher_indices, earliest_eval_stage)
+                    .PrintNum(ss);
             }
         }
     }
@@ -616,7 +662,7 @@
             err << "\n"
                 << candidates.Length() << " candidate function"
                 << (candidates.Length() > 1 ? "s:" : ":") << "\n";
-            PrintCandidates(err, context, candidates, intrinsic_name);
+            PrintCandidates(err, context, candidates, intrinsic_name, template_args, args);
         }
         return err;
     };
@@ -665,7 +711,7 @@
             err << "\n"
                 << candidates.Length() << " candidate operator"
                 << (candidates.Length() > 1 ? "s:" : ":") << "\n";
-            PrintCandidates(err, context, candidates, name);
+            PrintCandidates(err, context, candidates, name, Empty, Vector{arg});
         }
         return err;
     };
@@ -768,7 +814,7 @@
             err << "\n"
                 << candidates.Length() << " candidate operator"
                 << (candidates.Length() > 1 ? "s:" : ":") << "\n";
-            PrintCandidates(err, context, candidates, name);
+            PrintCandidates(err, context, candidates, name, Empty, args);
         }
         return err;
     };
@@ -801,13 +847,13 @@
             err << "\n"
                 << ctor.Length() << " candidate constructor" << (ctor.Length() > 1 ? "s:" : ":")
                 << "\n";
-            PrintCandidates(err, context, ctor, type_name);
+            PrintCandidates(err, context, ctor, type_name, template_args, args);
         }
         if (!conv.IsEmpty()) {
             err << "\n"
                 << conv.Length() << " candidate conversion" << (conv.Length() > 1 ? "s:" : ":")
                 << "\n";
-            PrintCandidates(err, context, conv, type_name);
+            PrintCandidates(err, context, conv, type_name, template_args, args);
         }
         return err;
     };
diff --git a/src/tint/lang/core/intrinsic/table.h b/src/tint/lang/core/intrinsic/table.h
index 56f590a..9594c34 100644
--- a/src/tint/lang/core/intrinsic/table.h
+++ b/src/tint/lang/core/intrinsic/table.h
@@ -52,6 +52,8 @@
 
 /// Overload describes a fully matched builtin function overload
 struct Overload {
+    static constexpr size_t kNumFixedParameters = 8;
+
     /// Parameter describes a single parameter
     struct Parameter {
         /// Parameter type
@@ -79,7 +81,7 @@
     core::type::Type const* return_type = nullptr;
 
     /// The resolved overload parameters
-    Vector<Parameter, 8> parameters;
+    Vector<Parameter, kNumFixedParameters> parameters;
 
     /// The constant evaluation function
     constant::Eval::Function const_eval_fn = nullptr;
@@ -108,11 +110,28 @@
     SymbolTable& symbols;
 };
 
-// Prints the overload for emitting diagnostics
-void PrintOverload(StyledText& ss,
-                   Context& context,
-                   const OverloadInfo& overload,
-                   std::string_view intrinsic_name);
+/// Candidate holds information about an overload evaluated for resolution.
+struct Candidate {
+    /// The match-score of the candidate overload.
+    /// A score of zero indicates an exact match.
+    /// Non-zero scores are used for diagnostics when no overload matches.
+    /// Lower scores are displayed first (top-most).
+    size_t score = 0;
+    /// The candidate overload
+    const OverloadInfo* overload = nullptr;
+    /// The template types and numbers
+    TemplateState templates{};
+    /// The parameter types for the candidate overload
+    Vector<Overload::Parameter, Overload::kNumFixedParameters> parameters{};
+};
+
+// Prints the candidate overload for emitting diagnostics
+void PrintCandidate(StyledText& ss,
+                    Context& context,
+                    const Candidate& candidate,
+                    std::string_view intrinsic_name,
+                    VectorRef<const core::type::Type*> template_args,
+                    VectorRef<const core::type::Type*> args);
 
 /// Lookup looks for the builtin overload with the given signature, raising an error diagnostic
 /// if the builtin was not found.
diff --git a/src/tint/lang/core/intrinsic/table_data.h b/src/tint/lang/core/intrinsic/table_data.h
index b5496a2..30fae36 100644
--- a/src/tint/lang/core/intrinsic/table_data.h
+++ b/src/tint/lang/core/intrinsic/table_data.h
@@ -311,10 +311,10 @@
     /// @returns true on match or newly defined
     bool Num(size_t idx, Number number) {
         if (idx >= numbers_.Length()) {
-            numbers_.Resize(idx + 1, Number::invalid);
+            numbers_.Resize(idx + 1, Number::any);
         }
         auto& n = numbers_[idx];
-        if (!n.IsValid()) {
+        if (n.IsAny()) {
             n = number.Value();
             return true;
         }
@@ -350,6 +350,16 @@
         return numbers_[idx];
     }
 
+    /// SetNum replaces the template number with index @p idx with number @p num.
+    /// @param idx the index of the template number
+    /// @param num the new number for the template
+    void SetNum(size_t idx, Number num) {
+        if (idx >= numbers_.Length()) {
+            numbers_.Resize(idx + 1, Number::any);
+        }
+        numbers_[idx] = num;
+    }
+
     /// @return the total number of type and number templates
     size_t Count() const { return types_.Length() + numbers_.Length(); }
 
diff --git a/src/tint/lang/core/intrinsic/table_test.cc b/src/tint/lang/core/intrinsic/table_test.cc
index 52b25f4..31fbc13 100644
--- a/src/tint/lang/core/intrinsic/table_test.cc
+++ b/src/tint/lang/core/intrinsic/table_test.cc
@@ -528,33 +528,56 @@
               R"(no matching call to 'textureDimensions(bool, bool)'
 
 27 candidate functions:
-  'textureDimensions(texture: texture_1d<T>, level: L) -> u32'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>, level: L) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_1d<T>) -> u32'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_1d<F, A>) -> u32'
-  'textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<u32>'
-  'textureDimensions(texture: texture_external) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ , level: L  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ , level: L  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_multisampled_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_1d<F, A>  ✗ ) -> u32'
+ • 'textureDimensions(texture: texture_storage_2d<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_2d_array<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_3d<F, A>  ✗ ) -> vec3<u32>'
+ • 'textureDimensions(texture: texture_external  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_multisampled_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
 )");
 }
 
@@ -568,33 +591,56 @@
               R"(no matching call to 'textureDimensions(texture_depth_2d, bool)'
 
 27 candidate functions:
-  'textureDimensions(texture: texture_depth_2d, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_1d<T>, level: L) -> u32'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>, level: L) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_1d<T>) -> u32'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_1d<F, A>) -> u32'
-  'textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<u32>'
-  'textureDimensions(texture: texture_external) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d  ✓ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d  ✓ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ , level: L  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ , level: L  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_multisampled_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_1d<F, A>  ✗ ) -> u32'
+ • 'textureDimensions(texture: texture_storage_2d<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_2d_array<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_3d<F, A>  ✗ ) -> vec3<u32>'
+ • 'textureDimensions(texture: texture_external  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_multisampled_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
 )");
 }
 
@@ -613,8 +659,10 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator - (bool)'
 
 2 candidate operators:
-  'operator - (T) -> T'  where: 'T' is 'f32', 'i32' or 'f16'
-  'operator - (vecN<T>) -> vecN<T>'  where: 'T' is 'f32', 'i32' or 'f16'
+ • 'operator - (T  ✗ ) -> T' where:
+      ✗  'T' is 'f32', 'i32' or 'f16'
+ • 'operator - (vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'f32', 'i32' or 'f16'
 )");
 }
 
@@ -652,15 +700,24 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator * (f32, bool)'
 
 9 candidate operators:
-  'operator * (T, T) -> T'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator * (vecN<T>, T) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator * (T, vecN<T>) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator * (T, matNxM<T>) -> matNxM<T>'  where: 'T' is 'f32' or 'f16'
-  'operator * (matNxM<T>, T) -> matNxM<T>'  where: 'T' is 'f32' or 'f16'
-  'operator * (vecN<T>, vecN<T>) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator * (matCxR<T>, vecC<T>) -> vecR<T>'  where: 'T' is 'f32' or 'f16'
-  'operator * (vecR<T>, matCxR<T>) -> vecC<T>'  where: 'T' is 'f32' or 'f16'
-  'operator * (matKxR<T>, matCxK<T>) -> matCxR<T>'  where: 'T' is 'f32' or 'f16'
+ • 'operator * (T  ✓ , T  ✗ ) -> T' where:
+      ✓  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (T  ✓ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (T  ✓ , matNxM<T>  ✗ ) -> matNxM<T>' where:
+      ✓  'T' is 'f32' or 'f16'
+ • 'operator * (vecN<T>  ✗ , T  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (matNxM<T>  ✗ , T  ✗ ) -> matNxM<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator * (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (matCxR<T>  ✗ , vecC<T>  ✗ ) -> vecR<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator * (vecR<T>  ✗ , matCxR<T>  ✗ ) -> vecC<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator * (matKxR<T>  ✗ , matCxK<T>  ✗ ) -> matCxR<T>' where:
+      ✗  'T' is 'f32' or 'f16'
 )");
 }
 
@@ -684,15 +741,24 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator *= (f32, bool)'
 
 9 candidate operators:
-  'operator *= (T, T) -> T'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (vecN<T>, T) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (T, vecN<T>) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (T, matNxM<T>) -> matNxM<T>'  where: 'T' is 'f32' or 'f16'
-  'operator *= (matNxM<T>, T) -> matNxM<T>'  where: 'T' is 'f32' or 'f16'
-  'operator *= (vecN<T>, vecN<T>) -> vecN<T>'  where: 'T' is 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (matCxR<T>, vecC<T>) -> vecR<T>'  where: 'T' is 'f32' or 'f16'
-  'operator *= (vecR<T>, matCxR<T>) -> vecC<T>'  where: 'T' is 'f32' or 'f16'
-  'operator *= (matKxR<T>, matCxK<T>) -> matCxR<T>'  where: 'T' is 'f32' or 'f16'
+ • 'operator *= (T  ✓ , T  ✗ ) -> T' where:
+      ✓  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (T  ✓ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (T  ✓ , matNxM<T>  ✗ ) -> matNxM<T>' where:
+      ✓  'T' is 'f32' or 'f16'
+ • 'operator *= (vecN<T>  ✗ , T  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (matNxM<T>  ✗ , T  ✗ ) -> matNxM<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator *= (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (matCxR<T>  ✗ , vecC<T>  ✗ ) -> vecR<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator *= (vecR<T>  ✗ , matCxR<T>  ✗ ) -> vecC<T>' where:
+      ✗  'T' is 'f32' or 'f16'
+ • 'operator *= (matKxR<T>  ✗ , matCxK<T>  ✗ ) -> matCxR<T>' where:
+      ✗  'T' is 'f32' or 'f16'
 )");
 }
 
@@ -721,19 +787,35 @@
               R"(no matching constructor for 'vec3<i32>(i32, f32, i32)'
 
 6 candidate constructors:
-  'vec3<T>(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>() -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✓ , y: T  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✓ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(xy: vec2<T>  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >() -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f32', 'U' is 'i32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f16', 'U' is 'f32', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'i32', 'U' is 'f32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'u32', 'U' is 'f32', 'f16', 'i32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'bool', 'U' is 'f32', 'f16', 'i32' or 'u32'
+ • 'vec3<T  ✓ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'i32'
+      ✗  'U' is 'f32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f32'
+      ✗  'U' is 'i32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'f32', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'f32', 'f16', 'i32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
@@ -794,19 +876,35 @@
               R"(no matching constructor for 'vec3<f32>(array<u32>)'
 
 6 candidate constructors:
-  'vec3<T>(vec3<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>() -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >() -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(xy: vec2<T>  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✗ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✗ , y: T  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f32', 'U' is 'i32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f16', 'U' is 'f32', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'i32', 'U' is 'f32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'u32', 'U' is 'f32', 'f16', 'i32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'bool', 'U' is 'f32', 'f16', 'i32' or 'u32'
+ • 'vec3<T  ✓ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32'
+      ✗  'U' is 'i32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'f32', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'i32'
+      ✗  'U' is 'f32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'f32', 'f16', 'i32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
diff --git a/src/tint/lang/core/type/BUILD.bazel b/src/tint/lang/core/type/BUILD.bazel
index 485a4a8..35a5221 100644
--- a/src/tint/lang/core/type/BUILD.bazel
+++ b/src/tint/lang/core/type/BUILD.bazel
@@ -53,6 +53,7 @@
     "f16.cc",
     "f32.cc",
     "i32.cc",
+    "invalid.cc",
     "manager.cc",
     "matrix.cc",
     "memory_view.cc",
@@ -91,6 +92,7 @@
     "f16.h",
     "f32.h",
     "i32.h",
+    "invalid.h",
     "manager.h",
     "matrix.h",
     "memory_view.h",
diff --git a/src/tint/lang/core/type/BUILD.cmake b/src/tint/lang/core/type/BUILD.cmake
index 7c9b819..285a088 100644
--- a/src/tint/lang/core/type/BUILD.cmake
+++ b/src/tint/lang/core/type/BUILD.cmake
@@ -68,6 +68,8 @@
   lang/core/type/f32.h
   lang/core/type/i32.cc
   lang/core/type/i32.h
+  lang/core/type/invalid.cc
+  lang/core/type/invalid.h
   lang/core/type/manager.cc
   lang/core/type/manager.h
   lang/core/type/matrix.cc
diff --git a/src/tint/lang/core/type/BUILD.gn b/src/tint/lang/core/type/BUILD.gn
index 2f0568b..7f64802 100644
--- a/src/tint/lang/core/type/BUILD.gn
+++ b/src/tint/lang/core/type/BUILD.gn
@@ -73,6 +73,8 @@
     "f32.h",
     "i32.cc",
     "i32.h",
+    "invalid.cc",
+    "invalid.h",
     "manager.cc",
     "manager.h",
     "matrix.cc",
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/lang/core/type/invalid.cc
similarity index 68%
copy from src/tint/api/options/array_length_from_uniform_test.cc
copy to src/tint/lang/core/type/invalid.cc
index c62092a..cc929a8 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/lang/core/type/invalid.cc
@@ -25,16 +25,37 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+#include "src/tint/lang/core/type/invalid.h"
 
-#include <gtest/gtest.h>
+#include "src/tint/lang/core/type/manager.h"
 
-namespace tint {
-namespace {
+TINT_INSTANTIATE_TYPEINFO(tint::core::type::Invalid);
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
+namespace tint::core::type {
+
+Invalid::Invalid()
+    : Base(static_cast<size_t>(tint::TypeCode::Of<Invalid>().bits), core::type::Flags{}) {}
+
+Invalid::~Invalid() = default;
+
+std::string Invalid::FriendlyName() const {
+    return "<invalid-type>";
 }
 
-}  // namespace
-}  // namespace tint
+bool Invalid::Equals(const UniqueNode& other) const {
+    return other.Is<Invalid>();
+}
+
+uint32_t Invalid::Size() const {
+    return 0;
+}
+
+uint32_t Invalid::Align() const {
+    return 0;
+}
+
+Invalid* Invalid::Clone(CloneContext& ctx) const {
+    return ctx.dst.mgr->Get<Invalid>();
+}
+
+}  // namespace tint::core::type
diff --git a/src/tint/lang/core/type/invalid.h b/src/tint/lang/core/type/invalid.h
new file mode 100644
index 0000000..4405bf7
--- /dev/null
+++ b/src/tint/lang/core/type/invalid.h
@@ -0,0 +1,67 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. 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.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// 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.
+
+#ifndef SRC_TINT_LANG_CORE_TYPE_INVALID_H_
+#define SRC_TINT_LANG_CORE_TYPE_INVALID_H_
+
+#include <string>
+
+#include "src/tint/lang/core/type/type.h"
+
+namespace tint::core::type {
+
+/// An invalid type.
+class Invalid final : public Castable<Invalid, Type> {
+  public:
+    /// Constructor
+    Invalid();
+
+    /// Destructor
+    ~Invalid() override;
+
+    /// @returns the name for this type that closely resembles how it would be
+    /// declared in WGSL.
+    std::string FriendlyName() const override;
+
+    /// @param other the other node to compare against
+    /// @returns true if the this type is equal to @p other
+    bool Equals(const UniqueNode& other) const override;
+
+    /// @returns the size in bytes of the type.
+    uint32_t Size() const override;
+
+    /// @returns the alignment in bytes of the type.
+    uint32_t Align() const override;
+
+    /// @param ctx the clone context
+    /// @returns a clone of this type
+    Invalid* Clone(CloneContext& ctx) const override;
+};
+
+}  // namespace tint::core::type
+
+#endif  // SRC_TINT_LANG_CORE_TYPE_INVALID_H_
diff --git a/src/tint/lang/core/type/manager.cc b/src/tint/lang/core/type/manager.cc
index f158770..30d0d51 100644
--- a/src/tint/lang/core/type/manager.cc
+++ b/src/tint/lang/core/type/manager.cc
@@ -36,6 +36,7 @@
 #include "src/tint/lang/core/type/f16.h"
 #include "src/tint/lang/core/type/f32.h"
 #include "src/tint/lang/core/type/i32.h"
+#include "src/tint/lang/core/type/invalid.h"
 #include "src/tint/lang/core/type/matrix.h"
 #include "src/tint/lang/core/type/pointer.h"
 #include "src/tint/lang/core/type/type.h"
@@ -54,6 +55,10 @@
 
 Manager::~Manager() = default;
 
+const core::type::Invalid* Manager::invalid() {
+    return Get<core::type::Invalid>();
+}
+
 const core::type::Void* Manager::void_() {
     return Get<core::type::Void>();
 }
diff --git a/src/tint/lang/core/type/manager.h b/src/tint/lang/core/type/manager.h
index 0a9a201..8c22f3d 100644
--- a/src/tint/lang/core/type/manager.h
+++ b/src/tint/lang/core/type/manager.h
@@ -52,6 +52,7 @@
 class F16;
 class F32;
 class I32;
+class Invalid;
 class Matrix;
 class Pointer;
 class U32;
@@ -175,6 +176,9 @@
         return types_.Find<TYPE>(std::forward<ARGS>(args)...);
     }
 
+    /// @returns an invalid type
+    const core::type::Invalid* invalid();
+
     /// @returns a void type
     const core::type::Void* void_();
 
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 387ddb9..fc2a4b8 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -33,6 +33,7 @@
 #include <utility>
 #include <vector>
 
+#include "src/tint/api/common/binding_point.h"
 #include "src/tint/lang/core/constant/splat.h"
 #include "src/tint/lang/core/constant/value.h"
 #include "src/tint/lang/core/fluent_types.h"
@@ -334,12 +335,6 @@
     manager.Add<ast::transform::SimplifyPointers>();
     manager.Add<ast::transform::RemovePhonies>();
 
-    // Build the config for the internal ArrayLengthFromUniform transform.
-    ast::transform::ArrayLengthFromUniform::Config array_length_from_uniform_cfg(
-        array_length_from_uniform_options.ubo_binding);
-    array_length_from_uniform_cfg.bindpoint_to_size_index =
-        std::move(array_length_from_uniform_options.bindpoint_to_size_index);
-
     // DemoteToHelper must come after CanonicalizeEntryPointIO, PromoteSideEffectsToDecl, and
     // ExpandCompoundAssignment.
     // TODO(crbug.com/tint/1752): This is only necessary when FXC is being used.
@@ -348,6 +343,12 @@
     // ArrayLengthFromUniform must come after SimplifyPointers as it assumes that the form of the
     // array length argument is &var.array.
     manager.Add<ast::transform::ArrayLengthFromUniform>();
+    // Build the config for the internal ArrayLengthFromUniform transform.
+    ast::transform::ArrayLengthFromUniform::Config array_length_from_uniform_cfg(
+        BindingPoint{array_length_from_uniform_options.ubo_binding.group,
+                     array_length_from_uniform_options.ubo_binding.binding});
+    array_length_from_uniform_cfg.bindpoint_to_size_index =
+        std::move(array_length_from_uniform_options.bindpoint_to_size_index);
     data.Add<ast::transform::ArrayLengthFromUniform::Config>(
         std::move(array_length_from_uniform_cfg));
     // DecomposeMemoryAccess must come after:
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
index fa1a540..f17cf3b 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
@@ -35,7 +35,6 @@
 #include <utility>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/array_length_from_uniform.h"
 #include "src/tint/lang/core/builtin_value.h"
 #include "src/tint/lang/hlsl/writer/ast_raise/decompose_memory_access.h"
 #include "src/tint/lang/hlsl/writer/common/options.h"
diff --git a/src/tint/lang/hlsl/writer/ast_printer/sanitizer_test.cc b/src/tint/lang/hlsl/writer/ast_printer/sanitizer_test.cc
index 5823771..72bfc3b 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/sanitizer_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/sanitizer_test.cc
@@ -166,17 +166,17 @@
     ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
 
     auto got = gen.Result();
-    auto* expect = R"(cbuffer cbuffer_tint_symbol_1 : register(b4, space3) {
-  uint4 tint_symbol_1[2];
+    auto* expect = R"(cbuffer cbuffer_tint_array_lengths : register(b4, space3) {
+  uint4 tint_array_lengths[2];
 };
 ByteAddressBuffer b : register(t1, space2);
 ByteAddressBuffer c : register(t2, space2);
 
 void a_func() {
-  uint tint_symbol_3 = 0u;
-  b.GetDimensions(tint_symbol_3);
-  uint tint_symbol_4 = ((tint_symbol_3 - 0u) / 4u);
-  uint len = (tint_symbol_4 + ((tint_symbol_1[1].w - 0u) / 4u));
+  uint tint_symbol_1 = 0u;
+  b.GetDimensions(tint_symbol_1);
+  uint tint_symbol_2 = ((tint_symbol_1 - 0u) / 4u);
+  uint len = (tint_symbol_2 + ((tint_array_lengths[1].w - 0u) / 4u));
   return;
 }
 )";
diff --git a/src/tint/lang/hlsl/writer/common/options.h b/src/tint/lang/hlsl/writer/common/options.h
index 90bc6b3..6bf4719 100644
--- a/src/tint/lang/hlsl/writer/common/options.h
+++ b/src/tint/lang/hlsl/writer/common/options.h
@@ -34,7 +34,6 @@
 #include <vector>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/array_length_from_uniform.h"
 #include "src/tint/api/options/binding_remapper.h"
 #include "src/tint/api/options/external_texture.h"
 #include "src/tint/api/options/pixel_local.h"
@@ -140,6 +139,19 @@
 /// D3D11_PS_INPUT_REGISTER_COUNT == D3D12_PS_INPUT_REGISTER_COUNT
 constexpr uint32_t kMaxInterStageLocations = 30;
 
+/// Options used to specify a mapping of binding points to indices into a UBO
+/// from which to load buffer sizes.
+struct ArrayLengthFromUniformOptions {
+    /// The HLSL binding point to use to generate a uniform buffer from which to read buffer sizes.
+    binding::Uniform ubo_binding;
+    /// The mapping from the storage buffer binding points in WGSL binding-point space to the index
+    /// into the uniform buffer where the length of the buffer is stored.
+    std::unordered_map<BindingPoint, uint32_t> bindpoint_to_size_index;
+
+    /// Reflect the fields of this class so that it can be used by tint::ForeachField()
+    TINT_REFLECT(ArrayLengthFromUniformOptions, ubo_binding, bindpoint_to_size_index);
+};
+
 /// Configuration options used for generating HLSL.
 struct Options {
     /// Constructor
diff --git a/src/tint/lang/hlsl/writer/common/options_test.cc b/src/tint/lang/hlsl/writer/common/options_test.cc
index 5feb66f..741a1b0 100644
--- a/src/tint/lang/hlsl/writer/common/options_test.cc
+++ b/src/tint/lang/hlsl/writer/common/options_test.cc
@@ -33,6 +33,7 @@
 namespace {
 
 TEST(TintCheckAllFieldsReflected, HlslWriterCommonOptionsTest) {
+    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(binding::BindingInfo);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(binding::ExternalTexture);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(Bindings);
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 9a574b7..a511c62 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -33,6 +33,7 @@
 #include <utility>
 #include <vector>
 
+#include "src/tint/api/common/binding_point.h"
 #include "src/tint/lang/core/constant/splat.h"
 #include "src/tint/lang/core/constant/value.h"
 #include "src/tint/lang/core/fluent_types.h"
@@ -187,7 +188,9 @@
 
     ExternalTextureOptions external_texture_options{};
     RemapperData remapper_data{};
-    PopulateRemapperAndMultiplanarOptions(options, remapper_data, external_texture_options);
+    ArrayLengthFromUniformOptions array_length_from_uniform_options{};
+    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+                                  array_length_from_uniform_options);
 
     manager.Add<ast::transform::BindingRemapper>();
     data.Add<ast::transform::BindingRemapper::Remappings>(
@@ -240,12 +243,13 @@
     // ArrayLengthFromUniform must come after SimplifyPointers, as
     // it assumes that the form of the array length argument is &var.array.
     manager.Add<ast::transform::ArrayLengthFromUniform>();
-
-    ast::transform::ArrayLengthFromUniform::Config array_length_cfg(
-        std::move(options.array_length_from_uniform.ubo_binding));
-    array_length_cfg.bindpoint_to_size_index =
-        std::move(options.array_length_from_uniform.bindpoint_to_size_index);
-    data.Add<ast::transform::ArrayLengthFromUniform::Config>(array_length_cfg);
+    // Build the config for the internal ArrayLengthFromUniform transform.
+    ast::transform::ArrayLengthFromUniform::Config array_length_from_uniform_cfg(
+        BindingPoint{0, array_length_from_uniform_options.ubo_binding});
+    array_length_from_uniform_cfg.bindpoint_to_size_index =
+        std::move(array_length_from_uniform_options.bindpoint_to_size_index);
+    data.Add<ast::transform::ArrayLengthFromUniform::Config>(
+        std::move(array_length_from_uniform_cfg));
 
     // PackedVec3 must come after ExpandCompoundAssignment.
     manager.Add<PackedVec3>();
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.h b/src/tint/lang/msl/writer/ast_printer/ast_printer.h
index 7b4fea1..f86bb39 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.h
@@ -34,7 +34,6 @@
 #include <unordered_set>
 #include <vector>
 
-#include "src/tint/api/options/array_length_from_uniform.h"
 #include "src/tint/lang/core/builtin_value.h"
 #include "src/tint/lang/msl/writer/common/options.h"
 #include "src/tint/lang/wgsl/ast/assignment_statement.h"
diff --git a/src/tint/lang/msl/writer/ast_printer/sanitizer_test.cc b/src/tint/lang/msl/writer/ast_printer/sanitizer_test.cc
index 4745f0c..901ddd2 100644
--- a/src/tint/lang/msl/writer/ast_printer/sanitizer_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/sanitizer_test.cc
@@ -55,7 +55,7 @@
          });
 
     Options opts = DefaultOptions();
-    opts.array_length_from_uniform.ubo_binding = BindingPoint{0, 30};
+    opts.array_length_from_uniform.ubo_binding = 30;
     opts.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{2, 1}, 1);
     ASTPrinter& gen = SanitizeAndBuild(opts);
 
@@ -78,16 +78,16 @@
     T elements[N];
 };
 
-struct tint_symbol {
-  /* 0x0000 */ tint_array<uint4, 1> buffer_size;
+struct TintArrayLengths {
+  /* 0x0000 */ tint_array<uint4, 1> array_lengths;
 };
 
 struct my_struct {
   tint_array<float, 1> a;
 };
 
-fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
-  uint len = (((*(tint_symbol_2)).buffer_size[0u][1u] - 0u) / 4u);
+fragment void a_func(const constant TintArrayLengths* tint_symbol [[buffer(30)]]) {
+  uint len = (((*(tint_symbol)).array_lengths[0u][1u] - 0u) / 4u);
   return;
 }
 
@@ -112,7 +112,7 @@
          });
 
     Options opts = DefaultOptions();
-    opts.array_length_from_uniform.ubo_binding = BindingPoint{0, 30};
+    opts.array_length_from_uniform.ubo_binding = 30;
     opts.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{2, 1}, 1);
     ASTPrinter& gen = SanitizeAndBuild(opts);
 
@@ -135,8 +135,8 @@
     T elements[N];
 };
 
-struct tint_symbol {
-  /* 0x0000 */ tint_array<uint4, 1> buffer_size;
+struct TintArrayLengths {
+  /* 0x0000 */ tint_array<uint4, 1> array_lengths;
 };
 
 struct my_struct {
@@ -144,8 +144,8 @@
   tint_array<float, 1> a;
 };
 
-fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
-  uint len = (((*(tint_symbol_2)).buffer_size[0u][1u] - 4u) / 4u);
+fragment void a_func(const constant TintArrayLengths* tint_symbol [[buffer(30)]]) {
+  uint len = (((*(tint_symbol)).array_lengths[0u][1u] - 4u) / 4u);
   return;
 }
 
@@ -173,7 +173,7 @@
          });
 
     Options opts = DefaultOptions();
-    opts.array_length_from_uniform.ubo_binding = BindingPoint{0, 30};
+    opts.array_length_from_uniform.ubo_binding = 30;
     opts.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{2, 1}, 1);
     ASTPrinter& gen = SanitizeAndBuild(opts);
 
@@ -196,16 +196,16 @@
     T elements[N];
 };
 
-struct tint_symbol {
-  /* 0x0000 */ tint_array<uint4, 1> buffer_size;
+struct TintArrayLengths {
+  /* 0x0000 */ tint_array<uint4, 1> array_lengths;
 };
 
 struct my_struct {
   tint_array<float, 1> a;
 };
 
-fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(30)]]) {
-  uint len = (((*(tint_symbol_2)).buffer_size[0u][1u] - 0u) / 4u);
+fragment void a_func(const constant TintArrayLengths* tint_symbol [[buffer(30)]]) {
+  uint len = (((*(tint_symbol)).array_lengths[0u][1u] - 0u) / 4u);
   return;
 }
 
@@ -232,7 +232,7 @@
          });
 
     Options options;
-    options.array_length_from_uniform.ubo_binding = {0, 29};
+    options.array_length_from_uniform.ubo_binding = 29;
     options.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{0, 1}, 7u);
     options.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{0, 2}, 2u);
     ASTPrinter& gen = SanitizeAndBuild(options);
@@ -256,16 +256,16 @@
     T elements[N];
 };
 
-struct tint_symbol {
-  /* 0x0000 */ tint_array<uint4, 2> buffer_size;
+struct TintArrayLengths {
+  /* 0x0000 */ tint_array<uint4, 2> array_lengths;
 };
 
 struct my_struct {
   tint_array<float, 1> a;
 };
 
-fragment void a_func(const constant tint_symbol* tint_symbol_2 [[buffer(29)]]) {
-  uint len = ((((*(tint_symbol_2)).buffer_size[1u][3u] - 0u) / 4u) + (((*(tint_symbol_2)).buffer_size[0u][2u] - 0u) / 4u));
+fragment void a_func(const constant TintArrayLengths* tint_symbol [[buffer(29)]]) {
+  uint len = ((((*(tint_symbol)).array_lengths[1u][3u] - 0u) / 4u) + (((*(tint_symbol)).array_lengths[0u][2u] - 0u) / 4u));
   return;
 }
 
@@ -291,7 +291,7 @@
          });
 
     Options options;
-    options.array_length_from_uniform.ubo_binding = {0, 29};
+    options.array_length_from_uniform.ubo_binding = 29;
     options.array_length_from_uniform.bindpoint_to_size_index.emplace(BindingPoint{0, 2}, 2u);
     ASTPrinter& gen = SanitizeAndBuild(options);
 
diff --git a/src/tint/lang/msl/writer/common/option_helpers.cc b/src/tint/lang/msl/writer/common/option_helpers.cc
index cb6a162..ab4857b 100644
--- a/src/tint/lang/msl/writer/common/option_helpers.cc
+++ b/src/tint/lang/msl/writer/common/option_helpers.cc
@@ -52,27 +52,21 @@
 
     auto wgsl_seen = [&diagnostics, &seen_wgsl_bindings](const tint::BindingPoint& src,
                                                          const binding::BindingInfo& dst) -> bool {
-        if (auto binding = seen_wgsl_bindings.Get(src)) {
-            if (*binding != dst) {
-                diagnostics.AddError(diag::System::Writer, Source{})
-                    << "found duplicate WGSL binding point: " << src;
-                return true;
-            }
+        if (auto binding = seen_wgsl_bindings.Add(src, dst); binding.value != dst) {
+            diagnostics.AddError(diag::System::Writer, Source{})
+                << "found duplicate WGSL binding point: " << src;
+            return true;
         }
-        seen_wgsl_bindings.Add(src, dst);
         return false;
     };
 
     auto msl_seen = [&diagnostics](InfoToPointMap& map, const binding::BindingInfo& src,
                                    const tint::BindingPoint& dst) -> bool {
-        if (auto binding = map.Get(src)) {
-            if (*binding != dst) {
-                diagnostics.AddError(diag::System::Writer, Source{})
-                    << "found duplicate MSL binding point: [binding: " << src.binding << "]";
-                return true;
-            }
+        if (auto binding = map.Add(src, dst); binding.value != dst) {
+            diagnostics.AddError(diag::System::Writer, Source{})
+                << "found duplicate MSL binding point: [binding: " << src.binding << "]";
+            return true;
         }
-        map.Add(src, dst);
         return false;
     };
 
@@ -159,9 +153,11 @@
 //
 // When the data comes in we have a list of all WGSL origin (group,binding) pairs to MSL
 // (binding) in the `uniform`, `storage`, `texture`, and `sampler` arrays.
-void PopulateRemapperAndMultiplanarOptions(const Options& options,
-                                           RemapperData& remapper_data,
-                                           ExternalTextureOptions& external_texture) {
+void PopulateBindingRelatedOptions(
+    const Options& options,
+    RemapperData& remapper_data,
+    ExternalTextureOptions& external_texture,
+    ArrayLengthFromUniformOptions& array_length_from_uniform_options) {
     auto create_remappings = [&remapper_data](const auto& hsh) {
         for (const auto& it : hsh) {
             const BindingPoint& src_binding_point = it.first;
@@ -208,6 +204,24 @@
 
         remapper_data.emplace(src_binding_point, plane0_binding_point);
     }
+
+    // ArrayLengthFromUniformOptions bindpoints may need to be remapped
+    {
+        std::unordered_map<BindingPoint, uint32_t> bindpoint_to_size_index;
+        for (auto& [bindpoint, index] : options.array_length_from_uniform.bindpoint_to_size_index) {
+            auto it = remapper_data.find(bindpoint);
+            if (it != remapper_data.end()) {
+                bindpoint_to_size_index.emplace(it->second, index);
+            } else {
+                bindpoint_to_size_index.emplace(bindpoint, index);
+            }
+        }
+
+        array_length_from_uniform_options.ubo_binding =
+            options.array_length_from_uniform.ubo_binding;
+        array_length_from_uniform_options.bindpoint_to_size_index =
+            std::move(bindpoint_to_size_index);
+    }
 }
 
 }  // namespace tint::msl::writer
diff --git a/src/tint/lang/msl/writer/common/option_helpers.h b/src/tint/lang/msl/writer/common/option_helpers.h
index 6f21fbd..f4d6dee 100644
--- a/src/tint/lang/msl/writer/common/option_helpers.h
+++ b/src/tint/lang/msl/writer/common/option_helpers.h
@@ -45,14 +45,17 @@
 /// @returns success or failure
 Result<SuccessType> ValidateBindingOptions(const Options& options);
 
-/// Populates data from the writer options for the remapper and external texture.
+/// Populates binding-related option from the writer options
 /// @param options the writer options
 /// @param remapper_data where to put the remapper data
 /// @param external_texture where to store the external texture options
+/// @param array_length_from_uniform_options where to store the ArrayLengthFromUniform options
 /// Note, these are populated together because there are dependencies between the two types of data.
-void PopulateRemapperAndMultiplanarOptions(const Options& options,
-                                           RemapperData& remapper_data,
-                                           ExternalTextureOptions& external_texture);
+void PopulateBindingRelatedOptions(
+    const Options& options,
+    RemapperData& remapper_data,
+    ExternalTextureOptions& external_texture,
+    ArrayLengthFromUniformOptions& array_length_from_uniform_options);
 
 }  // namespace tint::msl::writer
 
diff --git a/src/tint/lang/msl/writer/common/options.h b/src/tint/lang/msl/writer/common/options.h
index 083206c..adfbf72 100644
--- a/src/tint/lang/msl/writer/common/options.h
+++ b/src/tint/lang/msl/writer/common/options.h
@@ -31,7 +31,6 @@
 #include <unordered_map>
 
 #include "src/tint/api/common/binding_point.h"
-#include "src/tint/api/options/array_length_from_uniform.h"
 #include "src/tint/api/options/pixel_local.h"
 #include "src/tint/utils/reflection/reflection.h"
 
@@ -112,6 +111,19 @@
     TINT_REFLECT(Bindings, uniform, storage, texture, storage_texture, sampler, external_texture);
 };
 
+/// Options used to specify a mapping of binding points to indices into a UBO
+/// from which to load buffer sizes.
+struct ArrayLengthFromUniformOptions {
+    /// The MSL binding point to use to generate a uniform buffer from which to read buffer sizes.
+    uint32_t ubo_binding;
+    /// The mapping from the storage buffer binding points in WGSL binding-point space to the index
+    /// into the uniform buffer where the length of the buffer is stored.
+    std::unordered_map<BindingPoint, uint32_t> bindpoint_to_size_index;
+
+    /// Reflect the fields of this class so that it can be used by tint::ForeachField()
+    TINT_REFLECT(ArrayLengthFromUniformOptions, ubo_binding, bindpoint_to_size_index);
+};
+
 /// Configuration options used for generating MSL.
 struct Options {
     /// Constructor
diff --git a/src/tint/lang/msl/writer/common/options_test.cc b/src/tint/lang/msl/writer/common/options_test.cc
index 6cd8632..1dc826f 100644
--- a/src/tint/lang/msl/writer/common/options_test.cc
+++ b/src/tint/lang/msl/writer/common/options_test.cc
@@ -33,6 +33,7 @@
 namespace {
 
 TEST(TintCheckAllFieldsReflected, MslWriterCommonOptionsTest) {
+    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(binding::BindingInfo);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(binding::ExternalTexture);
     TINT_ASSERT_ALL_FIELDS_REFLECTED(Bindings);
diff --git a/src/tint/lang/msl/writer/raise/raise.cc b/src/tint/lang/msl/writer/raise/raise.cc
index 63591e7..fab831d 100644
--- a/src/tint/lang/msl/writer/raise/raise.cc
+++ b/src/tint/lang/msl/writer/raise/raise.cc
@@ -56,7 +56,9 @@
 
     ExternalTextureOptions external_texture_options{};
     RemapperData remapper_data{};
-    PopulateRemapperAndMultiplanarOptions(options, remapper_data, external_texture_options);
+    ArrayLengthFromUniformOptions array_length_from_uniform_options{};
+    PopulateBindingRelatedOptions(options, remapper_data, external_texture_options,
+                                  array_length_from_uniform_options);
     RUN_TRANSFORM(core::ir::transform::BindingRemapper, remapper_data);
 
     {
diff --git a/src/tint/lang/msl/writer/writer_bench.cc b/src/tint/lang/msl/writer/writer_bench.cc
index 455b501..47d07a1 100644
--- a/src/tint/lang/msl/writer/writer_bench.cc
+++ b/src/tint/lang/msl/writer/writer_bench.cc
@@ -45,7 +45,7 @@
     auto& program = res->program;
 
     tint::msl::writer::Options gen_options = {};
-    gen_options.array_length_from_uniform.ubo_binding = tint::BindingPoint{0, 30};
+    gen_options.array_length_from_uniform.ubo_binding = 30;
     gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 0},
                                                                           0);
     gen_options.array_length_from_uniform.bindpoint_to_size_index.emplace(tint::BindingPoint{0, 1},
diff --git a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
index bdb43cf..e307e25 100644
--- a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
+++ b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform.cc
@@ -29,24 +29,39 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <utility>
 
 #include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/unary_op.h"
+#include "src/tint/lang/wgsl/ast/expression.h"
 #include "src/tint/lang/wgsl/ast/transform/simplify_pointers.h"
+#include "src/tint/lang/wgsl/ast/unary_op_expression.h"
+#include "src/tint/lang/wgsl/ast/variable.h"
+#include "src/tint/lang/wgsl/builtin_fn.h"
 #include "src/tint/lang/wgsl/program/clone_context.h"
 #include "src/tint/lang/wgsl/program/program_builder.h"
 #include "src/tint/lang/wgsl/resolver/resolve.h"
+#include "src/tint/lang/wgsl/sem/array.h"
+#include "src/tint/lang/wgsl/sem/builtin_fn.h"
 #include "src/tint/lang/wgsl/sem/call.h"
+#include "src/tint/lang/wgsl/sem/expression.h"
 #include "src/tint/lang/wgsl/sem/function.h"
+#include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/statement.h"
 #include "src/tint/lang/wgsl/sem/variable.h"
+#include "src/tint/utils/containers/unique_vector.h"
+#include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/ice/ice.h"
+#include "src/tint/utils/rtti/switch.h"
+#include "src/tint/utils/text/text_style.h"
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ArrayLengthFromUniform);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ArrayLengthFromUniform::Config);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ArrayLengthFromUniform::Result);
 
 using namespace tint::core::fluent_types;  // NOLINT
-                                           //
+
 namespace tint::ast::transform {
 namespace {
 
@@ -75,12 +90,11 @@
     /// @param in the input transform data
     /// @param out the output transform data
     explicit State(const Program& program, const DataMap& in, DataMap& out)
-        : src(program), inputs(in), outputs(out) {}
+        : src(program), outputs(out), cfg(in.Get<Config>()) {}
 
     /// Runs the transform
     /// @returns the new program or SkipTransform if the transform is not required
     ApplyResult Run() {
-        auto* cfg = inputs.Get<Config>();
         if (cfg == nullptr) {
             b.Diagnostics().AddError(diag::System::Transform, Source{})
                 << "missing transform data for "
@@ -88,103 +102,34 @@
             return resolver::Resolve(b);
         }
 
-        if (!ShouldRun(src)) {
+        if (cfg->bindpoint_to_size_index.empty() || !ShouldRun(src)) {
             return SkipTransform;
         }
 
-        const char* kBufferSizeMemberName = "buffer_size";
+        // Create the name of the array lengths uniform variable.
+        array_lengths_var = b.Symbols().New("tint_array_lengths");
 
-        // Determine the size of the buffer size array.
-        uint32_t max_buffer_size_index = 0;
-
-        IterateArrayLengthOnStorageVar(
-            [&](const CallExpression*, const sem::VariableUser*, const sem::GlobalVariable* var) {
-                if (auto binding = var->Attributes().binding_point) {
-                    auto idx_itr = cfg->bindpoint_to_size_index.find(*binding);
-                    if (idx_itr == cfg->bindpoint_to_size_index.end()) {
-                        return;
-                    }
-                    if (idx_itr->second > max_buffer_size_index) {
-                        max_buffer_size_index = idx_itr->second;
+        // Replace all the arrayLength() calls.
+        for (auto* fn : src.AST().Functions()) {
+            if (auto* sem_fn = sem.Get(fn)) {
+                for (auto* call : sem_fn->DirectCalls()) {
+                    if (auto* target = call->Target()->As<sem::BuiltinFn>()) {
+                        if (target->Fn() == wgsl::BuiltinFn::kArrayLength) {
+                            ReplaceArrayLengthCall(call);
+                        }
                     }
                 }
-            });
-
-        // Get (or create, on first call) the uniform buffer that will receive the
-        // size of each storage buffer in the module.
-        const Variable* buffer_size_ubo = nullptr;
-        auto get_ubo = [&] {
-            if (!buffer_size_ubo) {
-                // Emit an array<vec4<u32>, N>, where N is 1/4 number of elements.
-                // We do this because UBOs require an element stride that is 16-byte
-                // aligned.
-                auto* buffer_size_struct = b.Structure(
-                    b.Sym(), tint::Vector{
-                                 b.Member(kBufferSizeMemberName,
-                                          b.ty.array(b.ty.vec4(b.ty.u32()),
-                                                     u32((max_buffer_size_index / 4) + 1))),
-                             });
-                buffer_size_ubo =
-                    b.GlobalVar(b.Sym(), b.ty.Of(buffer_size_struct), core::AddressSpace::kUniform,
-                                b.Group(AInt(cfg->ubo_binding.group)),
-                                b.Binding(AInt(cfg->ubo_binding.binding)));
             }
-            return buffer_size_ubo;
-        };
+        }
 
-        std::unordered_set<uint32_t> used_size_indices;
+        // Add the necessary array-length arguments to all the newly created array-length
+        // parameters.
+        while (!len_params_needing_args.IsEmpty()) {
+            AddArrayLengthArguments(len_params_needing_args.Pop());
+        }
 
-        IterateArrayLengthOnStorageVar([&](const CallExpression* call_expr,
-                                           const sem::VariableUser* storage_buffer_sem,
-                                           const sem::GlobalVariable* var) {
-            auto binding = var->Attributes().binding_point;
-            if (!binding) {
-                return;
-            }
-            auto idx_itr = cfg->bindpoint_to_size_index.find(*binding);
-            if (idx_itr == cfg->bindpoint_to_size_index.end()) {
-                return;
-            }
-
-            uint32_t size_index = idx_itr->second;
-            used_size_indices.insert(size_index);
-
-            // Load the total storage buffer size from the UBO.
-            uint32_t array_index = size_index / 4;
-            auto* vec_expr = b.IndexAccessor(
-                b.MemberAccessor(get_ubo()->name->symbol, kBufferSizeMemberName), u32(array_index));
-            uint32_t vec_index = size_index % 4;
-            auto* total_storage_buffer_size = b.IndexAccessor(vec_expr, u32(vec_index));
-
-            // Calculate actual array length
-            //                total_storage_buffer_size - array_offset
-            // array_length = ----------------------------------------
-            //                             array_stride
-            const Expression* total_size = total_storage_buffer_size;
-            if (TINT_UNLIKELY(storage_buffer_sem->Type()->Is<core::type::Pointer>())) {
-                TINT_ICE() << "storage buffer variable should not be a pointer. These should have "
-                              "been removed by the SimplifyPointers transform";
-                return;
-            }
-            auto* storage_buffer_type = storage_buffer_sem->Type()->UnwrapRef();
-            const core::type::Array* array_type = nullptr;
-            if (auto* str = storage_buffer_type->As<core::type::Struct>()) {
-                // The variable is a struct, so subtract the byte offset of the array
-                // member.
-                auto* array_member_sem = str->Members().Back();
-                array_type = array_member_sem->Type()->As<core::type::Array>();
-                total_size = b.Sub(total_storage_buffer_size, u32(array_member_sem->Offset()));
-            } else if (auto* arr = storage_buffer_type->As<core::type::Array>()) {
-                array_type = arr;
-            } else {
-                TINT_ICE() << "expected form of arrayLength argument to be &array_var or "
-                              "&struct_var.array_member";
-                return;
-            }
-            auto* array_length = b.Div(total_size, u32(array_type->Stride()));
-
-            ctx.Replace(call_expr, array_length);
-        });
+        // Add the tint_array_lengths module-scope uniform variable.
+        AddArrayLengthsUniformVar();
 
         outputs.Add<Result>(used_size_indices);
 
@@ -193,81 +138,192 @@
     }
 
   private:
+    // Replaces the arrayLength() builtin call with an array-length expression passed via a uniform
+    // buffer.
+    void ReplaceArrayLengthCall(const sem::Call* call) {
+        if (auto* replacement = ArrayLengthOf(call->Arguments()[0])) {
+            ctx.Replace(call->Declaration(), replacement);
+        }
+    }
+
+    /// @returns an AST expression that is equal to the arrayLength() of the runtime-sized array
+    /// accessed by the pointer expression @p expr, or nullptr on error or if the array is not in
+    /// the Config::bindpoint_to_size_index map.
+    const ast::Expression* ArrayLengthOf(const sem::Expression* expr) {
+        const ast::Expression* len = nullptr;
+        while (expr) {
+            expr = Switch(
+                expr,  //
+                [&](const sem::VariableUser* user) {
+                    len = ArrayLengthOf(user->Variable());
+                    return nullptr;
+                },
+                [&](const sem::MemberAccessorExpression* access) {
+                    return access->Object();  // Follow the object
+                },
+                [&](const sem::Expression* e) {
+                    return Switch(
+                        e->Declaration(),  //
+                        [&](const ast::UnaryOpExpression* unary) -> const sem::Expression* {
+                            switch (unary->op) {
+                                case core::UnaryOp::kAddressOf:
+                                case core::UnaryOp::kIndirection:
+                                    return sem.Get(unary->expr);  // Follow the object
+                                default:
+                                    TINT_ICE() << "unexpected unary op: " << unary->op;
+                                    return nullptr;
+                            }
+                        },
+                        TINT_ICE_ON_NO_MATCH);
+                },
+                TINT_ICE_ON_NO_MATCH);
+        }
+        return len;
+    }
+
+    /// @returns an AST expression that is equal to the arrayLength() of the runtime-sized array
+    /// held by the module-scope variable or parameter @p var, or nullptr on error or if the array
+    /// is not in the Config::bindpoint_to_size_index map.
+    const ast::Expression* ArrayLengthOf(const sem::Variable* var) {
+        return Switch(
+            var,  //
+            [&](const sem::GlobalVariable* global) { return ArrayLengthOf(global); },
+            [&](const sem::Parameter* param) { return ArrayLengthOf(param); },
+            TINT_ICE_ON_NO_MATCH);
+    }
+
+    /// @returns an AST expression that is equal to the arrayLength() of the runtime-sized array
+    /// held by the module scope variable @p global, or nullptr on error or if the array is not in
+    /// the Config::bindpoint_to_size_index map.
+    const ast::Expression* ArrayLengthOf(const sem::GlobalVariable* global) {
+        auto binding = global->Attributes().binding_point;
+        TINT_ASSERT_OR_RETURN_VALUE(binding, nullptr);
+
+        auto idx_it = cfg->bindpoint_to_size_index.find(*binding);
+        if (idx_it == cfg->bindpoint_to_size_index.end()) {
+            // If the bindpoint_to_size_index map does not contain an entry for the storage buffer,
+            // then we preserve the arrayLength() call.
+            return nullptr;
+        }
+
+        uint32_t size_index = idx_it->second;
+        used_size_indices.insert(size_index);
+
+        // Load the total storage buffer size from the UBO.
+        uint32_t array_index = size_index / 4;
+        auto* vec_expr = b.IndexAccessor(
+            b.MemberAccessor(array_lengths_var, kArrayLengthsMemberName), u32(array_index));
+        uint32_t vec_index = size_index % 4;
+        auto* total_storage_buffer_size = b.IndexAccessor(vec_expr, u32(vec_index));
+
+        // Calculate actual array length
+        //                total_storage_buffer_size - array_offset
+        // array_length = ----------------------------------------
+        //                             array_stride
+        const Expression* total_size = total_storage_buffer_size;
+        if (TINT_UNLIKELY(global->Type()->Is<core::type::Pointer>())) {
+            TINT_ICE() << "storage buffer variable should not be a pointer. "
+                          "These should have been removed by the SimplifyPointers transform";
+            return nullptr;
+        }
+        auto* storage_buffer_type = global->Type()->UnwrapRef();
+        const core::type::Array* array_type = nullptr;
+        if (auto* str = storage_buffer_type->As<core::type::Struct>()) {
+            // The variable is a struct, so subtract the byte offset of the
+            // array member.
+            auto* array_member_sem = str->Members().Back();
+            array_type = array_member_sem->Type()->As<core::type::Array>();
+            total_size = b.Sub(total_storage_buffer_size, u32(array_member_sem->Offset()));
+        } else if (auto* arr = storage_buffer_type->As<core::type::Array>()) {
+            array_type = arr;
+        } else {
+            TINT_ICE() << "expected form of arrayLength argument to be &array_var or "
+                          "&struct_var.array_member";
+            return nullptr;
+        }
+        return b.Div(total_size, u32(array_type->Stride()));
+    }
+
+    /// @returns an AST expression that is equal to the arrayLength() of the runtime-sized array
+    /// held by the object pointed to by the pointer parameter @p param.
+    const ast::Expression* ArrayLengthOf(const sem::Parameter* param) {
+        // Pointer originates from a parameter.
+        // Add a new array length parameter to the function, and use that.
+        auto len_name = param_lengths.GetOrAdd(param, [&] {
+            auto* fn = param->Owner()->As<sem::Function>();
+            auto name = b.Symbols().New(param->Declaration()->name->symbol.Name() + "_length");
+            auto* len_param = b.Param(name, b.ty.u32());
+            ctx.InsertAfter(fn->Declaration()->params, param->Declaration(), len_param);
+            len_params_needing_args.Add(param);
+            return name;
+        });
+        return b.Expr(len_name);
+    }
+
+    /// Constructs the uniform buffer variable that will hold the array lengths.
+    void AddArrayLengthsUniformVar() {
+        // Calculate the highest index in the array lengths array
+        uint32_t highest_index = 0;
+        for (auto idx : used_size_indices) {
+            if (idx > highest_index) {
+                highest_index = idx;
+            }
+        }
+
+        // Emit an array<vec4<u32>, N>, where N is 1/4 number of elements.
+        // We do this because UBOs require an element stride that is 16-byte aligned.
+        auto* buffer_size_struct =
+            b.Structure(b.Symbols().New("TintArrayLengths"),
+                        tint::Vector{
+                            b.Member(kArrayLengthsMemberName,
+                                     b.ty.array(b.ty.vec4<u32>(), u32((highest_index / 4) + 1))),
+                        });
+        b.GlobalVar(array_lengths_var, b.ty.Of(buffer_size_struct), core::AddressSpace::kUniform,
+                    b.Group(AInt(cfg->ubo_binding.group)),
+                    b.Binding(AInt(cfg->ubo_binding.binding)));
+    }
+
+    /// Adds an additional array-length argument to all the calls to the function that owns the
+    /// pointer parameter @p param. This may add new entries to #len_params_needing_args.
+    void AddArrayLengthArguments(const sem::Parameter* param) {
+        auto* fn = param->Owner()->As<sem::Function>();
+        for (auto* call : fn->CallSites()) {
+            auto* arg = call->Arguments()[param->Index()];
+            if (auto* len = ArrayLengthOf(arg); len) {
+                ctx.InsertAfter(call->Declaration()->args, arg->Declaration(), len);
+            } else {
+                // Callee expects an array length, but there's no binding for it.
+                // Call arrayLength() at the call-site.
+                len = b.Call(wgsl::BuiltinFn::kArrayLength, ctx.Clone(arg->Declaration()));
+                ctx.InsertAfter(call->Declaration()->args, arg->Declaration(), len);
+            }
+        }
+    }
+
+    /// Name of the array-lengths struct member that holds all the array lengths.
+    static constexpr std::string_view kArrayLengthsMemberName = "array_lengths";
+
     /// The source program
     const Program& src;
-    /// The transform inputs
-    const DataMap& inputs;
     /// The transform outputs
     DataMap& outputs;
+    /// The transform config
+    const Config* const cfg;
     /// The target program builder
     ProgramBuilder b;
     /// The clone context
     program::CloneContext ctx = {&b, &src, /* auto_clone_symbols */ true};
-
-    /// Iterate over all arrayLength() builtins that operate on
-    /// storage buffer variables.
-    /// @param functor of type void(const CallExpression*, const
-    /// sem::VariableUser, const sem::GlobalVariable*). It takes in an
-    /// CallExpression of the arrayLength call expression node, a
-    /// sem::VariableUser of the used storage buffer variable, and the
-    /// sem::GlobalVariable for the storage buffer.
-    template <typename F>
-    void IterateArrayLengthOnStorageVar(F&& functor) {
-        auto& sem = src.Sem();
-
-        // Find all calls to the arrayLength() builtin.
-        for (auto* node : src.ASTNodes().Objects()) {
-            auto* call_expr = node->As<CallExpression>();
-            if (!call_expr) {
-                continue;
-            }
-
-            auto* call = sem.Get(call_expr)->UnwrapMaterialize()->As<sem::Call>();
-            auto* builtin = call->Target()->As<sem::BuiltinFn>();
-            if (!builtin || builtin->Fn() != wgsl::BuiltinFn::kArrayLength) {
-                continue;
-            }
-
-            if (auto* call_stmt = call->Stmt()->Declaration()->As<CallStatement>()) {
-                if (call_stmt->expr == call_expr) {
-                    // arrayLength() is used as a statement.
-                    // The argument expression must be side-effect free, so just drop the statement.
-                    RemoveStatement(ctx, call_stmt);
-                    continue;
-                }
-            }
-
-            // Get the storage buffer that contains the runtime array.
-            // Since we require SimplifyPointers, we can assume that the arrayLength()
-            // call has one of two forms:
-            //   arrayLength(&struct_var.array_member)
-            //   arrayLength(&array_var)
-            auto* param = call_expr->args[0]->As<UnaryOpExpression>();
-            if (TINT_UNLIKELY(!param || param->op != core::UnaryOp::kAddressOf)) {
-                TINT_ICE() << "expected form of arrayLength argument to be &array_var or "
-                              "&struct_var.array_member";
-                break;
-            }
-            auto* storage_buffer_expr = param->expr;
-            if (auto* accessor = param->expr->As<MemberAccessorExpression>()) {
-                storage_buffer_expr = accessor->object;
-            }
-            auto* storage_buffer_sem = sem.Get<sem::VariableUser>(storage_buffer_expr);
-            if (TINT_UNLIKELY(!storage_buffer_sem)) {
-                TINT_ICE() << "expected form of arrayLength argument to be &array_var or "
-                              "&struct_var.array_member";
-                break;
-            }
-
-            // Get the index to use for the buffer size array.
-            auto* var = tint::As<sem::GlobalVariable>(storage_buffer_sem->Variable());
-            if (TINT_UNLIKELY(!var)) {
-                TINT_ICE() << "storage buffer is not a global variable";
-                break;
-            }
-            functor(call_expr, storage_buffer_sem, var);
-        }
-    }
+    /// Alias to src.Sem()
+    const sem::Info& sem = src.Sem();
+    /// Name of the uniform buffer variable that holds the array lengths
+    Symbol array_lengths_var;
+    /// A map of pointer-parameter to the name of the new array-length parameter.
+    Hashmap<const sem::Parameter*, Symbol, 8> param_lengths;
+    /// Indices into the uniform buffer array indices that are statically used.
+    std::unordered_set<uint32_t> used_size_indices;
+    /// A vector of array-length parameters which need corresponding array-length arguments for all
+    /// callsites.
+    UniqueVector<const sem::Parameter*, 8> len_params_needing_args;
 };
 
 Transform::ApplyResult ArrayLengthFromUniform::Apply(const Program& src,
diff --git a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform_test.cc b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform_test.cc
index 2a9c6ac..47aedb5 100644
--- a/src/tint/lang/wgsl/ast/transform/array_length_from_uniform_test.cc
+++ b/src/tint/lang/wgsl/ast/transform/array_length_from_uniform_test.cc
@@ -130,17 +130,17 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 @group(0) @binding(0) var<storage, read> sb : array<i32>;
 
 @compute @workgroup_size(1)
 fn main() {
-  var len : u32 = (tint_symbol_1.buffer_size[0u][0u] / 4u);
+  var len : u32 = (tint_array_lengths.array_lengths[0u][0u] / 4u);
 }
 )";
 
@@ -174,11 +174,11 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 struct SB {
   x : i32,
@@ -189,7 +189,7 @@
 
 @compute @workgroup_size(1)
 fn main() {
-  var len : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
+  var len : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
 }
 )";
 
@@ -225,11 +225,11 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 struct SB {
   x : i32,
@@ -240,7 +240,7 @@
 
 @compute @workgroup_size(1)
 fn main() {
-  var len : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
+  var len : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
 }
 )";
 
@@ -290,11 +290,11 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 2u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 2u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 struct SB1 {
   x : i32,
@@ -323,21 +323,21 @@
 
 @compute @workgroup_size(1)
 fn main() {
-  var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
-  var len2 : u32 = ((tint_symbol_1.buffer_size[0u][1u] - 16u) / 16u);
-  var len3 : u32 = (tint_symbol_1.buffer_size[0u][2u] / 16u);
-  var len4 : u32 = ((tint_symbol_1.buffer_size[0u][3u] - 16u) / 16u);
-  var len5 : u32 = (tint_symbol_1.buffer_size[1u][0u] / 16u);
+  var len1 : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
+  var len2 : u32 = ((tint_array_lengths.array_lengths[0u][1u] - 16u) / 16u);
+  var len3 : u32 = (tint_array_lengths.array_lengths[0u][2u] / 16u);
+  var len4 : u32 = ((tint_array_lengths.array_lengths[0u][3u] - 16u) / 16u);
+  var len5 : u32 = (tint_array_lengths.array_lengths[1u][0u] / 16u);
   var x : u32 = ((((len1 + len2) + len3) + len4) + len5);
 }
 )";
 
     ArrayLengthFromUniform::Config cfg({0, 30u});
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{0, 2u}, 0);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{1u, 2u}, 1);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{2u, 2u}, 2);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{3u, 2u}, 3);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{4u, 2u}, 4);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{0, 2}, 0);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{1u, 2}, 1);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{2u, 2}, 2);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{3u, 2}, 3);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{4u, 2}, 4);
 
     DataMap data;
     data.Add<ArrayLengthFromUniform::Config>(std::move(cfg));
@@ -379,11 +379,11 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 struct SB1 {
   x : i32,
@@ -412,18 +412,18 @@
 
 @compute @workgroup_size(1)
 fn main() {
-  var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
-  var len3 : u32 = (tint_symbol_1.buffer_size[0u][2u] / 16u);
+  var len1 : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
+  var len3 : u32 = (tint_array_lengths.array_lengths[0u][2u] / 16u);
   var x : u32 = (len1 + len3);
 }
 )";
 
     ArrayLengthFromUniform::Config cfg({0, 30u});
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{0, 2u}, 0);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{1u, 2u}, 1);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{2u, 2u}, 2);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{3u, 2u}, 3);
-    cfg.bindpoint_to_size_index.emplace(BindingPoint{4u, 2u}, 4);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{0, 2}, 0);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{1u, 2}, 1);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{2u, 2}, 2);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{3u, 2}, 3);
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{4u, 2}, 4);
 
     DataMap data;
     data.Add<ArrayLengthFromUniform::Config>(std::move(cfg));
@@ -486,12 +486,13 @@
 }
 )";
 
-    auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+    auto* expect =
+        R"(
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 struct SB1 {
   x : i32,
@@ -509,7 +510,7 @@
 
 @compute @workgroup_size(1)
 fn main() {
-  var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
+  var len1 : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
   var len2 : u32 = arrayLength(&(sb2.arr2));
   var x : u32 = (len1 + len2);
 }
@@ -544,15 +545,15 @@
 )";
 
     auto* expect = R"(
-struct tint_symbol {
-  buffer_size : array<vec4<u32>, 1u>,
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
 }
 
-@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
 
 @compute @workgroup_size(1)
 fn main() {
-  var len : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
+  var len : u32 = ((tint_array_lengths.array_lengths[0u][0u] - 4u) / 4u);
 }
 
 @group(0) @binding(0) var<storage, read> sb : SB;
@@ -576,5 +577,133 @@
               got.data.Get<ArrayLengthFromUniform::Result>()->used_size_indices);
 }
 
+TEST_F(ArrayLengthFromUniformTest, PtrParam_SingleUse) {
+    auto* src = R"(
+@binding(0) @group(0) var<storage, read_write> arr : array<u32>;
+
+fn f2(p : ptr<storage, array<u32>, read_write>) -> u32 {
+  return arrayLength(p);
+}
+
+fn f1(p : ptr<storage, array<u32>, read_write>) -> u32 {
+  return f2(p);
+}
+
+fn f0(p : ptr<storage, array<u32>, read_write>) -> u32 {
+  return f1(p);
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  arr[0] = f0(&arr);
+}
+)";
+
+    auto* expect =
+        R"(
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 1u>,
+}
+
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
+
+@binding(0) @group(0) var<storage, read_write> arr : array<u32>;
+
+fn f2(p : ptr<storage, array<u32>, read_write>, p_length : u32) -> u32 {
+  return p_length;
+}
+
+fn f1(p : ptr<storage, array<u32>, read_write>, p_length_1 : u32) -> u32 {
+  return f2(p, p_length_1);
+}
+
+fn f0(p : ptr<storage, array<u32>, read_write>, p_length_2 : u32) -> u32 {
+  return f1(p, p_length_2);
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  arr[0] = f0(&(arr), (tint_array_lengths.array_lengths[0u][3u] / 4u));
+}
+)";
+
+    ArrayLengthFromUniform::Config cfg({0, 30u});
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{0, 0}, 3);
+
+    DataMap data;
+    data.Add<ArrayLengthFromUniform::Config>(std::move(cfg));
+
+    auto got = Run<Unshadow, SimplifyPointers, ArrayLengthFromUniform>(src, data);
+
+    EXPECT_EQ(expect, str(got));
+    EXPECT_EQ(std::unordered_set<uint32_t>({3}),
+              got.data.Get<ArrayLengthFromUniform::Result>()->used_size_indices);
+}
+
+TEST_F(ArrayLengthFromUniformTest, MissingBindingPoint_PtrParam_MultipleUse) {
+    auto* src = R"(
+@binding(0) @group(0) var<storage, read_write> arr_a : array<u32>;
+@binding(0) @group(1) var<storage, read_write> arr_b : array<u32>;
+
+fn f2(p2 : ptr<storage, array<u32>, read_write>) -> u32 {
+  return arrayLength(p2);
+}
+
+fn f1(p1 : ptr<storage, array<u32>, read_write>) -> u32 {
+  return f2(p1) + arrayLength(p1);
+}
+
+fn f0(p0 : ptr<storage, array<u32>, read_write>) -> u32 {
+  return f1(p0) + arrayLength(p0);
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  arr_a[0] = f0(&arr_a) + arrayLength(&arr_a);
+  arr_b[0] = f0(&arr_b) + arrayLength(&arr_b);
+}
+)";
+
+    auto* expect = R"(
+struct TintArrayLengths {
+  array_lengths : array<vec4<u32>, 2u>,
+}
+
+@group(0) @binding(30) var<uniform> tint_array_lengths : TintArrayLengths;
+
+@binding(0) @group(0) var<storage, read_write> arr_a : array<u32>;
+
+@binding(0) @group(1) var<storage, read_write> arr_b : array<u32>;
+
+fn f2(p2 : ptr<storage, array<u32>, read_write>, p2_length : u32) -> u32 {
+  return p2_length;
+}
+
+fn f1(p1 : ptr<storage, array<u32>, read_write>, p1_length : u32) -> u32 {
+  return (f2(p1, p1_length) + p1_length);
+}
+
+fn f0(p0 : ptr<storage, array<u32>, read_write>, p0_length : u32) -> u32 {
+  return (f1(p0, p0_length) + p0_length);
+}
+
+@compute @workgroup_size(1)
+fn main() {
+  arr_a[0] = (f0(&(arr_a), arrayLength(&(arr_a))) + arrayLength(&(arr_a)));
+  arr_b[0] = (f0(&(arr_b), (tint_array_lengths.array_lengths[1u][1u] / 4u)) + (tint_array_lengths.array_lengths[1u][1u] / 4u));
+}
+)";
+
+    ArrayLengthFromUniform::Config cfg({0, 30u});
+    cfg.bindpoint_to_size_index.emplace(BindingPoint{1, 0}, 5);
+
+    DataMap data;
+    data.Add<ArrayLengthFromUniform::Config>(std::move(cfg));
+
+    auto got = Run<Unshadow, SimplifyPointers, ArrayLengthFromUniform>(src, data);
+
+    EXPECT_EQ(expect, str(got));
+}
+
 }  // namespace
 }  // namespace tint::ast::transform
diff --git a/src/tint/lang/wgsl/intrinsic/data.cc b/src/tint/lang/wgsl/intrinsic/data.cc
index 3a84f91..77641d2 100644
--- a/src/tint/lang/wgsl/intrinsic/data.cc
+++ b/src/tint/lang/wgsl/intrinsic/data.cc
@@ -1892,234 +1892,175 @@
   /* [88] */ MatcherIndex(0),
   /* [89] */ MatcherIndex(1),
   /* [90] */ MatcherIndex(42),
-  /* [91] */ MatcherIndex(4),
-  /* [92] */ MatcherIndex(10),
+  /* [91] */ MatcherIndex(1),
+  /* [92] */ MatcherIndex(2),
   /* [93] */ MatcherIndex(43),
-  /* [94] */ MatcherIndex(4),
-  /* [95] */ MatcherIndex(10),
+  /* [94] */ MatcherIndex(1),
+  /* [95] */ MatcherIndex(2),
   /* [96] */ MatcherIndex(44),
-  /* [97] */ MatcherIndex(4),
-  /* [98] */ MatcherIndex(10),
+  /* [97] */ MatcherIndex(1),
+  /* [98] */ MatcherIndex(2),
   /* [99] */ MatcherIndex(45),
-  /* [100] */ MatcherIndex(4),
-  /* [101] */ MatcherIndex(10),
-  /* [102] */ MatcherIndex(42),
-  /* [103] */ MatcherIndex(5),
-  /* [104] */ MatcherIndex(10),
-  /* [105] */ MatcherIndex(43),
-  /* [106] */ MatcherIndex(5),
-  /* [107] */ MatcherIndex(10),
-  /* [108] */ MatcherIndex(44),
-  /* [109] */ MatcherIndex(5),
-  /* [110] */ MatcherIndex(10),
-  /* [111] */ MatcherIndex(45),
-  /* [112] */ MatcherIndex(5),
+  /* [100] */ MatcherIndex(1),
+  /* [101] */ MatcherIndex(2),
+  /* [102] */ MatcherIndex(23),
+  /* [103] */ MatcherIndex(2),
+  /* [104] */ MatcherIndex(0),
+  /* [105] */ MatcherIndex(23),
+  /* [106] */ MatcherIndex(1),
+  /* [107] */ MatcherIndex(4),
+  /* [108] */ MatcherIndex(11),
+  /* [109] */ MatcherIndex(10),
+  /* [110] */ MatcherIndex(11),
+  /* [111] */ MatcherIndex(68),
+  /* [112] */ MatcherIndex(13),
   /* [113] */ MatcherIndex(10),
-  /* [114] */ MatcherIndex(42),
-  /* [115] */ MatcherIndex(6),
-  /* [116] */ MatcherIndex(10),
-  /* [117] */ MatcherIndex(43),
-  /* [118] */ MatcherIndex(6),
-  /* [119] */ MatcherIndex(10),
-  /* [120] */ MatcherIndex(44),
-  /* [121] */ MatcherIndex(6),
-  /* [122] */ MatcherIndex(10),
-  /* [123] */ MatcherIndex(45),
-  /* [124] */ MatcherIndex(6),
-  /* [125] */ MatcherIndex(10),
-  /* [126] */ MatcherIndex(42),
-  /* [127] */ MatcherIndex(4),
-  /* [128] */ MatcherIndex(9),
-  /* [129] */ MatcherIndex(42),
-  /* [130] */ MatcherIndex(5),
-  /* [131] */ MatcherIndex(9),
-  /* [132] */ MatcherIndex(42),
-  /* [133] */ MatcherIndex(6),
-  /* [134] */ MatcherIndex(9),
-  /* [135] */ MatcherIndex(43),
-  /* [136] */ MatcherIndex(4),
-  /* [137] */ MatcherIndex(9),
-  /* [138] */ MatcherIndex(43),
-  /* [139] */ MatcherIndex(5),
-  /* [140] */ MatcherIndex(9),
-  /* [141] */ MatcherIndex(43),
-  /* [142] */ MatcherIndex(6),
-  /* [143] */ MatcherIndex(9),
-  /* [144] */ MatcherIndex(44),
-  /* [145] */ MatcherIndex(4),
-  /* [146] */ MatcherIndex(9),
-  /* [147] */ MatcherIndex(44),
-  /* [148] */ MatcherIndex(5),
-  /* [149] */ MatcherIndex(9),
-  /* [150] */ MatcherIndex(44),
-  /* [151] */ MatcherIndex(6),
-  /* [152] */ MatcherIndex(9),
-  /* [153] */ MatcherIndex(45),
-  /* [154] */ MatcherIndex(4),
+  /* [114] */ MatcherIndex(11),
+  /* [115] */ MatcherIndex(1),
+  /* [116] */ MatcherIndex(12),
+  /* [117] */ MatcherIndex(0),
+  /* [118] */ MatcherIndex(50),
+  /* [119] */ MatcherIndex(0),
+  /* [120] */ MatcherIndex(48),
+  /* [121] */ MatcherIndex(0),
+  /* [122] */ MatcherIndex(11),
+  /* [123] */ MatcherIndex(9),
+  /* [124] */ MatcherIndex(13),
+  /* [125] */ MatcherIndex(9),
+  /* [126] */ MatcherIndex(13),
+  /* [127] */ MatcherIndex(7),
+  /* [128] */ MatcherIndex(13),
+  /* [129] */ MatcherIndex(8),
+  /* [130] */ MatcherIndex(30),
+  /* [131] */ MatcherIndex(0),
+  /* [132] */ MatcherIndex(11),
+  /* [133] */ MatcherIndex(8),
+  /* [134] */ MatcherIndex(31),
+  /* [135] */ MatcherIndex(0),
+  /* [136] */ MatcherIndex(32),
+  /* [137] */ MatcherIndex(0),
+  /* [138] */ MatcherIndex(12),
+  /* [139] */ MatcherIndex(8),
+  /* [140] */ MatcherIndex(33),
+  /* [141] */ MatcherIndex(0),
+  /* [142] */ MatcherIndex(34),
+  /* [143] */ MatcherIndex(0),
+  /* [144] */ MatcherIndex(35),
+  /* [145] */ MatcherIndex(0),
+  /* [146] */ MatcherIndex(36),
+  /* [147] */ MatcherIndex(0),
+  /* [148] */ MatcherIndex(13),
+  /* [149] */ MatcherIndex(0),
+  /* [150] */ MatcherIndex(11),
+  /* [151] */ MatcherIndex(7),
+  /* [152] */ MatcherIndex(12),
+  /* [153] */ MatcherIndex(9),
+  /* [154] */ MatcherIndex(30),
   /* [155] */ MatcherIndex(9),
-  /* [156] */ MatcherIndex(45),
-  /* [157] */ MatcherIndex(5),
-  /* [158] */ MatcherIndex(9),
-  /* [159] */ MatcherIndex(45),
-  /* [160] */ MatcherIndex(6),
+  /* [156] */ MatcherIndex(31),
+  /* [157] */ MatcherIndex(9),
+  /* [158] */ MatcherIndex(32),
+  /* [159] */ MatcherIndex(9),
+  /* [160] */ MatcherIndex(33),
   /* [161] */ MatcherIndex(9),
-  /* [162] */ MatcherIndex(23),
-  /* [163] */ MatcherIndex(2),
-  /* [164] */ MatcherIndex(0),
-  /* [165] */ MatcherIndex(23),
-  /* [166] */ MatcherIndex(1),
-  /* [167] */ MatcherIndex(4),
+  /* [162] */ MatcherIndex(12),
+  /* [163] */ MatcherIndex(7),
+  /* [164] */ MatcherIndex(34),
+  /* [165] */ MatcherIndex(9),
+  /* [166] */ MatcherIndex(35),
+  /* [167] */ MatcherIndex(9),
   /* [168] */ MatcherIndex(11),
-  /* [169] */ MatcherIndex(10),
-  /* [170] */ MatcherIndex(11),
-  /* [171] */ MatcherIndex(68),
-  /* [172] */ MatcherIndex(13),
-  /* [173] */ MatcherIndex(10),
+  /* [169] */ MatcherIndex(0),
+  /* [170] */ MatcherIndex(12),
+  /* [171] */ MatcherIndex(1),
+  /* [172] */ MatcherIndex(52),
+  /* [173] */ MatcherIndex(0),
   /* [174] */ MatcherIndex(11),
-  /* [175] */ MatcherIndex(1),
+  /* [175] */ MatcherIndex(5),
   /* [176] */ MatcherIndex(12),
-  /* [177] */ MatcherIndex(0),
-  /* [178] */ MatcherIndex(50),
-  /* [179] */ MatcherIndex(0),
-  /* [180] */ MatcherIndex(48),
-  /* [181] */ MatcherIndex(0),
-  /* [182] */ MatcherIndex(11),
+  /* [177] */ MatcherIndex(5),
+  /* [178] */ MatcherIndex(13),
+  /* [179] */ MatcherIndex(5),
+  /* [180] */ MatcherIndex(13),
+  /* [181] */ MatcherIndex(1),
+  /* [182] */ MatcherIndex(14),
   /* [183] */ MatcherIndex(9),
-  /* [184] */ MatcherIndex(13),
-  /* [185] */ MatcherIndex(9),
-  /* [186] */ MatcherIndex(13),
-  /* [187] */ MatcherIndex(7),
-  /* [188] */ MatcherIndex(13),
-  /* [189] */ MatcherIndex(8),
-  /* [190] */ MatcherIndex(30),
-  /* [191] */ MatcherIndex(0),
-  /* [192] */ MatcherIndex(11),
-  /* [193] */ MatcherIndex(8),
-  /* [194] */ MatcherIndex(31),
-  /* [195] */ MatcherIndex(0),
-  /* [196] */ MatcherIndex(32),
-  /* [197] */ MatcherIndex(0),
-  /* [198] */ MatcherIndex(12),
-  /* [199] */ MatcherIndex(8),
-  /* [200] */ MatcherIndex(33),
-  /* [201] */ MatcherIndex(0),
-  /* [202] */ MatcherIndex(34),
-  /* [203] */ MatcherIndex(0),
-  /* [204] */ MatcherIndex(35),
+  /* [184] */ MatcherIndex(14),
+  /* [185] */ MatcherIndex(10),
+  /* [186] */ MatcherIndex(15),
+  /* [187] */ MatcherIndex(0),
+  /* [188] */ MatcherIndex(15),
+  /* [189] */ MatcherIndex(9),
+  /* [190] */ MatcherIndex(15),
+  /* [191] */ MatcherIndex(10),
+  /* [192] */ MatcherIndex(16),
+  /* [193] */ MatcherIndex(0),
+  /* [194] */ MatcherIndex(16),
+  /* [195] */ MatcherIndex(9),
+  /* [196] */ MatcherIndex(16),
+  /* [197] */ MatcherIndex(10),
+  /* [198] */ MatcherIndex(17),
+  /* [199] */ MatcherIndex(0),
+  /* [200] */ MatcherIndex(17),
+  /* [201] */ MatcherIndex(9),
+  /* [202] */ MatcherIndex(17),
+  /* [203] */ MatcherIndex(10),
+  /* [204] */ MatcherIndex(18),
   /* [205] */ MatcherIndex(0),
-  /* [206] */ MatcherIndex(36),
-  /* [207] */ MatcherIndex(0),
-  /* [208] */ MatcherIndex(13),
-  /* [209] */ MatcherIndex(0),
-  /* [210] */ MatcherIndex(11),
-  /* [211] */ MatcherIndex(7),
-  /* [212] */ MatcherIndex(12),
+  /* [206] */ MatcherIndex(18),
+  /* [207] */ MatcherIndex(9),
+  /* [208] */ MatcherIndex(18),
+  /* [209] */ MatcherIndex(10),
+  /* [210] */ MatcherIndex(19),
+  /* [211] */ MatcherIndex(0),
+  /* [212] */ MatcherIndex(19),
   /* [213] */ MatcherIndex(9),
-  /* [214] */ MatcherIndex(30),
-  /* [215] */ MatcherIndex(9),
-  /* [216] */ MatcherIndex(31),
-  /* [217] */ MatcherIndex(9),
-  /* [218] */ MatcherIndex(32),
+  /* [214] */ MatcherIndex(19),
+  /* [215] */ MatcherIndex(10),
+  /* [216] */ MatcherIndex(20),
+  /* [217] */ MatcherIndex(0),
+  /* [218] */ MatcherIndex(20),
   /* [219] */ MatcherIndex(9),
-  /* [220] */ MatcherIndex(33),
-  /* [221] */ MatcherIndex(9),
-  /* [222] */ MatcherIndex(12),
-  /* [223] */ MatcherIndex(7),
-  /* [224] */ MatcherIndex(34),
+  /* [220] */ MatcherIndex(20),
+  /* [221] */ MatcherIndex(10),
+  /* [222] */ MatcherIndex(21),
+  /* [223] */ MatcherIndex(0),
+  /* [224] */ MatcherIndex(21),
   /* [225] */ MatcherIndex(9),
-  /* [226] */ MatcherIndex(35),
-  /* [227] */ MatcherIndex(9),
-  /* [228] */ MatcherIndex(11),
+  /* [226] */ MatcherIndex(21),
+  /* [227] */ MatcherIndex(10),
+  /* [228] */ MatcherIndex(22),
   /* [229] */ MatcherIndex(0),
-  /* [230] */ MatcherIndex(12),
-  /* [231] */ MatcherIndex(1),
-  /* [232] */ MatcherIndex(52),
-  /* [233] */ MatcherIndex(0),
-  /* [234] */ MatcherIndex(11),
-  /* [235] */ MatcherIndex(5),
-  /* [236] */ MatcherIndex(12),
-  /* [237] */ MatcherIndex(5),
-  /* [238] */ MatcherIndex(13),
-  /* [239] */ MatcherIndex(5),
-  /* [240] */ MatcherIndex(13),
-  /* [241] */ MatcherIndex(1),
-  /* [242] */ MatcherIndex(14),
-  /* [243] */ MatcherIndex(9),
-  /* [244] */ MatcherIndex(14),
-  /* [245] */ MatcherIndex(10),
-  /* [246] */ MatcherIndex(15),
-  /* [247] */ MatcherIndex(0),
-  /* [248] */ MatcherIndex(15),
-  /* [249] */ MatcherIndex(9),
-  /* [250] */ MatcherIndex(15),
-  /* [251] */ MatcherIndex(10),
-  /* [252] */ MatcherIndex(16),
-  /* [253] */ MatcherIndex(0),
-  /* [254] */ MatcherIndex(16),
-  /* [255] */ MatcherIndex(9),
-  /* [256] */ MatcherIndex(16),
-  /* [257] */ MatcherIndex(10),
-  /* [258] */ MatcherIndex(17),
-  /* [259] */ MatcherIndex(0),
-  /* [260] */ MatcherIndex(17),
-  /* [261] */ MatcherIndex(9),
-  /* [262] */ MatcherIndex(17),
-  /* [263] */ MatcherIndex(10),
-  /* [264] */ MatcherIndex(18),
-  /* [265] */ MatcherIndex(0),
-  /* [266] */ MatcherIndex(18),
-  /* [267] */ MatcherIndex(9),
-  /* [268] */ MatcherIndex(18),
-  /* [269] */ MatcherIndex(10),
-  /* [270] */ MatcherIndex(19),
-  /* [271] */ MatcherIndex(0),
-  /* [272] */ MatcherIndex(19),
-  /* [273] */ MatcherIndex(9),
-  /* [274] */ MatcherIndex(19),
-  /* [275] */ MatcherIndex(10),
-  /* [276] */ MatcherIndex(20),
-  /* [277] */ MatcherIndex(0),
-  /* [278] */ MatcherIndex(20),
-  /* [279] */ MatcherIndex(9),
-  /* [280] */ MatcherIndex(20),
-  /* [281] */ MatcherIndex(10),
-  /* [282] */ MatcherIndex(21),
-  /* [283] */ MatcherIndex(0),
-  /* [284] */ MatcherIndex(21),
-  /* [285] */ MatcherIndex(9),
-  /* [286] */ MatcherIndex(21),
-  /* [287] */ MatcherIndex(10),
-  /* [288] */ MatcherIndex(22),
-  /* [289] */ MatcherIndex(0),
-  /* [290] */ MatcherIndex(22),
-  /* [291] */ MatcherIndex(9),
-  /* [292] */ MatcherIndex(22),
-  /* [293] */ MatcherIndex(10),
-  /* [294] */ MatcherIndex(47),
-  /* [295] */ MatcherIndex(0),
-  /* [296] */ MatcherIndex(60),
-  /* [297] */ MatcherIndex(64),
-  /* [298] */ MatcherIndex(72),
-  /* [299] */ MatcherIndex(66),
-  /* [300] */ MatcherIndex(53),
-  /* [301] */ MatcherIndex(61),
-  /* [302] */ MatcherIndex(37),
-  /* [303] */ MatcherIndex(38),
-  /* [304] */ MatcherIndex(39),
-  /* [305] */ MatcherIndex(40),
-  /* [306] */ MatcherIndex(41),
-  /* [307] */ MatcherIndex(46),
-  /* [308] */ MatcherIndex(28),
-  /* [309] */ MatcherIndex(29),
-  /* [310] */ MatcherIndex(67),
-  /* [311] */ MatcherIndex(65),
-  /* [312] */ MatcherIndex(57),
-  /* [313] */ MatcherIndex(58),
-  /* [314] */ MatcherIndex(55),
-  /* [315] */ MatcherIndex(56),
-  /* [316] */ MatcherIndex(59),
-  /* [317] */ MatcherIndex(54),
-  /* [318] */ MatcherIndex(71),
+  /* [230] */ MatcherIndex(22),
+  /* [231] */ MatcherIndex(9),
+  /* [232] */ MatcherIndex(22),
+  /* [233] */ MatcherIndex(10),
+  /* [234] */ MatcherIndex(47),
+  /* [235] */ MatcherIndex(0),
+  /* [236] */ MatcherIndex(60),
+  /* [237] */ MatcherIndex(64),
+  /* [238] */ MatcherIndex(72),
+  /* [239] */ MatcherIndex(66),
+  /* [240] */ MatcherIndex(53),
+  /* [241] */ MatcherIndex(61),
+  /* [242] */ MatcherIndex(37),
+  /* [243] */ MatcherIndex(38),
+  /* [244] */ MatcherIndex(39),
+  /* [245] */ MatcherIndex(40),
+  /* [246] */ MatcherIndex(41),
+  /* [247] */ MatcherIndex(46),
+  /* [248] */ MatcherIndex(28),
+  /* [249] */ MatcherIndex(29),
+  /* [250] */ MatcherIndex(6),
+  /* [251] */ MatcherIndex(67),
+  /* [252] */ MatcherIndex(65),
+  /* [253] */ MatcherIndex(57),
+  /* [254] */ MatcherIndex(58),
+  /* [255] */ MatcherIndex(55),
+  /* [256] */ MatcherIndex(56),
+  /* [257] */ MatcherIndex(59),
+  /* [258] */ MatcherIndex(54),
+  /* [259] */ MatcherIndex(71),
 };
 
 static_assert(MatcherIndicesIndex::CanIndex(kMatcherIndices),
@@ -2224,17 +2165,17 @@
   {
     /* [19] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(218),
+    /* matcher_indices */ MatcherIndicesIndex(158),
   },
   {
     /* [20] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [21] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [22] */
@@ -2244,17 +2185,17 @@
   {
     /* [23] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [24] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [25] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [26] */
@@ -2264,17 +2205,17 @@
   {
     /* [27] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(196),
+    /* matcher_indices */ MatcherIndicesIndex(136),
   },
   {
     /* [28] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [29] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [30] */
@@ -2284,22 +2225,22 @@
   {
     /* [31] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [32] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(303),
+    /* matcher_indices */ MatcherIndicesIndex(243),
   },
   {
     /* [33] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(309),
+    /* matcher_indices */ MatcherIndicesIndex(249),
   },
   {
     /* [34] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [35] */
@@ -2314,22 +2255,22 @@
   {
     /* [37] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [38] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(218),
+    /* matcher_indices */ MatcherIndicesIndex(158),
   },
   {
     /* [39] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [40] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [41] */
@@ -2344,82 +2285,82 @@
   {
     /* [43] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [44] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(216),
+    /* matcher_indices */ MatcherIndicesIndex(156),
   },
   {
     /* [45] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [46] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [47] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [48] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [49] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [50] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(220),
+    /* matcher_indices */ MatcherIndicesIndex(160),
   },
   {
     /* [51] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [52] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [53] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [54] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [55] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(222),
+    /* matcher_indices */ MatcherIndicesIndex(162),
   },
   {
     /* [56] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(226),
+    /* matcher_indices */ MatcherIndicesIndex(166),
   },
   {
     /* [57] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [58] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [59] */
@@ -2429,27 +2370,27 @@
   {
     /* [60] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [61] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [62] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(218),
+    /* matcher_indices */ MatcherIndicesIndex(158),
   },
   {
     /* [63] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [64] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [65] */
@@ -2464,22 +2405,22 @@
   {
     /* [67] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [68] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(303),
+    /* matcher_indices */ MatcherIndicesIndex(243),
   },
   {
     /* [69] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [70] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [71] */
@@ -2494,7 +2435,7 @@
   {
     /* [73] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [74] */
@@ -2504,22 +2445,22 @@
   {
     /* [75] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(194),
+    /* matcher_indices */ MatcherIndicesIndex(134),
   },
   {
     /* [76] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [77] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [78] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [79] */
@@ -2529,17 +2470,17 @@
   {
     /* [80] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(204),
+    /* matcher_indices */ MatcherIndicesIndex(144),
   },
   {
     /* [81] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [82] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [83] */
@@ -2549,17 +2490,17 @@
   {
     /* [84] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(303),
+    /* matcher_indices */ MatcherIndicesIndex(243),
   },
   {
     /* [85] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [86] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [87] */
@@ -2569,22 +2510,22 @@
   {
     /* [88] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [89] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(302),
+    /* matcher_indices */ MatcherIndicesIndex(242),
   },
   {
     /* [90] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(309),
+    /* matcher_indices */ MatcherIndicesIndex(249),
   },
   {
     /* [91] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [92] */
@@ -2594,22 +2535,22 @@
   {
     /* [93] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [94] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(305),
+    /* matcher_indices */ MatcherIndicesIndex(245),
   },
   {
     /* [95] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(309),
+    /* matcher_indices */ MatcherIndicesIndex(249),
   },
   {
     /* [96] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [97] */
@@ -2624,17 +2565,17 @@
   {
     /* [99] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(218),
+    /* matcher_indices */ MatcherIndicesIndex(158),
   },
   {
     /* [100] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [101] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [102] */
@@ -2644,22 +2585,22 @@
   {
     /* [103] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [104] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(216),
+    /* matcher_indices */ MatcherIndicesIndex(156),
   },
   {
     /* [105] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [106] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [107] */
@@ -2669,22 +2610,22 @@
   {
     /* [108] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [109] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(220),
+    /* matcher_indices */ MatcherIndicesIndex(160),
   },
   {
     /* [110] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [111] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [112] */
@@ -2694,22 +2635,22 @@
   {
     /* [113] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(222),
+    /* matcher_indices */ MatcherIndicesIndex(162),
   },
   {
     /* [114] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(226),
+    /* matcher_indices */ MatcherIndicesIndex(166),
   },
   {
     /* [115] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [116] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [117] */
@@ -2724,42 +2665,42 @@
   {
     /* [119] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(224),
+    /* matcher_indices */ MatcherIndicesIndex(164),
   },
   {
     /* [120] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [121] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [122] */
     /* usage */ core::ParameterUsage::kDdx,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [123] */
     /* usage */ core::ParameterUsage::kDdy,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [124] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(216),
+    /* matcher_indices */ MatcherIndicesIndex(156),
   },
   {
     /* [125] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [126] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [127] */
@@ -2769,22 +2710,22 @@
   {
     /* [128] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [129] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(220),
+    /* matcher_indices */ MatcherIndicesIndex(160),
   },
   {
     /* [130] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [131] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [132] */
@@ -2794,22 +2735,22 @@
   {
     /* [133] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(222),
+    /* matcher_indices */ MatcherIndicesIndex(162),
   },
   {
     /* [134] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(226),
+    /* matcher_indices */ MatcherIndicesIndex(166),
   },
   {
     /* [135] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [136] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [137] */
@@ -2824,17 +2765,17 @@
   {
     /* [139] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(302),
+    /* matcher_indices */ MatcherIndicesIndex(242),
   },
   {
     /* [140] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [141] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [142] */
@@ -2844,22 +2785,22 @@
   {
     /* [143] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [144] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(305),
+    /* matcher_indices */ MatcherIndicesIndex(245),
   },
   {
     /* [145] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [146] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [147] */
@@ -2899,52 +2840,52 @@
   {
     /* [154] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(202),
+    /* matcher_indices */ MatcherIndicesIndex(142),
   },
   {
     /* [155] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [156] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [157] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(302),
+    /* matcher_indices */ MatcherIndicesIndex(242),
   },
   {
     /* [158] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [159] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [160] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [161] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(304),
+    /* matcher_indices */ MatcherIndicesIndex(244),
   },
   {
     /* [162] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(309),
+    /* matcher_indices */ MatcherIndicesIndex(249),
   },
   {
     /* [163] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [164] */
@@ -2954,57 +2895,57 @@
   {
     /* [165] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(216),
+    /* matcher_indices */ MatcherIndicesIndex(156),
   },
   {
     /* [166] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [167] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [168] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(210),
+    /* matcher_indices */ MatcherIndicesIndex(150),
   },
   {
     /* [169] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(220),
+    /* matcher_indices */ MatcherIndicesIndex(160),
   },
   {
     /* [170] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [171] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [172] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(222),
+    /* matcher_indices */ MatcherIndicesIndex(162),
   },
   {
     /* [173] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(224),
+    /* matcher_indices */ MatcherIndicesIndex(164),
   },
   {
     /* [174] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [175] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [176] */
@@ -3014,17 +2955,17 @@
   {
     /* [177] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(224),
+    /* matcher_indices */ MatcherIndicesIndex(164),
   },
   {
     /* [178] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [179] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [180] */
@@ -3034,17 +2975,17 @@
   {
     /* [181] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(304),
+    /* matcher_indices */ MatcherIndicesIndex(244),
   },
   {
     /* [182] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [183] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(212),
+    /* matcher_indices */ MatcherIndicesIndex(152),
   },
   {
     /* [184] */
@@ -3059,67 +3000,67 @@
   {
     /* [186] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [187] */
     /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(32),
   },
   {
     /* [188] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(184),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [189] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(108),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [190] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [191] */
     /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(32),
   },
   {
     /* [192] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(186),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
     /* [193] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(96),
   },
   {
     /* [194] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [195] */
     /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* matcher_indices */ MatcherIndicesIndex(32),
   },
   {
     /* [196] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(188),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
     /* [197] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(196),
+    /* matcher_indices */ MatcherIndicesIndex(136),
   },
   {
     /* [198] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(114),
   },
   {
     /* [199] */
@@ -3134,12 +3075,12 @@
   {
     /* [201] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(303),
+    /* matcher_indices */ MatcherIndicesIndex(243),
   },
   {
     /* [202] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [203] */
@@ -3174,62 +3115,62 @@
   {
     /* [209] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [210] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [211] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [212] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [213] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [214] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [215] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [216] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [217] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(208),
+    /* matcher_indices */ MatcherIndicesIndex(148),
   },
   {
     /* [218] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(208),
+    /* matcher_indices */ MatcherIndicesIndex(148),
   },
   {
     /* [219] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(208),
+    /* matcher_indices */ MatcherIndicesIndex(148),
   },
   {
     /* [220] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(208),
+    /* matcher_indices */ MatcherIndicesIndex(148),
   },
   {
     /* [221] */
@@ -3314,12 +3255,12 @@
   {
     /* [237] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(214),
+    /* matcher_indices */ MatcherIndicesIndex(154),
   },
   {
     /* [238] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [239] */
@@ -3329,17 +3270,17 @@
   {
     /* [240] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(307),
+    /* matcher_indices */ MatcherIndicesIndex(247),
   },
   {
     /* [241] */
     /* usage */ core::ParameterUsage::kSampler,
-    /* matcher_indices */ MatcherIndicesIndex(308),
+    /* matcher_indices */ MatcherIndicesIndex(248),
   },
   {
     /* [242] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
     /* [243] */
@@ -3354,7 +3295,7 @@
   {
     /* [245] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(184),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [246] */
@@ -3364,12 +3305,12 @@
   {
     /* [247] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [248] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(184),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [249] */
@@ -3379,17 +3320,17 @@
   {
     /* [250] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [251] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(184),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
     /* [252] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* matcher_indices */ MatcherIndicesIndex(90),
   },
   {
     /* [253] */
@@ -3399,42 +3340,42 @@
   {
     /* [254] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(186),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
     /* [255] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(105),
+    /* matcher_indices */ MatcherIndicesIndex(93),
   },
   {
     /* [256] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [257] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(186),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
     /* [258] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(111),
+    /* matcher_indices */ MatcherIndicesIndex(99),
   },
   {
     /* [259] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [260] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(186),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
     /* [261] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(114),
+    /* matcher_indices */ MatcherIndicesIndex(90),
   },
   {
     /* [262] */
@@ -3444,42 +3385,42 @@
   {
     /* [263] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(188),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
     /* [264] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(117),
+    /* matcher_indices */ MatcherIndicesIndex(93),
   },
   {
     /* [265] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [266] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(188),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
     /* [267] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(123),
+    /* matcher_indices */ MatcherIndicesIndex(99),
   },
   {
     /* [268] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
     /* [269] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(188),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
     /* [270] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(190),
+    /* matcher_indices */ MatcherIndicesIndex(130),
   },
   {
     /* [271] */
@@ -3494,12 +3435,12 @@
   {
     /* [273] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(194),
+    /* matcher_indices */ MatcherIndicesIndex(134),
   },
   {
     /* [274] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(114),
   },
   {
     /* [275] */
@@ -3509,12 +3450,12 @@
   {
     /* [276] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(200),
+    /* matcher_indices */ MatcherIndicesIndex(140),
   },
   {
     /* [277] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(230),
+    /* matcher_indices */ MatcherIndicesIndex(170),
   },
   {
     /* [278] */
@@ -3524,12 +3465,12 @@
   {
     /* [279] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(206),
+    /* matcher_indices */ MatcherIndicesIndex(146),
   },
   {
     /* [280] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(114),
   },
   {
     /* [281] */
@@ -3539,12 +3480,12 @@
   {
     /* [282] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(302),
+    /* matcher_indices */ MatcherIndicesIndex(242),
   },
   {
     /* [283] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [284] */
@@ -3554,12 +3495,12 @@
   {
     /* [285] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(306),
+    /* matcher_indices */ MatcherIndicesIndex(246),
   },
   {
     /* [286] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [287] */
@@ -3568,543 +3509,543 @@
   },
   {
     /* [288] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(144),
+    /* usage */ core::ParameterUsage::kXy,
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [289] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [290] */
-    /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
-  },
-  {
-    /* [291] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(147),
-  },
-  {
-    /* [292] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [293] */
-    /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
-  },
-  {
-    /* [294] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(150),
-  },
-  {
-    /* [295] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [296] */
-    /* usage */ core::ParameterUsage::kArrayIndex,
-    /* matcher_indices */ MatcherIndicesIndex(4),
-  },
-  {
-    /* [297] */
-    /* usage */ core::ParameterUsage::kXy,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [298] */
     /* usage */ core::ParameterUsage::kZ,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [299] */
+    /* [290] */
     /* usage */ core::ParameterUsage::kW,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [300] */
+    /* [291] */
     /* usage */ core::ParameterUsage::kX,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [301] */
+    /* [292] */
     /* usage */ core::ParameterUsage::kYz,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
-    /* [302] */
+    /* [293] */
     /* usage */ core::ParameterUsage::kW,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [303] */
+    /* [294] */
     /* usage */ core::ParameterUsage::kX,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [304] */
+    /* [295] */
     /* usage */ core::ParameterUsage::kY,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [305] */
+    /* [296] */
     /* usage */ core::ParameterUsage::kZw,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
-    /* [306] */
+    /* [297] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [307] */
+    /* [298] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
-    /* [308] */
+    /* [299] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(42),
   },
   {
-    /* [309] */
+    /* [300] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(72),
   },
   {
-    /* [310] */
+    /* [301] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(190),
+    /* matcher_indices */ MatcherIndicesIndex(130),
+  },
+  {
+    /* [302] */
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [303] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(134),
+  },
+  {
+    /* [304] */
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [305] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(136),
+  },
+  {
+    /* [306] */
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [307] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(140),
+  },
+  {
+    /* [308] */
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
+  },
+  {
+    /* [309] */
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(142),
+  },
+  {
+    /* [310] */
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
     /* [311] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(144),
   },
   {
     /* [312] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(194),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(4),
   },
   {
     /* [313] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(242),
   },
   {
     /* [314] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(196),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [315] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(243),
   },
   {
     /* [316] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(200),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [317] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(244),
   },
   {
     /* [318] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(202),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [319] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(245),
   },
   {
     /* [320] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(204),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [321] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(4),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(247),
   },
   {
     /* [322] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(302),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
     /* [323] */
-    /* usage */ core::ParameterUsage::kLevel,
+    /* usage */ core::ParameterUsage::kValue,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [324] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(303),
-  },
-  {
-    /* [325] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [326] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(304),
-  },
-  {
-    /* [327] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [328] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(305),
-  },
-  {
-    /* [329] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [330] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(307),
-  },
-  {
-    /* [331] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [332] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(126),
-  },
-  {
-    /* [333] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [334] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(129),
-  },
-  {
-    /* [335] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [336] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
-  },
-  {
-    /* [337] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [338] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(135),
-  },
-  {
-    /* [339] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [340] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(138),
-  },
-  {
-    /* [341] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [342] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(141),
-  },
-  {
-    /* [343] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(228),
-  },
-  {
-    /* [344] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(153),
-  },
-  {
-    /* [345] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
-  },
-  {
-    /* [346] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(156),
-  },
-  {
-    /* [347] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
-  },
-  {
-    /* [348] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(159),
-  },
-  {
-    /* [349] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(176),
-  },
-  {
-    /* [350] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(3),
-  },
-  {
-    /* [351] */
     /* usage */ core::ParameterUsage::kSourceLaneIndex,
     /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
-    /* [352] */
+    /* [325] */
     /* usage */ core::ParameterUsage::kValue,
     /* matcher_indices */ MatcherIndicesIndex(42),
   },
   {
-    /* [353] */
+    /* [326] */
     /* usage */ core::ParameterUsage::kSourceLaneIndex,
     /* matcher_indices */ MatcherIndicesIndex(9),
   },
   {
-    /* [354] */
+    /* [327] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(48),
   },
   {
-    /* [355] */
+    /* [328] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [356] */
+    /* [329] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(48),
   },
   {
-    /* [357] */
+    /* [330] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(60),
   },
   {
-    /* [358] */
+    /* [331] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(26),
   },
   {
-    /* [359] */
+    /* [332] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(26),
   },
   {
-    /* [360] */
+    /* [333] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [361] */
+    /* [334] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(26),
   },
   {
-    /* [362] */
+    /* [335] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(48),
   },
   {
-    /* [363] */
+    /* [336] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(162),
+    /* matcher_indices */ MatcherIndicesIndex(102),
   },
   {
-    /* [364] */
+    /* [337] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(26),
   },
   {
-    /* [365] */
+    /* [338] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(34),
   },
   {
-    /* [366] */
+    /* [339] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(38),
   },
   {
-    /* [367] */
+    /* [340] */
     /* usage */ core::ParameterUsage::kXy,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
-    /* [368] */
+    /* [341] */
     /* usage */ core::ParameterUsage::kZw,
-    /* matcher_indices */ MatcherIndicesIndex(228),
+    /* matcher_indices */ MatcherIndicesIndex(168),
   },
   {
-    /* [369] */
+    /* [342] */
     /* usage */ core::ParameterUsage::kXyz,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
-    /* [370] */
+    /* [343] */
     /* usage */ core::ParameterUsage::kW,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [371] */
+    /* [344] */
     /* usage */ core::ParameterUsage::kX,
     /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
-    /* [372] */
+    /* [345] */
     /* usage */ core::ParameterUsage::kZyw,
-    /* matcher_indices */ MatcherIndicesIndex(176),
+    /* matcher_indices */ MatcherIndicesIndex(116),
   },
   {
-    /* [373] */
+    /* [346] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(0),
   },
   {
-    /* [374] */
+    /* [347] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(59),
   },
   {
-    /* [375] */
+    /* [348] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(54),
   },
   {
-    /* [376] */
+    /* [349] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(57),
   },
   {
-    /* [377] */
+    /* [350] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(65),
   },
   {
-    /* [378] */
+    /* [351] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(63),
   },
   {
-    /* [379] */
+    /* [352] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(168),
+    /* matcher_indices */ MatcherIndicesIndex(108),
   },
   {
-    /* [380] */
+    /* [353] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(172),
+    /* matcher_indices */ MatcherIndicesIndex(112),
   },
   {
-    /* [381] */
+    /* [354] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(174),
+    /* matcher_indices */ MatcherIndicesIndex(114),
   },
   {
-    /* [382] */
+    /* [355] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
-    /* [383] */
+    /* [356] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(68),
   },
   {
-    /* [384] */
+    /* [357] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(66),
   },
   {
-    /* [385] */
+    /* [358] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(182),
+    /* matcher_indices */ MatcherIndicesIndex(122),
   },
   {
-    /* [386] */
+    /* [359] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(184),
+    /* matcher_indices */ MatcherIndicesIndex(124),
   },
   {
-    /* [387] */
+    /* [360] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(186),
+    /* matcher_indices */ MatcherIndicesIndex(126),
   },
   {
-    /* [388] */
+    /* [361] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(188),
+    /* matcher_indices */ MatcherIndicesIndex(128),
   },
   {
-    /* [389] */
+    /* [362] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(18),
   },
   {
-    /* [390] */
+    /* [363] */
     /* usage */ core::ParameterUsage::kNone,
     /* matcher_indices */ MatcherIndicesIndex(22),
   },
   {
-    /* [391] */
+    /* [364] */
     /* usage */ core::ParameterUsage::kTexture,
     /* matcher_indices */ MatcherIndicesIndex(78),
   },
   {
-    /* [392] */
+    /* [365] */
     /* usage */ core::ParameterUsage::kTexture,
     /* matcher_indices */ MatcherIndicesIndex(81),
   },
   {
-    /* [393] */
+    /* [366] */
     /* usage */ core::ParameterUsage::kTexture,
     /* matcher_indices */ MatcherIndicesIndex(84),
   },
   {
-    /* [394] */
+    /* [367] */
     /* usage */ core::ParameterUsage::kTexture,
     /* matcher_indices */ MatcherIndicesIndex(87),
   },
   {
+    /* [368] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(127),
+  },
+  {
+    /* [369] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(170),
+  },
+  {
+    /* [370] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(180),
+  },
+  {
+    /* [371] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(23),
+  },
+  {
+    /* [372] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(182),
+  },
+  {
+    /* [373] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(184),
+  },
+  {
+    /* [374] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(186),
+  },
+  {
+    /* [375] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(188),
+  },
+  {
+    /* [376] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(190),
+  },
+  {
+    /* [377] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(192),
+  },
+  {
+    /* [378] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(194),
+  },
+  {
+    /* [379] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(196),
+  },
+  {
+    /* [380] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(198),
+  },
+  {
+    /* [381] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(200),
+  },
+  {
+    /* [382] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(202),
+  },
+  {
+    /* [383] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(204),
+  },
+  {
+    /* [384] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(206),
+  },
+  {
+    /* [385] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(208),
+  },
+  {
+    /* [386] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(210),
+  },
+  {
+    /* [387] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(212),
+  },
+  {
+    /* [388] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(214),
+  },
+  {
+    /* [389] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(216),
+  },
+  {
+    /* [390] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(218),
+  },
+  {
+    /* [391] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(220),
+  },
+  {
+    /* [392] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(222),
+  },
+  {
+    /* [393] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(224),
+  },
+  {
+    /* [394] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(226),
+  },
+  {
     /* [395] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(187),
+    /* matcher_indices */ MatcherIndicesIndex(228),
   },
   {
     /* [396] */
@@ -4114,142 +4055,7 @@
   {
     /* [397] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(240),
-  },
-  {
-    /* [398] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(23),
-  },
-  {
-    /* [399] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(242),
-  },
-  {
-    /* [400] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(244),
-  },
-  {
-    /* [401] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(246),
-  },
-  {
-    /* [402] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(248),
-  },
-  {
-    /* [403] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(250),
-  },
-  {
-    /* [404] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(252),
-  },
-  {
-    /* [405] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(254),
-  },
-  {
-    /* [406] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(256),
-  },
-  {
-    /* [407] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(258),
-  },
-  {
-    /* [408] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(260),
-  },
-  {
-    /* [409] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(262),
-  },
-  {
-    /* [410] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(264),
-  },
-  {
-    /* [411] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(266),
-  },
-  {
-    /* [412] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(268),
-  },
-  {
-    /* [413] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(270),
-  },
-  {
-    /* [414] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(272),
-  },
-  {
-    /* [415] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(274),
-  },
-  {
-    /* [416] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(276),
-  },
-  {
-    /* [417] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(278),
-  },
-  {
-    /* [418] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(280),
-  },
-  {
-    /* [419] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(282),
-  },
-  {
-    /* [420] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(284),
-  },
-  {
-    /* [421] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(286),
-  },
-  {
-    /* [422] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(288),
-  },
-  {
-    /* [423] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(290),
-  },
-  {
-    /* [424] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(292),
+    /* matcher_indices */ MatcherIndicesIndex(232),
   },
 };
 
@@ -4266,212 +4072,212 @@
   {
     /* [1] */
     /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(298),
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [2] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(47),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [3] */
-    /* name */ "L",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "W",
+    /* matcher_indices */ MatcherIndicesIndex(59),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [4] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(297),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [5] */
-    /* name */ "K",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "L",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [6] */
     /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [7] */
-    /* name */ "R",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(65),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [8] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(51),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [9] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* name */ "W",
+    /* matcher_indices */ MatcherIndicesIndex(59),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
+    /* [9] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
     /* [10] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [11] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(250),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [12] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(297),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "W",
+    /* matcher_indices */ MatcherIndicesIndex(59),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [13] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(299),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [14] */
-    /* name */ "M",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [15] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [16] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(297),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [17] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "L",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [18] */
-    /* name */ "M",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [19] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(53),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(47),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [20] */
-    /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "R",
+    /* matcher_indices */ MatcherIndicesIndex(68),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [21] */
-    /* name */ "L",
-    /* matcher_indices */ MatcherIndicesIndex(298),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [22] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [23] */
-    /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(65),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [24] */
-    /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "R",
+    /* matcher_indices */ MatcherIndicesIndex(68),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [25] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(297),
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [26] */
     /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [27] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(250),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [28] */
+    /* name */ "R",
+    /* matcher_indices */ MatcherIndicesIndex(68),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [29] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [30] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(237),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [31] */
+    /* name */ "K",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
-    /* [27] */
+    /* [32] */
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [33] */
     /* name */ "R",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
-    /* [28] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [29] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(296),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [30] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [31] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(298),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [32] */
-    /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(176),
-    /* kind */ TemplateInfo::Kind::kNumber,
-  },
-  {
-    /* [33] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
     /* [34] */
-    /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(51),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [35] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(53),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [36] */
@@ -4481,224 +4287,380 @@
   },
   {
     /* [37] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(57),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [38] */
     /* name */ "N",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
-    /* [39] */
+    /* [38] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(300),
+    /* matcher_indices */ MatcherIndicesIndex(237),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [39] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(239),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [40] */
-    /* name */ "N",
+    /* name */ "M",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [41] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(301),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [42] */
-    /* name */ "N",
-    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* kind */ TemplateInfo::Kind::kNumber,
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(237),
+    /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [43] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(310),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [44] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(60),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [45] */
     /* name */ "N",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
-    /* [46] */
+    /* [44] */
+    /* name */ "M",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [45] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(168),
+    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [46] */
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [47] */
-    /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* name */ "L",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [48] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(172),
+    /* matcher_indices */ MatcherIndicesIndex(53),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [49] */
-    /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* name */ "C",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [50] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* name */ "S",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [51] */
-    /* name */ "L",
-    /* matcher_indices */ MatcherIndicesIndex(298),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(237),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [52] */
-    /* name */ "F",
+    /* name */ "C",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [53] */
-    /* name */ "A",
+    /* name */ "R",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [54] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(311),
-    /* kind */ TemplateInfo::Kind::kType,
-  },
-  {
-    /* [55] */
     /* name */ "N",
     /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
-    /* [56] */
+    /* [55] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(68),
+    /* matcher_indices */ MatcherIndicesIndex(236),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
+    /* [56] */
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
     /* [57] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(314),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(238),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [58] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(59),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "S",
+    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [59] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(315),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [60] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(187),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [61] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(312),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(53),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [62] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(9),
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(53),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [63] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(313),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(57),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [64] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(47),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [65] */
-    /* name */ "U",
-    /* matcher_indices */ MatcherIndicesIndex(316),
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(240),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [66] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(170),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [67] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(312),
+    /* matcher_indices */ MatcherIndicesIndex(241),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [68] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(313),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [69] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(314),
+    /* matcher_indices */ MatcherIndicesIndex(251),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [70] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(315),
+    /* matcher_indices */ MatcherIndicesIndex(60),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [71] */
-    /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(316),
-    /* kind */ TemplateInfo::Kind::kType,
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [72] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(317),
+    /* matcher_indices */ MatcherIndicesIndex(108),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [73] */
+    /* name */ "S",
+    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [74] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(318),
+    /* matcher_indices */ MatcherIndicesIndex(112),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [75] */
+    /* name */ "S",
+    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [76] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(53),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [77] */
+    /* name */ "L",
+    /* matcher_indices */ MatcherIndicesIndex(238),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [78] */
+    /* name */ "F",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [79] */
+    /* name */ "A",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [80] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(252),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [81] */
+    /* name */ "N",
+    /* matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* kind */ TemplateInfo::Kind::kNumber,
+  },
+  {
+    /* [82] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(68),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [83] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(255),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [84] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(59),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [85] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(256),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [86] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(127),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [87] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(253),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [88] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(9),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [89] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(254),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [90] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(47),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [91] */
+    /* name */ "U",
+    /* matcher_indices */ MatcherIndicesIndex(257),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [92] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(110),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [93] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(253),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [94] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(254),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [95] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(255),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [96] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(256),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [97] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(257),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [98] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(258),
+    /* kind */ TemplateInfo::Kind::kType,
+  },
+  {
+    /* [99] */
+    /* name */ "T",
+    /* matcher_indices */ MatcherIndicesIndex(259),
     /* kind */ TemplateInfo::Kind::kType,
   },
 };
@@ -4844,8 +4806,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(310),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(301),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -4857,7 +4819,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(75),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4866,9 +4828,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(312),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(303),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4879,7 +4841,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(27),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4888,9 +4850,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(314),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(305),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4901,7 +4863,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(276),
-    /* return_matcher_indices */ MatcherIndicesIndex(198),
+    /* return_matcher_indices */ MatcherIndicesIndex(138),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4910,9 +4872,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(316),
-    /* return_matcher_indices */ MatcherIndicesIndex(198),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(307),
+    /* return_matcher_indices */ MatcherIndicesIndex(138),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4923,7 +4885,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(154),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4932,9 +4894,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(318),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(309),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4945,7 +4907,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(80),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4954,9 +4916,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(50),
-    /* parameters */ ParameterIndex(320),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(76),
+    /* parameters */ ParameterIndex(311),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4967,7 +4929,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(279),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4978,7 +4940,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -4987,9 +4949,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(322),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(313),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5000,7 +4962,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(32),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5009,9 +4971,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(324),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(315),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5022,7 +4984,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(161),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5031,9 +4993,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(326),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(317),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5044,7 +5006,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(94),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5053,9 +5015,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
-    /* parameters */ ParameterIndex(328),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(319),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5066,7 +5028,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(285),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5075,8 +5037,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(52),
-    /* parameters */ ParameterIndex(391),
+    /* templates */ TemplateIndex(78),
+    /* parameters */ ParameterIndex(364),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -5086,9 +5048,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(52),
-    /* parameters */ ParameterIndex(392),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(78),
+    /* parameters */ ParameterIndex(365),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5097,9 +5059,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(52),
-    /* parameters */ ParameterIndex(393),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* templates */ TemplateIndex(78),
+    /* parameters */ ParameterIndex(366),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5108,9 +5070,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(52),
-    /* parameters */ ParameterIndex(394),
-    /* return_matcher_indices */ MatcherIndicesIndex(198),
+    /* templates */ TemplateIndex(78),
+    /* parameters */ ParameterIndex(367),
+    /* return_matcher_indices */ MatcherIndicesIndex(138),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5121,7 +5083,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(240),
-    /* return_matcher_indices */ MatcherIndicesIndex(192),
+    /* return_matcher_indices */ MatcherIndicesIndex(132),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5132,7 +5094,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(238),
+    /* return_matcher_indices */ MatcherIndicesIndex(178),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -5141,9 +5103,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -5152,9 +5114,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -5163,9 +5125,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -5174,9 +5136,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -5185,9 +5147,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -5196,9 +5158,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -5207,9 +5169,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -5218,9 +5180,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(297),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5229,9 +5191,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(297),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5240,9 +5202,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(300),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(291),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5251,9 +5213,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(300),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(291),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5262,9 +5224,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(303),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(294),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5273,9 +5235,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(303),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(294),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5284,9 +5246,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(367),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(340),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5295,9 +5257,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(367),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(340),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5306,9 +5268,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(369),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(342),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5317,9 +5279,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(369),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(342),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5328,9 +5290,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(371),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(344),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5339,9 +5301,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(371),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(344),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5350,9 +5312,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(397),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(370),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5361,9 +5323,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(397),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(370),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5372,9 +5334,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(60),
-    /* parameters */ ParameterIndex(397),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(86),
+    /* parameters */ ParameterIndex(370),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5383,9 +5345,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(62),
-    /* parameters */ ParameterIndex(397),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(88),
+    /* parameters */ ParameterIndex(370),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5394,9 +5356,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(64),
-    /* parameters */ ParameterIndex(397),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* templates */ TemplateIndex(90),
+    /* parameters */ ParameterIndex(370),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5405,9 +5367,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(19),
+    /* templates */ TemplateIndex(45),
     /* parameters */ ParameterIndex(270),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5416,9 +5378,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(19),
+    /* templates */ TemplateIndex(45),
     /* parameters */ ParameterIndex(273),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5427,9 +5389,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 4,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(197),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5438,9 +5400,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(19),
+    /* templates */ TemplateIndex(45),
     /* parameters */ ParameterIndex(276),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5449,9 +5411,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(22),
+    /* templates */ TemplateIndex(48),
     /* parameters */ ParameterIndex(279),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5460,7 +5422,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(20),
+    /* templates */ TemplateIndex(46),
     /* parameters */ ParameterIndex(282),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5471,7 +5433,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(1),
+    /* templates */ TemplateIndex(15),
     /* parameters */ ParameterIndex(201),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5482,7 +5444,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(23),
+    /* templates */ TemplateIndex(49),
     /* parameters */ ParameterIndex(285),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5494,8 +5456,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(330),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* parameters */ ParameterIndex(321),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5503,10 +5465,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(332),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(18),
+    /* parameters */ ParameterIndex(243),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5514,10 +5476,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(334),
-    /* return_matcher_indices */ MatcherIndicesIndex(186),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(22),
+    /* parameters */ ParameterIndex(243),
+    /* return_matcher_indices */ MatcherIndicesIndex(126),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5525,10 +5487,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(336),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(243),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5536,10 +5498,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(338),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(18),
+    /* parameters */ ParameterIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5547,10 +5509,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(340),
-    /* return_matcher_indices */ MatcherIndicesIndex(186),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(22),
+    /* parameters */ ParameterIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(126),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5558,10 +5520,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(342),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5569,10 +5531,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(288),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(18),
+    /* parameters */ ParameterIndex(185),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5580,10 +5542,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(291),
-    /* return_matcher_indices */ MatcherIndicesIndex(186),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(22),
+    /* parameters */ ParameterIndex(185),
+    /* return_matcher_indices */ MatcherIndicesIndex(126),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5591,10 +5553,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(294),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(185),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5602,10 +5564,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(344),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(18),
+    /* parameters */ ParameterIndex(249),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5613,10 +5575,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(346),
-    /* return_matcher_indices */ MatcherIndicesIndex(186),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(22),
+    /* parameters */ ParameterIndex(249),
+    /* return_matcher_indices */ MatcherIndicesIndex(126),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5624,10 +5586,10 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
-    /* parameters */ ParameterIndex(348),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(249),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5638,7 +5600,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(236),
+    /* return_matcher_indices */ MatcherIndicesIndex(176),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -5647,9 +5609,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -5658,9 +5620,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -5669,9 +5631,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -5680,9 +5642,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -5691,9 +5653,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -5702,9 +5664,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -5713,9 +5675,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -5724,9 +5686,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(297),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5735,9 +5697,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(297),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5746,9 +5708,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(300),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(98),
+    /* parameters */ ParameterIndex(291),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5757,9 +5719,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
-    /* parameters */ ParameterIndex(300),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(65),
+    /* parameters */ ParameterIndex(291),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(111),
   },
   {
@@ -5768,9 +5730,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(396),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5779,9 +5741,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(396),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5790,9 +5752,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(60),
-    /* parameters */ ParameterIndex(396),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(86),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5801,9 +5763,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(62),
-    /* parameters */ ParameterIndex(396),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(88),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5812,9 +5774,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(64),
-    /* parameters */ ParameterIndex(396),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* templates */ TemplateIndex(90),
+    /* parameters */ ParameterIndex(369),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -5825,7 +5787,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(237),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5836,7 +5798,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(44),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5847,7 +5809,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(165),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5856,9 +5818,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(19),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5867,9 +5829,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5880,7 +5842,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(50),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5891,7 +5853,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(169),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5902,7 +5864,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(119),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5911,9 +5873,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(56),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -5944,7 +5906,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(68),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5955,7 +5917,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(84),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5977,7 +5939,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(144),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -5990,7 +5952,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(124),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6001,7 +5963,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(124),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6010,9 +5972,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(62),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6021,9 +5983,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(62),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6034,7 +5996,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(129),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6045,7 +6007,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(129),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6056,7 +6018,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(177),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6065,9 +6027,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(134),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6076,7 +6038,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
+    /* templates */ TemplateIndex(5),
     /* parameters */ ParameterIndex(139),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6087,7 +6049,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
+    /* templates */ TemplateIndex(5),
     /* parameters */ ParameterIndex(139),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6098,7 +6060,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(68),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6109,7 +6071,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(68),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6120,7 +6082,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(3),
+    /* templates */ TemplateIndex(5),
     /* parameters */ ParameterIndex(181),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6131,7 +6093,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(144),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6144,7 +6106,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(234),
+    /* return_matcher_indices */ MatcherIndicesIndex(174),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -6153,9 +6115,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -6164,9 +6126,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -6175,9 +6137,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -6186,9 +6148,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -6197,9 +6159,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(109),
   },
   {
@@ -6208,9 +6170,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -6219,9 +6181,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(205),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(110),
   },
   {
@@ -6230,9 +6192,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(381),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(354),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -6241,9 +6203,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(381),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(354),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -6252,9 +6214,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(60),
-    /* parameters */ ParameterIndex(381),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* templates */ TemplateIndex(86),
+    /* parameters */ ParameterIndex(354),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -6263,9 +6225,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(62),
-    /* parameters */ ParameterIndex(381),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* templates */ TemplateIndex(88),
+    /* parameters */ ParameterIndex(354),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -6274,9 +6236,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(64),
-    /* parameters */ ParameterIndex(381),
-    /* return_matcher_indices */ MatcherIndicesIndex(228),
+    /* templates */ TemplateIndex(90),
+    /* parameters */ ParameterIndex(354),
+    /* return_matcher_indices */ MatcherIndicesIndex(168),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -6287,7 +6249,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(74),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6298,7 +6260,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(74),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6307,9 +6269,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(26),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6318,9 +6280,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(26),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6331,7 +6293,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(0),
     /* parameters */ ParameterIndex(153),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6340,9 +6302,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(0),
+    /* templates */ TemplateIndex(14),
     /* parameters */ ParameterIndex(79),
-    /* return_matcher_indices */ MatcherIndicesIndex(208),
+    /* return_matcher_indices */ MatcherIndicesIndex(148),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6353,7 +6315,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(139),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6364,7 +6326,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(157),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6373,9 +6335,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(68),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6384,9 +6346,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(84),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6397,7 +6359,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(181),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6406,9 +6368,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(144),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -6416,7 +6378,7 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
+    /* num_templates   */ 3,
     /* templates */ TemplateIndex(1),
     /* parameters */ ParameterIndex(243),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
@@ -6427,7 +6389,7 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
+    /* num_templates   */ 3,
     /* templates */ TemplateIndex(1),
     /* parameters */ ParameterIndex(246),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
@@ -6438,7 +6400,7 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
+    /* num_templates   */ 4,
     /* templates */ TemplateIndex(1),
     /* parameters */ ParameterIndex(185),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
@@ -6449,7 +6411,7 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
+    /* num_templates   */ 3,
     /* templates */ TemplateIndex(1),
     /* parameters */ ParameterIndex(249),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
@@ -6460,8 +6422,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(252),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6471,8 +6433,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(255),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6482,8 +6444,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(189),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6493,8 +6455,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(6),
     /* parameters */ ParameterIndex(258),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6504,8 +6466,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(261),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6515,8 +6477,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(264),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6526,8 +6488,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 4,
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(193),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6537,8 +6499,8 @@
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(1),
+    /* num_templates   */ 3,
+    /* templates */ TemplateIndex(10),
     /* parameters */ ParameterIndex(267),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -6549,7 +6511,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(35),
+    /* templates */ TemplateIndex(61),
     /* parameters */ ParameterIndex(229),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
@@ -6560,8 +6522,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(374),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(347),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6571,8 +6533,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(8),
-    /* parameters */ ParameterIndex(375),
+    /* templates */ TemplateIndex(34),
+    /* parameters */ ParameterIndex(348),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6582,8 +6544,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(37),
-    /* parameters */ ParameterIndex(376),
+    /* templates */ TemplateIndex(63),
+    /* parameters */ ParameterIndex(349),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6593,8 +6555,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(62),
-    /* parameters */ ParameterIndex(377),
+    /* templates */ TemplateIndex(88),
+    /* parameters */ ParameterIndex(350),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6604,8 +6566,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(44),
-    /* parameters */ ParameterIndex(378),
+    /* templates */ TemplateIndex(70),
+    /* parameters */ ParameterIndex(351),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6616,7 +6578,7 @@
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(0),
-    /* parameters */ ParameterIndex(379),
+    /* parameters */ ParameterIndex(352),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6626,8 +6588,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(66),
-    /* parameters */ ParameterIndex(380),
+    /* templates */ TemplateIndex(92),
+    /* parameters */ ParameterIndex(353),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6637,7 +6599,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(46),
+    /* templates */ TemplateIndex(72),
     /* parameters */ ParameterIndex(229),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
@@ -6648,8 +6610,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(48),
-    /* parameters */ ParameterIndex(381),
+    /* templates */ TemplateIndex(74),
+    /* parameters */ ParameterIndex(354),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(10),
   },
@@ -6769,7 +6731,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
@@ -6780,7 +6742,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
@@ -6791,8 +6753,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(354),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(327),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
   },
@@ -6802,8 +6764,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(355),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(328),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
   },
@@ -6813,8 +6775,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(16),
-    /* parameters */ ParameterIndex(360),
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(333),
     /* return_matcher_indices */ MatcherIndicesIndex(26),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
   },
@@ -6824,8 +6786,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(16),
-    /* parameters */ ParameterIndex(359),
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(332),
     /* return_matcher_indices */ MatcherIndicesIndex(26),
     /* const_eval_fn */ ConstEvalFunctionIndex(88),
   },
@@ -6835,9 +6797,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(25),
-    /* parameters */ ParameterIndex(361),
-    /* return_matcher_indices */ MatcherIndicesIndex(162),
+    /* templates */ TemplateIndex(51),
+    /* parameters */ ParameterIndex(334),
+    /* return_matcher_indices */ MatcherIndicesIndex(102),
     /* const_eval_fn */ ConstEvalFunctionIndex(89),
   },
   {
@@ -6846,8 +6808,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(25),
-    /* parameters */ ParameterIndex(363),
+    /* templates */ TemplateIndex(51),
+    /* parameters */ ParameterIndex(336),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(90),
   },
@@ -6857,8 +6819,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 4,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(365),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(338),
     /* return_matcher_indices */ MatcherIndicesIndex(30),
     /* const_eval_fn */ ConstEvalFunctionIndex(91),
   },
@@ -6868,7 +6830,7 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
@@ -6879,8 +6841,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(398),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(371),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
@@ -6890,8 +6852,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(398),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(371),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
@@ -6901,7 +6863,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
@@ -6912,7 +6874,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
@@ -6923,7 +6885,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
@@ -6934,7 +6896,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
@@ -6945,8 +6907,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(399),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(372),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
@@ -6956,8 +6918,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(400),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(373),
     /* return_matcher_indices */ MatcherIndicesIndex(23),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
@@ -6967,9 +6929,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -6978,9 +6940,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(401),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(374),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -6989,9 +6951,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(401),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(374),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7000,9 +6962,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7011,9 +6973,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7022,9 +6984,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7033,9 +6995,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7044,9 +7006,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(402),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(375),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7055,9 +7017,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(403),
-    /* return_matcher_indices */ MatcherIndicesIndex(246),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(376),
+    /* return_matcher_indices */ MatcherIndicesIndex(186),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7066,9 +7028,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7077,9 +7039,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(404),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(377),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7088,9 +7050,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(404),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(377),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7099,9 +7061,9 @@
     /* num_parameters */ 8,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7110,9 +7072,9 @@
     /* num_parameters */ 8,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7121,9 +7083,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7132,9 +7094,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7143,9 +7105,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(405),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(378),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7154,9 +7116,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(406),
-    /* return_matcher_indices */ MatcherIndicesIndex(252),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(379),
+    /* return_matcher_indices */ MatcherIndicesIndex(192),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7165,9 +7127,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7176,9 +7138,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(407),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(380),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7187,9 +7149,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(407),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(380),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7198,9 +7160,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7209,9 +7171,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7220,9 +7182,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7231,9 +7193,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7242,9 +7204,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(408),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(381),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7253,9 +7215,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(409),
-    /* return_matcher_indices */ MatcherIndicesIndex(258),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(382),
+    /* return_matcher_indices */ MatcherIndicesIndex(198),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7264,9 +7226,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7275,9 +7237,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(410),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(383),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7286,9 +7248,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(410),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(383),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7297,9 +7259,9 @@
     /* num_parameters */ 9,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7308,9 +7270,9 @@
     /* num_parameters */ 9,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7319,9 +7281,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7330,9 +7292,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7341,9 +7303,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(411),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(384),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7352,9 +7314,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(412),
-    /* return_matcher_indices */ MatcherIndicesIndex(264),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(385),
+    /* return_matcher_indices */ MatcherIndicesIndex(204),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7363,9 +7325,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7374,9 +7336,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(413),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(386),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7385,9 +7347,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(413),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(386),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7396,9 +7358,9 @@
     /* num_parameters */ 12,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7407,9 +7369,9 @@
     /* num_parameters */ 12,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7418,9 +7380,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7429,9 +7391,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7440,9 +7402,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(414),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(387),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7451,9 +7413,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(415),
-    /* return_matcher_indices */ MatcherIndicesIndex(270),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(388),
+    /* return_matcher_indices */ MatcherIndicesIndex(210),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7462,9 +7424,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7473,9 +7435,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(416),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(389),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7484,9 +7446,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(416),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(389),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7495,9 +7457,9 @@
     /* num_parameters */ 8,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7506,9 +7468,9 @@
     /* num_parameters */ 8,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7517,9 +7479,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7528,9 +7490,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(209),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7539,9 +7501,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(417),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(390),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7550,9 +7512,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(418),
-    /* return_matcher_indices */ MatcherIndicesIndex(276),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(391),
+    /* return_matcher_indices */ MatcherIndicesIndex(216),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7561,9 +7523,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7572,9 +7534,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(419),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(392),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7583,9 +7545,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(419),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(392),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7594,9 +7556,9 @@
     /* num_parameters */ 12,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7605,9 +7567,9 @@
     /* num_parameters */ 12,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7616,9 +7578,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7627,9 +7589,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7638,9 +7600,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(420),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(393),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7649,9 +7611,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(421),
-    /* return_matcher_indices */ MatcherIndicesIndex(282),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(394),
+    /* return_matcher_indices */ MatcherIndicesIndex(222),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7660,9 +7622,9 @@
     /* num_parameters */ 0,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -7671,9 +7633,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(73),
-    /* parameters */ ParameterIndex(422),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(395),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7682,9 +7644,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
-    /* parameters */ ParameterIndex(422),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* templates */ TemplateIndex(30),
+    /* parameters */ ParameterIndex(395),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -7693,9 +7655,9 @@
     /* num_parameters */ 16,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7704,9 +7666,9 @@
     /* num_parameters */ 16,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(112),
   },
   {
@@ -7715,9 +7677,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7726,9 +7688,9 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(217),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(113),
   },
   {
@@ -7737,9 +7699,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(58),
-    /* parameters */ ParameterIndex(423),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(396),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7748,9 +7710,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(56),
-    /* parameters */ ParameterIndex(424),
-    /* return_matcher_indices */ MatcherIndicesIndex(288),
+    /* templates */ TemplateIndex(82),
+    /* parameters */ ParameterIndex(397),
+    /* return_matcher_indices */ MatcherIndicesIndex(228),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -7761,7 +7723,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(104),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7772,7 +7734,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(104),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7781,9 +7743,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(38),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7792,9 +7754,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(38),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7805,7 +7767,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(109),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7816,7 +7778,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(109),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7827,7 +7789,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(173),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7836,9 +7798,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(114),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7849,7 +7811,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(44),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7860,7 +7822,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(44),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7869,9 +7831,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(19),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7880,9 +7842,9 @@
     /* num_parameters */ 7,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(19),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7893,7 +7855,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(50),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7904,7 +7866,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(50),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7915,7 +7877,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(119),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7924,9 +7886,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(56),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7937,7 +7899,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7948,7 +7910,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7957,9 +7919,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7968,9 +7930,9 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7981,7 +7943,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(161),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -7990,9 +7952,9 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(94),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -8023,7 +7985,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8034,7 +7996,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8056,7 +8018,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(94),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8089,7 +8051,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8100,7 +8062,7 @@
     /* num_parameters */ 6,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(32),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8122,7 +8084,7 @@
     /* num_parameters */ 5,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(2),
+    /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(94),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -8177,8 +8139,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(52),
-    /* parameters */ ParameterIndex(393),
+    /* templates */ TemplateIndex(78),
+    /* parameters */ ParameterIndex(366),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -8188,7 +8150,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(86),
@@ -8199,7 +8161,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(86),
@@ -8210,8 +8172,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(354),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(327),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(86),
   },
@@ -8221,8 +8183,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(355),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(328),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(86),
   },
@@ -8232,8 +8194,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(16),
-    /* parameters */ ParameterIndex(358),
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(331),
     /* return_matcher_indices */ MatcherIndicesIndex(26),
     /* const_eval_fn */ ConstEvalFunctionIndex(86),
   },
@@ -8243,7 +8205,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(87),
@@ -8254,7 +8216,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(87),
@@ -8265,8 +8227,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(354),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(327),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(87),
   },
@@ -8276,8 +8238,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(355),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(328),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(87),
   },
@@ -8287,8 +8249,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(16),
-    /* parameters */ ParameterIndex(358),
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(331),
     /* return_matcher_indices */ MatcherIndicesIndex(26),
     /* const_eval_fn */ ConstEvalFunctionIndex(87),
   },
@@ -8298,7 +8260,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
@@ -8309,7 +8271,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
@@ -8320,8 +8282,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(354),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(327),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
@@ -8331,8 +8293,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(355),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(328),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
@@ -8342,7 +8304,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(93),
@@ -8353,7 +8315,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(93),
@@ -8364,8 +8326,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(354),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(327),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(93),
   },
@@ -8375,8 +8337,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
-    /* parameters */ ParameterIndex(355),
+    /* templates */ TemplateIndex(55),
+    /* parameters */ ParameterIndex(328),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(93),
   },
@@ -8397,7 +8359,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
+    /* templates */ TemplateIndex(35),
     /* parameters */ ParameterIndex(235),
     /* return_matcher_indices */ MatcherIndicesIndex(45),
     /* const_eval_fn */ ConstEvalFunctionIndex(95),
@@ -8408,7 +8370,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(95),
@@ -8419,7 +8381,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(95),
@@ -8441,7 +8403,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
+    /* templates */ TemplateIndex(35),
     /* parameters */ ParameterIndex(235),
     /* return_matcher_indices */ MatcherIndicesIndex(45),
     /* const_eval_fn */ ConstEvalFunctionIndex(96),
@@ -8452,7 +8414,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(96),
@@ -8463,7 +8425,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(96),
@@ -8474,7 +8436,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(43),
@@ -8485,7 +8447,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(226),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(43),
@@ -8496,7 +8458,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(227),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(43),
@@ -8507,7 +8469,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(230),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(63),
@@ -8518,7 +8480,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(222),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(63),
@@ -8529,7 +8491,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(38),
+    /* templates */ TemplateIndex(64),
     /* parameters */ ParameterIndex(233),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(64),
@@ -8542,7 +8504,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(187),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(107),
   },
   {
@@ -8552,8 +8514,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(395),
-    /* return_matcher_indices */ MatcherIndicesIndex(187),
+    /* parameters */ ParameterIndex(368),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
@@ -8562,9 +8524,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(67),
+    /* templates */ TemplateIndex(93),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(187),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -8595,7 +8557,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(68),
+    /* templates */ TemplateIndex(94),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
@@ -8618,7 +8580,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(383),
+    /* parameters */ ParameterIndex(356),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
@@ -8628,7 +8590,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(69),
+    /* templates */ TemplateIndex(95),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
@@ -8651,7 +8613,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(374),
+    /* parameters */ ParameterIndex(347),
     /* return_matcher_indices */ MatcherIndicesIndex(59),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
@@ -8661,7 +8623,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(70),
+    /* templates */ TemplateIndex(96),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(59),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
@@ -8694,7 +8656,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(71),
+    /* templates */ TemplateIndex(97),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
@@ -8705,7 +8667,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(0),
@@ -8716,7 +8678,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
+    /* templates */ TemplateIndex(54),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(0),
@@ -8727,7 +8689,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(1),
@@ -8738,7 +8700,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(1),
@@ -8749,7 +8711,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(2),
@@ -8760,7 +8722,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(2),
@@ -8782,7 +8744,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
+    /* templates */ TemplateIndex(35),
     /* parameters */ ParameterIndex(235),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(3),
@@ -8804,7 +8766,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
+    /* templates */ TemplateIndex(35),
     /* parameters */ ParameterIndex(235),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(4),
@@ -8815,7 +8777,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(5),
@@ -8826,7 +8788,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(5),
@@ -8837,7 +8799,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(6),
@@ -8848,7 +8810,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(6),
@@ -8859,7 +8821,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(7),
@@ -8870,7 +8832,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(7),
@@ -8881,7 +8843,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(8),
@@ -8892,7 +8854,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(16),
+    /* templates */ TemplateIndex(42),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(8),
@@ -8903,7 +8865,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(9),
@@ -8914,7 +8876,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(9),
@@ -8925,7 +8887,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(11),
@@ -8936,7 +8898,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(11),
@@ -8947,7 +8909,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(12),
@@ -8958,7 +8920,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(12),
@@ -8969,7 +8931,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(13),
@@ -8980,7 +8942,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(13),
@@ -8991,7 +8953,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(14),
@@ -9002,7 +8964,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(14),
@@ -9013,7 +8975,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(15),
@@ -9024,7 +8986,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(15),
@@ -9035,7 +8997,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(16),
@@ -9046,7 +9008,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(16),
@@ -9057,7 +9019,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(17),
@@ -9068,7 +9030,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(17),
@@ -9079,7 +9041,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(19),
@@ -9090,7 +9052,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(19),
@@ -9101,7 +9063,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(21),
@@ -9112,7 +9074,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(21),
@@ -9124,7 +9086,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(383),
+    /* parameters */ ParameterIndex(356),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -9134,8 +9096,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
-    /* parameters */ ParameterIndex(384),
+    /* templates */ TemplateIndex(35),
+    /* parameters */ ParameterIndex(357),
     /* return_matcher_indices */ MatcherIndicesIndex(66),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -9145,7 +9107,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(25),
@@ -9156,7 +9118,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(25),
@@ -9167,7 +9129,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(26),
@@ -9178,7 +9140,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(26),
@@ -9189,7 +9151,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(27),
@@ -9200,7 +9162,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(150),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(27),
@@ -9211,7 +9173,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(29),
@@ -9222,7 +9184,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(29),
@@ -9233,7 +9195,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(30),
@@ -9244,7 +9206,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(30),
@@ -9255,7 +9217,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(31),
@@ -9266,7 +9228,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(31),
@@ -9277,7 +9239,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(32),
@@ -9288,7 +9250,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(226),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(32),
@@ -9299,7 +9261,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(33),
@@ -9310,7 +9272,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(33),
@@ -9321,9 +9283,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(178),
+    /* return_matcher_indices */ MatcherIndicesIndex(118),
     /* const_eval_fn */ ConstEvalFunctionIndex(34),
   },
   {
@@ -9332,7 +9294,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(69),
     /* const_eval_fn */ ConstEvalFunctionIndex(34),
@@ -9343,7 +9305,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(15),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(35),
@@ -9354,7 +9316,7 @@
     /* num_parameters */ 4,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(35),
@@ -9365,7 +9327,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(36),
@@ -9376,7 +9338,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(36),
@@ -9387,8 +9349,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(306),
+    /* templates */ TemplateIndex(38),
+    /* parameters */ ParameterIndex(297),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(37),
   },
@@ -9398,8 +9360,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(11),
-    /* parameters */ ParameterIndex(308),
+    /* templates */ TemplateIndex(37),
+    /* parameters */ ParameterIndex(299),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(37),
   },
@@ -9409,7 +9371,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(38),
@@ -9420,7 +9382,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(38),
@@ -9431,7 +9393,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(39),
@@ -9442,7 +9404,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(39),
@@ -9453,7 +9415,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(40),
@@ -9464,7 +9426,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(40),
@@ -9475,7 +9437,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(41),
@@ -9486,7 +9448,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
+    /* templates */ TemplateIndex(54),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(41),
@@ -9497,7 +9459,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(42),
@@ -9508,7 +9470,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
+    /* templates */ TemplateIndex(54),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(42),
@@ -9519,9 +9481,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(180),
+    /* return_matcher_indices */ MatcherIndicesIndex(120),
     /* const_eval_fn */ ConstEvalFunctionIndex(44),
   },
   {
@@ -9530,7 +9492,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(75),
     /* const_eval_fn */ ConstEvalFunctionIndex(44),
@@ -9541,7 +9503,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(55),
@@ -9552,7 +9514,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(55),
@@ -9564,7 +9526,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(383),
+    /* parameters */ ParameterIndex(356),
     /* return_matcher_indices */ MatcherIndicesIndex(68),
     /* const_eval_fn */ ConstEvalFunctionIndex(56),
   },
@@ -9574,8 +9536,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
-    /* parameters */ ParameterIndex(384),
+    /* templates */ TemplateIndex(35),
+    /* parameters */ ParameterIndex(357),
     /* return_matcher_indices */ MatcherIndicesIndex(66),
     /* const_eval_fn */ ConstEvalFunctionIndex(56),
   },
@@ -9585,7 +9547,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(57),
@@ -9596,7 +9558,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(57),
@@ -9607,7 +9569,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(60),
@@ -9618,7 +9580,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(30),
+    /* templates */ TemplateIndex(56),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(60),
@@ -9629,7 +9591,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(61),
@@ -9640,7 +9602,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(61),
@@ -9651,7 +9613,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(62),
@@ -9662,7 +9624,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(16),
+    /* templates */ TemplateIndex(42),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(62),
@@ -9673,7 +9635,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(41),
+    /* templates */ TemplateIndex(67),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(65),
@@ -9684,7 +9646,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(40),
+    /* templates */ TemplateIndex(66),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(65),
@@ -9695,7 +9657,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(66),
@@ -9706,7 +9668,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(66),
@@ -9717,7 +9679,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(67),
@@ -9728,7 +9690,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(67),
@@ -9739,7 +9701,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(68),
@@ -9750,7 +9712,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(226),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(68),
@@ -9761,7 +9723,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(69),
@@ -9772,7 +9734,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(69),
@@ -9783,7 +9745,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(70),
@@ -9794,7 +9756,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(70),
@@ -9805,7 +9767,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(71),
@@ -9816,7 +9778,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(71),
@@ -9827,7 +9789,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(72),
@@ -9838,7 +9800,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(72),
@@ -9849,7 +9811,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(74),
@@ -9860,7 +9822,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(74),
@@ -9895,7 +9857,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(44),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -9906,7 +9868,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(240),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -9915,8 +9877,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(43),
-    /* parameters */ ParameterIndex(350),
+    /* templates */ TemplateIndex(69),
+    /* parameters */ ParameterIndex(323),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -9926,8 +9888,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(42),
-    /* parameters */ ParameterIndex(352),
+    /* templates */ TemplateIndex(68),
+    /* parameters */ ParameterIndex(325),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -9948,7 +9910,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(9),
+    /* templates */ TemplateIndex(35),
     /* parameters */ ParameterIndex(235),
     /* return_matcher_indices */ MatcherIndicesIndex(45),
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
@@ -9959,7 +9921,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(84),
@@ -9970,7 +9932,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(84),
@@ -9981,7 +9943,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(41),
+    /* templates */ TemplateIndex(67),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(85),
@@ -9992,7 +9954,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(41),
+    /* templates */ TemplateIndex(67),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(85),
@@ -10003,7 +9965,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
@@ -10014,7 +9976,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
@@ -10025,7 +9987,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(99),
@@ -10036,9 +9998,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
@@ -10047,7 +10009,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(100),
@@ -10058,9 +10020,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(39),
+    /* templates */ TemplateIndex(65),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
@@ -10069,7 +10031,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(101),
@@ -10080,9 +10042,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
@@ -10091,7 +10053,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(102),
@@ -10102,9 +10064,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
@@ -10113,7 +10075,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(103),
@@ -10124,9 +10086,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
@@ -10135,7 +10097,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(47),
     /* const_eval_fn */ ConstEvalFunctionIndex(104),
@@ -10146,9 +10108,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(29),
+    /* templates */ TemplateIndex(55),
     /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(165),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(104),
   },
   {
@@ -10157,7 +10119,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(105),
@@ -10168,8 +10130,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
-    /* parameters */ ParameterIndex(356),
+    /* templates */ TemplateIndex(80),
+    /* parameters */ ParameterIndex(329),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(105),
   },
@@ -10179,7 +10141,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(54),
+    /* templates */ TemplateIndex(80),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(106),
@@ -10190,8 +10152,8 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(54),
-    /* parameters */ ParameterIndex(356),
+    /* templates */ TemplateIndex(80),
+    /* parameters */ ParameterIndex(329),
     /* return_matcher_indices */ MatcherIndicesIndex(48),
     /* const_eval_fn */ ConstEvalFunctionIndex(106),
   },
@@ -10201,9 +10163,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(294),
+    /* return_matcher_indices */ MatcherIndicesIndex(234),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -10212,9 +10174,9 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(72),
+    /* templates */ TemplateIndex(98),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(294),
+    /* return_matcher_indices */ MatcherIndicesIndex(234),
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
@@ -10223,8 +10185,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(33),
-    /* parameters */ ParameterIndex(373),
+    /* templates */ TemplateIndex(59),
+    /* parameters */ ParameterIndex(346),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -10234,9 +10196,9 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(4),
+    /* templates */ TemplateIndex(30),
     /* parameters */ ParameterIndex(213),
-    /* return_matcher_indices */ MatcherIndicesIndex(176),
+    /* return_matcher_indices */ MatcherIndicesIndex(116),
     /* const_eval_fn */ ConstEvalFunctionIndex(18),
   },
   {
@@ -10245,8 +10207,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
-    /* parameters */ ParameterIndex(382),
+    /* templates */ TemplateIndex(37),
+    /* parameters */ ParameterIndex(355),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(20),
   },
@@ -10256,7 +10218,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
+    /* templates */ TemplateIndex(54),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(4),
     /* const_eval_fn */ ConstEvalFunctionIndex(22),
@@ -10269,7 +10231,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(187),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(23),
   },
   {
@@ -10289,7 +10251,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(226),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(28),
@@ -10300,7 +10262,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(45),
@@ -10312,7 +10274,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(385),
+    /* parameters */ ParameterIndex(358),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(46),
   },
@@ -10323,7 +10285,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(385),
+    /* parameters */ ParameterIndex(358),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(47),
   },
@@ -10334,7 +10296,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(385),
+    /* parameters */ ParameterIndex(358),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(48),
   },
@@ -10345,7 +10307,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(386),
+    /* parameters */ ParameterIndex(359),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(49),
   },
@@ -10356,7 +10318,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(386),
+    /* parameters */ ParameterIndex(359),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(50),
   },
@@ -10367,7 +10329,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(387),
+    /* parameters */ ParameterIndex(360),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(51),
   },
@@ -10378,7 +10340,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(388),
+    /* parameters */ ParameterIndex(361),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(52),
   },
@@ -10389,7 +10351,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(387),
+    /* parameters */ ParameterIndex(360),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(53),
   },
@@ -10400,7 +10362,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(388),
+    /* parameters */ ParameterIndex(361),
     /* return_matcher_indices */ MatcherIndicesIndex(9),
     /* const_eval_fn */ ConstEvalFunctionIndex(54),
   },
@@ -10410,7 +10372,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(149),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(58),
@@ -10421,7 +10383,7 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(11),
+    /* templates */ TemplateIndex(37),
     /* parameters */ ParameterIndex(227),
     /* return_matcher_indices */ MatcherIndicesIndex(42),
     /* const_eval_fn */ ConstEvalFunctionIndex(59),
@@ -10443,8 +10405,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 3,
-    /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(389),
+    /* templates */ TemplateIndex(40),
+    /* parameters */ ParameterIndex(362),
     /* return_matcher_indices */ MatcherIndicesIndex(14),
     /* const_eval_fn */ ConstEvalFunctionIndex(73),
   },
@@ -10456,7 +10418,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(182),
+    /* return_matcher_indices */ MatcherIndicesIndex(122),
     /* const_eval_fn */ ConstEvalFunctionIndex(75),
   },
   {
@@ -10467,7 +10429,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(182),
+    /* return_matcher_indices */ MatcherIndicesIndex(122),
     /* const_eval_fn */ ConstEvalFunctionIndex(76),
   },
   {
@@ -10478,7 +10440,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(182),
+    /* return_matcher_indices */ MatcherIndicesIndex(122),
     /* const_eval_fn */ ConstEvalFunctionIndex(77),
   },
   {
@@ -10489,7 +10451,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(78),
   },
   {
@@ -10500,7 +10462,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(184),
+    /* return_matcher_indices */ MatcherIndicesIndex(124),
     /* const_eval_fn */ ConstEvalFunctionIndex(79),
   },
   {
@@ -10511,7 +10473,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(186),
+    /* return_matcher_indices */ MatcherIndicesIndex(126),
     /* const_eval_fn */ ConstEvalFunctionIndex(80),
   },
   {
@@ -10522,7 +10484,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(17),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
@@ -10531,8 +10493,8 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(33),
-    /* parameters */ ParameterIndex(390),
+    /* templates */ TemplateIndex(59),
+    /* parameters */ ParameterIndex(363),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -10542,7 +10504,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(0),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -10553,7 +10515,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(0),
     /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -10564,7 +10526,7 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(0),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -10575,9 +10537,9 @@
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(31),
+    /* templates */ TemplateIndex(57),
     /* parameters */ ParameterIndex(0),
-    /* return_matcher_indices */ MatcherIndicesIndex(232),
+    /* return_matcher_indices */ MatcherIndicesIndex(172),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -10588,7 +10550,7 @@
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
     /* parameters */ ParameterIndex(/* invalid */),
-    /* return_matcher_indices */ MatcherIndicesIndex(188),
+    /* return_matcher_indices */ MatcherIndicesIndex(128),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -10597,7 +10559,7 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(33),
+    /* templates */ TemplateIndex(59),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
@@ -11462,18 +11424,18 @@
   },
   {
     /* [108] */
-    /* fn textureStore[C : iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>) */
-    /* fn textureStore[C : iu32, A : iu32](texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>) */
-    /* fn textureStore[C : iu32, A : iu32](texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>) */
-    /* fn textureStore[C : iu32, A : iu32](texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>) */
-    /* fn textureStore[C : iu32](texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>) */
+    /* fn textureStore[C : iu32, F : f32_texel_format, W : writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<f32>) */
+    /* fn textureStore[C : iu32, F : f32_texel_format, W : writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<f32>) */
+    /* fn textureStore[C : iu32, F : f32_texel_format, W : writable, A : iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<f32>) */
+    /* fn textureStore[C : iu32, F : f32_texel_format, W : writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<f32>) */
+    /* fn textureStore[C : iu32, F : i32_texel_format, W : writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<i32>) */
+    /* fn textureStore[C : iu32, F : i32_texel_format, W : writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<i32>) */
+    /* fn textureStore[C : iu32, F : i32_texel_format, W : writable, A : iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<i32>) */
+    /* fn textureStore[C : iu32, F : i32_texel_format, W : writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<i32>) */
+    /* fn textureStore[C : iu32, F : u32_texel_format, W : writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<u32>) */
+    /* fn textureStore[C : iu32, F : u32_texel_format, W : writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<u32>) */
+    /* fn textureStore[C : iu32, F : u32_texel_format, W : writable, A : iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<u32>) */
+    /* fn textureStore[C : iu32, F : u32_texel_format, W : writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<u32>) */
     /* num overloads */ 12,
     /* overloads */ OverloadIndex(144),
   },
@@ -11488,18 +11450,18 @@
     /* fn textureLoad[C : iu32, A : iu32, L : iu32](texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32 */
     /* fn textureLoad[C : iu32, S : iu32](texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32 */
     /* fn textureLoad[C : iu32](texture: texture_external, coords: vec2<C>) -> vec4<f32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32> */
-    /* fn textureLoad[C : iu32, A : iu32](texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32> */
-    /* fn textureLoad[C : iu32, A : iu32](texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32> */
-    /* fn textureLoad[C : iu32, A : iu32](texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32> */
-    /* fn textureLoad[C : iu32](texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32> */
+    /* fn textureLoad[C : iu32, F : f32_texel_format, R : readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<f32> */
+    /* fn textureLoad[C : iu32, F : i32_texel_format, R : readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<i32> */
+    /* fn textureLoad[C : iu32, F : u32_texel_format, R : readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<u32> */
+    /* fn textureLoad[C : iu32, F : f32_texel_format, R : readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<f32> */
+    /* fn textureLoad[C : iu32, F : i32_texel_format, R : readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<i32> */
+    /* fn textureLoad[C : iu32, F : u32_texel_format, R : readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<u32> */
+    /* fn textureLoad[C : iu32, F : f32_texel_format, R : readable, A : iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<f32> */
+    /* fn textureLoad[C : iu32, F : i32_texel_format, R : readable, A : iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<i32> */
+    /* fn textureLoad[C : iu32, F : u32_texel_format, R : readable, A : iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<u32> */
+    /* fn textureLoad[C : iu32, F : f32_texel_format, R : readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<f32> */
+    /* fn textureLoad[C : iu32, F : i32_texel_format, R : readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<i32> */
+    /* fn textureLoad[C : iu32, F : u32_texel_format, R : readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<u32> */
     /* num overloads */ 21,
     /* overloads */ OverloadIndex(52),
   },
diff --git a/src/tint/lang/wgsl/intrinsic/table_test.cc b/src/tint/lang/wgsl/intrinsic/table_test.cc
index cbbeeda..4912c68 100644
--- a/src/tint/lang/wgsl/intrinsic/table_test.cc
+++ b/src/tint/lang/wgsl/intrinsic/table_test.cc
@@ -548,33 +548,56 @@
               R"(no matching call to 'textureDimensions(bool, bool)'
 
 27 candidate functions:
-  'textureDimensions(texture: texture_1d<T>, level: L) -> u32'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>, level: L) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_1d<T>) -> u32'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_1d<F, A>) -> u32'
-  'textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<u32>'
-  'textureDimensions(texture: texture_external) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ , level: L  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ , level: L  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_multisampled_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_1d<F, A>  ✗ ) -> u32'
+ • 'textureDimensions(texture: texture_storage_2d<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_2d_array<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_3d<F, A>  ✗ ) -> vec3<u32>'
+ • 'textureDimensions(texture: texture_external  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_multisampled_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
 )");
 }
 
@@ -588,33 +611,56 @@
               R"(no matching call to 'textureDimensions(texture_depth_2d, bool)'
 
 27 candidate functions:
-  'textureDimensions(texture: texture_depth_2d, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_1d<T>, level: L) -> u32'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>, level: L) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>, level: L) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32', 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_cube_array, level: L) -> vec2<u32>'  where: 'L' is 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_1d<T>) -> u32'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_2d_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_3d<T>) -> vec3<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_cube_array<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<u32>'  where: 'T' is 'f32', 'i32' or 'u32'
-  'textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>'
-  'textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_1d<F, A>) -> u32'
-  'textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<u32>'
-  'textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<u32>'
-  'textureDimensions(texture: texture_external) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d  ✓ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d  ✓ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ , level: L  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ , level: L  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ , level: L  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+      ✗  'L' is 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_depth_2d_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_cube_array  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_depth_multisampled_2d  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_1d<F, A>  ✗ ) -> u32'
+ • 'textureDimensions(texture: texture_storage_2d<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_2d_array<F, A>  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_storage_3d<F, A>  ✗ ) -> vec3<u32>'
+ • 'textureDimensions(texture: texture_external  ✗ ) -> vec2<u32>'
+ • 'textureDimensions(texture: texture_1d<T>  ✗ ) -> u32' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_2d_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_3d<T>  ✗ ) -> vec3<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_cube_array<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
+ • 'textureDimensions(texture: texture_multisampled_2d<T>  ✗ ) -> vec2<u32>' where:
+      ✗  'T' is 'f32', 'i32' or 'u32'
 )");
 }
 
@@ -633,8 +679,10 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator - (bool)'
 
 2 candidate operators:
-  'operator - (T) -> T'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32' or 'f16'
-  'operator - (vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32' or 'f16'
+ • 'operator - (T  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32' or 'f16'
+ • 'operator - (vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32' or 'f16'
 )");
 }
 
@@ -675,15 +723,24 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator * (f32, bool)'
 
 9 candidate operators:
-  'operator * (T, T) -> T'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator * (vecN<T>, T) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator * (T, vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator * (T, matNxM<T>) -> matNxM<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator * (matNxM<T>, T) -> matNxM<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator * (vecN<T>, vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator * (matCxR<T>, vecC<T>) -> vecR<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator * (vecR<T>, matCxR<T>) -> vecC<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator * (matKxR<T>, matCxK<T>) -> matCxR<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator * (T  ✓ , T  ✗ ) -> T' where:
+      ✓  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (T  ✓ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (T  ✓ , matNxM<T>  ✗ ) -> matNxM<T>' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator * (vecN<T>  ✗ , T  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (matNxM<T>  ✗ , T  ✗ ) -> matNxM<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator * (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator * (matCxR<T>  ✗ , vecC<T>  ✗ ) -> vecR<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator * (vecR<T>  ✗ , matCxR<T>  ✗ ) -> vecC<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator * (matKxR<T>  ✗ , matCxK<T>  ✗ ) -> matCxR<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -709,15 +766,24 @@
     EXPECT_EQ(result.Failure().Plain(), R"(no matching overload for 'operator *= (f32, bool)'
 
 9 candidate operators:
-  'operator *= (T, T) -> T'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (vecN<T>, T) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (T, vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (T, matNxM<T>) -> matNxM<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator *= (matNxM<T>, T) -> matNxM<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator *= (vecN<T>, vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'operator *= (matCxR<T>, vecC<T>) -> vecR<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator *= (vecR<T>, matCxR<T>) -> vecC<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'operator *= (matKxR<T>, matCxK<T>) -> matCxR<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator *= (T  ✓ , T  ✗ ) -> T' where:
+      ✓  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (T  ✓ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (T  ✓ , matNxM<T>  ✗ ) -> matNxM<T>' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator *= (vecN<T>  ✗ , T  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (matNxM<T>  ✗ , T  ✗ ) -> matNxM<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator *= (vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'operator *= (matCxR<T>  ✗ , vecC<T>  ✗ ) -> vecR<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator *= (vecR<T>  ✗ , matCxR<T>  ✗ ) -> vecC<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'operator *= (matKxR<T>  ✗ , matCxK<T>  ✗ ) -> matCxR<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -761,25 +827,46 @@
               R"(no matching constructor for 'vec3(i32, f32, i32)'
 
 12 candidate constructors:
-  'vec3(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3() -> vec3<abstract-int>'
-  'vec3<T>() -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✓ , y: T  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(xy: vec2<T>  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✓ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3() -> vec3<abstract-int>'
+ • 'vec3(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(x: T  ✓ , y: T  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(xy: vec2<T>  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(x: T  ✓ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >() -> vec3<T>' where:
+      ✗  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f32', 'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f16', 'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'i32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'u32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'bool', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'i32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
@@ -793,25 +880,48 @@
               R"(no matching constructor for 'vec3<i32>(i32, f32, i32)'
 
 12 candidate constructors:
-  'vec3<T>(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3() -> vec3<abstract-int>'
-  'vec3<T>() -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✓ , y: T  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✓ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(xy: vec2<T>  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >() -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✓ , y: T  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(xy: vec2<T>  ✗ , z: T  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✓ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(T  ✓ ) -> vec3<T>' where:
+      ✗  overload expects 0 template arguments
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3() -> vec3<abstract-int>' where:
+      ✗  overload expects 0 template arguments
+ • 'vec3(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f32', 'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f16', 'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'i32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'u32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'bool', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
+ • 'vec3<T  ✓ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'i32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
@@ -902,25 +1012,47 @@
               R"(no matching constructor for 'vec3<f32>(array<u32>)'
 
 12 candidate constructors:
-  'vec3<T>(vec3<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3() -> vec3<abstract-int>'
-  'vec3<T>() -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(x: T, yz: vec2<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(xy: vec2<T>, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3<T>(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(x: T, y: T, z: T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(T) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'vec3(vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >() -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(xy: vec2<T>  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✗ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✓ >(x: T  ✗ , y: T  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(T  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3() -> vec3<abstract-int>' where:
+      ✗  overload expects 0 template arguments
+ • 'vec3(vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✗ , yz: vec2<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(xy: vec2<T>  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'vec3(x: T  ✗ , y: T  ✗ , z: T  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 
 5 candidate conversions:
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f32', 'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'f16', 'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'i32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'u32', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
-  'vec3<T>(vec3<U>) -> vec3<T>'  where: 'T' is 'bool', 'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
+ • 'vec3<T  ✓ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✓  'T' is 'f32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'i32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'f16'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'i32', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'i32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'u32'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'bool'
+ • 'vec3<T  ✗ >(vec3<U>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'bool'
+      ✗  'U' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32' or 'u32'
 )");
 }
 
diff --git a/src/tint/lang/wgsl/resolver/builtin_test.cc b/src/tint/lang/wgsl/resolver/builtin_test.cc
index 7dfdf9f..b29c901 100644
--- a/src/tint/lang/wgsl/resolver/builtin_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_test.cc
@@ -166,9 +166,12 @@
               R"(error: no matching call to 'select()'
 
 3 candidate functions:
-  'select(T, T, bool) -> T'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, bool) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, vecN<bool>) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(T  ✗ , T  ✗ , bool  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , bool  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , vecN<bool>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -182,9 +185,12 @@
               R"(error: no matching call to 'select(i32, i32, i32)'
 
 3 candidate functions:
-  'select(T, T, bool) -> T'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, bool) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, vecN<bool>) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(T  ✓ , T  ✓ , bool  ✗ ) -> T' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , bool  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , vecN<bool>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -200,9 +206,12 @@
               R"(error: no matching call to 'select(mat2x2<f32>, mat2x2<f32>, bool)'
 
 3 candidate functions:
-  'select(T, T, bool) -> T'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, bool) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, vecN<bool>) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(T  ✗ , T  ✗ , bool  ✓ ) -> T' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , bool  ✓ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✗ , vecN<bool>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -216,9 +225,12 @@
               R"(error: no matching call to 'select(f32, vec2<f32>, bool)'
 
 3 candidate functions:
-  'select(T, T, bool) -> T'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, bool) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, vecN<bool>) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(T  ✓ , T  ✗ , bool  ✓ ) -> T' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✓ , bool  ✓ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✗ , vecN<T>  ✓ , vecN<bool>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -232,9 +244,12 @@
               R"(error: no matching call to 'select(vec2<f32>, vec3<f32>, bool)'
 
 3 candidate functions:
-  'select(T, T, bool) -> T'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, bool) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
-  'select(vecN<T>, vecN<T>, vecN<bool>) -> vecN<T>'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✓ , vecN<T>  ✗ , bool  ✓ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(T  ✗ , T  ✗ , bool  ✓ ) -> T' where:
+      ✗  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
+ • 'select(vecN<T>  ✓ , vecN<T>  ✗ , vecN<bool>  ✗ ) -> vecN<T>' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'i32', 'u32' or 'bool'
 )");
 }
 
@@ -271,7 +286,7 @@
               R"(error: no matching call to 'arrayLength(ptr<private, array<i32, 4>, read_write>)'
 
 1 candidate function:
-  'arrayLength(ptr<storage, array<T>, A>) -> u32'
+ • 'arrayLength(ptr<storage, array<T>, A>  ✗ ) -> u32'
 )");
 }
 
@@ -800,7 +815,8 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'cross()'
 
 1 candidate function:
-  'cross(vec3<T>, vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'cross(vec3<T>  ✗ , vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -813,7 +829,8 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'cross(f32, f32)'
 
 1 candidate function:
-  'cross(vec3<T>, vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'cross(vec3<T>  ✗ , vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -827,7 +844,8 @@
               R"(error: no matching call to 'cross(vec3<i32>, vec3<i32>)'
 
 1 candidate function:
-  'cross(vec3<T>, vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'cross(vec3<T>  ✗ , vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -843,7 +861,8 @@
               R"(error: no matching call to 'cross(vec4<f32>, vec4<f32>)'
 
 1 candidate function:
-  'cross(vec3<T>, vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'cross(vec3<T>  ✗ , vec3<T>  ✗ ) -> vec3<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -859,7 +878,8 @@
               R"(error: no matching call to 'cross(vec3<f32>, vec3<f32>, vec3<f32>)'
 
 1 candidate function:
-  'cross(vec3<T>, vec3<T>) -> vec3<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'cross(vec3<T>  ✓ , vec3<T>  ✓ ) -> vec3<T>' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -919,8 +939,10 @@
               R"(error: no matching call to 'distance(vec3<f32>, vec3<f32>, vec3<f32>)'
 
 2 candidate functions:
-  'distance(T, T) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'distance(vecN<T>, vecN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(vecN<T>  ✓ , vecN<T>  ✓ ) -> T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(T  ✗ , T  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -933,8 +955,10 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'distance(vec3<f32>)'
 
 2 candidate functions:
-  'distance(T, T) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'distance(vecN<T>, vecN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(vecN<T>  ✓ , vecN<T>  ✗ ) -> T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(T  ✗ , T  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -947,8 +971,10 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'distance()'
 
 2 candidate functions:
-  'distance(T, T) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'distance(vecN<T>, vecN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(T  ✗ , T  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'distance(vecN<T>  ✗ , vecN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1093,8 +1119,10 @@
               R"(error: no matching call to 'frexp(i32, ptr<workgroup, i32, read_write>)'
 
 2 candidate functions:
-  'frexp(T) -> __frexp_result_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'frexp(vecN<T>) -> __frexp_result_vecN_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'frexp(T  ✗ ) -> __frexp_result_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'frexp(vecN<T>  ✗ ) -> __frexp_result_vecN_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1152,8 +1180,10 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'length()'
 
 2 candidate functions:
-  'length(T) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'length(vecN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'length(T  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'length(vecN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1166,8 +1196,10 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'length(f32, f32)'
 
 2 candidate functions:
-  'length(T) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'length(vecN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'length(T  ✓ ) -> T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'length(vecN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1342,8 +1374,10 @@
               R"(error: no matching call to 'modf(i32, ptr<workgroup, f32, read_write>)'
 
 2 candidate functions:
-  'modf(T) -> __modf_result_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'modf(vecN<T>) -> __modf_result_vecN_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(T  ✗ ) -> __modf_result_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(vecN<T>  ✗ ) -> __modf_result_vecN_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1358,8 +1392,10 @@
               R"(error: no matching call to 'modf(f32, ptr<workgroup, i32, read_write>)'
 
 2 candidate functions:
-  'modf(T) -> __modf_result_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'modf(vecN<T>) -> __modf_result_vecN_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(T  ✓ ) -> __modf_result_T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(vecN<T>  ✗ ) -> __modf_result_vecN_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1372,8 +1408,10 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'modf(f32, f32)'
 
 2 candidate functions:
-  'modf(T) -> __modf_result_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'modf(vecN<T>) -> __modf_result_vecN_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(T  ✓ ) -> __modf_result_T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(vecN<T>  ✗ ) -> __modf_result_vecN_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1388,8 +1426,10 @@
               R"(error: no matching call to 'modf(vec2<f32>, ptr<workgroup, vec4<f32>, read_write>)'
 
 2 candidate functions:
-  'modf(T) -> __modf_result_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
-  'modf(vecN<T>) -> __modf_result_vecN_T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(vecN<T>  ✓ ) -> __modf_result_vecN_T' where:
+      ✓  'T' is 'abstract-float', 'f32' or 'f16'
+ • 'modf(T  ✗ ) -> __modf_result_T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1429,7 +1469,8 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'normalize()'
 
 1 candidate function:
-  'normalize(vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'normalize(vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1946,7 +1987,8 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'determinant(mat2x3<f32>)'
 
 1 candidate function:
-  'determinant(matNxN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'determinant(matNxN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -1961,7 +2003,8 @@
     EXPECT_EQ(r()->error(), R"(error: no matching call to 'determinant(f32)'
 
 1 candidate function:
-  'determinant(matNxN<T>) -> T'  where: 'T' is 'abstract-float', 'f32' or 'f16'
+ • 'determinant(matNxN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'f32' or 'f16'
 )");
 }
 
@@ -2030,7 +2073,8 @@
               R"(error: no matching call to 'dot(f32, f32)'
 
 1 candidate function:
-  'dot(vecN<T>, vecN<T>) -> T'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'dot(vecN<T>  ✗ , vecN<T>  ✗ ) -> T' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
 )");
 }
 
@@ -2082,8 +2126,12 @@
 
     EXPECT_EQ(r()->error(), "error: no matching call to '" + name +
                                 "()'\n\n"
-                                "2 candidate functions:\n  '" +
-                                name + "(f32) -> f32'\n  '" + name + "(vecN<f32>) -> vecN<f32>'\n");
+                                "2 candidate functions:\n"
+                                " • '" +
+                                name +
+                                "(f32  ✗ ) -> f32'\n"
+                                " • '" +
+                                name + "(vecN<f32>  ✗ ) -> vecN<f32>'\n");
 }
 
 INSTANTIATE_TEST_SUITE_P(ResolverTest,
diff --git a/src/tint/lang/wgsl/resolver/builtin_validation_test.cc b/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
index 0c063d8..6b55f36 100644
--- a/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
@@ -167,11 +167,12 @@
     EXPECT_EQ(r()->error(), R"(56:78 error: no matching constructor for 'i32(f32, f32, f32)'
 
 2 candidate constructors:
-  'i32(i32) -> i32'
-  'i32() -> i32'
+ • 'i32(i32  ✗ ) -> i32'
+ • 'i32() -> i32'
 
 1 candidate conversion:
-  'i32(T) -> i32'  where: 'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
+ • 'i32(T  ✓ ) -> i32' where:
+      ✓  'T' is 'abstract-int', 'abstract-float', 'f32', 'f16', 'u32' or 'bool'
 )");
 }
 
@@ -781,7 +782,7 @@
               R"(error: no matching call to 'workgroupUniformLoad(ptr<storage, i32, read_write>)'
 
 1 candidate function:
-  'workgroupUniformLoad(ptr<workgroup, T, read_write>) -> T'
+ • 'workgroupUniformLoad(ptr<workgroup, T, read_write>  ✗ ) -> T'
 )");
 }
 
diff --git a/src/tint/lang/wgsl/resolver/call_validation_test.cc b/src/tint/lang/wgsl/resolver/call_validation_test.cc
index 001fb4e..b10f3fc 100644
--- a/src/tint/lang/wgsl/resolver/call_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/call_validation_test.cc
@@ -522,8 +522,11 @@
               R"(12:34 error: no matching call to 'min<i32>(abstract-int, abstract-int)'
 
 2 candidate functions:
-  'min(T, T) -> T'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
-  'min(vecN<T>, vecN<T>) -> vecN<T>'  where: 'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'min(T  ✓ , T  ✓ ) -> T' where:
+      ✗  overload expects 0 template arguments
+      ✓  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
+ • 'min(vecN<T>  ✗ , vecN<T>  ✗ ) -> vecN<T>' where:
+      ✗  'T' is 'abstract-float', 'abstract-int', 'f32', 'i32', 'u32' or 'f16'
 )");
 }
 
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index e61ab87..8a1740b 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -542,18 +542,18 @@
 @must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_cube_array,sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32
 @must_use fn textureSampleBaseClampToEdge(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use fn textureSampleBaseClampToEdge(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureStore[C: iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>)
-fn textureStore[C: iu32](texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>)
-fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>)
-fn textureStore[C: iu32](texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>)
-fn textureStore[C: iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>)
-fn textureStore[C: iu32](texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>)
-fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>)
-fn textureStore[C: iu32](texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>)
-fn textureStore[C: iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>)
-fn textureStore[C: iu32](texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>)
-fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>)
-fn textureStore[C: iu32](texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>)
+fn textureStore[C: iu32, F: f32_texel_format, W: writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<f32>)
+fn textureStore[C: iu32, F: f32_texel_format, W: writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<f32>)
+fn textureStore[C: iu32, F: f32_texel_format, W: writable, A: iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<f32>)
+fn textureStore[C: iu32, F: f32_texel_format, W: writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<f32>)
+fn textureStore[C: iu32, F: i32_texel_format, W: writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<i32>)
+fn textureStore[C: iu32, F: i32_texel_format, W: writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<i32>)
+fn textureStore[C: iu32, F: i32_texel_format, W: writable, A: iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<i32>)
+fn textureStore[C: iu32, F: i32_texel_format, W: writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<i32>)
+fn textureStore[C: iu32, F: u32_texel_format, W: writable](texture: texture_storage_1d<F, W>, coords: C, value: vec4<u32>)
+fn textureStore[C: iu32, F: u32_texel_format, W: writable](texture: texture_storage_2d<F, W>, coords: vec2<C>, value: vec4<u32>)
+fn textureStore[C: iu32, F: u32_texel_format, W: writable, A: iu32](texture: texture_storage_2d_array<F, W>, coords: vec2<C>, array_index: A, value: vec4<u32>)
+fn textureStore[C: iu32, F: u32_texel_format, W: writable](texture: texture_storage_3d<F, W>, coords: vec3<C>, value: vec4<u32>)
 @must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_1d<T>, coords: C, level: L) -> vec4<T>
 @must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_2d<T>, coords: vec2<C>, level: L) -> vec4<T>
 @must_use fn textureLoad[T: fiu32, C: iu32, A: iu32, L: iu32](texture: texture_2d_array<T>, coords: vec2<C>, array_index: A, level: L) -> vec4<T>
@@ -563,18 +563,18 @@
 @must_use fn textureLoad[C: iu32, A: iu32, L: iu32](texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32
 @must_use fn textureLoad[C: iu32, S: iu32](texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32
 @must_use fn textureLoad[C: iu32](texture: texture_external, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32>
-@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32>
-@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32>
-@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32>
-@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, F: f32_texel_format, R: readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, F: i32_texel_format, R: readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, F: u32_texel_format, R: readable](texture: texture_storage_1d<F, R>, coords: C) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, F: f32_texel_format, R: readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, F: i32_texel_format, R: readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, F: u32_texel_format, R: readable](texture: texture_storage_2d<F, R>, coords: vec2<C>) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, F: f32_texel_format, R: readable, A: iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, F: i32_texel_format, R: readable, A: iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, F: u32_texel_format, R: readable, A: iu32](texture: texture_storage_2d_array<F, R>, coords: vec2<C>, array_index: A) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, F: f32_texel_format, R: readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, F: i32_texel_format, R: readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, F: u32_texel_format, R: readable](texture: texture_storage_3d<F, R>, coords: vec3<C>) -> vec4<u32>
 
 @stage("fragment", "compute") fn atomicLoad[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T
 @stage("fragment", "compute") fn atomicStore[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T)
diff --git a/src/tint/utils/BUILD.cmake b/src/tint/utils/BUILD.cmake
index badeb73..1771b07 100644
--- a/src/tint/utils/BUILD.cmake
+++ b/src/tint/utils/BUILD.cmake
@@ -53,5 +53,6 @@
 include(utils/socket/BUILD.cmake)
 include(utils/strconv/BUILD.cmake)
 include(utils/symbol/BUILD.cmake)
+include(utils/system/BUILD.cmake)
 include(utils/text/BUILD.cmake)
 include(utils/traits/BUILD.cmake)
diff --git a/src/tint/utils/system/BUILD.bazel b/src/tint/utils/system/BUILD.bazel
new file mode 100644
index 0000000..1cac5ca
--- /dev/null
+++ b/src/tint/utils/system/BUILD.bazel
@@ -0,0 +1,121 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. 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.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# 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.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.bazel.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+load("//src/tint:flags.bzl", "COPTS")
+load("@bazel_skylib//lib:selects.bzl", "selects")
+cc_library(
+  name = "system",
+  srcs = [
+  ] + select({
+    ":_not_tint_build_is_linux__and__not_tint_build_is_mac__and__not_tint_build_is_win_": [
+      "terminal_other.cc",
+    ],
+    "//conditions:default": [],
+  }) + select({
+    ":_not_tint_build_is_win_": [
+      "env_other.cc",
+    ],
+    "//conditions:default": [],
+  }) + select({
+    ":tint_build_is_linux_or_tint_build_is_mac": [
+      "terminal_posix.cc",
+    ],
+    "//conditions:default": [],
+  }) + select({
+    ":tint_build_is_win": [
+      "env_windows.cc",
+      "terminal_windows.cc",
+    ],
+    "//conditions:default": [],
+  }),
+  hdrs = [
+    "env.h",
+    "terminal.h",
+  ],
+  deps = [
+    "//src/tint/utils/macros",
+  ],
+  copts = COPTS,
+  visibility = ["//visibility:public"],
+)
+
+alias(
+  name = "tint_build_is_linux",
+  actual = "//src/tint:tint_build_is_linux_true",
+)
+
+alias(
+  name = "_not_tint_build_is_linux_",
+  actual = "//src/tint:tint_build_is_linux_false",
+)
+
+alias(
+  name = "tint_build_is_mac",
+  actual = "//src/tint:tint_build_is_mac_true",
+)
+
+alias(
+  name = "_not_tint_build_is_mac_",
+  actual = "//src/tint:tint_build_is_mac_false",
+)
+
+alias(
+  name = "tint_build_is_win",
+  actual = "//src/tint:tint_build_is_win_true",
+)
+
+alias(
+  name = "_not_tint_build_is_win_",
+  actual = "//src/tint:tint_build_is_win_false",
+)
+
+selects.config_setting_group(
+    name = "tint_build_is_linux_or_tint_build_is_mac",
+    match_any = [
+        "tint_build_is_linux",
+        "tint_build_is_mac",
+    ],
+)
+
+selects.config_setting_group(
+    name = "_not_tint_build_is_linux__and__not_tint_build_is_mac__and__not_tint_build_is_win_",
+    match_all = [
+        ":_not_tint_build_is_linux_",
+        ":_not_tint_build_is_mac_",
+        ":_not_tint_build_is_win_",
+    ],
+)
+
diff --git a/src/tint/utils/system/BUILD.cmake b/src/tint/utils/system/BUILD.cmake
new file mode 100644
index 0000000..748da7d
--- /dev/null
+++ b/src/tint/utils/system/BUILD.cmake
@@ -0,0 +1,73 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. 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.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# 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.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.cmake.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+################################################################################
+# Target:    tint_utils_system
+# Kind:      lib
+################################################################################
+tint_add_target(tint_utils_system lib
+  utils/system/env.h
+  utils/system/terminal.h
+)
+
+tint_target_add_dependencies(tint_utils_system lib
+  tint_utils_macros
+)
+
+if((NOT TINT_BUILD_IS_LINUX) AND (NOT TINT_BUILD_IS_MAC) AND (NOT TINT_BUILD_IS_WIN))
+  tint_target_add_sources(tint_utils_system lib
+    "utils/system/terminal_other.cc"
+  )
+endif((NOT TINT_BUILD_IS_LINUX) AND (NOT TINT_BUILD_IS_MAC) AND (NOT TINT_BUILD_IS_WIN))
+
+if((NOT TINT_BUILD_IS_WIN))
+  tint_target_add_sources(tint_utils_system lib
+    "utils/system/env_other.cc"
+  )
+endif((NOT TINT_BUILD_IS_WIN))
+
+if(TINT_BUILD_IS_LINUX OR TINT_BUILD_IS_MAC)
+  tint_target_add_sources(tint_utils_system lib
+    "utils/system/terminal_posix.cc"
+  )
+endif(TINT_BUILD_IS_LINUX OR TINT_BUILD_IS_MAC)
+
+if(TINT_BUILD_IS_WIN)
+  tint_target_add_sources(tint_utils_system lib
+    "utils/system/env_windows.cc"
+    "utils/system/terminal_windows.cc"
+  )
+endif(TINT_BUILD_IS_WIN)
diff --git a/src/tint/utils/system/BUILD.gn b/src/tint/utils/system/BUILD.gn
new file mode 100644
index 0000000..5f101c1
--- /dev/null
+++ b/src/tint/utils/system/BUILD.gn
@@ -0,0 +1,66 @@
+# Copyright 2024 The Dawn & Tint Authors
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. 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.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+#    contributors may be used to endorse or promote products derived from
+#    this software without specific prior written permission.
+#
+# 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.
+
+################################################################################
+# File generated by 'tools/src/cmd/gen' using the template:
+#   tools/src/cmd/gen/build/BUILD.gn.tmpl
+#
+# To regenerate run: './tools/run gen'
+#
+#                       Do not modify this file directly
+################################################################################
+
+import("../../../../scripts/tint_overrides_with_defaults.gni")
+
+import("${tint_src_dir}/tint.gni")
+
+libtint_source_set("system") {
+  sources = [
+    "env.h",
+    "terminal.h",
+  ]
+  deps = [ "${tint_src_dir}/utils/macros" ]
+
+  if (!tint_build_is_linux && !tint_build_is_mac && !tint_build_is_win) {
+    sources += [ "terminal_other.cc" ]
+  }
+
+  if (!tint_build_is_win) {
+    sources += [ "env_other.cc" ]
+  }
+
+  if (tint_build_is_linux || tint_build_is_mac) {
+    sources += [ "terminal_posix.cc" ]
+  }
+
+  if (tint_build_is_win) {
+    sources += [
+      "env_windows.cc",
+      "terminal_windows.cc",
+    ]
+  }
+}
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/utils/system/env.h
similarity index 81%
copy from src/tint/api/options/array_length_from_uniform_test.cc
copy to src/tint/utils/system/env.h
index c62092a..bcf2b46 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/utils/system/env.h
@@ -25,16 +25,18 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+#ifndef SRC_TINT_UTILS_SYSTEM_ENV_H_
+#define SRC_TINT_UTILS_SYSTEM_ENV_H_
 
-#include <gtest/gtest.h>
+#include <string>
 
 namespace tint {
-namespace {
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
-}
+/// @param name the name of the environment variable
+/// @returns the environment variable value with the given name, or an empty string if the variable
+/// was not found.
+std::string GetEnvVar(std::string_view name);
 
-}  // namespace
 }  // namespace tint
+
+#endif  // SRC_TINT_UTILS_SYSTEM_ENV_H_
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/utils/system/env_other.cc
similarity index 85%
copy from src/tint/api/options/array_length_from_uniform_test.cc
copy to src/tint/utils/system/env_other.cc
index c62092a..cdf5759 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/utils/system/env_other.cc
@@ -25,16 +25,20 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+// GEN_BUILD:CONDITION(!tint_build_is_win)
 
-#include <gtest/gtest.h>
+#include "src/tint/utils/system/env.h"
+
+#include <cstdlib>
+#include <string_view>
 
 namespace tint {
-namespace {
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
+std::string GetEnvVar(std::string_view name) {
+    if (auto* val = std::getenv(name.data())) {
+        return val;
+    }
+    return "";
 }
 
-}  // namespace
 }  // namespace tint
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/utils/system/env_windows.cc
similarity index 78%
copy from src/tint/api/options/array_length_from_uniform_test.cc
copy to src/tint/utils/system/env_windows.cc
index c62092a..534b358 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/utils/system/env_windows.cc
@@ -25,16 +25,25 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+// GEN_BUILD:CONDITION(tint_build_is_win)
 
-#include <gtest/gtest.h>
+#include "src/tint/utils/system/env.h"
+
+#include <stdlib.h>
+#include <string_view>
 
 namespace tint {
-namespace {
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
+std::string GetEnvVar(std::string_view name) {
+    // Use _dupenv_s to avoid unsafe warnings about std::getenv
+    char* value = nullptr;
+    _dupenv_s(&value, nullptr, name.data());
+    if (value) {
+        std::string result = value;
+        free(value);
+        return result;
+    }
+    return "";
 }
 
-}  // namespace
 }  // namespace tint
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/utils/system/terminal.h
similarity index 71%
copy from src/tint/api/options/array_length_from_uniform_test.cc
copy to src/tint/utils/system/terminal.h
index c62092a..2374496 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/utils/system/terminal.h
@@ -25,16 +25,25 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+#ifndef SRC_TINT_UTILS_SYSTEM_TERMINAL_H_
+#define SRC_TINT_UTILS_SYSTEM_TERMINAL_H_
 
-#include <gtest/gtest.h>
+#include <cstdio>
+#include <optional>
 
 namespace tint {
-namespace {
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
-}
+/// Detects whether the terminal at @p out supports color output.
+/// @param out the file to print to.
+/// @return true if the terminal supports colors.
+bool TerminalSupportsColors(FILE* out);
 
-}  // namespace
+/// Attempts to detect whether the terminal at @p out is dark.
+/// @param out the file to print to.
+/// @returns true if the terminal is dark, false if the terminal is light, or nullopt if
+/// unknown.
+std::optional<bool> TerminalIsDark(FILE* out);
+
 }  // namespace tint
+
+#endif  // SRC_TINT_UTILS_SYSTEM_TERMINAL_H_
diff --git a/src/tint/api/options/array_length_from_uniform_test.cc b/src/tint/utils/system/terminal_other.cc
similarity index 85%
rename from src/tint/api/options/array_length_from_uniform_test.cc
rename to src/tint/utils/system/terminal_other.cc
index c62092a..96e7263 100644
--- a/src/tint/api/options/array_length_from_uniform_test.cc
+++ b/src/tint/utils/system/terminal_other.cc
@@ -25,16 +25,18 @@
 // 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.
 
-#include "src/tint/api/options/array_length_from_uniform.h"
+// GEN_BUILD:CONDITION((!tint_build_is_linux) && (!tint_build_is_mac) && (!tint_build_is_win))
 
-#include <gtest/gtest.h>
+#include "src/tint/utils/system/terminal.h"
 
 namespace tint {
-namespace {
 
-TEST(TintCheckAllFieldsReflected, ApiOptionsArrayLengthFromUniformTest) {
-    TINT_ASSERT_ALL_FIELDS_REFLECTED(ArrayLengthFromUniformOptions);
+bool TerminalSupportsColors(FILE*) {
+    return false;
 }
 
-}  // namespace
+std::optional<bool> TerminalIsDark(FILE*) {
+    return std::nullopt;
+}
+
 }  // namespace tint
diff --git a/src/tint/utils/system/terminal_posix.cc b/src/tint/utils/system/terminal_posix.cc
new file mode 100644
index 0000000..699966d
--- /dev/null
+++ b/src/tint/utils/system/terminal_posix.cc
@@ -0,0 +1,184 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. 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.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// 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.
+
+// GEN_BUILD:CONDITION(tint_build_is_linux || tint_build_is_mac)
+
+#include <unistd.h>
+
+#include <termios.h>
+#include <chrono>
+#include <cstdint>
+#include <cstdio>
+#include <cstring>
+#include <optional>
+#include <string_view>
+#include <utility>
+
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/system/env.h"
+#include "src/tint/utils/system/terminal.h"
+
+namespace tint {
+
+bool TerminalSupportsColors(FILE* f) {
+    if (!isatty(fileno(f))) {
+        return false;
+    }
+
+    if (auto term = GetEnvVar("TERM"); !term.empty()) {
+        return term == "cygwin" || term == "linux" || term == "rxvt-unicode-256color" ||
+               term == "rxvt-unicode" || term == "screen-256color" || term == "screen" ||
+               term == "tmux-256color" || term == "tmux" || term == "xterm-256color" ||
+               term == "xterm-color" || term == "xterm";
+    }
+
+    return false;
+}
+
+/// Probes the terminal using a Device Control escape sequence to get the background color.
+/// @see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Device-Control-functions
+std::optional<bool> TerminalIsDark(FILE* out) {
+    if (!TerminalSupportsColors(out)) {
+        return std::nullopt;
+    }
+
+    // Get the file descriptor for 'out'
+    int out_fd = fileno(out);
+    if (out_fd == -1) {
+        return std::nullopt;
+    }
+
+    // Store the current attributes for 'out', restore it before returning
+    termios original_state{};
+    tcgetattr(out_fd, &original_state);
+    TINT_DEFER(tcsetattr(out_fd, TCSADRAIN, &original_state));
+
+    // Prevent echoing.
+    termios state = original_state;
+    state.c_lflag &= ~static_cast<tcflag_t>(ECHO | ICANON);
+    tcsetattr(out_fd, TCSADRAIN, &state);
+
+    // Emit the device control escape sequence to query the terminal colors.
+    static constexpr std::string_view kQuery = "\x1b]11;?\x07";
+    fwrite(kQuery.data(), 1, kQuery.length(), out);
+    fflush(out);
+
+    // Timeout for attempting to read the response.
+    static constexpr auto kTimeout = std::chrono::milliseconds(100);
+
+    // Record the start time.
+    auto start = std::chrono::steady_clock::now();
+
+    // Helpers for parsing the response.
+    std::optional<char> peek;
+    auto read = [&]() -> std::optional<char> {
+        if (peek) {
+            char c = *peek;
+            peek.reset();
+            return c;
+        }
+        while ((std::chrono::steady_clock::now() - start) < kTimeout) {
+            char c;
+            if (fread(&c, 1, 1, stdin) == 1) {
+                return c;
+            }
+        }
+        return std::nullopt;
+    };
+
+    auto match = [&](std::string_view str) {
+        for (char c : str) {
+            if (c != read()) {
+                return false;
+            }
+        }
+        return true;
+    };
+
+    struct Hex {
+        uint32_t num = 0;  // The parsed hex number
+        uint32_t len = 0;  // Number of hex digits parsed
+    };
+    auto hex = [&] {
+        uint32_t num = 0;
+        uint32_t len = 0;
+        while (auto c = read()) {
+            if (c >= '0' && c <= '9') {
+                num = num * 16 + static_cast<uint32_t>(*c - '0');
+                len++;
+            } else if (c >= 'a' && c <= 'z') {
+                num = num * 16 + 10 + static_cast<uint32_t>(*c - 'a');
+                len++;
+            } else if (c >= 'A' && c <= 'Z') {
+                num = num * 16 + 10 + static_cast<uint32_t>(*c - 'A');
+                len++;
+            } else {
+                peek = c;
+                break;
+            }
+        }
+        return Hex{num, len};
+    };
+
+    if (!match("\033]11;rgb:")) {
+        return std::nullopt;
+    }
+
+    auto r_i = hex();
+    if (!match("/")) {
+        return std::nullopt;
+    }
+    auto g_i = hex();
+    if (!match("/")) {
+        return std::nullopt;
+    }
+    auto b_i = hex();
+
+    if (r_i.len != g_i.len || g_i.len != b_i.len) {
+        return std::nullopt;
+    }
+
+    uint32_t max = 0;
+    switch (r_i.len) {
+        case 2:  // rr/gg/bb
+            max = 0xff;
+            break;
+        case 4:  // rrrr/gggg/bbbb
+            max = 0xffff;
+            break;
+        default:
+            return std::nullopt;
+    }
+
+    // https://en.wikipedia.org/wiki/Relative_luminance
+    float r = static_cast<float>(r_i.num) / static_cast<float>(max);
+    float g = static_cast<float>(g_i.num) / static_cast<float>(max);
+    float b = static_cast<float>(b_i.num) / static_cast<float>(max);
+    return (0.2126f * r + 0.7152f * g + 0.0722f * b) < 0.5f;
+}
+
+}  // namespace tint
diff --git a/src/tint/utils/system/terminal_windows.cc b/src/tint/utils/system/terminal_windows.cc
new file mode 100644
index 0000000..4ed2f78
--- /dev/null
+++ b/src/tint/utils/system/terminal_windows.cc
@@ -0,0 +1,92 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. 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.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// 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.
+
+// GEN_BUILD:CONDITION(tint_build_is_win)
+
+#include "src/tint/utils/macros/defer.h"
+#include "src/tint/utils/system/env.h"
+#include "src/tint/utils/system/terminal.h"
+
+#define WIN32_LEAN_AND_MEAN 1
+#include <Windows.h>
+
+namespace tint {
+namespace {
+
+HANDLE ConsoleHandleFrom(FILE* file) {
+    HANDLE handle = INVALID_HANDLE_VALUE;
+    if (file == stdout) {
+        handle = GetStdHandle(STD_OUTPUT_HANDLE);
+    } else if (file == stderr) {
+        handle = GetStdHandle(STD_ERROR_HANDLE);
+    } else {
+        return INVALID_HANDLE_VALUE;
+    }
+
+    CONSOLE_SCREEN_BUFFER_INFO info{};
+    if (GetConsoleScreenBufferInfo(handle, &info) == 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+    return handle;
+}
+
+}  // namespace
+
+bool TerminalSupportsColors(FILE* out) {
+    return ConsoleHandleFrom(out) != INVALID_HANDLE_VALUE;
+}
+
+std::optional<bool> TerminalIsDark(FILE* out) {
+    if (!GetEnvVar("WT_SESSION").empty()) {
+        // Windows terminal does not support querying the palette
+        // See: https://github.com/microsoft/terminal/issues/10639
+        return std::nullopt;
+    }
+
+    if (HANDLE handle = ConsoleHandleFrom(out); handle != INVALID_HANDLE_VALUE) {
+        if (HANDLE screen_buffer = CreateConsoleScreenBuffer(GENERIC_READ, FILE_SHARE_READ,
+                                                             /* lpSecurityAttributes */ nullptr,
+                                                             CONSOLE_TEXTMODE_BUFFER, nullptr)) {
+            TINT_DEFER(CloseHandle(screen_buffer));
+            CONSOLE_SCREEN_BUFFER_INFOEX info{};
+            info.cbSize = sizeof(info);
+            if (GetConsoleScreenBufferInfoEx(screen_buffer, &info)) {
+                COLORREF background = info.ColorTable[(info.wAttributes & 0xf0) >> 4];
+                // https://en.wikipedia.org/wiki/Relative_luminance
+                float r = static_cast<float>((background >> 0) & 0xff) / 255.0f;
+                float g = static_cast<float>((background >> 8) & 0xff) / 255.0f;
+                float b = static_cast<float>((background >> 16) & 0xff) / 255.0f;
+                return (0.2126f * r + 0.7152f * g + 0.0722f * b) < 0.5f;
+            }
+        }
+    }
+
+    // Unknown
+    return std::nullopt;
+}
+
+}  // namespace tint
diff --git a/src/tint/utils/text/BUILD.bazel b/src/tint/utils/text/BUILD.bazel
index 0e7ee03..e73f66e 100644
--- a/src/tint/utils/text/BUILD.bazel
+++ b/src/tint/utils/text/BUILD.bazel
@@ -80,6 +80,7 @@
     "//src/tint/utils/math",
     "//src/tint/utils/memory",
     "//src/tint/utils/rtti",
+    "//src/tint/utils/system",
     "//src/tint/utils/traits",
   ],
   copts = COPTS,
diff --git a/src/tint/utils/text/BUILD.cmake b/src/tint/utils/text/BUILD.cmake
index 7b19a11..2aa69bf 100644
--- a/src/tint/utils/text/BUILD.cmake
+++ b/src/tint/utils/text/BUILD.cmake
@@ -64,6 +64,7 @@
   tint_utils_math
   tint_utils_memory
   tint_utils_rtti
+  tint_utils_system
   tint_utils_traits
 )
 
diff --git a/src/tint/utils/text/BUILD.gn b/src/tint/utils/text/BUILD.gn
index 8aaadd2..5460394 100644
--- a/src/tint/utils/text/BUILD.gn
+++ b/src/tint/utils/text/BUILD.gn
@@ -68,6 +68,7 @@
     "${tint_src_dir}/utils/math",
     "${tint_src_dir}/utils/memory",
     "${tint_src_dir}/utils/rtti",
+    "${tint_src_dir}/utils/system",
     "${tint_src_dir}/utils/traits",
   ]
 
diff --git a/src/tint/utils/text/styled_text_printer.cc b/src/tint/utils/text/styled_text_printer.cc
index be83c03..557b3ff 100644
--- a/src/tint/utils/text/styled_text_printer.cc
+++ b/src/tint/utils/text/styled_text_printer.cc
@@ -27,6 +27,7 @@
 
 #include <cstring>
 
+#include "src/tint/utils/system/terminal.h"
 #include "src/tint/utils/text/styled_text_printer.h"
 
 namespace tint {
@@ -51,7 +52,8 @@
     return std::make_unique<Plain>(out);
 }
 std::unique_ptr<StyledTextPrinter> StyledTextPrinter::Create(FILE* out) {
-    return Create(out, StyledTextTheme::kDefault);
+    bool is_dark = TerminalIsDark(out).value_or(true);
+    return Create(out, is_dark ? StyledTextTheme::kDefaultDark : StyledTextTheme::kDefaultLight);
 }
 
 StyledTextPrinter::~StyledTextPrinter() = default;
diff --git a/src/tint/utils/text/styled_text_printer_other.cc b/src/tint/utils/text/styled_text_printer_other.cc
index eec09c0..4f32526 100644
--- a/src/tint/utils/text/styled_text_printer_other.cc
+++ b/src/tint/utils/text/styled_text_printer_other.cc
@@ -27,8 +27,6 @@
 
 // GEN_BUILD:CONDITION((!tint_build_is_linux) && (!tint_build_is_mac) && (!tint_build_is_win))
 
-#include <cstring>
-
 #include "src/tint/utils/text/styled_text_printer.h"
 
 namespace tint {
diff --git a/src/tint/utils/text/styled_text_printer_posix.cc b/src/tint/utils/text/styled_text_printer_posix.cc
index e03ab52..7d34fed 100644
--- a/src/tint/utils/text/styled_text_printer_posix.cc
+++ b/src/tint/utils/text/styled_text_printer_posix.cc
@@ -28,43 +28,16 @@
 // GEN_BUILD:CONDITION(tint_build_is_linux || tint_build_is_mac)
 
 #include <unistd.h>
+#include <memory>
 
-#include <cstring>
-
-#include "src/tint/utils/text/styled_text.h"
+#include "src/tint/utils/system/terminal.h"
 #include "src/tint/utils/text/styled_text_printer.h"
-#include "src/tint/utils/text/styled_text_theme.h"
-#include "src/tint/utils/text/text_style.h"
 
 namespace tint {
-namespace {
-
-bool SupportsANSIEscape(FILE* f) {
-    if (!isatty(fileno(f))) {
-        return false;
-    }
-
-    const char* cterm = getenv("TERM");
-    if (cterm == nullptr) {
-        return false;
-    }
-
-    std::string term = getenv("TERM");
-    if (term != "cygwin" && term != "linux" && term != "rxvt-unicode-256color" &&
-        term != "rxvt-unicode" && term != "screen-256color" && term != "screen" &&
-        term != "tmux-256color" && term != "tmux" && term != "xterm-256color" &&
-        term != "xterm-color" && term != "xterm") {
-        return false;
-    }
-
-    return true;
-}
-
-}  // namespace
 
 std::unique_ptr<StyledTextPrinter> StyledTextPrinter::Create(FILE* out,
                                                              const StyledTextTheme& theme) {
-    if (SupportsANSIEscape(out)) {
+    if (TerminalSupportsColors(out)) {
         return CreateANSI(out, theme);
     }
     return CreatePlain(out);
diff --git a/src/tint/utils/text/styled_text_printer_windows.cc b/src/tint/utils/text/styled_text_printer_windows.cc
index eb5b32b..ee9373b 100644
--- a/src/tint/utils/text/styled_text_printer_windows.cc
+++ b/src/tint/utils/text/styled_text_printer_windows.cc
@@ -59,6 +59,7 @@
 std::unique_ptr<StyledTextPrinter> StyledTextPrinter::Create(FILE* out,
                                                              const StyledTextTheme& theme) {
     if (HANDLE handle = ConsoleHandleFrom(out); handle != INVALID_HANDLE_VALUE) {
+        SetConsoleOutputCP(CP_UTF8);
         if (SetConsoleMode(handle, ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) {
             return CreateANSI(out, theme);
         }
diff --git a/src/tint/utils/text/styled_text_theme.cc b/src/tint/utils/text/styled_text_theme.cc
index ba2944a..e243cd5 100644
--- a/src/tint/utils/text/styled_text_theme.cc
+++ b/src/tint/utils/text/styled_text_theme.cc
@@ -30,7 +30,7 @@
 
 namespace tint {
 
-const StyledTextTheme StyledTextTheme::kDefault{
+const StyledTextTheme StyledTextTheme::kDefaultDark{
     /* compare_match */ StyledTextTheme::Attributes{
         /* foreground */ std::nullopt,
         /* background */ Color{20, 100, 20},
@@ -137,6 +137,113 @@
     },
 };
 
+const StyledTextTheme StyledTextTheme::kDefaultLight{
+    /* compare_match */ StyledTextTheme::Attributes{
+        /* foreground */ std::nullopt,
+        /* background */ Color{190, 240, 190},
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* compare_mismatch */
+    StyledTextTheme::Attributes{
+        /* foreground */ std::nullopt,
+        /* background */ Color{240, 190, 190},
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* severity_success */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{0, 200, 0},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* severity_warning */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{200, 200, 0},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* severity_failure */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{200, 0, 0},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* severity_fatal */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{200, 0, 200},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_code */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{10, 10, 10},
+        /* background */ Color{248, 248, 248},
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_keyword */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{175, 0, 219},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_variable */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{0, 16, 128},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_type */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{38, 127, 153},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_function */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{121, 94, 38},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_enum */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{0, 112, 193},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_literal */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{9, 134, 88},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_attribute */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{156, 220, 254},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+    /* kind_squiggle */
+    StyledTextTheme::Attributes{
+        /* foreground */ Color{0, 200, 255},
+        /* background */ std::nullopt,
+        /* bold */ std::nullopt,
+        /* underlined */ std::nullopt,
+    },
+};
+
 StyledTextTheme::Attributes StyledTextTheme::Get(TextStyle text_style) const {
     Attributes out;
     out.bold = false;
diff --git a/src/tint/utils/text/styled_text_theme.h b/src/tint/utils/text/styled_text_theme.h
index c9dcfbb..b36db4f 100644
--- a/src/tint/utils/text/styled_text_theme.h
+++ b/src/tint/utils/text/styled_text_theme.h
@@ -40,8 +40,10 @@
 
 /// StyledTextTheme describes the display theming for TextStyles
 struct StyledTextTheme {
-    /// The default theme
-    static const StyledTextTheme kDefault;
+    /// The default dark theme
+    static const StyledTextTheme kDefaultDark;
+    /// The default light theme
+    static const StyledTextTheme kDefaultLight;
 
     /// Color holds a 24-bit RGB color
     struct Color {