diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_merger.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_merger.dart
index 3174eb4..89cc19c 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_merger.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_merger.dart
@@ -7,7 +7,6 @@
 import '../../deferred_load.dart'
     show ImportDescription, OutputUnit, OutputUnitData, deferredPartFileName;
 import '../../elements/entities.dart';
-import '../../deferred_load.dart' show OutputUnit;
 import '../../js/js.dart' as js;
 import '../../options.dart';
 import '../model.dart';
diff --git a/runtime/observatory/tests/service/notify_debugger_on_exception_test.dart b/runtime/observatory/tests/service/notify_debugger_on_exception_test.dart
index 1d03341..e0d6d7b 100644
--- a/runtime/observatory/tests/service/notify_debugger_on_exception_test.dart
+++ b/runtime/observatory/tests/service/notify_debugger_on_exception_test.dart
@@ -9,7 +9,12 @@
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
-const int LINE_A = 24;
+const int LINE_A = 16;
+const int LINE_B = 32;
+
+syncThrow() {
+  throw 'Hello from syncThrow!'; // Line A.
+}
 
 @pragma('vm:notify-debugger-on-exception')
 void catchNotifyDebugger(Function() code) {
@@ -20,17 +25,30 @@
   }
 }
 
-syncThrow() {
-  throw 'Hello from syncThrow!'; // Line A.
+void catchNotifyDebuggerNested() {
+  @pragma('vm:notify-debugger-on-exception')
+  void nested() {
+    try {
+      throw 'Hello from nested!'; // Line B.
+    } catch (e) {
+      // Ignore. Internals will notify debugger.
+    }
+  }
+
+  nested();
 }
 
 testMain() {
   catchNotifyDebugger(syncThrow);
+  catchNotifyDebuggerNested();
 }
 
 final tests = <IsolateTest>[
   hasStoppedWithUnhandledException,
   stoppedAtLine(LINE_A),
+  resumeIsolate,
+  hasStoppedWithUnhandledException,
+  stoppedAtLine(LINE_B),
 ];
 
 main([args = const <String>[]]) => runIsolateTests(args, tests,
diff --git a/runtime/observatory_2/tests/service_2/notify_debugger_on_exception_test.dart b/runtime/observatory_2/tests/service_2/notify_debugger_on_exception_test.dart
index 1d03341..e0d6d7b 100644
--- a/runtime/observatory_2/tests/service_2/notify_debugger_on_exception_test.dart
+++ b/runtime/observatory_2/tests/service_2/notify_debugger_on_exception_test.dart
@@ -9,7 +9,12 @@
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
-const int LINE_A = 24;
+const int LINE_A = 16;
+const int LINE_B = 32;
+
+syncThrow() {
+  throw 'Hello from syncThrow!'; // Line A.
+}
 
 @pragma('vm:notify-debugger-on-exception')
 void catchNotifyDebugger(Function() code) {
@@ -20,17 +25,30 @@
   }
 }
 
-syncThrow() {
-  throw 'Hello from syncThrow!'; // Line A.
+void catchNotifyDebuggerNested() {
+  @pragma('vm:notify-debugger-on-exception')
+  void nested() {
+    try {
+      throw 'Hello from nested!'; // Line B.
+    } catch (e) {
+      // Ignore. Internals will notify debugger.
+    }
+  }
+
+  nested();
 }
 
 testMain() {
   catchNotifyDebugger(syncThrow);
+  catchNotifyDebuggerNested();
 }
 
 final tests = <IsolateTest>[
   hasStoppedWithUnhandledException,
   stoppedAtLine(LINE_A),
+  resumeIsolate,
+  hasStoppedWithUnhandledException,
+  stoppedAtLine(LINE_B),
 ];
 
 main([args = const <String>[]]) => runIsolateTests(args, tests,
diff --git a/runtime/tests/vm/dart/flutter_regress_82278_2_test.dart b/runtime/tests/vm/dart/flutter_regress_82278_2_test.dart
new file mode 100644
index 0000000..09fe2eb
--- /dev/null
+++ b/runtime/tests/vm/dart/flutter_regress_82278_2_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+dynamic global;
+
+class Foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
+          T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
+          T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+          T30, T31> {
+  @pragma('vm:never-inline')
+  Generic<T31> testForT31(dynamic arg) {
+    global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
+            $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
+            $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
+            $T30 $T31''';
+    return arg as Generic<T31>;
+  }
+
+}
+
+@pragma('vm:never-inline')
+Generic<T31> foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
+                 T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
+                 T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+                 T30, T31>(dynamic arg) {
+  global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
+          $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
+          $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
+          $T30 $T31''';
+ return arg as Generic<T31>;
+}
+
+class Generic<T> {}
+
+main() {
+  final genericString = Generic<String>();
+  Expect.isTrue(identical(Foo<bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, String>().testForT31(genericString), genericString));
+  Expect.isTrue((global as String).endsWith('bool String'));
+
+  Expect.isTrue(identical(
+    foo<int, int, int, int, int, int, int, int, int, int,
+              int, int, int, int, int, int, int, int, int, int,
+              int, int, int, int, int, int, int, int, int, int,
+              int, String>(genericString), genericString));
+  Expect.isTrue((global as String).endsWith('int String'));
+}
diff --git a/runtime/tests/vm/dart_2/flutter_regress_82278_2_test.dart b/runtime/tests/vm/dart_2/flutter_regress_82278_2_test.dart
new file mode 100644
index 0000000..09fe2eb
--- /dev/null
+++ b/runtime/tests/vm/dart_2/flutter_regress_82278_2_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+dynamic global;
+
+class Foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
+          T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
+          T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+          T30, T31> {
+  @pragma('vm:never-inline')
+  Generic<T31> testForT31(dynamic arg) {
+    global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
+            $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
+            $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
+            $T30 $T31''';
+    return arg as Generic<T31>;
+  }
+
+}
+
+@pragma('vm:never-inline')
+Generic<T31> foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
+                 T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
+                 T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+                 T30, T31>(dynamic arg) {
+  global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
+          $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
+          $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
+          $T30 $T31''';
+ return arg as Generic<T31>;
+}
+
+class Generic<T> {}
+
+main() {
+  final genericString = Generic<String>();
+  Expect.isTrue(identical(Foo<bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
+              bool, String>().testForT31(genericString), genericString));
+  Expect.isTrue((global as String).endsWith('bool String'));
+
+  Expect.isTrue(identical(
+    foo<int, int, int, int, int, int, int, int, int, int,
+              int, int, int, int, int, int, int, int, int, int,
+              int, int, int, int, int, int, int, int, int, int,
+              int, String>(genericString), genericString));
+  Expect.isTrue((global as String).endsWith('int String'));
+}
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 9d1b8b0..2c993d6 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -409,8 +409,11 @@
   void CompareWithFieldValue(Register value, FieldAddress address) {
     CompareWithMemoryValue(value, address);
   }
-  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
-    CompareWithMemoryValue(value, address);
+  void CompareWithCompressedFieldFromOffset(Register value,
+                                            Register base,
+                                            int32_t offset) {
+    LoadCompressedFieldFromOffset(TMP, base, offset);
+    cmp(value, Operand(TMP));
   }
 
   void CompareWithMemoryValue(Register value, Address address) {
@@ -953,8 +956,13 @@
   }
   void LoadCompressedFieldFromOffset(Register reg,
                                      Register base,
+                                     int32_t offset) override {
+    LoadCompressedFieldFromOffset(reg, base, offset, kFourBytes, AL);
+  }
+  void LoadCompressedFieldFromOffset(Register reg,
+                                     Register base,
                                      int32_t offset,
-                                     OperandSize type = kFourBytes,
+                                     OperandSize type,
                                      Condition cond = AL) {
     LoadFieldFromOffset(reg, base, offset, type, cond);
   }
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 9d61143..7380bbc 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -931,6 +931,23 @@
 #endif
 }
 
+void Assembler::LoadCompressedFromOffset(Register dest,
+                                         Register base,
+                                         int32_t offset) {
+#if !defined(DART_COMPRESSED_POINTERS)
+  LoadFromOffset(dest, base, offset);
+#else
+  if (Address::CanHoldOffset(offset, Address::Offset, kFourBytes)) {
+    ldr(dest, Address(base, offset), kUnsignedFourBytes);  // Zero-extension.
+  } else {
+    ASSERT(base != TMP2);
+    AddImmediate(TMP2, base, offset);
+    ldr(dest, Address(base, 0), kUnsignedFourBytes);  // Zero-extension.
+  }
+  add(dest, dest, Operand(HEAP_BITS, LSL, 32));
+#endif
+}
+
 void Assembler::LoadCompressedSmi(Register dest, const Address& slot) {
 #if !defined(DART_COMPRESSED_POINTERS)
   ldr(dest, slot);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 59ec194..d4f08c5 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -579,8 +579,11 @@
   void CompareWithFieldValue(Register value, FieldAddress address) {
     CompareWithMemoryValue(value, address);
   }
-  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
-    CompareWithMemoryValue(value, address, kObjectBytes);
+  void CompareWithCompressedFieldFromOffset(Register value,
+                                            Register base,
+                                            int32_t offset) {
+    LoadCompressedFieldFromOffset(TMP, base, offset);
+    cmp(value, Operand(TMP));
   }
 
   void CompareWithMemoryValue(Register value,
@@ -1702,8 +1705,8 @@
   }
   void LoadCompressedFieldFromOffset(Register dest,
                                      Register base,
-                                     int32_t offset) {
-    LoadCompressed(dest, FieldAddress(base, offset));
+                                     int32_t offset) override {
+    LoadCompressedFromOffset(dest, base, offset - kHeapObjectTag);
   }
   // For loading indexed payloads out of tagged objects like Arrays. If the
   // payload objects are word-sized, use TIMES_HALF_WORD_SIZE if the contents of
@@ -1765,6 +1768,7 @@
   }
 
   void LoadCompressed(Register dest, const Address& slot);
+  void LoadCompressedFromOffset(Register dest, Register base, int32_t offset);
   void LoadCompressedSmi(Register dest, const Address& slot);
 
   // Store into a heap object and apply the generational and incremental write
diff --git a/runtime/vm/compiler/assembler/assembler_base.h b/runtime/vm/compiler/assembler/assembler_base.h
index bf24f09..733972d 100644
--- a/runtime/vm/compiler/assembler/assembler_base.h
+++ b/runtime/vm/compiler/assembler/assembler_base.h
@@ -631,6 +631,9 @@
 #if defined(DART_COMPRESSED_POINTERS)
   virtual void LoadCompressedField(Register dst,
                                    const FieldAddress& address) = 0;
+  virtual void LoadCompressedFieldFromOffset(Register dst,
+                                             Register base,
+                                             int32_t offset) = 0;
   virtual void StoreCompressedIntoObject(
       Register object,      // Object we are storing into.
       const Address& dest,  // Where we are storing into.
@@ -644,6 +647,11 @@
   virtual void LoadCompressedField(Register dst, const FieldAddress& address) {
     LoadField(dst, address);
   }
+  virtual void LoadCompressedFieldFromOffset(Register dst,
+                                             Register base,
+                                             int32_t offset) {
+    LoadFieldFromOffset(dst, base, offset);
+  }
   virtual void StoreCompressedIntoObject(
       Register object,      // Object we are storing into.
       const Address& dest,  // Where we are storing into.
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index af7df41..f69c928 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -612,7 +612,7 @@
   }
   void LoadCompressedFieldFromOffset(Register reg,
                                      Register base,
-                                     int32_t offset) {
+                                     int32_t offset) override {
     LoadFieldFromOffset(reg, base, offset);
   }
   void LoadIndexedPayload(Register dst,
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 09c3c4b..c5a2b08 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -976,7 +976,7 @@
   }
   void LoadCompressedFieldFromOffset(Register dst,
                                      Register base,
-                                     int32_t offset) {
+                                     int32_t offset) override {
     LoadCompressed(dst, FieldAddress(base, offset));
   }
   void LoadIndexedPayload(Register dst,
@@ -1032,8 +1032,10 @@
   void CompareWithFieldValue(Register value, FieldAddress address) {
     cmpq(value, address);
   }
-  void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
-    OBJ(cmp)(value, address);
+  void CompareWithCompressedFieldFromOffset(Register value,
+                                            Register base,
+                                            int32_t offset) {
+    OBJ(cmp)(value, FieldAddress(base, offset));
   }
 
   void CompareTypeNullabilityWith(Register type, int8_t value) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 65c4589..93d9ad5 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1257,6 +1257,7 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildStatement() {
+  intptr_t offset = ReaderOffset();
   Tag tag = ReadTag();  // read tag.
   switch (tag) {
     case kExpressionStatement:
@@ -1300,7 +1301,7 @@
     case kVariableDeclaration:
       return BuildVariableDeclaration();
     case kFunctionDeclaration:
-      return BuildFunctionDeclaration();
+      return BuildFunctionDeclaration(offset);
     default:
       ReportUnexpectedTag("statement", tag);
       UNREACHABLE();
@@ -4241,7 +4242,9 @@
 
 Fragment StreamingFlowGraphBuilder::BuildFunctionExpression() {
   ReadPosition();  // read position.
-  return BuildFunctionNode(TokenPosition::kNoSource, StringIndex());
+  return BuildFunctionNode(TokenPosition::kNoSource, StringIndex(),
+                           /*has_valid_annotation=*/false, /*has_pragma=*/false,
+                           /*func_decl_offset=*/0);
 }
 
 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* p) {
@@ -5424,16 +5427,39 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration() {
-  TokenPosition position = ReadPosition();  // read position.
-  intptr_t variable_offset = ReaderOffset() + data_program_offset_;
+Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration(intptr_t offset) {
+  TokenPosition position = ReadPosition();
+  const intptr_t variable_offset = ReaderOffset() + data_program_offset_;
 
-  // read variable declaration.
+  // Read variable declaration.
   VariableDeclarationHelper helper(this);
+
+  bool has_pragma = false;
+  bool has_valid_annotation = false;
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
+  const intptr_t annotation_count = ReadListLength();
+  for (intptr_t i = 0; i < annotation_count; ++i) {
+    const intptr_t tag = PeekTag();
+    if (tag != kInvalidExpression) {
+      has_valid_annotation = true;
+    }
+    if (tag == kConstantExpression) {
+      auto& instance = Instance::Handle();
+      instance = constant_reader_.ReadConstantExpression();
+      if (instance.clazz() == IG->object_store()->pragma_class()) {
+        has_pragma = true;
+      }
+      continue;
+    }
+    SkipExpression();
+  }
+  helper.SetJustRead(VariableDeclarationHelper::kAnnotations);
+
   helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
 
   Fragment instructions = DebugStepCheck(position);
-  instructions += BuildFunctionNode(position, helper.name_index_);
+  instructions += BuildFunctionNode(position, helper.name_index_,
+                                    has_valid_annotation, has_pragma, offset);
   instructions += StoreLocal(position, LookupVariable(variable_offset));
   instructions += Drop();
   return instructions;
@@ -5441,7 +5467,10 @@
 
 Fragment StreamingFlowGraphBuilder::BuildFunctionNode(
     TokenPosition parent_position,
-    StringIndex name_index) {
+    StringIndex name_index,
+    bool has_valid_annotation,
+    bool has_pragma,
+    intptr_t func_decl_offset) {
   intptr_t offset = ReaderOffset();
 
   FunctionNodeHelper function_node_helper(this);
@@ -5500,6 +5529,13 @@
               *name, parsed_function()->function(), position);
         }
 
+        function.set_has_pragma(has_pragma);
+        if ((FLAG_enable_mirrors && has_valid_annotation) || has_pragma) {
+          auto& lib =
+              Library::Handle(Z, Class::Handle(Z, function.Owner()).library());
+          lib.AddMetadata(function, func_decl_offset);
+        }
+
         function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
                                    FunctionNodeHelper::kSync);
         switch (function_node_helper.dart_async_marker_) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index df727ff..f53e58c 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -350,9 +350,12 @@
   Fragment BuildTryFinally();
   Fragment BuildYieldStatement();
   Fragment BuildVariableDeclaration();
-  Fragment BuildFunctionDeclaration();
+  Fragment BuildFunctionDeclaration(intptr_t offset);
   Fragment BuildFunctionNode(TokenPosition parent_position,
-                             StringIndex name_index);
+                             StringIndex name_index,
+                             bool has_valid_annotation,
+                             bool has_pragma,
+                             intptr_t func_decl_offset);
 
   // Build flow graph for '_nativeEffect'.
   Fragment BuildNativeEffect();
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 1256780..b20e354 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -452,8 +452,16 @@
       } else if (tag == kConstructor) {
         ConstructorHelper constructor_helper(this);
         constructor_helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
+      } else if (tag == kFunctionDeclaration) {
+        ReadTag();
+        ReadPosition();  // fileOffset
+        VariableDeclarationHelper variable_declaration_helper(this);
+        variable_declaration_helper.ReadUntilExcluding(
+            VariableDeclarationHelper::kAnnotations);
       } else {
-        FATAL("No support for metadata on this type of kernel node\n");
+        FATAL("No support for metadata on this type of kernel node: %" Pd32
+              "\n",
+              tag);
       }
     }
 
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 56eaa34..e8e68f6 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -499,16 +499,14 @@
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ BranchIf(EQUAL, &is_dynamic);
 
-    __ LoadCompressedField(
+    __ LoadCompressedFieldFromOffset(
+        TTSInternalRegs::kScratchReg, kTypeArgumentsReg,
+        compiler::target::TypeArguments::type_at_offset(type_param.index()));
+    __ CompareWithCompressedFieldFromOffset(
         TTSInternalRegs::kScratchReg,
-        compiler::FieldAddress(kTypeArgumentsReg,
-                               compiler::target::TypeArguments::type_at_offset(
-                                   type_param.index())));
-    __ CompareWithCompressedFieldValue(
-        TTSInternalRegs::kScratchReg,
-        compiler::FieldAddress(TTSInternalRegs::kInstanceTypeArgumentsReg,
-                               compiler::target::TypeArguments::type_at_offset(
-                                   type_param_value_offset_i)));
+        TTSInternalRegs::kInstanceTypeArgumentsReg,
+        compiler::target::TypeArguments::type_at_offset(
+            type_param_value_offset_i));
     __ BranchIf(NOT_EQUAL, check_failed);
   } else {
     const Class& type_class = Class::Handle(type_arg.type_class());
@@ -518,15 +516,14 @@
                                   /*include_abstract=*/true,
                                   /*exclude_null=*/!null_is_assignable);
 
-    __ LoadCompressedField(
+    __ LoadCompressedFieldFromOffset(
         TTSInternalRegs::kScratchReg,
-        compiler::FieldAddress(TTSInternalRegs::kInstanceTypeArgumentsReg,
-                               compiler::target::TypeArguments::type_at_offset(
-                                   type_param_value_offset_i)));
-    __ LoadCompressedField(
-        TTSInternalRegs::kScratchReg,
-        compiler::FieldAddress(TTSInternalRegs::kScratchReg,
-                               compiler::target::Type::type_class_id_offset()));
+        TTSInternalRegs::kInstanceTypeArgumentsReg,
+        compiler::target::TypeArguments::type_at_offset(
+            type_param_value_offset_i));
+    __ LoadCompressedFieldFromOffset(
+        TTSInternalRegs::kScratchReg, TTSInternalRegs::kScratchReg,
+        compiler::target::Type::type_class_id_offset());
 
     compiler::Label is_subtype;
     __ SmiUntag(TTSInternalRegs::kScratchReg);
@@ -550,12 +547,11 @@
       // Nullable type is not a subtype of non-nullable type.
       // TODO(dartbug.com/40736): Allocate a register for instance type argument
       // and avoid reloading it.
-      __ LoadCompressedField(
+      __ LoadCompressedFieldFromOffset(
           TTSInternalRegs::kScratchReg,
-          compiler::FieldAddress(
-              TTSInternalRegs::kInstanceTypeArgumentsReg,
-              compiler::target::TypeArguments::type_at_offset(
-                  type_param_value_offset_i)));
+          TTSInternalRegs::kInstanceTypeArgumentsReg,
+          compiler::target::TypeArguments::type_at_offset(
+              type_param_value_offset_i));
       __ CompareTypeNullabilityWith(TTSInternalRegs::kScratchReg,
                                     compiler::target::Nullability::kNullable);
       __ BranchIf(EQUAL, check_failed);
diff --git a/tests/language/async_star/pause_test2.dart b/tests/language/async_star/pause2_test.dart
similarity index 100%
rename from tests/language/async_star/pause_test2.dart
rename to tests/language/async_star/pause2_test.dart
diff --git a/tests/language/function_subtype/null.dart b/tests/language/function_subtype/null_test.dart
similarity index 100%
rename from tests/language/function_subtype/null.dart
rename to tests/language/function_subtype/null_test.dart
diff --git a/tests/language/identifier/known_prefix_error_test.dart b/tests/language/identifier/known_prefix_error_test.dart
index 06ec097..458f6e0 100644
--- a/tests/language/identifier/known_prefix_error_test.dart
+++ b/tests/language/identifier/known_prefix_error_test.dart
@@ -15,6 +15,10 @@
 import 'built_in_prefix_library_async.dart' as async;
 import 'built_in_prefix_library_await.dart' as await;
 import 'built_in_prefix_library_hide.dart' as hide;
+import 'built_in_prefix_library_library.dart' as library;
+//                                               ^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'library' as a name here.
 import 'built_in_prefix_library_of.dart' as of;
 import 'built_in_prefix_library_on.dart' as on;
 import 'built_in_prefix_library_show.dart' as show;
@@ -22,52 +26,44 @@
 import 'built_in_prefix_library_yield.dart' as yield;
 
 async<dynamic> _async = new async.A();
-// [error line 24, column 1, length 5]
+// [error line 28, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'async' isn't a type.
-// [error line 24, column 1]
 // [cfe] Expected 0 type arguments.
 await<dynamic> _await = new await.A();
-// [error line 30, column 1, length 5]
+// [error line 33, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'await' isn't a type.
-// [error line 30, column 1]
 // [cfe] Expected 0 type arguments.
 hide<dynamic> _hide = new hide.A();
-// [error line 36, column 1, length 4]
+// [error line 38, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'hide' isn't a type.
-// [error line 36, column 1]
 // [cfe] Expected 0 type arguments.
 of<dynamic> _of = new of.A();
-// [error line 42, column 1, length 2]
+// [error line 43, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'of' isn't a type.
-// [error line 42, column 1]
 // [cfe] Expected 0 type arguments.
 on<dynamic> _on = new on.A();
 // [error line 48, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'on' isn't a type.
-// [error line 48, column 1]
 // [cfe] Expected 0 type arguments.
 show<dynamic> _show = new show.A();
-// [error line 54, column 1, length 4]
+// [error line 53, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'show' isn't a type.
-// [error line 54, column 1]
 // [cfe] Expected 0 type arguments.
 sync<dynamic> _sync = new sync.A();
-// [error line 60, column 1, length 4]
+// [error line 58, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'sync' isn't a type.
-// [error line 60, column 1]
 // [cfe] Expected 0 type arguments.
 yield<dynamic> _yield = new yield.A();
-// [error line 66, column 1, length 5]
+// [error line 63, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'yield' isn't a type.
-// [error line 66, column 1]
 // [cfe] Expected 0 type arguments.
 
 async.B<async> _B_async = new async.B();
@@ -107,49 +103,41 @@
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
-//      ^
 // [cfe] Expected 0 type arguments.
 await.B<await<dynamic>> _B2_await = new await.B();
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
-//      ^
 // [cfe] Expected 0 type arguments.
 hide.B<hide<dynamic>> _B2_hide = new hide.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
-//     ^
 // [cfe] Expected 0 type arguments.
 of.B<of<dynamic>> _B2_of = new of.B();
 //   ^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
-//   ^
 // [cfe] Expected 0 type arguments.
 on.B<on<dynamic>> _B2_on = new on.B();
 //   ^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
-//   ^
 // [cfe] Expected 0 type arguments.
 show.B<show<dynamic>> _B2_show = new show.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
-//     ^
 // [cfe] Expected 0 type arguments.
 sync.B<sync<dynamic>> _B2_sync = new sync.B();
 //     ^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
-//     ^
 // [cfe] Expected 0 type arguments.
 yield.B<yield<dynamic>> _B2_yield = new yield.B();
 //      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
-//      ^
 // [cfe] Expected 0 type arguments.
 
 main() {
diff --git a/tests/language/library/a.dart b/tests/language/library/a.dart
deleted file mode 100644
index 95f855e..0000000
--- a/tests/language/library/a.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryA.dart;
-
-import "c.dart";
-
-var fooA = fooC;
diff --git a/tests/language/library/b.dart b/tests/language/library/b.dart
deleted file mode 100644
index 2a36a64..0000000
--- a/tests/language/library/b.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryB.dart;
-
-import "c.dart";
-
-var fooB = fooC;
diff --git a/tests/language/library/c.dart b/tests/language/library/c.dart
deleted file mode 100644
index fcf3555..0000000
--- a/tests/language/library/c.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryC.dart;
-
-var fooC = 10;
diff --git a/tests/language/library/d.dart b/tests/language/library/d.dart
deleted file mode 100644
index 054c033..0000000
--- a/tests/language/library/d.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryD.dart;
-
-import "f.dart";
-
-var fooD = fooC;
diff --git a/tests/language/library/e.dart b/tests/language/library/e.dart
deleted file mode 100644
index 0332e42..0000000
--- a/tests/language/library/e.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryE.dart;
-
-import "c.dart";
-import "f.dart";
-
-var fooE = 0;
diff --git a/tests/language/library/f.dart b/tests/language/library/f.dart
deleted file mode 100644
index f73e3cb..0000000
--- a/tests/language/library/f.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library libraryF.dart;
-
-var fooC = 10;
diff --git a/tests/language/library/library3.dart b/tests/language/library/library3.dart
deleted file mode 100644
index 625f568..0000000
--- a/tests/language/library/library3.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library library3.dart;
-
-import "../library2.dart"; // defines "foo" and "foo1".
diff --git a/tests/language/library/library4.dart b/tests/language/library/library4.dart
deleted file mode 100644
index 25af011..0000000
--- a/tests/language/library/library4.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-library library4.dart;
-
-import "../library2.dart"; // defines "foo" and "foo1".
-
-var foo;
-var foo1 = 0;
diff --git a/tests/language/library/library6.dart b/tests/language/library/library6_test.dart
similarity index 100%
rename from tests/language/library/library6.dart
rename to tests/language/library/library6_test.dart
diff --git a/tests/language/nnbd/static_errors/implicit_downcasts.dart b/tests/language/nnbd/static_errors/implicit_downcasts_test.dart
similarity index 100%
rename from tests/language/nnbd/static_errors/implicit_downcasts.dart
rename to tests/language/nnbd/static_errors/implicit_downcasts_test.dart
diff --git a/tests/language/nnbd/static_errors/late_final_without_initializer.dart b/tests/language/nnbd/static_errors/late_final_without_initializer_test.dart
similarity index 99%
rename from tests/language/nnbd/static_errors/late_final_without_initializer.dart
rename to tests/language/nnbd/static_errors/late_final_without_initializer_test.dart
index 9938078..57c0485 100644
--- a/tests/language/nnbd/static_errors/late_final_without_initializer.dart
+++ b/tests/language/nnbd/static_errors/late_final_without_initializer_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 // Test that it is not a compile time error for a `final` variable to not have
 // an initializer if that variable is declared as `late`.
 import 'package:expect/expect.dart';
diff --git a/tests/language/nnbd/static_errors/local_function_inference.dart b/tests/language/nnbd/static_errors/local_function_inference_test.dart
similarity index 92%
rename from tests/language/nnbd/static_errors/local_function_inference.dart
rename to tests/language/nnbd/static_errors/local_function_inference_test.dart
index af81145..a49ff14 100644
--- a/tests/language/nnbd/static_errors/local_function_inference.dart
+++ b/tests/language/nnbd/static_errors/local_function_inference_test.dart
@@ -24,6 +24,6 @@
     }
   }
   //  ^
-  // [analyzer] undefined
-  // [cfe] undefined
+  // [analyzer] unspecified
+  // [cfe] unspecified
 }
diff --git a/tests/language/nnbd/syntax/late_modifier_bug_39658.dart b/tests/language/nnbd/syntax/late_modifier_bug_39658_test.dart
similarity index 100%
rename from tests/language/nnbd/syntax/late_modifier_bug_39658.dart
rename to tests/language/nnbd/syntax/late_modifier_bug_39658_test.dart
diff --git a/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart b/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
index 126ca63..6c6a7ca 100644
--- a/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
+++ b/tests/language/nonfunction_type_aliases/mixed/infer_aliased_factory_invocation_07_test.dart
@@ -5,7 +5,7 @@
 // Requirements=nnbd-weak
 
 
-import 'infer_aliased_factory_invocation_06_lib.dart';
+import 'infer_aliased_factory_invocation_07_lib.dart';
 
 Type typeOf<X>() => X;
 
diff --git a/tests/language/nosuchmethod_forwarding/abstract_override_with_different_type.dart b/tests/language/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
similarity index 100%
rename from tests/language/nosuchmethod_forwarding/abstract_override_with_different_type.dart
rename to tests/language/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
diff --git a/tests/language/prefix/new_test.dart b/tests/language/prefix/new_test.dart
index 23c7834..4e13b18 100644
--- a/tests/language/prefix/new_test.dart
+++ b/tests/language/prefix/new_test.dart
@@ -5,7 +5,7 @@
 library PrefixTest;
 
 import "package:expect/expect.dart";
-import "test1.dart";
+import "new_test1.dart";
 
 main() {
   Expect.equals(Prefix.getSource(), Prefix.getImport() + 1);
diff --git a/tests/language/prefix/new_test1.dart b/tests/language/prefix/new_test1.dart
index 106de80..812c604 100644
--- a/tests/language/prefix/new_test1.dart
+++ b/tests/language/prefix/new_test1.dart
@@ -4,7 +4,7 @@
 
 library PrefixTest1;
 
-import "test2.dart" as test2;
+import "new_test2.dart" as test2;
 
 class Prefix {
   static const int foo = 43;
diff --git a/tests/language/regress/regress34091.dart b/tests/language/regress/regress34091_test.dart
similarity index 100%
rename from tests/language/regress/regress34091.dart
rename to tests/language/regress/regress34091_test.dart
diff --git a/tests/language/script/source.dart b/tests/language/script/source.dart
deleted file mode 100644
index 44f0d34..0000000
--- a/tests/language/script/source.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// A perfectly legal dart source file for use with script and library tests.
-
-const int script_source = 1;
diff --git a/tests/language/string/overflow.dart b/tests/language/string/overflow_test.dart
similarity index 100%
rename from tests/language/string/overflow.dart
rename to tests/language/string/overflow_test.dart
diff --git a/tests/language/top_level/file3.dart b/tests/language/top_level/file3.dart
deleted file mode 100644
index a42c558..0000000
--- a/tests/language/top_level/file3.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-main() {
-  Expect.equals(42, prefix.topLevelVar);
-}
diff --git a/tests/language/unsorted/unevaluated_field.dart b/tests/language/unsorted/unevaluated_field_test.dart
similarity index 91%
rename from tests/language/unsorted/unevaluated_field.dart
rename to tests/language/unsorted/unevaluated_field_test.dart
index 5c701db..f33fbb5 100644
--- a/tests/language/unsorted/unevaluated_field.dart
+++ b/tests/language/unsorted/unevaluated_field_test.dart
@@ -6,12 +6,12 @@
 
 import "package:expect/expect.dart";
 
-const int gx =
+const int? gx =
     const bool.hasEnvironment("x") ? const int.fromEnvironment("x") : null;
 
 class A {
-  final int x = gx;
-  final int y =
+  final int? x = gx;
+  final int? y =
       const bool.hasEnvironment("y") ? const int.fromEnvironment("y") : null;
   const A();
 }
diff --git a/tests/language/vm/regression_38412.dart b/tests/language/vm/regression_38412_test.dart
similarity index 100%
rename from tests/language/vm/regression_38412.dart
rename to tests/language/vm/regression_38412_test.dart
diff --git a/tests/language/vm/regression_38436.dart b/tests/language/vm/regression_38436_test.dart
similarity index 98%
copy from tests/language/vm/regression_38436.dart
copy to tests/language/vm/regression_38436_test.dart
index ea5fafd..ca7a920 100644
--- a/tests/language/vm/regression_38436.dart
+++ b/tests/language/vm/regression_38436_test.dart
@@ -9,6 +9,9 @@
 // Found by DartFuzzing: would sometimes crash on OSR
 // https://github.com/dart-lang/sdk/issues/38436
 
+// Note: When this test was migrated to null safety, changed several type
+// annotations to dynamic to fix the hundreds of null safe errors. That was a
+// less invasive change than adding `?` and `!` throughout the test.
 import 'dart:async';
 import 'dart:cli';
 import 'dart:collection';
@@ -19,11 +22,11 @@
 import 'dart:math';
 import 'dart:typed_data';
 
-String var0 = '';
-bool var1 = true;
+dynamic var0 = '';
+dynamic var1 = true;
 int var2 = -30;
 double var3 = 0.895077679110543;
-String var4 = '';
+dynamic var4 = '';
 List<int> var5 = [55, -70];
 Set<int> var6 = {
   1024,
@@ -62,7 +65,7 @@
     -25
   }
 };
-Map<int, String> var7 = {
+dynamic var7 = {
   6: '',
   ...{56: 'B\u2665pwO', 73: 'ZJDi\u{1f600}m'},
   ...{73: ')', 14: '93Q'},
@@ -85,7 +88,7 @@
   throw ((-(var3)) * (-(0.943305664017911)));
 }
 
-List<int> foo2(Set<int> par1, List<int> par2, Map<int, String> par3) {
+List<int> foo2(Set<int> par1, List<int> par2, dynamic par3) {
   switch (-49) {
     case 4149672951:
       {
@@ -198,9 +201,9 @@
             };
           } catch (exception, stackTrace) {
             /**
-           ** Multi-line
-           ** documentation comment.
-           */
+             ** Multi-line
+             ** documentation comment.
+             */
             for (int loc1 = 0; loc1 < 89; loc1++) {
               switch ((var2--)) {
                 case 3807258589:
@@ -435,7 +438,7 @@
     -69
   };
 
-  List<int> foo0_0(Map<int, String> par1) {
+  List<int> foo0_0(dynamic par1) {
     if ((var1 ? ((!(fld0_0)) ? true : false) : true)) {
       return ((var4).trim()).codeUnits;
     } else {
@@ -528,8 +531,7 @@
                                                 57: var4,
                                                 73: var7[-43],
                                                 38: var0
-                                              })
-                                                  .isNotEmpty ||
+                                              }).isNotEmpty ||
                                               ({
                                                 67: var4,
                                                 14: 'M\u{1f600}1HNbP',
@@ -537,8 +539,7 @@
                                                 85: 'uyq',
                                                 95: var7[(-(Int32x4.wwxw))],
                                                 33: ''
-                                              })
-                                                  .isNotEmpty))
+                                              }).isNotEmpty))
                                       : false)
                                   ? var2
                                   : (++var2))
@@ -557,8 +558,7 @@
                                   51: '-8ht',
                                   26: ('(2l3\u2665h' ?? var0),
                                   79: var4
-                                })
-                                        .isNotEmpty
+                                }).isNotEmpty
                                     ? var5[(var2 % loc0)]
                                     : var2) %
                                 ((!(NetworkInterface.listSupported))
@@ -1005,9 +1005,9 @@
               ]);
             } finally {
               /**
-             ** Multi-line
-             ** documentation comment.
-             */
+               ** Multi-line
+               ** documentation comment.
+               */
               fld1_1 = (var5[var5[var2]]).isOdd;
             }
             /*
@@ -1206,7 +1206,7 @@
 }
 
 class X2 extends X0 with X1 {
-  Set<int> fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
+  dynamic fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
 
   bool foo2_0(int par1) => var1;
   bool foo2_1(bool par1) {
@@ -1565,8 +1565,9 @@
 }
 
 class X3 extends X1 {
-  Map<int, String> fld3_0 = {
-    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
+  dynamic fld3_0 = {
+    if (true)
+      if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
     if (true) 30: '6\u2665P!Pbi',
     81: 't',
     82: '17fx#!',
@@ -1738,8 +1739,7 @@
                                             7: par3,
                                             69: Uri.decodeFull(
                                                 (foo1_3() + 'LX+'))
-                                          })
-                                            .isEmpty)
+                                          }).isEmpty)
                                     ? (~((13 | 64)))
                                     : (-(var2)))),
                             (par1--),
@@ -1794,8 +1794,7 @@
                     4: 'pUc(q',
                     15: 'K\u{1f600}hmdZ\u2665',
                     95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  })
-                              .isNotEmpty
+                  }).isNotEmpty
                           ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
                               foo3_0(var3))
                           : (!(((false || true) ? var1 : false))))
@@ -1993,8 +1992,7 @@
                                   95: '\u{1f600}2tIYqE',
                                   43: (true ? 'baf-\u2665' : var4),
                                   30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                }))
-                                  .isNotEmpty))
+                                })).isNotEmpty))
                             -13
                           else
                             (var1 ? (-((-(var5[56])))) : (var2--)),
@@ -2156,8 +2154,7 @@
                                           ? ((var2--) ?? fld3_2)
                                           : var5[(fld3_2--)])],
                                       52: '(('
-                                    })
-                                        .isEmpty)))
+                                    }).isEmpty)))
                                 ? fld3_0
                                 : {
                                     39: foo1_3(),
diff --git a/tests/language/vm/regression_38741.dart b/tests/language/vm/regression_38741_test.dart
similarity index 96%
rename from tests/language/vm/regression_38741.dart
rename to tests/language/vm/regression_38741_test.dart
index 2dd1223..246a7b9 100644
--- a/tests/language/vm/regression_38741.dart
+++ b/tests/language/vm/regression_38741_test.dart
@@ -10,7 +10,7 @@
 import 'package:expect/expect.dart';
 
 @pragma('vm:prefer-inline')
-bool foo(int x) => x < 10;
+bool foo(dynamic x) => x < 10;
 
 @pragma('vm:never-inline')
 bool bar(bool f) => f && foo(1);
diff --git a/tests/language/why_not_promoted/nullable_operator_call_error.dart b/tests/language/why_not_promoted/nullable_operator_call_error_test.dart
similarity index 100%
rename from tests/language/why_not_promoted/nullable_operator_call_error.dart
rename to tests/language/why_not_promoted/nullable_operator_call_error_test.dart
diff --git a/tests/language_2/async_star/pause_test2.dart b/tests/language_2/async_star/pause2_test.dart
similarity index 100%
rename from tests/language_2/async_star/pause_test2.dart
rename to tests/language_2/async_star/pause2_test.dart
diff --git a/tests/language_2/function_subtype/null.dart b/tests/language_2/function_subtype/null_test.dart
similarity index 100%
rename from tests/language_2/function_subtype/null.dart
rename to tests/language_2/function_subtype/null_test.dart
diff --git a/tests/language_2/identifier/known_prefix_error_test.dart b/tests/language_2/identifier/known_prefix_error_test.dart
index 73a5e97..2cc7982 100644
--- a/tests/language_2/identifier/known_prefix_error_test.dart
+++ b/tests/language_2/identifier/known_prefix_error_test.dart
@@ -17,6 +17,10 @@
 import 'built_in_prefix_library_async.dart' as async;
 import 'built_in_prefix_library_await.dart' as await;
 import 'built_in_prefix_library_hide.dart' as hide;
+import 'built_in_prefix_library_library.dart' as library;
+//                                               ^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'library' as a name here.
 import 'built_in_prefix_library_of.dart' as of;
 import 'built_in_prefix_library_on.dart' as on;
 import 'built_in_prefix_library_show.dart' as show;
@@ -24,42 +28,42 @@
 import 'built_in_prefix_library_yield.dart' as yield;
 
 async<dynamic> _async = new async.A();
-// [error line 26, column 1, length 5]
+// [error line 30, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'async' isn't a type.
 // [cfe] Expected 0 type arguments.
 await<dynamic> _await = new await.A();
-// [error line 31, column 1, length 5]
+// [error line 35, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'await' isn't a type.
 // [cfe] Expected 0 type arguments.
 hide<dynamic> _hide = new hide.A();
-// [error line 36, column 1, length 4]
+// [error line 40, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'hide' isn't a type.
 // [cfe] Expected 0 type arguments.
 of<dynamic> _of = new of.A();
-// [error line 41, column 1, length 2]
+// [error line 45, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'of' isn't a type.
 // [cfe] Expected 0 type arguments.
 on<dynamic> _on = new on.A();
-// [error line 46, column 1, length 2]
+// [error line 50, column 1, length 2]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'on' isn't a type.
 // [cfe] Expected 0 type arguments.
 show<dynamic> _show = new show.A();
-// [error line 51, column 1, length 4]
+// [error line 55, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'show' isn't a type.
 // [cfe] Expected 0 type arguments.
 sync<dynamic> _sync = new sync.A();
-// [error line 56, column 1, length 4]
+// [error line 60, column 1, length 4]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'sync' isn't a type.
 // [cfe] Expected 0 type arguments.
 yield<dynamic> _yield = new yield.A();
-// [error line 61, column 1, length 5]
+// [error line 65, column 1, length 5]
 // [analyzer] COMPILE_TIME_ERROR.NOT_A_TYPE
 // [cfe] 'yield' isn't a type.
 // [cfe] Expected 0 type arguments.
diff --git a/tests/language_2/library/a.dart b/tests/language_2/library/a.dart
deleted file mode 100644
index 1b7fc61..0000000
--- a/tests/language_2/library/a.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryA.dart;
-
-import "c.dart";
-
-var fooA = fooC;
diff --git a/tests/language_2/library/b.dart b/tests/language_2/library/b.dart
deleted file mode 100644
index dfc7b36..0000000
--- a/tests/language_2/library/b.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryB.dart;
-
-import "c.dart";
-
-var fooB = fooC;
diff --git a/tests/language_2/library/c.dart b/tests/language_2/library/c.dart
deleted file mode 100644
index cc212ff..0000000
--- a/tests/language_2/library/c.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryC.dart;
-
-var fooC = 10;
diff --git a/tests/language_2/library/d.dart b/tests/language_2/library/d.dart
deleted file mode 100644
index 25ec2a9..0000000
--- a/tests/language_2/library/d.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryD.dart;
-
-import "f.dart";
-
-var fooD = fooC;
diff --git a/tests/language_2/library/e.dart b/tests/language_2/library/e.dart
deleted file mode 100644
index c00631e..0000000
--- a/tests/language_2/library/e.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryE.dart;
-
-import "c.dart";
-import "f.dart";
-
-var fooE = 0;
diff --git a/tests/language_2/library/f.dart b/tests/language_2/library/f.dart
deleted file mode 100644
index 085bea4..0000000
--- a/tests/language_2/library/f.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library libraryF.dart;
-
-var fooC = 10;
diff --git a/tests/language_2/library/library3.dart b/tests/language_2/library/library3.dart
deleted file mode 100644
index 96a979f..0000000
--- a/tests/language_2/library/library3.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library library3.dart;
-
-import "../library2.dart"; // defines "foo" and "foo1".
diff --git a/tests/language_2/library/library4.dart b/tests/language_2/library/library4.dart
deleted file mode 100644
index f4d701e..0000000
--- a/tests/language_2/library/library4.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-
-// @dart = 2.9
-
-library library4.dart;
-
-import "../library2.dart"; // defines "foo" and "foo1".
-
-var foo;
-var foo1 = 0;
diff --git a/tests/language_2/library/library6.dart b/tests/language_2/library/library6_test.dart
similarity index 100%
rename from tests/language_2/library/library6.dart
rename to tests/language_2/library/library6_test.dart
diff --git a/tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type.dart b/tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
similarity index 100%
rename from tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type.dart
rename to tests/language_2/nosuchmethod_forwarding/abstract_override_with_different_type_test.dart
diff --git a/tests/language_2/prefix/new_test.dart b/tests/language_2/prefix/new_test.dart
index a056bdf..8eac176 100644
--- a/tests/language_2/prefix/new_test.dart
+++ b/tests/language_2/prefix/new_test.dart
@@ -7,7 +7,7 @@
 library PrefixTest;
 
 import "package:expect/expect.dart";
-import "test1.dart";
+import "new_test1.dart";
 
 main() {
   Expect.equals(Prefix.getSource(), Prefix.getImport() + 1);
diff --git a/tests/language_2/prefix/new_test1.dart b/tests/language_2/prefix/new_test1.dart
index 98c0e76..05681ee 100644
--- a/tests/language_2/prefix/new_test1.dart
+++ b/tests/language_2/prefix/new_test1.dart
@@ -6,7 +6,7 @@
 
 library PrefixTest1;
 
-import "test2.dart" as test2;
+import "new_test2.dart" as test2;
 
 class Prefix {
   static const int foo = 43;
diff --git a/tests/language_2/regress/regress34091.dart b/tests/language_2/regress/regress34091_test.dart
similarity index 100%
rename from tests/language_2/regress/regress34091.dart
rename to tests/language_2/regress/regress34091_test.dart
diff --git a/tests/language_2/script/source.dart b/tests/language_2/script/source.dart
deleted file mode 100644
index b9861c7..0000000
--- a/tests/language_2/script/source.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// A perfectly legal dart source file for use with script and library tests.
-
-const int script_source = 1;
diff --git a/tests/language_2/string/overflow.dart b/tests/language_2/string/overflow_test.dart
similarity index 100%
rename from tests/language_2/string/overflow.dart
rename to tests/language_2/string/overflow_test.dart
diff --git a/tests/language_2/top_level/file3.dart b/tests/language_2/top_level/file3.dart
deleted file mode 100644
index d9ffab6..0000000
--- a/tests/language_2/top_level/file3.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-main() {
-  Expect.equals(42, prefix.topLevelVar);
-}
diff --git a/tests/language_2/unsorted/unevaluated_field.dart b/tests/language_2/unsorted/unevaluated_field_test.dart
similarity index 100%
rename from tests/language_2/unsorted/unevaluated_field.dart
rename to tests/language_2/unsorted/unevaluated_field_test.dart
diff --git a/tests/language_2/vm/regression_38412.dart b/tests/language_2/vm/regression_38412_test.dart
similarity index 100%
rename from tests/language_2/vm/regression_38412.dart
rename to tests/language_2/vm/regression_38412_test.dart
diff --git a/tests/language_2/vm/regression_38436.dart b/tests/language_2/vm/regression_38436.dart
deleted file mode 100644
index f350f6c..0000000
--- a/tests/language_2/vm/regression_38436.dart
+++ /dev/null
@@ -1,2364 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// VMOptions=--optimization_counter_threshold=1
-
-import "package:expect/expect.dart";
-
-// Found by DartFuzzing: would sometimes crash on OSR
-// https://github.com/dart-lang/sdk/issues/38436
-
-import 'dart:async';
-import 'dart:cli';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:core';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-String var0 = '';
-bool var1 = true;
-int var2 = -30;
-double var3 = 0.895077679110543;
-String var4 = '';
-List<int> var5 = [55, -70];
-Set<int> var6 = {
-  1024,
-  for (int loc0 in [
-    79,
-    ...[23],
-    ...[90, -89, -24],
-    -90,
-    11,
-    -19,
-    -91
-  ])
-    -55,
-  67,
-  -80,
-  for (int loc0 = 0; loc0 < 29; loc0++) 20,
-  for (int loc0 = 0; loc0 < 24; loc0++) ...{23, -41},
-  ...{
-    -75,
-    128,
-    9223372034707292159,
-    -56,
-    -59,
-    for (int loc0 in {
-      -67,
-      for (int loc1 in [-27, -59, 31, 32, -66, -87]) -9223372036854775680,
-      85,
-      -45,
-      if (false) 70,
-      13,
-      43,
-      48
-    })
-      if (true) 63,
-    ...{-90, -24, -9223372036854743041, -9223372032559808383, 86},
-    -25
-  }
-};
-Map<int, String> var7 = {
-  6: '',
-  ...{56: 'B\u2665pwO', 73: 'ZJDi\u{1f600}m'},
-  ...{73: ')', 14: '93Q'},
-  98: 'xA0jQL',
-  21: ')\u2665TOy',
-  for (int loc0 = 0; loc0 < 82; loc0++) 34: 'Q3\u2665#61',
-  ...{70: 'XXRXl3O', 56: '\u2665lda2Zy', 38: 'Dr#mtz', 6: 'nx'},
-  27: '('
-};
-
-Set<int> foo0() {
-  var3 += ((((var0 + var7[var5[88]])).isEmpty ? true : var1)
-      ? (var1 ? (var3 ?? var3) : var3)
-      : (var1 ? 0.24414824314186978 : var3));
-  var1 ??= true;
-  return {(var2--), Duration.secondsPerHour, var5[var2]};
-}
-
-Map<int, String> foo1(List<int> par1, bool par2) {
-  throw ((-(var3)) * (-(0.943305664017911)));
-}
-
-List<int> foo2(Set<int> par1, List<int> par2, Map<int, String> par3) {
-  switch (-49) {
-    case 4149672951:
-      {
-        for (int loc0 in foo0()) {
-          var6 = var6;
-          try {
-            for (int loc1 = 0; loc1 < 70; loc1++) {
-              switch (((var1
-                      ? ((var1 ? var1 : true) ? Float32x4.xzzw : (--var2))
-                      : (4295032831 % (loc1 + 93))))
-                  .floor()) {
-                case 3294548737:
-                  {
-                    var5[Int32x4.xxwy] ^=
-                        (loc0 * ('!').compareTo(((!(true)) ? var4 : 'S')));
-                  }
-                  break;
-                case 3294548738:
-                  {
-                    var0 = var4;
-                    loc0 <<= Int32x4.zwxz;
-                  }
-                  break;
-              }
-              {
-                int loc2 = 0;
-                do {
-                  var1 = ('Ncb\u2665P9K').isEmpty;
-                  var1 ??= (!(true));
-                } while (++loc2 < 91);
-              }
-            }
-            par3 ??= {
-              44: ((false
-                      ? false
-                      : ((true
-                              ? var7
-                              : {
-                                  17: par3[(var5[-73] - -20)],
-                                  80: var7[
-                                      ((++loc0) ~/ ((!(false)) ? 47 : var2))],
-                                  30: '8Qvz3',
-                                  36: '',
-                                  10: (('@B!0bW6' + var4)).toLowerCase(),
-                                  89: var7[-9223372036854775296],
-                                  4: ') '
-                                }) !=
-                          var7))
-                  ? ((var1 || (!(var1))) ? var7[Float32x4.wxzw] : var7[-7])
-                  : '8h'),
-              for (int loc1 in [
-                (false
-                    ? ((([
-                                  var2,
-                                  -39,
-                                  -74,
-                                  Float32x4.zzxy,
-                                  (~(var5[(67 + -86)])),
-                                  -53
-                                ] +
-                                [(var2++), var5[par2[(--loc0)]]]) !=
-                            [
-                              var5[var5[var5[(loc0++)]]],
-                              loc0,
-                              loc0,
-                              -55,
-                              -69,
-                              loc0
-                            ])
-                        ? (loc0--)
-                        : loc0)
-                    : var2),
-                (75 ^ 93),
-                (false ? var5[Float32x4.xzyw] : (loc0++)),
-                ...[
-                  for (int loc2 in {
-                    -22,
-                    (loc0 ^ 2),
-                    var5[(-((par2[-79] * 86)))],
-                    (++loc0),
-                    ((par2[var5[-45]] ?? 55) >> (true ? Int32x4.wyww : -45)),
-                    (~((++var2))),
-                    par2[var2]
-                  })
-                    (loc0--),
-                  if ((var7[(false ? (-(loc0)) : 19)]).endsWith(var4))
-                    (++var2)
-                  else
-                    (var1 ? loc0 : 39),
-                  (((var2++) & var2) & -26),
-                  if (false) (var1 ? Float32x4.wzzw : var5[129]),
-                  for (int loc2 in {
-                    (loc0--),
-                    (true ? loc0 : loc0),
-                    var2,
-                    var5[(0.4452451921266031).floor()],
-                    (~(-4294967196)),
-                    (loc0--),
-                    (--var2)
-                  })
-                    (var1 ? -30 : (loc0++)),
-                  (~((var1 ? 51 : var2))),
-                  (((var3 ?? pi) < 0.9098824013356337)
-                      ? ((true ? 57 : -48) << (--var2))
-                      : par2[-59])
-                ]
-              ])
-                84: var4,
-              57: var4
-            };
-          } catch (exception, stackTrace) {
-            /**
-           ** Multi-line
-           ** documentation comment.
-           */
-            for (int loc1 = 0; loc1 < 89; loc1++) {
-              switch ((var2--)) {
-                case 3807258589:
-                  {
-                    print(({
-                          (-34 ^
-                              ((false || var1)
-                                  ? 24
-                                  : (-(((-((var1
-                                          ? par2[(-(71))]
-                                          : 9223372032559808768))) +
-                                      (~(loc1))))))),
-                          (~((true ? loc0 : (false ? -75 : 33)))),
-                          Float32x4.zxwz,
-                          (false ? (15 * -83) : (var2--)),
-                          ((var7 !=
-                                  ((true ? var1 : false)
-                                      ? var7
-                                      : {
-                                          99: (true ? 'TobD' : var0),
-                                          59: (var4 ?? var4),
-                                          13: var4,
-                                          58: Uri.encodeFull(var4),
-                                          99: var7[loc1]
-                                        }))
-                              ? loc1
-                              : (var1
-                                  ? ((72 >> -15) ~/ (loc0--))
-                                  : -9223372030412324864)),
-                          32
-                        } ??
-                        par1));
-                  }
-                  break;
-                case 3807258592:
-                  {
-                    var1 ??= true;
-                    try {
-                      var7 = {9: (var1 ? 'ON' : 'f\u{1f600}b')};
-                      par2 = (true
-                          ? var5
-                          : [
-                              DateTime.january,
-                              (40 - (~(var2))),
-                              (var1 ? (--loc0) : 23),
-                              var5[(--var2)]
-                            ]);
-                    } catch (exception, stackTrace) {
-                      var3 /= 0.9998663372091022;
-                    } finally {
-                      par2 ??= ((var1
-                              ? false
-                              : (((par1 ??
-                                          {
-                                            -68,
-                                            86,
-                                            -33,
-                                            var5[(-9223372034707292159 - 90)],
-                                            (24 - (++var2)),
-                                            (-(var2)),
-                                            (loc1 * Int32x4.wyxx)
-                                          }))
-                                      .difference({
-                                    (var1 ? Float32x4.yzyw : (loc1 % loc0)),
-                                    6,
-                                    22,
-                                    91,
-                                    loc0,
-                                    (true ? loc1 : loc1)
-                                  }) ==
-                                  foo0()))
-                          ? par2
-                          : [
-                              (var2--),
-                              (-((++loc0))),
-                              ((-(var5[-52])) ~/
-                                  (true ? Int32x4.wyyy : (loc0--))),
-                              (var3).toInt()
-                            ]);
-                      var5[99] += (~(Float32x4.ywxw));
-                    }
-                  }
-                  break;
-              }
-              var5 = (par2 ??
-                  [
-                    ...[72],
-                    for (int loc2 in {Float32x4.xxwz, loc1})
-                      ((loc0--) ~/ (var2++)),
-                    par2[(++var2)],
-                    (-((--var2))),
-                    (var2++),
-                    -56,
-                    (~((~(loc0)))),
-                    for (int loc2 in {
-                      (-((~(17)))),
-                      Float32x4.zzzw,
-                      Float32x4.zyyz,
-                      (var2--),
-                      (Int32x4.wzwz % 78),
-                      loc0
-                    })
-                      Int32x4.xzzy
-                  ]);
-            }
-            {
-              int loc1 = 0;
-              do {
-                loc0 &= (-(4295000065));
-              } while (++loc1 < 94);
-            }
-          } finally {
-            var3 -= 0.020483900923215503;
-            try {
-              return [
-                ...[
-                  (loc0--),
-                  for (int loc1 in {Float32x4.yxyz})
-                    if (var1) (~(-35)) else loc0,
-                  (++loc0),
-                  for (int loc1 = 0; loc1 < 43; loc1++)
-                    (var5[var5[par2[var5[-9223372032559808384]]]] &
-                        Int32x4.yzxy),
-                  for (int loc1 = 0; loc1 < 98; loc1++) (-((~(Int32x4.xwwy)))),
-                  Float32x4.yzzz
-                ],
-                (-(Int32x4.xzxz))
-              ];
-            } catch (exception, stackTrace) {
-              for (int loc1
-                  in (((((!((((0.13101852551635873 == 0.4825498460563603)
-                                          ? var7
-                                          : var7) !=
-                                      var7)))
-                                  ? 1
-                                  : par2[var2]))
-                              .isEven
-                          ? {
-                              (var2++),
-                              (-48 | -54),
-                              (~(par2[loc0])),
-                              par2[var5[Int32x4.zyzz]],
-                              -2,
-                              (true ? (~((-(((!(false)) ? -11 : var2))))) : 73),
-                              if ((0.15992181539430828).isInfinite) (++var2)
-                            }
-                          : (false ? {-6} : {((++loc0) % 27), 92})) ??
-                      Set.identity())) {
-                var6 ??= foo0();
-              }
-              var5[(~(((true ? -10 : Float32x4.zzwy) -
-                  Duration.millisecondsPerSecond)))] = (~((var2--)));
-            }
-          }
-        }
-        par3.forEach((loc0, loc1) {
-          // Single-line comment.
-          var6 = (var6 ?? foo0());
-          par1 = {
-            if (('X2yPgV').endsWith('b'))
-              Float32x4.yxxy
-            else if (true)
-              Int32x4.xzyw
-            else
-              for (int loc2 = 0; loc2 < 9; loc2++) (++loc0),
-            (4294967551 ?? (-((loc0--)))),
-            (-69 ~/
-                ((!(false))
-                    ? ((((par2[Int32x4.zwzw]).isEven
-                                ? (var3).truncateToDouble()
-                                : 0.14035347150303745))
-                            .isInfinite
-                        ? Int32x4.yzxx
-                        : par2[loc0])
-                    : (var2++))),
-            ((loc0++) - ((++var2) >> (~(par2[(var2--)]))))
-          };
-        });
-      }
-      break;
-    case 4149672955:
-      {
-        par2[((var2 ^ (~((--var2)))) | -98)] *= -62;
-        {
-          int loc0 = 0;
-          do {
-            var0 = par3[(var5[4294967808] >> Float32x4.wwyx)];
-          } while (++loc0 < 46);
-        }
-      }
-      break;
-  }
-  var1 ??= (!((var3).isNaN));
-  return (var1
-      ? par2
-      : Uri.parseIPv6Address(
-          (var1 ? '' : '26DgiI'), (ZLibOption.maxMemLevel % 65), 68));
-}
-
-class X0 {
-  bool fld0_0 = true;
-  Set<int> fld0_1 = {
-    31,
-    if (true) ...{
-      -93,
-      -4294967041,
-      -4294934527,
-      if (false) 92,
-      if (true) 69
-    } else
-      85,
-    ...{
-      ...{73, 27},
-      for (int loc0 in {
-        for (int loc1 = 0; loc1 < 56; loc1++) -36,
-        -23,
-        -99,
-        20,
-        16,
-        11,
-        if (false) -24,
-        if (true) 14
-      })
-        if (false) 69,
-      -9223372032559808513,
-      -9223372036854775553,
-      -9223372036854774784,
-      -22
-    },
-    81,
-    ...{16, if (false) 67 else -30, if (true) 21 else -61, -84},
-    -69
-  };
-
-  List<int> foo0_0(Map<int, String> par1) {
-    if ((var1 ? ((!(fld0_0)) ? true : false) : true)) {
-      return ((var4).trim()).codeUnits;
-    } else {
-      for (int loc0 in var6) {
-        fld0_0 ??= var1;
-        for (int loc1 = 0; loc1 < 57; loc1++) {
-          {
-            Map<int, String> loc2 = Map.identity();
-            par1 ??= Map.unmodifiable(Map.unmodifiable(Map.unmodifiable((true
-                ? loc2
-                : ((true
-                        ? loc2
-                        : foo1(
-                            [var5[-60], loc0, var5[-48], -80, var5[var5[37]]],
-                            var1)) ??
-                    {
-                      60: var0,
-                      93: ((false ? var0 : '') + 'r\u{1f600}2B#p')
-                    })))));
-            var4 = ' ';
-          }
-          try {
-            var5 = foo2(
-                ({loc0, 37, Float32x4.wwyw} ?? var6),
-                ((fld0_0
-                        ? [
-                            for (int loc2 = 0; loc2 < 1; loc2++)
-                              (~(Float32x4.zyzz)),
-                            (~((true
-                                ? (Float32x4.yyzw >> (48 - (-((var2--)))))
-                                : (~(loc0))))),
-                            ((var4 ==
-                                    String.fromEnvironment(
-                                        (var1 ? 'l9FM' : par1[var5[loc0]])))
-                                ? (++loc0)
-                                : 4),
-                            ...[
-                              (~((var5[-9223372032559808448] - (++var2)))),
-                              ...[
-                                for (int loc2 in [
-                                  ((-12 <= 55) ? 9223372032559841280 : loc0),
-                                  var5[var5[(~(var5[var5[loc1]]))]],
-                                  (var1 ? 67 : -74)
-                                ])
-                                  (var5[var2]).sign,
-                                var5[-65],
-                                if (fld0_0)
-                                  var5[(var5[var5[-90]] ~/ 22)]
-                                else
-                                  (-9223372036854775679 + var5[16]),
-                                76,
-                                7
-                              ],
-                              (++var2),
-                              -9223372034707292160,
-                              (var2--),
-                              var5[(var2--)]
-                            ],
-                            loc1,
-                            Float32x4.ywxz,
-                            ((++loc0) + (--loc0)),
-                            for (int loc2 in [
-                              for (int loc3 = 0; loc3 < 4; loc3++) loc1,
-                              ...[
-                                Float32x4.zxwy,
-                                Float32x4.xzwx,
-                                var2,
-                                (++var2),
-                                Int32x4.xzyy,
-                                (var5[loc1] | (true ? -97 : -93)),
-                                Float32x4.xwyz,
-                                ((true || var1)
-                                    ? (~((--loc0)))
-                                    : (~((var5[18] % (-55 + loc0)))))
-                              ],
-                              (~((++loc0))),
-                              -85,
-                              (~((var2++))),
-                              (true
-                                  ? ZLibOption.maxMemLevel
-                                  : var5[var5[var5[var5[var2]]]]),
-                              ((true
-                                      ? ((!((false
-                                              ? (true ? fld0_0 : (!(false)))
-                                              : fld0_0)))
-                                          ? fld0_0
-                                          : (({
-                                                96: var4,
-                                                60: '(0yBGn\u{1f600}',
-                                                57: var4,
-                                                73: var7[-43],
-                                                38: var0
-                                              })
-                                                  .isNotEmpty ||
-                                              ({
-                                                67: var4,
-                                                14: 'M\u{1f600}1HNbP',
-                                                6: 's',
-                                                85: 'uyq',
-                                                95: var7[(-(Int32x4.wwxw))],
-                                                33: ''
-                                              })
-                                                  .isNotEmpty))
-                                      : false)
-                                  ? var2
-                                  : (++var2))
-                            ]) ...[-27]
-                          ]
-                        : [
-                            for (int loc2 = 0; loc2 < 87; loc2++)
-                              (-47 * (~((((--var2) ^ loc0) ?? 78)))),
-                            (-(((({
-                                  14: (var3).toStringAsExponential(
-                                      (false ? var5[-62] : 33)),
-                                  16: '',
-                                  71: var4,
-                                  78: (([var5[(-(91))]] == var5) ? var4 : var0),
-                                  9: par1[loc1],
-                                  51: '-8ht',
-                                  26: ('(2l3\u2665h' ?? var0),
-                                  79: var4
-                                })
-                                        .isNotEmpty
-                                    ? var5[(var2 % loc0)]
-                                    : var2) %
-                                ((!(NetworkInterface.listSupported))
-                                    ? -22
-                                    : ((var1
-                                            ? ([
-                                                  ZLibOption.STRATEGY_DEFAULT,
-                                                  21,
-                                                  loc1,
-                                                  loc1,
-                                                  loc0,
-                                                  5,
-                                                  loc0,
-                                                  98
-                                                ] ==
-                                                Uri.parseIPv4Address(
-                                                    var7[loc1]))
-                                            : var1)
-                                        ? (~((-20 %
-                                            (var5).removeAt(Float32x4.wyxw))))
-                                        : var5[var5[82]]))))),
-                            (-(Float32x4.wwwz)),
-                            Int32x4.wxxz,
-                            ...[
-                              (loc0++),
-                              ...[
-                                (--loc0),
-                                -2,
-                                ZLibOption.DEFAULT_WINDOW_BITS,
-                                -42,
-                                for (int loc2 = 0; loc2 < 2; loc2++) (-(-22)),
-                                (~(-81))
-                              ],
-                              (--var2)
-                            ],
-                            (++var2),
-                            ((!(false)) ? (--var2) : (((~(34)) >> 48) << 79)),
-                            loc1
-                          ]) +
-                    foo2(
-                        foo0(),
-                        ([
-                              (((~(var5[(-(var5[(87 % var5[(++var2)])]))])) ??
-                                      -11) ~/
-                                  (var2++)),
-                              ((((!(var1)) && true) ? loc1 : 98) <<
-                                  ((!((true != (var4 == par1[var5[(~(-83))]]))))
-                                      ? -44
-                                      : var5[88])),
-                              Float32x4.yyyz,
-                              -44,
-                              Int32x4.xzyx,
-                              (++loc0)
-                            ] ??
-                            [
-                              ((foo1([((!(var1)) ? 24 : 81), -93], true))
-                                      .isEmpty
-                                  ? 52
-                                  : (~(Int32x4.zyww))),
-                              Int32x4.xxwz,
-                              (-(-11)),
-                              (loc0--),
-                              ((!(bool.fromEnvironment('U\u2665')))
-                                  ? (loc0++)
-                                  : (++var2))
-                            ]),
-                        {
-                          70: var7[7],
-                          18: '\u2665(#&c\u{1f600}-',
-                          58: 'KuNr',
-                          96: '\u{1f600}2\u2665YY',
-                          94: var0,
-                          28: 'l-'
-                        })),
-                par1);
-            {
-              double loc2 = double.infinity;
-              /*
-               * Multi-line
-               * comment.
-               */
-              return ('a!wNh!').codeUnits;
-            }
-          } catch (exception, stackTrace) {
-            continue;
-          } finally {
-            fld0_0 = (!(fld0_0));
-            var5 ??= ((Uri.parseIPv4Address('H') ??
-                    (foo2({
-                          loc1,
-                          ([
-                                if (((true ? loc0 : (loc0++)) <
-                                    ((!(var1)) ? -90 : Int32x4.yyzx)))
-                                  (~(var2))
-                                else
-                                  for (int loc2 in {
-                                    if (SecurityContext.alpnSupported)
-                                      var2
-                                    else
-                                      Int32x4.wzzy,
-                                    -9223372036754112763,
-                                    (-((var1
-                                        ? var5[62]
-                                        : (-(Float32x4.wzwz))))),
-                                    (~(Float32x4.yxzy))
-                                  })
-                                    ((((true && (false ? fld0_0 : var1))
-                                                ? fld0_0
-                                                : false)
-                                            ? true
-                                            : (fld0_0 && var1))
-                                        ? (true ? (~(loc1)) : var5[-16])
-                                        : loc0),
-                                for (int loc2 = 0; loc2 < 1; loc2++)
-                                  ((false && var1) ? Float32x4.yzyy : 50)
-                              ][var2] *
-                              [
-                                ...[
-                                  (((-10 >> Int32x4.wxzw) *
-                                          ((0.42979687169554437 >=
-                                                  0.17848133910264385)
-                                              ? -4
-                                              : var5[-15])) |
-                                      var5[(loc0++)]),
-                                  ...[
-                                    (('@jcNl\u2665P')
-                                            .compareTo(var7[(loc0--)]) &
-                                        (~((~(loc0))))),
-                                    if ((!(((!(true)) && true)))) 2,
-                                    loc1,
-                                    ((var5[(loc0--)] | -38) & (loc0++)),
-                                    var2,
-                                    (~(-22)),
-                                    if (false) loc0 else 80,
-                                    (--loc0)
-                                  ],
-                                  ...[15],
-                                  ((~((~(-5)))) ^ Int32x4.xxxz),
-                                  79,
-                                  for (int loc2 in [
-                                    (fld0_0 ? -0 : (loc0++)),
-                                    -49,
-                                    for (int loc3 in [
-                                      -16,
-                                      (var2--),
-                                      35,
-                                      ((14 * -68) ~/ Int32x4.wwyy)
-                                    ])
-                                      var5[(fld0_0 ? 28 : (-41 ?? 19))],
-                                    loc0,
-                                    (var3).round(),
-                                    if ((!((!((!(false))))))) loc1,
-                                    (loc0++),
-                                    Int32x4.wyww
-                                  ])
-                                    ((--var2) * var5[(6 & var5[(~(-53))])]),
-                                  (loc0++),
-                                  Float32x4.xwxx
-                                ],
-                                Int32x4.ywyw,
-                                (-(ZLibOption.strategyFixed)),
-                                (80 % (loc0--)),
-                                var5[Int32x4.zxww]
-                              ][var5[50]]),
-                          (false ? -71 : 39),
-                          (var5[-61]).toSigned(loc0),
-                          -50,
-                          4294967296
-                        }, [
-                          (16 *
-                              (~(((var1 ? ZLibOption.STRATEGY_FIXED : -66) *
-                                  4)))),
-                          Float32x4.wwwx
-                        ], {
-                          63: var0,
-                          52: (fld0_0 ? 'uG\u2665V@4' : '62'),
-                          98: var7[var5[-83]],
-                          70: (false
-                              ? 'bSg'
-                              : base64UrlEncode(([
-                                    (~(var2)),
-                                    -52,
-                                    68,
-                                    [
-                                      10,
-                                      loc1,
-                                      92,
-                                      53,
-                                      Int32x4.zzyw,
-                                      (true ? 12 : 19),
-                                      (~(var5[(++var2)]))
-                                    ][-64],
-                                    (++loc0),
-                                    (loc0 << -26)
-                                  ] +
-                                  [
-                                    var5[(--loc0)],
-                                    (((var1 ? var5[var5[(var2--)]] : loc1) +
-                                            (--var2)) <<
-                                        Int32x4.wyyx)
-                                  ]))),
-                          16: 'YsD\u2665\u2665K',
-                          0: var0,
-                          93: var7[(-(var5[-43]))]
-                        }) ??
-                        var5)) ??
-                [
-                  if (fld0_0) -90,
-                  (--var2),
-                  ...[
-                    for (int loc2 in [
-                      (false ? (~(-9)) : -4294901760),
-                      (-(-7)),
-                      -51,
-                      (var1 ? -75 : [Float32x4.wwxw, Int32x4.zxyx][-7]),
-                      Float32x4.xyww,
-                      Int32x4.wwzx,
-                      (loc0++),
-                      (NetworkInterface.listSupported
-                          ? [1000][Float32x4.zzyx]
-                          : -71)
-                    ])
-                      -27,
-                    Float32x4.wyzy,
-                    (++var2)
-                  ]
-                ]);
-          }
-        }
-      }
-      throw Map.unmodifiable(foo1(
-          (MapBase.mapToString(foo1((false ? [var2] : var5), false))).codeUnits,
-          true));
-    }
-  }
-
-  void run() {}
-}
-
-class X1 extends X0 {
-  double fld1_0 = 0.47694301047645304;
-  bool fld1_1 = true;
-
-  Map<int, String> foo1_0(
-      Map<int, String> par1, Map<int, String> par2, double par3) {
-    // Single-line comment.
-    for (int loc0 = 0; loc0 < 91; loc0++) {
-      par2.forEach((loc1, loc2) {
-        {
-          bool loc3 = (fld1_1 || ('U\u2665').isEmpty);
-          var3 /= 0.8504341352135224;
-        }
-      });
-      {
-        int loc1 = 66;
-        while (--loc1 > 0) {
-          if (((!((true || fld1_1))) == true)) {
-            var0 ??= par2[var5[(~((false ? ((!(var1)) ? -95 : var2) : -37)))]];
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            return Map.unmodifiable({
-              55: var4,
-              73: 'c#',
-              17: (fld1_1
-                  ? '7\u{1f600}e'
-                  : ((!(var1)) ? '8E7AK2e' : 'Fm\u{1f600} F')),
-              40: 'mb(\u{1f600}\u2665l',
-              36: Uri.decodeFull((true ? par2[-32769] : var7[Float32x4.zyxz])),
-              51: ((false &&
-                      (((var1 ? true : true) || false)
-                          ? (var7[(var2--)]).isEmpty
-                          : true))
-                  ? (fld1_1
-                      ? (fld1_1 ? (var1).toString() : 'r9M')
-                      : ((true ? (0.2863696758528199 != par3) : false)
-                          ? (fld1_1 ? par1[Int32x4.zwyz] : var4)
-                          : var4))
-                  : var4),
-              8: '6G',
-              62: '+z@Gp'
-            });
-          } else {
-            var5[Int32x4.zzyy] ??= (-(var5[((!(false)) ? loc1 : -34)]));
-            {
-              int loc2 = (-(7));
-              var3 /= (true
-                  ? (-(((-9223372032459145467).isEven
-                      ? fld1_0
-                      : (-((-(0.7008573255099826)))))))
-                  : par3);
-            }
-          }
-          for (int loc2 in foo2(var6, var5, {
-            if (false) 11: par1[((var4).isEmpty ? 55 : -61)],
-            12: 'f5j2v\u{1f600}',
-            52: (((foo1(
-                            (((var1
-                                        ? {var5[-66], var2, 88, 12, 6, -96}
-                                        : (var1
-                                            ? {-25, 84, (var2--), var5[83]}
-                                            : {-36, var5[51], var2})) !=
-                                    {var5[(++var2)]})
-                                ? [-2147483648, 46, loc0, var5[loc0], -21]
-                                : foo2(
-                                    {var5[var5[loc0]]},
-                                    (true
-                                        ? var5
-                                        : [
-                                            -30,
-                                            var5[(-(-42))],
-                                            var2,
-                                            Float32x4.zywx,
-                                            loc1,
-                                            63,
-                                            -25,
-                                            -28
-                                          ]),
-                                    {30: 'j\u2665U', 98: var4})),
-                            false))
-                        .isNotEmpty
-                    ? (false ? fld1_0 : 0.3202297128057393)
-                    : 0.1301025669674245))
-                .toStringAsFixed(((fld1_1 ? 79 : -88) + Int32x4.xyzw)),
-            88: (false ? var7[(var2++)] : (var4 ?? '')),
-            31: (var1
-                ? (var1 ? par2[-87] : (true ? par2[-14] : var4))
-                : ((fld1_1 != true) ? '3nd9t&' : var4)),
-            22: ('(Czi' + '-Y')
-          })) {
-            var7[(loc2--)] = 's';
-          }
-        }
-      }
-    }
-    return par1;
-  }
-
-  String foo1_1(int par1) => var0;
-  Set<int> foo1_2(String par1) {
-    for (int loc0 = 0; loc0 < 58; loc0++) {
-      switch ((~(13))) {
-        case 746492976:
-          {
-            switch (Duration.millisecondsPerDay) {
-              case 3635015902:
-                {
-                  var7[var5[(var5[var2] * (-(var5[Float32x4.yxxz])))]] ??=
-                      (var7[-79] + '(O@');
-                  var7[loc0] ??= String.fromCharCode(var5[(true
-                      ? (var5[((var1 ? true : (false ? fld1_1 : var1))
-                              ? var5[Float32x4.wyyz]
-                              : 73)] ~/
-                          (-(84)))
-                      : -15)]);
-                }
-                break;
-              case 3635015905:
-                {
-                  var1 = (var1
-                      ? (foo1_0(
-                              (((!(false)) || fld1_1) ? var7 : var7),
-                              foo1_0(
-                                  {74: '\u2665e', 10: 'tw8jc0R'},
-                                  foo1_0(
-                                      var7,
-                                      foo1_0(
-                                          ({
-                                                17: var7[Int32x4.zyxy],
-                                                82: var7[64],
-                                                27: 'VEtj',
-                                                90: Uri.encodeQueryComponent(
-                                                    foo1_1(var2)),
-                                                68: 'wew0\u{1f600}'
-                                              } ??
-                                              foo1_0(var7, var7, var3)),
-                                          ({
-                                                65: 'mBeBfUj',
-                                                81: var4,
-                                                35: (var7[-43] + 'l'),
-                                                68: var4
-                                              } ??
-                                              {
-                                                33: ('N\u{1f600}xaY+' ?? par1),
-                                                44: var7[var5[var2]],
-                                                83: var4,
-                                                86: 'k'
-                                              }),
-                                          asin(0.4245871535895427)),
-                                      (-(0.2913717674787144))),
-                                  0.9439800024935644),
-                              (-((true
-                                  ? ((var1 ? false : var1)
-                                      ? 0.09441225978923817
-                                      : 0.42622157485045953)
-                                  : (-(0.29370792038584836)))))))
-                          .isNotEmpty
-                      : (false && true));
-                  var3 += (-(fld1_0));
-                }
-                break;
-            }
-          }
-          break;
-        case 746492979:
-          {
-            var4 = var0;
-            for (int loc1 = 0; loc1 < 88; loc1++) {
-              var2 += 32;
-            }
-          }
-          break;
-      }
-    }
-    {
-      int loc0 = 0;
-      do {
-        return foo0();
-      } while (++loc0 < 57);
-    }
-    return foo0();
-  }
-
-  String foo1_3() {
-    if ((0.42144855521066793).isNegative) {
-      print((false ? (-(fld1_0)) : (-((-((-(0.26854952952179667))))))));
-      switch (30) {
-        case 3830102525:
-          {
-            try {
-              var7.forEach((loc0, loc1) {
-                var1 = (!(true));
-                var6 = (foo1_2(var7[99]) ?? var6);
-              });
-              var6 ??= var6;
-            } catch (exception, stackTrace) {
-              var4 ??= ListBase.listToString([
-                (Duration.microsecondsPerSecond + -82),
-                (true
-                    ? var5[(var2 ~/ (false ? (~((var1 ? 46 : var2))) : var2))]
-                    : (-9223372034707292161 >> var5[var5[-86]])),
-                Float32x4.wxyx
-              ]);
-            } finally {
-              /**
-             ** Multi-line
-             ** documentation comment.
-             */
-              fld1_1 = (var5[var5[var2]]).isOdd;
-            }
-            /*
-           * Multi-line
-           * comment.
-           */
-            if ((SetBase.setToString((fld1_1
-                    ? {12, (fld1_1 ? (-(-22)) : (-(4395630341)))}
-                    : var6)))
-                .isNotEmpty) {
-              try {
-                {
-                  int loc0 = 86;
-                  while (--loc0 > 0) {
-                    {
-                      int loc1 = 0;
-                      do {
-                        var0 = var7[(-(((--var2) &
-                            ((var1 ? (fld1_0).isNaN : true)
-                                ? (-16 | -20)
-                                : ((0.7513819161190503).isNaN ? 45 : loc1)))))];
-
-                        /// Single-line documentation comment.
-                        var5[(true ? loc0 : Float32x4.zxzx)] %= loc0;
-                      } while (++loc1 < 17);
-                    }
-                    for (int loc1 = 0; loc1 < 25; loc1++) {
-                      var5[Float32x4.zywy] <<= Int32x4.ywwx;
-                    }
-                  }
-                }
-              } catch (exception, stackTrace) {
-                var7 = Map.from(foo1_0({
-                  81: (foo1_1(((++var2) * (-(var5[21])))) +
-                      (var7[8] + (var7[var5[53]] ?? var0))),
-                  for (int loc0 in [
-                    (true ? 58 : Float32x4.wyww),
-                    var5[(fld1_1 ? 46 : var2)]
-                  ])
-                    63: var7[(false
-                        ? var5[((24 >> -9223372036854710272) & var2)]
-                        : var5[(80 << var5[-31])])],
-                  67: var0,
-                  1: '3mlOA',
-                  30: ('OQbG').substring((var2--), (--var2)),
-                  93: ((var7[74] ?? var7[(++var2)])).toLowerCase(),
-                  ...{
-                    85: foo1_1(-21),
-                    if ((!((!(false))))) 86: var0,
-                    49: '62+v',
-                    59: foo1_1((--var2)),
-                    for (int loc0 in [
-                      -10,
-                      -65,
-                      (var2++),
-                      (var2++),
-                      ((({
-                                    ((var7[60] == var7[-30])
-                                        ? var5[(-((var2++)))]
-                                        : (var2--))
-                                  } ==
-                                  {var5[var2], -40, -81, (var2++), 93, 26})
-                              ? 38
-                              : (var1 ? var5[97] : -82)) *
-                          (--var2)),
-                      (~((true ? 5 : Float32x4.yxyy))),
-                      (var2++),
-                      ((++var2) << ((var2 % Int32x4.yxxw) >> (++var2)))
-                    ])
-                      54: (var0 + 'ANyqN'),
-                    94: (var1 ? '0T\u2665#w' : (var0).toUpperCase()),
-                    68: '@n',
-                    67: base64UrlEncode(((0.07857744084458451).isInfinite
-                        ? ([
-                              var2,
-                              var5[70],
-                              -32,
-                              Float32x4.yxwz,
-                              31,
-                              (~(var2)),
-                              (var2 ?? (-70 + 57)),
-                              -91
-                            ] +
-                            [
-                              var2,
-                              var5[((!(var1))
-                                  ? var5[(var2 ~/ Float32x4.zwyw)]
-                                  : var5[var5[(var5[(~(var2))] % var2)]])],
-                              (var2 | (false ? (-(var2)) : var5[80])),
-                              (var2--),
-                              DateTime.daysPerWeek,
-                              (var2 ~/ var2)
-                            ])
-                        : (var1 ? var5 : [(var2++)])))
-                  },
-                  if (false)
-                    if (false)
-                      26: (Uri.encodeComponent(foo1_1(var2)) + var7[var5[var2]])
-                    else ...{
-                      4: (double.negativeInfinity).toStringAsFixed(var2),
-                      46: Uri.decodeQueryComponent('bst3jz'),
-                      5: ((true
-                              ? (true ? '(-f' : var7[(-(Int32x4.yzxz))])
-                              : var7[(var5[(fld1_1 ? (var2--) : var2)] >>
-                                  (-((false ? 8589934591 : 33))))]) ??
-                          '4ov'),
-                      37: var7[var5[100663045]],
-                      13: '2B'
-                    }
-                }, {
-                  71: 'Hxbq',
-                  22: ('\u{1f600}Jtj').substring(
-                      (-36 | var5[(~((var2++)))]), 9223372032559874048)
-                }, 0.3710694748818374));
-                fld1_0 ??= 0.010604823956237519;
-              } finally {
-                for (int loc0 = 0; loc0 < 84; loc0++) {
-                  var5[Float32x4.xwwz] <<=
-                      ((((fld1_1 ? false : ('e\u{1f600}O+Vc').isNotEmpty) &&
-                                  (!(fld1_1)))
-                              ? (-73 | var5[Int32x4.yzwx])
-                              : Uint16List.bytesPerElement) ~/
-                          var2);
-                }
-              }
-            }
-          }
-          break;
-        case 3830102528:
-          {
-            fld1_1 ??= true;
-            throw (-((-17).ceilToDouble()));
-          }
-          break;
-      }
-    }
-    return var0;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = 61;
-      while (--loc0 > 0) {
-        {
-          int loc1 = 77;
-          while (--loc1 > 0) {
-            {
-              int loc2 = 0;
-              do {
-                break;
-              } while (++loc2 < 84);
-            }
-          }
-        }
-        if (((var1 || fld1_1) && (!((!((!((!((!(true)))))))))))) {
-          switch (Int32x4.yyzx) {
-            case 900727295:
-              {
-                /// Single-line documentation comment.
-                fld1_1 ??= (!(true));
-                for (int loc1 in ((var5 ??
-                        Uri.parseIPv6Address(
-                            foo1_3(), var5[(loc0 + var5[4096])], -34)) ??
-                    var5)) {
-                  var7[(38 << (false ? (~(-58)) : Float32x4.yyxy))] =
-                      Uri.decodeFull(foo1_3());
-                  var5 ??= var5;
-                }
-              }
-              break;
-            case 900727304:
-              {
-                fld1_1 =
-                    (SecurityContext.alpnSupported ? (var3).isFinite : var1);
-                fld1_0 += 0.3154406798513474;
-              }
-              break;
-          }
-          var2 ^= var2;
-        } else {
-          if (((-(var3)) <= (-(fld1_0)))) {
-            var6 = foo1_2('0vsDWF9');
-          } else {
-            var6 ??= ((fld1_0 <= 0.16230005903410238)
-                ? ((!((0.5144029832155854 > (0.8199455895430549 / var3))))
-                    ? foo1_2('ken')
-                    : var6)
-                : (fld1_1 ? {56, 6442450945, 2} : {34}));
-          }
-          var5[Float32x4.zwzw] += (true ? var2 : (~(Float32x4.wyyx)));
-        }
-      }
-    }
-  }
-}
-
-class X2 extends X0 with X1 {
-  Set<int> fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
-
-  bool foo2_0(int par1) => var1;
-  bool foo2_1(bool par1) {
-    for (int loc0 in var6) {
-      var2 ~/= ((((((fld2_0 ?? (true ? var6 : var6)) ?? fld2_0))
-                      .union({(~(-21)), 10}) !=
-                  {(var5[90] ~/ (-(-90)))})
-              ? par1
-              : (var7[(~(82))]).isNotEmpty)
-          ? ((~(loc0)) *
-              ((true ? (-4294966272 ?? -21) : var2) +
-                  Duration.millisecondsPerMinute))
-          : (-9223372032559807488 ~/ 4294968296));
-    }
-    if (('DeAm#f' ==
-        ((Uri.encodeQueryComponent((0.3687340601979223).toString()) ??
-                var7[-23]) ??
-            foo1_3()))) {
-      throw (([Float32x4.wyyz, -9223372036854743039])
-              .sublist((--var2), (--var2)) +
-          ((true ? var1 : (!(false)))
-              ? foo2(
-                  foo1_2('JLXt'),
-                  [
-                    var5[Int32x4.zxzx],
-                    Int32x4.xxwy,
-                    (var2++),
-                    Float32x4.yzxx,
-                    (var2++),
-                    -15
-                  ],
-                  foo1_0(var7, var7, 0.7904389283184639))
-              : (var1
-                  ? [Float32x4.yzyz, Int32x4.wxxy, var2, (~(var5[-47]))]
-                  : var5)));
-    } else {
-      var7[var2] ??= ((({
-            ...{
-              for (int loc0 = 0; loc0 < 19; loc0++)
-                36: (var7[var2] ?? (par1 ? ('ccb9z' + 'iM') : var0)),
-              3: ('1sG' + var0),
-              for (int loc0 in {
-                (-(var5[var2])),
-                if (var1) Int32x4.zxxx,
-                -4294967168,
-                -61,
-                (~((par1 ? (~(-70)) : (var2--)))),
-                (-(7)),
-                -96,
-                Uint32List.bytesPerElement
-              })
-                85: var4
-            },
-            if (foo2_0(-91)) 38: (var3).toString() else 30: 'uI\u2665\u{1f600}',
-            72: '@'
-          }[(par1 ? 14 : var2)])
-                  .trim())
-              .substring((36 ~/ var5[(++var2)]), var5[((-(25)) * -53)]) ??
-          foo1_3());
-      /*
-       * Multi-line
-       * comment.
-       */
-      {
-        int loc0 = 0;
-        do {
-          {
-            String loc1 = 'jG7t';
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            {
-              int loc2 = 57;
-              while (--loc2 > 0) {
-                print((var6 ??
-                    (foo1_2(var0)).union(foo1_2(('n' + var7[(++var2)])))));
-              }
-            }
-          }
-        } while (++loc0 < 69);
-      }
-    }
-    return (!(((!((par1 && false)))
-        ? (true && foo2_0(-9223372036854771712))
-        : (!(par1)))));
-  }
-
-  double foo2_2(Map<int, String> par1, int par2) {
-    switch (var2) {
-      case 3816231196:
-        {
-          throw (-(Int32x4.xxwx));
-        }
-        break;
-      case 3816231204:
-        {
-          var7.forEach((loc0, loc1) {
-            switch ((-43 ^ (-(Float32x4.wwxx)))) {
-              case 2839002105:
-                {
-                  var0 ??= (SetBase.setToString(((var1 ? var1 : (true || var1))
-                          ? fld2_0
-                          : {
-                              Int32x4.yyzw,
-                              Int32x4.yyxy,
-                              (2 >> Int32x4.ywzx),
-                              (var1
-                                  ? ((foo2_1(var1) ? 17 : loc0) ~/
-                                      (-(var5[var2])))
-                                  : par2),
-                              Float32x4.zwwx,
-                              par2,
-                              Int32x4.wzzz,
-                              Int32x4.zyzw
-                            })) ??
-                      (loc1 +
-                          var7[((true
-                                  ? (var1 &&
-                                      bool.fromEnvironment(var7[(var2--)]))
-                                  : foo2_1(false))
-                              ? 35
-                              : (-(66)))]));
-                  for (int loc2 = 0; loc2 < 23; loc2++) {
-                    switch ((-73 ^ (Int32x4.xyzz >> Float32x4.yzzz))) {
-                      case 1710454916:
-                        {
-                          var3 = 0.3372913861348876;
-                          print(((-(var3)) * var3));
-                        }
-                        break;
-                      case 1710454922:
-                        {
-                          var4 ??= ((false
-                                  ? (var1
-                                      ? var1
-                                      : (fld2_0 ==
-                                          {
-                                            (false ? -27 : (-(92))),
-                                            loc2,
-                                            var5[loc2],
-                                            (var1
-                                                ? Float32x4.yywy
-                                                : (false ? -74 : 2)),
-                                            ((-(-50)) ^ 32),
-                                            (var2++)
-                                          }))
-                                  : var1)
-                              ? base64UrlEncode([
-                                  for (int loc3 in {
-                                    (-(par2)),
-                                    loc0,
-                                    (-((par2++))),
-                                    Float32x4.yyyx
-                                  })
-                                    (par2--),
-                                  (-((-(var5[var5[var5[-41]]])))),
-                                  if (({
-                                        loc2,
-                                        Duration.microsecondsPerSecond,
-                                        (([
-                                                  (par2++),
-                                                  (-90 ^ -5),
-                                                  var5[(~(0))],
-                                                  loc2
-                                                ] !=
-                                                var5)
-                                            ? -9223372032559808512
-                                            : (par2++))
-                                      } ==
-                                      {
-                                        (var1 ? (-((loc2 % loc2))) : loc2),
-                                        -94,
-                                        -62
-                                      }))
-                                    (++var2),
-                                  loc2,
-                                  for (int loc3 in {
-                                    55,
-                                    (~(var5[var5[(++par2)]])),
-                                    ((var1
-                                            ? (-((++var2)))
-                                            : var5[(true ? var5[68] : 10)]) -
-                                        par2),
-                                    (-(Float32x4.wzxx))
-                                  })
-                                    (Int32x4.yxzy | var5[-1]),
-                                  (foo2_1(false) ? (-(32)) : loc0),
-                                  (--par2),
-                                  if ((!(false))) (var1 ? var5[loc0] : 30)
-                                ])
-                              : ('b1TKp3' ??
-                                  (var4 +
-                                      var7[(~(var5[
-                                          ((var1 ? var2 : loc2) - 72)]))])));
-                        }
-                        break;
-                    }
-                    fld2_0 = ((!((false
-                            ? false
-                            : (false ? (!((var7[-28] != ''))) : var1))))
-                        ? (((var1
-                                    ? (true ? Set.identity() : var6)
-                                    : {
-                                        -63,
-                                        Int32x4.xxyx,
-                                        var5[((var1
-                                                ? (var5[-9223372032559808496] >>
-                                                    59)
-                                                : Int32x4.wxxy) ~/
-                                            var5[var5[-48]])],
-                                        (par2 ?? par2),
-                                        44,
-                                        var5[(var1 ? -26 : (-(par2)))]
-                                      }) ??
-                                ({
-                                      loc2,
-                                      var2,
-                                      ZLibOption.defaultMemLevel,
-                                      (true ? Int32x4.wyzz : 40),
-                                      (false ? loc2 : var5[42]),
-                                      -16
-                                    } ??
-                                    var6)))
-                            .union({loc0, (var2++), (-1 * (~(var2)))})
-                        : (bool.fromEnvironment((var3)
-                                .toStringAsFixed(Uint64List.bytesPerElement))
-                            ? fld2_0
-                            : {
-                                (par2++),
-                                (var1 ? loc2 : (++var2)),
-                                ((false || false) ? Int32x4.xyyz : (++par2)),
-                                var5[-98],
-                                Float32x4.zwwy,
-                                var5[var5[62]],
-                                (~(Float32x4.ywww))
-                              }));
-                  }
-                }
-                break;
-              case 2839002106:
-                {
-                  for (int loc2 = 0; loc2 < 13; loc2++) {
-                    {
-                      int loc3 = 0;
-                      do {
-                        switch ((loc3 | -76)) {
-                          case 2164097105:
-                            {
-                              var4 ??= (var1).toString();
-                              var5 = ((!(((true || var1) !=
-                                      (false ? var1 : (!(foo2_1(var1)))))))
-                                  ? foo2(
-                                      ((var6).union(foo1_2(loc1))).toSet(),
-                                      [
-                                        -67,
-                                        if (((var1
-                                                ? 59
-                                                : (-((false ? -97 : par2)))) !=
-                                            (false
-                                                ? ((var1 || var1)
-                                                    ? (-((par2++)))
-                                                    : 4)
-                                                : (--var2)))) ...[
-                                          ((92 ~/ Int32x4.yzwx) << 70),
-                                          Float32x4.xxyz,
-                                          Int8List.bytesPerElement
-                                        ] else
-                                          69
-                                      ],
-                                      var7)
-                                  : foo2(foo0(), Uri.parseIPv4Address(var0),
-                                      var7));
-                            }
-                            break;
-                          case 2164097111:
-                            {
-                              var4 ??= var7[Float32x4.zxzw];
-                            }
-                            break;
-                        }
-                      } while (++loc3 < 96);
-                    }
-                    fld2_0 = var6;
-                  }
-                }
-                break;
-            }
-          });
-          for (int loc0 in (foo2_1((var5 !=
-                  (false
-                      ? [par2]
-                      : foo2(
-                          var6,
-                          [20],
-                          ({
-                                21: var0,
-                                68: foo1_3(),
-                                24: ('1MF' + '8s\u2665yx+ ')
-                              } ??
-                              {
-                                9: var7[var2],
-                                48: 'mB(wW\u{1f600}',
-                                74: 'ojEw\u{1f600}\u{1f600}',
-                                80: '\u26655E-hj\u{1f600}',
-                                10: (false ? 'W7i5\u2665YX' : '! Ed9&'),
-                                88: (false ? var0 : 'N0D9(H\u{1f600}'),
-                                5: 'QZ'
-                              })))))
-              ? foo1_2('XP')
-              : {
-                  if ((foo2_1(var1)
-                      ? (foo2_1((fld2_0).add(-9223372036854774784)) || var1)
-                      : var1))
-                    (~(Float32x4.zyww)),
-                  Float32x4.xwyw,
-                  ((((var1 ? true : var1) ? 0.3447071353935154 : var3) >=
-                          0.5995056331958718)
-                      ? ZLibOption.MAX_LEVEL
-                      : 16),
-                  9223372032559841279,
-                  Int32x4.zwyy
-                })) {
-            for (int loc1 = 0; loc1 < 19; loc1++) {
-              var1 = (!(bool.fromEnvironment(MapBase.mapToString({
-                1: '4',
-                56: var0,
-                85: var0,
-                51: var7[-4],
-                42: ((!((!(false)))) ? par1[72] : MapBase.mapToString(var7))
-              }))));
-            }
-          }
-        }
-        break;
-    }
-    print((((var1 ? 'kP' : (var1 ? 'irjF' : var7[var5[90]])) ??
-            ((!(false)) ? 'vWa\u{1f600}' : var0)) +
-        'xzpK'));
-    return var3;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = (~(-24));
-      var0 ??= ((false
-              ? foo2_1((true
-                  ? (var1 && (var2).isOdd)
-                  : (('dTYR' ?? 'G\u{1f600}P14\u{1f600}a')).isEmpty))
-              : ((var1 && true) || (!(var1))))
-          ? (var4 ?? 'I')
-          : 'QO');
-    }
-  }
-}
-
-class X3 extends X1 {
-  Map<int, String> fld3_0 = {
-    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
-    if (true) 30: '6\u2665P!Pbi',
-    81: 't',
-    82: '17fx#!',
-    92: 'H',
-    if (true) 69: ')Ls'
-  };
-  Set<int> fld3_1 = {27};
-  int fld3_2 = 34;
-
-  String foo1_1(int par1) {
-    throw (ListBase.listToString(foo2({
-          -4294967169,
-          par1
-        }, [
-          -97,
-          (var5[(var1 ? var5[87] : Int32x4.yxxy)] * Int32x4.yyxx),
-          var2,
-          (false ? 10 : var5[var5[(par1++)]])
-        ], var7)) ??
-        'o');
-  }
-
-  bool foo3_0(double par1) {
-    {
-      Set<int> loc0 = (true ? fld3_1 : var6);
-      {
-        Set<int> loc1 = (false
-            ? foo0()
-            : {
-                for (int loc2 in [var2, (-(Float32x4.xzzw))])
-                  if (false) Float32x4.wxyz else (++fld3_2),
-                ((var1
-                        ? 5
-                        : var5[(((var5[(true ? fld3_2 : fld3_2)] ~/ 48) | 56) %
-                            var5[-4])]) ??
-                    (var2++))
-              });
-        for (int loc2 = 0; loc2 < 90; loc2++) {
-          {
-            int loc3 = 95;
-            while (--loc3 > 0) {
-              return (((0.7073184699576396).isNaN
-                      ? var7
-                      : (Map.of(Map.from(var7)) ??
-                          Map.unmodifiable(Map.identity()))))
-                  .isEmpty;
-            }
-          }
-          try {
-            var1 = (((12 >= Int32x4.ywxx) ? true : true)
-                ? false
-                : (((var1 ? fld3_0[Int32x4.wyxy] : '') ?? var7[Float32x4.xwwx]))
-                    .isEmpty);
-            var2 |= ((fld3_2++) ?? (fld3_2--));
-          } catch (exception, stackTrace) {
-            var5 ??= var5;
-          } finally {
-            var4 = 'A';
-            break;
-          }
-        }
-        {
-          double loc2 = (-(exp((acos(0.06129144867031855) ?? var3))));
-          fld3_0 = (((({Int32x4.ywxw, 6442450943}).union(foo0()))
-                      .add((++fld3_2))
-                  ? false
-                  : false)
-              ? foo1_0(
-                  (foo1([var5[var2], var5[75], 42], false) ?? var7), var7, loc2)
-              : (var1
-                  ? {
-                      for (int loc3 = 0; loc3 < 48; loc3++) 78: 'dWek8',
-                      40: fld3_0[(var5[-81] & Int32x4.xzyw)],
-                      73: (' )G\u2665-d(').substring(
-                          (NetworkInterface.listSupported
-                              ? (~(((++var2) ?? (fld3_2 * fld3_2))))
-                              : var5[-75]),
-                          fld3_2),
-                      74: ('k9O\u2665').trimLeft(),
-                      88: var7[(++var2)],
-                      for (int loc3 = 0; loc3 < 27; loc3++)
-                        60: ((false || var1) ? var7[46] : var0),
-                      99: ((var3).isNaN
-                          ? (Uri.decodeComponent(foo1_3()) + var4)
-                          : var7[-77]),
-                      92: (true
-                          ? ('').padLeft(82, '')
-                          : ('' ?? var7[(false ? 94 : 58)]))
-                    }
-                  : var7));
-
-          /// Single-line documentation comment.
-          fld3_1 ??= ((loc1 ?? foo1_2(fld3_0[(var2--)])) ?? foo1_2(foo1_3()));
-        }
-      }
-    }
-    return (var1 ? (!(var1)) : var1);
-  }
-
-  String foo3_1(int par1, String par2, String par3) {
-    switch (var2) {
-      case 3768780679:
-        {
-          {
-            int loc0 = (++par1);
-            var0 ??= ListBase.listToString(var5);
-            if (true) {
-              var5 = [
-                Float32x4.xyxz,
-                (var1
-                    ? ((!(false)) ? Float32x4.xyyw : (++fld3_2))
-                    : var5[fld3_2]),
-                par1,
-                (~(Float32x4.zxwy)),
-                if ((foo3_0(var3)
-                    ? ([
-                          (++fld3_2),
-                          ...[
-                            ...[
-                              var5[(true ? Float32x4.xxzx : (--fld3_2))],
-                              54,
-                              (-((((foo3_0(var3)
-                                          ? (!(false))
-                                          : ((var1 ? (~(-63)) : var5[-40]))
-                                              .isOdd)
-                                      ? ((0.8329420640871532 != var3) && var1)
-                                      : var1)
-                                  ? 43
-                                  : (Float32x4.zxxy - Float32x4.zxxw)))),
-                              Int32x4.zzwx
-                            ],
-                            ...[
-                              (var5[-48] * (fld3_2++)),
-                              Int32x4.wyyw,
-                              (~(-76)),
-                              ((par1).isEven ? (--par1) : -13),
-                              Float32x4.wxyx
-                            ],
-                            for (int loc1 in [
-                              (++fld3_2),
-                              -15,
-                              (SecurityContext.alpnSupported
-                                  ? Int32x4.yxyw
-                                  : Float32x4.yxxw),
-                              if (true) var5[(var1 ? -32768 : par1)],
-                              ((--var2) ^ (++fld3_2))
-                            ])
-                              (fld3_2--),
-                            93,
-                            (~((-(ZLibOption.minMemLevel)))),
-                            ((Float32x4.zyzx >> -14) & Float32x4.yxxw)
-                          ],
-                          (var1
-                              ? (++par1)
-                              : ((var3).isInfinite ? Float32x4.zwww : -84)),
-                          var2
-                        ] ==
-                        [
-                          9223372032559808639,
-                          -85,
-                          Float32x4.wzyy,
-                          loc0,
-                          [
-                            ((-(36)) <<
-                                ((var1
-                                        ? var1
-                                        : ({
-                                            45: 'ay',
-                                            7: par3,
-                                            69: Uri.decodeFull(
-                                                (foo1_3() + 'LX+'))
-                                          })
-                                            .isEmpty)
-                                    ? (~((13 | 64)))
-                                    : (-(var2)))),
-                            (par1--),
-                            ((~((true ? (var2--) : -31))) >> 9),
-                            (-((35 % (~(var5[var5[39]]))))),
-                            4395630341,
-                            Int32x4.zxxy,
-                            if ((var1
-                                ? foo3_0(var3)
-                                : (0.6201792653929837).isInfinite)) ...[
-                              Int32x4.wxxx,
-                              (fld3_2 * (--fld3_2)),
-                              var5[((~(var5[var5[var5[(-(-23))]]])) +
-                                  (~(-4294966296)))],
-                              loc0,
-                              for (int loc1 in [var5[Float32x4.yzww]]) 17,
-                              (~(var5[(++par1)])),
-                              -58,
-                              ((!(('').isEmpty))
-                                  ? ((-(Float32x4.ywwx)) * (++par1))
-                                  : Int32x4.yxyz)
-                            ]
-                          ][((var1 ? var1 : var1) ? var5[0] : par1)],
-                          ((~(70)) +
-                              (par1 + (-77 | ZLibOption.MAX_WINDOW_BITS))),
-                          (-(Int32x4.zywy)),
-                          (~(Float32x4.zywz))
-                        ])
-                    : (var1 ? true : true)))
-                  fld3_2
-              ];
-            }
-          }
-          var3 *= ((var3 + 0.6761038672016147) ?? (-(double.minPositive)));
-        }
-        break;
-      case 3768780685:
-        {
-          {
-            int loc0 = 67;
-            while (--loc0 > 0) {
-              {
-                Map<int, String> loc1 = foo1(
-                    Uri.parseIPv4Address(('E Hu\u{1f600}' + '\u2665l&#!')),
-                    (!(false)));
-                var3 ??= var3;
-              }
-              var5 = (var5 +
-                  ((({
-                    79: (foo1_3() ?? 'eD'),
-                    73: (var1 ? par2 : ' xdXgW'),
-                    4: 'pUc(q',
-                    15: 'K\u{1f600}hmdZ\u2665',
-                    95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  })
-                              .isNotEmpty
-                          ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
-                              foo3_0(var3))
-                          : (!(((false || true) ? var1 : false))))
-                      ? [
-                          (~((-61 ??
-                              (~((-(var5[(var1 ? fld3_2 : var5[34])]))))))),
-                          (var5[13] ^ (var1 ? 35 : -76)),
-                          (-(((~(-47)) ~/ (--par1))))
-                        ]
-                      : foo2({
-                          -36,
-                          ((0.3910802543332075).isNegative
-                              ? (~((var2++)))
-                              : (var2 &
-                                  (var1
-                                      ? [
-                                          -67,
-                                          (fld3_2++),
-                                          if ((!((!((var1
-                                              ? true
-                                              : (!(false))))))))
-                                            (false
-                                                ? (~(Float32x4.wyyy))
-                                                : (var1
-                                                    ? (1 ^ (-(16)))
-                                                    : var5[94])),
-                                          fld3_2,
-                                          var2,
-                                          67
-                                        ][-12]
-                                      : Float32x4.wwxw))),
-                          26,
-                          [
-                            (var1
-                                ? (--fld3_2)
-                                : (((!(var1))
-                                        ? (~((foo3_0(0.9959805940480148)
-                                            ? (33 ~/ loc0)
-                                            : Float32x4.xywx)))
-                                        : (15 % var5[var5[-47]])) <<
-                                    -86)),
-                            (-((~(RawSocketOption.levelIPv6))))
-                          ][var5[var5[(ZLibOption.maxMemLevel ^ -3)]]],
-                          -29
-                        }, [
-                          (var1 ? Float32x4.wxxw : (--par1)),
-                          ...[
-                            52,
-                            (-((true ? -12 : 44))),
-                            var5[((var5[34] * 30) >> 4294967360)],
-                            ((--var2) <<
-                                (true
-                                    ? var5[(-4 ~/ Int32x4.yyww)]
-                                    : (bool.fromEnvironment(var7[fld3_2])
-                                        ? (~((false ? loc0 : var5[(++par1)])))
-                                        : ((!(false))
-                                            ? (var5[var5[loc0]] ^ Int32x4.wxzz)
-                                            : par1)))),
-                            (((false ? var0 : '') !=
-                                    (true
-                                        ? MapBase.mapToString(({
-                                              7: 'WTT7\u{1f600}e3',
-                                              22: '',
-                                              36: (var1
-                                                  ? 'F'
-                                                  : (var1 ? fld3_0[var2] : '')),
-                                              37: 'l@a',
-                                              85: (var1 ? '' : par3),
-                                              82: 'eb',
-                                              37: '11',
-                                              41: var7[94]
-                                            } ??
-                                            var7))
-                                        : (var1 ? var4 : par2)))
-                                ? (~(var5[-71]))
-                                : 9),
-                            32,
-                            if (bool.fromEnvironment(
-                                fld3_0[var5[ZLibOption.MIN_MEM_LEVEL]]))
-                              var5[(--par1)],
-                            (par1--)
-                          ],
-                          for (int loc1 in {
-                            for (int loc2 in [
-                              ((!((Map.unmodifiable({
-                                        86: var4,
-                                        31: var0,
-                                        85: (par3 + ''),
-                                        91: (var1
-                                            ? fld3_0[4]
-                                            : '!M\u{1f600}!vOw'),
-                                        45: '7T',
-                                        19: 'fha+',
-                                        38: (false ? '' : fld3_0[70])
-                                      }) !=
-                                      {
-                                        92: '@4',
-                                        41: var7[loc0],
-                                        24: (foo3_0(0.06591134699771606)
-                                            ? '\u2665)\u2665NnO+'
-                                            : 'JM3Hn\u{1f600}'),
-                                        26: 'aQ51Yz',
-                                        64: var7[
-                                            (-((var5[18] & (36).bitLength)))]
-                                      })))
-                                  ? (89 ^
-                                      (((44 - par1) * -9223372034707292160) &
-                                          var5[128]))
-                                  : -46),
-                              (fld3_2++),
-                              ((([
-                                            -89,
-                                            var2,
-                                            (fld3_2++),
-                                            var5[-4294967264],
-                                            -25,
-                                            var2,
-                                            var5[((!(var1))
-                                                ? (var1 ? -3 : -81)
-                                                : var5[loc0])],
-                                            (var1
-                                                ? par1
-                                                : ((~((fld3_2++))) >>
-                                                    (-((-(-64))))))
-                                          ] ??
-                                          foo2(var6, [
-                                            4295032831
-                                          ], {
-                                            53: foo1_3(),
-                                            94: var7[13],
-                                            82: var7[-60],
-                                            30: fld3_0[-9223372032559742976],
-                                            98: foo1_3()
-                                          })) !=
-                                      var5)
-                                  ? (--par1)
-                                  : loc0),
-                              56,
-                              if (((var5[21]).isOdd ? true : false))
-                                ((++par1) -
-                                    (var1 ? var5[DateTime.january] : (par1--)))
-                              else
-                                fld3_2,
-                              if ((!(var1))) 74,
-                              (par1 ^ var5[26])
-                            ])
-                              (~(var2)),
-                            for (int loc2 in {
-                              6442450944,
-                              Float32x4.ywyw,
-                              -9223372032559804416,
-                              (~(var5[var5[26]])),
-                              Float32x4.xyxy,
-                              (--fld3_2),
-                              var5[98]
-                            })
-                              if (false) -26,
-                            (~((-((-((-48 - -9223372036854775680))))))),
-                            ...{
-                              (-((var2--))),
-                              if (true) -100663046 else var5[(~(par1))]
-                            },
-                            (~((~((fld3_2++))))),
-                            ...{
-                              ((List.filled(0, 26) ==
-                                      [
-                                        (-(-52)),
-                                        -29,
-                                        (--fld3_2),
-                                        (0.22302566014161784).floor(),
-                                        (par1 % -56)
-                                      ])
-                                  ? (var1
-                                      ? (var2++)
-                                      : ((!((!(true))))
-                                          ? ((var1 || foo3_0(var3)) ? 76 : par1)
-                                          : (-(-13))))
-                                  : ((foo1_0((var1 ? fld3_0 : var7), var7,
-                                              var3))
-                                          .isEmpty
-                                      ? 97
-                                      : (var1 ? var2 : -9223372036854774784))),
-                              (-(Float32x4.zyzw)),
-                              (--var2)
-                            }
-                          })
-                            ((var3 < (-(var3))) ? -9223372032559808000 : -71),
-                          -100663046,
-                          if ((var1
-                              ? bool.fromEnvironment('vV0')
-                              : (Map.from({
-                                  78: '',
-                                  49: '\u{1f600}\u{1f600}4Mz',
-                                  70: fld3_0[par1],
-                                  95: '\u{1f600}2tIYqE',
-                                  43: (true ? 'baf-\u2665' : var4),
-                                  30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                }))
-                                  .isNotEmpty))
-                            -13
-                          else
-                            (var1 ? (-((-(var5[56])))) : (var2--)),
-                          (~((~((-((var2++)))))))
-                        ], {
-                          88: ('bV\u{1f600}iqO').toLowerCase(),
-                          42: '(hZ4S',
-                          37: var7[-79],
-                          36: var0
-                        })));
-            }
-          }
-          {
-            int loc0 = 0;
-            do {
-              try {
-                print(foo2(
-                    fld3_1,
-                    (fld3_0[var5[-12]]).codeUnits,
-                    (({
-                              36: var4,
-                              30: '0\u{1f600}EYWqr',
-                              66: 'S',
-                              3: '+J3Gj',
-                              71: '\u{1f600}-q',
-                              13: 'V3QN',
-                              34: ''
-                            } ??
-                            {
-                              54: fld3_0[(var2--)],
-                              74: (foo3_0(
-                                      ((-(var3)) * (0.8613045491468889 + var3)))
-                                  ? var7[78]
-                                  : (((var1 ? (47).isEven : var1) ? true : true)
-                                      ? (var4 ?? 'UzK')
-                                      : 'fH1smd')),
-                              12: '\u2665',
-                              18: 'V'
-                            }) ??
-                        var7)));
-              } catch (exception, stackTrace) {
-                fld3_1 = foo0();
-                for (int loc1 = 0; loc1 < 29; loc1++) {
-                  if (var1) {
-                    {
-                      int loc2 = 0;
-                      do {
-                        var5 = (foo3_0(var3)
-                            ? [
-                                ((--par1) ^ (~(93))),
-                                if ((var3).isFinite)
-                                  for (int loc3 in [
-                                    -5,
-                                    Int32x4.zxyy,
-                                    (true
-                                        ? var5[var5[(var1 ? -23 : var5[68])]]
-                                        : -99),
-                                    ((!(var1))
-                                        ? ((false
-                                                ? var1
-                                                : foo3_0(0.3133865362301862))
-                                            ? Float64List.bytesPerElement
-                                            : [
-                                                Float32x4.yxzx,
-                                                if (var1)
-                                                  (false ? 40 : 85)
-                                                else
-                                                  ((String.fromCharCode((foo3_0(
-                                                                  0.414460580942719)
-                                                              ? var5[-14]
-                                                              : var2)) ==
-                                                          'mII\u{1f600}zkM')
-                                                      ? var5[(~(-51))]
-                                                      : ((var1
-                                                              ? (!(var1))
-                                                              : var1)
-                                                          ? var5[0]
-                                                          : (-(var2))))
-                                              ][5])
-                                        : fld3_2),
-                                    (par1++),
-                                    -72,
-                                    Int32x4.zzxy
-                                  ])
-                                    Int32x4.zyww
-                                else
-                                  Int32x4.wxyz
-                              ]
-                            : [
-                                ...[
-                                  if ((false ? false : var1)) (-(52)),
-                                  (++par1),
-                                  (par1--),
-                                  (-((-([
-                                    (((var0 + fld3_0[(++var2)])).isNotEmpty
-                                        ? Float32x4.yzxw
-                                        : var5[35])
-                                  ][loc0])))),
-                                  (~(-17))
-                                ],
-                                38,
-                                ...[
-                                  (var1 ? (par1++) : -10),
-                                  if (true) -62 else var2,
-                                  if ((!((var3).isFinite)))
-                                    Int32x4.xxzz
-                                  else
-                                    -45
-                                ],
-                                if ((true || false)) (-(-93)),
-                                (--fld3_2),
-                                ([
-                                      (fld3_2--),
-                                      if ((base64UrlEncode(var5) == 'RY'))
-                                        (++fld3_2)
-                                      else
-                                        -9223372032559808383,
-                                      Float32x4.zyxy,
-                                      loc0,
-                                      -55,
-                                      if (('O \u{1f600}e\u2665').isNotEmpty)
-                                        if (var1)
-                                          (--var2)
-                                        else
-                                          for (int loc3 in {
-                                            loc0,
-                                            (~((--var2))),
-                                            (-(-35)),
-                                            Float32x4.xxyw,
-                                            65,
-                                            -4,
-                                            -4194304251,
-                                            -54
-                                          })
-                                            (((0.671280258888436 ==
-                                                        (0.16535430333243706 *
-                                                            0.18316039550464436)) ||
-                                                    var1)
-                                                ? var5[12]
-                                                : (~((--var2))))
-                                      else if (false)
-                                        if (var1) (-(Int32x4.zzwx)) else loc2
-                                      else
-                                        Int32x4.yzyw
-                                    ][loc1] *
-                                    (--par1)),
-                                (-71 * 38)
-                              ]);
-                      } while (++loc2 < 89);
-                    }
-                  } else {
-                    {
-                      int loc2 = 0;
-                      do {
-                        fld3_0 ??= ((((Map.unmodifiable(var7)).isEmpty ||
-                                    (!(({
-                                      11: 'v+MHeiB',
-                                      48: var7[(true
-                                          ? ((var2--) ?? fld3_2)
-                                          : var5[(fld3_2--)])],
-                                      52: '(('
-                                    })
-                                        .isEmpty)))
-                                ? fld3_0
-                                : {
-                                    39: foo1_3(),
-                                    21: 'IXzJ+',
-                                    76: 'K2C#',
-                                    16: ('\u{1f600}Gh' + '#i'),
-                                    62: foo1_3(),
-                                    19: foo1_3(),
-                                    32: par3,
-                                    for (int loc3 in [
-                                      (par1--),
-                                      -66,
-                                      -96,
-                                      -35,
-                                      Float32x4.zzyz
-                                    ])
-                                      72: 'y vxi'
-                                  }) ??
-                            {13: par2});
-                        switch (4096) {
-                          case 3159134388:
-                            {
-                              /// Single-line documentation comment.
-                              {
-                                int loc3 = 0;
-                                do {
-                                  fld3_0 ??= foo1(
-                                      var5,
-                                      ((((true ? par2 : var7[var5[loc1]]))
-                                                  .isNotEmpty
-                                              ? 9
-                                              : -55) !=
-                                          var5[-36]));
-                                  fld3_1 = foo0();
-                                } while (++loc3 < 79);
-                              }
-                            }
-                            break;
-                          case 3159134393:
-                            {
-                              throw Int32x4.zxxw;
-                            }
-                            break;
-                        }
-                      } while (++loc2 < 77);
-                    }
-                  }
-                }
-              }
-            } while (++loc0 < 98);
-          }
-        }
-        break;
-    }
-    /*
-     * Multi-line
-     * comment.
-     */
-    return ((0.7728524536008519).isNaN ? 'BjzeSsJ' : foo1_3());
-  }
-
-  void run() {
-    super.run();
-    var5 ??= var5;
-    print({4294968296});
-  }
-}
-
-main() {
-  int count = 0;
-  try {
-    foo0();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo1(('  MQz').codeUnits, var1);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo2(
-        (var6).toSet(),
-        (var1
-            ? [-9223372036854775681, -66, 9223372032559874047, -3, 74]
-            : var5),
-        Map.identity());
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X0().foo0_0(var7);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_0(
-        (false
-            ? {
-                7: 'QMNg',
-                12: 'wzc5-Iq',
-                63: '29an-z',
-                86: 'sF5',
-                59: '\u2665L',
-                43: 'k',
-                62: 'NvF\u{1f600}k',
-                84: 'ZW 1-o'
-              }
-            : var7),
-        {
-          28: '@smXqKl',
-          66: 'oL',
-          if (false) 74: 'B' else 81: 'X',
-          if (false) 18: 'j' else 25: 'N',
-          44: '\u{1f600}lrx8m',
-          20: 'hC',
-          73: 'q',
-          63: '\u{1f600}nE'
-        },
-        0.18875619647922648);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_1((-((++var2))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_2((var1
-        ? (false
-            ? (true ? var7[((!(var1)) ? var5[Int32x4.xxyx] : 3)] : var4)
-            : Uri.encodeComponent(('yd' ?? (var0).padLeft(1, 'Q'))))
-        : var7[-2147483649]));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_3();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_0(Int32x4.xyyw);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_1((!(((!(var1)) && (!((var1 ? false : var1)))))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_2(var7, ((-(var5[(--var2)])) << 98));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_0(0.37767598562234317);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_1(
-        -6, var0, (Uri.decodeComponent('yQg') + ((var4 ?? var4) + var0)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo1_0(
-        Map.unmodifiable({77: 'hG'}),
-        ((false
-                ? {
-                    88: 'Sv-EbnG',
-                    73: 'G',
-                    46: 'O#',
-                    16: 'm1nf(',
-                    91: 'F',
-                    11: 'Q+O@K',
-                    70: '3q\u2665BJ'
-                  }
-                : Map.identity()) ??
-            {
-              68: 'r',
-              56: 'IH&',
-              31: '9cqu',
-              49: '8ug',
-              84: 'mR2VyC',
-              41: 'gk&(asy'
-            }),
-        (var3 * sin(var3)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().run();
-  } catch (e, st) {
-    count++;
-  } finally {}
-  Expect.equals(-47639, var2);
-  Expect.equals(9, count);
-}
diff --git a/tests/language/vm/regression_38436.dart b/tests/language_2/vm/regression_38436_test.dart
similarity index 98%
rename from tests/language/vm/regression_38436.dart
rename to tests/language_2/vm/regression_38436_test.dart
index ea5fafd..bda53da 100644
--- a/tests/language/vm/regression_38436.dart
+++ b/tests/language_2/vm/regression_38436_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// @dart = 2.9
+
 // VMOptions=--optimization_counter_threshold=1
 
 import "package:expect/expect.dart";
@@ -528,8 +530,7 @@
                                                 57: var4,
                                                 73: var7[-43],
                                                 38: var0
-                                              })
-                                                  .isNotEmpty ||
+                                              }).isNotEmpty ||
                                               ({
                                                 67: var4,
                                                 14: 'M\u{1f600}1HNbP',
@@ -537,8 +538,7 @@
                                                 85: 'uyq',
                                                 95: var7[(-(Int32x4.wwxw))],
                                                 33: ''
-                                              })
-                                                  .isNotEmpty))
+                                              }).isNotEmpty))
                                       : false)
                                   ? var2
                                   : (++var2))
@@ -557,8 +557,7 @@
                                   51: '-8ht',
                                   26: ('(2l3\u2665h' ?? var0),
                                   79: var4
-                                })
-                                        .isNotEmpty
+                                }).isNotEmpty
                                     ? var5[(var2 % loc0)]
                                     : var2) %
                                 ((!(NetworkInterface.listSupported))
@@ -1566,7 +1565,8 @@
 
 class X3 extends X1 {
   Map<int, String> fld3_0 = {
-    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
+    if (true)
+      if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
     if (true) 30: '6\u2665P!Pbi',
     81: 't',
     82: '17fx#!',
@@ -1738,8 +1738,7 @@
                                             7: par3,
                                             69: Uri.decodeFull(
                                                 (foo1_3() + 'LX+'))
-                                          })
-                                            .isEmpty)
+                                          }).isEmpty)
                                     ? (~((13 | 64)))
                                     : (-(var2)))),
                             (par1--),
@@ -1794,8 +1793,7 @@
                     4: 'pUc(q',
                     15: 'K\u{1f600}hmdZ\u2665',
                     95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  })
-                              .isNotEmpty
+                  }).isNotEmpty
                           ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
                               foo3_0(var3))
                           : (!(((false || true) ? var1 : false))))
@@ -1993,8 +1991,7 @@
                                   95: '\u{1f600}2tIYqE',
                                   43: (true ? 'baf-\u2665' : var4),
                                   30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                }))
-                                  .isNotEmpty))
+                                })).isNotEmpty))
                             -13
                           else
                             (var1 ? (-((-(var5[56])))) : (var2--)),
@@ -2156,8 +2153,7 @@
                                           ? ((var2--) ?? fld3_2)
                                           : var5[(fld3_2--)])],
                                       52: '(('
-                                    })
-                                        .isEmpty)))
+                                    }).isEmpty)))
                                 ? fld3_0
                                 : {
                                     39: foo1_3(),
diff --git a/tests/language_2/vm/regression_38741.dart b/tests/language_2/vm/regression_38741_test.dart
similarity index 100%
rename from tests/language_2/vm/regression_38741.dart
rename to tests/language_2/vm/regression_38741_test.dart
diff --git a/tools/VERSION b/tools/VERSION
index 51c8ca9..c6bf604 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 122
+PRERELEASE 123
 PRERELEASE_PATCH 0
\ No newline at end of file
