Version 2.9.0-12.0.dev

Merge commit '3c6a3fba304c1ad03a41d5a25f0b9628451b97de' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 119220f..f698d6a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -61,9 +61,15 @@
 
 #### Linter
 
-Updated the Linter to `0.1.115`, which includes:
+Updated the Linter to `0.1.116`, which includes:
 
-* Updated `avoid_types_as_parameter_names` to check catch-clauses.
+* New lint: `no_default_cases` (experimental).
+* New lint: `exhaustive_cases`.
+* Updated `type_annotate_public_apis` to allow inferred types in final field assignments.
+* Updated `prefer_mixin` to allow "legacy" SDK abstract class mixins.
+* New lint: `use_is_even_rather_than_modulo`.
+* Updated `unsafe_html` to use a `SecurityLintCode` (making it un-ignorable).
+* Improved `sized_box_for_whitespace` to address false-positives.
 * Fixed `unsafe_html` to check attributes and methods on extensions.
 * Extended `unsafe_html` to include `Window.open`, `Element.html` and
   `DocumentFragment.html` in unsafe API checks.
@@ -86,6 +92,18 @@
   column will be empty.
 * `pub upgrade`: Show summary count of outdated packages after running.
 
+## 2.8.3 - 2020-05-28
+
+This is a patch release that fixes the following issues:
+* crashes in Flutter apps (issue [flutter/flutter#57318][]).
+* a regression in stack traces (issue [#41907][]).
+* re-canonicalization of constants with unboxed fields (issue
+[flutter/flutter#57190][]).
+
+[flutter/flutter#57318]: https://github.com/flutter/flutter/issues/57318
+[#41907]: https://github.com/dart-lang/sdk/issues/41907
+[flutter/flutter#57190]: https://github.com/flutter/flutter/issues/57190
+
 ## 2.8.2 - 2020-05-13
 
 This is a patch release that fixes an AOT compilation bug in global
diff --git a/DEPS b/DEPS
index 9ce14c9..11bf21b 100644
--- a/DEPS
+++ b/DEPS
@@ -106,7 +106,7 @@
   "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "d589e635d8ccb7cda6a804bd571f88abbabab146",
-  "linter_tag": "0.1.115",
+  "linter_tag": "0.1.116",
   "logging_tag": "9561ba016ae607747ae69b846c0e10958ca58ed4",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_tag": "dd150bb64c5f3b41d31f20f399ae2a855f7f8c00",
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 31de7c2..9472270 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -8793,6 +8793,16 @@
         r"""Try removing the keyword 'var', or replacing it with the name of the return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeVerificationErrorOriginContext =
+    messageVerificationErrorOriginContext;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageVerificationErrorOriginContext = const MessageCode(
+    "VerificationErrorOriginContext",
+    severity: Severity.context,
+    message: r"""The node most likely is taken from here by a transformer.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVoidExpression = messageVoidExpression;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 916bcf7..59caf69 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -106,18 +106,7 @@
       return ElementKind.MIXIN;
     }
   }
-  if (element is engine.FieldElement &&
-      element.isEnumConstant &&
-      // MyEnum.values and MyEnum.one.index return isEnumConstant = true
-      // so these additional checks are necessary.
-      // TODO(danrubel) MyEnum.values is constant, but is a list
-      // so should it return isEnumConstant = true?
-      // MyEnum.one.index is final but *not* constant
-      // so should it return isEnumConstant = true?
-      // Or should we return ElementKind.ENUM_CONSTANT here
-      // in either or both of these cases?
-      element.type != null &&
-      element.type.element == element.enclosingElement) {
+  if (element is engine.FieldElement && element.isEnumConstant) {
     return ElementKind.ENUM_CONSTANT;
   }
   return convertElementKind(element.kind);
@@ -187,7 +176,6 @@
 }
 
 bool _isAbstract(engine.Element element) {
-  // TODO(scheglov) add isAbstract to Element API
   if (element is engine.ClassElement) {
     return element.isAbstract;
   }
@@ -201,7 +189,6 @@
 }
 
 bool _isConst(engine.Element element) {
-  // TODO(scheglov) add isConst to Element API
   if (element is engine.ConstructorElement) {
     return element.isConst;
   }
@@ -212,7 +199,6 @@
 }
 
 bool _isFinal(engine.Element element) {
-  // TODO(scheglov) add isFinal to Element API
   if (element is engine.VariableElement) {
     return element.isFinal;
   }
@@ -220,7 +206,6 @@
 }
 
 bool _isStatic(engine.Element element) {
-  // TODO(scheglov) add isStatic to Element API
   if (element is engine.ExecutableElement) {
     return element.isStatic;
   }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 6032b6a..4cd286b 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -824,7 +824,6 @@
   @override
   ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
     String defaultPackageFilePath;
-    String defaultPackagesDirectoryPath;
     var path = (analysisServer.contextManager as ContextManagerImpl)
         .normalizedPackageRoots[folder.path];
     if (path != null) {
@@ -832,8 +831,6 @@
       if (resource.exists) {
         if (resource is File) {
           defaultPackageFilePath = path;
-        } else {
-          defaultPackagesDirectoryPath = path;
         }
       }
     }
@@ -841,7 +838,6 @@
     var builderOptions = ContextBuilderOptions();
     builderOptions.defaultOptions = options;
     builderOptions.defaultPackageFilePath = defaultPackageFilePath;
-    builderOptions.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
     var builder = ContextBuilder(
         resourceProvider, analysisServer.sdkManager, null,
         options: builderOptions);
@@ -856,7 +852,7 @@
   void removeContext(Folder folder, List<String> flushedFiles) {
     sendAnalysisNotificationFlushResults(analysisServer, flushedFiles);
     var driver = analysisServer.driverMap.remove(folder);
-    driver.dispose();
+    driver?.dispose();
   }
 
   List<HighlightRegion> _computeHighlightRegions(CompilationUnit unit) {
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index cf3de34..7799a3b 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -202,8 +202,14 @@
         length,
       );
       try {
-        var processor = AssistProcessor(context);
-        var assists = await processor.compute();
+        List<Assist> assists;
+        try {
+          var processor = AssistProcessor(context);
+          assists = await processor.compute();
+        } on InconsistentAnalysisException {
+          assists = [];
+        }
+
         assists.sort(Assist.SORT_BY_RELEVANCE);
         for (var assist in assists) {
           changes.add(assist.change);
@@ -605,6 +611,8 @@
           List<Fix> fixes;
           try {
             fixes = await DartFixContributor().computeFixes(context);
+          } on InconsistentAnalysisException {
+            fixes = [];
           } catch (exception, stackTrace) {
             var parametersFile = '''
 offset: $offset
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index c0aa0da..a5f55a1 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -706,7 +706,6 @@
   @override
   ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
     String defaultPackageFilePath;
-    String defaultPackagesDirectoryPath;
     var path = (analysisServer.contextManager as ContextManagerImpl)
         .normalizedPackageRoots[folder.path];
     if (path != null) {
@@ -714,8 +713,6 @@
       if (resource.exists) {
         if (resource is File) {
           defaultPackageFilePath = path;
-        } else {
-          defaultPackagesDirectoryPath = path;
         }
       }
     }
@@ -723,7 +720,6 @@
     var builderOptions = ContextBuilderOptions();
     builderOptions.defaultOptions = options;
     builderOptions.defaultPackageFilePath = defaultPackageFilePath;
-    builderOptions.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
     var builder = ContextBuilder(
         resourceProvider, analysisServer.sdkManager, null,
         options: builderOptions);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index ef43347..53d1eec 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -6,8 +6,8 @@
 /// completion.
 import 'dart:math' as math;
 
-import 'package:analysis_server/src/protocol_server.dart'
-    show ElementKind, convertElementToElementKind;
+import 'package:analysis_server/src/protocol_server.dart' as protocol
+    show ElementKind;
 import 'package:analysis_server/src/services/completion/dart/relevance_tables.g.dart';
 import 'package:analysis_server/src/utilities/extensions/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -17,6 +17,7 @@
         ClassElement,
         ConstructorElement,
         Element,
+        ElementKind,
         FieldElement,
         LibraryElement,
         PropertyAccessorElement,
@@ -79,6 +80,57 @@
     return type;
   }
 
+  /// Return the element kind used to compute relevance for the given [element].
+  /// This differs from the kind returned to the client in that getters and
+  /// setters are always mapped into a different kind: FIELD for getters and
+  /// setters declared in a class or extension, and TOP_LEVEL_VARIABLE for
+  /// top-level getters and setters.
+  protocol.ElementKind computeElementKind(Element element) {
+    if (element is LibraryElement) {
+      return protocol.ElementKind.PREFIX;
+    } else if (element is ClassElement) {
+      if (element.isEnum) {
+        return protocol.ElementKind.ENUM;
+      } else if (element.isMixin) {
+        return protocol.ElementKind.MIXIN;
+      }
+      return protocol.ElementKind.CLASS;
+    } else if (element is FieldElement && element.isEnumConstant) {
+      return protocol.ElementKind.ENUM_CONSTANT;
+    } else if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    var kind = element.kind;
+    if (kind == ElementKind.CONSTRUCTOR) {
+      return protocol.ElementKind.CONSTRUCTOR;
+    } else if (kind == ElementKind.EXTENSION) {
+      return protocol.ElementKind.EXTENSION;
+    } else if (kind == ElementKind.FIELD) {
+      return protocol.ElementKind.FIELD;
+    } else if (kind == ElementKind.FUNCTION) {
+      return protocol.ElementKind.FUNCTION;
+    } else if (kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+      return protocol.ElementKind.FUNCTION_TYPE_ALIAS;
+    } else if (kind == ElementKind.GENERIC_FUNCTION_TYPE) {
+      return protocol.ElementKind.FUNCTION_TYPE_ALIAS;
+    } else if (kind == ElementKind.LABEL) {
+      return protocol.ElementKind.LABEL;
+    } else if (kind == ElementKind.LOCAL_VARIABLE) {
+      return protocol.ElementKind.LOCAL_VARIABLE;
+    } else if (kind == ElementKind.METHOD) {
+      return protocol.ElementKind.METHOD;
+    } else if (kind == ElementKind.PARAMETER) {
+      return protocol.ElementKind.PARAMETER;
+    } else if (kind == ElementKind.PREFIX) {
+      return protocol.ElementKind.PREFIX;
+    } else if (kind == ElementKind.TOP_LEVEL_VARIABLE) {
+      return protocol.ElementKind.TOP_LEVEL_VARIABLE;
+    } else if (kind == ElementKind.TYPE_PARAMETER) {
+      return protocol.ElementKind.TYPE_PARAMETER;
+    }
+    return protocol.ElementKind.UNKNOWN;
+  }
+
   /// Return the value of the _context type_ feature for an element with the
   /// given [elementType] when completing in a location with the given
   /// [contextType].
@@ -114,13 +166,7 @@
     if (locationTable == null) {
       return -1.0;
     }
-    ElementKind kind;
-    if (element is LibraryElement) {
-      kind = ElementKind.PREFIX;
-    } else {
-      kind = convertElementToElementKind(element);
-    }
-    var range = locationTable[kind];
+    var range = locationTable[computeElementKind(element)];
     if (range == null) {
       return 0.0;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart b/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
index 561608f..e461203 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/relevance_tables.g.dart
@@ -16,7 +16,8 @@
 const elementKindRelevance = {
   'Annotation_name': {
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.000, upper: 0.042),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.042, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.042, upper: 1.000),
   },
   'ArgumentList_annotation_named': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.979),
@@ -28,7 +29,7 @@
   },
   'ArgumentList_constructorRedirect_named': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.041),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.041, upper: 0.044),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.041, upper: 0.044),
     ElementKind.ENUM: ProbabilityRange(lower: 0.044, upper: 0.047),
     ElementKind.CLASS: ProbabilityRange(lower: 0.047, upper: 0.050),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.050, upper: 0.064),
@@ -36,7 +37,7 @@
   },
   'ArgumentList_constructorRedirect_unnamed': {
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.000, upper: 0.199),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.199, upper: 0.201),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.199, upper: 0.201),
     ElementKind.METHOD: ProbabilityRange(lower: 0.201, upper: 0.206),
     ElementKind.ENUM: ProbabilityRange(lower: 0.206, upper: 0.212),
     ElementKind.CLASS: ProbabilityRange(lower: 0.212, upper: 0.230),
@@ -47,9 +48,11 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.492),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.492, upper: 0.493),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.493, upper: 0.495),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.495, upper: 0.507),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.507, upper: 0.536),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.536, upper: 0.574),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.495, upper: 0.504),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.504, upper: 0.516),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.516, upper: 0.545),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.545, upper: 0.574),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.574, upper: 0.642),
     ElementKind.CLASS: ProbabilityRange(lower: 0.642, upper: 0.731),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.731, upper: 1.000),
@@ -58,9 +61,11 @@
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.617),
     ElementKind.METHOD: ProbabilityRange(lower: 0.617, upper: 0.622),
     ElementKind.ENUM: ProbabilityRange(lower: 0.622, upper: 0.630),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.630, upper: 0.646),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.646, upper: 0.684),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.684, upper: 0.734),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.630, upper: 0.641),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.641, upper: 0.656),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.656, upper: 0.694),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.694, upper: 0.734),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.734, upper: 0.811),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.811, upper: 0.905),
     ElementKind.CLASS: ProbabilityRange(lower: 0.905, upper: 1.000),
@@ -69,15 +74,17 @@
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.000, upper: 0.616),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.616, upper: 0.648),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.648, upper: 0.792),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.792, upper: 1.000),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.792, upper: 1.000),
   },
   'ArgumentList_function_unnamed': {
-    ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.220),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.220, upper: 0.227),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.227, upper: 0.237),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.237, upper: 0.255),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.255, upper: 0.280),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.280, upper: 0.347),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.216),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.216, upper: 0.222),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.222, upper: 0.229),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.229, upper: 0.239),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.239, upper: 0.257),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.257, upper: 0.282),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.282, upper: 0.347),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.347, upper: 0.583),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.583, upper: 1.000),
   },
@@ -85,36 +92,40 @@
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.549),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.549, upper: 0.552),
     ElementKind.METHOD: ProbabilityRange(lower: 0.552, upper: 0.556),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.556, upper: 0.569),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.569, upper: 0.627),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.627, upper: 0.686),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.686, upper: 0.764),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.556, upper: 0.566),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.566, upper: 0.579),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.579, upper: 0.637),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.637, upper: 0.696),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.696, upper: 0.764),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.764, upper: 0.854),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.854, upper: 1.000),
   },
   'ArgumentList_method_unnamed': {
     ElementKind.MIXIN: ProbabilityRange(lower: 0.000, upper: 0.388),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.388, upper: 0.388),
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.388, upper: 0.388),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.388, upper: 0.389),
     ElementKind.ENUM: ProbabilityRange(lower: 0.389, upper: 0.395),
     ElementKind.METHOD: ProbabilityRange(lower: 0.395, upper: 0.403),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.403, upper: 0.426),
     ElementKind.CLASS: ProbabilityRange(lower: 0.426, upper: 0.453),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.453, upper: 0.511),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.511, upper: 0.625),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.625, upper: 0.747),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.453, upper: 0.484),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.484, upper: 0.542),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.542, upper: 0.633),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.633, upper: 0.747),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.747, upper: 1.000),
   },
   'ArgumentList_widgetConstructor_named': {
-    ElementKind.SETTER: ProbabilityRange(lower: 0.000, upper: 0.352),
-    ElementKind.PREFIX: ProbabilityRange(lower: 0.352, upper: 0.353),
+    ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.353),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.353, upper: 0.355),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.355, upper: 0.368),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.368, upper: 0.387),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.387, upper: 0.422),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.422, upper: 0.482),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.482, upper: 0.552),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.355, upper: 0.363),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.363, upper: 0.376),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.376, upper: 0.395),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.395, upper: 0.430),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.430, upper: 0.490),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.490, upper: 0.552),
     ElementKind.CLASS: ProbabilityRange(lower: 0.552, upper: 0.636),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.636, upper: 1.000),
   },
@@ -123,10 +134,12 @@
     ElementKind.PREFIX: ProbabilityRange(lower: 0.462, upper: 0.464),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.464, upper: 0.470),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.470, upper: 0.476),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.476, upper: 0.492),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.492, upper: 0.542),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.542, upper: 0.613),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.613, upper: 0.757),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.476, upper: 0.485),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.485, upper: 0.501),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.501, upper: 0.552),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.552, upper: 0.622),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.622, upper: 0.757),
     ElementKind.CLASS: ProbabilityRange(lower: 0.757, upper: 1.000),
   },
   'AsExpression_type': {
@@ -145,67 +158,78 @@
   },
   'AssertStatement_condition': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.144),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.144, upper: 0.179),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.179, upper: 0.230),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.230, upper: 0.346),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.346, upper: 0.644),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.644, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.144, upper: 0.150),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.150, upper: 0.185),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.185, upper: 0.236),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.236, upper: 0.352),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.352, upper: 0.650),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.650, upper: 1.000),
   },
   'AssertStatement_message': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 1.000),
   },
   'AssignmentExpression_rightHandSide': {
-    ElementKind.SETTER: ProbabilityRange(lower: 0.000, upper: 0.305),
-    ElementKind.PREFIX: ProbabilityRange(lower: 0.305, upper: 0.306),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.306, upper: 0.317),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.317, upper: 0.329),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.329, upper: 0.349),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.349, upper: 0.395),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.395, upper: 0.489),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.489, upper: 0.600),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.600, upper: 0.739),
+    ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.306),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.306, upper: 0.315),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.315, upper: 0.326),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.326, upper: 0.338),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.338, upper: 0.358),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.358, upper: 0.403),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.403, upper: 0.497),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.497, upper: 0.608),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.608, upper: 0.739),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.739, upper: 1.000),
   },
   'AwaitExpression_expression': {
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.000, upper: 0.022),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.022, upper: 0.049),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.049, upper: 0.144),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.144, upper: 0.292),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.292, upper: 0.450),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.450, upper: 0.608),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.608, upper: 0.772),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.772, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.049, upper: 0.086),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.086, upper: 0.181),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.181, upper: 0.329),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.329, upper: 0.487),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.487, upper: 0.645),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.645, upper: 0.809),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.809, upper: 1.000),
   },
   'BinaryExpression_!=_rightOperand': {
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.000, upper: 0.874),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.874, upper: 0.875),
     ElementKind.METHOD: ProbabilityRange(lower: 0.875, upper: 0.875),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.875, upper: 0.886),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.886, upper: 0.903),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.903, upper: 0.921),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.921, upper: 0.957),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.875, upper: 0.878),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.878, upper: 0.889),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.889, upper: 0.906),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.906, upper: 0.924),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.924, upper: 0.957),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.957, upper: 1.000),
   },
   'BinaryExpression_%_rightOperand': {
     ElementKind.ENUM: ProbabilityRange(lower: 0.000, upper: 0.722),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.722, upper: 0.728),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.728, upper: 0.755),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.755, upper: 0.788),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.788, upper: 0.851),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.851, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.728, upper: 0.745),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.745, upper: 0.772),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.772, upper: 0.805),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.805, upper: 0.868),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.868, upper: 1.000),
   },
   'BinaryExpression_&&_rightOperand': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.107),
     ElementKind.METHOD: ProbabilityRange(lower: 0.107, upper: 0.112),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.112, upper: 0.122),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.122, upper: 0.137),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.137, upper: 0.259),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.259, upper: 0.439),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.439, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.112, upper: 0.117),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.117, upper: 0.128),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.128, upper: 0.142),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.142, upper: 0.264),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.264, upper: 0.445),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.445, upper: 1.000),
   },
   'BinaryExpression_&_rightOperand': {
     ElementKind.CLASS: ProbabilityRange(lower: 0.000, upper: 0.285),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.285, upper: 0.390),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.285, upper: 0.390),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.390, upper: 0.494),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.494, upper: 0.703),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.703, upper: 1.000),
@@ -217,9 +241,11 @@
     ElementKind.CLASS: ProbabilityRange(lower: 0.627, upper: 0.636),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.636, upper: 0.651),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.651, upper: 0.672),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.672, upper: 0.722),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.722, upper: 0.851),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.851, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.672, upper: 0.702),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.702, upper: 0.751),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.751, upper: 0.870),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.870, upper: 1.000),
   },
   'BinaryExpression_+_rightOperand': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.508),
@@ -227,8 +253,10 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.510, upper: 0.517),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.517, upper: 0.532),
     ElementKind.CLASS: ProbabilityRange(lower: 0.532, upper: 0.556),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.556, upper: 0.675),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.675, upper: 0.829),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.556, upper: 0.582),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.582, upper: 0.701),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.701, upper: 0.829),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.829, upper: 1.000),
   },
   'BinaryExpression_-_rightOperand': {
@@ -237,8 +265,10 @@
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.488, upper: 0.490),
     ElementKind.METHOD: ProbabilityRange(lower: 0.490, upper: 0.499),
     ElementKind.CLASS: ProbabilityRange(lower: 0.499, upper: 0.515),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.515, upper: 0.605),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.605, upper: 0.802),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.515, upper: 0.542),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.542, upper: 0.633),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.633, upper: 0.802),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.802, upper: 1.000),
   },
   'BinaryExpression_/_rightOperand': {
@@ -246,30 +276,36 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.768, upper: 0.768),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.768, upper: 0.771),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.771, upper: 0.777),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.777, upper: 0.786),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.786, upper: 0.822),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.822, upper: 0.910),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.910, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.777, upper: 0.785),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.785, upper: 0.793),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.793, upper: 0.830),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.830, upper: 0.912),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.912, upper: 1.000),
   },
   'BinaryExpression_<<_rightOperand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.756),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.756, upper: 0.854),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.854, upper: 1.000),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.854, upper: 1.000),
   },
   'BinaryExpression_<=_rightOperand': {
     ElementKind.CLASS: ProbabilityRange(lower: 0.000, upper: 0.609),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.609, upper: 0.721),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.721, upper: 0.848),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.848, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.609, upper: 0.621),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.621, upper: 0.733),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.733, upper: 0.861),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.861, upper: 1.000),
   },
   'BinaryExpression_<_rightOperand': {
     ElementKind.ENUM: ProbabilityRange(lower: 0.000, upper: 0.424),
     ElementKind.METHOD: ProbabilityRange(lower: 0.424, upper: 0.426),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.426, upper: 0.427),
     ElementKind.CLASS: ProbabilityRange(lower: 0.427, upper: 0.439),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.439, upper: 0.557),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.557, upper: 0.771),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.771, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.439, upper: 0.461),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.461, upper: 0.580),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.580, upper: 0.785),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.785, upper: 1.000),
   },
   'BinaryExpression_==_rightOperand': {
     ElementKind.UNKNOWN: ProbabilityRange(lower: 0.000, upper: 0.568),
@@ -277,18 +313,22 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.568, upper: 0.568),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.568, upper: 0.569),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.569, upper: 0.569),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.569, upper: 0.593),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.593, upper: 0.631),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.631, upper: 0.679),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.569, upper: 0.577),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.577, upper: 0.601),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.601, upper: 0.639),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.639, upper: 0.679),
     ElementKind.ENUM: ProbabilityRange(lower: 0.679, upper: 0.807),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.807, upper: 1.000),
   },
   'BinaryExpression_>=_rightOperand': {
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.000, upper: 0.714),
     ElementKind.CLASS: ProbabilityRange(lower: 0.714, upper: 0.731),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.731, upper: 0.792),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.792, upper: 0.854),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.854, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.731, upper: 0.761),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.761, upper: 0.821),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.821, upper: 0.884),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.884, upper: 1.000),
   },
   'BinaryExpression_>>_rightOperand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 1.000),
@@ -299,44 +339,52 @@
     ElementKind.ENUM: ProbabilityRange(lower: 0.815, upper: 0.817),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.817, upper: 0.820),
     ElementKind.CLASS: ProbabilityRange(lower: 0.820, upper: 0.828),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.828, upper: 0.868),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.868, upper: 0.928),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.928, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.828, upper: 0.850),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.850, upper: 0.890),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.890, upper: 0.939),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.939, upper: 1.000),
   },
   'BinaryExpression_??_rightOperand': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.665),
     ElementKind.METHOD: ProbabilityRange(lower: 0.665, upper: 0.668),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.668, upper: 0.673),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.673, upper: 0.685),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.685, upper: 0.726),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.726, upper: 0.769),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.673, upper: 0.680),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.680, upper: 0.692),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.692, upper: 0.728),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.728, upper: 0.769),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.769, upper: 0.817),
     ElementKind.CLASS: ProbabilityRange(lower: 0.817, upper: 0.871),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.871, upper: 1.000),
   },
   'BinaryExpression_^_rightOperand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.118),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.118, upper: 1.000),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.118, upper: 1.000),
   },
   'BinaryExpression_|_rightOperand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.143),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.143, upper: 0.429),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.143, upper: 0.429),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.429, upper: 1.000),
   },
   'BinaryExpression_||_rightOperand': {
-    ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.143),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.143, upper: 0.147),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.147, upper: 0.167),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.167, upper: 0.380),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.380, upper: 0.666),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.141),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.141, upper: 0.145),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.145, upper: 0.149),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.149, upper: 0.169),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.169, upper: 0.382),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.382, upper: 0.666),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.666, upper: 1.000),
   },
   'BinaryExpression_~/_rightOperand': {
-    ElementKind.CLASS: ProbabilityRange(lower: 0.000, upper: 0.635),
-    ElementKind.MIXIN: ProbabilityRange(lower: 0.635, upper: 0.648),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.648, upper: 0.686),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.686, upper: 0.792),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.792, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.629),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.629, upper: 0.642),
+    ElementKind.MIXIN: ProbabilityRange(lower: 0.642, upper: 0.654),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.654, upper: 0.692),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.692, upper: 0.799),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.799, upper: 1.000),
   },
   'Block_statement': {
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.537),
@@ -346,13 +394,14 @@
     ElementKind.ENUM: ProbabilityRange(lower: 0.537, upper: 0.538),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.538, upper: 0.538),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.538, upper: 0.540),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.540, upper: 0.563),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.563, upper: 0.613),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.613, upper: 0.673),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.673, upper: 0.742),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.742, upper: 0.824),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.824, upper: 0.911),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.911, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.540, upper: 0.554),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.554, upper: 0.577),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.577, upper: 0.627),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.627, upper: 0.687),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.687, upper: 0.770),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.770, upper: 0.858),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.858, upper: 1.000),
   },
   'CatchClause_exceptionType': {
     ElementKind.CLASS: ProbabilityRange(lower: 0.000, upper: 1.000),
@@ -372,16 +421,17 @@
   },
   'CommentReference_identifier': {
     ElementKind.UNKNOWN: ProbabilityRange(lower: 0.000, upper: 0.001),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.001, upper: 0.001),
     ElementKind.FUNCTION_TYPE_ALIAS:
-        ProbabilityRange(lower: 0.001, upper: 0.003),
-    ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.003, upper: 0.005),
-    ElementKind.PREFIX: ProbabilityRange(lower: 0.005, upper: 0.009),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.009, upper: 0.022),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.022, upper: 0.056),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.056, upper: 0.114),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.114, upper: 0.177),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.177, upper: 0.456),
+        ProbabilityRange(lower: 0.001, upper: 0.002),
+    ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.002, upper: 0.004),
+    ElementKind.PREFIX: ProbabilityRange(lower: 0.004, upper: 0.008),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.008, upper: 0.012),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.012, upper: 0.026),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.026, upper: 0.060),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.060, upper: 0.118),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.118, upper: 0.181),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.181, upper: 0.456),
     ElementKind.CLASS: ProbabilityRange(lower: 0.456, upper: 1.000),
   },
   'CompilationUnit_declaration': {
@@ -395,25 +445,27 @@
   },
   'ConditionalExpression_elseExpression': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.369),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.369, upper: 0.375),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.375, upper: 0.383),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.383, upper: 0.402),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.402, upper: 0.426),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.426, upper: 0.482),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.482, upper: 0.549),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.549, upper: 0.655),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.369, upper: 0.378),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.378, upper: 0.388),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.388, upper: 0.407),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.407, upper: 0.431),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.431, upper: 0.487),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.487, upper: 0.554),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.554, upper: 0.655),
     ElementKind.CLASS: ProbabilityRange(lower: 0.655, upper: 0.790),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.790, upper: 1.000),
   },
   'ConditionalExpression_thenExpression': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.390),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.390, upper: 0.396),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.396, upper: 0.403),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.403, upper: 0.424),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.424, upper: 0.450),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.450, upper: 0.500),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.500, upper: 0.556),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.556, upper: 0.633),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.390, upper: 0.397),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.397, upper: 0.408),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.408, upper: 0.429),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.429, upper: 0.456),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.456, upper: 0.506),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.506, upper: 0.562),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.562, upper: 0.633),
     ElementKind.CLASS: ProbabilityRange(lower: 0.633, upper: 0.776),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.776, upper: 1.000),
   },
@@ -424,7 +476,9 @@
     ElementKind.CLASS: ProbabilityRange(lower: 0.000, upper: 1.000),
   },
   'ConstructorFieldInitializer_expression': {
-    ElementKind.GETTER: ProbabilityRange(lower: 0.000, upper: 0.185),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.183),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.183, upper: 0.185),
     ElementKind.METHOD: ProbabilityRange(lower: 0.185, upper: 0.188),
     ElementKind.ENUM: ProbabilityRange(lower: 0.188, upper: 0.196),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.196, upper: 0.221),
@@ -436,7 +490,9 @@
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.694),
     ElementKind.METHOD: ProbabilityRange(lower: 0.694, upper: 0.695),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.695, upper: 0.696),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.696, upper: 0.713),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.696, upper: 0.702),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.702, upper: 0.713),
     ElementKind.ENUM: ProbabilityRange(lower: 0.713, upper: 0.760),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.760, upper: 0.827),
     ElementKind.CLASS: ProbabilityRange(lower: 0.827, upper: 1.000),
@@ -450,18 +506,17 @@
     ElementKind.FUNCTION_TYPE_ALIAS:
         ProbabilityRange(lower: 0.386, upper: 0.386),
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.386, upper: 0.387),
-    ElementKind.TOP_LEVEL_VARIABLE:
-        ProbabilityRange(lower: 0.387, upper: 0.387),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.387, upper: 0.387),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.387, upper: 0.388),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.388, upper: 0.403),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.403, upper: 0.419),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.419, upper: 0.435),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.435, upper: 0.452),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.452, upper: 0.524),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.524, upper: 0.608),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.608, upper: 0.704),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.704, upper: 0.835),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.388, upper: 0.404),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.404, upper: 0.420),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.420, upper: 0.437),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.437, upper: 0.470),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.470, upper: 0.542),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.542, upper: 0.626),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.626, upper: 0.722),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.722, upper: 0.835),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.835, upper: 1.000),
   },
   'ExpressionFunctionBody_expression': {
@@ -469,27 +524,29 @@
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.162, upper: 0.163),
     ElementKind.ENUM: ProbabilityRange(lower: 0.163, upper: 0.164),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.164, upper: 0.171),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.171, upper: 0.184),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.171, upper: 0.184),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.184, upper: 0.211),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.211, upper: 0.244),
     ElementKind.CLASS: ProbabilityRange(lower: 0.244, upper: 0.286),
     ElementKind.METHOD: ProbabilityRange(lower: 0.286, upper: 0.332),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.332, upper: 0.496),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.496, upper: 0.731),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.731, upper: 1.000),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.332, upper: 0.497),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.497, upper: 0.731),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.731, upper: 1.000),
   },
   'ExpressionStatement_expression': {
     ElementKind.ENUM: ProbabilityRange(lower: 0.000, upper: 0.132),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.132, upper: 0.134),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.134, upper: 0.136),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.136, upper: 0.139),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.139, upper: 0.189),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.189, upper: 0.254),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.254, upper: 0.359),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.359, upper: 0.481),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.481, upper: 0.624),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.624, upper: 0.801),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.801, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.139, upper: 0.168),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.168, upper: 0.218),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.218, upper: 0.283),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.283, upper: 0.388),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.388, upper: 0.510),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.510, upper: 0.709),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.709, upper: 1.000),
   },
   'ExtendsClause_superclass': {
     ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.000),
@@ -519,7 +576,9 @@
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.018, upper: 0.022),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.022, upper: 0.029),
     ElementKind.CLASS: ProbabilityRange(lower: 0.029, upper: 0.037),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.037, upper: 0.287),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.037, upper: 0.076),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.076, upper: 0.287),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.287, upper: 0.606),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.606, upper: 1.000),
   },
@@ -544,16 +603,19 @@
     ElementKind.CLASS: ProbabilityRange(lower: 0.634, upper: 1.000),
   },
   'ForParts_condition': {
-    ElementKind.GETTER: ProbabilityRange(lower: 0.000, upper: 0.024),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.000, upper: 0.004),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.004, upper: 0.024),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.024, upper: 1.000),
   },
   'ForParts_updater': {
-    ElementKind.SETTER: ProbabilityRange(lower: 0.000, upper: 0.068),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.068),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.068, upper: 1.000),
   },
   'ForStatement_body': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.981),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.981, upper: 0.986),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.981, upper: 0.986),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.986, upper: 1.000),
   },
   'ForStatement_forLoopParts': {
@@ -564,7 +626,8 @@
     ElementKind.ENUM: ProbabilityRange(lower: 0.538, upper: 0.539),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.539, upper: 0.541),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.541, upper: 0.551),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.551, upper: 0.561),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.551, upper: 0.561),
     ElementKind.CLASS: ProbabilityRange(lower: 0.561, upper: 1.000),
   },
   'FormalParameterList_parameter': {
@@ -598,11 +661,13 @@
     ElementKind.CLASS: ProbabilityRange(lower: 0.059, upper: 1.000),
   },
   'IfElement_condition': {
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.000, upper: 0.158),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.158, upper: 0.174),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.174, upper: 0.335),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.335, upper: 0.629),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.629, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.158),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.158, upper: 0.163),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.163, upper: 0.179),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.179, upper: 0.339),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.339, upper: 0.633),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.633, upper: 1.000),
   },
   'IfElement_elseElement': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.346),
@@ -613,7 +678,7 @@
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.215, upper: 0.222),
     ElementKind.CLASS: ProbabilityRange(lower: 0.222, upper: 0.230),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.230, upper: 0.242),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.242, upper: 0.257),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.242, upper: 0.257),
     ElementKind.METHOD: ProbabilityRange(lower: 0.257, upper: 0.284),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.284, upper: 1.000),
   },
@@ -623,29 +688,33 @@
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.118, upper: 0.118),
     ElementKind.ENUM: ProbabilityRange(lower: 0.118, upper: 0.118),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.118, upper: 0.119),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.119, upper: 0.129),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.129, upper: 0.145),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.145, upper: 0.167),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.167, upper: 0.389),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.389, upper: 0.688),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.688, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.119, upper: 0.127),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.127, upper: 0.137),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.137, upper: 0.153),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.153, upper: 0.175),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.175, upper: 0.397),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.397, upper: 0.696),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.696, upper: 1.000),
   },
   'IfStatement_elseStatement': {
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.969),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.000, upper: 0.968),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.968, upper: 0.969),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.969, upper: 0.970),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.970, upper: 0.973),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.973, upper: 0.976),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.976, upper: 0.982),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.970, upper: 0.973),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.973, upper: 0.982),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.982, upper: 0.991),
     ElementKind.METHOD: ProbabilityRange(lower: 0.991, upper: 1.000),
   },
   'IfStatement_thenStatement': {
     ElementKind.MIXIN: ProbabilityRange(lower: 0.000, upper: 0.935),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.935, upper: 0.936),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.936, upper: 0.938),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.938, upper: 0.943),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.943, upper: 0.952),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.952, upper: 0.965),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.935, upper: 0.936),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.936, upper: 0.937),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.937, upper: 0.939),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.939, upper: 0.948),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.948, upper: 0.965),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.965, upper: 0.981),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.981, upper: 1.000),
   },
@@ -661,7 +730,9 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.656, upper: 0.657),
     ElementKind.ENUM: ProbabilityRange(lower: 0.657, upper: 0.659),
     ElementKind.CLASS: ProbabilityRange(lower: 0.659, upper: 0.664),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.664, upper: 0.761),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.664, upper: 0.670),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.670, upper: 0.761),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.761, upper: 0.863),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.863, upper: 1.000),
   },
@@ -676,10 +747,12 @@
     ElementKind.ENUM: ProbabilityRange(lower: 0.036, upper: 0.037),
     ElementKind.METHOD: ProbabilityRange(lower: 0.037, upper: 0.044),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.044, upper: 0.074),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.074, upper: 0.198),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.198, upper: 0.389),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.389, upper: 0.635),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.635, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.074, upper: 0.133),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.133, upper: 0.257),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.257, upper: 0.447),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.447, upper: 0.693),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.693, upper: 1.000),
   },
   'IsExpression_type': {
     ElementKind.MIXIN: ProbabilityRange(lower: 0.000, upper: 0.001),
@@ -691,13 +764,14 @@
     ElementKind.CLASS: ProbabilityRange(lower: 0.013, upper: 1.000),
   },
   'ListLiteral_element': {
-    ElementKind.SETTER: ProbabilityRange(lower: 0.000, upper: 0.324),
-    ElementKind.PREFIX: ProbabilityRange(lower: 0.324, upper: 0.324),
+    ElementKind.PREFIX: ProbabilityRange(lower: 0.000, upper: 0.324),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.324, upper: 0.326),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.326, upper: 0.331),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.331, upper: 0.338),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.338, upper: 0.348),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.348, upper: 0.361),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.326, upper: 0.329),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.329, upper: 0.333),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.333, upper: 0.340),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.340, upper: 0.350),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.350, upper: 0.361),
     ElementKind.METHOD: ProbabilityRange(lower: 0.361, upper: 0.379),
     ElementKind.CLASS: ProbabilityRange(lower: 0.379, upper: 0.406),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.406, upper: 1.000),
@@ -707,10 +781,12 @@
     ElementKind.METHOD: ProbabilityRange(lower: 0.814, upper: 0.814),
     ElementKind.ENUM: ProbabilityRange(lower: 0.814, upper: 0.816),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.816, upper: 0.818),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.818, upper: 0.823),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.823, upper: 0.829),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.829, upper: 0.849),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.849, upper: 0.884),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.818, upper: 0.823),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.823, upper: 0.828),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.828, upper: 0.833),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.833, upper: 0.854),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.854, upper: 0.884),
     ElementKind.CLASS: ProbabilityRange(lower: 0.884, upper: 1.000),
   },
   'MethodDeclaration_returnType': {
@@ -737,42 +813,45 @@
     ElementKind.MIXIN: ProbabilityRange(lower: 0.000, upper: 0.218),
     ElementKind.ENUM: ProbabilityRange(lower: 0.218, upper: 0.219),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.219, upper: 0.221),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.221, upper: 0.223),
-    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.223, upper: 0.226),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.226, upper: 0.231),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.231, upper: 0.277),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.277, upper: 0.334),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.334, upper: 0.517),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.517, upper: 0.731),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.731, upper: 1.000),
+    ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.221, upper: 0.224),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.224, upper: 0.228),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.228, upper: 0.274),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.274, upper: 0.331),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.331, upper: 0.403),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.403, upper: 0.586),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.586, upper: 0.786),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.786, upper: 1.000),
   },
   'PrefixExpression_!_operand': {
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.000, upper: 0.062),
     ElementKind.METHOD: ProbabilityRange(lower: 0.062, upper: 0.090),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.090, upper: 0.139),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.139, upper: 0.326),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.326, upper: 0.582),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.582, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.090, upper: 0.124),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.124, upper: 0.173),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.173, upper: 0.360),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.360, upper: 0.616),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.616, upper: 1.000),
   },
   'PrefixExpression_++_operand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.035),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.035, upper: 0.123),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.123, upper: 0.351),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.035, upper: 0.351),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.351, upper: 1.000),
   },
   'PrefixExpression_--_operand': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.063),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.063, upper: 0.313),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.313, upper: 0.625),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.625, upper: 1.000),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.313, upper: 1.000),
   },
   'PrefixExpression_-_operand': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.830),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.830, upper: 0.832),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.832, upper: 0.839),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.839, upper: 0.857),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.857, upper: 0.883),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.883, upper: 0.930),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.857, upper: 0.877),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.877, upper: 0.902),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.902, upper: 0.930),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.930, upper: 1.000),
   },
   'PrefixExpression_~_operand': {
@@ -780,18 +859,18 @@
   },
   'PropertyAccess_propertyName': {
     ElementKind.METHOD: ProbabilityRange(lower: 0.000, upper: 0.002),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.002, upper: 0.103),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.103, upper: 1.000),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.002, upper: 1.000),
   },
   'ReturnStatement_expression': {
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.243),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.243, upper: 0.243),
-    ElementKind.PREFIX: ProbabilityRange(lower: 0.243, upper: 0.247),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.247, upper: 0.254),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.254, upper: 0.271),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.271, upper: 0.295),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.295, upper: 0.348),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.348, upper: 0.406),
+    ElementKind.PREFIX: ProbabilityRange(lower: 0.243, upper: 0.246),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.246, upper: 0.254),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.254, upper: 0.262),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.262, upper: 0.279),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.279, upper: 0.303),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.303, upper: 0.352),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.352, upper: 0.406),
     ElementKind.CLASS: ProbabilityRange(lower: 0.406, upper: 0.466),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.466, upper: 0.564),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.564, upper: 1.000),
@@ -802,9 +881,11 @@
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.974, upper: 0.974),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.974, upper: 0.974),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.974, upper: 0.975),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.975, upper: 0.978),
-    ElementKind.ENUM: ProbabilityRange(lower: 0.978, upper: 0.983),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.983, upper: 0.991),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.975, upper: 0.976),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.976, upper: 0.979),
+    ElementKind.ENUM: ProbabilityRange(lower: 0.979, upper: 0.985),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.985, upper: 0.991),
     ElementKind.CLASS: ProbabilityRange(lower: 0.991, upper: 1.000),
   },
   'ShowCombinator_shownName': {
@@ -821,10 +902,12 @@
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.335, upper: 0.349),
     ElementKind.CLASS: ProbabilityRange(lower: 0.349, upper: 0.379),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.379, upper: 0.446),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.446, upper: 0.535),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.535, upper: 0.636),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.636, upper: 0.740),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.740, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.446, upper: 0.520),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.520, upper: 0.610),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.610, upper: 0.710),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.710, upper: 0.814),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.814, upper: 1.000),
   },
   'Statement': {
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.599),
@@ -834,36 +917,42 @@
     ElementKind.ENUM: ProbabilityRange(lower: 0.600, upper: 0.600),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.600, upper: 0.601),
     ElementKind.PREFIX: ProbabilityRange(lower: 0.601, upper: 0.602),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.602, upper: 0.622),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.622, upper: 0.665),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.665, upper: 0.715),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.715, upper: 0.773),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.773, upper: 0.845),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.845, upper: 0.919),
-    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.919, upper: 1.000),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.602, upper: 0.613),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.613, upper: 0.634),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.634, upper: 0.677),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.677, upper: 0.727),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.727, upper: 0.800),
+    ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.800, upper: 0.881),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.881, upper: 1.000),
   },
   'SwitchCase_expression': {
-    ElementKind.GETTER: ProbabilityRange(lower: 0.000, upper: 0.525),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.000, upper: 0.508),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.508, upper: 0.525),
     ElementKind.CLASS: ProbabilityRange(lower: 0.525, upper: 0.668),
     ElementKind.ENUM: ProbabilityRange(lower: 0.668, upper: 1.000),
   },
   'SwitchMember_statement': {
     ElementKind.UNKNOWN: ProbabilityRange(lower: 0.000, upper: 0.683),
     ElementKind.MIXIN: ProbabilityRange(lower: 0.683, upper: 0.683),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.683, upper: 0.690),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.690, upper: 0.701),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.701, upper: 0.713),
-    ElementKind.SETTER: ProbabilityRange(lower: 0.713, upper: 0.726),
-    ElementKind.METHOD: ProbabilityRange(lower: 0.726, upper: 0.742),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.742, upper: 0.759),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.683, upper: 0.685),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.685, upper: 0.691),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.691, upper: 0.703),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.703, upper: 0.715),
+    ElementKind.METHOD: ProbabilityRange(lower: 0.715, upper: 0.730),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.730, upper: 0.759),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.759, upper: 1.000),
   },
   'SwitchStatement_expression': {
     ElementKind.TYPE_PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.010),
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.010, upper: 0.012),
     ElementKind.METHOD: ProbabilityRange(lower: 0.012, upper: 0.016),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.016, upper: 0.031),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.031, upper: 0.212),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.016, upper: 0.023),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.023, upper: 0.039),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.039, upper: 0.212),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.212, upper: 0.516),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.516, upper: 1.000),
   },
@@ -904,10 +993,12 @@
     ElementKind.PREFIX: ProbabilityRange(lower: 0.452, upper: 0.455),
     ElementKind.ENUM: ProbabilityRange(lower: 0.455, upper: 0.459),
     ElementKind.METHOD: ProbabilityRange(lower: 0.459, upper: 0.471),
-    ElementKind.FUNCTION: ProbabilityRange(lower: 0.471, upper: 0.497),
-    ElementKind.PARAMETER: ProbabilityRange(lower: 0.497, upper: 0.560),
-    ElementKind.CLASS: ProbabilityRange(lower: 0.560, upper: 0.630),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.630, upper: 0.712),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.471, upper: 0.489),
+    ElementKind.FUNCTION: ProbabilityRange(lower: 0.489, upper: 0.515),
+    ElementKind.PARAMETER: ProbabilityRange(lower: 0.515, upper: 0.578),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.578, upper: 0.641),
+    ElementKind.CLASS: ProbabilityRange(lower: 0.641, upper: 0.712),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.712, upper: 0.794),
     ElementKind.CONSTRUCTOR: ProbabilityRange(lower: 0.794, upper: 1.000),
   },
@@ -917,7 +1008,7 @@
   },
   'WhileStatement_condition': {
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.000, upper: 0.083),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.083, upper: 0.109),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.083, upper: 0.109),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.109, upper: 1.000),
   },
   'WithClause_mixinType': {
@@ -926,7 +1017,9 @@
   },
   'YieldStatement_expression': {
     ElementKind.FUNCTION: ProbabilityRange(lower: 0.000, upper: 0.065),
-    ElementKind.GETTER: ProbabilityRange(lower: 0.065, upper: 0.086),
+    ElementKind.TOP_LEVEL_VARIABLE:
+        ProbabilityRange(lower: 0.065, upper: 0.068),
+    ElementKind.FIELD: ProbabilityRange(lower: 0.068, upper: 0.086),
     ElementKind.PARAMETER: ProbabilityRange(lower: 0.086, upper: 0.122),
     ElementKind.LOCAL_VARIABLE: ProbabilityRange(lower: 0.122, upper: 0.161),
     ElementKind.METHOD: ProbabilityRange(lower: 0.161, upper: 0.309),
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 1b83baf..3076e34 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -36,11 +36,11 @@
 import 'package:analysis_server/src/services/correction/dart/sort_child_property_last.dart';
 import 'package:analysis_server/src/services/correction/dart/split_and_condition.dart';
 import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
 import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
 import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
-import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/precedence.dart';
@@ -65,7 +65,43 @@
 
 /// The computer for Dart assists.
 class AssistProcessor extends BaseProcessor {
+  /// A map that can be used to look up the names of the lints for which a given
+  /// [CorrectionProducer] will be used.
+  static final Map<ProducerGenerator, Set<String>> lintRuleMap =
+      createLintRuleMap();
+
+  /// A list of the generators used to produce assists.
+  static const List<ProducerGenerator> generators = [
+    AddDiagnosticPropertyReference.newInstance,
+    AddReturnType.newInstance,
+    AddTypeAnnotation.newInstance,
+    ConvertAddAllToSpread.newInstance,
+    ConvertConditionalExpressionToIfElement.newInstance,
+    ConvertDocumentationIntoLine.newInstance,
+    ConvertMapFromIterableToForLiteral.newInstance,
+    ConvertToDoubleQuotes.newInstance,
+    ConvertToSingleQuotes.newInstance,
+    ConvertToExpressionFunctionBody.newInstance,
+    ConvertToGenericFunctionSyntax.newInstance,
+    ConvertToIntLiteral.newInstance,
+    ConvertToListLiteral.newInstance,
+    ConvertToMapLiteral.newInstance,
+    ConvertToNullAware.newInstance,
+    ConvertToPackageImport.newInstance,
+    ConvertToRelativeImport.newInstance,
+    ConvertToSetLiteral.newInstance,
+    ExchangeOperands.newInstance,
+    InlineInvocation.newInstance,
+    RemoveTypeAnnotation.newInstance,
+    ReplaceWithVar.newInstance,
+    ShadowField.newInstance,
+    SortChildPropertyLast.newInstance,
+    SplitAndCondition.newInstance,
+    UseCurlyBraces.newInstance,
+  ];
+
   final DartAssistContext context;
+
   final List<Assist> assists = <Assist>[];
 
   AssistProcessor(this.context)
@@ -194,115 +230,19 @@
     if (!setupSuccess) {
       return;
     }
+    for (var generator in generators) {
+      var ruleNames = lintRuleMap[generator] ?? {};
+      if (!_containsErrorCode(ruleNames)) {
+        var producer = generator();
+        producer.configure(context);
 
-    Future<void> compute(CorrectionProducer producer) async {
-      producer.configure(context);
+        var builder = _newDartChangeBuilder();
+        await producer.compute(builder);
 
-      var builder = _newDartChangeBuilder();
-      await producer.compute(builder);
-
-      _addAssistFromBuilder(builder, producer.assistKind,
-          args: producer.assistArguments);
-    }
-
-    Future<void> computeIfNotErrorCode(
-      CorrectionProducer producer,
-      Set<String> errorCodes,
-    ) async {
-      if (!_containsErrorCode(errorCodes)) {
-        await compute(producer);
+        _addAssistFromBuilder(builder, producer.assistKind,
+            args: producer.assistArguments);
       }
     }
-
-    await computeIfNotErrorCode(
-      AddReturnType(),
-      {LintNames.always_declare_return_types},
-    );
-    await computeIfNotErrorCode(
-      AddDiagnosticPropertyReference(),
-      {LintNames.diagnostic_describe_all_properties},
-    );
-    await computeIfNotErrorCode(
-      AddTypeAnnotation(),
-      {LintNames.always_specify_types, LintNames.type_annotate_public_apis},
-    );
-    await computeIfNotErrorCode(
-      ConvertConditionalExpressionToIfElement(),
-      {LintNames.prefer_if_elements_to_conditional_expressions},
-    );
-    await computeIfNotErrorCode(
-      ConvertDocumentationIntoLine(),
-      {LintNames.slash_for_doc_comments},
-    );
-    await computeIfNotErrorCode(
-      ConvertMapFromIterableToForLiteral(),
-      {LintNames.prefer_for_elements_to_map_fromIterable},
-    );
-    await compute(ConvertToDoubleQuotes());
-    await computeIfNotErrorCode(
-      ConvertToSingleQuotes(),
-      {LintNames.prefer_single_quotes},
-    );
-    await computeIfNotErrorCode(
-      ConvertToExpressionFunctionBody(),
-      {LintNames.prefer_expression_function_bodies},
-    );
-    await computeIfNotErrorCode(
-      ConvertToGenericFunctionSyntax(),
-      {LintNames.prefer_generic_function_type_aliases},
-    );
-    await computeIfNotErrorCode(
-      ConvertToIntLiteral(),
-      {LintNames.prefer_int_literals},
-    );
-    await computeIfNotErrorCode(
-      ConvertToListLiteral(),
-      {LintNames.prefer_collection_literals},
-    );
-    await computeIfNotErrorCode(
-      ConvertToMapLiteral(),
-      {LintNames.prefer_collection_literals},
-    );
-    await computeIfNotErrorCode(
-      ConvertToNullAware(),
-      {LintNames.prefer_null_aware_operators},
-    );
-    await computeIfNotErrorCode(
-      ConvertToPackageImport(),
-      {LintNames.avoid_relative_lib_imports},
-    );
-    await computeIfNotErrorCode(
-      ConvertToRelativeImport(),
-      {LintNames.prefer_relative_imports},
-    );
-    await computeIfNotErrorCode(
-      ConvertToSetLiteral(),
-      {LintNames.prefer_collection_literals},
-    );
-    await compute(ExchangeOperands());
-    await computeIfNotErrorCode(
-      InlineInvocation(),
-      {LintNames.prefer_inlined_adds},
-    );
-    await compute(RemoveTypeAnnotation());
-    await computeIfNotErrorCode(
-      ReplaceWithVar(),
-      {LintNames.omit_local_variable_types},
-    );
-    await compute(ShadowField());
-    await computeIfNotErrorCode(
-      SortChildPropertyLast(),
-      {LintNames.sort_child_properties_last},
-    );
-    await compute(SplitAndCondition());
-    await computeIfNotErrorCode(
-      UseCurlyBraces(),
-      {LintNames.curly_braces_in_flow_control_structures},
-    );
-    await computeIfNotErrorCode(
-      ConvertAddAllToSpread(),
-      {LintNames.prefer_inlined_adds, LintNames.prefer_spread_collections},
-    );
   }
 
   Future<void> _addProposal_addNotNullAssert() async {
@@ -2890,6 +2830,21 @@
     _addAssistFromBuilder(changeBuilder, kind);
   }
 
+  /// Create and return a map that can be used to look up the names of the lints
+  /// for which a given `CorrectionProducer` will be used. This allows us to
+  /// ensure that we do not also offer the change as an assist when it's already
+  /// being offered as a fix.
+  static Map<ProducerGenerator, Set<String>> createLintRuleMap() {
+    var map = <ProducerGenerator, Set<String>>{};
+    for (var entry in FixProcessor.lintProducerMap.entries) {
+      var lintName = entry.key;
+      for (var generator in entry.value) {
+        map.putIfAbsent(generator, () => <String>{}).add(lintName);
+      }
+    }
+    return map;
+  }
+
   static String _replaceSourceIndent(
       String source, String indentOld, String indentNew) {
     return source.replaceAll(RegExp('^$indentOld', multiLine: true), indentNew);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 77859c9..98c09a1 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -9,15 +9,20 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:meta/meta.dart';
 
 /// An object that can compute a correction (fix or assist).
@@ -31,6 +36,21 @@
   /// if this producer doesn't support assists.
   AssistKind get assistKind => null;
 
+  /// Return the type for the class `bool` from `dart:core`.
+  DartType get coreTypeBool => resolvedResult.typeProvider.boolType;
+
+  /// Return the length of the error message being fixed, or `null` if there is
+  /// no diagnostic.
+  int get errorLength => diagnostic?.problemMessage?.length;
+
+  /// Return the text of the error message being fixed, or `null` if there is
+  /// no diagnostic.
+  String get errorMessage => diagnostic?.problemMessage?.message;
+
+  /// Return the offset of the error message being fixed, or `null` if there is
+  /// no diagnostic.
+  int get errorOffset => diagnostic?.problemMessage?.offset;
+
   /// Return the arguments that should be used when composing the message for a
   /// fix, or `null` if the fix message has no parameters or if this producer
   /// doesn't support fixes.
@@ -40,7 +60,170 @@
   /// producer doesn't support fixes.
   FixKind get fixKind => null;
 
+  /// Returns `true` if [node] is in a static context.
+  bool get inStaticContext {
+    // constructor initializer cannot reference "this"
+    if (node.thisOrAncestorOfType<ConstructorInitializer>() != null) {
+      return true;
+    }
+    // field initializer cannot reference "this"
+    if (node.thisOrAncestorOfType<FieldDeclaration>() != null) {
+      return true;
+    }
+    // static method
+    var method = node.thisOrAncestorOfType<MethodDeclaration>();
+    return method != null && method.isStatic;
+  }
+
   Future<void> compute(DartChangeBuilder builder);
+
+  /// Returns an expected [DartType] of [expression], may be `null` if cannot be
+  /// inferred.
+  DartType inferUndefinedExpressionType(Expression expression) {
+    var parent = expression.parent;
+    // myFunction();
+    if (parent is ExpressionStatement) {
+      if (expression is MethodInvocation) {
+        return VoidTypeImpl.instance;
+      }
+    }
+    // return myFunction();
+    if (parent is ReturnStatement) {
+      var executable = getEnclosingExecutableElement(expression);
+      return executable?.returnType;
+    }
+    // int v = myFunction();
+    if (parent is VariableDeclaration) {
+      var variableDeclaration = parent;
+      if (variableDeclaration.initializer == expression) {
+        var variableElement = variableDeclaration.declaredElement;
+        if (variableElement != null) {
+          return variableElement.type;
+        }
+      }
+    }
+    // myField = 42;
+    if (parent is AssignmentExpression) {
+      var assignment = parent;
+      if (assignment.leftHandSide == expression) {
+        var rhs = assignment.rightHandSide;
+        if (rhs != null) {
+          return rhs.staticType;
+        }
+      }
+    }
+    // v = myFunction();
+    if (parent is AssignmentExpression) {
+      var assignment = parent;
+      if (assignment.rightHandSide == expression) {
+        if (assignment.operator.type == TokenType.EQ) {
+          // v = myFunction();
+          var lhs = assignment.leftHandSide;
+          if (lhs != null) {
+            return lhs.staticType;
+          }
+        } else {
+          // v += myFunction();
+          var method = assignment.staticElement;
+          if (method != null) {
+            var parameters = method.parameters;
+            if (parameters.length == 1) {
+              return parameters[0].type;
+            }
+          }
+        }
+      }
+    }
+    // v + myFunction();
+    if (parent is BinaryExpression) {
+      var binary = parent;
+      var method = binary.staticElement;
+      if (method != null) {
+        if (binary.rightOperand == expression) {
+          var parameters = method.parameters;
+          return parameters.length == 1 ? parameters[0].type : null;
+        }
+      }
+    }
+    // foo( myFunction() );
+    if (parent is ArgumentList) {
+      var parameter = expression.staticParameterElement;
+      return parameter?.type;
+    }
+    // bool
+    {
+      // assert( myFunction() );
+      if (parent is AssertStatement) {
+        var statement = parent;
+        if (statement.condition == expression) {
+          return coreTypeBool;
+        }
+      }
+      // if ( myFunction() ) {}
+      if (parent is IfStatement) {
+        var statement = parent;
+        if (statement.condition == expression) {
+          return coreTypeBool;
+        }
+      }
+      // while ( myFunction() ) {}
+      if (parent is WhileStatement) {
+        var statement = parent;
+        if (statement.condition == expression) {
+          return coreTypeBool;
+        }
+      }
+      // do {} while ( myFunction() );
+      if (parent is DoStatement) {
+        var statement = parent;
+        if (statement.condition == expression) {
+          return coreTypeBool;
+        }
+      }
+      // !myFunction()
+      if (parent is PrefixExpression) {
+        var prefixExpression = parent;
+        if (prefixExpression.operator.type == TokenType.BANG) {
+          return coreTypeBool;
+        }
+      }
+      // binary expression '&&' or '||'
+      if (parent is BinaryExpression) {
+        var binaryExpression = parent;
+        var operatorType = binaryExpression.operator.type;
+        if (operatorType == TokenType.AMPERSAND_AMPERSAND ||
+            operatorType == TokenType.BAR_BAR) {
+          return coreTypeBool;
+        }
+      }
+    }
+    // we don't know
+    return null;
+  }
+
+  /// Return `true` if the [node] might be a type name.
+  bool mightBeTypeIdentifier(AstNode node) {
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+      if (parent is TypeName) {
+        return true;
+      }
+      return _isNameOfType(node.name);
+    }
+    return false;
+  }
+
+  /// Return `true` if the [name] is capitalized.
+  bool _isNameOfType(String name) {
+    if (name.isEmpty) {
+      return false;
+    }
+    var firstLetter = name.substring(0, 1);
+    if (firstLetter.toUpperCase() != firstLetter) {
+      return false;
+    }
+    return true;
+  }
 }
 
 class CorrectionProducerContext {
@@ -145,6 +328,10 @@
 
   Flutter get flutter => _context.flutter;
 
+  /// Return the library element for the library in which a correction is being
+  /// produced.
+  LibraryElement get libraryElement => resolvedResult.libraryElement;
+
   AstNode get node => _context.node;
 
   ResolvedUnitResult get resolvedResult => _context.resolvedResult;
@@ -224,3 +411,21 @@
     return false;
   }
 }
+
+extension DartFileEditBuilderExtension on DartFileEditBuilder {
+  /// Add edits to the [builder] to remove any parentheses enclosing the
+  /// [expression].
+  // TODO(brianwilkerson) Consider moving this to DartFileEditBuilder.
+  void removeEnclosingParentheses(Expression expression) {
+    var precedence = getExpressionPrecedence(expression);
+    while (expression.parent is ParenthesizedExpression) {
+      var parenthesized = expression.parent as ParenthesizedExpression;
+      if (getExpressionParentPrecedence(parenthesized) > precedence) {
+        break;
+      }
+      addDeletion(range.token(parenthesized.leftParenthesis));
+      addDeletion(range.token(parenthesized.rightParenthesis));
+      expression = parenthesized;
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart
new file mode 100644
index 0000000..fa835e8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter_named.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/executable_parameters.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class AddMissingParameterNamed extends CorrectionProducer {
+  String _parameterName;
+
+  @override
+  List<Object> get fixArguments => [_parameterName];
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_MISSING_PARAMETER_NAMED;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    // Prepare the name of the missing parameter.
+    if (this.node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier node = this.node;
+    _parameterName = node.name;
+
+    // We expect that the node is part of a NamedExpression.
+    if (node.parent?.parent is! NamedExpression) {
+      return;
+    }
+    NamedExpression namedExpression = node.parent.parent;
+
+    // We should be in an ArgumentList.
+    if (namedExpression.parent is! ArgumentList) {
+      return;
+    }
+    var argumentList = namedExpression.parent;
+
+    // Prepare the invoked element.
+    var context = ExecutableParameters(sessionHelper, argumentList.parent);
+    if (context == null) {
+      return;
+    }
+
+    // We cannot add named parameters when there are positional positional.
+    if (context.optionalPositional.isNotEmpty) {
+      return;
+    }
+
+    Future<void> addParameter(int offset, String prefix, String suffix) async {
+      if (offset != null) {
+        await builder.addFileEdit(context.file, (builder) {
+          builder.addInsertion(offset, (builder) {
+            builder.write(prefix);
+            builder
+                .writeParameterMatchingArgument(namedExpression, 0, <String>{});
+            builder.write(suffix);
+          });
+        });
+      }
+    }
+
+    if (context.named.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.named.last);
+      await addParameter(prevNode?.end, ', ', '');
+    } else if (context.required.isNotEmpty) {
+      var prevNode = await context.getParameterNode(context.required.last);
+      await addParameter(prevNode?.end, ', {', '}');
+    } else {
+      var parameterList = await context.getParameterList();
+      await addParameter(parameterList?.leftParenthesis?.end, '{', '}');
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static AddMissingParameterNamed newInstance() => AddMissingParameterNamed();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index aa108ea..21e2950 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -36,7 +36,7 @@
         creation =
             invocation.thisOrAncestorOfType<InstanceCreationExpression>();
         if (creation != null) {
-          targetElement = creation.staticElement;
+          targetElement = creation.constructorName.staticElement;
           argumentList = creation.argumentList;
         }
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_ne_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_ne_null.dart
new file mode 100644
index 0000000..b75fd4f0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_ne_null.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class AddNeNull extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.ADD_NE_NULL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var problemMessage = diagnostic.problemMessage;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleInsertion(
+          problemMessage.offset + problemMessage.length, ' != null');
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static AddNeNull newInstance() => AddNeNull();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart
new file mode 100644
index 0000000..bf0ba1d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_to_static_access.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ChangeToStaticAccess extends CorrectionProducer {
+  String _className;
+
+  @override
+  List<Object> get fixArguments => [_className];
+
+  @override
+  FixKind get fixKind => DartFixKind.CHANGE_TO_STATIC_ACCESS;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    Expression target;
+    Element invokedElement;
+    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
+      var invocation = node.parent as MethodInvocation;
+      if (invocation.methodName == node) {
+        target = invocation.target;
+        invokedElement = invocation.methodName.staticElement;
+      }
+    } else if (node is SimpleIdentifier && node.parent is PrefixedIdentifier) {
+      var prefixed = node.parent as PrefixedIdentifier;
+      if (prefixed.identifier == node) {
+        target = prefixed.prefix;
+        invokedElement = prefixed.identifier.staticElement;
+      }
+    }
+    if (target == null) {
+      return;
+    }
+    var declaringElement = invokedElement.enclosingElement;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(range.node(target), (DartEditBuilder builder) {
+        builder.writeReference(declaringElement);
+      });
+    });
+    _className = declaringElement.name;
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ChangeToStaticAccess newInstance() => ChangeToStaticAccess();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
index 522a60a..dcfa395 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart
@@ -29,7 +29,7 @@
     if (creation == null) {
       return null;
     }
-    var element = creation.staticElement;
+    var element = creation.constructorName.staticElement;
     if (element == null ||
         element.name != 'fromIterable' ||
         element.enclosingElement != typeProvider.mapElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_named_arguments.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_named_arguments.dart
index 7b4d5ba..b7ce175 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_named_arguments.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_named_arguments.dart
@@ -27,7 +27,7 @@
           parameters = invokeType.parameters;
         }
       } else if (parent is InstanceCreationExpression) {
-        parameters = parent.staticElement?.parameters;
+        parameters = parent.constructorName.staticElement?.parameters;
       } else if (parent is MethodInvocation) {
         var invokeType = parent.staticInvokeType;
         if (invokeType is FunctionType) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart
new file mode 100644
index 0000000..0a91c00
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_class.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class CreateClass extends CorrectionProducer {
+  String className;
+
+  @override
+  List<Object> get fixArguments => [className];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_CLASS;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    Element prefixElement;
+    SimpleIdentifier nameNode;
+    ArgumentList arguments;
+    if (node is Annotation) {
+      var annotation = node as Annotation;
+      var name = annotation.name;
+      arguments = annotation.arguments;
+      if (name == null || name.staticElement != null || arguments == null) {
+        // TODO(brianwilkerson) Consider supporting creating a class when the
+        //  arguments are missing by also adding an empty argument list.
+        return;
+      }
+      node = name;
+    }
+    if (node is SimpleIdentifier) {
+      nameNode = node;
+    } else if (node is PrefixedIdentifier) {
+      prefixElement = node.prefix.staticElement;
+      if (prefixElement == null) {
+        return;
+      }
+      nameNode = node.identifier;
+    } else {
+      return;
+    }
+    if (!mightBeTypeIdentifier(nameNode)) {
+      return;
+    }
+    className = nameNode.name;
+    // prepare environment
+    Element targetUnit;
+    var prefix = '';
+    var suffix = '';
+    var offset = -1;
+    String filePath;
+    if (prefixElement == null) {
+      targetUnit = unit.declaredElement;
+      var enclosingMember = node.thisOrAncestorMatching((node) =>
+          node is CompilationUnitMember && node.parent is CompilationUnit);
+      if (enclosingMember == null) {
+        return;
+      }
+      offset = enclosingMember.end;
+      filePath = file;
+      prefix = '$eol$eol';
+    } else {
+      for (var import in libraryElement.imports) {
+        if (prefixElement is PrefixElement && import.prefix == prefixElement) {
+          var library = import.importedLibrary;
+          if (library != null) {
+            targetUnit = library.definingCompilationUnit;
+            var targetSource = targetUnit.source;
+            try {
+              offset = targetSource.contents.data.length;
+              filePath = targetSource.fullName;
+              prefix = '$eol';
+              suffix = '$eol';
+            } on FileSystemException {
+              // If we can't read the file to get the offset, then we can't
+              // create a fix.
+            }
+            break;
+          }
+        }
+      }
+    }
+    if (offset < 0) {
+      return;
+    }
+    await builder.addFileEdit(filePath, (DartFileEditBuilder builder) {
+      builder.addInsertion(offset, (DartEditBuilder builder) {
+        builder.write(prefix);
+        if (arguments == null) {
+          builder.writeClassDeclaration(className, nameGroupName: 'NAME');
+        } else {
+          builder.writeClassDeclaration(className, nameGroupName: 'NAME',
+              membersWriter: () {
+            builder.write('  ');
+            builder.writeConstructorDeclaration(className,
+                argumentList: arguments,
+                classNameGroupName: 'NAME',
+                isConst: true);
+            builder.writeln();
+          });
+        }
+        builder.write(suffix);
+      });
+      if (prefixElement == null) {
+        builder.addLinkedPosition(range.node(node), 'NAME');
+      }
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateClass newInstance() => CreateClass();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
new file mode 100644
index 0000000..56e71e2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class CreateConstructorForFinalFields extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
+
+  bool get _isNonNullable => unit.featureSet.isEnabled(Feature.non_nullable);
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier || node.parent is! VariableDeclaration) {
+      return;
+    }
+
+    var classDeclaration = node.thisOrAncestorOfType<ClassDeclaration>();
+    if (classDeclaration == null) {
+      return;
+    }
+    var className = classDeclaration.name.name;
+    var superType = classDeclaration.declaredElement.supertype;
+
+    // prepare names of uninitialized final fields
+    var fieldNames = <String>[];
+    for (var member in classDeclaration.members) {
+      if (member is FieldDeclaration) {
+        var variableList = member.fields;
+        if (variableList.isFinal) {
+          fieldNames.addAll(variableList.variables
+              .where((v) => v.initializer == null)
+              .map((v) => v.name.name));
+        }
+      }
+    }
+    // prepare location for a new constructor
+    var targetLocation = utils.prepareNewConstructorLocation(classDeclaration);
+
+    if (flutter.isExactlyStatelessWidgetType(superType) ||
+        flutter.isExactlyStatefulWidgetType(superType)) {
+      // Specialize for Flutter widgets.
+      var keyClass = await sessionHelper.getClass(flutter.widgetsUri, 'Key');
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
+          builder.write(targetLocation.prefix);
+          builder.write('const ');
+          builder.write(className);
+          builder.write('({');
+          builder.writeType(
+            keyClass.instantiate(
+              typeArguments: const [],
+              nullabilitySuffix: _isNonNullable
+                  ? NullabilitySuffix.question
+                  : NullabilitySuffix.star,
+            ),
+          );
+          builder.write(' key');
+
+          var childrenFields = <String>[];
+          for (var fieldName in fieldNames) {
+            if (fieldName == 'child' || fieldName == 'children') {
+              childrenFields.add(fieldName);
+              continue;
+            }
+            builder.write(', this.');
+            builder.write(fieldName);
+          }
+          for (var fieldName in childrenFields) {
+            builder.write(', this.');
+            builder.write(fieldName);
+          }
+
+          builder.write('}) : super(key: key);');
+          builder.write(targetLocation.suffix);
+        });
+      });
+    } else {
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
+          builder.write(targetLocation.prefix);
+          builder.writeConstructorDeclaration(className,
+              fieldNames: fieldNames);
+          builder.write(targetLocation.suffix);
+        });
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateConstructorForFinalFields newInstance() =>
+      CreateConstructorForFinalFields();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
new file mode 100644
index 0000000..d3365c6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class CreateGetter extends CorrectionProducer {
+  String getterName;
+
+  @override
+  List<Object> get fixArguments => [getterName];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_GETTER;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier nameNode = node;
+    getterName = nameNode.name;
+    if (!nameNode.inGetterContext()) {
+      return;
+    }
+    // prepare target
+    Expression target;
+    {
+      var nameParent = nameNode.parent;
+      if (nameParent is PrefixedIdentifier) {
+        target = nameParent.prefix;
+      } else if (nameParent is PropertyAccess) {
+        target = nameParent.realTarget;
+      }
+    }
+    // prepare target element
+    var staticModifier = false;
+    Element targetElement;
+    if (target is ExtensionOverride) {
+      targetElement = target.staticElement;
+    } else if (target is Identifier &&
+        target.staticElement is ExtensionElement) {
+      targetElement = target.staticElement;
+      staticModifier = true;
+    } else if (target != null) {
+      // prepare target interface type
+      var targetType = target.staticType;
+      if (targetType is! InterfaceType) {
+        return;
+      }
+      targetElement = targetType.element;
+      // maybe static
+      if (target is Identifier) {
+        var targetIdentifier = target;
+        var targetElement = targetIdentifier.staticElement;
+        staticModifier = targetElement?.kind == ElementKind.CLASS;
+      }
+    } else {
+      targetElement =
+          getEnclosingClassElement(node) ?? getEnclosingExtensionElement(node);
+      if (targetElement == null) {
+        return;
+      }
+      staticModifier = inStaticContext;
+    }
+    if (targetElement.librarySource.isInSystemLibrary) {
+      return;
+    }
+    // prepare target declaration
+    var targetDeclarationResult =
+        await sessionHelper.getElementDeclaration(targetElement);
+    if (targetDeclarationResult == null) {
+      return;
+    }
+    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+        targetDeclarationResult.node is! ExtensionDeclaration) {
+      return;
+    }
+    CompilationUnitMember targetNode = targetDeclarationResult.node;
+    // prepare location
+    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
+        .prepareNewGetterLocation(targetNode);
+    // build method source
+    var targetSource = targetElement.source;
+    var targetFile = targetSource.fullName;
+    await builder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
+      builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
+        var fieldTypeNode = climbPropertyAccess(nameNode);
+        var fieldType = inferUndefinedExpressionType(fieldTypeNode);
+        builder.write(targetLocation.prefix);
+        builder.writeGetterDeclaration(getterName,
+            isStatic: staticModifier,
+            nameGroupName: 'NAME',
+            returnType: fieldType,
+            returnTypeGroupName: 'TYPE');
+        builder.write(targetLocation.suffix);
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateGetter newInstance() => CreateGetter();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
new file mode 100644
index 0000000..5528f79
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_local_variable.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2020, 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:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class CreateLocalVariable extends CorrectionProducer {
+  String variableName;
+
+  @override
+  List<Object> get fixArguments => [variableName];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_LOCAL_VARIABLE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier nameNode = node;
+    variableName = nameNode.name;
+    // if variable is assigned, convert assignment into declaration
+    if (node.parent is AssignmentExpression) {
+      AssignmentExpression assignment = node.parent;
+      if (assignment.leftHandSide == node &&
+          assignment.operator.type == TokenType.EQ &&
+          assignment.parent is ExpressionStatement) {
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addSimpleInsertion(node.offset, 'var ');
+        });
+        return;
+      }
+    }
+    // prepare target Statement
+    var target = node.thisOrAncestorOfType<Statement>();
+    if (target == null) {
+      return;
+    }
+    var prefix = utils.getNodePrefix(target);
+    // compute type
+    var type = inferUndefinedExpressionType(node);
+    if (!(type == null || type is InterfaceType || type is FunctionType)) {
+      return;
+    }
+    // build variable declaration source
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addInsertion(target.offset, (DartEditBuilder builder) {
+        builder.writeLocalVariableDeclaration(variableName,
+            nameGroupName: 'NAME', type: type, typeGroupName: 'TYPE');
+        builder.write(eol);
+        builder.write(prefix);
+      });
+      builder.addLinkedPosition(range.node(node), 'NAME');
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateLocalVariable newInstance() => CreateLocalVariable();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
new file mode 100644
index 0000000..b5f45d2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_missing_overrides.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/utilities/strings.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/error/inheritance_override.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart' show Position;
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class CreateMissingOverrides extends CorrectionProducer {
+  int numElements;
+
+  @override
+  List<Object> get fixArguments => [numElements];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_MISSING_OVERRIDES;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node.parent is! ClassDeclaration) {
+      return;
+    }
+    var targetClass = node.parent as ClassDeclaration;
+    var targetClassElement = targetClass.declaredElement;
+    utils.targetClassElement = targetClassElement;
+    var signatures =
+        InheritanceOverrideVerifier.missingOverrides(targetClass).toList();
+    // sort by name, getters before setters
+    signatures.sort((ExecutableElement a, ExecutableElement b) {
+      var names = compareStrings(a.displayName, b.displayName);
+      if (names != 0) {
+        return names;
+      }
+      if (a.kind == ElementKind.GETTER) {
+        return -1;
+      }
+      return 1;
+    });
+    numElements = signatures.length;
+
+    var location =
+        utils.prepareNewClassMemberLocation(targetClass, (_) => true);
+
+    var prefix = utils.getIndent(1);
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addInsertion(location.offset, (DartEditBuilder builder) {
+        // Separator management.
+        var numOfMembersWritten = 0;
+        void addSeparatorBetweenDeclarations() {
+          if (numOfMembersWritten == 0) {
+            builder.write(location.prefix);
+          } else {
+            builder.write(eol); // after the previous member
+            builder.write(eol); // empty line separator
+            builder.write(prefix);
+          }
+          numOfMembersWritten++;
+        }
+
+        // merge getter/setter pairs into fields
+        for (var i = 0; i < signatures.length; i++) {
+          var element = signatures[i];
+          if (element.kind == ElementKind.GETTER && i + 1 < signatures.length) {
+            var nextElement = signatures[i + 1];
+            if (nextElement.kind == ElementKind.SETTER) {
+              // remove this and the next elements, adjust iterator
+              signatures.removeAt(i + 1);
+              signatures.removeAt(i);
+              i--;
+              numElements--;
+              // separator
+              addSeparatorBetweenDeclarations();
+              // @override
+              builder.write('@override');
+              builder.write(eol);
+              // add field
+              builder.write(prefix);
+              builder.writeType(element.returnType, required: true);
+              builder.write(' ');
+              builder.write(element.name);
+              builder.write(';');
+            }
+          }
+        }
+        // add elements
+        for (var element in signatures) {
+          addSeparatorBetweenDeclarations();
+          builder.writeOverride(element);
+        }
+        builder.write(location.suffix);
+      });
+    });
+    builder.setSelection(Position(file, location.offset));
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateMissingOverrides newInstance() => CreateMissingOverrides();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
new file mode 100644
index 0000000..370e086
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class CreateMixin extends CorrectionProducer {
+  String mixinName;
+
+  @override
+  List<Object> get fixArguments => [mixinName];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_MIXIN;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    Element prefixElement;
+    SimpleIdentifier nameNode;
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+      if (parent is TypeName &&
+          parent.parent is ConstructorName &&
+          parent.parent.parent is InstanceCreationExpression) {
+        return;
+      } else {
+        nameNode = node;
+        mixinName = nameNode.name;
+      }
+    } else if (node is PrefixedIdentifier) {
+      if (node.parent is InstanceCreationExpression) {
+        return;
+      }
+      PrefixedIdentifier prefixedIdentifier = node;
+      prefixElement = prefixedIdentifier.prefix.staticElement;
+      if (prefixElement == null) {
+        return;
+      }
+      nameNode = prefixedIdentifier.identifier;
+      mixinName = prefixedIdentifier.identifier.name;
+    } else {
+      return;
+    }
+    if (!mightBeTypeIdentifier(nameNode)) {
+      return;
+    }
+    // prepare environment
+    Element targetUnit;
+    var prefix = '';
+    var suffix = '';
+    var offset = -1;
+    String filePath;
+    if (prefixElement == null) {
+      targetUnit = unit.declaredElement;
+      var enclosingMember = node.thisOrAncestorMatching((node) =>
+          node is CompilationUnitMember && node.parent is CompilationUnit);
+      if (enclosingMember == null) {
+        return;
+      }
+      offset = enclosingMember.end;
+      filePath = file;
+      prefix = '$eol$eol';
+    } else {
+      for (var import in libraryElement.imports) {
+        if (prefixElement is PrefixElement && import.prefix == prefixElement) {
+          var library = import.importedLibrary;
+          if (library != null) {
+            targetUnit = library.definingCompilationUnit;
+            var targetSource = targetUnit.source;
+            try {
+              offset = targetSource.contents.data.length;
+              filePath = targetSource.fullName;
+              prefix = '$eol';
+              suffix = '$eol';
+            } on FileSystemException {
+              // If we can't read the file to get the offset, then we can't
+              // create a fix.
+            }
+            break;
+          }
+        }
+      }
+    }
+    if (offset < 0) {
+      return;
+    }
+    await builder.addFileEdit(filePath, (DartFileEditBuilder builder) {
+      builder.addInsertion(offset, (DartEditBuilder builder) {
+        builder.write(prefix);
+        builder.writeMixinDeclaration(mixinName, nameGroupName: 'NAME');
+        builder.write(suffix);
+      });
+      if (prefixElement == null) {
+        builder.addLinkedPosition(range.node(node), 'NAME');
+      }
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateMixin newInstance() => CreateMixin();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
new file mode 100644
index 0000000..53174e0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_no_such_method.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class CreateNoSuchMethod extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_NO_SUCH_METHOD;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node.parent is! ClassDeclaration) {
+      return;
+    }
+    var targetClass = node.parent as ClassDeclaration;
+    // prepare environment
+    var prefix = utils.getIndent(1);
+    var insertOffset = targetClass.end - 1;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addInsertion(insertOffset, (DartEditBuilder builder) {
+        builder.selectHere();
+        // insert empty line before existing member
+        if (targetClass.members.isNotEmpty) {
+          builder.write(eol);
+        }
+        // append method
+        builder.write(prefix);
+        builder.write(
+            'noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);');
+        builder.write(eol);
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateNoSuchMethod newInstance() => CreateNoSuchMethod();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
new file mode 100644
index 0000000..e7ddc3d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class CreateSetter extends CorrectionProducer {
+  String setterName;
+
+  @override
+  List<Object> get fixArguments => [setterName];
+
+  @override
+  FixKind get fixKind => DartFixKind.CREATE_SETTER;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier nameNode = node;
+    if (!nameNode.inSetterContext()) {
+      return;
+    }
+    // prepare target
+    Expression target;
+    {
+      var nameParent = nameNode.parent;
+      if (nameParent is PrefixedIdentifier) {
+        target = nameParent.prefix;
+      } else if (nameParent is PropertyAccess) {
+        target = nameParent.realTarget;
+      }
+    }
+    // prepare target element
+    var staticModifier = false;
+    Element targetElement;
+    if (target is ExtensionOverride) {
+      targetElement = target.staticElement;
+    } else if (target is Identifier &&
+        target.staticElement is ExtensionElement) {
+      targetElement = target.staticElement;
+      staticModifier = true;
+    } else if (target != null) {
+      // prepare target interface type
+      var targetType = target.staticType;
+      if (targetType is! InterfaceType) {
+        return;
+      }
+      targetElement = targetType.element;
+      // maybe static
+      if (target is Identifier) {
+        var targetIdentifier = target;
+        var targetElement = targetIdentifier.staticElement;
+        staticModifier = targetElement?.kind == ElementKind.CLASS;
+      }
+    } else {
+      targetElement =
+          getEnclosingClassElement(node) ?? getEnclosingExtensionElement(node);
+      if (targetElement == null) {
+        return;
+      }
+      staticModifier = inStaticContext;
+    }
+    if (targetElement.librarySource.isInSystemLibrary) {
+      return;
+    }
+    // prepare target declaration
+    var targetDeclarationResult =
+        await sessionHelper.getElementDeclaration(targetElement);
+    if (targetDeclarationResult == null) {
+      return;
+    }
+    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
+        targetDeclarationResult.node is! ExtensionDeclaration) {
+      return;
+    }
+    CompilationUnitMember targetNode = targetDeclarationResult.node;
+    // prepare location
+    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
+        .prepareNewGetterLocation(targetNode); // Rename to "AccessorLocation"
+    // build method source
+    var targetSource = targetElement.source;
+    var targetFile = targetSource.fullName;
+    setterName = nameNode.name;
+    await builder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
+      builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
+        var parameterTypeNode = climbPropertyAccess(nameNode);
+        var parameterType = inferUndefinedExpressionType(parameterTypeNode);
+        builder.write(targetLocation.prefix);
+        builder.writeSetterDeclaration(setterName,
+            isStatic: staticModifier,
+            nameGroupName: 'NAME',
+            parameterType: parameterType,
+            parameterTypeGroupName: 'TYPE');
+        builder.write(targetLocation.suffix);
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static CreateSetter newInstance() => CreateSetter();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
index c04eceb..7c6a269 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/exchange_operands.dart
@@ -63,4 +63,7 @@
       }
     });
   }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ExchangeOperands newInstance() => ExchangeOperands();
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
new file mode 100644
index 0000000..cc3c82c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/extend_class_for_mixin.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class ExtendClassForMixin extends CorrectionProducer {
+  String typeName;
+
+  @override
+  List<Object> get fixArguments => [typeName];
+
+  @override
+  FixKind get fixKind => DartFixKind.EXTEND_CLASS_FOR_MIXIN;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var declaration = node.thisOrAncestorOfType<ClassDeclaration>();
+    if (declaration != null && declaration.extendsClause == null) {
+      // TODO(brianwilkerson) Find a way to pass in the name of the class
+      //  without needing to parse the message.
+      var message = diagnostic.problemMessage.message;
+      var endIndex = message.lastIndexOf("'");
+      var startIndex = message.lastIndexOf("'", endIndex - 1) + 1;
+      typeName = message.substring(startIndex, endIndex);
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleInsertion(
+            declaration.typeParameters?.end ?? declaration.name.end,
+            ' extends $typeName');
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ExtendClassForMixin newInstance() => ExtendClassForMixin();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
new file mode 100644
index 0000000..caa2555
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/insert_semicolon.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class InsertSemicolon extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.INSERT_SEMICOLON;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var message = diagnostic.problemMessage;
+    if (message.message.contains("';'")) {
+      if (_isAwaitNode()) {
+        return;
+      }
+      var insertOffset = message.offset + message.length;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleInsertion(insertOffset, ';');
+      });
+    }
+  }
+
+  bool _isAwaitNode() {
+    var node = this.node;
+    return node is SimpleIdentifier && node.name == 'await';
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static InsertSemicolon newInstance() => InsertSemicolon();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart
new file mode 100644
index 0000000..21ef3b5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_class_abstract.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class MakeClassAbstract extends CorrectionProducer {
+  String className;
+
+  @override
+  List<Object> get fixArguments => [className];
+
+  @override
+  FixKind get fixKind => DartFixKind.MAKE_CLASS_ABSTRACT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var enclosingClass = node.thisOrAncestorOfType<ClassDeclaration>();
+    if (enclosingClass == null) {
+      return;
+    }
+    className = enclosingClass.name.name;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleInsertion(
+          enclosingClass.classKeyword.offset, 'abstract ');
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static MakeClassAbstract newInstance() => MakeClassAbstract();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
new file mode 100644
index 0000000..7ea72f1
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class MakeFieldNotFinal extends CorrectionProducer {
+  String fieldName;
+
+  @override
+  List<Object> get fixArguments => [fieldName];
+
+  @override
+  FixKind get fixKind => DartFixKind.MAKE_FIELD_NOT_FINAL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is SimpleIdentifier &&
+        node.staticElement is PropertyAccessorElement) {
+      PropertyAccessorElement getter = node.staticElement;
+      if (getter.isGetter &&
+          getter.isSynthetic &&
+          !getter.variable.isSynthetic &&
+          getter.variable.setter == null &&
+          getter.enclosingElement is ClassElement) {
+        var declarationResult =
+            await sessionHelper.getElementDeclaration(getter.variable);
+        var variable = declarationResult.node;
+        if (variable is VariableDeclaration &&
+            variable.parent is VariableDeclarationList &&
+            variable.parent.parent is FieldDeclaration) {
+          VariableDeclarationList declarationList = variable.parent;
+          var keywordToken = declarationList.keyword;
+          if (declarationList.variables.length == 1 &&
+              keywordToken.keyword == Keyword.FINAL) {
+            await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+              if (declarationList.type != null) {
+                builder.addReplacement(
+                    range.startStart(keywordToken, declarationList.type),
+                    (DartEditBuilder builder) {});
+              } else {
+                builder.addReplacement(range.startStart(keywordToken, variable),
+                    (DartEditBuilder builder) {
+                  builder.write('var ');
+                });
+              }
+            });
+            fieldName = getter.variable.displayName;
+          }
+        }
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static MakeFieldNotFinal newInstance() => MakeFieldNotFinal();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_variable_not_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_not_final.dart
new file mode 100644
index 0000000..7679185
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_not_final.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class MakeVariableNotFinal extends CorrectionProducer {
+  String _variableName;
+
+  @override
+  List<Object> get fixArguments => [_variableName];
+
+  @override
+  FixKind get fixKind => DartFixKind.MAKE_VARIABLE_NOT_FINAL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var node = this.node;
+    if (node is SimpleIdentifier &&
+        node.staticElement is LocalVariableElement) {
+      LocalVariableElement variable = node.staticElement;
+      var id = NodeLocator(variable.nameOffset).searchWithin(unit);
+      var decl = id?.parent;
+      if (decl is VariableDeclaration &&
+          decl.parent is VariableDeclarationList) {
+        VariableDeclarationList declarationList = decl.parent;
+        var keywordToken = declarationList.keyword;
+        if (declarationList.variables.length == 1 &&
+            keywordToken.keyword == Keyword.FINAL) {
+          await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+            if (declarationList.type != null) {
+              builder.addDeletion(
+                  range.startStart(keywordToken, declarationList.type));
+            } else {
+              builder.addSimpleReplacement(range.token(keywordToken), 'var');
+            }
+          });
+          declarationList.variables[0].name.name;
+          _variableName = declarationList.variables[0].name.name;
+        }
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static MakeVariableNotFinal newInstance() => MakeVariableNotFinal();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
new file mode 100644
index 0000000..05a35e3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class MoveTypeArgumentsToClass extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is TypeArgumentList) {
+      TypeArgumentList typeArguments = coveredNode;
+      if (typeArguments.parent is! InstanceCreationExpression) {
+        return;
+      }
+      InstanceCreationExpression creation = typeArguments.parent;
+      var typeName = creation.constructorName.type;
+      if (typeName.typeArguments != null) {
+        return;
+      }
+      var element = typeName.type.element;
+      if (element is ClassElement &&
+          element.typeParameters != null &&
+          element.typeParameters.length == typeArguments.arguments.length) {
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          var argumentText = utils.getNodeText(typeArguments);
+          builder.addSimpleInsertion(typeName.end, argumentText);
+          builder.addDeletion(range.node(typeArguments));
+        });
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static MoveTypeArgumentsToClass newInstance() => MoveTypeArgumentsToClass();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart
new file mode 100644
index 0000000..5cb54ce
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/qualify_reference.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class QualifyReference extends CorrectionProducer {
+  String _qualifiedName;
+
+  @override
+  List<Object> get fixArguments => [_qualifiedName];
+
+  @override
+  FixKind get fixKind => DartFixKind.QUALIFY_REFERENCE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    SimpleIdentifier memberName = node;
+    var parent = node.parent;
+    AstNode target;
+    if (parent is MethodInvocation && node == parent.methodName) {
+      target = parent.target;
+    } else if (parent is PropertyAccess && node == parent.propertyName) {
+      target = parent.target;
+    }
+    if (target != null) {
+      return;
+    }
+    var enclosingElement = memberName.staticElement.enclosingElement;
+    if (enclosingElement.library != libraryElement) {
+      // TODO(brianwilkerson) Support qualifying references to members defined
+      //  in other libraries. `DartEditBuilder` currently defines the method
+      //  `writeType`, which is close, but we also need to handle extensions,
+      //  which don't have a type.
+      return;
+    }
+    var containerName = enclosingElement.name;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleInsertion(node.offset, '$containerName.');
+    });
+    _qualifiedName = '$containerName.${memberName.name}';
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static QualifyReference newInstance() => QualifyReference();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart
new file mode 100644
index 0000000..c6e79ef
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_annotation.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveAnnotation extends CorrectionProducer {
+  String _annotationName;
+
+  @override
+  List<Object> get fixArguments => [_annotationName];
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_ANNOTATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    void addFix(Annotation node) async {
+      if (node == null) {
+        return;
+      }
+      var followingToken = node.endToken.next;
+      followingToken = followingToken.precedingComments ?? followingToken;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.startStart(node, followingToken));
+      });
+      _annotationName = node.name.name;
+    }
+
+    Annotation findAnnotation(
+        NodeList<Annotation> metadata, String targetName) {
+      return metadata.firstWhere(
+          (annotation) => annotation.name.name == targetName,
+          orElse: () => null);
+    }
+
+    var node = coveredNode;
+    if (node is Annotation) {
+      await addFix(node);
+    } else if (node is DefaultFormalParameter) {
+      await addFix(findAnnotation(node.parameter.metadata, 'required'));
+    } else if (node is NormalFormalParameter) {
+      await addFix(findAnnotation(node.metadata, 'required'));
+    } else if (node is DeclaredSimpleIdentifier) {
+      var parent = node.parent;
+      if (parent is MethodDeclaration) {
+        await addFix(findAnnotation(parent.metadata, 'override'));
+      } else if (parent is VariableDeclaration) {
+        var fieldDeclaration = parent.thisOrAncestorOfType<FieldDeclaration>();
+        if (fieldDeclaration != null) {
+          await addFix(findAnnotation(fieldDeclaration.metadata, 'override'));
+        }
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveAnnotation newInstance() => RemoveAnnotation();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart
new file mode 100644
index 0000000..94cc3a2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveDeadCode extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_DEAD_CODE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var coveringNode = coveredNode;
+    if (coveringNode is Expression) {
+      var parent = coveredNode.parent;
+      if (parent is BinaryExpression) {
+        if (parent.rightOperand == coveredNode) {
+          await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+            builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode));
+          });
+        }
+      }
+    } else if (coveringNode is Block) {
+      var block = coveringNode;
+      var statementsToRemove = <Statement>[];
+      var problemMessage = diagnostic.problemMessage;
+      var errorRange =
+          SourceRange(problemMessage.offset, problemMessage.length);
+      for (var statement in block.statements) {
+        if (range.node(statement).intersects(errorRange)) {
+          statementsToRemove.add(statement);
+        }
+      }
+      if (statementsToRemove.isNotEmpty) {
+        var rangeToRemove = utils.getLinesRangeStatements(statementsToRemove);
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addDeletion(rangeToRemove);
+        });
+      }
+    } else if (coveringNode is Statement) {
+      var rangeToRemove =
+          utils.getLinesRangeStatements(<Statement>[coveringNode]);
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(rangeToRemove);
+      });
+    } else if (coveringNode is CatchClause) {
+      TryStatement tryStatement = coveringNode.parent;
+      var catchClauses = tryStatement.catchClauses;
+      var index = catchClauses.indexOf(coveringNode);
+      var previous = index == 0 ? tryStatement.body : catchClauses[index - 1];
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.endEnd(previous, coveringNode));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveDeadCode newInstance() => RemoveDeadCode();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart
new file mode 100644
index 0000000..0b44db3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_name_from_combinator.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveNameFromCombinator extends CorrectionProducer {
+  String _combinatorKind;
+
+  @override
+  List<Object> get fixArguments => [_combinatorKind];
+
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_NAME_FROM_COMBINATOR;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    SourceRange rangeForCombinator(Combinator combinator) {
+      var parent = combinator.parent;
+      if (parent is NamespaceDirective) {
+        var combinators = parent.combinators;
+        if (combinators.length == 1) {
+          var previousToken =
+              combinator.parent.findPrevious(combinator.beginToken);
+          if (previousToken != null) {
+            return range.endEnd(previousToken, combinator);
+          }
+          return null;
+        }
+        var index = combinators.indexOf(combinator);
+        if (index < 0) {
+          return null;
+        } else if (index == combinators.length - 1) {
+          return range.endEnd(combinators[index - 1], combinator);
+        }
+        return range.startStart(combinator, combinators[index + 1]);
+      }
+      return null;
+    }
+
+    SourceRange rangeForNameInCombinator(
+        Combinator combinator, SimpleIdentifier name) {
+      NodeList<SimpleIdentifier> names;
+      if (combinator is HideCombinator) {
+        names = combinator.hiddenNames;
+      } else if (combinator is ShowCombinator) {
+        names = combinator.shownNames;
+      } else {
+        return null;
+      }
+      if (names.length == 1) {
+        return rangeForCombinator(combinator);
+      }
+      var index = names.indexOf(name);
+      if (index < 0) {
+        return null;
+      } else if (index == names.length - 1) {
+        return range.endEnd(names[index - 1], name);
+      }
+      return range.startStart(name, names[index + 1]);
+    }
+
+    var node = coveredNode;
+    if (node is SimpleIdentifier) {
+      var parent = coveredNode.parent;
+      if (parent is Combinator) {
+        var rangeToRemove = rangeForNameInCombinator(parent, node);
+        if (rangeToRemove == null) {
+          return;
+        }
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addDeletion(rangeToRemove);
+        });
+        _combinatorKind = parent is HideCombinator ? 'hide' : 'show';
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveNameFromCombinator newInstance() => RemoveNameFromCombinator();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
new file mode 100644
index 0000000..8112a2e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveParametersInGetterDeclaration extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is MethodDeclaration) {
+      // Support for the analyzer error.
+      var method = node as MethodDeclaration;
+      var name = method.name;
+      var body = method.body;
+      if (name != null && body != null) {
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addSimpleReplacement(range.endStart(name, body), ' ');
+        });
+      }
+    } else if (node is FormalParameterList) {
+      // Support for the fasta error.
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.node(node));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveParametersInGetterDeclaration newInstance() =>
+      RemoveParametersInGetterDeclaration();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart
new file mode 100644
index 0000000..20ec8de
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveParenthesesInGetterInvocation extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    var invocation = coveredNode?.parent;
+    if (invocation is FunctionExpressionInvocation) {
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.node(invocation.argumentList));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveParenthesesInGetterInvocation newInstance() =>
+      RemoveParenthesesInGetterInvocation();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
index 923891d..aa4f045 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_annotation.dart
@@ -20,24 +20,19 @@
 
   @override
   Future<void> compute(DartChangeBuilder builder) async {
-    var parameter = node.thisOrAncestorOfType<FormalParameter>();
-    if (parameter is SimpleFormalParameter) {
-      var type = parameter.type;
-      if (type != null) {
-        return _removeTypeAnnotation(builder, type);
+    for (var node = this.node; node != null; node = node.parent) {
+      if (node is DeclaredIdentifier) {
+        return _removeFromDeclaredIdentifier(builder, node);
       }
-    }
-    var declarationList = node.thisOrAncestorOfType<VariableDeclarationList>();
-    if (declarationList != null) {
-      return _removeFromDeclarationList(builder, declarationList);
-    }
-    var declaredIdentifier = node.thisOrAncestorOfType<DeclaredIdentifier>();
-    if (declaredIdentifier != null) {
-      return _removeFromDeclaredIdentifier(builder, declaredIdentifier);
-    }
-    var type = node.thisOrAncestorOfType<TypeAnnotation>();
-    if (type != null) {
-      return _removeTypeAnnotation(builder, type);
+      if (node is SimpleFormalParameter) {
+        return _removeTypeAnnotation(builder, node.type);
+      }
+      if (node is TypeAnnotation && diagnostic != null) {
+        return _removeTypeAnnotation(builder, node);
+      }
+      if (node is VariableDeclarationList) {
+        return _removeFromDeclarationList(builder, node);
+      }
     }
   }
 
@@ -94,6 +89,10 @@
 
   Future<void> _removeTypeAnnotation(
       DartChangeBuilder builder, TypeAnnotation type) async {
+    if (type == null) {
+      return;
+    }
+
     await builder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(range.startStart(type, type.endToken.next));
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_type_arguments.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_arguments.dart
new file mode 100644
index 0000000..e47e502
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_type_arguments.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveTypeArguments extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_TYPE_ARGUMENTS;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is TypeArgumentList) {
+      TypeArgumentList typeArguments = coveredNode;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.node(typeArguments));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveTypeArguments newInstance() => RemoveTypeArguments();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unnecessary_cast.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unnecessary_cast.dart
new file mode 100644
index 0000000..c3a26c0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unnecessary_cast.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnnecessaryCast extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNNECESSARY_CAST;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is! AsExpression) {
+      return;
+    }
+    var asExpression = coveredNode as AsExpression;
+    var expression = asExpression.expression;
+    // remove 'as T' from 'e as T'
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addDeletion(range.endEnd(expression, asExpression));
+      builder.removeEnclosingParentheses(asExpression);
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnnecessaryCast newInstance() => RemoveUnnecessaryCast();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_clause.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_clause.dart
new file mode 100644
index 0000000..f783e62
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_clause.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnusedCatchClause extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is SimpleIdentifier) {
+      var catchClause = node.parent;
+      if (catchClause is CatchClause &&
+          catchClause.exceptionParameter == node) {
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder.addDeletion(
+              range.startStart(catchClause.catchKeyword, catchClause.body));
+        });
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnusedCatchClause newInstance() => RemoveUnusedCatchClause();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_stack.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_stack.dart
new file mode 100644
index 0000000..0f43ef3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_catch_stack.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnusedCatchStack extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_CATCH_STACK;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is SimpleIdentifier) {
+      var catchClause = node.parent;
+      if (catchClause is CatchClause &&
+          catchClause.stackTraceParameter == node &&
+          catchClause.exceptionParameter != null) {
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          builder
+              .addDeletion(range.endEnd(catchClause.exceptionParameter, node));
+        });
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnusedCatchStack newInstance() => RemoveUnusedCatchStack();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart
new file mode 100644
index 0000000..7a007a9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_import.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnusedImport extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_IMPORT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    // prepare ImportDirective
+    var importDirective = node.thisOrAncestorOfType<ImportDirective>();
+    if (importDirective == null) {
+      return;
+    }
+    // remove the whole line with import
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addDeletion(utils.getLinesRange(range.node(importDirective)));
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnusedImport newInstance() => RemoveUnusedImport();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart
new file mode 100644
index 0000000..69675fd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_label.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnusedLabel extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_LABEL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is Label) {
+      var nextToken = node.endToken.next;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addDeletion(range.startStart(node, nextToken));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnusedLabel newInstance() => RemoveUnusedLabel();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
new file mode 100644
index 0000000..15cab104
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveUnusedParameter extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_PARAMETER;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is FormalParameter) {
+      var parameter = node as FormalParameter;
+      var parameterList = parameter.parent as FormalParameterList;
+      var parameters = parameterList.parameters;
+      var index = parameters.indexOf(parameter);
+      await builder.addFileEdit(file, (builder) {
+        if (index == 0) {
+          // Remove the first parameter in the list.
+          if (parameters.length == 1) {
+            // There is only one parameter. By removing everything inside the
+            // parentheses we also remove any square brackets or curly braces.
+            builder.addDeletion(range.endStart(
+                parameterList.leftParenthesis, parameterList.rightParenthesis));
+          } else {
+            var following = parameters[1];
+            if (parameter.isRequiredPositional &&
+                !following.isRequiredPositional) {
+              // The parameter to be removed and the following parameter are not
+              // of the same kind, so there is a delimiter between them that we
+              // can't delete.
+              builder.addDeletion(
+                  range.startStart(parameter, parameterList.leftDelimiter));
+            } else {
+              // The parameter to be removed and the following parameter are of
+              // the same kind, so there is no delimiter between them.
+              builder.addDeletion(range.startStart(parameter, following));
+            }
+          }
+        } else {
+          var preceding = parameters[index - 1];
+          if (preceding.isRequiredPositional &&
+              !parameter.isRequiredPositional) {
+            // The parameter to be removed and the preceding parameter are not
+            // of the same kind, so there is a delimiter between them.
+            if (index == parameters.length - 1) {
+              // The parameter to be removed is the only parameter between the
+              // delimiters, so remove the delimiters with the parameter.
+              var trailingToken = parameterList.rightParenthesis;
+              if (trailingToken.previous.type == TokenType.COMMA) {
+                // Leave the trailing comma if there is one.
+                trailingToken = trailingToken.previous;
+              }
+              builder.addDeletion(range.endStart(preceding, trailingToken));
+            } else {
+              // The parameter to be removed is the first inside the delimiters
+              // but the delimiters should be left.
+              var following = parameters[index + 1];
+              builder.addDeletion(range.startStart(parameter, following));
+            }
+          } else {
+            // The parameter to be removed and the preceding parameter are of
+            // the same kind, so there is no delimiter between them.
+            builder.addDeletion(range.endEnd(preceding, parameter));
+          }
+        }
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveUnusedParameter newInstance() => RemoveUnusedParameter();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
new file mode 100644
index 0000000..a133a81
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class ReplaceReturnTypeFuture extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_RETURN_TYPE_FUTURE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    // prepare the existing type
+    var typeName = node.thisOrAncestorOfType<TypeAnnotation>();
+    var typeProvider = this.typeProvider;
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.replaceTypeWithFuture(typeName, typeProvider);
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ReplaceReturnTypeFuture newInstance() => ReplaceReturnTypeFuture();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart
new file mode 100644
index 0000000..a52370f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ReplaceWithExtensionName extends CorrectionProducer {
+  String _extensionName;
+
+  @override
+  List<Object> get fixArguments => [_extensionName];
+
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_WITH_EXTENSION_NAME;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (node is! SimpleIdentifier) {
+      return;
+    }
+    var target = _getTarget(node.parent);
+    if (target is ExtensionOverride) {
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(
+            range.node(target), utils.getNodeText(target.extensionName));
+      });
+      _extensionName = target.extensionName.name;
+    }
+  }
+
+  AstNode _getTarget(AstNode invocation) {
+    if (invocation is MethodInvocation && node == invocation.methodName) {
+      return invocation.target;
+    } else if (invocation is PropertyAccess &&
+        node == invocation.propertyName) {
+      return invocation.target;
+    }
+    return null;
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ReplaceWithExtensionName newInstance() => ReplaceWithExtensionName();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
index 54306ba..31b6a19 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
@@ -100,6 +100,9 @@
     }
     return null;
   }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ShadowField newInstance() => ShadowField();
 }
 
 /// A utility that will find any references to a setter within an AST structure.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart b/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart
index 3fdefb9..c4fa305 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart
@@ -97,4 +97,7 @@
       }
     });
   }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static SplitAndCondition newInstance() => SplitAndCondition();
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart
new file mode 100644
index 0000000..c73a6e6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class UseConst extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.USE_CONST;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is InstanceCreationExpression) {
+      var instanceCreation = coveredNode as InstanceCreationExpression;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        if (instanceCreation.keyword == null) {
+          builder.addSimpleInsertion(
+              instanceCreation.constructorName.offset, 'const');
+        } else {
+          builder.addSimpleReplacement(
+              range.token(instanceCreation.keyword), 'const');
+        }
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static UseConst newInstance() => UseConst();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart
new file mode 100644
index 0000000..97a1d2a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class UseEffectiveIntegerDivision extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    for (var n = node; n != null; n = n.parent) {
+      if (n is MethodInvocation &&
+          n.offset == errorOffset &&
+          n.length == errorLength) {
+        var target = (n as MethodInvocation).target.unParenthesized;
+        await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+          // replace "/" with "~/"
+          var binary = target as BinaryExpression;
+          builder.addSimpleReplacement(range.token(binary.operator), '~/');
+          // remove everything before and after
+          builder.addDeletion(range.startStart(n, binary.leftOperand));
+          builder.addDeletion(range.endEnd(binary.rightOperand, n));
+        });
+        // done
+        break;
+      }
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static UseEffectiveIntegerDivision newInstance() =>
+      UseEffectiveIntegerDivision();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart
new file mode 100644
index 0000000..c51598e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class UseEqEqNull extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.USE_EQ_EQ_NULL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is IsExpression) {
+      var isExpression = coveredNode as IsExpression;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder
+            .addReplacement(range.endEnd(isExpression.expression, isExpression),
+                (DartEditBuilder builder) {
+          builder.write(' == null');
+        });
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static UseEqEqNull newInstance() => UseEqEqNull();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart
new file mode 100644
index 0000000..f699074
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class UseNotEqNull extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.USE_NOT_EQ_NULL;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    if (coveredNode is IsExpression) {
+      var isExpression = coveredNode as IsExpression;
+      await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder
+            .addReplacement(range.endEnd(isExpression.expression, isExpression),
+                (DartEditBuilder builder) {
+          builder.write(' != null');
+        });
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static UseNotEqNull newInstance() => UseNotEqNull();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart b/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
index 522ca6d..6ced314 100644
--- a/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/executable_parameters.dart
@@ -25,7 +25,7 @@
     if (invocation is Annotation) {
       element = invocation.element;
     } else if (invocation is InstanceCreationExpression) {
-      element = invocation.staticElement;
+      element = invocation.constructorName.staticElement;
     } else if (invocation is MethodInvocation) {
       element = invocation.methodName.staticElement;
     } else if (invocation is ConstructorReferenceNode) {
@@ -58,7 +58,8 @@
     return named.map((parameter) => parameter.name).toList();
   }
 
-  /// Return the [FormalParameterList] of the [executable], or `nul be found.
+  /// Return the [FormalParameterList] of the [executable], or `null` if it
+  /// can't be found.
   Future<FormalParameterList> getParameterList() async {
     var result = await sessionHelper.getElementDeclaration(executable);
     var targetDeclaration = result.node;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 8411deb..c1caa95 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -394,6 +394,8 @@
       'dart.fix.remove.unusedLocalVariable',
       50,
       'Remove unused local variable');
+  static const REMOVE_UNUSED_PARAMETER = FixKind(
+      'dart.fix.remove.unusedParameter', 50, 'Remove the unused parameter');
   static const RENAME_TO_CAMEL_CASE =
       FixKind('dart.fix.rename.toCamelCase', 50, "Rename to '{0}'");
   static const REPLACE_BOOLEAN_WITH_BOOL = FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 131e355..ee81b66 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:core';
-import 'dart:math' as math;
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
@@ -18,7 +17,9 @@
 import 'package:analysis_server/src/services/correction/dart/add_explicit_cast.dart';
 import 'package:analysis_server/src/services/correction/dart/add_field_formal_parameters.dart';
 import 'package:analysis_server/src/services/correction/dart/add_missing_enum_case_clauses.dart';
+import 'package:analysis_server/src/services/correction/dart/add_missing_parameter_named.dart';
 import 'package:analysis_server/src/services/correction/dart/add_missing_required_argument.dart';
+import 'package:analysis_server/src/services/correction/dart/add_ne_null.dart';
 import 'package:analysis_server/src/services/correction/dart/add_override.dart';
 import 'package:analysis_server/src/services/correction/dart/add_required.dart';
 import 'package:analysis_server/src/services/correction/dart/add_required_keyword.dart';
@@ -27,6 +28,7 @@
 import 'package:analysis_server/src/services/correction/dart/add_type_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/change_argument_name.dart';
 import 'package:analysis_server/src/services/correction/dart/change_to_nearest_precise_value.dart';
+import 'package:analysis_server/src/services/correction/dart/change_to_static_access.dart';
 import 'package:analysis_server/src/services/correction/dart/change_type_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
@@ -49,13 +51,30 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_relative_import.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_set_literal.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_where_type.dart';
+import 'package:analysis_server/src/services/correction/dart/create_class.dart';
+import 'package:analysis_server/src/services/correction/dart/create_constructor_for_final_fields.dart';
+import 'package:analysis_server/src/services/correction/dart/create_getter.dart';
+import 'package:analysis_server/src/services/correction/dart/create_local_variable.dart';
 import 'package:analysis_server/src/services/correction/dart/create_method.dart';
+import 'package:analysis_server/src/services/correction/dart/create_missing_overrides.dart';
+import 'package:analysis_server/src/services/correction/dart/create_mixin.dart';
+import 'package:analysis_server/src/services/correction/dart/create_no_such_method.dart';
+import 'package:analysis_server/src/services/correction/dart/create_setter.dart';
+import 'package:analysis_server/src/services/correction/dart/extend_class_for_mixin.dart';
 import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
 import 'package:analysis_server/src/services/correction/dart/inline_typedef.dart';
+import 'package:analysis_server/src/services/correction/dart/insert_semicolon.dart';
+import 'package:analysis_server/src/services/correction/dart/make_class_abstract.dart';
+import 'package:analysis_server/src/services/correction/dart/make_field_not_final.dart';
 import 'package:analysis_server/src/services/correction/dart/make_final.dart';
+import 'package:analysis_server/src/services/correction/dart/make_variable_not_final.dart';
+import 'package:analysis_server/src/services/correction/dart/move_type_arguments_to_class.dart';
+import 'package:analysis_server/src/services/correction/dart/qualify_reference.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_await.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_dead_code.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_duplicate_case.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_catch.dart';
@@ -66,22 +85,34 @@
 import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_interpolation_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_name_from_combinator.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_parameters_in_getter_declaration.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_question_mark.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_this_expression.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_type_arguments.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_cast.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_new.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unused.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_catch_clause.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_catch_stack.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_import.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_label.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unused_local_variable.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_parameter.dart';
 import 'package:analysis_server/src/services/correction/dart/rename_to_camel_case.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_boolean_with_bool.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_colon_with_equals.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_final_with_const.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_new_with_const.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_null_with_closure.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_return_type_future.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_brackets.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_conditional_assignment.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_eight_digit_hex.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_with_extension_name.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_identifier.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_interpolation.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_is_empty.dart';
@@ -90,11 +121,16 @@
 import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
 import 'package:analysis_server/src/services/correction/dart/sort_child_property_last.dart';
 import 'package:analysis_server/src/services/correction/dart/sort_directives.dart';
+import 'package:analysis_server/src/services/correction/dart/use_const.dart';
 import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
+import 'package:analysis_server/src/services/correction/dart/use_effective_integer_division.dart';
+import 'package:analysis_server/src/services/correction/dart/use_eq_eq_null.dart';
 import 'package:analysis_server/src/services/correction/dart/use_is_not_empty.dart';
+import 'package:analysis_server/src/services/correction/dart/use_not_eq_null.dart';
 import 'package:analysis_server/src/services/correction/dart/use_rethrow.dart';
 import 'package:analysis_server/src/services/correction/dart/wrap_in_future.dart';
 import 'package:analysis_server/src/services/correction/dart/wrap_in_text.dart';
+import 'package:analysis_server/src/services/correction/executable_parameters.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/levenshtein.dart';
@@ -102,10 +138,7 @@
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/utilities/strings.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
@@ -113,12 +146,9 @@
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/session_helper.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/error/inheritance_override.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/parser.dart';
@@ -293,6 +323,9 @@
       ReplaceWithIdentifier.newInstance,
       RemoveTypeAnnotation.newInstance,
     ],
+    LintNames.avoid_unused_constructor_parameters: [
+      RemoveUnusedParameter.newInstance,
+    ],
     LintNames.await_only_futures: [
       RemoveAwait.newInstance,
     ],
@@ -385,6 +418,7 @@
       ConvertToIfNull.newInstance,
     ],
     LintNames.prefer_inlined_adds: [
+      ConvertAddAllToSpread.newInstance,
       InlineInvocation.newInstance,
     ],
     LintNames.prefer_int_literals: [
@@ -475,14 +509,18 @@
     CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT: [
       AddSync.newInstance,
     ],
-//    CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE : [],
+    CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE: [
+      UseConst.newInstance,
+    ],
     CompileTimeErrorCode.CONST_INSTANCE_FIELD: [
       AddStatic.newInstance,
     ],
     CompileTimeErrorCode.CONST_WITH_NON_CONST: [
       RemoveConst.newInstance,
     ],
-//    CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER : [],
+    CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER: [
+      ReplaceWithExtensionName.newInstance,
+    ],
 //    CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : [],
     CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED: [
       ConvertToNamedArguments.newInstance,
@@ -491,11 +529,15 @@
     CompileTimeErrorCode.INTEGER_LITERAL_IMPRECISE_AS_DOUBLE: [
       ChangeToNearestPreciseValue.newInstance,
     ],
-//    CompileTimeErrorCode.INVALID_ANNOTATION : [],
+    CompileTimeErrorCode.INVALID_ANNOTATION: [
+      CreateClass.newInstance,
+    ],
     CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER: [
       AddRequiredKeyword.newInstance,
     ],
-//    CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE : [],
+    CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE: [
+      ExtendClassForMixin.newInstance,
+    ],
 //    CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT : [],
 //    CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT : [],
     CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE: [
@@ -510,36 +552,84 @@
     CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE: [
       RemoveQuestionMark.newInstance,
     ],
-//    CompileTimeErrorCode.UNDEFINED_ANNOTATION : [],
-//    CompileTimeErrorCode.UNDEFINED_CLASS : [],
+    CompileTimeErrorCode.UNDEFINED_ANNOTATION: [
+      CreateClass.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_CLASS: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
 //    CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT : [],
-//    CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER : [],
+    CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER: [
+      CreateGetter.newInstance,
+    ],
 //    CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD : [],
-//    CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER : [],
+    CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER: [
+      CreateSetter.newInstance,
+    ],
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
+      AddMissingParameterNamed.newInstance,
       ConvertFlutterChild.newInstance,
       ConvertFlutterChildren.newInstance,
     ],
-//    CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE : [],
+    CompileTimeErrorCode
+        .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE: [
+      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
+      //  method or setter. The existing _addFix methods would need to be
+      //  updated so that only the appropriate subset is generated.
+      QualifyReference.newInstance,
+    ],
 //    CompileTimeErrorCode.URI_DOES_NOT_EXIST : [],
 
     HintCode.CAN_BE_NULL_AFTER_NULL_AWARE: [
       ReplaceWithNullAware.newInstance,
     ],
-//    HintCode.DEAD_CODE : [],
-//    HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH : [],
-//    HintCode.DEAD_CODE_ON_CATCH_SUBTYPE : [],
-//    HintCode.DIVISION_OPTIMIZATION : [],
-//    HintCode.DUPLICATE_HIDDEN_NAME : [],
-//    HintCode.DUPLICATE_IMPORT : [],
-//    HintCode.DUPLICATE_SHOWN_NAME : [],
-//    HintCode.INVALID_FACTORY_ANNOTATION : [],
-//    HintCode.INVALID_IMMUTABLE_ANNOTATION : [],
-//    HintCode.INVALID_LITERAL_ANNOTATION : [],
-//    HintCode.INVALID_REQUIRED_NAMED_PARAM : [],
-//    HintCode.INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM : [],
-//    HintCode.INVALID_REQUIRED_POSITIONAL_PARAM : [],
-//    HintCode.INVALID_SEALED_ANNOTATION : [],
+    HintCode.DEAD_CODE: [
+      RemoveDeadCode.newInstance,
+    ],
+    HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH: [
+      // TODO(brianwilkerson) Add a fix to move the unreachable catch clause to
+      //  a place where it can be reached (when possible).
+      RemoveDeadCode.newInstance,
+    ],
+    HintCode.DEAD_CODE_ON_CATCH_SUBTYPE: [
+      // TODO(brianwilkerson) Add a fix to move the unreachable catch clause to
+      //  a place where it can be reached (when possible).
+      RemoveDeadCode.newInstance,
+    ],
+    HintCode.DIVISION_OPTIMIZATION: [
+      UseEffectiveIntegerDivision.newInstance,
+    ],
+    HintCode.DUPLICATE_HIDDEN_NAME: [
+      RemoveNameFromCombinator.newInstance,
+    ],
+    HintCode.DUPLICATE_IMPORT: [
+      RemoveUnusedImport.newInstance,
+    ],
+    HintCode.DUPLICATE_SHOWN_NAME: [
+      RemoveNameFromCombinator.newInstance,
+    ],
+    HintCode.INVALID_FACTORY_ANNOTATION: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_IMMUTABLE_ANNOTATION: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_LITERAL_ANNOTATION: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_REQUIRED_NAMED_PARAM: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_REQUIRED_POSITIONAL_PARAM: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.INVALID_SEALED_ANNOTATION: [
+      RemoveAnnotation.newInstance,
+    ],
     HintCode.MISSING_REQUIRED_PARAM: [
       AddMissingRequiredArgument.newInstance,
     ],
@@ -549,10 +639,18 @@
     HintCode.NULLABLE_TYPE_IN_CATCH_CLAUSE: [
       RemoveQuestionMark.newInstance,
     ],
-//    HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD : [],
-//    HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER : [],
-//    HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD : [],
-//    HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER : [],
+    HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [
+      RemoveAnnotation.newInstance,
+    ],
+    HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER: [
+      RemoveAnnotation.newInstance,
+    ],
 //    HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT : [],
 //    HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE : [],
 //    HintCode.SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT : [],
@@ -562,60 +660,127 @@
 //    HintCode.SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT : [],
 //    HintCode.SDK_VERSION_SET_LITERAL : [],
 //    HintCode.SDK_VERSION_UI_AS_CODE : [],
-//    HintCode.TYPE_CHECK_IS_NOT_NULL : [],
-//    HintCode.TYPE_CHECK_IS_NULL : [],
-//    HintCode.UNDEFINED_HIDDEN_NAME : [],
-//    HintCode.UNDEFINED_SHOWN_NAME : [],
-//    HintCode.UNNECESSARY_CAST : [],
-//    HintCode.UNUSED_CATCH_CLAUSE : [],
-//    HintCode.UNUSED_CATCH_STACK : [],
+    HintCode.TYPE_CHECK_IS_NOT_NULL: [
+      UseNotEqNull.newInstance,
+    ],
+    HintCode.TYPE_CHECK_IS_NULL: [
+      UseEqEqNull.newInstance,
+    ],
+    HintCode.UNDEFINED_HIDDEN_NAME: [
+      RemoveNameFromCombinator.newInstance,
+    ],
+    HintCode.UNDEFINED_SHOWN_NAME: [
+      RemoveNameFromCombinator.newInstance,
+    ],
+    HintCode.UNNECESSARY_CAST: [
+      RemoveUnnecessaryCast.newInstance,
+    ],
+    HintCode.UNUSED_CATCH_CLAUSE: [
+      RemoveUnusedCatchClause.newInstance,
+    ],
+    HintCode.UNUSED_CATCH_STACK: [
+      RemoveUnusedCatchStack.newInstance,
+    ],
     HintCode.UNUSED_ELEMENT: [
       RemoveUnusedElement.newInstance,
     ],
     HintCode.UNUSED_FIELD: [
       RemoveUnusedField.newInstance,
     ],
-//    HintCode.UNUSED_IMPORT : [],
-//    HintCode.UNUSED_LABEL : [],
+    HintCode.UNUSED_IMPORT: [
+      RemoveUnusedImport.newInstance,
+    ],
+    HintCode.UNUSED_LABEL: [
+      RemoveUnusedLabel.newInstance,
+    ],
     HintCode.UNUSED_LOCAL_VARIABLE: [
       RemoveUnusedLocalVariable.newInstance,
     ],
-//    HintCode.UNUSED_SHOWN_NAME : [],
+    HintCode.UNUSED_SHOWN_NAME: [
+      RemoveNameFromCombinator.newInstance,
+    ],
 
-//    ParserErrorCode.EXPECTED_TOKEN : [],
-//    ParserErrorCode.GETTER_WITH_PARAMETERS : [],
+    ParserErrorCode.EXPECTED_TOKEN: [
+      InsertSemicolon.newInstance,
+    ],
+    ParserErrorCode.GETTER_WITH_PARAMETERS: [
+      RemoveParametersInGetterDeclaration.newInstance,
+    ],
     ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE: [
       AddTypeAnnotation.newInstance,
     ],
 //    ParserErrorCode.VAR_AS_TYPE_NAME : [],
 
-//    StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE : [],
-//    StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER : [],
+    StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE: [
+      ReplaceReturnTypeFuture.newInstance,
+    ],
+    StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: [
+      ChangeToStaticAccess.newInstance,
+    ],
     StaticTypeWarningCode.INVALID_ASSIGNMENT: [
       AddExplicitCast.newInstance,
       ChangeTypeAnnotation.newInstance,
     ],
-//    StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION : [],
-//    StaticTypeWarningCode.NON_BOOL_CONDITION : [],
-//    StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT : [],
-//    StaticTypeWarningCode.UNDEFINED_FUNCTION : [],
-//    StaticTypeWarningCode.UNDEFINED_GETTER : [],
-//    StaticTypeWarningCode.UNDEFINED_METHOD : [],
-//    StaticTypeWarningCode.UNDEFINED_SETTER : [],
-//    StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR : [],
-//    StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER : [],
+    StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION: [
+      RemoveParenthesesInGetterInvocation.newInstance,
+    ],
+    StaticTypeWarningCode.NON_BOOL_CONDITION: [
+      AddNeNull.newInstance,
+    ],
+    StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
+    StaticTypeWarningCode.UNDEFINED_FUNCTION: [
+      CreateClass.newInstance,
+    ],
+    StaticTypeWarningCode.UNDEFINED_GETTER: [
+      CreateClass.newInstance,
+      CreateGetter.newInstance,
+      CreateLocalVariable.newInstance,
+      CreateMixin.newInstance,
+    ],
+    StaticTypeWarningCode.UNDEFINED_METHOD: [
+      CreateClass.newInstance,
+    ],
+    StaticTypeWarningCode.UNDEFINED_SETTER: [
+      CreateSetter.newInstance,
+    ],
+    StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+      MoveTypeArgumentsToClass.newInstance,
+      RemoveTypeArguments.newInstance,
+    ],
+    StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER: [
+      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
+      //  method or setter. The existing _addFix methods would need to be
+      //  updated so that only the appropriate subset is generated.
+      QualifyReference.newInstance,
+    ],
 
-//    StaticWarningCode.ASSIGNMENT_TO_FINAL : [],
-//    StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL : [],
+    StaticWarningCode.ASSIGNMENT_TO_FINAL: [
+      MakeFieldNotFinal.newInstance,
+    ],
+    StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL: [
+      MakeVariableNotFinal.newInstance,
+    ],
     StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE: [
       WrapInText.newInstance,
     ],
-//    StaticWarningCode.CAST_TO_NON_TYPE : [],
-//    StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER : [],
+    StaticWarningCode.CAST_TO_NON_TYPE: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
+    StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
+    ],
     StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION: [
       RemoveDeadIfNull.newInstance,
     ],
-//    StaticWarningCode.FINAL_NOT_INITIALIZED : [],
+    StaticWarningCode.FINAL_NOT_INITIALIZED: [
+      CreateConstructorForFinalFields.newInstance,
+    ],
     StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1: [
       AddFieldFormalParameters.newInstance,
     ],
@@ -629,18 +794,50 @@
       AddMissingEnumCaseClauses.newInstance,
     ],
 //    StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR : [],
-//    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS : [],
-//    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR : [],
-//    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE : [],
-//    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE : [],
-//    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO : [],
-//    StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE : [],
-//    StaticWarningCode.NOT_A_TYPE : [],
-//    StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME : [],
-    StaticWarningCode.UNDEFINED_CLASS_BOOLEAN: [
-      ReplaceBooleanWithBool.newInstance
+    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
     ],
-//    StaticWarningCode.UNDEFINED_IDENTIFIER : [],
+    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
+    ],
+    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
+    ],
+    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
+    ],
+    StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO: [
+      CreateMissingOverrides.newInstance,
+      CreateNoSuchMethod.newInstance,
+      MakeClassAbstract.newInstance,
+    ],
+//    StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE : [],
+    StaticWarningCode.NOT_A_TYPE: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
+    StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
+    StaticWarningCode.UNDEFINED_CLASS_BOOLEAN: [
+      ReplaceBooleanWithBool.newInstance,
+    ],
+    StaticWarningCode.UNDEFINED_IDENTIFIER: [
+      CreateClass.newInstance,
+      CreateGetter.newInstance,
+      CreateLocalVariable.newInstance,
+      CreateMixin.newInstance,
+      CreateSetter.newInstance,
+    ],
     StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT: [
       AddSync.newInstance,
     ],
@@ -661,8 +858,6 @@
 
   final List<Fix> fixes = <Fix>[];
 
-  AstNode coveredNode;
-
   FixProcessor(this.context)
       : resourceProvider = context.resolveResult.session.resourceProvider,
         typeSystem = context.resolveResult.typeSystem,
@@ -678,28 +873,11 @@
 
   DartType get coreTypeBool => context.resolveResult.typeProvider.boolType;
 
-  FeatureSet get _featureSet {
-    return unit.featureSet;
-  }
-
-  bool get _isNonNullable => _featureSet.isEnabled(Feature.non_nullable);
-
   Future<List<Fix>> compute() async {
     node = NodeLocator2(errorOffset).searchWithin(unit);
-    coveredNode =
-        NodeLocator2(errorOffset, math.max(errorOffset + errorLength - 1, 0))
-            .searchWithin(unit);
-    if (coveredNode == null) {
-      // TODO(brianwilkerson) Figure out why the coveredNode is sometimes null.
-      return fixes;
-    }
 
     // analyze ErrorCode
     var errorCode = error.errorCode;
-    if (errorCode ==
-        CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE) {
-      await _addFix_replaceWithConstInstanceCreation();
-    }
     if (errorCode == CompileTimeErrorCode.INVALID_ANNOTATION ||
         errorCode == CompileTimeErrorCode.UNDEFINED_ANNOTATION) {
       if (node is Annotation) {
@@ -711,7 +889,6 @@
             await _addFix_importLibrary_withTopLevelVariable();
           } else {
             await _addFix_importLibrary_withType();
-            await _addFix_createClass();
             await _addFix_undefinedClass_useSimilar();
           }
         }
@@ -737,50 +914,16 @@
       await _addFix_createImportUri();
       await _addFix_createPartUri();
     }
-    if (errorCode == HintCode.DEAD_CODE) {
-      await _addFix_removeDeadCode();
-    }
-    if (errorCode == HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH ||
-        errorCode == HintCode.DEAD_CODE_ON_CATCH_SUBTYPE) {
-      await _addFix_removeDeadCode();
-      // TODO(brianwilkerson) Add a fix to move the unreachable catch clause to
-      //  a place where it can be reached (when possible).
-    }
     // TODO(brianwilkerson) Define a syntax for deprecated members to indicate
     //  how to update the code and implement a fix to apply the update.
 //    if (errorCode == HintCode.DEPRECATED_MEMBER_USE ||
 //        errorCode == HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE) {
 //      await _addFix_replaceDeprecatedMemberUse();
 //    }
-    if (errorCode == HintCode.DIVISION_OPTIMIZATION) {
-      await _addFix_useEffectiveIntegerDivision();
-    }
-    if (errorCode == HintCode.DUPLICATE_IMPORT) {
-      await _addFix_removeUnusedImport();
-    }
-    if (errorCode == HintCode.DUPLICATE_HIDDEN_NAME ||
-        errorCode == HintCode.DUPLICATE_SHOWN_NAME) {
-      await _addFix_removeNameFromCombinator();
-    }
     // TODO(brianwilkerson) Add a fix to convert the path to a package: import.
 //    if (errorCode == HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE) {
 //      await _addFix_convertPathToPackageUri();
 //    }
-    if (errorCode == HintCode.INVALID_FACTORY_ANNOTATION ||
-        errorCode == HintCode.INVALID_IMMUTABLE_ANNOTATION ||
-        errorCode == HintCode.INVALID_LITERAL_ANNOTATION ||
-        errorCode == HintCode.INVALID_REQUIRED_NAMED_PARAM ||
-        errorCode == HintCode.INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM ||
-        errorCode == HintCode.INVALID_REQUIRED_POSITIONAL_PARAM ||
-        errorCode == HintCode.INVALID_SEALED_ANNOTATION) {
-      await _addFix_removeAnnotation();
-    }
-    if (errorCode == HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER ||
-        errorCode == HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD ||
-        errorCode == HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD ||
-        errorCode == HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER) {
-      await _addFix_removeAnnotation();
-    }
     // TODO(brianwilkerson) Add a fix to normalize the path.
 //    if (errorCode == HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT) {
 //      await _addFix_normalizeUri();
@@ -803,19 +946,6 @@
     if (errorCode == HintCode.SDK_VERSION_EXTENSION_METHODS) {
       await _addFix_updateSdkConstraints('2.6.0');
     }
-    if (errorCode == HintCode.TYPE_CHECK_IS_NOT_NULL) {
-      await _addFix_isNotNull();
-    }
-    if (errorCode == HintCode.TYPE_CHECK_IS_NULL) {
-      await _addFix_isNull();
-    }
-    if (errorCode == HintCode.UNDEFINED_HIDDEN_NAME ||
-        errorCode == HintCode.UNDEFINED_SHOWN_NAME) {
-      await _addFix_removeNameFromCombinator();
-    }
-    if (errorCode == HintCode.UNNECESSARY_CAST) {
-      await _addFix_removeUnnecessaryCast();
-    }
     // TODO(brianwilkerson) Add a fix to remove the method.
 //    if (errorCode == HintCode.UNNECESSARY_NO_SUCH_METHOD) {
 //      await _addFix_removeMethodDeclaration();
@@ -825,39 +955,9 @@
 //        errorCode == HintCode.UNNECESSARY_TYPE_CHECK_TRUE) {
 //      await _addFix_removeUnnecessaryTypeCheck();
 //    }
-    if (errorCode == HintCode.UNUSED_CATCH_CLAUSE) {
-      await _addFix_removeUnusedCatchClause();
-    }
-    if (errorCode == HintCode.UNUSED_CATCH_STACK) {
-      await _addFix_removeUnusedCatchStack();
-    }
-    if (errorCode == HintCode.UNUSED_IMPORT) {
-      await _addFix_removeUnusedImport();
-    }
-    if (errorCode == HintCode.UNUSED_LABEL) {
-      await _addFix_removeUnusedLabel();
-    }
-    if (errorCode == HintCode.UNUSED_SHOWN_NAME) {
-      await _addFix_removeNameFromCombinator();
-    }
-    if (errorCode == ParserErrorCode.EXPECTED_TOKEN) {
-      await _addFix_insertSemicolon();
-    }
-    if (errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS) {
-      await _addFix_removeParameters_inGetterDeclaration();
-    }
     if (errorCode == ParserErrorCode.VAR_AS_TYPE_NAME) {
       await _addFix_replaceVarWithDynamic();
     }
-    if (errorCode == StaticWarningCode.ASSIGNMENT_TO_FINAL) {
-      await _addFix_makeFieldNotFinal();
-    }
-    if (errorCode == StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL) {
-      await _addFix_makeVariableNotFinal();
-    }
-    if (errorCode == StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER) {
-      await _addFix_makeEnclosingClassAbstract();
-    }
     if (errorCode == CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS ||
         errorCode ==
             CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED) {
@@ -867,79 +967,32 @@
     if (errorCode == StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR) {
       await _addFix_createConstructor_named();
     }
-    if (errorCode == StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER ||
-        errorCode ==
-            StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE ||
-        errorCode ==
-            StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO ||
-        errorCode ==
-            StaticWarningCode
-                .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE ||
-        errorCode ==
-            StaticWarningCode
-                .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR ||
-        errorCode ==
-            StaticWarningCode
-                .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS) {
-      // make class abstract
-      await _addFix_makeEnclosingClassAbstract();
-      await _addFix_createNoSuchMethod();
-      // implement methods
-      await _addFix_createMissingOverrides();
-    }
-    if (errorCode == CompileTimeErrorCode.UNDEFINED_CLASS ||
+    if (errorCode == CompileTimeErrorCode.CONST_WITH_NON_TYPE ||
+        errorCode == CompileTimeErrorCode.MIXIN_OF_NON_CLASS ||
+        errorCode == CompileTimeErrorCode.UNDEFINED_CLASS ||
         errorCode == StaticWarningCode.CAST_TO_NON_TYPE ||
+        errorCode == StaticWarningCode.NEW_WITH_NON_TYPE ||
         errorCode == StaticWarningCode.NOT_A_TYPE ||
         errorCode == StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME) {
       await _addFix_importLibrary_withType();
-      await _addFix_createClass();
-      await _addFix_createMixin();
       await _addFix_undefinedClass_useSimilar();
     }
     if (errorCode == StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE) {
       await _addFix_importLibrary_withType();
     }
-    if (errorCode == StaticWarningCode.FINAL_NOT_INITIALIZED) {
-      await _addFix_createConstructor_forUninitializedFinalFields();
-    }
     if (errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER) {
       await _addFix_undefinedClassAccessor_useSimilar();
-      await _addFix_createClass();
       await _addFix_createField();
-      await _addFix_createGetter();
       await _addFix_createFunction_forFunctionType();
-      await _addFix_createMixin();
-      await _addFix_createSetter();
       await _addFix_importLibrary_withType();
       await _addFix_importLibrary_withExtension();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withTopLevelVariable();
-      await _addFix_createLocalVariable();
-    }
-    if (errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER) {
-      await _addFix_addMissingParameterNamed();
-    }
-    if (errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE) {
-      await _addFix_illegalAsyncReturnType();
-    }
-    if (errorCode == StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER) {
-      await _addFix_useStaticAccess_method();
-      await _addFix_useStaticAccess_property();
-    }
-    if (errorCode ==
-        StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION) {
-      await _addFix_removeParentheses_inGetterInvocation();
-    }
-    if (errorCode == StaticTypeWarningCode.NON_BOOL_CONDITION) {
-      await _addFix_nonBoolCondition_addNotNull();
     }
     if (errorCode == StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT) {
       await _addFix_importLibrary_withType();
-      await _addFix_createClass();
-      await _addFix_createMixin();
     }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION) {
-      await _addFix_createClass();
       await _addFix_importLibrary_withExtension();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
@@ -949,22 +1002,14 @@
     if (errorCode == StaticTypeWarningCode.UNDEFINED_GETTER) {
       await _addFix_undefinedClassAccessor_useSimilar();
       await _addFix_createField();
-      await _addFix_createGetter();
       await _addFix_createFunction_forFunctionType();
-      // TODO(brianwilkerson) The following were added because fasta produces
-      // UNDEFINED_GETTER in places where analyzer produced UNDEFINED_IDENTIFIER
-      await _addFix_createClass();
-      await _addFix_createMixin();
-      await _addFix_createLocalVariable();
       await _addFix_importLibrary_withTopLevelVariable();
       await _addFix_importLibrary_withType();
     }
     if (errorCode == CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER) {
       await _addFix_undefinedClassAccessor_useSimilar();
-      await _addFix_createGetter();
     }
     if (errorCode == StaticTypeWarningCode.UNDEFINED_METHOD) {
-      await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
       await _addFix_undefinedMethod_useSimilar();
@@ -978,45 +1023,14 @@
     if (errorCode == StaticTypeWarningCode.UNDEFINED_SETTER) {
       await _addFix_undefinedClassAccessor_useSimilar();
       await _addFix_createField();
-      await _addFix_createSetter();
     }
     if (errorCode == CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER) {
       await _addFix_undefinedClassAccessor_useSimilar();
-      await _addFix_createSetter();
     }
     if (errorCode ==
         CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD) {
       await _addFix_createField_initializingFormal();
     }
-    if (errorCode ==
-        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR) {
-      await _addFix_moveTypeArgumentsToClass();
-      await _addFix_removeTypeArguments();
-    }
-    if (errorCode ==
-        CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE) {
-      await _addFix_extendClassForMixin();
-    }
-    if (errorCode ==
-        CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER) {
-      await _addFix_replaceWithExtensionName();
-    }
-    if (errorCode ==
-        CompileTimeErrorCode
-            .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE) {
-      await _addFix_qualifyReference();
-      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
-      //  method or setter. The existing _addFix methods would need to be
-      //  updated so that only the appropriate subset is generated.
-    }
-    if (errorCode ==
-        StaticTypeWarningCode
-            .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER) {
-      await _addFix_qualifyReference();
-      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
-      //  method or setter. The existing _addFix methods would need to be
-      //  updated so that only the appropriate subset is generated.
-    }
     await _addFromProducers();
 
     // done
@@ -1038,7 +1052,7 @@
     List<Expression> arguments = argumentList.arguments;
 
     // Prepare the invoked element.
-    var context = _ExecutableParameters(sessionHelper, node.parent);
+    var context = ExecutableParameters(sessionHelper, node.parent);
     if (context == null) {
       return;
     }
@@ -1095,227 +1109,6 @@
     }
   }
 
-  Future<void> _addFix_addMissingParameterNamed() async {
-    // Prepare the name of the missing parameter.
-    if (this.node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier node = this.node;
-    var name = node.name;
-
-    // We expect that the node is part of a NamedExpression.
-    if (node.parent?.parent is! NamedExpression) {
-      return;
-    }
-    NamedExpression namedExpression = node.parent.parent;
-
-    // We should be in an ArgumentList.
-    if (namedExpression.parent is! ArgumentList) {
-      return;
-    }
-    var argumentList = namedExpression.parent;
-
-    // Prepare the invoked element.
-    var context = _ExecutableParameters(sessionHelper, argumentList.parent);
-    if (context == null) {
-      return;
-    }
-
-    // We cannot add named parameters when there are positional positional.
-    if (context.optionalPositional.isNotEmpty) {
-      return;
-    }
-
-    Future<void> addParameter(int offset, String prefix, String suffix) async {
-      if (offset != null) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(context.file, (builder) {
-          builder.addInsertion(offset, (builder) {
-            builder.write(prefix);
-            builder
-                .writeParameterMatchingArgument(namedExpression, 0, <String>{});
-            builder.write(suffix);
-          });
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_NAMED,
-            args: [name]);
-      }
-    }
-
-    if (context.named.isNotEmpty) {
-      var prevNode = await context.getParameterNode(context.named.last);
-      await addParameter(prevNode?.end, ', ', '');
-    } else if (context.required.isNotEmpty) {
-      var prevNode = await context.getParameterNode(context.required.last);
-      await addParameter(prevNode?.end, ', {', '}');
-    } else {
-      var parameterList = await context.getParameterList();
-      await addParameter(parameterList?.leftParenthesis?.end, '{', '}');
-    }
-  }
-
-  Future<void> _addFix_createClass() async {
-    Element prefixElement;
-    String name;
-    SimpleIdentifier nameNode;
-    if (node is SimpleIdentifier) {
-      var parent = node.parent;
-      if (parent is PrefixedIdentifier) {
-        PrefixedIdentifier prefixedIdentifier = parent;
-        prefixElement = prefixedIdentifier.prefix.staticElement;
-        if (prefixElement == null) {
-          return;
-        }
-        parent = prefixedIdentifier.parent;
-        nameNode = prefixedIdentifier.identifier;
-        name = prefixedIdentifier.identifier.name;
-      } else {
-        nameNode = node;
-        name = nameNode.name;
-      }
-      if (!_mayBeTypeIdentifier(nameNode)) {
-        return;
-      }
-    } else {
-      return;
-    }
-    // prepare environment
-    Element targetUnit;
-    var prefix = '';
-    var suffix = '';
-    var offset = -1;
-    String filePath;
-    if (prefixElement == null) {
-      targetUnit = unit.declaredElement;
-      var enclosingMember = node.thisOrAncestorMatching((node) =>
-          node is CompilationUnitMember && node.parent is CompilationUnit);
-      if (enclosingMember == null) {
-        return;
-      }
-      offset = enclosingMember.end;
-      filePath = file;
-      prefix = '$eol$eol';
-    } else {
-      for (var import in unitLibraryElement.imports) {
-        if (prefixElement is PrefixElement && import.prefix == prefixElement) {
-          var library = import.importedLibrary;
-          if (library != null) {
-            targetUnit = library.definingCompilationUnit;
-            var targetSource = targetUnit.source;
-            try {
-              offset = targetSource.contents.data.length;
-              filePath = targetSource.fullName;
-              prefix = '$eol';
-              suffix = '$eol';
-            } on FileSystemException {
-              // If we can't read the file to get the offset, then we can't
-              // create a fix.
-            }
-            break;
-          }
-        }
-      }
-    }
-    if (offset < 0) {
-      return;
-    }
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(filePath, (DartFileEditBuilder builder) {
-      builder.addInsertion(offset, (DartEditBuilder builder) {
-        builder.write(prefix);
-        builder.writeClassDeclaration(name, nameGroupName: 'NAME');
-        builder.write(suffix);
-      });
-      if (prefixElement == null) {
-        builder.addLinkedPosition(range.node(node), 'NAME');
-      }
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_CLASS, args: [name]);
-  }
-
-  /// Here we handle cases when there are no constructors in a class, and the
-  /// class has uninitialized final fields.
-  Future<void> _addFix_createConstructor_forUninitializedFinalFields() async {
-    if (node is! SimpleIdentifier || node.parent is! VariableDeclaration) {
-      return;
-    }
-
-    var classDeclaration = node.thisOrAncestorOfType<ClassDeclaration>();
-    if (classDeclaration == null) {
-      return;
-    }
-    var className = classDeclaration.name.name;
-    var superType = classDeclaration.declaredElement.supertype;
-
-    // prepare names of uninitialized final fields
-    var fieldNames = <String>[];
-    for (var member in classDeclaration.members) {
-      if (member is FieldDeclaration) {
-        var variableList = member.fields;
-        if (variableList.isFinal) {
-          fieldNames.addAll(variableList.variables
-              .where((v) => v.initializer == null)
-              .map((v) => v.name.name));
-        }
-      }
-    }
-    // prepare location for a new constructor
-    var targetLocation = utils.prepareNewConstructorLocation(classDeclaration);
-
-    var changeBuilder = _newDartChangeBuilder();
-    if (flutter.isExactlyStatelessWidgetType(superType) ||
-        flutter.isExactlyStatefulWidgetType(superType)) {
-      // Specialize for Flutter widgets.
-      var keyClass = await sessionHelper.getClass(flutter.widgetsUri, 'Key');
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
-          builder.write(targetLocation.prefix);
-          builder.write('const ');
-          builder.write(className);
-          builder.write('({');
-          builder.writeType(
-            keyClass.instantiate(
-              typeArguments: const [],
-              nullabilitySuffix: _isNonNullable
-                  ? NullabilitySuffix.question
-                  : NullabilitySuffix.star,
-            ),
-          );
-          builder.write(' key');
-
-          var childrenFields = <String>[];
-          for (var fieldName in fieldNames) {
-            if (fieldName == 'child' || fieldName == 'children') {
-              childrenFields.add(fieldName);
-              continue;
-            }
-            builder.write(', this.');
-            builder.write(fieldName);
-          }
-          for (var fieldName in childrenFields) {
-            builder.write(', this.');
-            builder.write(fieldName);
-          }
-
-          builder.write('}) : super(key: key);');
-          builder.write(targetLocation.suffix);
-        });
-      });
-    } else {
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
-          builder.write(targetLocation.prefix);
-          builder.writeConstructorDeclaration(className,
-              fieldNames: fieldNames);
-          builder.write(targetLocation.suffix);
-        });
-      });
-    }
-    _addFixFromBuilder(
-        changeBuilder, DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS);
-  }
-
   Future<void> _addFix_createConstructor_insteadOfSyntheticDefault() async {
     if (node is! ArgumentList) {
       return;
@@ -1714,92 +1507,6 @@
     }
   }
 
-  Future<void> _addFix_createGetter() async {
-    if (node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier nameNode = node;
-    var name = nameNode.name;
-    if (!nameNode.inGetterContext()) {
-      return;
-    }
-    // prepare target
-    Expression target;
-    {
-      var nameParent = nameNode.parent;
-      if (nameParent is PrefixedIdentifier) {
-        target = nameParent.prefix;
-      } else if (nameParent is PropertyAccess) {
-        target = nameParent.realTarget;
-      }
-    }
-    // prepare target element
-    var staticModifier = false;
-    Element targetElement;
-    if (target is ExtensionOverride) {
-      targetElement = target.staticElement;
-    } else if (target is Identifier &&
-        target.staticElement is ExtensionElement) {
-      targetElement = target.staticElement;
-      staticModifier = true;
-    } else if (target != null) {
-      // prepare target interface type
-      var targetType = target.staticType;
-      if (targetType is! InterfaceType) {
-        return;
-      }
-      targetElement = targetType.element;
-      // maybe static
-      if (target is Identifier) {
-        var targetIdentifier = target;
-        var targetElement = targetIdentifier.staticElement;
-        staticModifier = targetElement?.kind == ElementKind.CLASS;
-      }
-    } else {
-      targetElement =
-          getEnclosingClassElement(node) ?? getEnclosingExtensionElement(node);
-      if (targetElement == null) {
-        return;
-      }
-      staticModifier = _inStaticContext();
-    }
-    if (targetElement.librarySource.isInSystemLibrary) {
-      return;
-    }
-    // prepare target declaration
-    var targetDeclarationResult =
-        await sessionHelper.getElementDeclaration(targetElement);
-    if (targetDeclarationResult == null) {
-      return;
-    }
-    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
-        targetDeclarationResult.node is! ExtensionDeclaration) {
-      return;
-    }
-    CompilationUnitMember targetNode = targetDeclarationResult.node;
-    // prepare location
-    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
-        .prepareNewGetterLocation(targetNode);
-    // build method source
-    var targetSource = targetElement.source;
-    var targetFile = targetSource.fullName;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
-      builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
-        var fieldTypeNode = climbPropertyAccess(nameNode);
-        var fieldType = _inferUndefinedExpressionType(fieldTypeNode);
-        builder.write(targetLocation.prefix);
-        builder.writeGetterDeclaration(name,
-            isStatic: staticModifier,
-            nameGroupName: 'NAME',
-            returnType: fieldType,
-            returnTypeGroupName: 'TYPE');
-        builder.write(targetLocation.suffix);
-      });
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_GETTER, args: [name]);
-  }
-
   Future<void> _addFix_createImportUri() async {
     // TODO(brianwilkerson) Generalize this to allow other valid string literals.
     // TODO(brianwilkerson) Support the case where the node's parent is a Configuration.
@@ -1823,53 +1530,6 @@
     }
   }
 
-  Future<void> _addFix_createLocalVariable() async {
-    if (node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier nameNode = node;
-    var name = nameNode.name;
-    // if variable is assigned, convert assignment into declaration
-    if (node.parent is AssignmentExpression) {
-      AssignmentExpression assignment = node.parent;
-      if (assignment.leftHandSide == node &&
-          assignment.operator.type == TokenType.EQ &&
-          assignment.parent is ExpressionStatement) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addSimpleInsertion(node.offset, 'var ');
-        });
-        _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE,
-            args: [name]);
-        return;
-      }
-    }
-    // prepare target Statement
-    var target = node.thisOrAncestorOfType<Statement>();
-    if (target == null) {
-      return;
-    }
-    var prefix = utils.getNodePrefix(target);
-    // compute type
-    var type = _inferUndefinedExpressionType(node);
-    if (!(type == null || type is InterfaceType || type is FunctionType)) {
-      return;
-    }
-    // build variable declaration source
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addInsertion(target.offset, (DartEditBuilder builder) {
-        builder.writeLocalVariableDeclaration(name,
-            nameGroupName: 'NAME', type: type, typeGroupName: 'TYPE');
-        builder.write(eol);
-        builder.write(prefix);
-      });
-      builder.addLinkedPosition(range.node(node), 'NAME');
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE,
-        args: [name]);
-  }
-
   Future<void> _addFix_createMethod() async {
     if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
       return;
@@ -1964,198 +1624,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_METHOD, args: [name]);
   }
 
-  Future<void> _addFix_createMissingOverrides() async {
-    if (node.parent is! ClassDeclaration) {
-      return;
-    }
-    var targetClass = node.parent as ClassDeclaration;
-    var targetClassElement = targetClass.declaredElement;
-    utils.targetClassElement = targetClassElement;
-    var signatures =
-        InheritanceOverrideVerifier.missingOverrides(targetClass).toList();
-    // sort by name, getters before setters
-    signatures.sort((ExecutableElement a, ExecutableElement b) {
-      var names = compareStrings(a.displayName, b.displayName);
-      if (names != 0) {
-        return names;
-      }
-      if (a.kind == ElementKind.GETTER) {
-        return -1;
-      }
-      return 1;
-    });
-    var numElements = signatures.length;
-
-    var location =
-        utils.prepareNewClassMemberLocation(targetClass, (_) => true);
-
-    var prefix = utils.getIndent(1);
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addInsertion(location.offset, (DartEditBuilder builder) {
-        // Separator management.
-        var numOfMembersWritten = 0;
-        void addSeparatorBetweenDeclarations() {
-          if (numOfMembersWritten == 0) {
-            builder.write(location.prefix);
-          } else {
-            builder.write(eol); // after the previous member
-            builder.write(eol); // empty line separator
-            builder.write(prefix);
-          }
-          numOfMembersWritten++;
-        }
-
-        // merge getter/setter pairs into fields
-        for (var i = 0; i < signatures.length; i++) {
-          var element = signatures[i];
-          if (element.kind == ElementKind.GETTER && i + 1 < signatures.length) {
-            var nextElement = signatures[i + 1];
-            if (nextElement.kind == ElementKind.SETTER) {
-              // remove this and the next elements, adjust iterator
-              signatures.removeAt(i + 1);
-              signatures.removeAt(i);
-              i--;
-              numElements--;
-              // separator
-              addSeparatorBetweenDeclarations();
-              // @override
-              builder.write('@override');
-              builder.write(eol);
-              // add field
-              builder.write(prefix);
-              builder.writeType(element.returnType, required: true);
-              builder.write(' ');
-              builder.write(element.name);
-              builder.write(';');
-            }
-          }
-        }
-        // add elements
-        for (var element in signatures) {
-          addSeparatorBetweenDeclarations();
-          builder.writeOverride(element);
-        }
-        builder.write(location.suffix);
-      });
-    });
-    changeBuilder.setSelection(Position(file, location.offset));
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_MISSING_OVERRIDES,
-        args: [numElements]);
-  }
-
-  Future<void> _addFix_createMixin() async {
-    Element prefixElement;
-    String name;
-    SimpleIdentifier nameNode;
-    if (node is SimpleIdentifier) {
-      var parent = node.parent;
-      if (parent is PrefixedIdentifier) {
-        if (parent.parent is InstanceCreationExpression) {
-          return;
-        }
-        PrefixedIdentifier prefixedIdentifier = parent;
-        prefixElement = prefixedIdentifier.prefix.staticElement;
-        if (prefixElement == null) {
-          return;
-        }
-        parent = prefixedIdentifier.parent;
-        nameNode = prefixedIdentifier.identifier;
-        name = prefixedIdentifier.identifier.name;
-      } else if (parent is TypeName &&
-          parent.parent is ConstructorName &&
-          parent.parent.parent is InstanceCreationExpression) {
-        return;
-      } else {
-        nameNode = node;
-        name = nameNode.name;
-      }
-      if (!_mayBeTypeIdentifier(nameNode)) {
-        return;
-      }
-    } else {
-      return;
-    }
-    // prepare environment
-    Element targetUnit;
-    var prefix = '';
-    var suffix = '';
-    var offset = -1;
-    String filePath;
-    if (prefixElement == null) {
-      targetUnit = unit.declaredElement;
-      var enclosingMember = node.thisOrAncestorMatching((node) =>
-          node is CompilationUnitMember && node.parent is CompilationUnit);
-      if (enclosingMember == null) {
-        return;
-      }
-      offset = enclosingMember.end;
-      filePath = file;
-      prefix = '$eol$eol';
-    } else {
-      for (var import in unitLibraryElement.imports) {
-        if (prefixElement is PrefixElement && import.prefix == prefixElement) {
-          var library = import.importedLibrary;
-          if (library != null) {
-            targetUnit = library.definingCompilationUnit;
-            var targetSource = targetUnit.source;
-            try {
-              offset = targetSource.contents.data.length;
-              filePath = targetSource.fullName;
-              prefix = '$eol';
-              suffix = '$eol';
-            } on FileSystemException {
-              // If we can't read the file to get the offset, then we can't
-              // create a fix.
-            }
-            break;
-          }
-        }
-      }
-    }
-    if (offset < 0) {
-      return;
-    }
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(filePath, (DartFileEditBuilder builder) {
-      builder.addInsertion(offset, (DartEditBuilder builder) {
-        builder.write(prefix);
-        builder.writeMixinDeclaration(name, nameGroupName: 'NAME');
-        builder.write(suffix);
-      });
-      if (prefixElement == null) {
-        builder.addLinkedPosition(range.node(node), 'NAME');
-      }
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_MIXIN, args: [name]);
-  }
-
-  Future<void> _addFix_createNoSuchMethod() async {
-    if (node.parent is! ClassDeclaration) {
-      return;
-    }
-    var targetClass = node.parent as ClassDeclaration;
-    // prepare environment
-    var prefix = utils.getIndent(1);
-    var insertOffset = targetClass.end - 1;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addInsertion(insertOffset, (DartEditBuilder builder) {
-        builder.selectHere();
-        // insert empty line before existing member
-        if (targetClass.members.isNotEmpty) {
-          builder.write(eol);
-        }
-        // append method
-        builder.write(prefix);
-        builder.write(
-            'noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);');
-        builder.write(eol);
-      });
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_NO_SUCH_METHOD);
-  }
-
   Future<void> _addFix_createPartUri() async {
     // TODO(brianwilkerson) Generalize this to allow other valid string literals.
     if (node is SimpleStringLiteral && node.parent is PartDirective) {
@@ -2175,123 +1643,6 @@
     }
   }
 
-  Future<void> _addFix_createSetter() async {
-    if (node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier nameNode = node;
-    if (!nameNode.inSetterContext()) {
-      return;
-    }
-    // prepare target
-    Expression target;
-    {
-      var nameParent = nameNode.parent;
-      if (nameParent is PrefixedIdentifier) {
-        target = nameParent.prefix;
-      } else if (nameParent is PropertyAccess) {
-        target = nameParent.realTarget;
-      }
-    }
-    // prepare target element
-    var staticModifier = false;
-    Element targetElement;
-    if (target is ExtensionOverride) {
-      targetElement = target.staticElement;
-    } else if (target is Identifier &&
-        target.staticElement is ExtensionElement) {
-      targetElement = target.staticElement;
-      staticModifier = true;
-    } else if (target != null) {
-      // prepare target interface type
-      var targetType = target.staticType;
-      if (targetType is! InterfaceType) {
-        return;
-      }
-      targetElement = targetType.element;
-      // maybe static
-      if (target is Identifier) {
-        var targetIdentifier = target;
-        var targetElement = targetIdentifier.staticElement;
-        staticModifier = targetElement?.kind == ElementKind.CLASS;
-      }
-    } else {
-      targetElement =
-          getEnclosingClassElement(node) ?? getEnclosingExtensionElement(node);
-      if (targetElement == null) {
-        return;
-      }
-      staticModifier = _inStaticContext();
-    }
-    if (targetElement.librarySource.isInSystemLibrary) {
-      return;
-    }
-    // prepare target declaration
-    var targetDeclarationResult =
-        await sessionHelper.getElementDeclaration(targetElement);
-    if (targetDeclarationResult == null) {
-      return;
-    }
-    if (targetDeclarationResult.node is! ClassOrMixinDeclaration &&
-        targetDeclarationResult.node is! ExtensionDeclaration) {
-      return;
-    }
-    CompilationUnitMember targetNode = targetDeclarationResult.node;
-    // prepare location
-    var targetLocation = CorrectionUtils(targetDeclarationResult.resolvedUnit)
-        .prepareNewGetterLocation(targetNode); // Rename to "AccessorLocation"
-    // build method source
-    var targetSource = targetElement.source;
-    var targetFile = targetSource.fullName;
-    var name = nameNode.name;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
-      builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
-        var parameterTypeNode = climbPropertyAccess(nameNode);
-        var parameterType = _inferUndefinedExpressionType(parameterTypeNode);
-        builder.write(targetLocation.prefix);
-        builder.writeSetterDeclaration(name,
-            isStatic: staticModifier,
-            nameGroupName: 'NAME',
-            parameterType: parameterType,
-            parameterTypeGroupName: 'TYPE');
-        builder.write(targetLocation.suffix);
-      });
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_SETTER, args: [name]);
-  }
-
-  Future<void> _addFix_extendClassForMixin() async {
-    var declaration = node.thisOrAncestorOfType<ClassDeclaration>();
-    if (declaration != null && declaration.extendsClause == null) {
-      // TODO(brianwilkerson) Find a way to pass in the name of the class
-      //  without needing to parse the message.
-      var message = error.message;
-      var endIndex = message.lastIndexOf("'");
-      var startIndex = message.lastIndexOf("'", endIndex - 1) + 1;
-      var typeName = message.substring(startIndex, endIndex);
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleInsertion(
-            declaration.typeParameters?.end ?? declaration.name.end,
-            ' extends $typeName');
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.EXTEND_CLASS_FOR_MIXIN,
-          args: [typeName]);
-    }
-  }
-
-  Future<void> _addFix_illegalAsyncReturnType() async {
-    // prepare the existing type
-    var typeName = node.thisOrAncestorOfType<TypeAnnotation>();
-    var typeProvider = this.typeProvider;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.replaceTypeWithFuture(typeName, typeProvider);
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_RETURN_TYPE_FUTURE);
-  }
-
   Future<void> _addFix_importAsync() async {
     await _addFix_importLibrary(
         DartFixKind.IMPORT_ASYNC, Uri.parse('dart:async'));
@@ -2476,487 +1827,6 @@
     }
   }
 
-  Future<void> _addFix_insertSemicolon() async {
-    if (error.message.contains("';'")) {
-      if (_isAwaitNode()) {
-        return;
-      }
-      var insertOffset = error.offset + error.length;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleInsertion(insertOffset, ';');
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.INSERT_SEMICOLON);
-    }
-  }
-
-  Future<void> _addFix_isNotNull() async {
-    if (coveredNode is IsExpression) {
-      var isExpression = coveredNode as IsExpression;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder
-            .addReplacement(range.endEnd(isExpression.expression, isExpression),
-                (DartEditBuilder builder) {
-          builder.write(' != null');
-        });
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.USE_NOT_EQ_NULL);
-    }
-  }
-
-  Future<void> _addFix_isNull() async {
-    if (coveredNode is IsExpression) {
-      var isExpression = coveredNode as IsExpression;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder
-            .addReplacement(range.endEnd(isExpression.expression, isExpression),
-                (DartEditBuilder builder) {
-          builder.write(' == null');
-        });
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.USE_EQ_EQ_NULL);
-    }
-  }
-
-  Future<void> _addFix_makeEnclosingClassAbstract() async {
-    var enclosingClass = node.thisOrAncestorOfType<ClassDeclaration>();
-    if (enclosingClass == null) {
-      return;
-    }
-    var className = enclosingClass.name.name;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleInsertion(
-          enclosingClass.classKeyword.offset, 'abstract ');
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_CLASS_ABSTRACT,
-        args: [className]);
-  }
-
-  Future<void> _addFix_makeFieldNotFinal() async {
-    var node = this.node;
-    if (node is SimpleIdentifier &&
-        node.staticElement is PropertyAccessorElement) {
-      PropertyAccessorElement getter = node.staticElement;
-      if (getter.isGetter &&
-          getter.isSynthetic &&
-          !getter.variable.isSynthetic &&
-          getter.variable.setter == null &&
-          getter.enclosingElement is ClassElement) {
-        var declarationResult =
-            await sessionHelper.getElementDeclaration(getter.variable);
-        var variable = declarationResult.node;
-        if (variable is VariableDeclaration &&
-            variable.parent is VariableDeclarationList &&
-            variable.parent.parent is FieldDeclaration) {
-          VariableDeclarationList declarationList = variable.parent;
-          var keywordToken = declarationList.keyword;
-          if (declarationList.variables.length == 1 &&
-              keywordToken.keyword == Keyword.FINAL) {
-            var changeBuilder = _newDartChangeBuilder();
-            await changeBuilder.addFileEdit(file,
-                (DartFileEditBuilder builder) {
-              if (declarationList.type != null) {
-                builder.addReplacement(
-                    range.startStart(keywordToken, declarationList.type),
-                    (DartEditBuilder builder) {});
-              } else {
-                builder.addReplacement(range.startStart(keywordToken, variable),
-                    (DartEditBuilder builder) {
-                  builder.write('var ');
-                });
-              }
-            });
-            var fieldName = getter.variable.displayName;
-            _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_FIELD_NOT_FINAL,
-                args: [fieldName]);
-          }
-        }
-      }
-    }
-  }
-
-  Future<void> _addFix_makeVariableNotFinal() async {
-    var node = this.node;
-    if (node is SimpleIdentifier &&
-        node.staticElement is LocalVariableElement) {
-      LocalVariableElement variable = node.staticElement;
-      var id = NodeLocator(variable.nameOffset).searchWithin(unit);
-      var decl = id?.parent;
-      if (decl is VariableDeclaration &&
-          decl.parent is VariableDeclarationList) {
-        VariableDeclarationList declarationList = decl.parent;
-        var keywordToken = declarationList.keyword;
-        if (declarationList.variables.length == 1 &&
-            keywordToken.keyword == Keyword.FINAL) {
-          var changeBuilder = _newDartChangeBuilder();
-          await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-            if (declarationList.type != null) {
-              builder.addDeletion(
-                  range.startStart(keywordToken, declarationList.type));
-            } else {
-              builder.addSimpleReplacement(range.token(keywordToken), 'var');
-            }
-          });
-          declarationList.variables[0].name.name;
-          var varName = declarationList.variables[0].name.name;
-          _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_VARIABLE_NOT_FINAL,
-              args: [varName]);
-        }
-      }
-    }
-  }
-
-  Future<void> _addFix_moveTypeArgumentsToClass() async {
-    if (coveredNode is TypeArgumentList) {
-      TypeArgumentList typeArguments = coveredNode;
-      if (typeArguments.parent is! InstanceCreationExpression) {
-        return;
-      }
-      InstanceCreationExpression creation = typeArguments.parent;
-      var typeName = creation.constructorName.type;
-      if (typeName.typeArguments != null) {
-        return;
-      }
-      var element = typeName.type.element;
-      if (element is ClassElement &&
-          element.typeParameters != null &&
-          element.typeParameters.length == typeArguments.arguments.length) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          var argumentText = utils.getNodeText(typeArguments);
-          builder.addSimpleInsertion(typeName.end, argumentText);
-          builder.addDeletion(range.node(typeArguments));
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS);
-      }
-    }
-  }
-
-  Future<void> _addFix_nonBoolCondition_addNotNull() async {
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleInsertion(error.offset + error.length, ' != null');
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_NE_NULL);
-  }
-
-  Future<void> _addFix_qualifyReference() async {
-    if (node is! SimpleIdentifier) {
-      return;
-    }
-    SimpleIdentifier memberName = node;
-    var parent = node.parent;
-    AstNode target;
-    if (parent is MethodInvocation && node == parent.methodName) {
-      target = parent.target;
-    } else if (parent is PropertyAccess && node == parent.propertyName) {
-      target = parent.target;
-    }
-    if (target != null) {
-      return;
-    }
-    var enclosingElement = memberName.staticElement.enclosingElement;
-    if (enclosingElement.library != unitLibraryElement) {
-      // TODO(brianwilkerson) Support qualifying references to members defined
-      //  in other libraries. `DartEditBuilder` currently defines the method
-      //  `writeType`, which is close, but we also need to handle extensions,
-      //  which don't have a type.
-      return;
-    }
-    var containerName = enclosingElement.name;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleInsertion(node.offset, '$containerName.');
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.QUALIFY_REFERENCE,
-        args: ['$containerName.${memberName.name}']);
-  }
-
-  Future<void> _addFix_removeAnnotation() async {
-    void addFix(Annotation node) async {
-      if (node == null) {
-        return;
-      }
-      var followingToken = node.endToken.next;
-      followingToken = followingToken.precedingComments ?? followingToken;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.startStart(node, followingToken));
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_ANNOTATION,
-          args: [node.name.name]);
-    }
-
-    Annotation findAnnotation(
-        NodeList<Annotation> metadata, String targetName) {
-      return metadata.firstWhere(
-          (annotation) => annotation.name.name == targetName,
-          orElse: () => null);
-    }
-
-    var node = coveredNode;
-    if (node is Annotation) {
-      await addFix(node);
-    } else if (node is DefaultFormalParameter) {
-      await addFix(findAnnotation(node.parameter.metadata, 'required'));
-    } else if (node is NormalFormalParameter) {
-      await addFix(findAnnotation(node.metadata, 'required'));
-    } else if (node is DeclaredSimpleIdentifier) {
-      var parent = node.parent;
-      if (parent is MethodDeclaration) {
-        await addFix(findAnnotation(parent.metadata, 'override'));
-      } else if (parent is VariableDeclaration) {
-        var fieldDeclaration = parent.thisOrAncestorOfType<FieldDeclaration>();
-        if (fieldDeclaration != null) {
-          await addFix(findAnnotation(fieldDeclaration.metadata, 'override'));
-        }
-      }
-    }
-  }
-
-  Future<void> _addFix_removeDeadCode() async {
-    var coveringNode = coveredNode;
-    if (coveringNode is Expression) {
-      var parent = coveredNode.parent;
-      if (parent is BinaryExpression) {
-        if (parent.rightOperand == coveredNode) {
-          var changeBuilder = _newDartChangeBuilder();
-          await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-            builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode));
-          });
-          _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE);
-        }
-      }
-    } else if (coveringNode is Block) {
-      var block = coveringNode;
-      var statementsToRemove = <Statement>[];
-      var errorRange = SourceRange(errorOffset, errorLength);
-      for (var statement in block.statements) {
-        if (range.node(statement).intersects(errorRange)) {
-          statementsToRemove.add(statement);
-        }
-      }
-      if (statementsToRemove.isNotEmpty) {
-        var rangeToRemove = utils.getLinesRangeStatements(statementsToRemove);
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addDeletion(rangeToRemove);
-        });
-        _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE);
-      }
-    } else if (coveringNode is Statement) {
-      var rangeToRemove =
-          utils.getLinesRangeStatements(<Statement>[coveringNode]);
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(rangeToRemove);
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE);
-    } else if (coveringNode is CatchClause) {
-      TryStatement tryStatement = coveringNode.parent;
-      var catchClauses = tryStatement.catchClauses;
-      var index = catchClauses.indexOf(coveringNode);
-      var previous = index == 0 ? tryStatement.body : catchClauses[index - 1];
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.endEnd(previous, coveringNode));
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE);
-    }
-  }
-
-  Future<void> _addFix_removeNameFromCombinator() async {
-    SourceRange rangeForCombinator(Combinator combinator) {
-      var parent = combinator.parent;
-      if (parent is NamespaceDirective) {
-        var combinators = parent.combinators;
-        if (combinators.length == 1) {
-          var previousToken =
-              combinator.parent.findPrevious(combinator.beginToken);
-          if (previousToken != null) {
-            return range.endEnd(previousToken, combinator);
-          }
-          return null;
-        }
-        var index = combinators.indexOf(combinator);
-        if (index < 0) {
-          return null;
-        } else if (index == combinators.length - 1) {
-          return range.endEnd(combinators[index - 1], combinator);
-        }
-        return range.startStart(combinator, combinators[index + 1]);
-      }
-      return null;
-    }
-
-    SourceRange rangeForNameInCombinator(
-        Combinator combinator, SimpleIdentifier name) {
-      NodeList<SimpleIdentifier> names;
-      if (combinator is HideCombinator) {
-        names = combinator.hiddenNames;
-      } else if (combinator is ShowCombinator) {
-        names = combinator.shownNames;
-      } else {
-        return null;
-      }
-      if (names.length == 1) {
-        return rangeForCombinator(combinator);
-      }
-      var index = names.indexOf(name);
-      if (index < 0) {
-        return null;
-      } else if (index == names.length - 1) {
-        return range.endEnd(names[index - 1], name);
-      }
-      return range.startStart(name, names[index + 1]);
-    }
-
-    var node = coveredNode;
-    if (node is SimpleIdentifier) {
-      var parent = coveredNode.parent;
-      if (parent is Combinator) {
-        var rangeToRemove = rangeForNameInCombinator(parent, node);
-        if (rangeToRemove == null) {
-          return;
-        }
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addDeletion(rangeToRemove);
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.REMOVE_NAME_FROM_COMBINATOR,
-            args: [parent is HideCombinator ? 'hide' : 'show']);
-      }
-    }
-  }
-
-  Future<void> _addFix_removeParameters_inGetterDeclaration() async {
-    if (node is MethodDeclaration) {
-      // Support for the analyzer error.
-      var method = node as MethodDeclaration;
-      var name = method.name;
-      var body = method.body;
-      if (name != null && body != null) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addSimpleReplacement(range.endStart(name, body), ' ');
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION);
-      }
-    } else if (node is FormalParameterList) {
-      // Support for the fasta error.
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.node(node));
-      });
-      _addFixFromBuilder(
-          changeBuilder, DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION);
-    }
-  }
-
-  Future<void> _addFix_removeParentheses_inGetterInvocation() async {
-    var invocation = coveredNode?.parent;
-    if (invocation is FunctionExpressionInvocation) {
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.node(invocation.argumentList));
-      });
-      _addFixFromBuilder(
-          changeBuilder, DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION);
-    }
-  }
-
-  Future<void> _addFix_removeTypeArguments() async {
-    if (coveredNode is TypeArgumentList) {
-      TypeArgumentList typeArguments = coveredNode;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.node(typeArguments));
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_TYPE_ARGUMENTS);
-    }
-  }
-
-  Future<void> _addFix_removeUnnecessaryCast() async {
-    if (coveredNode is! AsExpression) {
-      return;
-    }
-    var asExpression = coveredNode as AsExpression;
-    var expression = asExpression.expression;
-    var expressionPrecedence = getExpressionPrecedence(expression);
-    // remove 'as T' from 'e as T'
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addDeletion(range.endEnd(expression, asExpression));
-      _removeEnclosingParentheses(builder, asExpression, expressionPrecedence);
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNNECESSARY_CAST);
-  }
-
-  Future<void> _addFix_removeUnusedCatchClause() async {
-    if (node is SimpleIdentifier) {
-      var catchClause = node.parent;
-      if (catchClause is CatchClause &&
-          catchClause.exceptionParameter == node) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder.addDeletion(
-              range.startStart(catchClause.catchKeyword, catchClause.body));
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE);
-      }
-    }
-  }
-
-  Future<void> _addFix_removeUnusedCatchStack() async {
-    if (node is SimpleIdentifier) {
-      var catchClause = node.parent;
-      if (catchClause is CatchClause &&
-          catchClause.stackTraceParameter == node &&
-          catchClause.exceptionParameter != null) {
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          builder
-              .addDeletion(range.endEnd(catchClause.exceptionParameter, node));
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_STACK);
-      }
-    }
-  }
-
-  Future<void> _addFix_removeUnusedImport() async {
-    // prepare ImportDirective
-    var importDirective = node.thisOrAncestorOfType<ImportDirective>();
-    if (importDirective == null) {
-      return;
-    }
-    // remove the whole line with import
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addDeletion(utils.getLinesRange(range.node(importDirective)));
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_IMPORT);
-  }
-
-  Future<void> _addFix_removeUnusedLabel() async {
-    final parent = node.parent;
-    if (parent is Label) {
-      var nextToken = parent.endToken.next;
-      final changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addDeletion(range.startStart(parent, nextToken));
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_LABEL);
-    }
-  }
-
   Future<void> _addFix_replaceVarWithDynamic() async {
     var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
@@ -2965,47 +1835,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_VAR_WITH_DYNAMIC);
   }
 
-  Future<void> _addFix_replaceWithConstInstanceCreation() async {
-    if (coveredNode is InstanceCreationExpression) {
-      var instanceCreation = coveredNode as InstanceCreationExpression;
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        if (instanceCreation.keyword == null) {
-          builder.addSimpleInsertion(
-              instanceCreation.constructorName.offset, 'const');
-        } else {
-          builder.addSimpleReplacement(
-              range.token(instanceCreation.keyword), 'const');
-        }
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.USE_CONST);
-    }
-  }
-
-  Future<void> _addFix_replaceWithExtensionName() async {
-    if (node is! SimpleIdentifier) {
-      return;
-    }
-    var parent = node.parent;
-    AstNode target;
-    if (parent is MethodInvocation && node == parent.methodName) {
-      target = parent.target;
-    } else if (parent is PropertyAccess && node == parent.propertyName) {
-      target = parent.target;
-    }
-    if (target is! ExtensionOverride) {
-      return;
-    }
-    ExtensionOverride override = target;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleReplacement(
-          range.node(override), utils.getNodeText(override.extensionName));
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_EXTENSION_NAME,
-        args: [override.extensionName.name]);
-  }
-
   Future<void> _addFix_undefinedClass_useSimilar() async {
     var node = this.node;
     // Prepare the optional import prefix name.
@@ -3268,68 +2097,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.UPDATE_SDK_CONSTRAINTS);
   }
 
-  Future<void> _addFix_useEffectiveIntegerDivision() async {
-    for (var n = node; n != null; n = n.parent) {
-      if (n is MethodInvocation &&
-          n.offset == errorOffset &&
-          n.length == errorLength) {
-        var target = (n as MethodInvocation).target.unParenthesized;
-        var changeBuilder = _newDartChangeBuilder();
-        await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-          // replace "/" with "~/"
-          var binary = target as BinaryExpression;
-          builder.addSimpleReplacement(range.token(binary.operator), '~/');
-          // remove everything before and after
-          builder.addDeletion(range.startStart(n, binary.leftOperand));
-          builder.addDeletion(range.endEnd(binary.rightOperand, n));
-        });
-        _addFixFromBuilder(
-            changeBuilder, DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION);
-        // done
-        break;
-      }
-    }
-  }
-
-  /// Adds a fix that replaces [target] with a reference to the class declaring
-  /// the given [element].
-  Future<void> _addFix_useStaticAccess(AstNode target, Element element) async {
-    var declaringElement = element.enclosingElement;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(range.node(target), (DartEditBuilder builder) {
-        builder.writeReference(declaringElement);
-      });
-    });
-    _addFixFromBuilder(
-      changeBuilder,
-      DartFixKind.CHANGE_TO_STATIC_ACCESS,
-      args: [declaringElement.name],
-    );
-  }
-
-  Future<void> _addFix_useStaticAccess_method() async {
-    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
-      var invocation = node.parent as MethodInvocation;
-      if (invocation.methodName == node) {
-        var target = invocation.target;
-        var invokedElement = invocation.methodName.staticElement;
-        await _addFix_useStaticAccess(target, invokedElement);
-      }
-    }
-  }
-
-  Future<void> _addFix_useStaticAccess_property() async {
-    if (node is SimpleIdentifier && node.parent is PrefixedIdentifier) {
-      var prefixed = node.parent as PrefixedIdentifier;
-      if (prefixed.identifier == node) {
-        Expression target = prefixed.prefix;
-        var invokedElement = prefixed.identifier.staticElement;
-        await _addFix_useStaticAccess(target, invokedElement);
-      }
-    }
-  }
-
   void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
       {List<Object> args, bool importsOnly = false}) {
     if (builder == null) return;
@@ -3687,11 +2454,6 @@
     return method != null && method.isStatic;
   }
 
-  bool _isAwaitNode() {
-    var node = this.node;
-    return node is SimpleIdentifier && node.name == 'await';
-  }
-
   bool _isLibSrcPath(String path) {
     var parts = resourceProvider.pathContext.split(path);
     for (var i = 0; i < parts.length - 2; i++) {
@@ -3706,22 +2468,6 @@
     return DartChangeBuilderImpl.forWorkspace(context.workspace);
   }
 
-  /// Removes any [ParenthesizedExpression] enclosing [expr].
-  ///
-  /// [exprPrecedence] - the effective precedence of [expr].
-  void _removeEnclosingParentheses(
-      DartFileEditBuilder builder, Expression expr, Precedence exprPrecedence) {
-    while (expr.parent is ParenthesizedExpression) {
-      var parenthesized = expr.parent as ParenthesizedExpression;
-      if (getExpressionParentPrecedence(parenthesized) > exprPrecedence) {
-        break;
-      }
-      builder.addDeletion(range.token(parenthesized.leftParenthesis));
-      builder.addDeletion(range.token(parenthesized.rightParenthesis));
-      expr = parenthesized;
-    }
-  }
-
   void _updateFinderWithClassMembers(
       _ClosestElementFinder finder, ClassElement clazz) {
     if (clazz != null) {
@@ -3812,80 +2558,3 @@
     }
   }
 }
-
-/// [ExecutableElement], its parameters, and operations on them.
-class _ExecutableParameters {
-  final AnalysisSessionHelper sessionHelper;
-  final ExecutableElement executable;
-
-  final List<ParameterElement> required = [];
-  final List<ParameterElement> optionalPositional = [];
-  final List<ParameterElement> named = [];
-
-  factory _ExecutableParameters(
-      AnalysisSessionHelper sessionHelper, AstNode invocation) {
-    Element element;
-    // This doesn't handle FunctionExpressionInvocation.
-    if (invocation is Annotation) {
-      element = invocation.element;
-    } else if (invocation is InstanceCreationExpression) {
-      element = invocation.staticElement;
-    } else if (invocation is MethodInvocation) {
-      element = invocation.methodName.staticElement;
-    } else if (invocation is ConstructorReferenceNode) {
-      element = invocation.staticElement;
-    }
-    if (element is ExecutableElement && !element.isSynthetic) {
-      return _ExecutableParameters._(sessionHelper, element);
-    } else {
-      return null;
-    }
-  }
-
-  _ExecutableParameters._(this.sessionHelper, this.executable) {
-    for (var parameter in executable.parameters) {
-      if (parameter.isRequiredPositional) {
-        required.add(parameter);
-      } else if (parameter.isOptionalPositional) {
-        optionalPositional.add(parameter);
-      } else if (parameter.isNamed) {
-        named.add(parameter);
-      }
-    }
-  }
-
-  String get file => executable.source.fullName;
-
-  List<String> get namedNames {
-    return named.map((parameter) => parameter.name).toList();
-  }
-
-  /// Return the [FormalParameterList] of the [executable], or `null` is cannot
-  /// be found.
-  Future<FormalParameterList> getParameterList() async {
-    var result = await sessionHelper.getElementDeclaration(executable);
-    var targetDeclaration = result.node;
-    if (targetDeclaration is ConstructorDeclaration) {
-      return targetDeclaration.parameters;
-    } else if (targetDeclaration is FunctionDeclaration) {
-      var function = targetDeclaration.functionExpression;
-      return function.parameters;
-    } else if (targetDeclaration is MethodDeclaration) {
-      return targetDeclaration.parameters;
-    }
-    return null;
-  }
-
-  /// Return the [FormalParameter] of the [element] in [FormalParameterList],
-  /// or `null` is cannot be found.
-  Future<FormalParameter> getParameterNode(ParameterElement element) async {
-    var result = await sessionHelper.getElementDeclaration(element);
-    var declaration = result.node;
-    for (var node = declaration; node != null; node = node.parent) {
-      if (node is FormalParameter && node.parent is FormalParameterList) {
-        return node;
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
index a031ac7..427141a 100644
--- a/pkg/analysis_server/lib/src/services/flutter/property.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -432,7 +432,7 @@
     Expression bottomExpression;
     var propertyExpression = property.valueExpression;
     if (propertyExpression is InstanceCreationExpression) {
-      var constructor = propertyExpression.staticElement;
+      var constructor = propertyExpression.constructorName.staticElement;
       if (constructor?.enclosingElement == classEdgeInsets) {
         var arguments = propertyExpression.argumentList.arguments;
         if (constructor.name == 'all') {
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index 65769b0..174a9a2 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -152,7 +152,7 @@
       return null;
     }
 
-    var constructorElement = instanceCreation.staticElement;
+    var constructorElement = instanceCreation.constructorName.staticElement;
     if (constructorElement == null) {
       return null;
     }
@@ -267,7 +267,7 @@
     InstanceCreationExpression instanceCreation,
     ConstructorElement constructorElement,
   }) {
-    constructorElement ??= instanceCreation?.staticElement;
+    constructorElement ??= instanceCreation?.constructorName?.staticElement;
     constructorElement ??= classDescription?.constructor;
     if (constructorElement == null) return;
 
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index 187c91b..804b6b5 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -27,6 +27,8 @@
       'avoid_types_as_parameter_names';
   static const String avoid_types_on_closure_parameters =
       'avoid_types_on_closure_parameters';
+  static const String avoid_unused_constructor_parameters =
+      'avoid_unused_constructor_parameters';
   static const String await_only_futures = 'await_only_futures';
   static const String curly_braces_in_flow_control_structures =
       'curly_braces_in_flow_control_structures';
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
index 6d9bbf2..29a96b8 100644
--- a/pkg/analysis_server/lib/src/status/ast_writer.dart
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -95,7 +95,6 @@
       properties['static element'] = node.staticElement;
       properties['static type'] = node.staticType;
     } else if (node is InstanceCreationExpression) {
-      properties['static element'] = node.staticElement;
       properties['static type'] = node.staticType;
     } else if (node is LibraryDirective) {
       properties['element'] = node.element;
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 08c9469ab..0a9b690 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -247,7 +247,7 @@
 
   /// Return the presentation for the given Flutter `Widget` creation [node].
   String getWidgetPresentationText(InstanceCreationExpression node) {
-    var element = node.staticElement?.enclosingElement;
+    var element = node.constructorName.staticElement?.enclosingElement;
     if (!isWidget(element)) {
       return null;
     }
@@ -524,7 +524,7 @@
   /// Return `true` if the given [expr] is a constructor invocation for a
   /// class that has the Flutter class `Widget` as a superclass.
   bool isWidgetCreation(InstanceCreationExpression expr) {
-    var element = expr?.staticElement?.enclosingElement;
+    var element = expr?.constructorName?.staticElement?.enclosingElement;
     return isWidget(element);
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
index cb7fff9..c73b71b 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
@@ -96,9 +96,10 @@
 ''');
     // The order below is dependent on generated data, so it can validly change
     // when the data is re-generated.
+    // Getters, setters and fields now all have the same relevance.
     assertOrder([
       suggestionWith(completion: 'g'),
-      suggestionWith(completion: 's'),
+//      suggestionWith(completion: 's'),
       suggestionWith(completion: 'm'),
     ]);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
index d3a952e..a78beb0 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
@@ -54,11 +54,14 @@
   C.^
 }
 ''');
+    // The order below is dependent on generated data, so it can validly change
+    // when the data is re-generated.
+    // Getters, setters and fields now all have the same relevance.
     assertOrder([
-      suggestionWith(completion: 'g'),
-      suggestionWith(completion: 's'),
-      suggestionWith(completion: 'm'),
+//      suggestionWith(completion: 'g'),
+//      suggestionWith(completion: 's'),
       suggestionWith(completion: 'f'),
+      suggestionWith(completion: 'm'),
     ]);
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
index fd84462..0a9f0b2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
@@ -54,6 +54,17 @@
     await assertNoAssistAt('v;');
   }
 
+  Future<void> test_instanceCreation_freeStanding() async {
+    await resolveTestUnit('''
+class A {}
+
+main() {
+  A();
+}
+''');
+    await assertNoAssistAt('A();');
+  }
+
   Future<void> test_localVariable() async {
     await resolveTestUnit('''
 main() {
@@ -124,6 +135,23 @@
 ''');
   }
 
+  Future<void> test_loopVariable_nested() async {
+    await resolveTestUnit('''
+main() {
+  var v = () {
+    for (int x in <int>[]) {}
+  };
+}
+''');
+    await assertHasAssistAt('int x', '''
+main() {
+  var v = () {
+    for (var x in <int>[]) {}
+  };
+}
+''');
+  }
+
   Future<void> test_loopVariable_noType() async {
     await resolveTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
index ab9e0af..acc3551 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
@@ -10,12 +10,12 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ChangeToStaticAccessClassTest);
+    defineReflectiveTests(ChangeToStaticAccessTest);
   });
 }
 
 @reflectiveTest
-class ChangeToStaticAccessClassTest extends FixProcessorTest {
+class ChangeToStaticAccessTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.CHANGE_TO_STATIC_ACCESS;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
index 5a0c97c..eedea5b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
@@ -21,6 +21,23 @@
   @override
   FixKind get kind => DartFixKind.CREATE_CLASS;
 
+  Future<void> test_annotation() async {
+    await resolveTestUnit('''
+@Test('a')
+void f() {}
+''');
+    await assertHasFix('''
+@Test('a')
+void f() {}
+
+class Test {
+  const Test(String s);
+}
+''');
+    assertLinkedGroup(
+        change.linkedEditGroups[0], ["Test('", 'Test {', 'Test(S']);
+  }
+
   Future<void> test_hasUnresolvedPrefix() async {
     await resolveTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index a86150d..e8ed56b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -539,9 +538,7 @@
 import 'package:test/lib.dart';
 
 class X = Object with Test;
-''', errorFilter: (error) {
-      return error.errorCode == CompileTimeErrorCode.UNDEFINED_CLASS;
-    });
+''');
   }
 
   Future<void> test_withTopLevelVariable() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
new file mode 100644
index 0000000..1b691b3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
@@ -0,0 +1,217 @@
+// 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.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnusedParameterTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnusedParameterTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNUSED_PARAMETER;
+
+  @override
+  String get lintCode => LintNames.avoid_unused_constructor_parameters;
+
+  Future<void> test_first_optionalNamed_second_optionalNamed() async {
+    await resolveTestUnit('''
+class C {
+  int y;
+  C({int x = 0, this.y = 0});
+}
+''');
+    await assertHasFix('''
+class C {
+  int y;
+  C({this.y = 0});
+}
+''');
+  }
+
+  Future<void> test_first_optionalPositional_second_optionalPositional() async {
+    await resolveTestUnit('''
+class C {
+  int y;
+  C([int x = 0, this.y = 0]);
+}
+''');
+    await assertHasFix('''
+class C {
+  int y;
+  C([this.y = 0]);
+}
+''');
+  }
+
+  Future<void> test_first_requiredPositional_second_optionalNamed() async {
+    await resolveTestUnit('''
+class C {
+  int y;
+  C(int x, {this.y = 0});
+}
+''');
+    await assertHasFix('''
+class C {
+  int y;
+  C({this.y = 0});
+}
+''');
+  }
+
+  Future<void> test_first_requiredPositional_second_optionalPositional() async {
+    await resolveTestUnit('''
+class C {
+  int y;
+  C(int x, [this.y = 0]);
+}
+''');
+    await assertHasFix('''
+class C {
+  int y;
+  C([this.y = 0]);
+}
+''');
+  }
+
+  Future<void> test_first_requiredPositional_second_requiredPositional() async {
+    await resolveTestUnit('''
+class C {
+  int y;
+  C(int x, this.y);
+}
+''');
+    await assertHasFix('''
+class C {
+  int y;
+  C(this.y);
+}
+''');
+  }
+
+  Future<void> test_last_optionalNamed_previous_optionalNamed() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+  C({this.x = 0, int y = 0});
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+  C({this.x = 0});
+}
+''');
+  }
+
+  Future<void> test_last_optionalNamed_previous_requiredPositional() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+  C(this.x, {int y = 0});
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+  C(this.x);
+}
+''');
+  }
+
+  Future<void>
+      test_last_optionalPositional_previous_optionalPositional() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+  C([this.x = 0, int y = 0]);
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+  C([this.x = 0]);
+}
+''');
+  }
+
+  Future<void>
+      test_last_optionalPositional_previous_requiredPositional() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+  C(this.x, [int y = 0]);
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+  C(this.x);
+}
+''');
+  }
+
+  Future<void>
+      test_last_requiredPositional_previous_requiredPositional() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+  C(this.x, int y);
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+  C(this.x);
+}
+''');
+  }
+
+  Future<void> test_only_optionalNamed() async {
+    await resolveTestUnit('''
+class C {
+  C({int x = 0});
+}
+''');
+    await assertHasFix('''
+class C {
+  C();
+}
+''');
+  }
+
+  Future<void> test_only_optionalPositional() async {
+    await resolveTestUnit('''
+class C {
+  C([int x = 0]);
+}
+''');
+    await assertHasFix('''
+class C {
+  C();
+}
+''');
+  }
+
+  Future<void> test_only_requiredPositional() async {
+    await resolveTestUnit('''
+class C {
+  C(int x);
+}
+''');
+    await assertHasFix('''
+class C {
+  C();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 2c18bb7..736738d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -126,6 +126,7 @@
 import 'remove_unused_import_test.dart' as remove_unused_import;
 import 'remove_unused_label_test.dart' as remove_unused_label;
 import 'remove_unused_local_variable_test.dart' as remove_unused_local_variable;
+import 'remove_unused_parameter_test.dart' as remove_unused_parameter;
 import 'rename_to_camel_case_test.dart' as rename_to_camel_case;
 import 'replace_boolean_with_bool_test.dart' as replace_boolean_with_bool;
 import 'replace_colon_with_equals_test.dart' as replace_colon_with_equals;
@@ -269,6 +270,7 @@
     remove_unused_import.main();
     remove_unused_label.main();
     remove_unused_local_variable.main();
+    remove_unused_parameter.main();
     rename_to_camel_case.main();
     replace_boolean_with_bool.main();
     replace_colon_with_equals.main();
diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
index 0f06e85..ceb6dd8 100644
--- a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
@@ -1516,7 +1516,7 @@
   /// identifier that is a child of the [node].
   ElementKind _leftMostKind(AstNode node) {
     if (node is InstanceCreationExpression) {
-      return convertElementToElementKind(node.staticElement);
+      return convertElementToElementKind(node.constructorName.staticElement);
     }
     var element = _leftMostElement(node);
     if (element == null) {
diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
index fed80b42..fb0bff8 100644
--- a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart
@@ -6,8 +6,7 @@
 import 'dart:io' as io;
 
 import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
-import 'package:analysis_server/src/protocol_server.dart'
-    show convertElementToElementKind, ElementKind;
+import 'package:analysis_server/src/protocol_server.dart' show ElementKind;
 import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analysis_tool/tools.dart';
@@ -1276,7 +1275,8 @@
   /// identifier that is a child of the [node].
   ElementKind _leftMostKind(AstNode node) {
     if (node is InstanceCreationExpression) {
-      return convertElementToElementKind(node.staticElement);
+      return featureComputer
+          .computeElementKind(node.constructorName.staticElement);
     }
     var element = _leftMostElement(node);
     if (element == null) {
@@ -1288,7 +1288,7 @@
         element = parent.element;
       }
     }
-    return convertElementToElementKind(element);
+    return featureComputer.computeElementKind(element);
   }
 
   /// Return the left-most token that is a child of the [node].
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 3c9232f..2de4989 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,6 +1,8 @@
 ## 0.39.9-dev
 * Deprecated `DartType.isObject`, use `DartType.isDartCoreObject` for
   consistency with other similar getters.
+* Deprecated `InstanceCreationExpression.staticElement`, use
+  `constructorName.staticElement` instead, like for `MethodInvocation`.
 
 ## 0.39.8
 * Deprecated `VariableElement.constantValue`, it does not guarantee that
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index a97a7b5..7fe19b3 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -3291,6 +3291,14 @@
   /// Set the 'new' or 'const' keyword used to indicate how an object should be
   /// created to the given [token].
   set keyword(Token token);
+
+  @Deprecated('Use constructorName.staticElement')
+  @override
+  ConstructorElement get staticElement;
+
+  @Deprecated('Use constructorName.staticElement')
+  @override
+  set staticElement(ConstructorElement staticElement);
 }
 
 /// An integer literal expression.
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 7903c31..6d6db84 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -112,11 +112,7 @@
   @override
   Resource getResource(String path) {
     _ensureAbsoluteAndNormalized(path);
-    Resource resource = _pathToResource[path];
-    if (resource == null) {
-      resource = _MemoryFile(this, path);
-    }
-    return resource;
+    return _pathToResource[path] ?? _MemoryFile(this, path);
   }
 
   @override
@@ -517,11 +513,8 @@
   @override
   Resource getChild(String relPath) {
     String childPath = canonicalizePath(relPath);
-    _MemoryResource resource = _provider._pathToResource[childPath];
-    if (resource == null) {
-      resource = _MemoryFile(_provider, childPath);
-    }
-    return resource;
+    return _provider._pathToResource[childPath] ??
+        _MemoryFile(_provider, childPath);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 5d5bf1a..006e5f3 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -23,7 +23,6 @@
 const String implicitCastsFlag = 'implicit-casts';
 const String lintsFlag = 'lints';
 const String noImplicitDynamicFlag = 'no-implicit-dynamic';
-const String packageRootOption = 'package-root';
 const String packagesOption = 'packages';
 const String sdkPathOption = 'dart-sdk';
 
@@ -69,7 +68,6 @@
   builderOptions.defaultAnalysisOptionsFilePath =
       args[analysisOptionsFileOption];
   builderOptions.defaultPackageFilePath = args[packagesOption];
-  builderOptions.defaultPackagesDirectoryPath = args[packageRootOption];
   //
   // Analysis options.
   //
@@ -137,10 +135,6 @@
       help: 'The path to the Dart SDK.', hide: ddc && hide);
   parser.addOption(analysisOptionsFileOption,
       help: 'Path to an analysis options file.', hide: ddc && hide);
-  parser.addOption(packageRootOption,
-      help: 'The path to a package root directory (deprecated). '
-          'This option cannot be used with --packages.',
-      hide: ddc && hide);
   parser.addFlag('strong',
       help: 'Enable strong mode (deprecated); this option is now ignored.',
       defaultsTo: true,
@@ -170,8 +164,7 @@
       hide: hide);
   parser.addOption(packagesOption,
       help: 'The path to the package resolution configuration file, which '
-          'supplies a mapping of package names\nto paths. This option cannot be '
-          'used with --package-root.',
+          'supplies a mapping of package names\nto paths.',
       hide: ddc);
   parser.addOption(sdkSummaryPathOption,
       help: 'The path to the Dart SDK summary file.', hide: hide);
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 7aec79d..711a930 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -28,7 +28,6 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
 import 'package:analyzer/src/workspace/gn.dart';
@@ -36,7 +35,6 @@
 import 'package:analyzer/src/workspace/pub.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:args/args.dart';
-import 'package:path/src/context.dart';
 import 'package:yaml/yaml.dart';
 
 /// A utility class used to build an analysis context for a given directory.
@@ -183,17 +181,14 @@
 //  }
 
   Packages createPackageMap(String rootDirectoryPath) {
-    String filePath = builderOptions.defaultPackageFilePath;
-    if (filePath != null) {
-      File configFile = resourceProvider.getFile(filePath);
+    var configPath = builderOptions.defaultPackageFilePath;
+    if (configPath != null) {
+      var configFile = resourceProvider.getFile(configPath);
       return parsePackagesFile(resourceProvider, configFile);
+    } else {
+      var resource = resourceProvider.getResource(rootDirectoryPath);
+      return findPackagesFrom(resourceProvider, resource);
     }
-    String directoryPath = builderOptions.defaultPackagesDirectoryPath;
-    if (directoryPath != null) {
-      Folder folder = resourceProvider.getFolder(directoryPath);
-      return getPackagesFromFolder(folder);
-    }
-    return findPackagesFromFile(rootDirectoryPath);
   }
 
   SourceFactory createSourceFactory(String rootPath, AnalysisOptions options,
@@ -217,28 +212,6 @@
     }
   }
 
-  /// Finds a package resolution strategy for the directory at the given absolute
-  /// [path].
-  ///
-  /// This function first tries to locate a `.packages` file in the directory. If
-  /// that is not found, it instead checks for the presence of a `packages/`
-  /// directory in the same place. If that also fails, it starts checking parent
-  /// directories for a `.packages` file, and stops if it finds it. Otherwise it
-  /// gives up and returns [Packages.empty].
-  Packages findPackagesFromFile(String path) {
-    Resource location = _findPackagesLocation(path);
-    if (location is File) {
-      try {
-        return parsePackagesFile(resourceProvider, location);
-      } catch (_) {
-        return Packages.empty;
-      }
-    } else if (location is Folder) {
-      return getPackagesFromFolder(location);
-    }
-    return Packages.empty;
-  }
-
   /// Return the SDK that should be used to analyze code. Use the given
   /// [workspace] and [analysisOptions] to locate the SDK.
   ///
@@ -385,96 +358,6 @@
     return null;
   }
 
-  /// Create a [Packages] object for a 'package' directory ([folder]).
-  ///
-  /// Package names are resolved as relative to sub-directories of the package
-  /// directory.
-  ///
-  /// TODO(scheglov) Remove this feature
-  Packages getPackagesFromFolder(Folder folder) {
-    Context pathContext = resourceProvider.pathContext;
-    var map = <String, Package>{};
-    for (Resource child in folder.getChildren()) {
-      if (child is Folder) {
-        // Inline resolveSymbolicLinks for performance reasons.
-        String packageName = pathContext.basename(child.path);
-        String packagePath = resolveSymbolicLink(child);
-        var rootFolder = resourceProvider.getFolder(packagePath);
-        var libFolder = rootFolder.getChildAssumingFolder('lib');
-        var package = Package(
-          name: packageName,
-          rootFolder: rootFolder,
-          libFolder: libFolder,
-          languageVersion: null,
-        );
-        map[packageName] = package;
-      }
-    }
-    return Packages(map);
-  }
-
-  /// Resolve any symbolic links encoded in the path to the given [folder].
-  String resolveSymbolicLink(Folder folder) {
-    try {
-      return folder.resolveSymbolicLinksSync().path;
-    } on FileSystemException {
-      return folder.path;
-    }
-  }
-
-  /// Resolve any symbolic links encoded in the URI's in the given [map] by
-  /// replacing the values in the map.
-  void resolveSymbolicLinks(Map<String, Uri> map) {
-    Context pathContext = resourceProvider.pathContext;
-    for (String packageName in map.keys) {
-      var uri = map[packageName];
-      String path = fileUriToNormalizedPath(pathContext, uri);
-      Folder folder = resourceProvider.getFolder(path);
-      String folderPath = resolveSymbolicLink(folder);
-      // Add a '.' so that the URI is suitable for resolving relative URI's
-      // against it.
-      String uriPath = pathContext.join(folderPath, '.');
-      map[packageName] = pathContext.toUri(uriPath);
-    }
-  }
-
-  /// Find the location of the package resolution file/directory for the
-  /// directory at the given absolute [path].
-  ///
-  /// Checks for a `.packages` file in the [path]. If not found,
-  /// checks for a `packages` directory in the same directory. If still not
-  /// found, starts checking parent directories for `.packages` until reaching
-  /// the root directory.
-  ///
-  /// Return a [File] object representing a `.packages` file if one is found, a
-  /// [Folder] object for the `packages/` directory if that is found, or `null`
-  /// if neither is found.
-  Resource _findPackagesLocation(String path) {
-    var resource = resourceProvider.getResource(path);
-    while (resource != null) {
-      if (resource is Folder) {
-        var packageConfigFile = resource
-            .getChildAssumingFolder('.dart_tool')
-            .getChildAssumingFile('package_config.json');
-        if (packageConfigFile.exists) {
-          return packageConfigFile;
-        }
-
-        var dotPackagesFile = resource.getChildAssumingFile('.packages');
-        if (dotPackagesFile.exists) {
-          return dotPackagesFile;
-        }
-
-        var packagesDirectory = resource.getChildAssumingFolder('packages');
-        if (packagesDirectory.exists) {
-          return packagesDirectory;
-        }
-      }
-      resource = resource.parent;
-    }
-    return null;
-  }
-
   /// Return the `pubspec.yaml` file that should be used when analyzing code in
   /// the directory with the given [path], possibly `null`.
   File _findPubspecFile(String path) {
@@ -563,11 +446,6 @@
   /// or `null` if the normal lookup mechanism should be used.
   String defaultPackageFilePath;
 
-  /// The file path of the packages directory that should be used in place of any
-  /// file found using the normal (Package Specification DEP) lookup mechanism,
-  /// or `null` if the normal lookup mechanism should be used.
-  String defaultPackagesDirectoryPath;
-
   /// A list of the paths of summary files that are to be used, or `null` if no
   /// summary information is available.
   List<String> librarySummaryPaths;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 6f57735..23ba36c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -233,6 +233,8 @@
 
   AnalysisDriverTestView _testView;
 
+  FeatureSetProvider featureSetProvider;
+
   FileSystemState _fsState;
 
   /// The [FileTracker] used by this driver.
@@ -1479,7 +1481,7 @@
   void _createFileTracker() {
     _fillSalt();
 
-    var featureSetProvider = FeatureSetProvider.build(
+    featureSetProvider = FeatureSetProvider.build(
       sourceFactory: sourceFactory,
       packages: _packages,
       packageDefaultFeatureSet: _analysisOptions.contextFeatures,
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 037c789..816685d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -42,7 +42,8 @@
       if (argumentList is ArgumentList) {
         var invocation = argumentList.parent;
         if (invocation is InstanceCreationExpression) {
-          return namedParameterElement(invocation.staticElement);
+          var executable = invocation.constructorName.staticElement;
+          return namedParameterElement(executable);
         } else if (invocation is MethodInvocation) {
           var executable = invocation.methodName.staticElement;
           if (executable is ExecutableElement) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 798129c..86fdc7f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -166,15 +166,18 @@
                   var existingSource = existingElement?.source;
                   var libraryRefs = elementFactory.rootReference.children;
                   var libraryUriList = libraryRefs.map((e) => e.name).toList();
-                  throw StateError(
-                    '[The library is already loaded]'
-                    '[oldUri: ${existingSource.uri}]'
-                    '[oldPath: ${existingSource.fullName}]'
-                    '[newUri: ${libraryFile.uriStr}]'
-                    '[newPath: ${libraryFile.path}]'
-                    '[cycle: $cycle]'
-                    '[loadedBundles: ${loadedBundles.toList()}]'
-                    '[elementFactory.libraries: $libraryUriList]',
+                  var statusText = '[The library is already loaded]'
+                      '[oldUri: ${existingSource.uri}]'
+                      '[oldPath: ${existingSource.fullName}]'
+                      '[newUri: ${libraryFile.uriStr}]'
+                      '[newPath: ${libraryFile.path}]'
+                      '[cycle: $cycle]'
+                      '[loadedBundles: ${loadedBundles.toList()}]'
+                      '[elementFactory.libraries: $libraryUriList]';
+                  throw LibraryCycleLinkException(
+                    'Cycle loading state error',
+                    StackTrace.current,
+                    {'status': statusText},
                   );
                 }
               }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 8bac535..67b1448 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -806,9 +806,7 @@
         }
       }
     } else {
-      if (_propertyMap == null) {
-        _propertyMap = HashMap<String, Object>();
-      }
+      _propertyMap ??= HashMap<String, Object>();
       _propertyMap[name] = value;
     }
   }
@@ -6022,12 +6020,6 @@
   /// The list of arguments to the constructor.
   ArgumentListImpl _argumentList;
 
-  /// The element associated with the constructor based on static type
-  /// information, or `null` if the AST structure has not been resolved or if
-  /// the constructor could not be resolved.
-  @override
-  ConstructorElement staticElement;
-
   /// Initialize a newly created instance creation expression.
   InstanceCreationExpressionImpl(this.keyword,
       ConstructorNameImpl constructorName, ArgumentListImpl argumentList,
@@ -6081,6 +6073,14 @@
   @override
   Precedence get precedence => Precedence.primary;
 
+  @Deprecated('Use constructorName.staticElement')
+  @override
+  ConstructorElement get staticElement => constructorName.staticElement;
+
+  @Deprecated('Use constructorName.staticElement')
+  @override
+  set staticElement(ConstructorElement staticElement) {}
+
   /// Return the type arguments associated with the constructor, rather than
   /// with the class in which the constructor is defined. It is always an error
   /// if there are type arguments because Dart doesn't currently support generic
diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
index 432f8f1..4d7d81d 100644
--- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
@@ -108,7 +108,7 @@
 
   @override
   Element visitInstanceCreationExpression(InstanceCreationExpression node) {
-    return node.staticElement;
+    return node.constructorName.staticElement;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 0da70e2..27b83c1 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -1094,9 +1094,7 @@
     }
 
     token = nonComment(token);
-    if (_lastCloned == null) {
-      _lastCloned = Token.eof(-1);
-    }
+    _lastCloned ??= Token.eof(-1);
     while (token != null) {
       Token clone = token.copy();
       {
@@ -4855,7 +4853,6 @@
         _isEqualTokens(node.keyword, toNode.keyword),
         _isEqualNodes(node.constructorName, toNode.constructorName),
         _isEqualNodes(node.argumentList, toNode.argumentList))) {
-      toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
       return true;
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 9a1d3e7..6e670ce 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -132,7 +132,7 @@
 
       // We need to evaluate the constant to see if any errors occur during its
       // evaluation.
-      ConstructorElement constructor = node.staticElement;
+      ConstructorElement constructor = node.constructorName.staticElement;
       if (constructor != null) {
         ConstantVisitor constantVisitor =
             ConstantVisitor(_evaluationEngine, _errorReporter);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 721ad3c..569a568 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -468,13 +468,11 @@
     namedNodes ??= const {};
     namedValues ??= const {};
 
-    if (invocation == null) {
-      invocation = ConstructorInvocation(
-        constructor,
-        argumentValues,
-        namedValues,
-      );
-    }
+    invocation ??= ConstructorInvocation(
+      constructor,
+      argumentValues,
+      namedValues,
+    );
 
     constructor = followConstantRedirectionChain(constructor);
     InterfaceType definingClass = constructor.returnType as InterfaceType;
@@ -603,12 +601,10 @@
         argumentValue = argumentValues[i];
         errorTarget = arguments[i];
       }
-      if (errorTarget == null) {
-        // No argument node that we can direct error messages to, because we
-        // are handling an optional parameter that wasn't specified.  So just
-        // direct error messages to the constructor call.
-        errorTarget = node;
-      }
+      // No argument node that we can direct error messages to, because we
+      // are handling an optional parameter that wasn't specified.  So just
+      // direct error messages to the constructor call.
+      errorTarget ??= node;
       if (argumentValue == null && baseParameter is ParameterElementImpl) {
         // The parameter is an optional positional parameter for which no value
         // was provided, so use the default value.
@@ -740,9 +736,7 @@
       ConstructorElement superConstructor =
           superclass.lookUpConstructor(superName, constructor.library);
       if (superConstructor != null) {
-        if (superArguments == null) {
-          superArguments = astFactory.nodeList<Expression>(null);
-        }
+        superArguments ??= astFactory.nodeList<Expression>(null);
 
         evaluateSuperConstructorCall(node, fieldMap, superConstructor,
             superArguments, initializerVisitor, externalErrorReporter);
@@ -1174,7 +1168,7 @@
       _error(node, null);
       return null;
     }
-    ConstructorElement constructor = node.staticElement;
+    ConstructorElement constructor = node.constructorName.staticElement;
     if (constructor == null) {
       // Couldn't resolve the constructor so we can't compute a value.  No
       // problem - the error has already been reported.
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 4ed65ae..72e220c 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -55,7 +55,6 @@
         expression.keyword = KeywordToken(Keyword.NEW, node.offset);
       }
     }
-    expression.staticElement = node.staticElement;
     return expression;
   }
 
@@ -296,7 +295,8 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
-      ConstructorElement constructor = node.staticElement?.declaration;
+      ConstructorElement constructor =
+          node.constructorName.staticElement?.declaration;
       if (constructor != null) {
         _callback(constructor);
       }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index aba8c07..0f26e2f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2735,10 +2735,7 @@
   int get hashCode {
     // TODO: We might want to re-visit this optimization in the future.
     // We cache the hash code value as this is a very frequently called method.
-    if (_cachedHashCode == null) {
-      _cachedHashCode = location.hashCode;
-    }
-    return _cachedHashCode;
+    return _cachedHashCode ??= location.hashCode;
   }
 
   @override
@@ -3060,9 +3057,7 @@
 
   @override
   String getExtendedDisplayName(String shortName) {
-    if (shortName == null) {
-      shortName = displayName;
-    }
+    shortName ??= displayName;
     Source source = this.source;
     if (source != null) {
       return "$shortName (${source.fullName})";
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index 4834c4a..c99951f 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -2,12 +2,10 @@
 // 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 'dart:collection';
 import 'dart:math' as math;
 
 import 'package:analyzer/dart/ast/ast.dart' show AstNode, ConstructorName;
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
@@ -15,46 +13,12 @@
 import 'package:analyzer/src/dart/element/nullability_eliminator.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
-import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/error/codes.dart' show HintCode, StrongModeCode;
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:meta/meta.dart';
 
-bool _isBottom(DartType t) {
-  return (t.isBottom && t.nullabilitySuffix != NullabilitySuffix.question) ||
-      identical(t, UnknownInferredType.instance);
-}
-
-/// Is [t] the bottom of the legacy type hierarchy.
-bool _isLegacyBottom(DartType t, {@required bool orTrueBottom}) {
-  return (t.isBottom && t.nullabilitySuffix == NullabilitySuffix.question) ||
-      t.isDartCoreNull ||
-      (orTrueBottom ? _isBottom(t) : false);
-}
-
-/// Is [t] the top of the legacy type hierarch.
-bool _isLegacyTop(DartType t, {@required bool orTrueTop}) {
-  if (t.isDartAsyncFutureOr) {
-    return _isLegacyTop((t as InterfaceType).typeArguments[0],
-        orTrueTop: orTrueTop);
-  }
-  if (t.isDartCoreObject && t.nullabilitySuffix == NullabilitySuffix.none) {
-    return true;
-  }
-  return orTrueTop ? _isTop(t) : false;
-}
-
-bool _isTop(DartType t) {
-  if (t.isDartAsyncFutureOr) {
-    return _isTop((t as InterfaceType).typeArguments[0]);
-  }
-  return t.isDynamic ||
-      (t.isDartCoreObject && t.nullabilitySuffix != NullabilitySuffix.none) ||
-      t.isVoid ||
-      identical(t, UnknownInferredType.instance);
-}
-
 /// Tracks upper and lower type bounds for a set of type parameters.
 ///
 /// This class is used by calling [isSubtypeOf]. When it encounters one of
@@ -80,19 +44,16 @@
 /// infer a single call and discarded immediately afterwards.
 class GenericInferrer {
   final TypeSystemImpl _typeSystem;
-  final Map<TypeParameterElement, List<_TypeConstraint>> constraints = {};
-
-  /// Buffer recording constraints recorded while performing a recursive call to
-  /// [_matchSubtypeOf] that might fail, so that any constraints recorded during
-  /// the failed match can be rewound.
-  final _undoBuffer = <_TypeConstraint>[];
+  final Set<TypeParameterElement> _typeParameters = Set.identity();
+  final Map<TypeParameterElement, List<_TypeConstraint>> _constraints = {};
 
   GenericInferrer(
     this._typeSystem,
     Iterable<TypeParameterElement> typeFormals,
   ) {
+    _typeParameters.addAll(typeFormals);
     for (var formal in typeFormals) {
-      constraints[formal] = [];
+      _constraints[formal] = [];
     }
   }
 
@@ -185,9 +146,9 @@
 
       inferredTypes[i] = downwardsInferPhase
           ? _inferTypeParameterFromContext(
-              constraints[typeParam], extendsClause,
+              _constraints[typeParam], extendsClause,
               isContravariant: typeParam.variance.isContravariant)
-          : _inferTypeParameterFromAll(constraints[typeParam], extendsClause,
+          : _inferTypeParameterFromAll(_constraints[typeParam], extendsClause,
               isContravariant: typeParam.variance.isContravariant,
               preferUpwardsInference: !typeParam.isLegacyCovariant);
     }
@@ -202,7 +163,7 @@
     var knownTypes = <TypeParameterElement, DartType>{};
     for (int i = 0; i < typeFormals.length; i++) {
       TypeParameterElement typeParam = typeFormals[i];
-      var constraints = this.constraints[typeParam];
+      var constraints = this._constraints[typeParam];
       var typeParamBound = typeParam.bound != null
           ? Substitution.fromPairs(typeFormals, inferredTypes)
               .substituteType(typeParam.bound)
@@ -306,11 +267,27 @@
   /// attempt have been rewound (see [_rewindConstraints]).
   bool tryMatchSubtypeOf(DartType t1, DartType t2, _TypeConstraintOrigin origin,
       {@required bool covariant}) {
-    int previousRewindBufferLength = _undoBuffer.length;
-    bool success = _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
-    if (!success) {
-      _rewindConstraints(previousRewindBufferLength);
+    var gatherer = TypeConstraintGatherer(
+      typeSystem: _typeSystem,
+      typeParameters: _typeParameters,
+    );
+    var success = gatherer.trySubtypeMatch(t1, t2, !covariant);
+    if (success) {
+      var constraints = gatherer.computeConstraints();
+      for (var entry in constraints.entries) {
+        if (!entry.value.isEmpty) {
+          _constraints[entry.key].add(
+            _TypeConstraint(
+              origin,
+              entry.key,
+              lower: entry.value.lower,
+              upper: entry.value.upper,
+            ),
+          );
+        }
+      }
     }
+
     return success;
   }
 
@@ -484,265 +461,6 @@
     return t;
   }
 
-  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
-  ///
-  /// The return value indicates whether the match was successful.  If it was
-  /// unsuccessful, the caller is responsible for ignoring any constraints that
-  /// were accumulated (see [_rewindConstraints]).
-  bool _matchInterfaceSubtypeOf(InterfaceType i1, InterfaceType i2,
-      Set<Element> visited, _TypeConstraintOrigin origin,
-      {@required bool covariant}) {
-    if (identical(i1, i2)) {
-      return true;
-    }
-
-    if (i1.element == i2.element) {
-      return _matchInterfaceSubtypeOf2(i1, i2, origin, covariant);
-    }
-
-    for (var interface in i1.element.allSupertypes) {
-      if (interface.element == i2.element) {
-        var substitution = Substitution.fromInterfaceType(i1);
-        var substitutedInterface = substitution.substituteType(interface);
-        return _matchInterfaceSubtypeOf2(
-            substitutedInterface, i2, origin, covariant);
-      }
-    }
-    return false;
-  }
-
-  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
-  ///
-  /// The return value indicates whether the match was successful.  If it was
-  /// unsuccessful, the caller is responsible for ignoring any constraints that
-  /// were accumulated (see [_rewindConstraints]).
-  ///
-  /// Interfaces [i1] and [i2] are instantiations of the same class element.
-  bool _matchInterfaceSubtypeOf2(InterfaceType i1, InterfaceType i2,
-      _TypeConstraintOrigin origin, bool covariant) {
-    List<DartType> tArgs1 = i1.typeArguments;
-    List<DartType> tArgs2 = i2.typeArguments;
-    List<TypeParameterElement> tParams = i1.element.typeParameters;
-    assert(tArgs1.length == tArgs2.length);
-    assert(tArgs1.length == tParams.length);
-    for (int i = 0; i < tArgs1.length; i++) {
-      TypeParameterElement typeParameterElement = tParams[i];
-
-      // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
-      // variance is added to the interface.
-      Variance parameterVariance =
-          (typeParameterElement as TypeParameterElementImpl).variance;
-      if (parameterVariance.isCovariant) {
-        if (!_matchSubtypeOf(tArgs1[i], tArgs2[i], HashSet<Element>(), origin,
-            covariant: covariant)) {
-          return false;
-        }
-      } else if (parameterVariance.isContravariant) {
-        if (!_matchSubtypeOf(tArgs2[i], tArgs1[i], HashSet<Element>(), origin,
-            covariant: !covariant)) {
-          return false;
-        }
-      } else if (parameterVariance.isInvariant) {
-        if (!_matchSubtypeOf(tArgs1[i], tArgs2[i], HashSet<Element>(), origin,
-                covariant: covariant) ||
-            !_matchSubtypeOf(tArgs2[i], tArgs1[i], HashSet<Element>(), origin,
-                covariant: !covariant)) {
-          return false;
-        }
-      } else {
-        throw StateError("Type parameter ${tParams[i]} has unknown "
-            "variance $parameterVariance for inference.");
-      }
-    }
-    return true;
-  }
-
-  /// Assert that [t1] will be a subtype of [t2], and returns if the constraint
-  /// can be satisfied.
-  ///
-  /// [covariant] must be true if [t1] is a declared type of the generic
-  /// function and [t2] is the context type, or false if the reverse. For
-  /// example [covariant] is used when [t1] is the declared return type
-  /// and [t2] is the context type. Contravariant would be used if [t1] is the
-  /// argument type (i.e. passed in to the generic function) and [t2] is the
-  /// declared parameter type.
-  ///
-  /// [origin] indicates where the constraint came from, for example an argument
-  /// or return type.
-  bool _matchSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
-      _TypeConstraintOrigin origin,
-      {@required bool covariant}) {
-    if (covariant && t1 is TypeParameterType) {
-      var constraints = this.constraints[t1.element];
-      if (constraints != null) {
-        if (!identical(t2, UnknownInferredType.instance)) {
-          if (t1.nullabilitySuffix == NullabilitySuffix.question &&
-              t2.nullabilitySuffix == NullabilitySuffix.question) {
-            t1 = _typeSystem.promoteToNonNull(t1);
-            t2 = _typeSystem.promoteToNonNull(t2);
-          }
-          var constraint = _TypeConstraint(origin, t1.element, upper: t2);
-          constraints.add(constraint);
-          _undoBuffer.add(constraint);
-        }
-        return true;
-      }
-    }
-    if (!covariant && t2 is TypeParameterType) {
-      var constraints = this.constraints[t2.element];
-      if (constraints != null) {
-        if (!identical(t1, UnknownInferredType.instance)) {
-          if (t1.nullabilitySuffix == NullabilitySuffix.question &&
-              t2.nullabilitySuffix == NullabilitySuffix.question) {
-            t1 = _typeSystem.promoteToNonNull(t1);
-            t2 = _typeSystem.promoteToNonNull(t2);
-          }
-          var constraint = _TypeConstraint(origin, t2.element, lower: t1);
-          constraints.add(constraint);
-          _undoBuffer.add(constraint);
-        }
-        return true;
-      }
-    }
-
-    if (identical(t1, t2)) {
-      return true;
-    }
-
-    // TODO(jmesserly): this logic is taken from subtype.
-    bool matchSubtype(DartType t1, DartType t2) {
-      return _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
-    }
-
-    // Handle FutureOr<T> union type.
-    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-      var t1TypeArg = t1.typeArguments[0];
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        var t2TypeArg = t2.typeArguments[0];
-        // FutureOr<A> <: FutureOr<B> iff A <: B
-        return matchSubtype(t1TypeArg, t2TypeArg);
-      }
-
-      // given t1 is Future<A> | A, then:
-      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
-      var t1Future = typeProvider.futureType2(t1TypeArg);
-      return matchSubtype(t1Future, t2) && matchSubtype(t1TypeArg, t2);
-    }
-
-    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-      // given t2 is Future<A> | A, then:
-      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
-      var t2TypeArg = t2.typeArguments[0];
-      var t2Future = typeProvider.futureType2(t2TypeArg);
-
-      // First we try matching `t1 <: Future<A>`.  If that succeeds *and*
-      // records at least one constraint, then we proceed using that constraint.
-      var previousRewindBufferLength = _undoBuffer.length;
-      var success =
-          tryMatchSubtypeOf(t1, t2Future, origin, covariant: covariant);
-
-      if (_undoBuffer.length != previousRewindBufferLength) {
-        // Trying to match `t1 <: Future<A>` succeeded and recorded constraints,
-        // so those are the constraints we want.
-        return true;
-      } else {
-        // Either `t1 <: Future<A>` failed to match, or it matched trivially
-        // without recording any constraints (e.g. because t1 is `Null`).  We
-        // want constraints, because they let us do more precise inference, so
-        // go ahead and try matching `t1 <: A` to see if it records any
-        // constraints.
-        if (tryMatchSubtypeOf(t1, t2TypeArg, origin, covariant: covariant)) {
-          // Trying to match `t1 <: A` succeeded.  If it recorded constraints,
-          // those are the constraints we want.  If it didn't, then there's no
-          // way we're going to get any constraints.  So either way, we want to
-          // return `true` since the match suceeded and the constraints we want
-          // (if any) have been recorded.
-          return true;
-        } else {
-          // Trying to match `t1 <: A` failed.  So there's no way we are going
-          // to get any constraints.  Just return `success` to indicate whether
-          // the match succeeded.
-          return success;
-        }
-      }
-    }
-
-    // S <: T where S is a type variable
-    //  T is not dynamic or object (handled above)
-    //  True if T == S
-    //  Or true if bound of S is S' and S' <: T
-
-    if (t1 is TypeParameterType) {
-      // Guard against recursive type parameters
-      //
-      // TODO(jmesserly): this function isn't guarding against anything (it's
-      // not passsing down `visitedSet`, so adding the element has no effect).
-      bool guardedSubtype(DartType t1, DartType t2) {
-        var visitedSet = visited ?? HashSet<Element>();
-        if (visitedSet.add(t1.element)) {
-          bool matched = matchSubtype(t1, t2);
-          visitedSet.remove(t1.element);
-          return matched;
-        } else {
-          // In the case of a recursive type parameter, consider the subtype
-          // match to have failed.
-          return false;
-        }
-      }
-
-      if (t2 is TypeParameterType && t1.definition == t2.definition) {
-        return guardedSubtype(t1.bound, t2.bound);
-      }
-      return guardedSubtype(t1.bound, t2);
-    }
-    if (t2 is TypeParameterType) {
-      return false;
-    }
-
-    // TODO(mfairhurst): switch legacy Bottom checks to true Bottom checks
-    // TODO(mfairhurst): switch legacy Top checks to true Top checks
-    if (_isLegacyBottom(t1, orTrueBottom: true) ||
-        _isLegacyTop(t2, orTrueTop: true)) return true;
-
-    if (t1 is InterfaceType && t2 is InterfaceType) {
-      return _matchInterfaceSubtypeOf(t1, t2, visited, origin,
-          covariant: covariant);
-    }
-
-    if (t1 is FunctionType && t2 is FunctionType) {
-      return FunctionTypeImpl.relate(t1, t2, matchSubtype,
-          parameterRelation: (p1, p2) {
-            return _matchSubtypeOf(p2.type, p1.type, null, origin,
-                covariant: !covariant);
-          },
-          // Type parameter bounds are invariant.
-          boundsRelation: (t1, t2, p1, p2) =>
-              matchSubtype(t1, t2) && matchSubtype(t2, t1));
-    }
-
-    if (t1 is FunctionType && t2 == typeProvider.functionType) {
-      return true;
-    }
-
-    return false;
-  }
-
-  /// Un-does constraints that were gathered by a failed match attempt, until
-  /// [_undoBuffer] has length [previousRewindBufferLength].
-  ///
-  /// The intended usage is that the caller should record the length of
-  /// [_undoBuffer] before attempting to make a match.  Then, if the match
-  /// fails, pass the recorded length to this method to erase any constraints
-  /// that were recorded during the failed match.
-  void _rewindConstraints(int previousRewindBufferLength) {
-    while (_undoBuffer.length > previousRewindBufferLength) {
-      var constraint = _undoBuffer.removeLast();
-      var element = constraint.typeParameter;
-      assert(identical(constraints[element].last, constraint));
-      constraints[element].removeLast();
-    }
-  }
-
   /// If in a legacy library, return the legacy version of the [type].
   /// Otherwise, return the original type.
   DartType _toLegacyType(DartType type) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
new file mode 100644
index 0000000..f4d6a54
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
@@ -0,0 +1,574 @@
+// Copyright (c) 2020, 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:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_schema.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+import 'package:meta/meta.dart';
+
+/// A constraint on the type [parameter] that we're inferring.
+/// We require that `lower <: parameter <: upper`.
+class TypeConstraint {
+  final TypeParameterElement parameter;
+  final DartType lower;
+  final DartType upper;
+
+  TypeConstraint._(this.parameter, this.lower, this.upper);
+
+  bool get isEmpty {
+    return identical(lower, UnknownInferredType.instance) &&
+        identical(upper, UnknownInferredType.instance);
+  }
+
+  @override
+  String toString() {
+    var lowerStr = lower.getDisplayString(withNullability: true);
+    var upperStr = upper.getDisplayString(withNullability: true);
+    return '$lowerStr <: ${parameter.name} <: $upperStr';
+  }
+}
+
+/// Creates sets of [TypeConstraint]s for type parameters, based on an attempt
+/// to make one type schema a subtype of another.
+class TypeConstraintGatherer {
+  final TypeSystemImpl _typeSystem;
+  final Set<TypeParameterElement> _typeParameters = Set.identity();
+  final List<TypeConstraint> _constraints = [];
+
+  TypeConstraintGatherer({
+    @required TypeSystemImpl typeSystem,
+    @required Iterable<TypeParameterElement> typeParameters,
+  }) : _typeSystem = typeSystem {
+    _typeParameters.addAll(typeParameters);
+  }
+
+  DartType get _defaultTypeParameterBound {
+    if (_typeSystem.isNonNullableByDefault) {
+      return _typeSystem.objectQuestion;
+    } else {
+      return DynamicTypeImpl.instance;
+    }
+  }
+
+  /// Returns the set of type constraints that was gathered.
+  Map<TypeParameterElement, TypeConstraint> computeConstraints() {
+    var result = <TypeParameterElement, TypeConstraint>{};
+    for (var parameter in _typeParameters) {
+      result[parameter] = TypeConstraint._(
+        parameter,
+        UnknownInferredType.instance,
+        UnknownInferredType.instance,
+      );
+    }
+
+    for (var constraint in _constraints) {
+      var parameter = constraint.parameter;
+      var mergedConstraint = result[parameter];
+
+      var lower = _typeSystem.getLeastUpperBound(
+        mergedConstraint.lower,
+        constraint.lower,
+      );
+
+      var upper = _typeSystem.getGreatestLowerBound(
+        mergedConstraint.upper,
+        constraint.upper,
+      );
+
+      result[parameter] = TypeConstraint._(parameter, lower, upper);
+    }
+
+    return result;
+  }
+
+  /// Tries to match [P] as a subtype for [Q].
+  ///
+  /// If the match succeeds, the resulting type constraints are recorded for
+  /// later use by [computeConstraints].  If the match fails, the set of type
+  /// constraints is unchanged.
+  bool trySubtypeMatch(DartType P, DartType Q, bool leftSchema) {
+    // If `P` is `_` then the match holds with no constraints.
+    if (identical(P, UnknownInferredType.instance)) {
+      return true;
+    }
+
+    // If `Q` is `_` then the match holds with no constraints.
+    if (identical(Q, UnknownInferredType.instance)) {
+      return true;
+    }
+
+    // If `P` is a type variable `X` in `L`, then the match holds:
+    //   Under constraint `_ <: X <: Q`.
+    var P_nullability = P.nullabilitySuffix;
+    if (P is TypeParameterType &&
+        P_nullability == NullabilitySuffix.none &&
+        _typeParameters.contains(P.element)) {
+      _addUpper(P.element, Q);
+      return true;
+    }
+
+    // If `Q` is a type variable `X` in `L`, then the match holds:
+    //   Under constraint `P <: X <: _`.
+    var Q_nullability = Q.nullabilitySuffix;
+    if (Q is TypeParameterType &&
+        Q_nullability == NullabilitySuffix.none &&
+        _typeParameters.contains(Q.element)) {
+      _addLower(Q.element, P);
+      return true;
+    }
+
+    // If `P` and `Q` are identical types, then the subtype match holds
+    // under no constraints.
+    if (P == Q) {
+      return true;
+    }
+
+    // If `P` is a legacy type `P0*` then the match holds under constraint
+    // set `C`:
+    //   Only if `P0` is a subtype match for `Q` under constraint set `C`.
+    if (P_nullability == NullabilitySuffix.star) {
+      var P0 = (P as TypeImpl).withNullability(NullabilitySuffix.none);
+      return trySubtypeMatch(P0, Q, leftSchema);
+    }
+
+    // If `Q` is a legacy type `Q0*` then the match holds under constraint
+    // set `C`:
+    //   Only if `P` is a subtype match for `Q?` under constraint set `C`.
+    if (Q_nullability == NullabilitySuffix.star) {
+      var Qq = (Q as TypeImpl).withNullability(NullabilitySuffix.question);
+      return trySubtypeMatch(P, Qq, leftSchema);
+    }
+
+    // If `Q` is `FutureOr<Q0>` the match holds under constraint set `C`:
+    if (Q_nullability == NullabilitySuffix.none &&
+        Q is InterfaceType &&
+        Q.isDartAsyncFutureOr) {
+      var Q0 = Q.typeArguments[0];
+      var rewind = _constraints.length;
+
+      // If `P` is `FutureOr<P0>` and `P0` is a subtype match for `Q0` under
+      // constraint set `C`.
+      if (P_nullability == NullabilitySuffix.none &&
+          P is InterfaceType &&
+          P.isDartAsyncFutureOr) {
+        var P0 = P.typeArguments[0];
+        if (trySubtypeMatch(P0, Q0, leftSchema)) {
+          return true;
+        }
+        _constraints.length = rewind;
+      }
+
+      // Or if `P` is a subtype match for `Future<Q0>` under non-empty
+      // constraint set `C`.
+      var futureQ0 = _futureNone(Q0);
+      var P_matches_FutureQ0 = trySubtypeMatch(P, futureQ0, leftSchema);
+      if (P_matches_FutureQ0 && _constraints.length != rewind) {
+        return true;
+      }
+      _constraints.length = rewind;
+
+      // Or if `P` is a subtype match for `Q0` under constraint set `C`.
+      if (trySubtypeMatch(P, Q0, leftSchema)) {
+        return true;
+      }
+      _constraints.length = rewind;
+
+      // Or if `P` is a subtype match for `Future<Q0>` under empty
+      // constraint set `C`.
+      if (P_matches_FutureQ0) {
+        return true;
+      }
+    }
+
+    // If `Q` is `Q0?` the match holds under constraint set `C`:
+    if (Q_nullability == NullabilitySuffix.question) {
+      var Q0 = (Q as TypeImpl).withNullability(NullabilitySuffix.none);
+      var rewind = _constraints.length;
+
+      // If `P` is `P0?` and `P0` is a subtype match for `Q0` under
+      // constraint set `C`.
+      if (P_nullability == NullabilitySuffix.question) {
+        var P0 = (P as TypeImpl).withNullability(NullabilitySuffix.none);
+        if (trySubtypeMatch(P0, Q0, leftSchema)) {
+          return true;
+        }
+        _constraints.length = rewind;
+      }
+
+      // Or if `P` is a subtype match for `Q0` under non-empty
+      // constraint set `C`.
+      var P_matches_Q0 = trySubtypeMatch(P, Q0, leftSchema);
+      if (P_matches_Q0 && _constraints.length != rewind) {
+        return true;
+      }
+      _constraints.length = rewind;
+
+      // Or if `P` is a subtype match for `Null` under constraint set `C`.
+      if (trySubtypeMatch(P, _typeSystem.nullNone, leftSchema)) {
+        return true;
+      }
+      _constraints.length = rewind;
+
+      // Or if `P` is a subtype match for `Q0` under empty
+      // constraint set `C`.
+      if (P_matches_Q0) {
+        return true;
+      }
+    }
+
+    // If `P` is `FutureOr<P0>` the match holds under constraint set `C1 + C2`:
+    if (P_nullability == NullabilitySuffix.none &&
+        P is InterfaceType &&
+        P.isDartAsyncFutureOr) {
+      var P0 = P.typeArguments[0];
+      var rewind = _constraints.length;
+
+      // If `Future<P0>` is a subtype match for `Q` under constraint set `C1`.
+      // And if `P0` is a subtype match for `Q` under constraint set `C2`.
+      var future_P0 = _futureNone(P0);
+      if (trySubtypeMatch(future_P0, Q, leftSchema) &&
+          trySubtypeMatch(P0, Q, leftSchema)) {
+        return true;
+      }
+
+      _constraints.length = rewind;
+    }
+
+    // If `P` is `P0?` the match holds under constraint set `C1 + C2`:
+    if (P_nullability == NullabilitySuffix.question) {
+      var P0 = (P as TypeImpl).withNullability(NullabilitySuffix.none);
+      var rewind = _constraints.length;
+
+      // If `P0` is a subtype match for `Q` under constraint set `C1`.
+      // And if `Null` is a subtype match for `Q` under constraint set `C2`.
+      if (trySubtypeMatch(P0, Q, leftSchema) &&
+          trySubtypeMatch(_typeSystem.nullNone, Q, leftSchema)) {
+        return true;
+      }
+
+      _constraints.length = rewind;
+    }
+
+    // If `Q` is `dynamic`, `Object?`, or `void` then the match holds under
+    // no constraints.
+    if (identical(Q, DynamicTypeImpl.instance) ||
+        identical(Q, VoidTypeImpl.instance) ||
+        Q_nullability == NullabilitySuffix.question && Q.isDartCoreObject) {
+      return true;
+    }
+
+    // If `P` is `Never` then the match holds under no constraints.
+    if (identical(P, NeverTypeImpl.instance)) {
+      return true;
+    }
+
+    // If `Q` is `Object`, then the match holds under no constraints:
+    //  Only if `P` is non-nullable.
+    if (Q_nullability == NullabilitySuffix.none && Q.isDartCoreObject) {
+      return _typeSystem.isNonNullable(P);
+    }
+
+    // If `P` is `Null`, then the match holds under no constraints:
+    //  Only if `Q` is nullable.
+    if (P_nullability == NullabilitySuffix.none && P.isDartCoreNull) {
+      return _typeSystem.isNullable(Q);
+    }
+
+    // If `P` is a type variable `X` with bound `B` (or a promoted type
+    // variable `X & B`), the match holds with constraint set `C`:
+    //   If `B` is a subtype match for `Q` with constraint set `C`.
+    // Note: we have already eliminated the case that `X` is a variable in `L`.
+    if (P_nullability == NullabilitySuffix.none && P is TypeParameterTypeImpl) {
+      var rewind = _constraints.length;
+      var B = P.promotedBound ?? P.element.bound;
+      if (B != null && trySubtypeMatch(B, Q, leftSchema)) {
+        return true;
+      }
+      _constraints.length = rewind;
+    }
+
+    if (P is InterfaceType && Q is InterfaceType) {
+      return _interfaceType(P, Q, leftSchema);
+    }
+
+    // If `Q` is `Function` then the match holds under no constraints:
+    //   If `P` is a function type.
+    if (Q_nullability == NullabilitySuffix.none && Q.isDartCoreFunction) {
+      if (P is FunctionType) {
+        return true;
+      }
+    }
+
+    if (P is FunctionType && Q is FunctionType) {
+      return _functionType(P, Q, leftSchema);
+    }
+
+    return false;
+  }
+
+  void _addLower(TypeParameterElement element, DartType lower) {
+    _constraints.add(
+      TypeConstraint._(element, lower, UnknownInferredType.instance),
+    );
+  }
+
+  void _addUpper(TypeParameterElement element, DartType upper) {
+    _constraints.add(
+      TypeConstraint._(element, UnknownInferredType.instance, upper),
+    );
+  }
+
+  bool _functionType(FunctionType P, FunctionType Q, bool leftSchema) {
+    if (P.nullabilitySuffix != NullabilitySuffix.none) {
+      return false;
+    }
+
+    if (Q.nullabilitySuffix != NullabilitySuffix.none) {
+      return false;
+    }
+
+    var P_typeFormals = P.typeFormals;
+    var Q_typeFormals = Q.typeFormals;
+    if (P_typeFormals.length != Q_typeFormals.length) {
+      return false;
+    }
+
+    if (P_typeFormals.isEmpty && Q_typeFormals.isEmpty) {
+      return _functionType0(P, Q, leftSchema);
+    }
+
+    // We match two generic function types:
+    // `<T0 extends B00, ..., Tn extends B0n>F0`
+    // `<S0 extends B10, ..., Sn extends B1n>F1`
+    // with respect to `L` under constraint set `C2`:
+    var rewind = _constraints.length;
+
+    // If `B0i` is a subtype match for `B1i` with constraint set `Ci0`.
+    // If `B1i` is a subtype match for `B0i` with constraint set `Ci1`.
+    // And `Ci2` is `Ci0 + Ci1`.
+    for (var i = 0; i < P_typeFormals.length; i++) {
+      var B0 = P_typeFormals[i].bound ?? _defaultTypeParameterBound;
+      var B1 = Q_typeFormals[i].bound ?? _defaultTypeParameterBound;
+      if (!trySubtypeMatch(B0, B1, leftSchema)) {
+        _constraints.length = rewind;
+        return false;
+      }
+      if (!trySubtypeMatch(B1, B0, !leftSchema)) {
+        _constraints.length = rewind;
+        return false;
+      }
+    }
+
+    // And `Z0...Zn` are fresh variables with bounds `B20, ..., B2n`.
+    //   Where `B2i` is `B0i[Z0/T0, ..., Zn/Tn]` if `P` is a type schema.
+    //   Or `B2i` is `B1i[Z0/S0, ..., Zn/Sn]` if `Q` is a type schema.
+    // In other words, we choose the bounds for the fresh variables from
+    // whichever of the two generic function types is a type schema and does
+    // not contain any variables from `L`.
+    var newTypeParameters = <TypeParameterElement>[];
+    for (var i = 0; i < P_typeFormals.length; i++) {
+      var Z = TypeParameterElementImpl('Z$i', -1);
+      if (leftSchema) {
+        Z.bound = P_typeFormals[i].bound;
+      } else {
+        Z.bound = Q_typeFormals[i].bound;
+      }
+      newTypeParameters.add(Z);
+    }
+
+    // And `F0[Z0/T0, ..., Zn/Tn]` is a subtype match for
+    // `F1[Z0/S0, ..., Zn/Sn]` with respect to `L` under constraints `C0`.
+    var typeArguments = newTypeParameters
+        .map((e) => e.instantiate(nullabilitySuffix: NullabilitySuffix.none))
+        .toList();
+    var P_instantiated = P.instantiate(typeArguments);
+    var Q_instantiated = Q.instantiate(typeArguments);
+    if (!_functionType0(P_instantiated, Q_instantiated, leftSchema)) {
+      _constraints.length = rewind;
+      return false;
+    }
+
+    // And `C1` is `C02 + ... + Cn2 + C0`.
+    // And `C2` is `C1` with each constraint replaced with its closure
+    // with respect to `[Z0, ..., Zn]`.
+    // TODO(scheglov) do closure
+
+    return true;
+  }
+
+  /// A function type `(M0,..., Mn, [M{n+1}, ..., Mm]) -> R0` is a subtype
+  /// match for a function type `(N0,..., Nk, [N{k+1}, ..., Nr]) -> R1` with
+  /// respect to `L` under constraints `C0 + ... + Cr + C`.
+  bool _functionType0(FunctionType f, FunctionType g, bool leftSchema) {
+    var rewind = _constraints.length;
+
+    // If `R0` is a subtype match for a type `R1` with respect to `L` under
+    // constraints `C`.
+    if (!trySubtypeMatch(f.returnType, g.returnType, leftSchema)) {
+      _constraints.length = rewind;
+      return false;
+    }
+
+    var fParameters = f.parameters;
+    var gParameters = g.parameters;
+
+    // And for `i` in `0...r`, `Ni` is a subtype match for `Mi` with respect
+    // to `L` under constraints `Ci`.
+    var fIndex = 0;
+    var gIndex = 0;
+    while (fIndex < fParameters.length && gIndex < gParameters.length) {
+      var fParameter = fParameters[fIndex];
+      var gParameter = gParameters[gIndex];
+      if (fParameter.isRequiredPositional) {
+        if (gParameter.isRequiredPositional) {
+          if (trySubtypeMatch(gParameter.type, fParameter.type, leftSchema)) {
+            fIndex++;
+            gIndex++;
+          } else {
+            _constraints.length = rewind;
+            return false;
+          }
+        } else {
+          _constraints.length = rewind;
+          return false;
+        }
+      } else if (fParameter.isOptionalPositional) {
+        if (gParameter.isPositional) {
+          if (trySubtypeMatch(gParameter.type, fParameter.type, leftSchema)) {
+            fIndex++;
+            gIndex++;
+          } else {
+            _constraints.length = rewind;
+            return false;
+          }
+        } else {
+          _constraints.length = rewind;
+          return false;
+        }
+      } else if (fParameter.isNamed) {
+        if (gParameter.isNamed) {
+          var compareNames = fParameter.name.compareTo(gParameter.name);
+          if (compareNames == 0) {
+            if (trySubtypeMatch(gParameter.type, fParameter.type, leftSchema)) {
+              fIndex++;
+              gIndex++;
+            } else {
+              _constraints.length = rewind;
+              return false;
+            }
+          } else if (compareNames < 0) {
+            if (fParameter.isRequiredNamed) {
+              _constraints.length = rewind;
+              return false;
+            } else {
+              fIndex++;
+            }
+          } else {
+            assert(compareNames > 0);
+            // The subtype must accept all parameters of the supertype.
+            _constraints.length = rewind;
+            return false;
+          }
+        } else {
+          break;
+        }
+      }
+    }
+
+    // The supertype must provide all required parameters to the subtype.
+    while (fIndex < fParameters.length) {
+      var fParameter = fParameters[fIndex++];
+      if (fParameter.isNotOptional) {
+        _constraints.length = rewind;
+        return false;
+      }
+    }
+
+    // The subtype must accept all parameters of the supertype.
+    assert(fIndex == fParameters.length);
+    if (gIndex < gParameters.length) {
+      _constraints.length = rewind;
+      return false;
+    }
+
+    return true;
+  }
+
+  InterfaceType _futureNone(DartType argument) {
+    var element = _typeSystem.typeProvider.futureElement;
+    return element.instantiate(
+      typeArguments: [argument],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  bool _interfaceType(InterfaceType P, InterfaceType Q, bool leftSchema) {
+    if (P.nullabilitySuffix != NullabilitySuffix.none) {
+      return false;
+    }
+
+    if (Q.nullabilitySuffix != NullabilitySuffix.none) {
+      return false;
+    }
+
+    // If `P` is `C<M0, ..., Mk> and `Q` is `C<N0, ..., Nk>`, then the match
+    // holds under constraints `C0 + ... + Ck`:
+    //   If `Mi` is a subtype match for `Ni` with respect to L under
+    //   constraints `Ci`.
+    if (P.element == Q.element) {
+      if (!_interfaceType_arguments(P, Q, leftSchema)) {
+        return false;
+      }
+      return true;
+    }
+
+    // If `P` is `C0<M0, ..., Mk>` and `Q` is `C1<N0, ..., Nj>` then the match
+    // holds with respect to `L` under constraints `C`:
+    //   If `C1<B0, ..., Bj>` is a superinterface of `C0<M0, ..., Mk>` and
+    //   `C1<B0, ..., Bj>` is a subtype match for `C1<N0, ..., Nj>` with
+    //   respect to `L` under constraints `C`.
+    var C0 = P.element;
+    var C1 = Q.element;
+    for (var interface in C0.allSupertypes) {
+      if (interface.element == C1) {
+        var substitution = Substitution.fromInterfaceType(P);
+        return _interfaceType_arguments(
+          substitution.substituteType(interface),
+          Q,
+          leftSchema,
+        );
+      }
+    }
+
+    return false;
+  }
+
+  /// Match arguments of [P] against arguments of [Q].
+  /// If returns `false`, the constraints are unchanged.
+  bool _interfaceType_arguments(
+    InterfaceType P,
+    InterfaceType Q,
+    bool leftSchema,
+  ) {
+    assert(P.element == Q.element);
+
+    var rewind = _constraints.length;
+
+    for (var i = 0; i < P.typeArguments.length; i++) {
+      var M = P.typeArguments[i];
+      var N = Q.typeArguments[i];
+      if (!trySubtypeMatch(M, N, leftSchema)) {
+        _constraints.length = rewind;
+        return false;
+      }
+    }
+
+    return true;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 495f5ca..0f67958 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -369,19 +369,16 @@
   @deprecated
   @override
   DartObjectImpl get nullObject {
-    if (_nullObject == null) {
-      _nullObject = DartObjectImpl(
-        TypeSystemImpl(
-          implicitCasts: false,
-          isNonNullableByDefault: false,
-          strictInference: false,
-          typeProvider: this,
-        ),
-        nullType,
-        NullState.NULL_STATE,
-      );
-    }
-    return _nullObject;
+    return _nullObject ??= DartObjectImpl(
+      TypeSystemImpl(
+        implicitCasts: false,
+        isNonNullableByDefault: false,
+        strictInference: false,
+        typeProvider: this,
+      ),
+      nullType,
+      NullState.NULL_STATE,
+    );
   }
 
   InterfaceTypeImpl get nullStar {
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index a805bcd..710453b8 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -90,9 +90,9 @@
    *
    * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
    */
-  final Set<ConstantEvaluationTarget> _libraryConstants = Set();
+  final Set<ConstantEvaluationTarget> _libraryConstants = {};
 
-  final Set<ConstantEvaluationTarget> _constants = Set();
+  final Set<ConstantEvaluationTarget> _constants = {};
 
   final String Function(String path) getFileContent;
 
@@ -547,7 +547,7 @@
     ErrorReporter libraryErrorReporter = _getErrorReporter(_library);
 
     LibraryIdentifier libraryNameNode;
-    var seenPartSources = Set<Source>();
+    var seenPartSources = <Source>{};
     var directivesToResolve = <Directive>[];
     int partIndex = 0;
     for (Directive directive in definingCompilationUnit.directives) {
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 3e80669..7133ec0 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -61,8 +61,8 @@
   final List<FileState> importedFiles = [];
   final List<FileState> exportedFiles = [];
   final List<FileState> partedFiles = [];
-  final Set<FileState> directReferencedFiles = Set();
-  final Set<FileState> directReferencedLibraries = Set();
+  final Set<FileState> directReferencedFiles = {};
+  final Set<FileState> directReferencedLibraries = {};
   final List<FileState> libraryFiles = [];
   FileState partOfLibrary;
 
@@ -545,7 +545,7 @@
   final List<FileState> libraries = [];
 
   /// The library cycles that this cycle references directly.
-  final Set<LibraryCycle> directDependencies = Set<LibraryCycle>();
+  final Set<LibraryCycle> directDependencies = <LibraryCycle>{};
 
   /// The transitive signature of this cycle.
   ///
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 098854c..15f53c7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -107,15 +107,11 @@
    */
   void _analyzeLeastUpperBoundTypes(
       Expression node, DartType staticType1, DartType staticType2) {
-    if (staticType1 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType1 = DynamicTypeImpl.instance;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType1 ??= DynamicTypeImpl.instance;
 
-    if (staticType2 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType2 = DynamicTypeImpl.instance;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType2 ??= DynamicTypeImpl.instance;
 
     DartType staticType =
         _typeSystem.getLeastUpperBound(staticType1, staticType2) ??
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 9bb990e..0c70edc 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -84,15 +84,11 @@
   /// TODO(scheglov) this is duplicate
   void _analyzeLeastUpperBoundTypes(
       Expression node, DartType staticType1, DartType staticType2) {
-    if (staticType1 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType1 = DynamicTypeImpl.instance;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType1 ??= DynamicTypeImpl.instance;
 
-    if (staticType2 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType2 = DynamicTypeImpl.instance;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType2 ??= DynamicTypeImpl.instance;
 
     DartType staticType =
         _typeSystem.getLeastUpperBound(staticType1, staticType2) ??
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index 5d517cb..4bc73dc 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -55,6 +55,7 @@
       DartType uninstantiatedType, TypeArgumentList typeArguments,
       {AstNode errorNode, bool isConst = false}) {
     errorNode ??= inferenceNode;
+    uninstantiatedType = _getFreshType(uninstantiatedType);
     if (typeArguments == null &&
         uninstantiatedType is FunctionType &&
         uninstantiatedType.typeFormals.isNotEmpty) {
@@ -295,6 +296,8 @@
     @required bool isConst,
     @required AstNode errorNode,
   }) {
+    rawType = _getFreshType(rawType);
+
     // Get the parameters that correspond to the uninstantiated generic.
     List<ParameterElement> rawParameters =
         ResolverVisitor.resolveArgumentsToParameters(
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 6e73920..07d96a2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -308,12 +308,8 @@
     if (propertyName.inSetterContext()) {
       element = classElement.getSetter(name);
     }
-    if (element == null) {
-      element = classElement.getGetter(name);
-    }
-    if (element == null) {
-      element = classElement.getMethod(name);
-    }
+    element ??= classElement.getGetter(name);
+    element ??= classElement.getMethod(name);
     if (element != null && element.isAccessibleIn(_definingLibrary)) {
       return element;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index cbf7366..e6b0ac6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -69,169 +67,44 @@
   void resolveTypeName(TypeName node) {
     rewriteResult = null;
 
-    Identifier typeName = node.name;
+    var typeIdentifier = node.name;
 
-    if (typeName is SimpleIdentifier && typeName.name == 'void') {
+    if (typeIdentifier is SimpleIdentifier && typeIdentifier.name == 'void') {
       node.type = VoidTypeImpl.instance;
       return;
     }
 
-    _setElement(typeName, null); // Clear old Elements from previous run.
-
-    TypeArgumentList argumentList = node.typeArguments;
-    Element element = nameScope.lookup(typeName, definingLibrary);
-    if (element == null) {
-      node.type = dynamicType;
-      if (nameScope.shouldIgnoreUndefined(typeName)) {
-        return;
-      }
-      //
-      // If not, the look to see whether we might have created the wrong AST
-      // structure for a constructor name. If so, fix the AST structure and then
-      // proceed.
-      //
-      AstNode parent = node.parent;
-      if (typeName is PrefixedIdentifier &&
-          parent is ConstructorName &&
-          argumentList == null) {
-        ConstructorName name = parent;
-        if (name.name == null) {
-          PrefixedIdentifier prefixedIdentifier =
-              typeName as PrefixedIdentifier;
-          SimpleIdentifier prefix = prefixedIdentifier.prefix;
-          element = nameScope.lookup(prefix, definingLibrary);
-          if (element is PrefixElement) {
-            if (nameScope.shouldIgnoreUndefined(typeName)) {
-              return;
-            }
-            AstNode grandParent = parent.parent;
-            if (grandParent is InstanceCreationExpression &&
-                grandParent.isConst) {
-              // If, if this is a const expression, then generate a
-              // CompileTimeErrorCode.CONST_WITH_NON_TYPE error.
-              errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.CONST_WITH_NON_TYPE,
-                prefixedIdentifier.identifier,
-                [prefixedIdentifier.identifier.name],
-              );
-            } else {
-              // Else, if this expression is a new expression, report a
-              // NEW_WITH_NON_TYPE warning.
-              errorReporter.reportErrorForNode(
-                StaticWarningCode.NEW_WITH_NON_TYPE,
-                prefixedIdentifier.identifier,
-                [prefixedIdentifier.identifier.name],
-              );
-            }
-            _setElement(prefix, element);
-            return;
-          } else if (element != null) {
-            //
-            // Rewrite the constructor name. The parser, when it sees a
-            // constructor named "a.b", cannot tell whether "a" is a prefix and
-            // "b" is a class name, or whether "a" is a class name and "b" is a
-            // constructor name. It arbitrarily chooses the former, but in this
-            // case was wrong.
-            //
-            name.name = prefixedIdentifier.identifier;
-            name.period = prefixedIdentifier.period;
-            node.name = prefix;
-            typeName = prefix;
-            rewriteResult = parent;
-          }
-        }
-      }
-      if (nameScope.shouldIgnoreUndefined(typeName)) {
-        return;
-      }
-    }
+    var element = nameScope.lookup(typeIdentifier, definingLibrary);
 
     if (element is MultiplyDefinedElement) {
-      _setElement(typeName, element);
+      _setElement(typeIdentifier, element);
       node.type = dynamicType;
       return;
     }
 
-    var errorHelper = _ErrorHelper(errorReporter);
-    if (errorHelper.checkNewWithNonType(node, element)) {
-      _setElement(typeName, element);
-      node.type = dynamicType;
+    if (element != null) {
+      _setElement(typeIdentifier, element);
+      node.type = _instantiateElement(node, element);
       return;
     }
 
-    if (element == null) {
-      if (errorHelper.checkNullOrNonTypeElement(node, element)) {
-        _setElement(typeName, element);
-        node.type = dynamicType;
-        return;
-      }
-
-      if (typeName is PrefixedIdentifier &&
-          node.parent is ConstructorName &&
-          argumentList != null) {
-        SimpleIdentifier prefix = (typeName as PrefixedIdentifier).prefix;
-        SimpleIdentifier identifier =
-            (typeName as PrefixedIdentifier).identifier;
-        Element prefixElement = nameScope.lookup(prefix, definingLibrary);
-        ClassElement classElement;
-        ConstructorElement constructorElement;
-        if (prefixElement is ClassElement) {
-          classElement = prefixElement;
-          constructorElement =
-              prefixElement.getNamedConstructor(identifier.name);
-        }
-        if (constructorElement != null) {
-          errorReporter.reportErrorForNode(
-            StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
-            argumentList,
-            [prefix.name, identifier.name],
-          );
-          prefix.staticElement = prefixElement;
-          identifier.staticElement = constructorElement;
-          AstNode grandParent = node.parent.parent;
-          if (grandParent is InstanceCreationExpressionImpl) {
-            var instanceType = classElement.instantiate(
-              typeArguments: List.filled(
-                classElement.typeParameters.length,
-                dynamicType,
-              ),
-              nullabilitySuffix: _noneOrStarSuffix,
-            );
-            grandParent.staticElement = constructorElement;
-            grandParent.staticType = instanceType;
-            //
-            // Re-write the AST to reflect the resolution.
-            //
-            TypeName newTypeName = astFactory.typeName(prefix, null);
-            newTypeName.type = instanceType;
-            ConstructorName newConstructorName = astFactory.constructorName(
-                newTypeName,
-                (typeName as PrefixedIdentifier).period,
-                identifier);
-            newConstructorName.staticElement = constructorElement;
-            NodeReplacer.replace(node.parent, newConstructorName);
-            grandParent.typeArguments = node.typeArguments;
-            // Re-assign local variables that have effectively changed.
-            node = newTypeName;
-            typeName = prefix;
-            element = prefixElement;
-            argumentList = null;
-            rewriteResult = newConstructorName;
-          }
-        } else {
-          errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.UNDEFINED_CLASS,
-            typeName,
-            [typeName.name],
-          );
-        }
-      } else {
-        errorHelper.reportUnresolvedElement(node);
-      }
+    if (_rewriteToConstructorName(node)) {
+      return;
     }
 
-    _setElement(typeName, element);
-    node.type = _instantiateElement(node, element);
+    // Full `prefix.Name` cannot be resolved, try to resolve 'prefix' alone.
+    if (typeIdentifier is PrefixedIdentifier) {
+      var prefixIdentifier = typeIdentifier.prefix;
+      var prefixElement = nameScope.lookup(prefixIdentifier, definingLibrary);
+      prefixIdentifier.staticElement = prefixElement;
+    }
+
+    node.type = dynamicType;
+    if (nameScope.shouldIgnoreUndefined(typeIdentifier)) {
+      return;
+    }
+
+    _ErrorHelper(errorReporter).reportNullOrNonTypeElement(node, null);
   }
 
   /// Return type arguments, exactly [parameterCount].
@@ -315,6 +188,9 @@
           typeArguments: typeArguments,
           nullabilitySuffix: nullability,
         );
+      } else if (_isInstanceCreation(node)) {
+        _ErrorHelper(errorReporter).reportNewWithNonType(node);
+        return dynamicType;
       } else if (element is DynamicElementImpl) {
         _buildTypeArguments(node, 0);
         return DynamicTypeImpl.instance;
@@ -340,7 +216,7 @@
           nullabilitySuffix: nullability,
         );
       } else {
-        _ErrorHelper(errorReporter).checkNullOrNonTypeElement(node, element);
+        _ErrorHelper(errorReporter).reportNullOrNonTypeElement(node, element);
         return dynamicType;
       }
     }
@@ -362,6 +238,9 @@
         classElement: element,
         nullabilitySuffix: nullability,
       );
+    } else if (_isInstanceCreation(node)) {
+      _ErrorHelper(errorReporter).reportNewWithNonType(node);
+      return dynamicType;
     } else if (element is DynamicElementImpl) {
       return DynamicTypeImpl.instance;
     } else if (element is FunctionTypeAliasElement) {
@@ -378,7 +257,7 @@
         nullabilitySuffix: nullability,
       );
     } else {
-      _ErrorHelper(errorReporter).checkNullOrNonTypeElement(node, element);
+      _ErrorHelper(errorReporter).reportNullOrNonTypeElement(node, element);
       return dynamicType;
     }
   }
@@ -410,6 +289,49 @@
     }
   }
 
+  /// We parse `foo.bar` as `prefix.Name` with the expectation that `prefix`
+  /// will be a [PrefixElement]. But we checked and found that `foo.bar` is
+  /// not in the scope, so try to see if it is `Class.constructor`.
+  ///
+  /// Return `true` if the node was rewritten as `Class.constructor`.
+  bool _rewriteToConstructorName(TypeName node) {
+    var typeIdentifier = node.name;
+    var constructorName = node.parent;
+    if (typeIdentifier is PrefixedIdentifier &&
+        constructorName is ConstructorName &&
+        constructorName.name == null) {
+      var classIdentifier = typeIdentifier.prefix;
+      var classElement = nameScope.lookup(classIdentifier, definingLibrary);
+      if (classElement is ClassElement) {
+        var constructorIdentifier = typeIdentifier.identifier;
+
+        var typeArguments = node.typeArguments;
+        if (typeArguments != null) {
+          errorReporter.reportErrorForNode(
+            StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+            typeArguments,
+            [classIdentifier.name, constructorIdentifier.name],
+          );
+          var instanceCreation = constructorName.parent;
+          if (instanceCreation is InstanceCreationExpressionImpl) {
+            instanceCreation.typeArguments = typeArguments;
+          }
+        }
+
+        node.name = classIdentifier;
+        node.typeArguments = null;
+
+        constructorName.period = typeIdentifier.period;
+        constructorName.name = constructorIdentifier;
+
+        rewriteResult = constructorName;
+        return true;
+      }
+    }
+
+    return false;
+  }
+
   /// Records the new Element for a TypeName's Identifier.
   ///
   /// A null may be passed in to indicate that the element can't be resolved.
@@ -424,6 +346,11 @@
       prefix.staticElement = nameScope.lookup(prefix, definingLibrary);
     }
   }
+
+  static bool _isInstanceCreation(TypeName node) {
+    return node.parent is ConstructorName &&
+        node.parent.parent is InstanceCreationExpression;
+  }
 }
 
 /// Helper for reporting errors during type name resolution.
@@ -432,148 +359,156 @@
 
   _ErrorHelper(this.errorReporter);
 
-  bool checkNewWithNonType(TypeName node, Element element) {
-    if (element != null && element is! ClassElement) {
-      var constructorName = node.parent;
-      if (constructorName is ConstructorName) {
-        var instanceCreation = constructorName.parent;
-        if (instanceCreation is InstanceCreationExpression) {
-          var identifier = node.name;
-          var simpleIdentifier = _getSimpleIdentifier(identifier);
-          if (instanceCreation.isConst) {
-            errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.CONST_WITH_NON_TYPE,
-              simpleIdentifier,
-              [identifier],
-            );
-          } else {
-            errorReporter.reportErrorForNode(
-              StaticWarningCode.NEW_WITH_NON_TYPE,
-              simpleIdentifier,
-              [identifier],
-            );
-          }
-          return true;
-        }
+  bool reportNewWithNonType(TypeName node) {
+    var constructorName = node.parent;
+    if (constructorName is ConstructorName) {
+      var instanceCreation = constructorName.parent;
+      if (instanceCreation is InstanceCreationExpression) {
+        var identifier = node.name;
+        var errorNode = _getErrorNode(node);
+        errorReporter.reportErrorForNode(
+          instanceCreation.isConst
+              ? CompileTimeErrorCode.CONST_WITH_NON_TYPE
+              : StaticWarningCode.NEW_WITH_NON_TYPE,
+          errorNode,
+          [identifier.name],
+        );
+        return true;
       }
     }
-
     return false;
   }
 
-  bool checkNullOrNonTypeElement(TypeName node, Element element) {
-    var typeName = node.name;
-    SimpleIdentifier typeNameSimple = _getSimpleIdentifier(typeName);
-    if (typeNameSimple.name == "boolean") {
+  void reportNullOrNonTypeElement(TypeName node, Element element) {
+    var identifier = node.name;
+    var errorNode = _getErrorNode(node);
+
+    if (errorNode.name == 'boolean') {
       errorReporter.reportErrorForNode(
         StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
-        typeNameSimple,
+        errorNode,
       );
-      return true;
-    } else if (_isTypeInCatchClause(node)) {
+      return;
+    }
+
+    if (_isTypeInCatchClause(node)) {
       errorReporter.reportErrorForNode(
         StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE,
-        typeName,
-        [typeName.name],
+        identifier,
+        [identifier.name],
       );
-      return true;
-    } else if (_isTypeInAsExpression(node)) {
+      return;
+    }
+
+    if (_isTypeInAsExpression(node)) {
       errorReporter.reportErrorForNode(
         StaticWarningCode.CAST_TO_NON_TYPE,
-        typeName,
-        [typeName.name],
+        identifier,
+        [identifier.name],
       );
-      return true;
-    } else if (_isTypeInIsExpression(node)) {
+      return;
+    }
+
+    if (_isTypeInIsExpression(node)) {
       if (element != null) {
         errorReporter.reportErrorForNode(
           StaticWarningCode.TYPE_TEST_WITH_NON_TYPE,
-          typeName,
-          [typeName.name],
+          identifier,
+          [identifier.name],
         );
       } else {
         errorReporter.reportErrorForNode(
           StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
-          typeName,
-          [typeName.name],
+          identifier,
+          [identifier.name],
         );
       }
-      return true;
-    } else if (_isRedirectingConstructor(node)) {
+      return;
+    }
+
+    if (_isRedirectingConstructor(node)) {
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.REDIRECT_TO_NON_CLASS,
-        typeName,
-        [typeName.name],
+        identifier,
+        [identifier.name],
       );
-      return true;
-    } else if (_isTypeInTypeArgumentList(node)) {
+      return;
+    }
+
+    if (_isTypeInTypeArgumentList(node)) {
       errorReporter.reportErrorForNode(
         StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
-        typeName,
-        [typeName.name],
+        identifier,
+        [identifier.name],
       );
-      return true;
-    } else if (element != null) {
-      var parent = node.parent;
-      if (parent is ExtendsClause ||
-          parent is ImplementsClause ||
-          parent is WithClause ||
-          parent is ClassTypeAlias) {
-        // Ignored. The error will be reported elsewhere.
-      } else if (element is LocalVariableElement ||
-          (element is FunctionElement &&
-              element.enclosingElement is ExecutableElement)) {
-        errorReporter.reportError(
-          DiagnosticFactory().referencedBeforeDeclaration(
-            errorReporter.source,
-            typeName,
-            element: element,
-          ),
-        );
-      } else {
-        errorReporter.reportErrorForNode(
-          StaticWarningCode.NOT_A_TYPE,
-          typeName,
-          [typeName.name],
-        );
-      }
-      return true;
+      return;
     }
-    return false;
-  }
 
-  void reportUnresolvedElement(TypeName node) {
-    var identifier = node.name;
+    if (reportNewWithNonType(node)) {
+      return;
+    }
+
+    var parent = node.parent;
+    if (parent is ExtendsClause ||
+        parent is ImplementsClause ||
+        parent is WithClause ||
+        parent is ClassTypeAlias) {
+      // Ignored. The error will be reported elsewhere.
+      return;
+    }
+
+    if (element is LocalVariableElement ||
+        (element is FunctionElement &&
+            element.enclosingElement is ExecutableElement)) {
+      errorReporter.reportError(
+        DiagnosticFactory().referencedBeforeDeclaration(
+          errorReporter.source,
+          identifier,
+          element: element,
+        ),
+      );
+      return;
+    }
+
+    if (element != null) {
+      errorReporter.reportErrorForNode(
+        StaticWarningCode.NOT_A_TYPE,
+        identifier,
+        [identifier.name],
+      );
+      return;
+    }
+
     if (identifier is SimpleIdentifier && identifier.name == 'await') {
       errorReporter.reportErrorForNode(
         StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT,
         node,
       );
-    } else {
-      errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.UNDEFINED_CLASS,
-        identifier,
-        [identifier.name],
-      );
+      return;
     }
+
+    errorReporter.reportErrorForNode(
+      CompileTimeErrorCode.UNDEFINED_CLASS,
+      identifier,
+      [identifier.name],
+    );
   }
 
   /// Returns the simple identifier of the given (maybe prefixed) identifier.
-  static SimpleIdentifier _getSimpleIdentifier(Identifier identifier) {
-    if (identifier is SimpleIdentifier) {
-      return identifier;
-    } else {
-      PrefixedIdentifier prefixed = identifier;
-      SimpleIdentifier prefix = prefixed.prefix;
+  static Identifier _getErrorNode(TypeName node) {
+    Identifier identifier = node.name;
+    if (identifier is PrefixedIdentifier) {
       // The prefixed identifier can be:
       // 1. new importPrefix.TypeName()
       // 2. new TypeName.constructorName()
       // 3. new unresolved.Unresolved()
-      if (prefix.staticElement is PrefixElement) {
-        return prefixed.identifier;
+      if (identifier.prefix.staticElement is PrefixElement) {
+        return identifier.identifier;
       } else {
-        return prefix;
+        return identifier;
       }
+    } else {
+      return identifier;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index a6938c2..69b3722 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -479,25 +479,19 @@
    * Return the directory within the SDK directory that contains the libraries.
    */
   Folder get libraryDirectory {
-    if (_libraryDirectory == null) {
-      _libraryDirectory =
-          _sdkDirectory.getChildAssumingFolder(_LIB_DIRECTORY_NAME);
-    }
-    return _libraryDirectory;
+    return _libraryDirectory ??=
+        _sdkDirectory.getChildAssumingFolder(_LIB_DIRECTORY_NAME);
   }
 
   /**
    * Return the file containing the Pub executable, or `null` if it does not exist.
    */
   File get pubExecutable {
-    if (_pubExecutable == null) {
-      _pubExecutable = _sdkDirectory
-          .getChildAssumingFolder(_BIN_DIRECTORY_NAME)
-          .getChildAssumingFile(OSUtilities.isWindows()
-              ? _PUB_EXECUTABLE_NAME_WIN
-              : _PUB_EXECUTABLE_NAME);
-    }
-    return _pubExecutable;
+    return _pubExecutable ??= _sdkDirectory
+        .getChildAssumingFolder(_BIN_DIRECTORY_NAME)
+        .getChildAssumingFile(OSUtilities.isWindows()
+            ? _PUB_EXECUTABLE_NAME_WIN
+            : _PUB_EXECUTABLE_NAME);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index e89db2c..4e9ba42 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -287,6 +287,12 @@
   }
 
   @override
+  void visitConstructorName(ConstructorName node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    super.visitConstructorName(node);
+  }
+
+  @override
   void visitExportDirective(ExportDirective node) {
     _checkForDeprecatedMemberUse(node.uriElement, node);
     super.visitExportDirective(node);
@@ -445,7 +451,6 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
     _checkForLiteralConstructorUse(node);
     super.visitInstanceCreationExpression(node);
   }
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 38fb787..038437f 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1430,7 +1430,8 @@
    */
   static const CompileTimeErrorCode CONST_WITH_NON_TYPE = CompileTimeErrorCode(
       'CONST_WITH_NON_TYPE', "The name '{0}' isn't a class.",
-      correction: "Try correcting the name to match an existing class.");
+      correction: "Try correcting the name to match an existing class.",
+      isUnresolvedIdentifier: true);
 
   /**
    * 16.12.2 Const: If <i>T</i> is a parameterized type, it is a compile-time
@@ -2117,7 +2118,8 @@
       correction:
           "Try specifying a different superclass, or removing the extends "
           "clause.",
-      hasPublishedDocs: true);
+      hasPublishedDocs: true,
+      isUnresolvedIdentifier: true);
 
   /**
    * Parameters:
@@ -9191,7 +9193,8 @@
    */
   static const StaticWarningCode NEW_WITH_NON_TYPE = StaticWarningCode(
       'NEW_WITH_NON_TYPE', "The name '{0}' isn't a class.",
-      correction: "Try correcting the name to match an existing class.");
+      correction: "Try correcting the name to match an existing class.",
+      isUnresolvedIdentifier: true);
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
index 79f497e..7f8baf6 100644
--- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart
+++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -331,9 +331,7 @@
     for (SimpleIdentifier name in names) {
       String nameStr = name.name;
       Element element = namespace.get(nameStr);
-      if (element == null) {
-        element = namespace.get("$nameStr=");
-      }
+      element ??= namespace.get("$nameStr=");
       if (element == null) {
         _errorReporter
             .reportErrorForNode(hintCode, name, [library.identifier, nameStr]);
@@ -582,7 +580,7 @@
   final List<CatchClause> catchClauses;
 
   bool _done = false;
-  List<DartType> _visitedTypes = <DartType>[];
+  final List<DartType> _visitedTypes = <DartType>[];
 
   _CatchClausesVerifier(
     this._typeSystem,
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 09aa5c6..9c75de7 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -32,7 +32,7 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _check(
-      node.staticElement?.parameters,
+      node.constructorName.staticElement?.parameters,
       node.argumentList,
       node.constructorName,
     );
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 433b172..2811c3a 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -455,7 +455,6 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement invokedConstructor = node.constructorName.staticElement;
-    node.staticElement = invokedConstructor;
     ArgumentList argumentList = node.argumentList;
     List<ParameterElement> parameters =
         _resolveArgumentsToFunction(argumentList, invokedConstructor);
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 785ccbd..8145c6a 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -32,8 +32,8 @@
 
 /// A context in which a single analysis can be performed and incrementally
 /// maintained. The context includes such information as the version of the SDK
-/// being analyzed against as well as the package-root used to resolve 'package:'
-/// URI's. (Both of which are known indirectly through the [SourceFactory].)
+/// being analyzed against, and how to resolve 'package:' URI's. (Both of which
+/// are known indirectly through the [SourceFactory].)
 ///
 /// An analysis context also represents the state of the analysis, which includes
 /// knowing which sources have been included in the analysis (either directly or
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index bd06d29..02f3df6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2018,7 +2018,7 @@
       TypeName typeName,
       InterfaceType type) {
     if (type.element.isAbstract && !type.element.isMixin) {
-      ConstructorElement element = expression.staticElement;
+      ConstructorElement element = expression.constructorName.staticElement;
       if (element != null && !element.isFactory) {
         bool isImplicit =
             (expression as InstanceCreationExpressionImpl).isImplicit;
@@ -2071,7 +2071,8 @@
    * See [CompileTimeErrorCode.CONST_WITH_NON_CONST].
    */
   void _checkForConstWithNonConst(InstanceCreationExpression expression) {
-    ConstructorElement constructorElement = expression.staticElement;
+    ConstructorElement constructorElement =
+        expression.constructorName.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
       if (expression.keyword != null) {
         _errorReporter.reportErrorForToken(
@@ -2100,7 +2101,7 @@
       ConstructorName constructorName,
       TypeName typeName) {
     // OK if resolved
-    if (expression.staticElement != null) {
+    if (constructorName.staticElement != null) {
       return;
     }
     DartType type = typeName.type;
@@ -3497,7 +3498,7 @@
       ConstructorName constructorName,
       TypeName typeName) {
     // OK if resolved
-    if (expression.staticElement != null) {
+    if (constructorName.staticElement != null) {
       return;
     }
     DartType type = typeName.type;
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 028e2b2a..dd2cc51 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -362,17 +362,14 @@
         _tokenMatchesKeyword(afterReturnType, Keyword.FUNCTION)) {
       afterReturnType = skipGenericFunctionTypeAfterReturnType(afterReturnType);
     }
-    if (afterReturnType == null) {
-      // There was no return type, but it is optional, so go back to where we
-      // started.
-      afterReturnType = _currentToken;
-    }
+    // If there was no return type, because it was optional, go back
+    // to where we started.
+    afterReturnType ??= _currentToken;
     Token afterIdentifier = skipSimpleIdentifier(afterReturnType);
-    if (afterIdentifier == null) {
-      // It's possible that we parsed the function name as if it were a type
-      // name, so see whether it makes sense if we assume that there is no type.
-      afterIdentifier = skipSimpleIdentifier(_currentToken);
-    }
+
+    // It's possible that we parsed the function name as if it were a type
+    // name, so see whether it makes sense if we assume that there is no type.
+    afterIdentifier ??= skipSimpleIdentifier(_currentToken);
     if (afterIdentifier == null) {
       return false;
     }
@@ -407,9 +404,7 @@
       return false;
     }
     Token afterTypeParameters = _skipTypeParameterList(token);
-    if (afterTypeParameters == null) {
-      afterTypeParameters = token;
-    }
+    afterTypeParameters ??= token;
     Token afterParameters = _skipFormalParameterList(afterTypeParameters);
     if (afterParameters == null) {
       return false;
@@ -2066,12 +2061,8 @@
           getAndAdvance()));
     } else if (!_matchesIdentifier()) {
       Token keyword = modifiers.varKeyword;
-      if (keyword == null) {
-        keyword = modifiers.finalKeyword;
-      }
-      if (keyword == null) {
-        keyword = modifiers.constKeyword;
-      }
+      keyword ??= modifiers.finalKeyword;
+      keyword ??= modifiers.constKeyword;
       if (keyword != null) {
         //
         // We appear to have found an incomplete top-level variable declaration.
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index bdcf56f..7062807 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1794,7 +1794,6 @@
         );
         constructorElement = toLegacyElement(constructorElement);
         constructor.staticElement = constructorElement;
-        node.staticElement = constructor.staticElement;
       }
     }
 
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index fe2d430..3645309 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -137,18 +137,12 @@
 
   @override
   String get encoding {
-    if (_encoding == null) {
-      _encoding = uri.toString();
-    }
-    return _encoding;
+    return _encoding ??= uri.toString();
   }
 
   @override
   String get fullName {
-    if (_absolutePath == null) {
-      _absolutePath = file.getAbsolutePath();
-    }
-    return _absolutePath;
+    return _absolutePath ??= file.getAbsolutePath();
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 12dd347..2b0e133 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -664,15 +664,11 @@
    */
   void _analyzeLeastUpperBoundTypes(
       Expression node, DartType staticType1, DartType staticType2) {
-    if (staticType1 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType1 = _dynamicType;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType1 ??= _dynamicType;
 
-    if (staticType2 == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticType2 = _dynamicType;
-    }
+    // TODO(brianwilkerson) Determine whether this can still happen.
+    staticType2 ??= _dynamicType;
 
     DartType staticType =
         _typeSystem.getLeastUpperBound(staticType1, staticType2) ??
@@ -823,7 +819,6 @@
       );
       constructorElement = _resolver.toLegacyElement(constructorElement);
       constructor.staticElement = constructorElement;
-      node.staticElement = constructor.staticElement;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 1833961..90c08eb 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -36,10 +36,7 @@
   static InterfaceType _objectType;
 
   static ClassElementImpl get object {
-    if (_objectElement == null) {
-      _objectElement = classElement("Object", null);
-    }
-    return _objectElement;
+    return _objectElement ??= classElement("Object", null);
   }
 
   static InterfaceType get objectType {
@@ -103,9 +100,7 @@
         NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
     CompilationUnitElementImpl unit = CompilationUnitElementImpl();
     unit.source = source;
-    if (librarySource == null) {
-      librarySource = source;
-    }
+    librarySource ??= source;
     unit.librarySource = librarySource;
     return unit;
   }
@@ -402,8 +397,7 @@
   static FunctionElementImpl functionElementWithParameters(String functionName,
       DartType returnType, List<ParameterElement> parameters) {
     FunctionElementImpl functionElement = FunctionElementImpl(functionName, 0);
-    functionElement.returnType =
-        returnType == null ? VoidTypeImpl.instance : returnType;
+    functionElement.returnType = returnType ?? VoidTypeImpl.instance;
     functionElement.parameters = parameters;
     return functionElement;
   }
@@ -610,7 +604,6 @@
               Keyword.CONST, AstTestFactory.typeName(type.element));
       if (type is InterfaceType) {
         ConstructorElement element = type.element.unnamedConstructor;
-        initializer.staticElement = element;
         initializer.constructorName.staticElement = element;
       }
       constant.constantInitializer = initializer;
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 7ea5feb..35a0852 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
-import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -82,6 +81,7 @@
   String packageConfigPath;
 
   /// The path to the package root.
+  @Deprecated('https://github.com/dart-lang/sdk/issues/41197')
   String packageRootPath;
 
   /// Whether to use Dart's Strong Mode analyzer.
@@ -126,7 +126,6 @@
   List<UriResolver> get resolvers {
     // TODO(brianwilkerson) Use the context builder to compute all of the resolvers.
     ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-    ContextBuilder builder = ContextBuilder(resourceProvider, null, null);
 
     DartSdk sdk = options.mockSdk ??
         FolderBasedDartSdk(
@@ -134,17 +133,6 @@
 
     List<UriResolver> resolvers = [DartUriResolver(sdk)];
 
-    if (options.packageRootPath != null) {
-      builder.builderOptions.defaultPackagesDirectoryPath =
-          options.packageRootPath;
-      var packages = builder.createPackageMap(null);
-      var packageMap = <String, List<Folder>>{};
-      for (var package in packages.packages) {
-        packageMap[package.name] = [package.libFolder];
-      }
-      resolvers.add(PackageMapUriResolver(resourceProvider, packageMap));
-    }
-
     var packageUriResolver = _getPackageUriResolver();
     if (packageUriResolver != null) {
       resolvers.add(packageUriResolver);
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 783cf74..86ecb8a 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -417,7 +417,7 @@
     //
     // Verify that the invoked constructor is a const constructor.
     //
-    ConstructorElement element = node.staticElement;
+    ConstructorElement element = node.constructorName.staticElement;
     if (element == null || !element.isConst) {
       return false;
     }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index c36c2ed..b029847 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -1048,7 +1048,6 @@
       ),
       typeArguments: _readNode(data.instanceCreationExpression_typeArguments),
     );
-    node.staticElement = node.constructorName.staticElement;
     node.staticType = _readType(data.expression_type);
     return node;
   }
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index df2cc09..06cc17d 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -231,7 +231,7 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    var element = node.staticElement?.declaration;
+    var element = node.constructorName.staticElement?.declaration;
     if (element == null) return;
 
     _set.add(element);
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 8d3f33e..c1afdb9 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -308,11 +308,8 @@
   Set<String> _lintCodes;
 
   Set<String> get lintCodes {
-    if (_lintCodes == null) {
-      _lintCodes = Set.from(
-          Registry.ruleRegistry.rules.map((rule) => rule.name.toUpperCase()));
-    }
-    return _lintCodes;
+    return _lintCodes ??= Set.from(
+        Registry.ruleRegistry.rules.map((rule) => rule.name.toUpperCase()));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 7f5b2d4..6492436 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -426,9 +426,9 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     var arguments = node.argumentList;
-    var element = node.staticElement;
+    var element = node.constructorName.staticElement;
     if (element != null) {
-      var type = _elementType(node.staticElement);
+      var type = _elementType(element);
       checkArgumentList(arguments, type);
     }
     node.visitChildren(this);
@@ -966,7 +966,7 @@
       }
 
       if (expr is InstanceCreationExpression) {
-        ConstructorElement e = expr.staticElement;
+        ConstructorElement e = expr.constructorName.staticElement;
         if (e == null || !e.isFactory) {
           // fromT should be an exact type - this will almost certainly fail at
           // runtime.
@@ -1193,7 +1193,7 @@
 
   @override
   visitInstanceCreationExpression(InstanceCreationExpression node) {
-    var constructor = node.staticElement;
+    var constructor = node.constructorName.staticElement;
     ClassElement class_ = constructor?.enclosingElement;
     if (node.constructorName.type.typeArguments == null &&
         class_ != null &&
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 91272fa..25dcc7d 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -77,7 +77,7 @@
     unit.accept(FunctionAstVisitor(
       functionDeclarationStatement: (node) {
         var element = node.functionDeclaration.declaredElement;
-        if (element is FunctionElement) {
+        if (element is FunctionElement && element.name == name) {
           if (result != null) {
             throw StateError('Not unique: $name');
           }
@@ -212,6 +212,10 @@
       }
     }
 
+    for (var type in unitElement.functions) {
+      findIn(type.typeParameters);
+    }
+
     for (var type in unitElement.functionTypeAliases) {
       findIn(type.typeParameters);
       if (type is GenericTypeAliasElement) {
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
index fcef98c..62482bd 100644
--- a/pkg/analyzer/lib/src/workspace/gn.dart
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -47,7 +47,7 @@
   /**
    * The map from a package name to the list of its `lib/` folders.
    */
-  Map<String, List<Folder>> _packageMap;
+  final Map<String, List<Folder>> _packageMap;
 
   GnWorkspace._(this.provider, this.root, this._packageMap);
 
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index c4efa4a..2df2529 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -643,7 +643,6 @@
     InstanceCreationExpression creation =
         AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
     _resolveNode(creation);
-    expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -659,7 +658,6 @@
     InstanceCreationExpression creation =
         AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
     _resolveNode(creation);
-    expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -681,7 +679,6 @@
       AstTestFactory.namedExpression2(parameterName, AstTestFactory.integer(0))
     ]);
     _resolveNode(creation);
-    expect(creation.staticElement, same(constructor));
     expect(
         (creation.argumentList.arguments[0] as NamedExpression)
             .name
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 03839d8..4e183c3 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -481,7 +481,6 @@
             null,
             AstTestFactory.typeName(classElement),
             [AstTestFactory.identifier3(constructorName)]);
-    node.staticElement = constructor;
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
   }
@@ -499,7 +498,6 @@
         typeArguments: [interfaceTypeStar(elementI)]);
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(null, typeName);
-    node.staticElement = constructor;
     InterfaceType type = _analyze(node) as InterfaceType;
     List<DartType> typeArgs = type.typeArguments;
     expect(typeArgs.length, 1);
@@ -516,7 +514,6 @@
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(
             null, AstTestFactory.typeName(classElement));
-    node.staticElement = constructor;
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
   }
diff --git a/pkg/analyzer/test/generated/test_analysis_context.dart b/pkg/analyzer/test/generated/test_analysis_context.dart
index 35ea5c4..2f7f926 100644
--- a/pkg/analyzer/test/generated/test_analysis_context.dart
+++ b/pkg/analyzer/test/generated/test_analysis_context.dart
@@ -18,7 +18,7 @@
   @override
   final SourceFactory sourceFactory = _MockSourceFactory();
 
-  _MockAnalysisSession _analysisSession = _MockAnalysisSession();
+  final _MockAnalysisSession _analysisSession = _MockAnalysisSession();
   AnalysisOptionsImpl _analysisOptions;
 
   TypeProvider _typeProviderLegacy;
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 9e2a63c..362cc48 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -24,7 +24,6 @@
     String dartSdkSummaryPath = 'a';
     String defaultAnalysisOptionsFilePath = 'b';
     String defaultPackageFilePath = 'c';
-    String defaultPackagesDirectoryPath = 'd';
     ArgParser parser = ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [
@@ -35,7 +34,6 @@
       '--no-implicit-dynamic',
       '--options=$defaultAnalysisOptionsFilePath',
       '--packages=$defaultPackageFilePath',
-      '--package-root=$defaultPackagesDirectoryPath',
     ];
     ArgResults result = parse(resourceProvider, parser, args);
     ContextBuilderOptions options = createContextBuilderOptions(result);
@@ -48,7 +46,6 @@
     expect(
         options.defaultAnalysisOptionsFilePath, defaultAnalysisOptionsFilePath);
     expect(options.defaultPackageFilePath, defaultPackageFilePath);
-    expect(options.defaultPackagesDirectoryPath, defaultPackagesDirectoryPath);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.strongMode, true);
@@ -67,7 +64,6 @@
     expect(options.declaredVariables, isEmpty);
     expect(options.defaultAnalysisOptionsFilePath, isNull);
     expect(options.defaultPackageFilePath, isNull);
-    expect(options.defaultPackagesDirectoryPath, isNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.strongMode, true);
@@ -129,7 +125,7 @@
   void test_defineAnalysisArguments() {
     ArgParser parser = ArgParser();
     defineAnalysisArguments(parser);
-    expect(parser.options, hasLength(12));
+    expect(parser.options, hasLength(11));
   }
 
   void test_extractDefinedVariables() {
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 7ebbad5..227862f 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -244,52 +244,6 @@
     _expectEqualOptions(options, AnalysisOptionsImpl());
   }
 
-  void test_createPackageMap_fromPackageDirectory_explicit() {
-    // Use a package directory that is outside the project directory.
-    String rootPath = convertPath('/root');
-    String projectPath = join(rootPath, 'project');
-    String packageDirPath = join(rootPath, 'packages');
-    String fooName = 'foo';
-    String fooPath = join(packageDirPath, fooName);
-    String barName = 'bar';
-    String barPath = join(packageDirPath, barName);
-    newFolder(projectPath);
-    newFolder(fooPath);
-    newFolder(barPath);
-
-    builderOptions.defaultPackagesDirectoryPath = packageDirPath;
-
-    Packages packages = builder.createPackageMap(projectPath);
-    _assertPackages(
-      packages,
-      {
-        'foo': convertPath('/root/packages/foo/lib'),
-        'bar': convertPath('/root/packages/bar/lib'),
-      },
-    );
-  }
-
-  void test_createPackageMap_fromPackageDirectory_inRoot() {
-    // Use a package directory that is inside the project directory.
-    String projectPath = convertPath('/root/project');
-    String packageDirPath = join(projectPath, 'packages');
-    String fooName = 'foo';
-    String fooPath = join(packageDirPath, fooName);
-    String barName = 'bar';
-    String barPath = join(packageDirPath, barName);
-    newFolder(fooPath);
-    newFolder(barPath);
-
-    Packages packages = builder.createPackageMap(projectPath);
-    _assertPackages(
-      packages,
-      {
-        'foo': convertPath('/root/project/packages/foo/lib'),
-        'bar': convertPath('/root/project/packages/bar/lib'),
-      },
-    );
-  }
-
   void test_createPackageMap_fromPackageFile_explicit() {
     // Use a package file that is outside the project directory's hierarchy.
     String rootPath = convertPath('/root');
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 7f8d145..e4a8348 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -669,11 +669,11 @@
     expect(atD.name.staticElement, elementD);
     expect(atD.element, constructorD);
 
-    expect(constC.staticElement, constructorC);
     expect(constC.staticType, interfaceTypeStar(elementC));
 
-    expect(constC.constructorName.staticElement, constructorC);
-    expect(constC.constructorName.type.type, interfaceTypeStar(elementC));
+    var constructorName = constC.constructorName;
+    expect(constructorName.staticElement, constructorC);
+    expect(constructorName.type.type, interfaceTypeStar(elementC));
   }
 
   test_annotation_unprefixed_topLevelVariable() async {
@@ -2039,36 +2039,36 @@
       TopLevelVariableDeclaration aDeclaration = unit.declarations[1];
       VariableDeclaration aNode = aDeclaration.variables.variables[0];
       InstanceCreationExpression value = aNode.initializer;
-      expect(value.staticElement, defaultConstructor);
       expect(value.staticType, interfaceTypeStar(cElement));
 
-      TypeName typeName = value.constructorName.type;
+      var constructorName = value.constructorName;
+      expect(constructorName.name, isNull);
+      expect(constructorName.staticElement, defaultConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       Identifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
-
-      expect(value.constructorName.name, isNull);
     }
 
     {
       TopLevelVariableDeclaration bDeclaration = unit.declarations[2];
       VariableDeclaration bNode = bDeclaration.variables.variables[0];
       InstanceCreationExpression value = bNode.initializer;
-      expect(value.staticElement, namedConstructor);
       expect(value.staticType, interfaceTypeStar(cElement));
 
-      TypeName typeName = value.constructorName.type;
+      var constructorName = value.constructorName;
+      expect(constructorName.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
-
-      SimpleIdentifier constructorName = value.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
     }
   }
 
@@ -2092,18 +2092,19 @@
 
     InstanceCreationExpression creation = vNode.initializer;
     List<Expression> arguments = creation.argumentList.arguments;
-    expect(creation.staticElement, constructorElement);
     expect(creation.staticType, interfaceTypeStar(xElement));
 
-    TypeName typeName = creation.constructorName.type;
+    var constructorName = creation.constructorName;
+    expect(constructorName.name, isNull);
+    expect(constructorName.staticElement, constructorElement);
+
+    TypeName typeName = constructorName.type;
     expect(typeName.typeArguments, isNull);
 
     Identifier typeIdentifier = typeName.name;
     expect(typeIdentifier.staticElement, xElement);
     expect(typeIdentifier.staticType, isNull);
 
-    expect(creation.constructorName.name, isNull);
-
     _assertArgumentToParameter(arguments[0], constructorElement.parameters[0]);
     _assertArgumentToParameter(arguments[1], constructorElement.parameters[1]);
     _assertArgumentToParameter(arguments[2], constructorElement.parameters[2]);
@@ -2132,18 +2133,19 @@
       TopLevelVariableDeclaration aDeclaration = unit.declarations[1];
       VariableDeclaration aNode = aDeclaration.variables.variables[0];
       InstanceCreationExpression value = aNode.initializer;
-      expect(value.staticElement, defaultConstructor);
       expect(value.staticType, interfaceTypeStar(cElement));
 
-      TypeName typeName = value.constructorName.type;
+      var constructorName = value.constructorName;
+      expect(constructorName.name, isNull);
+      expect(constructorName.staticElement, defaultConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       Identifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
-      expect(value.constructorName.name, isNull);
-
       Expression argument = value.argumentList.arguments[0];
       _assertArgumentToParameter(argument, defaultConstructor.parameters[0]);
     }
@@ -2152,20 +2154,20 @@
       TopLevelVariableDeclaration bDeclaration = unit.declarations[2];
       VariableDeclaration bNode = bDeclaration.variables.variables[0];
       InstanceCreationExpression value = bNode.initializer;
-      expect(value.staticElement, namedConstructor);
       expect(value.staticType, interfaceTypeStar(cElement));
 
-      TypeName typeName = value.constructorName.type;
+      var constructorName = value.constructorName;
+      expect(constructorName.staticElement, namedConstructor);
+      expect(constructorName.name.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
-      SimpleIdentifier constructorName = value.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
-
       Expression argument = value.argumentList.arguments[0];
       _assertArgumentToParameter(argument, namedConstructor.parameters[0]);
     }
@@ -2205,10 +2207,13 @@
 
       ExpressionStatement statement = statements[0];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, defaultConstructor);
       expect(creation.staticType, cTypeInt);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name, isNull);
+      expect(constructorName.staticElement, defaultConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       PrefixedIdentifier typeIdentifier = typeName.name;
@@ -2221,8 +2226,6 @@
       expect(typePrefix.staticType, isNull);
 
       expect(typeIdentifier.identifier.staticElement, same(cElement));
-
-      expect(creation.constructorName.name, isNull);
     }
 
     {
@@ -2233,10 +2236,14 @@
 
       ExpressionStatement statement = statements[1];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, namedConstructor);
       expect(creation.staticType, cTypeDouble);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.staticElement, namedConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       PrefixedIdentifier typeIdentifier = typeName.name;
@@ -2249,10 +2256,6 @@
       expect(typePrefix.staticType, isNull);
 
       expect(typeIdentifier.identifier.staticElement, same(cElement));
-
-      SimpleIdentifier constructorName = creation.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
     }
 
     {
@@ -2263,10 +2266,14 @@
 
       ExpressionStatement statement = statements[2];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, namedConstructor);
       expect(creation.staticType, cTypeBool);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.staticElement, namedConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments.arguments, hasLength(1));
       _assertTypeNameSimple(
           typeName.typeArguments.arguments[0], typeProvider.boolType);
@@ -2281,10 +2288,6 @@
       expect(typePrefix.staticType, isNull);
 
       expect(typeIdentifier.identifier.staticElement, same(cElement));
-
-      SimpleIdentifier constructorName = creation.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
     }
   }
 
@@ -2319,17 +2322,18 @@
 
       ExpressionStatement statement = statements[0];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, defaultConstructor);
       expect(creation.staticType, cTypeInt);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name, isNull);
+      expect(constructorName.staticElement, defaultConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
-
-      expect(creation.constructorName.name, isNull);
     }
 
     {
@@ -2340,10 +2344,13 @@
 
       ExpressionStatement statement = statements[1];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, defaultConstructor);
       expect(creation.staticType, cTypeBool);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name, isNull);
+      expect(constructorName.staticElement, defaultConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments.arguments, hasLength(1));
       _assertTypeNameSimple(
           typeName.typeArguments.arguments[0], typeProvider.boolType);
@@ -2351,8 +2358,6 @@
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
-
-      expect(creation.constructorName.name, isNull);
     }
 
     {
@@ -2363,21 +2368,19 @@
 
       ExpressionStatement statement = statements[2];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, namedConstructor);
       expect(creation.staticType, cTypeDouble);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.staticElement, namedConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments, isNull);
 
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
-
-      expect(typeIdentifier.staticElement, same(cElement));
-
-      SimpleIdentifier constructorName = creation.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
     }
 
     {
@@ -2388,10 +2391,14 @@
 
       ExpressionStatement statement = statements[3];
       InstanceCreationExpression creation = statement.expression;
-      expect(creation.staticElement, namedConstructor);
       expect(creation.staticType, cTypeBool);
 
-      TypeName typeName = creation.constructorName.type;
+      var constructorName = creation.constructorName;
+      expect(constructorName.name.staticElement, namedConstructor);
+      expect(constructorName.name.staticType, isNull);
+      expect(constructorName.staticElement, namedConstructor);
+
+      TypeName typeName = constructorName.type;
       expect(typeName.typeArguments.arguments, hasLength(1));
       _assertTypeNameSimple(
           typeName.typeArguments.arguments[0], typeProvider.boolType);
@@ -2399,10 +2406,6 @@
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
-
-      SimpleIdentifier constructorName = creation.constructorName.name;
-      expect(constructorName.staticElement, namedConstructor);
-      expect(constructorName.staticType, isNull);
     }
   }
 
@@ -6407,7 +6410,10 @@
       expect(access.staticType, typeProvider.intType);
 
       InstanceCreationExpression newC = access.target;
-      expect(newC.staticElement, cClassElement.unnamedConstructor);
+      expect(
+        newC.constructorName.staticElement,
+        cClassElement.unnamedConstructor,
+      );
       expect(newC.staticType, interfaceTypeStar(cClassElement));
 
       expect(access.propertyName.staticElement, same(fElement.getter));
@@ -6441,7 +6447,10 @@
       expect(access.staticType, typeProvider.intType);
 
       InstanceCreationExpression newC = access.target;
-      expect(newC.staticElement, cClassElement.unnamedConstructor);
+      expect(
+        newC.constructorName.staticElement,
+        cClassElement.unnamedConstructor,
+      );
       expect(newC.staticType, interfaceTypeStar(cClassElement));
 
       expect(access.propertyName.staticElement, same(fElement.getter));
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 0333e83..8dfca61 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1317,9 +1317,7 @@
   ExpectedLocation _expectedLocation(String search, bool isQualified,
       {int length}) {
     int offset = findOffset(search);
-    if (length == null) {
-      length = getLeadingIdentifierLength(search);
-    }
+    length ??= getLeadingIdentifierLength(search);
     return ExpectedLocation(testUnitElement, offset, length, isQualified);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 1fe3cf2..c5d0487 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -9,11 +9,10 @@
 import 'package:analyzer/dart/ast/ast.dart' hide Declaration;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
-import 'package:analyzer/src/dart/ast/element_locator.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/testing/element_search.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -77,6 +76,9 @@
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
 
+  FindNode findNode;
+  FindElement findElement;
+
   test_classMembers_class() async {
     await _resolveTestUnit('''
 class A {
@@ -90,8 +92,8 @@
   }
 }
 ''');
-    ClassElement a = _findElement('A');
-    ClassElement b = _findElement('B');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
     expect(await driver.search.classMembers('test'),
         unorderedEquals([a.methods[0], b.fields[0]]));
   }
@@ -116,8 +118,8 @@
   }
 }
 ''');
-    ClassElement a = _findElement('A');
-    ClassElement b = _findElement('B');
+    var a = findElement.mixin('A');
+    var b = findElement.mixin('B');
     expect(await driver.search.classMembers('test'),
         unorderedEquals([a.methods[0], b.fields[0]]));
   }
@@ -146,7 +148,7 @@
   p.test();
 }
 ''');
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     await _verifyNameReferences('test', <ExpectedResult>[
       _expectIdQU(main, SearchResultKind.READ, 'test);'),
       _expectIdQU(main, SearchResultKind.WRITE, 'test = 1;'),
@@ -181,7 +183,7 @@
   }
 }
 ''');
-    Element main = _findElement('main');
+    var main = findElement.method('main');
     await _verifyNameReferences('test', <ExpectedResult>[
       _expectIdU(main, SearchResultKind.READ, 'test);'),
       _expectIdU(main, SearchResultKind.WRITE, 'test = 1;'),
@@ -206,8 +208,8 @@
       randomElement = result.unit.declaredElement.getType('Random');
     }
 
-    Element v1 = _findElement('v1');
-    Element v2 = _findElement('v2');
+    var v1 = findElement.topVar('v1');
+    var v2 = findElement.topVar('v2');
     var expected = [
       _expectId(v1, SearchResultKind.REFERENCE, 'Random v1;'),
       _expectId(v2, SearchResultKind.REFERENCE, 'Random v2;'),
@@ -222,8 +224,8 @@
 Random v2;
 ''');
 
-    var v1 = _findElement('v1') as VariableElement;
-    var v2 = _findElement('v2') as VariableElement;
+    var v1 = findElement.topVar('v1');
+    var v2 = findElement.topVar('v2');
     var randomElement = v1.type.element as ClassElement;
     var expected = [
       _expectId(v1, SearchResultKind.REFERENCE, 'Random v1;'),
@@ -243,13 +245,13 @@
 class B3 extends Object with A {} // with
 List<A> v2 = null;
 ''');
-    ClassElement element = _findElementAtString('A {}');
-    Element p = _findElement('p');
-    Element main = _findElement('main');
-    Element b1 = _findElement('B1');
-    Element b2 = _findElement('B2');
-    Element b3 = _findElement('B3');
-    Element v2 = _findElement('v2');
+    var element = findElement.class_('A');
+    var p = findElement.parameter('p');
+    var main = findElement.function('main');
+    var b1 = findElement.class_('B1');
+    var b2 = findElement.class_('B2');
+    var b3 = findElement.class_('B3');
+    var v2 = findElement.topVar('v2');
     var expected = [
       _expectId(p, SearchResultKind.REFERENCE, 'A p'),
       _expectId(main, SearchResultKind.REFERENCE, 'A v'),
@@ -271,9 +273,9 @@
   A v;
 }
 ''');
-    ClassElement element = _findElementAtString('A p');
-    Element p = _findElement('p');
-    Element main = _findElement('main');
+    var element = findNode.simple('A p').staticElement;
+    var p = findElement.parameter('p');
+    var main = findElement.function('main');
     var expected = [
       _expectId(p, SearchResultKind.REFERENCE, 'A p'),
       _expectId(main, SearchResultKind.REFERENCE, 'A v')
@@ -286,8 +288,8 @@
 mixin A {}
 class B extends Object with A {} // with
 ''');
-    ClassElement element = _findElementAtString('A {}');
-    Element b = _findElement('B');
+    var element = findElement.mixin('A');
+    var b = findElement.class_('B');
     var expected = [
       _expectId(b, SearchResultKind.REFERENCE, 'A {} // with'),
     ];
@@ -323,10 +325,10 @@
   new A();
 }
 ''');
-    ConstructorElement element = _findElementAtString('A() {}');
-    Element mainElement = _findElement('main');
+    var element = findElement.unnamedConstructor('A');
+    var main = findElement.function('main');
     var expected = [
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, '();', length: 0)
+      _expectIdQ(main, SearchResultKind.REFERENCE, '();', length: 0)
     ];
     await _verifyReferences(element, expected);
   }
@@ -347,7 +349,7 @@
   A() {}
 }
 ''');
-    ConstructorElement element = _findElementAtString('A() {}');
+    var element = findElement.unnamedConstructor('A');
 
     CompilationUnit otherUnit = (await driver.getResult(other)).unit;
     Element main = otherUnit.declaredElement.functions[0];
@@ -368,10 +370,10 @@
   new A.named();
 }
 ''');
-    ConstructorElement element = _findElement('named');
-    Element mainElement = _findElement('main');
+    var element = findElement.constructor('named');
+    var main = findElement.function('main');
     var expected = [
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, '.named();',
+      _expectIdQ(main, SearchResultKind.REFERENCE, '.named();',
           length: '.named'.length)
     ];
     await _verifyReferences(element, expected);
@@ -385,11 +387,10 @@
   new A();
 }
 ''');
-    ClassElement classElement = _findElement('A');
-    ConstructorElement element = classElement.unnamedConstructor;
-    Element mainElement = _findElement('main');
+    var element = findElement.unnamedConstructor('A');
+    var main = findElement.function('main');
     var expected = [
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, '();', length: 0)
+      _expectIdQ(main, SearchResultKind.REFERENCE, '();', length: 0)
     ];
     await _verifyReferences(element, expected);
   }
@@ -412,9 +413,9 @@
   }
 }
 ''');
-    FieldElement element = _findElement('field', ElementKind.FIELD);
-    Element main = _findElement('main');
-    Element fieldParameter = _findElement('field', ElementKind.PARAMETER);
+    var element = findElement.field('field');
+    var main = findElement.method('main');
+    var fieldParameter = findElement.parameter('field');
     var expected = [
       _expectIdQ(fieldParameter, SearchResultKind.WRITE, 'field}'),
       _expectIdQ(main, SearchResultKind.REFERENCE, 'field: 1'),
@@ -440,18 +441,18 @@
   print(MyEnum.B);
 }
 ''');
-    ClassElement enumElement = _findElement('MyEnum');
-    Element mainElement = _findElement('main');
+    var enumElement = findElement.enum_('MyEnum');
+    var main = findElement.function('main');
     await _verifyReferences(enumElement.getField('index'),
-        [_expectIdQ(mainElement, SearchResultKind.READ, 'index);')]);
+        [_expectIdQ(main, SearchResultKind.READ, 'index);')]);
     await _verifyReferences(enumElement.getField('values'),
-        [_expectIdQ(mainElement, SearchResultKind.READ, 'values);')]);
+        [_expectIdQ(main, SearchResultKind.READ, 'values);')]);
     await _verifyReferences(enumElement.getField('A'), [
-      _expectIdQ(mainElement, SearchResultKind.READ, 'A.index);'),
-      _expectIdQ(mainElement, SearchResultKind.READ, 'A);')
+      _expectIdQ(main, SearchResultKind.READ, 'A.index);'),
+      _expectIdQ(main, SearchResultKind.READ, 'A);')
     ]);
     await _verifyReferences(enumElement.getField('B'),
-        [_expectIdQ(mainElement, SearchResultKind.READ, 'B);')]);
+        [_expectIdQ(main, SearchResultKind.READ, 'B);')]);
   }
 
   test_searchReferences_FieldElement_synthetic() async {
@@ -471,8 +472,8 @@
   }
 }
 ''');
-    FieldElement element = _findElement('field', ElementKind.FIELD);
-    Element main = _findElement('main');
+    var element = findElement.field('field');
+    var main = findElement.method('main');
     var expected = [
       _expectId(main, SearchResultKind.READ, 'field); // ref-nq'),
       _expectIdQ(main, SearchResultKind.READ, 'field); // ref-q'),
@@ -492,11 +493,11 @@
   print(test);
 }
 ''');
-    FunctionElement element = _findElement('test');
-    Element mainElement = _findElement('main');
+    var element = findElement.function('test');
+    var main = findElement.function('main');
     var expected = [
-      _expectId(mainElement, SearchResultKind.INVOCATION, 'test();'),
-      _expectId(mainElement, SearchResultKind.REFERENCE, 'test);')
+      _expectId(main, SearchResultKind.INVOCATION, 'test();'),
+      _expectId(main, SearchResultKind.REFERENCE, 'test);')
     ];
     await _verifyReferences(element, expected);
   }
@@ -510,7 +511,7 @@
 }
 ''');
     FunctionElement element = findElementsByName(testUnit, 'test').single;
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     var expected = [
       _expectId(main, SearchResultKind.INVOCATION, 'test();'),
       _expectId(main, SearchResultKind.REFERENCE, 'test);')
@@ -530,14 +531,14 @@
 Random bar() => null;
 ''');
     ImportElement element = testLibraryElement.imports[0];
-    Element mainElement = _findElement('main');
-    Element barElement = _findElement('bar');
+    var main = findElement.function('main');
+    var bar = findElement.function('bar');
     var kind = SearchResultKind.REFERENCE;
     var expected = [
-      _expectId(mainElement, kind, 'PI);', length: 0),
-      _expectId(mainElement, kind, 'Random()', length: 0),
-      _expectId(mainElement, kind, 'max(', length: 0),
-      _expectId(barElement, kind, 'Random bar()', length: 0),
+      _expectId(main, kind, 'PI);', length: 0),
+      _expectId(main, kind, 'Random()', length: 0),
+      _expectId(main, kind, 'max(', length: 0),
+      _expectId(bar, kind, 'Random bar()', length: 0),
     ];
     await _verifyReferences(element, expected);
   }
@@ -555,14 +556,14 @@
 Random bar() => null;
 ''', addToDriver: false);
     ImportElement element = testLibraryElement.imports[0];
-    Element mainElement = _findElement('main');
-    Element barElement = _findElement('bar');
+    var main = findElement.function('main');
+    var bar = findElement.function('bar');
     var kind = SearchResultKind.REFERENCE;
     var expected = [
-      _expectId(mainElement, kind, 'PI;', length: 0),
-      _expectId(mainElement, kind, 'Random();', length: 0),
-      _expectId(mainElement, kind, 'max(1, 2);', length: 0),
-      _expectId(barElement, kind, 'Random bar()', length: 0),
+      _expectId(main, kind, 'PI;', length: 0),
+      _expectId(main, kind, 'Random();', length: 0),
+      _expectId(main, kind, 'max(1, 2);', length: 0),
+      _expectId(bar, kind, 'Random bar()', length: 0),
     ];
     await _verifyReferences(element, expected);
   }
@@ -579,15 +580,15 @@
 math.Random bar() => null;
 ''');
     ImportElement element = testLibraryElement.imports[0];
-    Element mainElement = _findElement('main');
-    Element barElement = _findElement('bar');
+    var main = findElement.function('main');
+    var bar = findElement.function('bar');
     var kind = SearchResultKind.REFERENCE;
     var length = 'math.'.length;
     var expected = [
-      _expectId(mainElement, kind, 'math.PI);', length: length),
-      _expectId(mainElement, kind, 'math.Random()', length: length),
-      _expectId(mainElement, kind, 'math.max(', length: length),
-      _expectId(barElement, kind, 'math.Random bar()', length: length),
+      _expectId(main, kind, 'math.PI);', length: length),
+      _expectId(main, kind, 'math.Random()', length: length),
+      _expectId(main, kind, 'math.max(', length: length),
+      _expectId(bar, kind, 'math.Random bar()', length: length),
     ];
     await _verifyReferences(element, expected);
   }
@@ -601,20 +602,20 @@
   p.Future;
 }
 ''');
-    Element mainElement = _findElement('main');
+    var main = findElement.function('main');
     var kind = SearchResultKind.REFERENCE;
     var length = 'p.'.length;
     {
       ImportElement element = testLibraryElement.imports[0];
       var expected = [
-        _expectId(mainElement, kind, 'p.Future;', length: length),
+        _expectId(main, kind, 'p.Future;', length: length),
       ];
       await _verifyReferences(element, expected);
     }
     {
       ImportElement element = testLibraryElement.imports[1];
       var expected = [
-        _expectId(mainElement, kind, 'p.Random', length: length),
+        _expectId(main, kind, 'p.Random', length: length),
       ];
       await _verifyReferences(element, expected);
     }
@@ -633,7 +634,7 @@
 }
 ''');
     Element element = findElementsByName(testUnit, 'label').single;
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'label; // 1'),
       _expectId(main, SearchResultKind.REFERENCE, 'label; // 2')
@@ -700,7 +701,7 @@
 }
 ''');
     Element element = findElementsByName(testUnit, 'v').single;
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     var expected = [
       _expectId(main, SearchResultKind.WRITE, 'v = 1;'),
       _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'),
@@ -722,7 +723,7 @@
 }
 ''');
     Element element = findElementsByName(testUnit, 'v').single;
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     var expected = [
       _expectId(main, SearchResultKind.WRITE, 'v = 1;'),
       _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'),
@@ -745,7 +746,7 @@
 }
 ''', addToDriver: false);
     Element element = findElementsByName(testUnit, 'v').single;
-    Element main = _findElement('main');
+    var main = findElement.function('main');
 
     var expected = [
       _expectId(main, SearchResultKind.WRITE, 'v = 1;'),
@@ -768,13 +769,13 @@
   }
 }
 ''');
-    MethodElement method = _findElement('m');
-    Element mainElement = _findElement('main');
+    var method = findElement.method('m');
+    var main = findElement.method('main');
     var expected = [
-      _expectId(mainElement, SearchResultKind.INVOCATION, 'm(); // 1'),
-      _expectIdQ(mainElement, SearchResultKind.INVOCATION, 'm(); // 2'),
-      _expectId(mainElement, SearchResultKind.REFERENCE, 'm); // 3'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, 'm); // 4')
+      _expectId(main, SearchResultKind.INVOCATION, 'm(); // 1'),
+      _expectIdQ(main, SearchResultKind.INVOCATION, 'm(); // 2'),
+      _expectId(main, SearchResultKind.REFERENCE, 'm); // 3'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, 'm); // 4')
     ];
     await _verifyReferences(method, expected);
   }
@@ -792,15 +793,15 @@
   }
 }
 ''');
-    MethodElement method = _findElement('foo');
-    Element mainElement = _findElement('bar');
+    var foo = findElement.method('foo');
+    var bar = findElement.method('bar');
     var expected = [
-      _expectId(mainElement, SearchResultKind.INVOCATION, 'foo(); // 1'),
-      _expectIdQ(mainElement, SearchResultKind.INVOCATION, 'foo(); // 2'),
-      _expectId(mainElement, SearchResultKind.REFERENCE, 'foo); // 3'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, 'foo); // 4')
+      _expectId(bar, SearchResultKind.INVOCATION, 'foo(); // 1'),
+      _expectIdQ(bar, SearchResultKind.INVOCATION, 'foo(); // 2'),
+      _expectId(bar, SearchResultKind.REFERENCE, 'foo); // 3'),
+      _expectIdQ(bar, SearchResultKind.REFERENCE, 'foo); // 4')
     ];
-    await _verifyReferences(method, expected);
+    await _verifyReferences(foo, expected);
   }
 
   test_searchReferences_MethodElement_extension_unnamed() async {
@@ -816,15 +817,15 @@
   }
 }
 ''');
-    MethodElement method = _findElement('foo');
-    Element mainElement = _findElement('bar');
+    var foo = findElement.method('foo');
+    var bar = findElement.method('bar');
     var expected = [
-      _expectId(mainElement, SearchResultKind.INVOCATION, 'foo(); // 1'),
-      _expectIdQ(mainElement, SearchResultKind.INVOCATION, 'foo(); // 2'),
-      _expectId(mainElement, SearchResultKind.REFERENCE, 'foo); // 3'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, 'foo); // 4')
+      _expectId(bar, SearchResultKind.INVOCATION, 'foo(); // 1'),
+      _expectIdQ(bar, SearchResultKind.INVOCATION, 'foo(); // 2'),
+      _expectId(bar, SearchResultKind.REFERENCE, 'foo); // 3'),
+      _expectIdQ(bar, SearchResultKind.REFERENCE, 'foo); // 4')
     ];
-    await _verifyReferences(method, expected);
+    await _verifyReferences(foo, expected);
   }
 
   test_searchReferences_MethodMember_class() async {
@@ -836,10 +837,10 @@
   a.m(); // ref
 }
 ''');
-    MethodMember method = _findElementAtString('m(); // ref');
-    Element mainElement = _findElement('main');
+    var method = findElement.method('m');
+    var main = findElement.function('main');
     var expected = [
-      _expectIdQ(mainElement, SearchResultKind.INVOCATION, 'm(); // ref')
+      _expectIdQ(main, SearchResultKind.INVOCATION, 'm(); // ref')
     ];
     await _verifyReferences(method, expected);
   }
@@ -856,15 +857,15 @@
   foo(p: 42);
 }
 ''');
-    ParameterElement element = _findElement('p');
-    Element fooElement = _findElement('foo');
-    Element mainElement = _findElement('main');
+    var element = findElement.parameter('p');
+    var foo = findElement.function('foo');
+    var main = findElement.function('main');
     var expected = [
-      _expectId(fooElement, SearchResultKind.WRITE, 'p = 1;'),
-      _expectId(fooElement, SearchResultKind.READ_WRITE, 'p += 2;'),
-      _expectId(fooElement, SearchResultKind.READ, 'p);'),
-      _expectId(fooElement, SearchResultKind.READ, 'p();'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, 'p: 42')
+      _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+      _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+      _expectId(foo, SearchResultKind.READ, 'p);'),
+      _expectId(foo, SearchResultKind.READ, 'p();'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, 'p: 42')
     ];
     await _verifyReferences(element, expected);
   }
@@ -884,15 +885,14 @@
   new C(42);
 }
 ''');
-    ParameterElement element = _findElement('p');
-    ClassElement classC = _findElement('C');
-    ConstructorElement constructorA = classC.unnamedConstructor;
+    var element = findElement.parameter('p');
+    var constructor = findElement.unnamedConstructor('C');
     var expected = [
-      _expectId(constructorA, SearchResultKind.READ, 'p + 1 {'),
-      _expectId(constructorA, SearchResultKind.WRITE, 'p = 2;'),
-      _expectId(constructorA, SearchResultKind.READ_WRITE, 'p += 3;'),
-      _expectId(constructorA, SearchResultKind.READ, 'p);'),
-      _expectId(constructorA, SearchResultKind.READ, 'p();')
+      _expectId(constructor, SearchResultKind.READ, 'p + 1 {'),
+      _expectId(constructor, SearchResultKind.WRITE, 'p = 2;'),
+      _expectId(constructor, SearchResultKind.READ_WRITE, 'p += 3;'),
+      _expectId(constructor, SearchResultKind.READ, 'p);'),
+      _expectId(constructor, SearchResultKind.READ, 'p();')
     ];
     await _verifyReferences(element, expected);
   }
@@ -909,9 +909,8 @@
   foo(42);
 }
 ''');
-    Element main = _findElement('main');
-    FunctionElement foo = findElementsByName(testUnit, 'foo').single;
-    ParameterElement element = foo.parameters.single;
+    var main = findElement.function('main');
+    var element = findElement.parameter('p');
     var expected = [
       _expectId(main, SearchResultKind.WRITE, 'p = 1;'),
       _expectId(main, SearchResultKind.READ_WRITE, 'p += 2;'),
@@ -935,13 +934,13 @@
   c.foo(42);
 }
 ''');
-    ParameterElement element = _findElement('p');
-    Element fooElement = _findElement('foo');
+    var element = findElement.parameter('p');
+    var foo = findElement.method('foo');
     var expected = [
-      _expectId(fooElement, SearchResultKind.WRITE, 'p = 1;'),
-      _expectId(fooElement, SearchResultKind.READ_WRITE, 'p += 2;'),
-      _expectId(fooElement, SearchResultKind.READ, 'p);'),
-      _expectId(fooElement, SearchResultKind.READ, 'p();')
+      _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+      _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+      _expectId(foo, SearchResultKind.READ, 'p);'),
+      _expectId(foo, SearchResultKind.READ, 'p();')
     ];
     await _verifyReferences(element, expected);
   }
@@ -958,13 +957,13 @@
   foo(42);
 }
 ''');
-    ParameterElement element = _findElement('p');
-    Element fooElement = _findElement('foo');
+    var element = findElement.parameter('p');
+    var foo = findElement.function('foo');
     var expected = [
-      _expectId(fooElement, SearchResultKind.WRITE, 'p = 1;'),
-      _expectId(fooElement, SearchResultKind.READ_WRITE, 'p += 2;'),
-      _expectId(fooElement, SearchResultKind.READ, 'p);'),
-      _expectId(fooElement, SearchResultKind.READ, 'p();')
+      _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+      _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+      _expectId(foo, SearchResultKind.READ, 'p);'),
+      _expectId(foo, SearchResultKind.READ, 'p();')
     ];
     await _verifyReferences(element, expected);
   }
@@ -981,15 +980,15 @@
   foo(42);
 }
 ''');
-    ParameterElement element = _findElement('p');
-    Element fooElement = _findElement('foo');
-    Element mainElement = _findElement('main');
+    var element = findElement.parameter('p');
+    var foo = findElement.function('foo');
+    var main = findElement.function('main');
     var expected = [
-      _expectId(fooElement, SearchResultKind.WRITE, 'p = 1;'),
-      _expectId(fooElement, SearchResultKind.READ_WRITE, 'p += 2;'),
-      _expectId(fooElement, SearchResultKind.READ, 'p);'),
-      _expectId(fooElement, SearchResultKind.READ, 'p();'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, '42', length: 0)
+      _expectId(foo, SearchResultKind.WRITE, 'p = 1;'),
+      _expectId(foo, SearchResultKind.READ_WRITE, 'p += 2;'),
+      _expectId(foo, SearchResultKind.READ, 'p);'),
+      _expectId(foo, SearchResultKind.READ, 'p();'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, '42', length: 0)
     ];
     await _verifyReferences(element, expected);
   }
@@ -1009,8 +1008,8 @@
   ppp.Stream b;
 }
 ''');
-    PrefixElement element = _findElementAtString('ppp;');
-    Element main = _findElement('main');
+    var element = findElement.prefix('ppp');
+    var main = findElement.function('main');
     Element c = findChildElement(testLibraryElement, 'c');
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'ppp.Future'),
@@ -1039,8 +1038,8 @@
   ppp.Stream b;
 }
 ''', addToDriver: false);
-    PrefixElement element = _findElementAtString('ppp;');
-    Element main = _findElement('main');
+    var element = findElement.prefix('ppp');
+    var main = findElement.function('main');
     Element c = findChildElement(testLibraryElement, 'c');
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'ppp.Future'),
@@ -1073,7 +1072,7 @@
 class _C {}
 _C v;
 ''');
-    ClassElement element = _findElementAtString('_C {}');
+    var element = findElement.class_('_C');
     Element v = testUnitElement.topLevelVariables[0];
     Element v1 = testLibraryElement.parts[0].topLevelVariables[0];
     Element v2 = testLibraryElement.parts[1].topLevelVariables[0];
@@ -1178,8 +1177,8 @@
   }
 }
 ''');
-    PropertyAccessorElement element = _findElement('ggg', ElementKind.GETTER);
-    Element main = _findElement('main');
+    var element = findElement.getter('ggg');
+    var main = findElement.method('main');
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'ggg); // ref-nq'),
       _expectIdQ(main, SearchResultKind.REFERENCE, 'ggg); // ref-q'),
@@ -1199,11 +1198,11 @@
   }
 }
 ''');
-    PropertyAccessorElement element = _findElement('s=');
-    Element mainElement = _findElement('main');
+    var element = findElement.setter('s');
+    var main = findElement.method('main');
     var expected = [
-      _expectId(mainElement, SearchResultKind.REFERENCE, 's = 1'),
-      _expectIdQ(mainElement, SearchResultKind.REFERENCE, 's = 2')
+      _expectId(main, SearchResultKind.REFERENCE, 's = 1'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, 's = 2')
     ];
     await _verifyReferences(element, expected);
   }
@@ -1229,7 +1228,7 @@
     CompilationUnitElement impUnit =
         importElement.importedLibrary.definingCompilationUnit;
     TopLevelVariableElement variable = impUnit.topLevelVariables[0];
-    Element main = _findElement('main');
+    var main = findElement.function('main');
     var expected = [
       _expectIdQ(testUnitElement, SearchResultKind.REFERENCE, 'V; // imp'),
       _expectIdQ(main, SearchResultKind.WRITE, 'V = 1; // q'),
@@ -1249,9 +1248,9 @@
   bar(T b) {}
 }
 ''');
-    TypeParameterElement element = _findElement('T');
-    Element a = _findElement('a');
-    Element b = _findElement('b');
+    var element = findElement.typeParameter('T');
+    var a = findElement.parameter('a');
+    var b = findElement.parameter('b');
     var expected = [
       _expectId(a, SearchResultKind.REFERENCE, 'T a'),
       _expectId(b, SearchResultKind.REFERENCE, 'T b'),
@@ -1267,9 +1266,9 @@
   }
 }
 ''');
-    Element main = _findElement('main');
-    FunctionElement foo = findElementsByName(testUnit, 'foo').single;
-    TypeParameterElement element = foo.typeParameters.single;
+    var main = findElement.function('main');
+    var foo = findElement.localFunction('foo');
+    var element = foo.typeParameters.single;
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'T a'),
       _expectId(main, SearchResultKind.REFERENCE, 'T b'),
@@ -1283,8 +1282,8 @@
   foo<T>(T p) {}
 }
 ''');
-    TypeParameterElement element = _findElement('T');
-    Element p = _findElement('p');
+    var element = findElement.typeParameter('T');
+    var p = findElement.parameter('p');
     var expected = [
       _expectId(p, SearchResultKind.REFERENCE, 'T p'),
     ];
@@ -1297,9 +1296,9 @@
   bar(T b) {}
 }
 ''');
-    FunctionElement foo = _findElement('foo');
-    TypeParameterElement element = _findElement('T');
-    Element a = _findElement('a');
+    var foo = findElement.function('foo');
+    var element = findElement.typeParameter('T');
+    var a = findElement.parameter('a');
     var expected = [
       _expectId(a, SearchResultKind.REFERENCE, 'T a'),
       _expectId(foo, SearchResultKind.REFERENCE, 'T b'),
@@ -1314,10 +1313,10 @@
 class B = Object with T; // B
 class C implements T {} // C
 ''');
-    ClassElement element = _findElement('T');
-    ClassElement a = _findElement('A');
-    ClassElement b = _findElement('B');
-    ClassElement c = _findElement('C');
+    var element = findElement.class_('T');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var c = findElement.class_('C');
     var expected = [
       _expectId(a, SearchResultKind.REFERENCE, 'T {} // A'),
       _expectId(b, SearchResultKind.REFERENCE, 'T; // B'),
@@ -1332,9 +1331,9 @@
 mixin A on T {} // A
 mixin B implements T {} // B
 ''');
-    ClassElement element = _findElement('T');
-    ClassElement a = _findElement('A');
-    ClassElement b = _findElement('B');
+    var element = findElement.class_('T');
+    var a = findElement.mixin('A');
+    var b = findElement.mixin('B');
     var expected = [
       _expectId(a, SearchResultKind.REFERENCE, 'T {} // A'),
       _expectId(b, SearchResultKind.REFERENCE, 'T {} // B'),
@@ -1364,7 +1363,7 @@
 
 class F {}
 ''');
-    ClassElement a = _findElement('A');
+    var a = findElement.class_('A');
 
     // Search by 'type'.
     List<SubtypeResult> subtypes =
@@ -1509,7 +1508,7 @@
     await _resolveTestUnit('''
 class A {}
 ''');
-    ClassElement a = _findElement('A');
+    var a = findElement.class_('A');
 
     driver.addFile(pathB);
     driver.addFile(pathC);
@@ -1541,8 +1540,8 @@
   void methodM() {}
 }
 ''');
-    ClassElement a = _findElement('A');
-    ClassElement b = _findElement('B');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
 
     {
       var subtypes = await driver.search.subtypes(SearchedFiles(), type: a);
@@ -1572,7 +1571,7 @@
 class A {}
 class B extends A {}
 ''');
-    ClassElement a = _findElement('A');
+    var a = findElement.class_('A');
 
     List<SubtypeResult> subtypes =
         await driver.search.subtypes(SearchedFiles(), type: a);
@@ -1593,12 +1592,12 @@
 var f = null;
 class NoMatchABCDEF {}
 ''');
-    Element a = _findElement('A');
-    Element b = _findElement('B');
-    Element c = _findElement('C');
-    Element d = _findElement('D');
-    Element e = _findElement('e');
-    Element f = _findElement('f');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var c = findElement.mixin('C');
+    var d = findElement.functionTypeAlias('D');
+    var e = findElement.function('e');
+    var f = findElement.topVar('f');
     RegExp regExp = RegExp(r'^[ABCDef]$');
     expect(await driver.search.topLevelElements(regExp),
         unorderedEquals([a, b, c, d, e, f]));
@@ -1608,9 +1607,7 @@
       Element enclosingElement, SearchResultKind kind, String search,
       {int length, bool isResolved = true, bool isQualified = false}) {
     int offset = findOffset(search);
-    if (length == null) {
-      length = getLeadingIdentifierLength(search);
-    }
+    length ??= getLeadingIdentifierLength(search);
     return ExpectedResult(enclosingElement, kind, offset, length,
         isResolved: isResolved, isQualified: isQualified);
   }
@@ -1644,16 +1641,6 @@
         isQualified: false, isResolved: false, length: length);
   }
 
-  Element _findElement(String name, [ElementKind kind]) {
-    return findChildElement(testUnit.declaredElement, name, kind);
-  }
-
-  Element _findElementAtString(String search) {
-    int offset = findOffset(search);
-    AstNode node = NodeLocator(offset).searchWithin(testUnit);
-    return ElementLocator.locate(node);
-  }
-
   Future<void> _resolveTestUnit(String code, {bool addToDriver = true}) async {
     if (addToDriver) {
       addTestFile(code);
@@ -1666,6 +1653,9 @@
       testUnit = result.unit;
       testUnitElement = testUnit.declaredElement;
       testLibraryElement = testUnitElement.library;
+
+      findNode = FindNode(result.content, result.unit);
+      findElement = FindElement(result.unit);
     }
   }
 
@@ -1711,8 +1701,8 @@
   E.bar();
 }
 ''');
-    var element = _findElement('E');
-    var main = _findElement('main');
+    var element = findElement.extension_('E');
+    var main = findElement.function('main');
     var expected = [
       _expectId(main, SearchResultKind.REFERENCE, 'E(0)'),
       _expectId(main, SearchResultKind.REFERENCE, 'E.bar()'),
@@ -1740,9 +1730,9 @@
   0.foo; // 8
 }
 ''');
-    var element = _findElement('foo');
-    var bar = _findElement('bar');
-    var main = _findElement('main');
+    var element = findElement.method('foo');
+    var bar = findElement.method('bar');
+    var main = findElement.function('main');
     var expected = [
       _expectId(bar, SearchResultKind.INVOCATION, 'foo(); // 1'),
       _expectIdQ(bar, SearchResultKind.INVOCATION, 'foo(); // 2'),
@@ -1772,9 +1762,9 @@
   E.foo; // 4
 }
 ''');
-    var element = _findElement('foo');
-    var bar = _findElement('bar');
-    var main = _findElement('main');
+    var element = findElement.method('foo');
+    var bar = findElement.method('bar');
+    var main = findElement.function('main');
     var expected = [
       _expectId(bar, SearchResultKind.INVOCATION, 'foo(); // 1'),
       _expectId(bar, SearchResultKind.REFERENCE, 'foo; // 2'),
@@ -1800,9 +1790,9 @@
   0.foo; // 4
 }
 ''');
-    var element = _findElement('foo', ElementKind.GETTER);
-    var bar = _findElement('bar');
-    var main = _findElement('main');
+    var element = findElement.getter('foo');
+    var bar = findElement.method('bar');
+    var main = findElement.function('main');
     var expected = [
       _expectId(bar, SearchResultKind.REFERENCE, 'foo; // 1'),
       _expectIdQ(bar, SearchResultKind.REFERENCE, 'foo; // 2'),
@@ -1828,9 +1818,9 @@
   0.foo = 4;
 }
 ''');
-    var element = _findElement('foo=');
-    var bar = _findElement('bar');
-    var main = _findElement('main');
+    var element = findElement.setter('foo');
+    var bar = findElement.method('bar');
+    var main = findElement.function('main');
     var expected = [
       _expectId(bar, SearchResultKind.REFERENCE, 'foo = 1;'),
       _expectIdQ(bar, SearchResultKind.REFERENCE, 'foo = 2;'),
@@ -1868,13 +1858,13 @@
 }
 ''');
     ImportElement element = testLibraryElement.imports[0];
-    Element mainElement = _findElement('main');
+    var main = findElement.function('main');
     var kind = SearchResultKind.REFERENCE;
     var expected = [
-      _expectId(mainElement, kind, 'N1;', length: 0),
-      _expectId(mainElement, kind, 'N2();', length: 0),
-      _expectId(mainElement, kind, 'N3;', length: 0),
-      _expectId(mainElement, kind, 'N4 =', length: 0),
+      _expectId(main, kind, 'N1;', length: 0),
+      _expectId(main, kind, 'N2();', length: 0),
+      _expectId(main, kind, 'N3;', length: 0),
+      _expectId(main, kind, 'N4 =', length: 0),
     ];
     await _verifyReferences(element, expected);
   }
@@ -1899,14 +1889,14 @@
 }
 ''');
     ImportElement element = testLibraryElement.imports[0];
-    Element mainElement = _findElement('main');
+    var main = findElement.function('main');
     var kind = SearchResultKind.REFERENCE;
     var length = 'a.'.length;
     var expected = [
-      _expectId(mainElement, kind, 'a.N1;', length: length),
-      _expectId(mainElement, kind, 'a.N2()', length: length),
-      _expectId(mainElement, kind, 'a.N3', length: length),
-      _expectId(mainElement, kind, 'a.N4', length: length),
+      _expectId(main, kind, 'a.N1;', length: length),
+      _expectId(main, kind, 'a.N2()', length: length),
+      _expectId(main, kind, 'a.N3', length: length),
+      _expectId(main, kind, 'a.N4', length: length),
     ];
     await _verifyReferences(element, expected);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 441a8ff..1489f45 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -520,14 +520,14 @@
             Keyword.NEW, AstTestFactory.typeName4("C"));
     ConstructorElement staticElement = ElementFactory.constructorElement2(
         ElementFactory.classElement2("C"), null);
-    fromNode.staticElement = staticElement;
+    fromNode.constructorName.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
     InstanceCreationExpression toNode =
         AstTestFactory.instanceCreationExpression2(
             Keyword.NEW, AstTestFactory.typeName4("C"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.constructorName.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 4354565..c0e9cc7 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -4,16 +4,13 @@
 
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/src/dart/element/generic_inferrer.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' show toUri;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -22,609 +19,11 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ConstraintMatchingTest);
     defineReflectiveTests(GenericFunctionInferenceTest);
   });
 }
 
 @reflectiveTest
-class ConstraintMatchingTest extends AbstractTypeSystemNullSafetyTest {
-  TypeParameterElement T;
-  TypeParameterType T_none;
-  TypeParameterType T_question;
-
-  @override
-  void setUp() {
-    super.setUp();
-    T = typeParameter('T');
-    T_none = typeParameterTypeNone(T);
-    T_question = typeParameterTypeQuestion(T);
-  }
-
-  void test_function_coreFunction() {
-    _checkOrdinarySubtypeMatch(
-      functionTypeNone(
-        returnType: voidNone,
-      ),
-      typeProvider.functionType,
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_function_parameters_requiredPositional() {
-    _checkIsSubtypeMatchOf(
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: T_none),
-        ],
-        returnType: intNone,
-      ),
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: stringNone),
-        ],
-        returnType: intNone,
-      ),
-      [T],
-      ['String <: T'],
-      covariant: true,
-    );
-  }
-
-  void test_function_returnType() {
-    _checkIsSubtypeMatchOf(
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: intNone),
-        ],
-        returnType: T_none,
-      ),
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: intNone),
-        ],
-        returnType: stringNone,
-      ),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-  }
-
-  /// Left FutureOr: if `T0` is `FutureOr<S0>` then:
-  /// * `T0 <: T1` iff `Future<S0> <: T1` and `S0 <: T1`
-  void test_futureOr_left() {
-    _checkIsSubtypeMatchOf(
-      futureOrNone(T_none),
-      futureOrNone(stringNone),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-
-    _checkIsSubtypeMatchOf(
-      futureOrNone(T_none),
-      futureNone(stringNone),
-      [T],
-      ['T <: String', 'T <: Future<String>'],
-      covariant: true,
-    );
-
-    // Future<List<T>> <: List<String> can't be satisfied
-    _checkIsNotSubtypeMatchOf(
-      futureOrNone(listNone(T_none)),
-      listNone(stringNone),
-      [T],
-      covariant: true,
-    );
-
-    // List<T> <: Future<List<String>> can't be satisfied
-    _checkIsNotSubtypeMatchOf(
-      futureOrNone(listNone(T_none)),
-      futureNone(listNone(stringNone)),
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_futureOr_right_both_noConstraints() {
-    // `Future<String> <: Future<Object>` can be satisfied:
-    //    * no constraints
-    //
-    // `Future<String> <: Object` can be satisfied:
-    //    * no constraints
-    _checkIsSubtypeMatchOf(
-      futureNone(stringNone),
-      futureOrNone(objectNone),
-      [T],
-      [],
-      covariant: true,
-    );
-  }
-
-  void test_futureOr_right_both_prefer_future() {
-    // `Future<String> <: Future<T>` can be satisfied:
-    //    * `String <: T`
-    //
-    // `Future<String> <: T` can be satisfied:
-    //    * `Future<String> <: T`
-    //
-    // We prefer `String <: T`.
-    _checkIsSubtypeMatchOf(
-      futureNone(stringNone),
-      futureOrNone(T_none),
-      [T],
-      ['String <: T'],
-      covariant: false,
-    );
-
-    // `Future<T> <: Future<Object>` can be satisfied:
-    //   * `T <: Object`
-    //
-    // `Future<T> <: Object` can be satisfied:
-    //   * no constraints
-    //
-    // We prefer `T <: Object`.
-    _checkIsSubtypeMatchOf(
-      futureNone(T_none),
-      futureOrNone(objectNone),
-      [T],
-      ['T <: Object'],
-      covariant: true,
-    );
-  }
-
-  /// Right FutureOr: if `T1` is `FutureOr<S1>` then:
-  /// `T0 <: T1` iff any of the following hold:
-  /// * either `T0 <: Future<S1>`
-  /// * or `T0 <: S1`
-  void test_futureOr_right_none() {
-    // `List<T> <: Future<String>` cannot be satisfied.
-    // `List<T> <: int` cannot be satisfied.
-    _checkIsNotSubtypeMatchOf(
-      listNone(T_none),
-      futureOrNone(stringNone),
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_futureOr_right_single_future() {
-    // `Future<T> <: Future<String>` can be satisfied:
-    //    * `T <: String`
-    //
-    // `Future<T> <: String` cannot be satisfied.
-    _checkIsSubtypeMatchOf(
-      futureNone(T_none),
-      futureOrNone(stringNone),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-  }
-
-  void test_futureOr_right_single_nonFuture() {
-    // `List<T> <: Future<List<String>>` cannot be satisfied.
-    //
-    // `List<T> <: List<String>` can be satisfied:
-    //    * `T <: String`
-    _checkIsSubtypeMatchOf(
-      listNone(T_none),
-      futureOrNone(listNone(stringNone)),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-  }
-
-  void test_futureOr_right_single_nonFuture_null() {
-    // `Null <: Future<T>` can be satisfied:
-    //    * no constraints
-    //
-    // `Null <: T` can be satisfied:
-    //    * `Null <: T`
-    //
-    // We prefer `Null <: T`.
-    _checkIsSubtypeMatchOf(
-      nullNone,
-      futureOrNone(T_none),
-      [T],
-      ['Null <: T'],
-      covariant: false,
-    );
-  }
-
-  void test_interfaceType_interface_left() {
-    _checkIsNotSubtypeMatchOf(
-      iterableNone(T_none),
-      listNone(stringNone),
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_interfaceType_interface_right() {
-    _checkIsSubtypeMatchOf(
-      listNone(T_none),
-      iterableNone(stringNone),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-  }
-
-  void test_interfaceType_sameClass() {
-    _checkIsSubtypeMatchOf(
-      listNone(T_none),
-      listNone(stringNone),
-      [T],
-      ['T <: String'],
-      covariant: true,
-    );
-  }
-
-  void test_interfaceType_topMerge() {
-    var testClassIndex = 0;
-
-    void check1(
-      DartType extendsTypeArgument,
-      DartType implementsTypeArgument,
-      String expectedConstraint,
-    ) {
-      var library = library_(
-        uriStr: 'package:test/test.dart',
-        analysisSession: analysisContext.analysisSession,
-        typeSystem: typeSystem,
-      );
-
-      // class A<T> {}
-      var A = class_(name: 'A', typeParameters: [
-        typeParameter('T'),
-      ]);
-      A.enclosingElement = library.definingCompilationUnit;
-
-      // class B<T> extends A<T> {}
-      var B_T = typeParameter('T');
-      var B_T_none = typeParameterTypeNone(B_T);
-      var B = class_(
-        name: 'B',
-        typeParameters: [B_T],
-        superType: interfaceTypeNone(A, typeArguments: [B_T_none]),
-      );
-      B.enclosingElement = library.definingCompilationUnit;
-
-      // class Cx extends A<> implements B<> {}
-      var C = class_(
-        name: 'C${testClassIndex++}',
-        superType: interfaceTypeNone(
-          A,
-          typeArguments: [extendsTypeArgument],
-        ),
-        interfaces: [
-          interfaceTypeNone(
-            B,
-            typeArguments: [implementsTypeArgument],
-          )
-        ],
-      );
-      C.enclosingElement = library.definingCompilationUnit;
-
-      _checkIsSubtypeMatchOf(
-        interfaceTypeNone(C),
-        interfaceTypeNone(A, typeArguments: [T_none]),
-        [T],
-        [expectedConstraint],
-        covariant: false,
-      );
-    }
-
-    void check(
-      DartType typeArgument1,
-      DartType typeArgument2,
-      String expectedConstraint,
-    ) {
-      check1(typeArgument1, typeArgument2, expectedConstraint);
-      check1(typeArgument2, typeArgument1, expectedConstraint);
-    }
-
-    check(objectQuestion, dynamicNone, 'Object? <: T');
-    check(objectStar, dynamicNone, 'Object? <: T');
-    check(voidNone, objectQuestion, 'Object? <: T');
-    check(voidNone, objectStar, 'Object? <: T');
-  }
-
-  void test_left_null() {
-    // Null <: T is trivially satisfied by the constraint Null <: T.
-    _checkIsSubtypeMatchOf(nullNone, T_none, [T], ['Null <: T'],
-        covariant: false);
-
-    // For any other type X, Null <: X is satisfied without the need for any
-    // constraints.
-    _checkOrdinarySubtypeMatch(nullNone, listQuestion(T_none), [T],
-        covariant: false);
-    _checkOrdinarySubtypeMatch(nullNone, stringQuestion, [T], covariant: false);
-    _checkOrdinarySubtypeMatch(nullNone, voidNone, [T], covariant: false);
-    _checkOrdinarySubtypeMatch(nullNone, dynamicNone, [T], covariant: false);
-    _checkOrdinarySubtypeMatch(nullNone, objectQuestion, [T], covariant: false);
-    _checkOrdinarySubtypeMatch(nullNone, nullNone, [T], covariant: false);
-    _checkOrdinarySubtypeMatch(
-      nullNone,
-      functionTypeQuestion(returnType: voidNone),
-      [T],
-      covariant: false,
-    );
-  }
-
-  void test_right_dynamic() {
-    // T <: dynamic is trivially satisfied by the constraint T <: dynamic.
-    _checkIsSubtypeMatchOf(T_none, dynamicNone, [T], ['T <: dynamic'],
-        covariant: true);
-
-    // For any other type X, X <: dynamic is satisfied without the need for any
-    // constraints.
-    _checkOrdinarySubtypeMatch(listNone(T_none), dynamicNone, [T],
-        covariant: true);
-    _checkOrdinarySubtypeMatch(stringNone, dynamicNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(voidNone, dynamicNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(dynamicNone, dynamicNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(objectNone, dynamicNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(nullNone, dynamicNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: intNone),
-        ],
-        returnType: stringNone,
-      ),
-      dynamicNone,
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_right_object() {
-    // T <: Object is trivially satisfied by the constraint T <: Object.
-    _checkIsSubtypeMatchOf(T_none, objectNone, [T], ['T <: Object'],
-        covariant: true);
-
-    // For any other type X, X <: Object is satisfied without the need for any
-    // constraints.
-    _checkOrdinarySubtypeMatch(listNone(T_none), objectNone, [T],
-        covariant: true);
-    _checkOrdinarySubtypeMatch(stringNone, objectNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(voidNone, objectNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(dynamicNone, objectNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(objectNone, objectNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(nullNone, objectNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: intNone),
-        ],
-        returnType: stringNone,
-      ),
-      objectNone,
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_right_void() {
-    // T <: void is trivially satisfied by the constraint T <: void.
-    _checkIsSubtypeMatchOf(T_none, voidNone, [T], ['T <: void'],
-        covariant: true);
-
-    // For any other type X, X <: void is satisfied without the need for any
-    // constraints.
-    _checkOrdinarySubtypeMatch(listNone(T_none), voidNone, [T],
-        covariant: true);
-    _checkOrdinarySubtypeMatch(stringNone, voidNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(voidNone, voidNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(dynamicNone, voidNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(objectNone, voidNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(nullNone, voidNone, [T], covariant: true);
-    _checkOrdinarySubtypeMatch(
-      functionTypeNone(
-        parameters: [
-          requiredParameter(type: intNone),
-        ],
-        returnType: stringNone,
-      ),
-      voidNone,
-      [T],
-      covariant: true,
-    );
-  }
-
-  void test_typeParameter_left_covariant() {
-    // When doing a covariant match, the type parameters we're trying to find
-    // types for are on the left hand side.
-    _checkIsSubtypeMatchOf(T_none, stringNone, [T], ['T <: String'],
-        covariant: true);
-  }
-
-  void test_typeParameter_left_covariant_match() {
-    // When doing a covariant match, the type parameters we're trying to find
-    // types for are on the left hand side.  If a type parameter appears on the
-    // right hand side, there is a condition in which the constraint can be
-    // satisfied: where both parameters appear at corresponding locations in the
-    // type tree.
-    //
-    // In other words, T <: S can be satisfied trivially by the constraint
-    // T <: S.
-    var S = typeParameter('S');
-    var S_none = typeParameterTypeNone(S);
-    _checkIsSubtypeMatchOf(T_none, S_none, [T], ['T <: S'], covariant: true);
-  }
-
-  void test_typeParameter_left_covariant_no_match() {
-    // When doing a covariant match, the type parameters we're trying to find
-    // types for are on the left hand side.  If a type parameter appears on the
-    // right hand side, it's probable that the constraint can't be satisfied,
-    // because there is no possible type for the LHS (other than bottom)
-    // that's guaranteed to satisfy the relation for all possible assignments of
-    // the RHS type parameter.
-    //
-    // In other words, no match can be found for List<T> <: S because regardless
-    // of T, we can't guarantee that List<T> <: S for all S.
-    var S = typeParameter('S');
-    var S_none = typeParameterTypeNone(S);
-    _checkIsNotSubtypeMatchOf(listNone(T_none), S_none, [T], covariant: true);
-  }
-
-  void test_typeParameter_nullable() {
-    _checkIsSubtypeMatchOf(T_question, stringQuestion, [T], ['T <: String'],
-        covariant: true);
-
-    _checkIsSubtypeMatchOf(stringQuestion, T_question, [T], ['String <: T'],
-        covariant: false);
-  }
-
-  void test_typeParameter_right_contravariant() {
-    // When doing a contravariant match, the type parameters we're trying to
-    // find types for are on the right hand side.
-    _checkIsSubtypeMatchOf(stringNone, T_none, [T], ['String <: T'],
-        covariant: false);
-  }
-
-  void test_typeParameter_right_contravariant_direct() {
-    // When doing a contravariant match, the type parameters we're trying to
-    // find types for are on the right hand side.  If a type parameter also
-    // appears on the left hand side, there is a condition in which the
-    // constraint can be satisfied without consulting the bound of the LHS type
-    // parameter: the condition where both parameters appear at corresponding
-    // locations in the type tree.
-    //
-    // In other words, List<S> <: List<T> is satisfied provided that
-    // S <: T.
-    var S = typeParameter('S');
-    var S_none = typeParameterTypeNone(S);
-    _checkIsSubtypeMatchOf(listNone(S_none), listNone(T_none), [T], ['S <: T'],
-        covariant: false);
-  }
-
-  void test_typeParameter_right_contravariant_via_bound() {
-    // When doing a contravariant match, the type parameters we're trying to
-    // find types for are on the right hand side.  If a type parameter also
-    // appears on the left hand side, we may have to constrain the RHS type
-    // parameter using the bounds of the LHS type parameter.
-    //
-    // In other words, S <: List<T> is satisfied provided that
-    // bound(S) <: List<T>.
-    var S = typeParameter('S', bound: listNone(stringNone));
-    var S_none = typeParameterTypeNone(S);
-    _checkIsSubtypeMatchOf(S_none, listNone(T_none), [T], ['String <: T'],
-        covariant: false);
-  }
-
-  void test_variance_contravariant() {
-    // class A<in T>
-    var T = typeParameter('T', variance: Variance.contravariant);
-    var T_none = typeParameterTypeNone(T);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    _checkIsSubtypeMatchOf(
-      interfaceTypeNone(A, typeArguments: [T_none]),
-      interfaceTypeNone(A, typeArguments: [numNone]),
-      [T],
-      ['num <: in T'],
-      covariant: true,
-    );
-  }
-
-  void test_variance_covariant() {
-    // class A<out T>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var T_none = typeParameterTypeNone(T);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    _checkIsSubtypeMatchOf(
-      interfaceTypeNone(A, typeArguments: [T_none]),
-      interfaceTypeNone(A, typeArguments: [numNone]),
-      [T],
-      ['out T <: num'],
-      covariant: true,
-    );
-  }
-
-  void test_variance_invariant() {
-    // class A<inout T>
-    var T = typeParameter('T', variance: Variance.invariant);
-    var T_none = typeParameterTypeNone(T);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    _checkIsSubtypeMatchOf(
-      interfaceTypeNone(A, typeArguments: [T_none]),
-      interfaceTypeNone(A, typeArguments: [numNone]),
-      [T],
-      ['inout T <: num', 'num <: inout T'],
-      covariant: true,
-    );
-  }
-
-  void _checkIsNotSubtypeMatchOf(
-    DartType subtype,
-    DartType supertype,
-    List<TypeParameterElement> typeFormals, {
-    @required bool covariant,
-  }) {
-    var inferrer = GenericInferrer(typeSystem, typeFormals);
-
-    var success = inferrer.tryMatchSubtypeOf(subtype, supertype, null,
-        covariant: covariant);
-    expect(success, isFalse);
-
-    inferrer.constraints.forEach((typeParameter, constraints) {
-      expect(constraints, isEmpty);
-    });
-  }
-
-  void _checkIsSubtypeMatchOf(
-    DartType subtype,
-    DartType supertype,
-    List<TypeParameterElement> typeFormals,
-    Iterable<String> expectedConstraints, {
-    @required bool covariant,
-  }) {
-    var inferrer = GenericInferrer(typeSystem, typeFormals);
-
-    var success = inferrer.tryMatchSubtypeOf(subtype, supertype, null,
-        covariant: covariant);
-    expect(success, isTrue);
-
-    var formattedConstraints = <String>[];
-    inferrer.constraints.forEach((typeParameter, constraints) {
-      for (var constraint in constraints) {
-        formattedConstraints.add(
-          constraint.format(
-            typeParameter.getDisplayString(withNullability: true),
-            withNullability: true,
-          ),
-        );
-      }
-    });
-    expect(formattedConstraints, unorderedEquals(expectedConstraints));
-  }
-
-  void _checkOrdinarySubtypeMatch(
-    DartType subtype,
-    DartType supertype,
-    List<TypeParameterElement> typeFormals, {
-    @required bool covariant,
-  }) {
-    var expectSuccess = typeSystem.isSubtypeOf(subtype, supertype);
-    if (expectSuccess) {
-      _checkIsSubtypeMatchOf(subtype, supertype, typeFormals, [],
-          covariant: covariant);
-    } else {
-      _checkIsNotSubtypeMatchOf(subtype, supertype, typeFormals,
-          covariant: covariant);
-    }
-  }
-}
-
-@reflectiveTest
 class GenericFunctionInferenceTest extends AbstractTypeSystemNullSafetyTest {
   void test_boundedByAnotherTypeParameter() {
     // <TFrom, TTo extends Iterable<TFrom>>(TFrom) -> TTo
@@ -994,7 +393,7 @@
           parameters: [
             requiredParameter(type: numNone),
           ],
-          returnType: intNone,
+          returnType: intQuestion,
         ),
       ),
       [numNone],
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index 241aff8..e08cff7 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -20,6 +20,7 @@
 import 'subtype_test.dart' as subtype;
 import 'top_merge_test.dart' as top_merge;
 import 'type_algebra_test.dart' as type_algebra;
+import 'type_constraint_gatherer_test.dart' as type_constraint_gatherer;
 import 'type_parameter_element_test.dart' as type_parameter_element;
 import 'type_visitor_test.dart' as type_visitor;
 import 'upper_lower_bound_test.dart' as upper_bound;
@@ -43,6 +44,7 @@
     subtype.main();
     top_merge.main();
     type_algebra.main();
+    type_constraint_gatherer.main();
     type_parameter_element.main();
     type_visitor.main();
     upper_bound.main();
diff --git a/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
new file mode 100644
index 0000000..87109c8b
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/type_constraint_gatherer_test.dart
@@ -0,0 +1,1118 @@
+// Copyright (c) 2020, 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:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
+import 'package:analyzer/src/dart/element/type_schema.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/type_system_test.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(TypeConstraintGathererTest);
+  });
+}
+
+@reflectiveTest
+class TypeConstraintGathererTest extends AbstractTypeSystemNullSafetyTest {
+  TypeParameterElement T;
+  TypeParameterType T_none;
+  TypeParameterType T_question;
+  TypeParameterType T_star;
+
+  UnknownInferredType get unknownType => UnknownInferredType.instance;
+
+  @override
+  void setUp() {
+    super.setUp();
+    T = typeParameter('T');
+    T_none = typeParameterTypeNone(T);
+    T_question = typeParameterTypeQuestion(T);
+    T_star = typeParameterTypeStar(T);
+  }
+
+  /// If `P` and `Q` are identical types, then the subtype match holds
+  /// under no constraints.
+  test_equal_left_right() {
+    _checkMatch([T], intNone, intNone, true, ['_ <: T <: _']);
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          requiredParameter(type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          requiredParameter(type: intNone),
+        ],
+      ),
+      true,
+      ['_ <: T <: _'],
+    );
+
+    var T1 = typeParameter('T1');
+    var T2 = typeParameter('T2');
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: typeParameterTypeNone(T1),
+        typeFormals: [T1],
+      ),
+      functionTypeNone(
+        returnType: typeParameterTypeNone(T2),
+        typeFormals: [T2],
+      ),
+      true,
+      ['_ <: T <: _'],
+    );
+  }
+
+  test_functionType_hasTypeFormals() {
+    var T1 = typeParameter('T1');
+    var S1 = typeParameter('S1');
+
+    var T1_none = typeParameterTypeNone(T1);
+    var S1_none = typeParameterTypeNone(S1);
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: T_none,
+        typeFormals: [T1],
+        parameters: [
+          requiredParameter(type: T1_none),
+        ],
+      ),
+      functionTypeNone(
+        returnType: intNone,
+        typeFormals: [S1],
+        parameters: [
+          requiredParameter(type: S1_none),
+        ],
+      ),
+      false,
+      ['_ <: T <: int'],
+    );
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: intNone,
+        typeFormals: [T1],
+        parameters: [
+          requiredParameter(type: T1_none),
+        ],
+      ),
+      functionTypeNone(
+        returnType: T_none,
+        typeFormals: [S1],
+        parameters: [
+          requiredParameter(type: S1_none),
+        ],
+      ),
+      true,
+      ['int <: T <: _'],
+    );
+
+    // We unified type formals, but still not match because return types.
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: intNone,
+        typeFormals: [T1],
+        parameters: [
+          requiredParameter(type: T1_none),
+        ],
+      ),
+      functionTypeNone(
+        returnType: stringNone,
+        typeFormals: [S1],
+        parameters: [
+          requiredParameter(type: S1_none),
+        ],
+      ),
+      false,
+    );
+  }
+
+  test_functionType_hasTypeFormals_bounds_different_subtype() {
+    var T1 = typeParameter('T1', bound: intNone);
+    var S1 = typeParameter('S1', bound: numNone);
+    _checkNotMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1]),
+      false,
+    );
+  }
+
+  test_functionType_hasTypeFormals_bounds_different_top() {
+    var T1 = typeParameter('T1', bound: voidNone);
+    var S1 = typeParameter('S1', bound: dynamicNone);
+    _checkMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1]),
+      false,
+      ['_ <: T <: int'],
+    );
+  }
+
+  test_functionType_hasTypeFormals_bounds_different_unrelated() {
+    var T1 = typeParameter('T1', bound: intNone);
+    var S1 = typeParameter('S1', bound: stringNone);
+    _checkNotMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1]),
+      false,
+    );
+  }
+
+  test_functionType_hasTypeFormals_bounds_same_leftDefault_rightDefault() {
+    var T1 = typeParameter('T1');
+    var S1 = typeParameter('S1');
+    _checkMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1]),
+      false,
+      ['_ <: T <: int'],
+    );
+  }
+
+  test_functionType_hasTypeFormals_bounds_same_leftDefault_rightObjectQ() {
+    var T1 = typeParameter('T1');
+    var S1 = typeParameter('S1', bound: objectQuestion);
+    _checkMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1]),
+      false,
+      ['_ <: T <: int'],
+    );
+  }
+
+  @FailingTest(reason: 'Closure of type constraints is not implemented yet')
+  test_functionType_hasTypeFormals_closure() {
+    var T = typeParameter('T');
+    var X = typeParameter('X');
+    var Y = typeParameter('Y');
+
+    var T_none = typeParameterTypeNone(T);
+    var X_none = typeParameterTypeNone(X);
+    var Y_none = typeParameterTypeNone(Y);
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        typeFormals: [X],
+        returnType: T_none,
+        parameters: [
+          requiredParameter(type: X_none),
+        ],
+      ),
+      functionTypeNone(
+        typeFormals: [Y],
+        returnType: listNone(Y_none),
+        parameters: [
+          requiredParameter(type: Y_none),
+        ],
+      ),
+      true,
+      ['_ <: T <: List<Object?>'],
+    );
+  }
+
+  test_functionType_hasTypeFormals_differentCount() {
+    var T1 = typeParameter('T1');
+    var S1 = typeParameter('S1');
+    var S2 = typeParameter('S2');
+    _checkNotMatch(
+      [T],
+      functionTypeNone(returnType: T_none, typeFormals: [T1]),
+      functionTypeNone(returnType: intNone, typeFormals: [S1, S2]),
+      false,
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_extraOptionalLeft() {
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          positionalParameter(type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [],
+      ),
+      true,
+      ['_ <: T <: _'],
+    );
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [],
+      ),
+      true,
+      ['_ <: T <: _'],
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_extraRequiredLeft() {
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          requiredParameter(type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [],
+      ),
+      true,
+    );
+
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedRequiredParameter(name: 'a', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [],
+      ),
+      true,
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_extraRight() {
+    _checkNotMatch(
+      [T],
+      functionTypeNone(returnType: voidNone),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          requiredParameter(type: T_none),
+        ],
+      ),
+      true,
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_leftOptionalNamed() {
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: T_none),
+        ],
+      ),
+      true,
+      ['_ <: T <: int'],
+    );
+
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: T_none),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+        ],
+      ),
+      false,
+      ['int <: T <: _'],
+    );
+
+    // int vs. String
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: stringNone),
+        ],
+      ),
+      true,
+    );
+
+    // Skip left non-required named.
+    _checkMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+          namedParameter(name: 'b', type: intNone),
+          namedParameter(name: 'c', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'b', type: T_none),
+        ],
+      ),
+      true,
+      ['_ <: T <: int'],
+    );
+
+    // Not match if skip left required named.
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedRequiredParameter(name: 'a', type: intNone),
+          namedParameter(name: 'b', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'b', type: T_none),
+        ],
+      ),
+      true,
+    );
+
+    // Not match if skip right named.
+    _checkNotMatch(
+      [T],
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'b', type: intNone),
+        ],
+      ),
+      functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          namedParameter(name: 'a', type: intNone),
+          namedParameter(name: 'b', type: T_none),
+        ],
+      ),
+      true,
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_leftOptionalPositional() {
+    void check({
+      @required DartType left,
+      @required ParameterElement right,
+      @required bool leftSchema,
+      @required String expected,
+    }) {
+      var P = functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          positionalParameter(type: left),
+        ],
+      );
+      var Q = functionTypeNone(
+        returnType: voidNone,
+        parameters: [right],
+      );
+
+      if (expected != null) {
+        _checkMatch([T], P, Q, leftSchema, [expected]);
+      } else {
+        _checkNotMatch([T], P, Q, leftSchema);
+      }
+    }
+
+    check(
+      left: intNone,
+      right: requiredParameter(type: T_none),
+      leftSchema: true,
+      expected: '_ <: T <: int',
+    );
+    check(
+      left: T_none,
+      right: requiredParameter(type: intNone),
+      leftSchema: false,
+      expected: 'int <: T <: _',
+    );
+
+    check(
+      left: intNone,
+      right: positionalParameter(type: T_none),
+      leftSchema: true,
+      expected: '_ <: T <: int',
+    );
+    check(
+      left: T_none,
+      right: positionalParameter(type: intNone),
+      leftSchema: false,
+      expected: 'int <: T <: _',
+    );
+
+    check(
+      left: intNone,
+      right: requiredParameter(type: stringNone),
+      leftSchema: true,
+      expected: null,
+    );
+    check(
+      left: intNone,
+      right: positionalParameter(type: stringNone),
+      leftSchema: true,
+      expected: null,
+    );
+
+    check(
+      left: intNone,
+      right: namedParameter(type: intNone, name: 'a'),
+      leftSchema: true,
+      expected: null,
+    );
+    check(
+      left: intNone,
+      right: namedParameter(type: intNone, name: 'a'),
+      leftSchema: false,
+      expected: null,
+    );
+  }
+
+  test_functionType_noTypeFormals_parameters_leftRequiredPositional() {
+    void check({
+      @required DartType left,
+      @required ParameterElement right,
+      @required bool leftSchema,
+      @required String expected,
+    }) {
+      var P = functionTypeNone(
+        returnType: voidNone,
+        parameters: [
+          requiredParameter(type: left),
+        ],
+      );
+      var Q = functionTypeNone(
+        returnType: voidNone,
+        parameters: [right],
+      );
+
+      if (expected != null) {
+        _checkMatch([T], P, Q, leftSchema, [expected]);
+      } else {
+        _checkNotMatch([T], P, Q, leftSchema);
+      }
+    }
+
+    check(
+      left: intNone,
+      right: requiredParameter(type: T_none),
+      leftSchema: true,
+      expected: '_ <: T <: int',
+    );
+    check(
+      left: T_none,
+      right: requiredParameter(type: intNone),
+      leftSchema: false,
+      expected: 'int <: T <: _',
+    );
+
+    check(
+      left: intNone,
+      right: requiredParameter(type: stringNone),
+      leftSchema: true,
+      expected: null,
+    );
+
+    check(
+      left: intNone,
+      right: positionalParameter(type: T_none),
+      leftSchema: true,
+      expected: null,
+    );
+
+    check(
+      left: intNone,
+      right: namedParameter(type: T_none, name: 'a'),
+      leftSchema: true,
+      expected: null,
+    );
+  }
+
+  test_functionType_noTypeFormals_returnType() {
+    _checkMatch(
+      [T],
+      functionTypeNone(returnType: T_none),
+      functionTypeNone(returnType: intNone),
+      false,
+      ['_ <: T <: int'],
+    );
+
+    _checkNotMatch(
+      [T],
+      functionTypeNone(returnType: stringNone),
+      functionTypeNone(returnType: intNone),
+      false,
+    );
+  }
+
+  /// If `P` is `C<M0, ..., Mk> and `Q` is `C<N0, ..., Nk>`, then the match
+  /// holds under constraints `C0 + ... + Ck`:
+  ///   If `Mi` is a subtype match for `Ni` with respect to L under
+  ///   constraints `Ci`.
+  test_interfaceType_same() {
+    _checkMatch(
+      [T],
+      listNone(T_none),
+      listNone(numNone),
+      false,
+      ['_ <: T <: num'],
+    );
+    _checkMatch(
+      [T],
+      listNone(intNone),
+      listNone(T_none),
+      true,
+      ['int <: T <: _'],
+    );
+
+    _checkNotMatch([T], listNone(intNone), listNone(stringNone), false);
+
+    _checkMatch(
+      [T],
+      mapNone(intNone, listNone(T_none)),
+      mapNone(numNone, listNone(stringNone)),
+      false,
+      ['_ <: T <: String'],
+    );
+    _checkMatch(
+      [T],
+      mapNone(intNone, listNone(stringNone)),
+      mapNone(numNone, listNone(T_none)),
+      true,
+      ['String <: T <: _'],
+    );
+
+    _checkNotMatch(
+      [T],
+      mapNone(T_none, listNone(intNone)),
+      mapNone(numNone, listNone(stringNone)),
+      false,
+    );
+  }
+
+  /// If `P` is `C0<M0, ..., Mk>` and `Q` is `C1<N0, ..., Nj>` then the match
+  /// holds with respect to `L` under constraints `C`:
+  ///   If `C1<B0, ..., Bj>` is a superinterface of `C0<M0, ..., Mk>` and
+  ///   `C1<B0, ..., Bj>` is a subtype match for `C1<N0, ..., Nj>` with
+  ///   respect to `L` under constraints `C`.
+  test_interfaceType_superInterface() {
+    _checkMatch(
+      [T],
+      listNone(T_none),
+      iterableNone(numNone),
+      false,
+      ['_ <: T <: num'],
+    );
+    _checkMatch(
+      [T],
+      listNone(intNone),
+      iterableNone(T_none),
+      true,
+      ['int <: T <: _'],
+    );
+    _checkMatch(
+      [T],
+      listNone(intNone),
+      iterableStar(T_none),
+      true,
+      ['int <: T <: _'],
+    );
+
+    _checkNotMatch([T], listNone(intNone), iterableNone(stringNone), true);
+  }
+
+  void test_interfaceType_topMerge() {
+    var testClassIndex = 0;
+
+    void check1(
+      DartType extendsTypeArgument,
+      DartType implementsTypeArgument,
+      String expectedConstraint,
+    ) {
+      var library = library_(
+        uriStr: 'package:test/test.dart',
+        analysisSession: analysisContext.analysisSession,
+        typeSystem: typeSystem,
+      );
+
+      // class A<T> {}
+      var A = class_(name: 'A', typeParameters: [
+        typeParameter('T'),
+      ]);
+      A.enclosingElement = library.definingCompilationUnit;
+
+      // class B<T> extends A<T> {}
+      var B_T = typeParameter('T');
+      var B_T_none = typeParameterTypeNone(B_T);
+      var B = class_(
+        name: 'B',
+        typeParameters: [B_T],
+        superType: interfaceTypeNone(A, typeArguments: [B_T_none]),
+      );
+      B.enclosingElement = library.definingCompilationUnit;
+
+      // class Cx extends A<> implements B<> {}
+      var C = class_(
+        name: 'C${testClassIndex++}',
+        superType: interfaceTypeNone(
+          A,
+          typeArguments: [extendsTypeArgument],
+        ),
+        interfaces: [
+          interfaceTypeNone(
+            B,
+            typeArguments: [implementsTypeArgument],
+          )
+        ],
+      );
+      C.enclosingElement = library.definingCompilationUnit;
+
+      _checkMatch(
+        [T],
+        interfaceTypeNone(C),
+        interfaceTypeNone(A, typeArguments: [T_none]),
+        true,
+        [expectedConstraint],
+      );
+    }
+
+    void check(
+      DartType typeArgument1,
+      DartType typeArgument2,
+      String expectedConstraint,
+    ) {
+      check1(typeArgument1, typeArgument2, expectedConstraint);
+      check1(typeArgument2, typeArgument1, expectedConstraint);
+    }
+
+    check(objectQuestion, dynamicNone, 'Object? <: T <: _');
+    check(objectStar, dynamicNone, 'Object? <: T <: _');
+    check(voidNone, objectQuestion, 'Object? <: T <: _');
+    check(voidNone, objectStar, 'Object? <: T <: _');
+  }
+
+  /// If `P` is `FutureOr<P0>` the match holds under constraint set `C1 + C2`:
+  ///   If `Future<P0>` is a subtype match for `Q` under constraint set `C1`.
+  ///   And if `P0` is a subtype match for `Q` under constraint set `C2`.
+  test_left_futureOr() {
+    _checkMatch(
+      [T],
+      futureOrNone(T_none),
+      futureOrNone(intNone),
+      false,
+      ['_ <: T <: int'],
+    );
+
+    // This is 'T <: int' and 'T <: Future<int>'.
+    _checkMatch(
+      [T],
+      futureOrNone(T_none),
+      futureNone(intNone),
+      false,
+      ['_ <: T <: Never'],
+    );
+
+    _checkNotMatch([T], futureOrNone(T_none), intNone, false);
+  }
+
+  /// If `P` is `Never` then the match holds under no constraints.
+  test_left_never() {
+    _checkMatch([T], neverNone, intNone, false, ['_ <: T <: _']);
+  }
+
+  /// If `P` is `Null`, then the match holds under no constraints:
+  ///  Only if `Q` is nullable.
+  test_left_null() {
+    _checkNotMatch([T], nullNone, intNone, true);
+
+    _checkMatch(
+      [T],
+      nullNone,
+      T_none,
+      true,
+      ['Null <: T <: _'],
+    );
+
+    _checkMatch(
+      [T],
+      nullNone,
+      futureOrNone(T_none),
+      true,
+      ['Null <: T <: _'],
+    );
+
+    void matchNoConstraints(DartType Q) {
+      _checkMatch(
+        [T],
+        nullNone,
+        Q,
+        true,
+        ['_ <: T <: _'],
+      );
+    }
+
+    matchNoConstraints(listQuestion(T_none));
+    matchNoConstraints(stringQuestion);
+    matchNoConstraints(voidNone);
+    matchNoConstraints(dynamicNone);
+    matchNoConstraints(objectQuestion);
+    matchNoConstraints(nullNone);
+    matchNoConstraints(
+      functionTypeQuestion(returnType: voidNone),
+    );
+  }
+
+  /// If `P` is `P0?` the match holds under constraint set `C1 + C2`:
+  ///   If `P0` is a subtype match for `Q` under constraint set `C1`.
+  ///   And if `Null` is a subtype match for `Q` under constraint set `C2`.
+  test_left_suffixQuestion() {
+    // TODO(scheglov) any better test case?
+    _checkMatch(
+      [T],
+      numQuestion,
+      dynamicNone,
+      true,
+      ['_ <: T <: _'],
+    );
+
+    _checkNotMatch([T], T_question, intNone, true);
+  }
+
+  /// If `P` is a legacy type `P0*` then the match holds under constraint
+  /// set `C`:
+  ///   Only if `P0` is a subtype match for `Q` under constraint set `C`.
+  test_left_suffixStar() {
+    _checkMatch([T], T_star, numNone, false, ['_ <: T <: num']);
+    _checkMatch([T], T_star, numQuestion, false, ['_ <: T <: num?']);
+    _checkMatch([T], T_star, numStar, false, ['_ <: T <: num*']);
+
+    _checkMatch([T], numStar, T_none, true, ['num* <: T <: _']);
+    _checkMatch([T], numStar, T_question, true, ['num <: T <: _']);
+    _checkMatch([T], numStar, T_star, true, ['num <: T <: _']);
+  }
+
+  /// If `P` is a type variable `X` in `L`, then the match holds:
+  ///   Under constraint `_ <: X <: Q`.
+  test_left_typeParameter() {
+    void checkMatch(DartType right, String expected) {
+      _checkMatch([T], T_none, right, false, [expected]);
+    }
+
+    checkMatch(numNone, '_ <: T <: num');
+    checkMatch(numQuestion, '_ <: T <: num?');
+    checkMatch(numStar, '_ <: T <: num*');
+  }
+
+  /// If `P` is a type variable `X` with bound `B` (or a promoted type
+  /// variable `X & B`), the match holds with constraint set `C`:
+  ///   If `B` is a subtype match for `Q` with constraint set `C`.
+  /// Note: we have already eliminated the case that `X` is a variable in `L`.
+  test_left_typeParameterOther() {
+    _checkMatch(
+      [T],
+      typeParameterTypeNone(
+        typeParameter('U', bound: intNone),
+      ),
+      numNone,
+      false,
+      ['_ <: T <: _'],
+    );
+
+    _checkMatch(
+      [T],
+      promotedTypeParameterTypeNone(
+        typeParameter('U'),
+        intNone,
+      ),
+      numNone,
+      false,
+      ['_ <: T <: _'],
+    );
+
+    _checkNotMatch(
+      [T],
+      typeParameterTypeNone(
+        typeParameter('U'),
+      ),
+      numNone,
+      false,
+    );
+  }
+
+  /// If `P` is `_` then the match holds with no constraints.
+  test_left_unknown() {
+    _checkMatch([T], unknownType, numNone, true, ['_ <: T <: _']);
+  }
+
+  test_right_functionClass() {
+    _checkMatch(
+      [T],
+      functionTypeNone(returnType: voidNone),
+      functionNone,
+      true,
+      ['_ <: T <: _'],
+    );
+  }
+
+  /// If `Q` is `FutureOr<Q0>` the match holds under constraint set `C`:
+  test_right_futureOr() {
+    // If `P` is `FutureOr<P0>` and `P0` is a subtype match for `Q0` under
+    // constraint set `C`.
+    _checkMatch(
+      [T],
+      futureOrNone(T_none),
+      futureOrNone(numNone),
+      false,
+      ['_ <: T <: num'],
+    );
+    _checkMatch(
+      [T],
+      futureOrNone(numNone),
+      futureOrNone(T_none),
+      true,
+      ['num <: T <: _'],
+    );
+    _checkNotMatch(
+      [T],
+      futureOrNone(stringNone),
+      futureOrNone(intNone),
+      true,
+    );
+
+    // Or if `P` is a subtype match for `Future<Q0>` under non-empty
+    // constraint set `C`.
+    _checkMatch(
+      [T],
+      futureNone(T_none),
+      futureOrNone(numNone),
+      false,
+      ['_ <: T <: num'],
+    );
+    _checkMatch(
+      [T],
+      futureNone(intNone),
+      futureOrNone(T_none),
+      true,
+      ['int <: T <: _'],
+    );
+    _checkMatch(
+      [T],
+      futureNone(intNone),
+      futureOrNone(objectNone),
+      true,
+      ['_ <: T <: _'],
+    );
+    _checkNotMatch(
+      [T],
+      futureNone(stringNone),
+      futureOrNone(intNone),
+      true,
+    );
+
+    // Or if `P` is a subtype match for `Q0` under constraint set `C`.
+    _checkMatch(
+      [T],
+      listNone(T_none),
+      futureOrNone(listNone(intNone)),
+      false,
+      ['_ <: T <: int'],
+    );
+    _checkMatch(
+      [T],
+      neverNone,
+      futureOrNone(T_none),
+      true,
+      ['Never <: T <: _'],
+    );
+
+    // Or if `P` is a subtype match for `Future<Q0>` under empty
+    // constraint set `C`.
+    _checkMatch(
+      [T],
+      futureNone(intNone),
+      futureOrNone(numNone),
+      false,
+      ['_ <: T <: _'],
+    );
+
+    // Otherwise.
+    _checkNotMatch(
+      [T],
+      listNone(T_none),
+      futureOrNone(intNone),
+      false,
+    );
+  }
+
+  /// If `Q` is `Object`, then the match holds under no constraints:
+  ///  Only if `P` is non-nullable.
+  test_right_object() {
+    _checkMatch([T], intNone, objectNone, false, ['_ <: T <: _']);
+    _checkNotMatch([T], intQuestion, objectNone, false);
+
+    _checkNotMatch([T], dynamicNone, objectNone, false);
+
+    {
+      var U = typeParameter('U', bound: numQuestion);
+      _checkNotMatch([T], typeParameterTypeNone(U), objectNone, false);
+    }
+  }
+
+  /// If `Q` is `Q0?` the match holds under constraint set `C`:
+  test_right_suffixQuestion() {
+    // If `P` is `P0?` and `P0` is a subtype match for `Q0` under
+    // constraint set `C`.
+    _checkMatch([T], T_question, numQuestion, false, ['_ <: T <: num']);
+    _checkMatch([T], intQuestion, T_question, true, ['int <: T <: _']);
+
+    // Or if `P` is a subtype match for `Q0` under non-empty
+    // constraint set `C`.
+    _checkMatch(
+      [T],
+      intNone,
+      T_question,
+      false,
+      ['int <: T <: _'],
+    );
+
+    // Or if `P` is a subtype match for `Null` under constraint set `C`.
+    _checkMatch([T], nullNone, intQuestion, true, ['_ <: T <: _']);
+
+    // Or if `P` is a subtype match for `Q0` under empty
+    // constraint set `C`.
+    _checkMatch([T], intNone, intQuestion, true, ['_ <: T <: _']);
+
+    _checkNotMatch([T], intNone, stringQuestion, true);
+    _checkNotMatch([T], intQuestion, stringQuestion, true);
+    _checkNotMatch([T], intStar, stringQuestion, true);
+  }
+
+  /// If `Q` is a legacy type `Q0*` then the match holds under constraint
+  /// set `C`:
+  ///   Only if `P` is a subtype match for `Q?` under constraint set `C`.
+  test_right_suffixStar() {
+    _checkMatch([T], T_none, numStar, false, ['_ <: T <: num*']);
+    _checkMatch([T], T_star, numStar, false, ['_ <: T <: num*']);
+    _checkMatch([T], T_question, numStar, false, ['_ <: T <: num']);
+
+    _checkMatch([T], numNone, T_star, true, ['num <: T <: _']);
+    _checkMatch([T], numQuestion, T_star, true, ['num <: T <: _']);
+    _checkMatch([T], numStar, T_star, true, ['num <: T <: _']);
+  }
+
+  /// If `Q` is `dynamic`, `Object?`, or `void` then the match holds under
+  /// no constraints.
+  test_right_top() {
+    _checkMatch([T], intNone, dynamicNone, false, ['_ <: T <: _']);
+    _checkMatch([T], intNone, objectQuestion, false, ['_ <: T <: _']);
+    _checkMatch([T], intNone, voidNone, false, ['_ <: T <: _']);
+  }
+
+  /// If `Q` is a type variable `X` in `L`, then the match holds:
+  ///   Under constraint `P <: X <: _`.
+  test_right_typeParameter() {
+    void checkMatch(DartType left, String expected) {
+      _checkMatch([T], left, T_none, true, [expected]);
+    }
+
+    checkMatch(numNone, 'num <: T <: _');
+    checkMatch(numQuestion, 'num? <: T <: _');
+    checkMatch(numStar, 'num* <: T <: _');
+  }
+
+  /// If `Q` is `_` then the match holds with no constraints.
+  test_right_unknown() {
+    _checkMatch([T], numNone, unknownType, true, ['_ <: T <: _']);
+    _checkMatch([T], numNone, unknownType, true, ['_ <: T <: _']);
+  }
+
+  void _checkMatch(
+    List<TypeParameterElement> typeParameters,
+    DartType P,
+    DartType Q,
+    bool leftSchema,
+    List<String> expected,
+  ) {
+    var gatherer = TypeConstraintGatherer(
+      typeSystem: typeSystem,
+      typeParameters: typeParameters,
+    );
+
+    var isMatch = gatherer.trySubtypeMatch(P, Q, leftSchema);
+    expect(isMatch, isTrue);
+
+    var constraints = gatherer.computeConstraints();
+    var constraintsStr = constraints.entries.map((e) {
+      var lowerStr = e.value.lower.getDisplayString(withNullability: true);
+      var upperStr = e.value.upper.getDisplayString(withNullability: true);
+      return '$lowerStr <: ${e.key.name} <: $upperStr';
+    }).toList();
+
+    expect(constraintsStr, unorderedEquals(expected));
+  }
+
+  void _checkNotMatch(
+    List<TypeParameterElement> typeParameters,
+    DartType P,
+    DartType Q,
+    bool leftSchema,
+  ) {
+    var gatherer = TypeConstraintGatherer(
+      typeSystem: typeSystem,
+      typeParameters: typeParameters,
+    );
+
+    var isMatch = gatherer.trySubtypeMatch(P, Q, leftSchema);
+    expect(isMatch, isFalse);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
index 8e35b70..8503999 100644
--- a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
@@ -38,6 +38,8 @@
   /// Override this to change the analysis options for a given set of tests.
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl();
 
+  bool get enableIndex => false;
+
   @override
   Future<ResolvedUnitResult> resolveFile(String path) async {
     return await driver.getResult(path);
@@ -77,6 +79,7 @@
           ResourceUriResolver(resourceProvider)
         ]),
         analysisOptions,
+        enableIndex: enableIndex,
         packages: Packages.empty);
 
     scheduler.start();
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index b4e5dff..cf358a3 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -38,4 +38,18 @@
     expect(findElement.field('bbb').isConstantEvaluated, isTrue);
     expect(findElement.field('values').isConstantEvaluated, isTrue);
   }
+
+  test_isEnumConstant() async {
+    await assertNoErrorsInCode(r'''
+enum E {
+  a, b
+}
+''');
+
+    expect(findElement.field('a').isEnumConstant, isTrue);
+    expect(findElement.field('b').isEnumConstant, isTrue);
+
+    expect(findElement.field('index').isEnumConstant, isFalse);
+    expect(findElement.field('values').isEnumConstant, isFalse);
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index d51062a..5091559 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -46,15 +46,15 @@
           53, 5),
     ]);
 
-    // TODO(brianwilkerson) Test this more carefully after we can re-write the
-    // AST to reflect the expected structure.
-//    var creation = findNode.instanceCreation('Foo.bar<int>');
-//    assertInstanceCreation(
-//      creation,
-//      findElement.class_('Foo'),
-//      'Foo',
-//      constructorName: 'bar',
-//    );
+    var creation = findNode.instanceCreation('Foo.bar<int>');
+    assertInstanceCreation(
+      creation,
+      findElement.class_('Foo'),
+      'Foo<dynamic>',
+      constructorName: 'bar',
+      expectedConstructorMember: true,
+      expectedSubstitution: {'X': 'dynamic'},
+    );
   }
 
   test_error_wrongNumberOfTypeArgumentsConstructor_explicitNew_prefix() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 2e7b45c..b975ed7 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -1040,10 +1040,8 @@
 
 abstract class X extends A with U1, U2, M {}
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 121, 2),
       error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 121, 2),
       error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 125, 2),
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 125, 2),
       error(
           CompileTimeErrorCode
               .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index b052e2e..cf03581 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -726,7 +726,7 @@
     } else if (node is IndexExpression) {
       return node.staticElement;
     } else if (node is InstanceCreationExpression) {
-      return node.staticElement;
+      return node.constructorName.staticElement;
     } else if (node is MethodInvocation) {
       return node.methodName.staticElement;
     } else if (node is PostfixExpression) {
diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
index ed3d0fb..d6f56d9 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
@@ -232,7 +232,7 @@
   new A();
 }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 15, 1),
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 15, 1),
     ]);
 
     assertTypeName(
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 7ba0920..f2493f1 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -283,20 +283,6 @@
     ]);
   }
 
-  test_instanceCreation_defaultConstructor() async {
-    await assertErrorsInCode(r'''
-class A {
-  @deprecated
-  A(int i) {}
-}
-f() {
-  return new A(1);
-}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 55, 8),
-    ]);
-  }
-
   test_instanceCreation_namedConstructor() async {
     await assertErrorsInCode(r'''
 class A {
@@ -307,7 +293,21 @@
   return new A.named(1);
 }
 ''', [
-      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 14),
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 65, 7),
+    ]);
+  }
+
+  test_instanceCreation_unnamedConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A(int i) {}
+}
+f() {
+  return new A(1);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
     ]);
   }
 
@@ -449,20 +449,6 @@
     ]);
   }
 
-  test_superConstructor_defaultConstructor() async {
-    await assertErrorsInCode(r'''
-class A {
-  @deprecated
-  A() {}
-}
-class B extends A {
-  B() : super() {}
-}
-''', [
-      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 63, 7),
-    ]);
-  }
-
   test_superConstructor_namedConstructor() async {
     await assertErrorsInCode(r'''
 class A {
@@ -476,6 +462,20 @@
       error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 13),
     ]);
   }
+
+  test_superConstructor_unnamedConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A() {}
+}
+class B extends A {
+  B() : super() {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 63, 7),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart
index fa26b8c..758cb1f 100644
--- a/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart
@@ -15,6 +15,18 @@
 
 @reflectiveTest
 class NewWithNonTypeTest extends DriverResolutionTest {
+  test_functionTypeAlias() async {
+    await assertErrorsInCode('''
+typedef F = void Function();
+
+void foo() {
+  new F();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 49, 1),
+    ]);
+  }
+
   test_imported() async {
     newFile("/test/lib/lib.dart", content: "class B {}");
     await assertErrorsInCode('''
@@ -38,4 +50,14 @@
       error(StaticWarningCode.NEW_WITH_NON_TYPE, 28, 1),
     ]);
   }
+
+  test_typeParameter() async {
+    await assertErrorsInCode('''
+void foo<T>() {
+  new T();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 22, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
index 3893cf2..b72081b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
@@ -425,7 +425,7 @@
     assertType(instanceCreation, 'A*');
 
     _assertLegacyMember(
-      instanceCreation.staticElement,
+      instanceCreation.constructorName.staticElement,
       _import_a.unnamedConstructor('A'),
     );
   }
@@ -448,7 +448,7 @@
     assertType(instanceCreation, 'A<int*>*');
 
     _assertLegacyMember(
-      instanceCreation.staticElement,
+      instanceCreation.constructorName.staticElement,
       _import_a.unnamedConstructor('A'),
       expectedSubstitution: {'T': 'int*'},
     );
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
index 1a2b49b..2842fc2 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
@@ -22,7 +22,7 @@
   return const A();
 }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 21, 1),
+      error(CompileTimeErrorCode.CONST_WITH_NON_TYPE, 21, 1),
     ]);
   }
 
@@ -40,7 +40,7 @@
     await assertErrorsInCode('''
 f() { new C(); }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 10, 1),
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 10, 1),
     ]);
   }
 
diff --git a/pkg/analyzer_cli/LICENSE b/pkg/analyzer_cli/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/pkg/analyzer_cli/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/analyzer_cli/README.md b/pkg/analyzer_cli/README.md
index 03de8b9..a06b656 100644
--- a/pkg/analyzer_cli/README.md
+++ b/pkg/analyzer_cli/README.md
@@ -24,7 +24,6 @@
   Specify the path to the package resolution configuration file.
   For more information see
   [Package Resolution Configuration File](https://github.com/lrhn/dep-pkgspec/blob/master/DEP-pkgspec.md).
-  This option cannot be used with `--package-root`.
 
 * `--package-warnings`
 
@@ -78,10 +77,3 @@
 * `--url-mapping=libraryUri,/path/to/library.dart`
 
   Use the specified library as the source for that particular import.
-
-The following options are deprecated:
-
-* `--package-root=`<br>
-  **Deprecated.** Specify the directory to search for any libraries that are
-  imported using `package:`. _This option is replaced as of Dart 1.12 with
-  `--packages`._
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 42342cf..3cd2c60 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -598,9 +598,6 @@
       } catch (e) {
         printAndFail('Unable to read package config data from $path: $e');
       }
-    } else if (options.packageRootPath != null) {
-      var path = normalizePath(options.packageRootPath);
-      packageMap = _PackageRootPackageMapBuilder.buildPackageMap(path);
     } else {
       var cwd = resourceProvider.getResource(path.current);
       // Look for .packages.
@@ -679,7 +676,6 @@
       CommandLineOptions previous, CommandLineOptions newOptions) {
     return previous != null &&
         newOptions != null &&
-        newOptions.packageRootPath == previous.packageRootPath &&
         newOptions.packageConfigPath == previous.packageConfigPath &&
         _equalMaps(newOptions.definedVariables, previous.definedVariables) &&
         newOptions.log == previous.log &&
@@ -735,28 +731,3 @@
 
   _PackageInfo(this.packages, this.packageMap);
 }
-
-class _PackageRootPackageMapBuilder {
-  /// In the case that the analyzer is invoked with a --package-root option, we
-  /// need to manually create the mapping from package name to folder.
-  ///
-  /// Given [packageRootPath], creates a simple mapping from package name
-  /// to full path on disk (resolving any symbolic links).
-  static Map<String, List<Folder>> buildPackageMap(String packageRootPath) {
-    var packageRoot = io.Directory(packageRootPath);
-    if (!packageRoot.existsSync()) {
-      throw _DriverError(
-          'Package root directory ($packageRootPath) does not exist.');
-    }
-    var packages = packageRoot.listSync(followLinks: false);
-    var result = <String, List<Folder>>{};
-    for (var package in packages) {
-      var packageName = path.basename(package.path);
-      var realPath = package.resolveSymbolicLinksSync();
-      result[packageName] = [
-        PhysicalResourceProvider.INSTANCE.getFolder(realPath)
-      ];
-    }
-    return result;
-  }
-}
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 2d60cd0..90deb09 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -203,10 +203,6 @@
   /// The path to a `.packages` configuration file
   String get packageConfigPath => contextBuilderOptions.defaultPackageFilePath;
 
-  /// The path to the package root
-  String get packageRootPath =>
-      contextBuilderOptions.defaultPackagesDirectoryPath;
-
   /// The source files to analyze
   List<String> get sourceFiles => _sourceFiles;
 
@@ -246,18 +242,9 @@
       }
     }
 
-    // Check package config.
-    {
-      if (options.packageRootPath != null &&
-          options.packageConfigPath != null) {
-        printAndFail("Cannot specify both '--package-root' and '--packages.");
-        return null; // Only reachable in testing.
-      }
-    }
-
     // Build mode.
     if (options.buildModePersistentWorker && !options.buildMode) {
-      printAndFail('The option --persisten_worker can be used only '
+      printAndFail('The option --persistent_worker can be used only '
           'together with --build-mode.');
       return null; // Only reachable in testing.
     }
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index 4c6aa87..95c1efc 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -43,7 +43,6 @@
     'showPackageWarningsPrefix': options.showPackageWarningsPrefix,
     'showSdkWarnings': options.showSdkWarnings,
     'definedVariables': options.definedVariables,
-    'packageRootPath': options.packageRootPath,
     'packageConfigPath': options.packageConfigPath,
     'sourceFiles': options.sourceFiles,
   };
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 8e5ce94..9c3b28f 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -59,7 +59,6 @@
         expect(options.ignoreUnrecognizedFlags, isFalse);
         expect(options.log, isFalse);
         expect(options.machineFormat, isFalse);
-        expect(options.packageRootPath, isNull);
         expect(options.batchMode, isFalse);
         expect(options.showPackageWarnings, isFalse);
         expect(options.showSdkWarnings, isFalse);
@@ -188,12 +187,6 @@
         expect(options.lints, isTrue);
       });
 
-      test('package root', () {
-        var options = CommandLineOptions.parse(
-            ['--dart-sdk', '.', '--package-root', 'bar', 'foo.dart']);
-        expect(options.packageRootPath, equals('bar'));
-      });
-
       test('package warnings', () {
         var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--package-warnings', 'foo.dart']);
@@ -238,15 +231,6 @@
         expect(options.lintsAreFatal, isTrue);
       });
 
-      test("can't specify package and package-root", () {
-        var failureMessage;
-        CommandLineOptions.parse(
-            ['--package-root', '.', '--packages', '.', 'foo.dart'],
-            printAndFail: (msg) => failureMessage = msg);
-        expect(failureMessage,
-            equals("Cannot specify both '--package-root' and '--packages."));
-      });
-
       test('bad SDK dir', () {
         var failureMessage;
         CommandLineOptions.parse(['--dart-sdk', '&&&&&', 'foo.dart'],
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 69beb48..49bd399 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -173,6 +173,7 @@
   void writeConstructorDeclaration(String className,
       {ArgumentList argumentList,
       void Function() bodyWriter,
+      String classNameGroupName,
       SimpleIdentifier constructorName,
       String constructorNameGroupName,
       List<String> fieldNames,
@@ -183,7 +184,11 @@
       write(Keyword.CONST.lexeme);
       write(' ');
     }
-    write(className);
+    if (classNameGroupName == null) {
+      write(className);
+    } else {
+      addSimpleLinkedEdit(classNameGroupName, className);
+    }
     if (constructorName != null) {
       write('.');
       if (constructorNameGroupName == null) {
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 645201d..15ba518 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -82,6 +82,7 @@
   void writeConstructorDeclaration(String className,
       {ArgumentList argumentList,
       void Function() bodyWriter,
+      String classNameGroupName,
       SimpleIdentifier constructorName,
       String constructorNameGroupName,
       List<String> fieldNames,
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 41ab31e..563d438 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -98,8 +98,8 @@
 
   static const String serverMode = '--server-mode';
 
-  static const String nullSafety = '--sound-null-safety';
-  static const String noNullSafety = '--no-sound-null-safety';
+  static const String soundNullSafety = '--sound-null-safety';
+  static const String noSoundNullSafety = '--no-sound-null-safety';
 
   static const String newDeferredSplit = '--new-deferred-split';
   static const String reportInvalidInferredDeferredTypes =
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 37094a9..7f4564c 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -461,8 +461,8 @@
     new OptionHandler(Flags.noLegacyJavaScript, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
     new OptionHandler(Flags.benchmarkingExperiment, passThrough),
-    new OptionHandler(Flags.nullSafety, setNullSafetyMode),
-    new OptionHandler(Flags.noNullSafety, setNullSafetyMode),
+    new OptionHandler(Flags.soundNullSafety, setNullSafetyMode),
+    new OptionHandler(Flags.noSoundNullSafety, setNullSafetyMode),
 
     // TODO(floitsch): remove conditional directives flag.
     // We don't provide the info-message yet, since we haven't publicly
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index aec72f0..6b4bde7 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -16,6 +16,7 @@
 import 'package:kernel/target/targets.dart' hide DiagnosticReporter;
 
 import '../../compiler_new.dart' as api;
+import '../commandline_options.dart' show Flags;
 import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../common.dart';
 import '../options.dart';
@@ -59,13 +60,44 @@
     return measure(() async {
       String targetName =
           _options.compileForServer ? "dart2js_server" : "dart2js";
-      String platform = targetName;
-      if (_options.useNullSafety && !_options.useWeakNullSafetySemantics) {
-        platform += "_nnbd_strong";
+
+      // We defer selecting the platform until we've resolved the NNBD mode.
+      String getPlatformFilename() {
+        String platform = targetName;
+        if ((_options.nullSafetyMode == NullSafetyMode.sound)) {
+          platform += "_nnbd_strong";
+        }
+        platform += "_platform.dill";
+        return platform;
       }
-      platform += "_platform.dill";
-      var isDill = resolvedUri.path.endsWith('.dill');
+
       ir.Component component;
+      var isDill = resolvedUri.path.endsWith('.dill');
+
+      // TODO(sigmund): remove after we unfork the sdk, and force null-safety to
+      // always be considered to be true.
+      void inferNullSafety() {
+        if (component.libraries.any((lib) =>
+            lib.isNonNullableByDefault && lib.importUri.scheme == 'dart')) {
+          _options.useNullSafety = true;
+        }
+      }
+
+      void inferNullSafetyMode(bool isSound) {
+        if (isSound) assert(_options.useNullSafety == true);
+        if (_options.nullSafetyMode == NullSafetyMode.unspecified) {
+          _options.nullSafetyMode =
+              isSound ? NullSafetyMode.sound : NullSafetyMode.unsound;
+        }
+      }
+
+      void validateNullSafety() {
+        assert(_options.nullSafetyMode != NullSafetyMode.unspecified);
+        if (_options.nullSafetyMode == NullSafetyMode.sound) {
+          assert(_options.useNullSafety);
+        }
+      }
+
       if (isDill) {
         component = new ir.Component();
         Future<void> read(Uri uri) async {
@@ -75,11 +107,28 @@
         }
 
         await read(resolvedUri);
+
+        var isStrongDill =
+            component.mode == ir.NonNullableByDefaultCompiledMode.Strong;
+        var incompatibleNullSafetyMode =
+            isStrongDill ? NullSafetyMode.unsound : NullSafetyMode.sound;
+        if (_options.nullSafetyMode == incompatibleNullSafetyMode) {
+          var dillMode = isStrongDill ? 'sound' : 'unsound';
+          var option =
+              isStrongDill ? Flags.noSoundNullSafety : Flags.soundNullSafety;
+          throw ArgumentError("$resolvedUri was compiled with $dillMode null "
+              "safety and is incompatible with the '$option' option");
+        }
+        inferNullSafety();
+        inferNullSafetyMode(isStrongDill);
+        validateNullSafety();
+
         if (_options.dillDependencies != null) {
           // Modular compiles do not include the platform on the input dill
           // either.
           if (_options.platformBinaries != null) {
-            await read(_options.platformBinaries.resolve(platform));
+            await read(
+                _options.platformBinaries.resolve(getPlatformFilename()));
           }
           for (Uri dependency in _options.dillDependencies) {
             await read(dependency);
@@ -96,16 +145,34 @@
           return null;
         }
       } else {
+        bool verbose = false;
+        Target target = Dart2jsTarget(targetName, TargetFlags());
+        fe.FileSystem fileSystem = CompilerFileSystem(_compilerInput);
+        fe.DiagnosticMessageHandler onDiagnostic =
+            (e) => reportFrontEndMessage(_reporter, e);
+        fe.CompilerOptions options = fe.CompilerOptions()
+          ..target = target
+          ..librariesSpecificationUri = _options.librariesSpecificationUri
+          ..packagesFileUri = _options.packageConfig
+          ..experimentalFlags = _options.languageExperiments
+          ..verbose = verbose
+          ..fileSystem = fileSystem
+          ..onDiagnostic = onDiagnostic;
+        bool isLegacy =
+            await fe.uriUsesLegacyLanguageVersion(resolvedUri, options);
+        inferNullSafetyMode(_options.useNullSafety && !isLegacy);
+
         List<Uri> dependencies = [];
         if (_options.platformBinaries != null) {
-          dependencies.add(_options.platformBinaries.resolve(platform));
+          dependencies
+              .add(_options.platformBinaries.resolve(getPlatformFilename()));
         }
         if (_options.dillDependencies != null) {
           dependencies.addAll(_options.dillDependencies);
         }
         initializedCompilerState = fe.initializeCompiler(
             initializedCompilerState,
-            new Dart2jsTarget(targetName, new TargetFlags()),
+            target,
             _options.librariesSpecificationUri,
             dependencies,
             _options.packageConfig,
@@ -113,20 +180,11 @@
             nnbdMode: _options.useLegacySubtyping
                 ? fe.NnbdMode.Weak
                 : fe.NnbdMode.Strong);
-        component = await fe.compile(
-            initializedCompilerState,
-            false,
-            new CompilerFileSystem(_compilerInput),
-            (e) => reportFrontEndMessage(_reporter, e),
-            resolvedUri);
-      }
-      if (component == null) return null;
-
-      // TODO(sigmund): remove after we unfork the sdk, and force null-safety to
-      // always be considered to be true.
-      if (component.libraries.any((lib) =>
-          lib.isNonNullableByDefault && lib.importUri.scheme == 'dart')) {
-        _options.useNullSafety = true;
+        component = await fe.compile(initializedCompilerState, verbose,
+            fileSystem, onDiagnostic, resolvedUri);
+        if (component == null) return null;
+        inferNullSafety();
+        validateNullSafety();
       }
 
       if (_options.cfeOnly) {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index ce0599c..5b84ff7 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -9,6 +9,12 @@
 import 'commandline_options.dart' show Flags;
 import 'util/util.dart';
 
+enum NullSafetyMode {
+  unspecified,
+  unsound,
+  sound,
+}
+
 /// Options used for controlling diagnostic messages.
 abstract class DiagnosticOptions {
   const DiagnosticOptions();
@@ -344,14 +350,22 @@
   bool useNullSafety = false;
 
   /// When null-safety is enabled, whether the compiler should emit code with
-  /// weak or strong semantics.
-  bool useWeakNullSafetySemantics = true;
+  /// unsound or sound semantics.
+  ///
+  /// If unspecified, the mode must be inferred from the entrypoint.
+  NullSafetyMode nullSafetyMode = NullSafetyMode.unspecified;
+  bool _soundNullSafety = false;
+  bool _noSoundNullSafety = false;
 
   /// Whether to use legacy subtype semantics rather than null-safe semantics.
   /// This is `true` if null-safety is disabled, i.e. all code is legacy code,
-  /// or if weak null-safety semantics are being used, since we do not emit
+  /// or if unsound null-safety semantics are being used, since we do not emit
   /// warnings.
-  bool get useLegacySubtyping => !useNullSafety || useWeakNullSafetySemantics;
+  bool get useLegacySubtyping {
+    assert(nullSafetyMode != NullSafetyMode.unspecified,
+        "Null safety mode unspecified");
+    return !useNullSafety || (nullSafetyMode == NullSafetyMode.unsound);
+  }
 
   /// The path to the file that contains the profiled allocations.
   ///
@@ -469,7 +483,8 @@
       ..codegenShards = _extractIntOption(options, '${Flags.codegenShards}=')
       ..cfeOnly = _hasOption(options, Flags.cfeOnly)
       ..debugGlobalInference = _hasOption(options, Flags.debugGlobalInference)
-      ..useWeakNullSafetySemantics = !_hasOption(options, Flags.nullSafety);
+      .._soundNullSafety = _hasOption(options, Flags.soundNullSafety)
+      .._noSoundNullSafety = _hasOption(options, Flags.noSoundNullSafety);
   }
 
   void validate() {
@@ -491,6 +506,14 @@
       throw ArgumentError("'${Flags.legacyJavaScript}' incompatible with "
           "'${Flags.noLegacyJavaScript}'");
     }
+    if (_soundNullSafety && _noSoundNullSafety) {
+      throw ArgumentError("'${Flags.soundNullSafety}' incompatible with "
+          "'${Flags.noSoundNullSafety}'");
+    }
+    if (!useNullSafety && _soundNullSafety) {
+      throw ArgumentError("'${Flags.soundNullSafety}' requires the "
+          "'non-nullable' experiment to be enabled");
+    }
   }
 
   void deriveOptions() {
@@ -511,6 +534,9 @@
       useNullSafety = true;
     }
 
+    if (_soundNullSafety) nullSafetyMode = NullSafetyMode.sound;
+    if (_noSoundNullSafety) nullSafetyMode = NullSafetyMode.unsound;
+
     if (optimizationLevel != null) {
       if (optimizationLevel == 0) {
         disableInlining = true;
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 86b00ee..06de6f8 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -8,6 +8,7 @@
 import 'package:kernel/binary/ast_to_binary.dart' as ir;
 import '../../compiler_new.dart' as api;
 import '../backend_strategy.dart';
+import '../commandline_options.dart' show Flags;
 import '../common/codegen.dart';
 import '../common/tasks.dart';
 import '../diagnostics/diagnostic_listener.dart';
@@ -98,11 +99,31 @@
       new ir.BinaryBuilder(dillInput.data).readComponent(component);
       return component;
     });
+
+    var isStrongDill =
+        component.mode == ir.NonNullableByDefaultCompiledMode.Strong;
+    var incompatibleNullSafetyMode =
+        isStrongDill ? NullSafetyMode.unsound : NullSafetyMode.sound;
+    if (_options.nullSafetyMode == incompatibleNullSafetyMode) {
+      var dillMode = isStrongDill ? 'sound' : 'unsound';
+      var option =
+          isStrongDill ? Flags.noSoundNullSafety : Flags.soundNullSafety;
+      throw ArgumentError("${_options.entryPoint} was compiled with $dillMode "
+          "null safety and is incompatible with the '$option' option");
+    }
+
     if (component.libraries.any((lib) =>
         lib.isNonNullableByDefault && lib.importUri.scheme == 'dart')) {
       _options.useNullSafety = true;
     }
 
+    if (component.mode == ir.NonNullableByDefaultCompiledMode.Strong) {
+      _options.nullSafetyMode = NullSafetyMode.sound;
+      assert(_options.useNullSafety);
+    } else {
+      _options.nullSafetyMode = NullSafetyMode.unsound;
+    }
+
     return await measureIoSubtask('deserialize data', () async {
       _reporter.log('Reading data from ${_options.readDataUri}');
       api.Input<List<int>> dataInput = await _provider
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index ae77337..1082a00 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -4394,13 +4394,8 @@
           function.requiredParameterCount ==
               function.positionalParameters.length &&
           function.namedParameters.isEmpty) {
-        push(new HForeignCode(
-            js.js.expressionTemplateYielding(_emitter
-                .staticFunctionAccess(_elementMap.getMethod(procedure))),
-            _abstractValueDomain.dynamicType,
-            <HInstruction>[],
-            nativeBehavior: NativeBehavior.PURE,
-            foreignFunction: _elementMap.getMethod(procedure)));
+        push(HFunctionReference(_elementMap.getMethod(procedure),
+            _abstractValueDomain.dynamicType));
         return true;
       }
       problem = 'does not handle a closure with optional parameters';
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index db213ca..cbb4bc0 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2285,6 +2285,13 @@
   }
 
   @override
+  visitFunctionReference(HFunctionReference node) {
+    FunctionEntity element = node.element;
+    _registry.registerStaticUse(StaticUse.implicitInvoke(element));
+    push(_emitter.staticFunctionAccess(element));
+  }
+
+  @override
   visitLocalGet(HLocalGet node) {
     use(node.receiver);
   }
@@ -2409,11 +2416,6 @@
 
     // TODO(sra): Tell world.nativeEnqueuer about the types created here.
     registerForeignTypes(node);
-
-    if (node.foreignFunction != null) {
-      _registry?.registerStaticUse(
-          new StaticUse.implicitInvoke(node.foreignFunction));
-    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index fce8ad8..e7ea8ac 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -45,6 +45,7 @@
   R visitExitTry(HExitTry node);
   R visitFieldGet(HFieldGet node);
   R visitFieldSet(HFieldSet node);
+  R visitFunctionReference(HFunctionReference node);
   R visitInvokeExternal(HInvokeExternal node);
   R visitForeignCode(HForeignCode node);
   R visitGetLength(HGetLength node);
@@ -471,6 +472,8 @@
   @override
   visitFieldSet(HFieldSet node) => visitFieldAccess(node);
   @override
+  visitFunctionReference(HFunctionReference node) => visitInstruction(node);
+  @override
   visitInvokeExternal(HInvokeExternal node) => visitInstruction(node);
   @override
   visitForeignCode(HForeignCode node) => visitInstruction(node);
@@ -1083,13 +1086,14 @@
   static const int STATIC_TYPECODE = 21;
   static const int STATIC_STORE_TYPECODE = 22;
   static const int FIELD_GET_TYPECODE = 23;
-  static const int TYPE_CONVERSION_TYPECODE = 24;
-  static const int TYPE_KNOWN_TYPECODE = 25;
-  static const int INVOKE_STATIC_TYPECODE = 26;
-  static const int INDEX_TYPECODE = 27;
-  static const int IS_TYPECODE = 28;
-  static const int INVOKE_DYNAMIC_TYPECODE = 29;
-  static const int SHIFT_RIGHT_TYPECODE = 30;
+  static const int FUNCTION_REFERENCE_TYPECODE = 24;
+  static const int TYPE_CONVERSION_TYPECODE = 25;
+  static const int TYPE_KNOWN_TYPECODE = 26;
+  static const int INVOKE_STATIC_TYPECODE = 27;
+  static const int INDEX_TYPECODE = 28;
+  static const int IS_TYPECODE = 29;
+  static const int INVOKE_DYNAMIC_TYPECODE = 30;
+  static const int SHIFT_RIGHT_TYPECODE = 31;
 
   static const int TRUNCATING_DIVIDE_TYPECODE = 36;
   static const int IS_VIA_INTERCEPTOR_TYPECODE = 37;
@@ -2166,6 +2170,28 @@
   String toString() => "FieldSet(element=$element,type=$instructionType)";
 }
 
+// Raw reference to a function.
+class HFunctionReference extends HInstruction {
+  FunctionEntity element;
+  HFunctionReference(this.element, AbstractValue type) : super([], type) {
+    sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
+    setUseGvn();
+  }
+
+  @override
+  accept(HVisitor visitor) => visitor.visitFunctionReference(this);
+
+  @override
+  int typeCode() => HInstruction.FUNCTION_REFERENCE_TYPECODE;
+  @override
+  bool typeEquals(other) => other is HFunctionReference;
+  @override
+  bool dataEquals(HFunctionReference other) => element == other.element;
+  @override
+  String toString() => "FunctionReference($element)";
+}
+
 class HGetLength extends HInstruction {
   final bool isAssignable;
   HGetLength(HInstruction receiver, AbstractValue type,
@@ -2412,14 +2438,12 @@
   @override
   final NativeBehavior nativeBehavior;
   NativeThrowBehavior throwBehavior;
-  final FunctionEntity foreignFunction;
 
   HForeignCode(this.codeTemplate, AbstractValue type, List<HInstruction> inputs,
       {this.isStatement: false,
       SideEffects effects,
       NativeBehavior nativeBehavior,
-      NativeThrowBehavior throwBehavior,
-      this.foreignFunction})
+      NativeThrowBehavior throwBehavior})
       : this.nativeBehavior = nativeBehavior,
         this.throwBehavior = throwBehavior,
         super(type, inputs) {
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 5bfb428..1c7f7ae 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -261,6 +261,11 @@
   }
 
   @override
+  String visitFunctionReference(HFunctionReference node) {
+    return 'FunctionReference: ${node.element}';
+  }
+
+  @override
   String visitReadModifyWrite(HReadModifyWrite node) {
     String fieldName = node.element.name;
     String receiverId = temporaryId(node.receiver);
diff --git a/pkg/dartdev/bin/dartdev.dart b/pkg/dartdev/bin/dartdev.dart
index 7968056..a68e139 100644
--- a/pkg/dartdev/bin/dartdev.dart
+++ b/pkg/dartdev/bin/dartdev.dart
@@ -13,12 +13,13 @@
   try {
     dynamic result = await runner.run(args);
     exit(result is int ? result : 0);
-  } catch (e) {
+  } catch (e, st) {
     if (e is UsageException) {
       stderr.writeln('$e');
       exit(64);
     } else {
       stderr.writeln('$e');
+      stderr.writeln('$st');
       exit(1);
     }
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 4249df8..25fce07 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -246,6 +246,9 @@
   bool visitLet(Let node) => isNullable(node.body);
 
   @override
+  bool visitBlockExpression(BlockExpression node) => isNullable(node.value);
+
+  @override
   bool visitInstantiation(Instantiation node) => false;
 
   bool isNotNullAnnotation(Expression value) =>
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index d39c7e6..7c11494 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -253,7 +253,7 @@
         '() → dart.core::Null? => null, f');
   });
 
-  test('cascades (kernel let)', () async {
+  test('cascades (kernel BlockExpression)', () async {
     // `null..toString()` evaluates to `null` so it is nullable.
     await expectNotNull('main() { null..toString(); }', '');
     await expectAllNotNull('main() { 1..toString(); }');
diff --git a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
index 6004fc5..d213c3a 100644
--- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
@@ -1,8 +1,8 @@
 ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3719|5|94|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7908|5|97|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7909|5|97|Const constructors can't throw exceptions.
 ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|940|5|95|Const constructors can't throw exceptions.
 ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|973|5|94|Const constructors can't throw exceptions.
 ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3717|3|5|Only redirecting factory constructors can be declared to be 'const'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7906|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7907|3|5|Only redirecting factory constructors can be declared to be 'const'.
 ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|938|3|5|Only redirecting factory constructors can be declared to be 'const'.
 ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|971|3|5|Only redirecting factory constructors can be declared to be 'const'.
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 9cb036e..4a7ef9d 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -51,6 +51,7 @@
 export 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show
         DiagnosticMessage,
+        DiagnosticMessageHandler,
         getMessageCharOffset,
         getMessageHeaderText,
         getMessageLength,
@@ -109,6 +110,9 @@
 
 export '../api_prototype/kernel_generator.dart' show kernelForProgram;
 
+export '../api_prototype/language_version.dart'
+    show uriUsesLegacyLanguageVersion;
+
 export '../api_prototype/standard_file_system.dart' show DataFileSystemEntity;
 
 export '../base/nnbd_mode.dart' show NnbdMode;
@@ -135,17 +139,21 @@
     Uri librariesSpecificationUri,
     List<Uri> additionalDills,
     Uri packagesFileUri,
-    {List<Uri> dependencies,
-    Map<ExperimentalFlag, bool> experimentalFlags,
+    {Map<ExperimentalFlag, bool> experimentalFlags,
     bool verify: false,
     NnbdMode nnbdMode}) {
   additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
 
+  // We don't check `target` because it doesn't support '==' and each
+  // compilation passes a fresh target. However, we pass a logically identical
+  // target each time, so it is safe to assume that it never changes.
   if (oldState != null &&
       oldState.options.packagesFileUri == packagesFileUri &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       equalLists(oldState.options.additionalDills, additionalDills) &&
-      equalMaps(oldState.options.experimentalFlags, experimentalFlags)) {
+      equalMaps(oldState.options.experimentalFlags, experimentalFlags) &&
+      oldState.options.verify == verify &&
+      oldState.options.nnbdMode == nnbdMode) {
     return oldState;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index f6dc730..db05cf8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -356,13 +356,14 @@
           expression, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true));
     }
-    Expression replacement = createVariableGet(node.variable);
-    for (int index = expressionResults.length - 1; index >= 0; index--) {
-      replacement = createLet(
-          createVariable(expressionResults[index].expression, const VoidType()),
-          replacement);
+    List<Statement> body = [];
+    for (int index = 0; index < expressionResults.length; index++) {
+      body.add(_createExpressionStatement(expressionResults[index].expression));
     }
 
+    Expression replacement = _createBlockExpression(node.variable.fileOffset,
+        _createBlock(body), createVariableGet(node.variable));
+
     if (node.isNullAware) {
       replacement =
           nullAwareGuard.createExpression(result.inferredType, replacement);
@@ -373,6 +374,24 @@
     return new ExpressionInferenceResult(result.inferredType, replacement);
   }
 
+  Block _createBlock(List<Statement> statements) {
+    return new Block(statements);
+  }
+
+  BlockExpression _createBlockExpression(
+      int fileOffset, Block body, Expression value) {
+    assert(fileOffset != null);
+    assert(fileOffset != TreeNode.noOffset);
+    return new BlockExpression(body, value)..fileOffset = fileOffset;
+  }
+
+  ExpressionStatement _createExpressionStatement(Expression expression) {
+    assert(expression != null);
+    assert(expression.fileOffset != TreeNode.noOffset);
+    return new ExpressionStatement(expression)
+      ..fileOffset = expression.fileOffset;
+  }
+
   @override
   ExpressionInferenceResult visitConditionalExpression(
       ConditionalExpression node, DartType typeContext) {
@@ -2593,7 +2612,8 @@
           inferredType)
         ..fileOffset = node.fileOffset;
       replacement =
-          new Let(node.variable, conditional..fileOffset = node.fileOffset);
+          new Let(node.variable, conditional..fileOffset = node.fileOffset)
+            ..fileOffset = node.fileOffset;
     } else {
       // Encode `o.a ??= b` as:
       //
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index bc08e07..f2fab9d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -32,8 +32,8 @@
     // Generate:
     //
     //    if (!_#isSet#field) {
-    //      _#isSet#field = true
     //      _#field = <init>;
+    //      _#isSet#field = true
     //    }
     //    return _#field;
     return new Block(<Statement>[
@@ -42,11 +42,11 @@
             ..fileOffset = fileOffset,
           new Block(<Statement>[
             new ExpressionStatement(
-                createIsSetWrite(new BoolLiteral(true)..fileOffset = fileOffset)
-                  ..fileOffset = fileOffset)
+                createVariableWrite(initializer)..fileOffset = fileOffset)
               ..fileOffset = fileOffset,
             new ExpressionStatement(
-                createVariableWrite(initializer)..fileOffset = fileOffset)
+                createIsSetWrite(new BoolLiteral(true)..fileOffset = fileOffset)
+                  ..fileOffset = fileOffset)
               ..fileOffset = fileOffset,
           ]),
           null)
@@ -128,8 +128,8 @@
     //    if (!_#isSet#field) {
     //      var temp = <init>;
     //      if (_#isSet#field) throw '...'
-    //      _#isSet#field = true
     //      _#field = temp;
+    //      _#isSet#field = true
     //    }
     //    return _#field;
     return new Block(<Statement>[
@@ -144,12 +144,12 @@
                 null)
               ..fileOffset = fileOffset,
             new ExpressionStatement(
-                createIsSetWrite(new BoolLiteral(true)..fileOffset = fileOffset)
+                createVariableWrite(
+                    new VariableGet(temp)..fileOffset = fileOffset)
                   ..fileOffset = fileOffset)
               ..fileOffset = fileOffset,
             new ExpressionStatement(
-                createVariableWrite(
-                    new VariableGet(temp)..fileOffset = fileOffset)
+                createIsSetWrite(new BoolLiteral(true)..fileOffset = fileOffset)
                   ..fileOffset = fileOffset)
               ..fileOffset = fileOffset,
           ]),
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 225546e..fc54be6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -4,33 +4,11 @@
 
 library fasta.verifier;
 
+import 'dart:core' hide MapEntry;
+
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
-import 'package:kernel/ast.dart'
-    show
-        AsExpression,
-        BottomType,
-        Class,
-        Component,
-        DartType,
-        DynamicType,
-        ExpressionStatement,
-        Field,
-        FunctionType,
-        InterfaceType,
-        InvalidType,
-        Library,
-        Member,
-        NeverType,
-        Nullability,
-        Procedure,
-        StaticInvocation,
-        SuperMethodInvocation,
-        SuperPropertyGet,
-        SuperPropertySet,
-        TreeNode,
-        TypeParameter,
-        VoidType;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
@@ -39,7 +17,11 @@
 import '../compiler_context.dart' show CompilerContext;
 
 import '../fasta_codes.dart'
-    show LocatedMessage, noLength, templateInternalProblemVerificationError;
+    show
+        LocatedMessage,
+        messageVerificationErrorOriginContext,
+        noLength,
+        templateInternalProblemVerificationError;
 
 import '../type_inference/type_schema.dart' show UnknownType;
 
@@ -56,14 +38,91 @@
 
 class FastaVerifyingVisitor extends VerifyingVisitor {
   final List<LocatedMessage> errors = <LocatedMessage>[];
-  Library currentLibrary = null;
 
   Uri fileUri;
+  final List<TreeNode> treeNodeStack = <TreeNode>[];
   final bool skipPlatform;
 
   FastaVerifyingVisitor(bool isOutline, bool afterConst, this.skipPlatform)
       : super(isOutline: isOutline, afterConst: afterConst);
 
+  /// Invoked by all visit methods if the visited node is a [TreeNode].
+  void enterTreeNode(TreeNode node) {
+    treeNodeStack.add(node);
+  }
+
+  /// Invoked by all visit methods if the visited node is a [TreeNode].
+  void exitTreeNode(TreeNode node) {
+    if (treeNodeStack.isEmpty) {
+      throw new StateError("Attempting to exit tree node '${node}' "
+          "when the tree node stack is empty.");
+    }
+    if (!identical(treeNodeStack.last, node)) {
+      throw new StateError("Attempting to exit tree node '${node}' "
+          "when another node '${treeNodeStack.last}' is active.");
+    }
+    treeNodeStack.removeLast();
+  }
+
+  TreeNode getLastSeenTreeNode({bool withLocation = false}) {
+    assert(treeNodeStack.isNotEmpty);
+    for (int i = treeNodeStack.length - 1; i >= 0; --i) {
+      TreeNode node = treeNodeStack[i];
+      if (withLocation && !_hasLocation(node)) continue;
+      return node;
+    }
+    return null;
+  }
+
+  TreeNode getSameLibraryLastSeenTreeNode({bool withLocation = false}) {
+    if (treeNodeStack.isEmpty) return null;
+    if (currentLibrary == null || currentLibrary.fileUri == null) return null;
+
+    for (int i = treeNodeStack.length - 1; i >= 0; --i) {
+      TreeNode node = treeNodeStack[i];
+      if (withLocation && !_hasLocation(node)) continue;
+      if (node.location?.file != null &&
+          node.location.file == currentLibrary.fileUri) {
+        return node;
+      }
+    }
+    return null;
+  }
+
+  static bool _hasLocation(TreeNode node) {
+    return node.location != null &&
+        node.location.file != null &&
+        node.fileOffset != null &&
+        node.fileOffset != -1;
+  }
+
+  static bool _isInSameLibrary(Library library, TreeNode node) {
+    if (library == null) return false;
+    if (library.fileUri == null) return false;
+    if (node.location == null) return false;
+    if (node.location.file == null) return false;
+
+    return library.fileUri == node.location.file;
+  }
+
+  TreeNode get localContext {
+    TreeNode result = getSameLibraryLastSeenTreeNode(withLocation: true);
+    if (result == null &&
+        currentClassOrMember != null &&
+        _isInSameLibrary(currentLibrary, currentClassOrMember)) {
+      result = currentClassOrMember;
+    }
+    return result;
+  }
+
+  TreeNode get remoteContext {
+    TreeNode result = getLastSeenTreeNode(withLocation: true);
+    if (result != null && _isInSameLibrary(currentLibrary, result)) {
+      result = null;
+    }
+    return result;
+  }
+
   Uri checkLocation(TreeNode node, String name, Uri fileUri) {
     if (name == null || name.contains("#")) {
       // TODO(ahe): Investigate if these checks can be enabled:
@@ -109,20 +168,29 @@
   }
 
   @override
-  problem(TreeNode node, String details, {TreeNode context}) {
-    node ??= (context ?? this.context);
+  problem(TreeNode node, String details, {TreeNode context, TreeNode origin}) {
+    node ??= (context ?? currentClassOrMember);
     int offset = node?.fileOffset ?? -1;
     Uri file = node?.location?.file ?? fileUri;
     Uri uri = file == null ? null : file;
     LocatedMessage message = templateInternalProblemVerificationError
         .withArguments(details)
         .withLocation(uri, offset, noLength);
-    CompilerContext.current.report(message, Severity.error);
+    List<LocatedMessage> contextMessages;
+    if (origin != null) {
+      contextMessages = [
+        messageVerificationErrorOriginContext.withLocation(
+            origin.location.file, origin.fileOffset, noLength)
+      ];
+    }
+    CompilerContext.current
+        .report(message, Severity.error, context: contextMessages);
     errors.add(message);
   }
 
   @override
-  visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
+    enterTreeNode(node);
     super.visitAsExpression(node);
     if (node.fileOffset == -1) {
       TreeNode parent = node.parent;
@@ -132,45 +200,57 @@
       }
       problem(parent, "No offset for $node", context: node);
     }
+    exitTreeNode(node);
   }
 
   @override
-  visitExpressionStatement(ExpressionStatement node) {
+  void visitExpressionStatement(ExpressionStatement node) {
     // Bypass verification of the [StaticGet] in [RedirectingFactoryBody] as
     // this is a static get without a getter.
     if (node is! RedirectingFactoryBody) {
+      enterTreeNode(node);
       super.visitExpressionStatement(node);
+      exitTreeNode(node);
     }
   }
 
   @override
-  visitLibrary(Library node) {
+  void visitLibrary(Library node) {
     // Issue(http://dartbug.com/32530)
     if (skipPlatform && node.importUri.scheme == 'dart') {
       return;
     }
+
+    enterTreeNode(node);
     fileUri = checkLocation(node, node.name, node.fileUri);
     currentLibrary = node;
     super.visitLibrary(node);
     currentLibrary = null;
+    exitTreeNode(node);
   }
 
   @override
-  visitClass(Class node) {
+  void visitClass(Class node) {
+    enterTreeNode(node);
     fileUri = checkLocation(node, node.name, node.fileUri);
     super.visitClass(node);
+    exitTreeNode(node);
   }
 
   @override
-  visitField(Field node) {
+  void visitField(Field node) {
+    enterTreeNode(node);
     fileUri = checkLocation(node, node.name.name, node.fileUri);
     super.visitField(node);
+    exitTreeNode(node);
   }
 
   @override
-  visitProcedure(Procedure node) {
+  void visitProcedure(Procedure node) {
+    enterTreeNode(node);
     fileUri = checkLocation(node, node.name.name, node.fileUri);
     super.visitProcedure(node);
+    exitTreeNode(node);
   }
 
   bool isNullType(DartType node) {
@@ -183,40 +263,99 @@
     return false;
   }
 
-  @override
-  defaultDartType(DartType node) {
-    if (node is UnknownType) {
-      // Note: we can't pass [node] to [problem] because it's not a [TreeNode].
-      problem(null, "Unexpected appearance of the unknown type.");
-    }
-    bool neverLegacy = isNullType(node) ||
-        node is DynamicType ||
-        node is InvalidType ||
+  bool isFutureOrClass(Class c) {
+    return c.name == "FutureOr" &&
+        c.enclosingLibrary.importUri.scheme == "dart" &&
+        c.enclosingLibrary.importUri.path == "async";
+  }
+
+  bool isObjectClass(Class c) {
+    return c.name == "Object" &&
+        c.enclosingLibrary.importUri.scheme == "dart" &&
+        c.enclosingLibrary.importUri.path == "core";
+  }
+
+  bool isTopType(DartType node) {
+    return node is DynamicType ||
         node is VoidType ||
-        node is NeverType ||
-        node is BottomType;
-    bool expectedLegacy =
-        !currentLibrary.isNonNullableByDefault && !neverLegacy;
-    if (expectedLegacy && node.nullability != Nullability.legacy) {
-      problem(
-          null, "Found a non-legacy type '${node}' in an opted-out library.");
+        node is InterfaceType &&
+            isObjectClass(node.classNode) &&
+            (node.nullability == Nullability.nullable ||
+                node.nullability == Nullability.legacy) ||
+        node is InterfaceType &&
+            isFutureOrClass(node.classNode) &&
+            isTopType(node.typeArguments.single);
+  }
+
+  bool isFutureOrNull(DartType node) {
+    return isNullType(node) ||
+        node is InterfaceType &&
+            isFutureOrClass(node.classNode) &&
+            isFutureOrNull(node.typeArguments.single);
+  }
+
+  @override
+  void defaultDartType(DartType node) {
+    final TreeNode localContext = this.localContext;
+    final TreeNode remoteContext = this.remoteContext;
+
+    if (node is UnknownType) {
+      problem(localContext, "Unexpected appearance of the unknown type.",
+          origin: remoteContext);
     }
-    Nullability nodeNullability =
-        node is InvalidType ? Nullability.undetermined : node.nullability;
-    if (currentLibrary.isNonNullableByDefault &&
-        nodeNullability == Nullability.legacy) {
-      problem(null, "Found a legacy type '${node}' in an opted-in library.");
+
+    bool isTypeCast = localContext != null &&
+        localContext is AsExpression &&
+        localContext.isTypeError;
+    // Don't check cases like foo(x as{TypeError} T).  In cases where foo comes
+    // from a library with a different opt-in status than the current library,
+    // the check may not be necessary.  For now, just skip all type-error casts.
+    // TODO(dmitryas): Implement a more precise analysis.
+    bool isFromAnotherLibrary = remoteContext != null || isTypeCast;
+
+    // Checking for non-legacy types in opt-out libraries.
+    {
+      bool neverLegacy = isNullType(node) ||
+          isFutureOrNull(node) ||
+          isTopType(node) ||
+          node is InvalidType ||
+          node is NeverType ||
+          node is BottomType;
+      // TODO(dmitryas): Consider checking types coming from other libraries.
+      bool expectedLegacy = !isFromAnotherLibrary &&
+          !currentLibrary.isNonNullableByDefault &&
+          !neverLegacy;
+      if (expectedLegacy && node.nullability != Nullability.legacy) {
+        problem(localContext,
+            "Found a non-legacy type '${node}' in an opted-out library.",
+            origin: remoteContext);
+      }
     }
+
+    // Checking for legacy types in opt-in libraries.
+    {
+      Nullability nodeNullability =
+          node is InvalidType ? Nullability.undetermined : node.nullability;
+      // TODO(dmitryas): Consider checking types coming from other libraries.
+      if (!isFromAnotherLibrary &&
+          currentLibrary.isNonNullableByDefault &&
+          nodeNullability == Nullability.legacy) {
+        problem(localContext,
+            "Found a legacy type '${node}' in an opted-in library.",
+            origin: remoteContext);
+      }
+    }
+
     super.defaultDartType(node);
   }
 
   @override
-  visitFunctionType(FunctionType node) {
+  void visitFunctionType(FunctionType node) {
     if (node.typeParameters.isNotEmpty) {
       for (TypeParameter typeParameter in node.typeParameters) {
         if (typeParameter.parent != null) {
           problem(
-              null,
+              localContext,
               "Type parameters of function types shouldn't have parents: "
               "$node.");
         }
@@ -226,37 +365,52 @@
   }
 
   @override
-  visitInterfaceType(InterfaceType node) {
+  void visitInterfaceType(InterfaceType node) {
     if (isNullType(node) && node.nullability != Nullability.nullable) {
-      problem(null, "Found a not nullable Null type: ${node}");
+      problem(localContext, "Found a not nullable Null type: ${node}");
     }
     super.visitInterfaceType(node);
   }
 
   @override
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    enterTreeNode(node);
     checkSuperInvocation(node);
     super.visitSuperMethodInvocation(node);
+    exitTreeNode(node);
   }
 
   @override
-  visitSuperPropertyGet(SuperPropertyGet node) {
+  void visitSuperPropertyGet(SuperPropertyGet node) {
+    enterTreeNode(node);
     checkSuperInvocation(node);
     super.visitSuperPropertyGet(node);
+    exitTreeNode(node);
   }
 
   @override
-  visitSuperPropertySet(SuperPropertySet node) {
+  void visitSuperPropertySet(SuperPropertySet node) {
+    enterTreeNode(node);
     checkSuperInvocation(node);
     super.visitSuperPropertySet(node);
+    exitTreeNode(node);
   }
 
   @override
-  visitStaticInvocation(StaticInvocation node) {
+  void visitStaticInvocation(StaticInvocation node) {
+    enterTreeNode(node);
     super.visitStaticInvocation(node);
     RedirectingFactoryBody body = getRedirectingFactoryBody(node.target);
     if (body != null) {
       problem(node, "Attempt to invoke redirecting factory.");
     }
+    exitTreeNode(node);
+  }
+
+  @override
+  void defaultTreeNode(TreeNode node) {
+    enterTreeNode(node);
+    super.defaultTreeNode(node);
+    exitTreeNode(node);
   }
 }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 99782aa..e2ce926 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1736,6 +1736,10 @@
     #string
   severity: INTERNAL_PROBLEM
 
+VerificationErrorOriginContext:
+  template: "The node most likely is taken from here by a transformer."
+  severity: CONTEXT
+
 InternalProblemDebugAbort:
   template: "Compilation aborted due to fatal '#name' at:\n#string"
   severity: INTERNAL_PROBLEM
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index 048c81d..5920035 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
@@ -15,9 +15,6 @@
         stdin,
         stdout;
 
-import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
-import 'package:_fe_analyzer_shared/src/parser/forwarding_listener.dart'
-    show NullListener;
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
     show CommentToken, Token;
@@ -88,7 +85,7 @@
 
   for (Library library in component.libraries) {
     if (library.importUri.scheme == "dart") continue;
-    // This isn't perfect because of parts, but (for now it'll do).
+    // This isn't perfect because of parts, but (for now) it'll do.
     for (Uri uri in libUris) {
       if (library.fileUri.toString().startsWith(uri.toString())) {
         library.accept(new InvocationVisitor());
@@ -241,7 +238,7 @@
         }
       }
       if (wantComment) {
-        check(invocation, i, positionalParameters[i],
+        check(arguments.positional[i], i, positionalParameters[i], node,
             "/* ${positionalParameters[i].name} = */");
       }
     }
@@ -250,86 +247,26 @@
 
 Map<Uri, Token> cache = {};
 
-void check(InvocationExpression invocation, int parameterNumber,
-    VariableDeclaration parameter, String expectedComment) {
-  if (invocation.name.name == "==") return;
-  if (invocation.name.name == "[]=") return;
-  if (invocation.name.name == "[]") return;
-  if (invocation.name.name == "<") return;
-  if (invocation.name.name == "<=") return;
-  if (invocation.name.name == ">") return;
-  if (invocation.name.name == ">=") return;
-  if (invocation.name.name == "+") return;
-  if (invocation.name.name == "-") return;
-  if (invocation.name.name == "*") return;
-  if (invocation.name.name == "/") return;
-  if (invocation.name.name == "<<") return;
-  if (invocation.name.name == "<<<") return;
-  if (invocation.name.name == ">>") return;
-  if (invocation.name.name == "|=") return;
-  if (invocation.name.name == "|") return;
-  if (invocation.name.name == "&") return;
-  if (invocation.name.name == "~/") return;
-  Location location = invocation.location;
+void check(
+    Expression argumentExpression,
+    int parameterNumber,
+    VariableDeclaration parameter,
+    NamedNode targetNode,
+    String expectedComment) {
+  if (targetNode is Procedure && targetNode.kind == ProcedureKind.Operator) {
+    // Operator calls doesn't look like 'regular' method calls.
+    return;
+  }
+  if (argumentExpression.fileOffset == -1) return;
+  Location location = argumentExpression.location;
   Token token = cache[location.file];
-  while (token.offset != invocation.fileOffset) {
+  while (token.offset != argumentExpression.fileOffset) {
     token = token.next;
     if (token.isEof) {
-      print("Couldn't find token for $invocation...");
-      return;
+      throw "Couldn't find token for $argumentExpression "
+          "(${argumentExpression.fileOffset}).";
     }
   }
-  if (token.lexeme != invocation.name.name) {
-    bool ignore = false;
-    // Check if the next tokens are ".<what we're looking for>".
-    if (token.next.lexeme == "." &&
-        token.next.next.lexeme == invocation.name.name) {
-      ignore = true;
-      token = token.next.next;
-    } else if (invocation is StaticInvocation) {
-      Procedure p = invocation.targetReference.node;
-      ignore = p.isFactory;
-    }
-    if (invocation is ConstructorInvocation || ignore) {
-      // ignore that... E.g. new Foo() will have name ''.
-    } else {
-      Location calculatedLocation =
-          component.getLocation(location.file, token.offset);
-      throw "Expected to find ${invocation.name.name} but "
-          "found ${token.lexeme} at $calculatedLocation "
-          "(would have checked for comment $expectedComment)";
-    }
-  }
-  token = token.next;
-  while (token.lexeme == ".") {
-    token = token.next.next;
-  }
-  if (token.lexeme == "<") {
-    if (token.endGroup != null) {
-      token = token.endGroup.next;
-    }
-  }
-  while (token.lexeme == ".") {
-    token = token.next.next;
-  }
-  if (token.lexeme != "(") {
-    Location calculatedLocation =
-        component.getLocation(location.file, token.offset);
-    throw "Expected to find ( but found ${token.lexeme} "
-        "at $calculatedLocation"
-        " (would have checked for comment $expectedComment)";
-  }
-  if (parameterNumber > 0) {
-    Parser parser = new Parser(new NullListener());
-    for (int i = 0; i < parameterNumber; i++) {
-      token = parser.parseExpression(token);
-      if (token.next.lexeme != ",") {
-        throw "Expected to find , but found ${token.next.lexeme}";
-      }
-      token = token.next;
-    }
-  }
-  token = token.next;
   bool foundComment = false;
   CommentToken commentToken = token.precedingComments;
   while (commentToken != null) {
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
index 6e5d2e6..3ae2d7b 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
@@ -24,14 +24,16 @@
   operator - = self::Extension1|-;
 }
 static method Extension1|[](final self::C* #this, core::int* index) → self::C*
-  return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+  return let final self::C* #t1 = #this in block {
+    let final self::C* #t2 = #t1 in #t2.{self::C::value} = #t2.{self::C::value}.{core::num::+}(index.{core::num::+}(1));
+  } =>#t1;
 static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
-  return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+  return let final self::C* #t3 = #this in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
 static method Extension1|-(final self::C* #this, core::int* val) → self::C*
   return #this;
 static method main() → dynamic {
   self::C* c = new self::C::•();
-  let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
-  let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+  let final self::C* #t4 = c in let final core::int* #t5 = 42 in let final self::C* #t6 = self::Extension1|-(self::Extension1|[](#t4, #t5), 1) in let final void #t7 = self::Extension1|[]=(#t4, #t5, #t6) in #t6;
+  let final self::C* #t8 = c in let final core::int* #t9 = 42 in self::Extension1|[]=(#t8, #t9, self::Extension1|-(self::Extension1|[](#t8, #t9), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
index 6e5d2e6..3ae2d7b 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -24,14 +24,16 @@
   operator - = self::Extension1|-;
 }
 static method Extension1|[](final self::C* #this, core::int* index) → self::C*
-  return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+  return let final self::C* #t1 = #this in block {
+    let final self::C* #t2 = #t1 in #t2.{self::C::value} = #t2.{self::C::value}.{core::num::+}(index.{core::num::+}(1));
+  } =>#t1;
 static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
-  return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+  return let final self::C* #t3 = #this in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
 static method Extension1|-(final self::C* #this, core::int* val) → self::C*
   return #this;
 static method main() → dynamic {
   self::C* c = new self::C::•();
-  let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
-  let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+  let final self::C* #t4 = c in let final core::int* #t5 = 42 in let final self::C* #t6 = self::Extension1|-(self::Extension1|[](#t4, #t5), 1) in let final void #t7 = self::Extension1|[]=(#t4, #t5, #t6) in #t6;
+  let final self::C* #t8 = c in let final core::int* #t9 = 42 in self::Extension1|[]=(#t8, #t9, self::Extension1|-(self::Extension1|[](#t8, #t9), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
diff --git a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.expect b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.expect
index ee50ed9..33c1f7c 100644
--- a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.expect
@@ -10,7 +10,9 @@
     : super core::Object::•()
     ;
   method m() → asy::Future<core::List<core::int*>*>* async 
-    return let final core::List<core::int*>* #t1 = <core::int*>[] in let final void #t2 = #t1.{core::List::add}(await this.{self::C::_m}()) in #t1;
+    return let final core::List<core::int*>* #t1 = <core::int*>[] in block {
+      #t1.{core::List::add}(await this.{self::C::_m}());
+    } =>#t1;
   method _m() → asy::Future<core::int*>* async 
     return 42;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
index da55c50..0bb1652 100644
--- a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
@@ -25,7 +25,8 @@
         {
           final core::List<core::int*>* #t1 = <core::int*>[];
           [yield] let dynamic #t2 = asy::_awaitHelper(this.{self::C::_m}(), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = let final void #t3 = #t1.{core::List::add}(_in::unsafeCast<core::int*>(:result)) in #t1;
+          #t1.{core::List::add}(_in::unsafeCast<core::int*>(:result));
+          :return_value = block {} =>#t1;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -91,7 +92,7 @@
     try {
       #L3:
       {
-        [yield] let dynamic #t4 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t3 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
         self::expect(42, _in::unsafeCast<core::List<core::int*>*>(:result).{core::Iterable::first});
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general/bug33206.dart.strong.expect b/pkg/front_end/testcases/general/bug33206.dart.strong.expect
index 8653700..2083c84 100644
--- a/pkg/front_end/testcases/general/bug33206.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug33206.dart.strong.expect
@@ -48,7 +48,10 @@
   return 3;
 }
 static method foo() → asy::Future<self::X*>* async {
-  return new self::X::•(let final self::Y* #t1 = new self::Y::•() in let final void #t2 = #t1.{self::Y::f}(await self::f1()) in let final void #t3 = #t1.{self::Y::f}(self::f2()) in #t1, await self::f3());
+  return new self::X::•(let final self::Y* #t1 = new self::Y::•() in block {
+    #t1.{self::Y::f}(await self::f1());
+    #t1.{self::Y::f}(self::f2());
+  } =>#t1, await self::f3());
 }
 static method main() → asy::Future<void>* async {
   core::print(await self::foo());
diff --git a/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
index dfedd80..d58c87d 100644
--- a/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
@@ -105,16 +105,19 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L3:
       {
         final self::Y* #t1 = new self::Y::•();
         [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final void #t3 = #t1.{self::Y::f}(_in::unsafeCast<core::List<core::Object*>*>(:result));
-        final void #t4 = #t1.{self::Y::f}(self::f2());
-        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, _in::unsafeCast<core::Object*>(:result));
+        #t1.{self::Y::f}(_in::unsafeCast<core::List<core::Object*>*>(:result));
+        :async_temporary_0 = block {
+          #t1.{self::Y::f}(self::f2());
+        } =>#t1;
+        [yield] let dynamic #t3 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        :return_value = new self::X::•(_in::unsafeCast<self::Y*>(:async_temporary_0), _in::unsafeCast<core::Object*>(:result));
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -142,7 +145,7 @@
     try {
       #L4:
       {
-        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t4 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<self::X*>(:result));
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.expect b/pkg/front_end/testcases/general/cascade.dart.strong.expect
index 70120f9..b2f0be3 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.expect
@@ -26,24 +26,40 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in block {
+    #t1.{core::List::add}(2);
+    #t1.{core::List::add}(3);
+    #t1.{core::List::addAll}(<core::int*>[4, 5]);
+  } =>#t1;
   core::print(list);
-  let final core::List<core::int*>* #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final void #t7 = #t5.{core::List::length} in let final void #t8 = #t5.{core::List::length} = 0 in #t5;
+  let final core::List<core::int*>* #t2 = list in block {
+    #t2.{core::List::add}(2);
+    #t2.{core::List::length};
+    #t2.{core::List::length} = 0;
+  } =>#t2;
   core::print(list);
-  let final core::List<core::int*>* #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final void #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  let final core::List<core::int*>* #t3 = list in block {
+    #t3.{core::List::add}(2);
+    #t3.{core::List::[]}(0);
+    #t3.{core::List::[]=}(0, 87);
+  } =>#t3;
   core::print(list);
-  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  list = let final core::List<core::int*>* #t4 = <core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
     [1]
-    ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+    ^" in <core::int*>[1] as{TypeError} core::int*] in block {
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+            ^^^^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
-           ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+           ^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..[0].last.toString();
-          ^^^^".{core::Object::toString}() in #t13;
+          ^^^^".{core::Object::toString}();
+  } =>#t4;
   core::print(list);
 }
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
index 70120f9..b2f0be3 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
@@ -26,24 +26,40 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in block {
+    #t1.{core::List::add}(2);
+    #t1.{core::List::add}(3);
+    #t1.{core::List::addAll}(<core::int*>[4, 5]);
+  } =>#t1;
   core::print(list);
-  let final core::List<core::int*>* #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final void #t7 = #t5.{core::List::length} in let final void #t8 = #t5.{core::List::length} = 0 in #t5;
+  let final core::List<core::int*>* #t2 = list in block {
+    #t2.{core::List::add}(2);
+    #t2.{core::List::length};
+    #t2.{core::List::length} = 0;
+  } =>#t2;
   core::print(list);
-  let final core::List<core::int*>* #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final void #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  let final core::List<core::int*>* #t3 = list in block {
+    #t3.{core::List::add}(2);
+    #t3.{core::List::[]}(0);
+    #t3.{core::List::[]=}(0, 87);
+  } =>#t3;
   core::print(list);
-  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  list = let final core::List<core::int*>* #t4 = <core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
     [1]
-    ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+    ^" in <core::int*>[1] as{TypeError} core::int*] in block {
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+            ^^^^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
-           ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+           ^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..[0].last.toString();
-          ^^^^".{core::Object::toString}() in #t13;
+          ^^^^".{core::Object::toString}();
+  } =>#t4;
   core::print(list);
 }
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
index 3a13247..bc2f8d2 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -74,7 +74,9 @@
   });
   core::print(core::int*.{core::Object::toString}());
   core::print(core::int*);
-  core::print(let final core::Type* #t5 = core::int* in let final void #t6 = #t5.{core::Object::toString}() in #t5);
+  core::print(let final core::Type* #t5 = core::int* in block {
+    #t5.{core::Object::toString}();
+  } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
     print(int?.toString());
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 2f75ab9..ff7bf3c 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -74,7 +74,9 @@
   });
   core::print(core::int*.{core::Object::toString}());
   core::print(core::int*);
-  core::print(let final core::Type* #t5 = core::int* in let final void #t6 = #t5.{core::Object::toString}() in #t5);
+  core::print(let final core::Type* #t5 = core::int* in block {
+    #t5.{core::Object::toString}();
+  } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
     print(int?.toString());
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
index 4205663..e87b8a1 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
@@ -14,7 +14,11 @@
   field core::double* y = null;
   field ffi::Pointer<self::Coordinate*>* next = null;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
-    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in let final void #t2 = #t1.{self::Coordinate::x} = x in let final void #t3 = #t1.{self::Coordinate::y} = y in let final void #t4 = #t1.{self::Coordinate::next} = next in #t1;
+    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
   }
   abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
index 241578e..4998dd8 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
@@ -16,7 +16,11 @@
     : super ffi::Struct::_fromPointer(#pointer)
     ;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
-    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in let final void #t2 = #t1.{self::Coordinate::x} = x in let final void #t3 = #t1.{self::Coordinate::y} = y in let final void #t4 = #t1.{self::Coordinate::next} = next in #t1;
+    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
   }
   abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.expect b/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.expect
index e93b141..a7e9a38 100644
--- a/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.expect
@@ -21,5 +21,7 @@
 static method main() → dynamic {
   self::Class* a;
   self::Class* b = new self::Class::•();
-  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in let final void #t3 = #t1.{self::Class::method}() in #t1;
+  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in block {
+    #t1.{self::Class::method}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.transformed.expect
index e93b141..a7e9a38 100644
--- a/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/if_null_in_cascade.dart.strong.transformed.expect
@@ -21,5 +21,7 @@
 static method main() → dynamic {
   self::Class* a;
   self::Class* b = new self::Class::•();
-  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in let final void #t3 = #t1.{self::Class::method}() in #t1;
+  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in block {
+    #t1.{self::Class::method}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.strong.expect b/pkg/front_end/testcases/general/native_as_name.dart.strong.expect
index 67f9f49..0712c51 100644
--- a/pkg/front_end/testcases/general/native_as_name.dart.strong.expect
+++ b/pkg/front_end/testcases/general/native_as_name.dart.strong.expect
@@ -81,7 +81,9 @@
   core::print(new self::W::•().{self::W::native});
   core::print(new self::X::•().{self::X::native}());
   core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z* #t1 = new self::Z::•() in let final void #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+  core::print((let final self::Z* #t1 = new self::Z::•() in block {
+    #t1.{self::Z::native} = "setter";
+  } =>#t1).{self::Z::f});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect b/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect
index 67f9f49..0712c51 100644
--- a/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect
@@ -81,7 +81,9 @@
   core::print(new self::W::•().{self::W::native});
   core::print(new self::X::•().{self::X::native}());
   core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z* #t1 = new self::Z::•() in let final void #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+  core::print((let final self::Z* #t1 = new self::Z::•() in block {
+    #t1.{self::Z::native} = "setter";
+  } =>#t1).{self::Z::f});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.expect
index ee50ed9..33c1f7c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.expect
@@ -10,7 +10,9 @@
     : super core::Object::•()
     ;
   method m() → asy::Future<core::List<core::int*>*>* async 
-    return let final core::List<core::int*>* #t1 = <core::int*>[] in let final void #t2 = #t1.{core::List::add}(await this.{self::C::_m}()) in #t1;
+    return let final core::List<core::int*>* #t1 = <core::int*>[] in block {
+      #t1.{core::List::add}(await this.{self::C::_m}());
+    } =>#t1;
   method _m() → asy::Future<core::int*>* async 
     return 42;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
index da55c50..0bb1652 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
@@ -25,7 +25,8 @@
         {
           final core::List<core::int*>* #t1 = <core::int*>[];
           [yield] let dynamic #t2 = asy::_awaitHelper(this.{self::C::_m}(), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = let final void #t3 = #t1.{core::List::add}(_in::unsafeCast<core::int*>(:result)) in #t1;
+          #t1.{core::List::add}(_in::unsafeCast<core::int*>(:result));
+          :return_value = block {} =>#t1;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -91,7 +92,7 @@
     try {
       #L3:
       {
-        [yield] let dynamic #t4 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t3 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
         self::expect(42, _in::unsafeCast<core::List<core::int*>*>(:result).{core::Iterable::first});
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.expect
index 8653700..2083c84 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.expect
@@ -48,7 +48,10 @@
   return 3;
 }
 static method foo() → asy::Future<self::X*>* async {
-  return new self::X::•(let final self::Y* #t1 = new self::Y::•() in let final void #t2 = #t1.{self::Y::f}(await self::f1()) in let final void #t3 = #t1.{self::Y::f}(self::f2()) in #t1, await self::f3());
+  return new self::X::•(let final self::Y* #t1 = new self::Y::•() in block {
+    #t1.{self::Y::f}(await self::f1());
+    #t1.{self::Y::f}(self::f2());
+  } =>#t1, await self::f3());
 }
 static method main() → asy::Future<void>* async {
   core::print(await self::foo());
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
index dfedd80..d58c87d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
@@ -105,16 +105,19 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L3:
       {
         final self::Y* #t1 = new self::Y::•();
         [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final void #t3 = #t1.{self::Y::f}(_in::unsafeCast<core::List<core::Object*>*>(:result));
-        final void #t4 = #t1.{self::Y::f}(self::f2());
-        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, _in::unsafeCast<core::Object*>(:result));
+        #t1.{self::Y::f}(_in::unsafeCast<core::List<core::Object*>*>(:result));
+        :async_temporary_0 = block {
+          #t1.{self::Y::f}(self::f2());
+        } =>#t1;
+        [yield] let dynamic #t3 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        :return_value = new self::X::•(_in::unsafeCast<self::Y*>(:async_temporary_0), _in::unsafeCast<core::Object*>(:result));
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -142,7 +145,7 @@
     try {
       #L4:
       {
-        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t4 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<self::X*>(:result));
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
index d0a33ce..8361133 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
@@ -26,24 +26,40 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in block {
+    #t1.{core::List::add}(2);
+    #t1.{core::List::add}(3);
+    #t1.{core::List::addAll}(<core::int*>[4, 5]);
+  } =>#t1;
   core::print(list);
-  let final core::List<core::int*>* #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final void #t7 = #t5.{core::List::length} in let final void #t8 = #t5.{core::List::length} = 0 in #t5;
+  let final core::List<core::int*>* #t2 = list in block {
+    #t2.{core::List::add}(2);
+    #t2.{core::List::length};
+    #t2.{core::List::length} = 0;
+  } =>#t2;
   core::print(list);
-  let final core::List<core::int*>* #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final void #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  let final core::List<core::int*>* #t3 = list in block {
+    #t3.{core::List::add}(2);
+    #t3.{core::List::[]}(0);
+    #t3.{core::List::[]=}(0, 87);
+  } =>#t3;
   core::print(list);
-  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  list = let final core::List<core::int*>* #t4 = <core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
     [1]
-    ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
+    ^" in <core::int*>[1] as{TypeError} core::int*] in block {
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+            ^^^^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
-           ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
+           ^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..[0].last.toString();
-          ^^^^".{core::Object::toString}() in #t13;
+          ^^^^".{core::Object::toString}();
+  } =>#t4;
   core::print(list);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
index d0a33ce..8361133 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
@@ -26,24 +26,40 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in block {
+    #t1.{core::List::add}(2);
+    #t1.{core::List::add}(3);
+    #t1.{core::List::addAll}(<core::int*>[4, 5]);
+  } =>#t1;
   core::print(list);
-  let final core::List<core::int*>* #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final void #t7 = #t5.{core::List::length} in let final void #t8 = #t5.{core::List::length} = 0 in #t5;
+  let final core::List<core::int*>* #t2 = list in block {
+    #t2.{core::List::add}(2);
+    #t2.{core::List::length};
+    #t2.{core::List::length} = 0;
+  } =>#t2;
   core::print(list);
-  let final core::List<core::int*>* #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final void #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  let final core::List<core::int*>* #t3 = list in block {
+    #t3.{core::List::add}(2);
+    #t3.{core::List::[]}(0);
+    #t3.{core::List::[]=}(0, 87);
+  } =>#t3;
   core::print(list);
-  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  list = let final core::List<core::int*>* #t4 = <core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:28:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
     [1]
-    ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
+    ^" in <core::int*>[1] as{TypeError} core::int*] in block {
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+            ^^^^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
-           ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
+           ^".{core::Object::toString}();
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..[0].last.toString();
-          ^^^^".{core::Object::toString}() in #t13;
+          ^^^^".{core::Object::toString}();
+  } =>#t4;
   core::print(list);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
index 640571c..5c1a339 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
@@ -74,7 +74,9 @@
   });
   core::print(core::int*.{core::Object::toString}());
   core::print(core::int*);
-  core::print(let final core::Type* #t5 = core::int* in let final void #t6 = #t5.{core::Object::toString}() in #t5);
+  core::print(let final core::Type* #t5 = core::int* in block {
+    #t5.{core::Object::toString}();
+  } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
     print(int?.toString());
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index b65b78c..7e9b65e 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -74,7 +74,9 @@
   });
   core::print(core::int*.{core::Object::toString}());
   core::print(core::int*);
-  core::print(let final core::Type* #t5 = core::int* in let final void #t6 = #t5.{core::Object::toString}() in #t5);
+  core::print(let final core::Type* #t5 = core::int* in block {
+    #t5.{core::Object::toString}();
+  } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
     print(int?.toString());
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
index 4205663..e87b8a1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
@@ -14,7 +14,11 @@
   field core::double* y = null;
   field ffi::Pointer<self::Coordinate*>* next = null;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
-    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in let final void #t2 = #t1.{self::Coordinate::x} = x in let final void #t3 = #t1.{self::Coordinate::y} = y in let final void #t4 = #t1.{self::Coordinate::next} = next in #t1;
+    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
   }
   abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
index 241578e..4998dd8 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
@@ -16,7 +16,11 @@
     : super ffi::Struct::_fromPointer(#pointer)
     ;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
-    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in let final void #t2 = #t1.{self::Coordinate::x} = x in let final void #t3 = #t1.{self::Coordinate::y} = y in let final void #t4 = #t1.{self::Coordinate::next} = next in #t1;
+    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
   }
   abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*;
   abstract member-signature get _identityHashCode() → core::int*;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.expect
index e93b141..a7e9a38 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.expect
@@ -21,5 +21,7 @@
 static method main() → dynamic {
   self::Class* a;
   self::Class* b = new self::Class::•();
-  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in let final void #t3 = #t1.{self::Class::method}() in #t1;
+  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in block {
+    #t1.{self::Class::method}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.transformed.expect
index e93b141..a7e9a38 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_cascade.dart.weak.transformed.expect
@@ -21,5 +21,7 @@
 static method main() → dynamic {
   self::Class* a;
   self::Class* b = new self::Class::•();
-  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in let final void #t3 = #t1.{self::Class::method}() in #t1;
+  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2.{self::Class::==}(null) ?{self::Class*} b : #t2 in block {
+    #t1.{self::Class::method}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.expect
index 67f9f49..0712c51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.expect
@@ -81,7 +81,9 @@
   core::print(new self::W::•().{self::W::native});
   core::print(new self::X::•().{self::X::native}());
   core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z* #t1 = new self::Z::•() in let final void #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+  core::print((let final self::Z* #t1 = new self::Z::•() in block {
+    #t1.{self::Z::native} = "setter";
+  } =>#t1).{self::Z::f});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.transformed.expect
index 67f9f49..0712c51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/native_as_name.dart.weak.transformed.expect
@@ -81,7 +81,9 @@
   core::print(new self::W::•().{self::W::native});
   core::print(new self::X::•().{self::X::native}());
   core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z* #t1 = new self::Z::•() in let final void #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+  core::print((let final self::Z* #t1 = new self::Z::•() in block {
+    #t1.{self::Z::native} = "setter";
+  } =>#t1).{self::Z::f});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
index 2e0067b..047b515 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
@@ -117,7 +117,9 @@
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ join([dart.core::String separator = #C4]) → dart.core::String {
       if(this.{dart.core::List::length}.{dart.core::num::==}(0))
         return "";
-      dart.core::StringBuffer buffer = let final dart.core::StringBuffer #t1 = new dart.core::StringBuffer::•() in let final void #t2 = #t1.{dart.core::StringBuffer::writeAll}(this, separator) in #t1;
+      dart.core::StringBuffer buffer = let final dart.core::StringBuffer #t1 = new dart.core::StringBuffer::•() in block {
+        #t1.{dart.core::StringBuffer::writeAll}(this, separator);
+      } =>#t1;
       return buffer.{dart.core::StringBuffer::toString}();
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ where((dart.core::int*) → dart.core::bool test) → dart.core::Iterable<dart.core::int*>
@@ -239,7 +241,7 @@
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ cast<R extends dart.core::Object? = dynamic>() → dart.core::List<main::_WithListMixin&Object&ListMixin::cast::R%>
       return dart.core::List::castFrom<dart.core::int*, main::_WithListMixin&Object&ListMixin::cast::R%>(this);
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ sort([(dart.core::int*, dart.core::int*) →? dart.core::int compare = #C2]) → void {
-      dart._internal::Sort::sort<dart.core::int*>(this, let final (dart.core::int*, dart.core::int*) →? dart.core::int #t3 = compare in #t3.{dart.core::Object::==}(null) ?{(dart.core::int*, dart.core::int*) → dart.core::int} #C6 : #t3{(dart.core::int*, dart.core::int*) → dart.core::int});
+      dart._internal::Sort::sort<dart.core::int*>(this, let final (dart.core::int*, dart.core::int*) →? dart.core::int #t2 = compare in #t2.{dart.core::Object::==}(null) ?{(dart.core::int*, dart.core::int*) → dart.core::int} #C6 : #t2{(dart.core::int*, dart.core::int*) → dart.core::int});
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ shuffle([dart.math::Random? random = #C2]) → void {
       random.{dart.core::Object::==}(null) ?{dart.math::Random} random = dart.math::Random::•() : null;
@@ -259,22 +261,22 @@
     }
     operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ +(generic-covariant-impl dart.core::List<dart.core::int*> other) → dart.core::List<dart.core::int*>
       return block {
-        final dart.core::List<dart.core::int*> #t4 = <dart.core::int*>[];
+        final dart.core::List<dart.core::int*> #t3 = <dart.core::int*>[];
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = this.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-            final dart.core::int* #t5 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t4.{dart.core::List::add}(#t5);
+            final dart.core::int* #t4 = :sync-for-iterator.{dart.core::Iterator::current};
+            #t3.{dart.core::List::add}(#t4);
           }
         }
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = other.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-            final dart.core::int* #t6 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t4.{dart.core::List::add}(#t6);
+            final dart.core::int* #t5 = :sync-for-iterator.{dart.core::Iterator::current};
+            #t3.{dart.core::List::add}(#t5);
           }
         }
-      } =>#t4;
+      } =>#t3;
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ sublist(dart.core::int start, [dart.core::int? end = #C2]) → dart.core::List<dart.core::int*> {
       dart.core::int listLength = this.{dart.core::List::length};
       end.{dart.core::num::==}(null) ?{dart.core::int} end = listLength : null;
@@ -294,7 +296,7 @@
       }
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ fillRange(dart.core::int start, dart.core::int end, [generic-covariant-impl dart.core::int? fill = #C2]) → void {
-      dart.core::int* value = let dart.core::int? #t7 = fill in #t7.==(null) ?{dart.core::int*} #t7 : #t7{dart.core::int*};
+      dart.core::int* value = let dart.core::int? #t6 = fill in #t6.==(null) ?{dart.core::int*} #t6 : #t6{dart.core::int*};
       dart.core::RangeError::checkValidRange(start, end, this.{dart.core::List::length});
       for (dart.core::int i = start; i.{dart.core::num::<}(end); i = i.{dart.core::num::+}(1)) {
         this.{dart.core::List::[]=}(i, value);
@@ -473,7 +475,7 @@
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             dart.core::int* element = :sync-for-iterator.{dart.core::Iterator::current};
             {
-              this.{dart.core::List::[]=}(let final dart.core::int #t8 = index in let final dart.core::int #t9 = index = #t8.{dart.core::num::+}(1) in #t8, element);
+              this.{dart.core::List::[]=}(let final dart.core::int #t7 = index in let final dart.core::int #t8 = index = #t7.{dart.core::num::+}(1) in #t7, element);
             }
           }
         }
@@ -521,7 +523,7 @@
       return this.{dart.core::List::[]}(0);
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ add(generic-covariant-impl dart.core::int* element) → void {
-      this.{dart.core::List::[]=}(let final dart.core::int #t10 = this.{dart.core::List::length} in let final dart.core::int #t11 = this.{dart.core::List::length} = #t10.{dart.core::num::+}(1) in #t10, element);
+      this.{dart.core::List::[]=}(let final dart.core::int #t9 = this.{dart.core::List::length} in let final dart.core::int #t10 = this.{dart.core::List::length} = #t9.{dart.core::num::+}(1) in #t9, element);
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ clear() → void {
       this.{dart.core::List::length} = 0;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
index 2e0067b..047b515 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
@@ -117,7 +117,9 @@
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ join([dart.core::String separator = #C4]) → dart.core::String {
       if(this.{dart.core::List::length}.{dart.core::num::==}(0))
         return "";
-      dart.core::StringBuffer buffer = let final dart.core::StringBuffer #t1 = new dart.core::StringBuffer::•() in let final void #t2 = #t1.{dart.core::StringBuffer::writeAll}(this, separator) in #t1;
+      dart.core::StringBuffer buffer = let final dart.core::StringBuffer #t1 = new dart.core::StringBuffer::•() in block {
+        #t1.{dart.core::StringBuffer::writeAll}(this, separator);
+      } =>#t1;
       return buffer.{dart.core::StringBuffer::toString}();
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ where((dart.core::int*) → dart.core::bool test) → dart.core::Iterable<dart.core::int*>
@@ -239,7 +241,7 @@
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ cast<R extends dart.core::Object? = dynamic>() → dart.core::List<main::_WithListMixin&Object&ListMixin::cast::R%>
       return dart.core::List::castFrom<dart.core::int*, main::_WithListMixin&Object&ListMixin::cast::R%>(this);
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ sort([(dart.core::int*, dart.core::int*) →? dart.core::int compare = #C2]) → void {
-      dart._internal::Sort::sort<dart.core::int*>(this, let final (dart.core::int*, dart.core::int*) →? dart.core::int #t3 = compare in #t3.{dart.core::Object::==}(null) ?{(dart.core::int*, dart.core::int*) → dart.core::int} #C6 : #t3{(dart.core::int*, dart.core::int*) → dart.core::int});
+      dart._internal::Sort::sort<dart.core::int*>(this, let final (dart.core::int*, dart.core::int*) →? dart.core::int #t2 = compare in #t2.{dart.core::Object::==}(null) ?{(dart.core::int*, dart.core::int*) → dart.core::int} #C6 : #t2{(dart.core::int*, dart.core::int*) → dart.core::int});
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ shuffle([dart.math::Random? random = #C2]) → void {
       random.{dart.core::Object::==}(null) ?{dart.math::Random} random = dart.math::Random::•() : null;
@@ -259,22 +261,22 @@
     }
     operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ +(generic-covariant-impl dart.core::List<dart.core::int*> other) → dart.core::List<dart.core::int*>
       return block {
-        final dart.core::List<dart.core::int*> #t4 = <dart.core::int*>[];
+        final dart.core::List<dart.core::int*> #t3 = <dart.core::int*>[];
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = this.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-            final dart.core::int* #t5 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t4.{dart.core::List::add}(#t5);
+            final dart.core::int* #t4 = :sync-for-iterator.{dart.core::Iterator::current};
+            #t3.{dart.core::List::add}(#t4);
           }
         }
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = other.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-            final dart.core::int* #t6 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t4.{dart.core::List::add}(#t6);
+            final dart.core::int* #t5 = :sync-for-iterator.{dart.core::Iterator::current};
+            #t3.{dart.core::List::add}(#t5);
           }
         }
-      } =>#t4;
+      } =>#t3;
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ sublist(dart.core::int start, [dart.core::int? end = #C2]) → dart.core::List<dart.core::int*> {
       dart.core::int listLength = this.{dart.core::List::length};
       end.{dart.core::num::==}(null) ?{dart.core::int} end = listLength : null;
@@ -294,7 +296,7 @@
       }
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ fillRange(dart.core::int start, dart.core::int end, [generic-covariant-impl dart.core::int? fill = #C2]) → void {
-      dart.core::int* value = let dart.core::int? #t7 = fill in #t7.==(null) ?{dart.core::int*} #t7 : #t7{dart.core::int*};
+      dart.core::int* value = let dart.core::int? #t6 = fill in #t6.==(null) ?{dart.core::int*} #t6 : #t6{dart.core::int*};
       dart.core::RangeError::checkValidRange(start, end, this.{dart.core::List::length});
       for (dart.core::int i = start; i.{dart.core::num::<}(end); i = i.{dart.core::num::+}(1)) {
         this.{dart.core::List::[]=}(i, value);
@@ -473,7 +475,7 @@
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             dart.core::int* element = :sync-for-iterator.{dart.core::Iterator::current};
             {
-              this.{dart.core::List::[]=}(let final dart.core::int #t8 = index in let final dart.core::int #t9 = index = #t8.{dart.core::num::+}(1) in #t8, element);
+              this.{dart.core::List::[]=}(let final dart.core::int #t7 = index in let final dart.core::int #t8 = index = #t7.{dart.core::num::+}(1) in #t7, element);
             }
           }
         }
@@ -521,7 +523,7 @@
       return this.{dart.core::List::[]}(0);
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ add(generic-covariant-impl dart.core::int* element) → void {
-      this.{dart.core::List::[]=}(let final dart.core::int #t10 = this.{dart.core::List::length} in let final dart.core::int #t11 = this.{dart.core::List::length} = #t10.{dart.core::num::+}(1) in #t10, element);
+      this.{dart.core::List::[]=}(let final dart.core::int #t9 = this.{dart.core::List::length} in let final dart.core::int #t10 = this.{dart.core::List::length} = #t9.{dart.core::num::+}(1) in #t9, element);
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk_nnbd/lib/collection/list.dart */ clear() → void {
       this.{dart.core::List::length} = 0;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
index c1312ba..317d3e2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
@@ -23,8 +23,8 @@
       ;
     get field5() → dart.core::int? {
       if(!this.{main::C::_#C#field5#isSet}) {
-        this.{main::C::_#C#field5#isSet} = true;
         this.{main::C::_#C#field5} = 42;
+        this.{main::C::_#C#field5#isSet} = true;
       }
       return this.{main::C::_#C#field5};
     }
@@ -43,8 +43,8 @@
         final dart.core::int? #t3 = 42;
         if(this.{main::C::_#C#field7#isSet})
           throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
-        this.{main::C::_#C#field7#isSet} = true;
         this.{main::C::_#C#field7} = #t3;
+        this.{main::C::_#C#field7#isSet} = true;
       }
       return this.{main::C::_#C#field7};
     }
@@ -59,8 +59,8 @@
       }
     static get field9() → dart.core::int? {
       if(!main::C::_#field9#isSet) {
-        main::C::_#field9#isSet = true;
         main::C::_#field9 = 42;
+        main::C::_#field9#isSet = true;
       }
       return main::C::_#field9;
     }
@@ -79,8 +79,8 @@
         final dart.core::int? #t7 = 42;
         if(main::C::_#field11#isSet)
           throw new dart._internal::LateInitializationErrorImpl::•("Field 'field11' has been assigned during initialization.");
-        main::C::_#field11#isSet = true;
         main::C::_#field11 = #t7;
+        main::C::_#field11#isSet = true;
       }
       return main::C::_#field11;
     }
@@ -104,8 +104,8 @@
   static field dart.core::bool _#field4#isSet = false;
   static get field1() → dart.core::int? {
     if(!main::_#field1#isSet) {
-      main::_#field1#isSet = true;
       main::_#field1 = 42;
+      main::_#field1#isSet = true;
     }
     return main::_#field1;
   }
@@ -124,8 +124,8 @@
       final dart.core::int? #t11 = 42;
       if(main::_#field3#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
-      main::_#field3#isSet = true;
       main::_#field3 = #t11;
+      main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
index fcb2736..4e90b8f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
@@ -23,8 +23,8 @@
       ;
     get field5() → dart.core::int? {
       if(!this.{main::C::_#C#field5#isSet}) {
-        this.{main::C::_#C#field5#isSet} = true;
         this.{main::C::_#C#field5} = 42;
+        this.{main::C::_#C#field5#isSet} = true;
       }
       return this.{main::C::_#C#field5};
     }
@@ -43,8 +43,8 @@
         final dart.core::int? #t3 = 42;
         if(this.{main::C::_#C#field7#isSet})
           throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
-        this.{main::C::_#C#field7#isSet} = true;
         this.{main::C::_#C#field7} = #t3;
+        this.{main::C::_#C#field7#isSet} = true;
       }
       return this.{main::C::_#C#field7};
     }
@@ -59,8 +59,8 @@
       }
     static get field9() → dart.core::int? {
       if(!main::C::_#field9#isSet) {
-        main::C::_#field9#isSet = true;
         main::C::_#field9 = 42;
+        main::C::_#field9#isSet = true;
       }
       return main::C::_#field9;
     }
@@ -79,8 +79,8 @@
         final dart.core::int? #t7 = 42;
         if(main::C::_#field11#isSet)
           throw new dart._internal::LateInitializationErrorImpl::•("Field 'field11' has been assigned during initialization.");
-        main::C::_#field11#isSet = true;
         main::C::_#field11 = #t7;
+        main::C::_#field11#isSet = true;
       }
       return main::C::_#field11;
     }
@@ -104,8 +104,8 @@
   static field dart.core::bool _#field4#isSet = false;
   static get field1() → dart.core::int? {
     if(!main::_#field1#isSet) {
-      main::_#field1#isSet = true;
       main::_#field1 = 42;
+      main::_#field1#isSet = true;
     }
     return main::_#field1;
   }
@@ -124,8 +124,8 @@
       final dart.core::int? #t11 = 42;
       if(main::_#field3#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
-      main::_#field3#isSet = true;
       main::_#field3 = #t11;
+      main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
index 0bb5760..a34308e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
@@ -41,8 +41,8 @@
   static field dart.core::bool _#_extension#0|field8#isSet = false;
   static get field1() → dart.core::int? {
     if(!main::_#field1#isSet) {
-      main::_#field1#isSet = true;
       main::_#field1 = 42;
+      main::_#field1#isSet = true;
     }
     return main::_#field1;
   }
@@ -61,8 +61,8 @@
       final dart.core::int? #t3 = 42;
       if(main::_#field3#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
-      main::_#field3#isSet = true;
       main::_#field3 = #t3;
+      main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
@@ -77,8 +77,8 @@
     }
   static get _extension#0|field5() → dart.core::int? {
     if(!main::_#_extension#0|field5#isSet) {
-      main::_#_extension#0|field5#isSet = true;
       main::_#_extension#0|field5 = 42;
+      main::_#_extension#0|field5#isSet = true;
     }
     return main::_#_extension#0|field5;
   }
@@ -97,8 +97,8 @@
       final dart.core::int? #t7 = 42;
       if(main::_#_extension#0|field7#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
-      main::_#_extension#0|field7#isSet = true;
       main::_#_extension#0|field7 = #t7;
+      main::_#_extension#0|field7#isSet = true;
     }
     return main::_#_extension#0|field7;
   }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
index fdf6f59..246b57d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
@@ -41,8 +41,8 @@
   static field dart.core::bool _#_extension#0|field8#isSet = false;
   static get field1() → dart.core::int? {
     if(!main::_#field1#isSet) {
-      main::_#field1#isSet = true;
       main::_#field1 = 42;
+      main::_#field1#isSet = true;
     }
     return main::_#field1;
   }
@@ -61,8 +61,8 @@
       final dart.core::int? #t3 = 42;
       if(main::_#field3#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
-      main::_#field3#isSet = true;
       main::_#field3 = #t3;
+      main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
@@ -77,8 +77,8 @@
     }
   static get _extension#0|field5() → dart.core::int? {
     if(!main::_#_extension#0|field5#isSet) {
-      main::_#_extension#0|field5#isSet = true;
       main::_#_extension#0|field5 = 42;
+      main::_#_extension#0|field5#isSet = true;
     }
     return main::_#_extension#0|field5;
   }
@@ -97,8 +97,8 @@
       final dart.core::int? #t7 = 42;
       if(main::_#_extension#0|field7#isSet)
         throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
-      main::_#_extension#0|field7#isSet = true;
       main::_#_extension#0|field7 = #t7;
+      main::_#_extension#0|field7#isSet = true;
     }
     return main::_#_extension#0|field7;
   }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index 66440f82..30b6824 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -30,9 +30,11 @@
   core::num* y;
   self::C<core::int*>* c_int = new self::C::•<core::int*>(y as{TypeError} core::int*);
   self::C<core::num*>* c_num = new self::C::•<core::num*>(123);
-  self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in let final void #t2 = #t1.{self::C::t} = 1.0 in #t1;
+  self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in block {
+    #t1.{self::C::t} = 1.0;
+  } =>#t1;
   self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x.{self::C::t} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   x. /*@target=C.t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                       ^" in "hello" as{TypeError} core::int*;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index 66440f82..30b6824 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -30,9 +30,11 @@
   core::num* y;
   self::C<core::int*>* c_int = new self::C::•<core::int*>(y as{TypeError} core::int*);
   self::C<core::num*>* c_num = new self::C::•<core::num*>(123);
-  self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in let final void #t2 = #t1.{self::C::t} = 1.0 in #t1;
+  self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in block {
+    #t1.{self::C::t} = 1.0;
+  } =>#t1;
   self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x.{self::C::t} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   x. /*@target=C.t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                       ^" in "hello" as{TypeError} core::int*;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
index e656b2f..c9abbef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
@@ -33,6 +33,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-static field self::A* t1 = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::b} = new self::B::•<core::int*>(1) in #t1;
+static field self::A* t1 = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::b} = new self::B::•<core::int*>(1);
+} =>#t1;
 static field core::List<self::B<core::int*>*>* t2 = <self::B<core::int*>*>[new self::B::•<core::int*>(2)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
index e656b2f..c9abbef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
@@ -33,6 +33,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-static field self::A* t1 = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::b} = new self::B::•<core::int*>(1) in #t1;
+static field self::A* t1 = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::b} = new self::B::•<core::int*>(1);
+} =>#t1;
 static field core::List<self::B<core::int*>*>* t2 = <self::B<core::int*>*>[new self::B::•<core::int*>(2)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index e77093c..b5bef3b 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -109,7 +109,9 @@
                                  ^"];
 static field core::List<dynamic>* c2 = #C1;
 static field core::Map<dynamic, dynamic>* d = <dynamic, dynamic>{"a": "b"};
-static field self::A* e = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::x} = 3 in #t1;
+static field self::A* e = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::x} = 3;
+} =>#t1;
 static field core::int* f = 2.{core::num::+}(3);
 static field core::int* g = 3.{core::int::unary-}();
 static field self::B* h = new self::A::•().{self::A::+}(3);
@@ -120,59 +122,59 @@
                                                          ^";
 static field self::B* j = null as self::B*;
 static method test1() → dynamic {
-  self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+  self::a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::A*;
   self::a = new self::B::•(3);
-  self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+  self::b = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::B*;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+  self::c1 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>() in #t6) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
   self::c2 = <dynamic>[];
-  self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+  self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t8 = col::LinkedHashSet::•<dynamic>() in #t8) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
   self::d = <dynamic, dynamic>{};
-  self::d = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
   self::e = new self::A::•();
-  self::e = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
  - 'Map' is from 'dart:core'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in <dynamic, dynamic>{} as{TypeError} self::A*;
   self::f = 3;
-  self::f = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int*;
   self::g = 1;
-  self::g = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int*;
-  self::h = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B*;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B*;
-  self::j = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
  - 'List' is from 'dart:core'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 7dc9b4c..7974856 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -109,7 +109,9 @@
                                  ^"];
 static field core::List<dynamic>* c2 = #C1;
 static field core::Map<dynamic, dynamic>* d = <dynamic, dynamic>{"a": "b"};
-static field self::A* e = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::x} = 3 in #t1;
+static field self::A* e = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::x} = 3;
+} =>#t1;
 static field core::int* f = 2.{core::num::+}(3);
 static field core::int* g = 3.{core::int::unary-}();
 static field self::B* h = new self::A::•().{self::A::+}(3);
@@ -120,59 +122,59 @@
                                                          ^";
 static field self::B* j = null;
 static method test1() → dynamic {
-  self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+  self::a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::A*;
   self::a = new self::B::•(3);
-  self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+  self::b = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::B*;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+  self::c1 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>() in #t6) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
   self::c2 = <dynamic>[];
-  self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+  self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t8 = col::LinkedHashSet::•<dynamic>() in #t8) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
   self::d = <dynamic, dynamic>{};
-  self::d = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
   self::e = new self::A::•();
-  self::e = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
  - 'Map' is from 'dart:core'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in <dynamic, dynamic>{} as{TypeError} self::A*;
   self::f = 3;
-  self::f = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int*;
   self::g = 1;
-  self::g = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int*;
-  self::h = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B*;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B*;
-  self::j = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
  - 'List' is from 'dart:core'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
index f1df00a..48d4fcb 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
@@ -20,5 +20,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-static field self::A* v = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::a} = 1 in let final void #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final void #t4 = #t1.{self::A::m}() in #t1;
+static field self::A* v = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::a} = 1;
+  #t1.{self::A::b}.{core::List::add}(2);
+  #t1.{self::A::m}();
+} =>#t1;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
index f1df00a..48d4fcb 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
@@ -20,5 +20,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
-static field self::A* v = let final self::A* #t1 = new self::A::•() in let final void #t2 = #t1.{self::A::a} = 1 in let final void #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final void #t4 = #t1.{self::A::m}() in #t1;
+static field self::A* v = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::a} = 1;
+  #t1.{self::A::b}.{core::List::add}(2);
+  #t1.{self::A::m}();
+} =>#t1;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
index 759a7c9..7594fd4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
@@ -123,8 +123,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -178,8 +178,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -250,8 +250,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodDirect::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodDirect::T%};
   }
@@ -305,8 +305,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodConditional::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodConditional::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
index 759a7c9..7594fd4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
@@ -123,8 +123,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -178,8 +178,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -250,8 +250,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodDirect::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodDirect::T%};
   }
@@ -305,8 +305,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodConditional::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodConditional::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
index 759a7c9..7594fd4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
@@ -123,8 +123,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -178,8 +178,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -250,8 +250,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodDirect::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodDirect::T%};
   }
@@ -305,8 +305,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodConditional::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodConditional::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
index 759a7c9..7594fd4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
@@ -123,8 +123,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -178,8 +178,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{T%};
   }
@@ -250,8 +250,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodDirect::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodDirect::T%};
   }
@@ -305,8 +305,8 @@
   core::bool #local7#isSet = false;
   function #local7#get() → self::methodConditional::T% {
     if(!#local7#isSet) {
-      #local7#isSet = true;
       local7 = value;
+      #local7#isSet = true;
     }
     return local7{self::methodConditional::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
index d8e7cc1..1edfa3c 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
@@ -24,8 +24,8 @@
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
-      self::Class::_#nullableStaticField#isSet = true;
       self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
@@ -36,8 +36,8 @@
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#nullableInstanceField};
   }
@@ -54,8 +54,8 @@
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
index d8e7cc1..1edfa3c 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
@@ -24,8 +24,8 @@
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
-      self::Class::_#nullableStaticField#isSet = true;
       self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
@@ -36,8 +36,8 @@
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#nullableInstanceField};
   }
@@ -54,8 +54,8 @@
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
index d8e7cc1..1edfa3c 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
@@ -24,8 +24,8 @@
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
-      self::Class::_#nullableStaticField#isSet = true;
       self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
@@ -36,8 +36,8 @@
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#nullableInstanceField};
   }
@@ -54,8 +54,8 @@
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
index d8e7cc1..1edfa3c 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
@@ -24,8 +24,8 @@
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
-      self::Class::_#nullableStaticField#isSet = true;
       self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
@@ -36,8 +36,8 @@
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#nullableInstanceField};
   }
@@ -54,8 +54,8 @@
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.expect
index a133a76..7895ba5 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.expect
@@ -19,8 +19,8 @@
     ;
   get field() → core::int? {
     if(!this.{self::Class::_#Class#field#isSet}) {
-      this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = self::initField();
+      this.{self::Class::_#Class#field#isSet} = true;
     }
     return this.{self::Class::_#Class#field};
   }
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.transformed.expect
index a133a76..7895ba5 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.strong.transformed.expect
@@ -19,8 +19,8 @@
     ;
   get field() → core::int? {
     if(!this.{self::Class::_#Class#field#isSet}) {
-      this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = self::initField();
+      this.{self::Class::_#Class#field#isSet} = true;
     }
     return this.{self::Class::_#Class#field};
   }
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.expect
index a133a76..7895ba5 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.expect
@@ -19,8 +19,8 @@
     ;
   get field() → core::int? {
     if(!this.{self::Class::_#Class#field#isSet}) {
-      this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = self::initField();
+      this.{self::Class::_#Class#field#isSet} = true;
     }
     return this.{self::Class::_#Class#field};
   }
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.transformed.expect
index a133a76..7895ba5 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.transformed.expect
@@ -19,8 +19,8 @@
     ;
   get field() → core::int? {
     if(!this.{self::Class::_#Class#field#isSet}) {
-      this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = self::initField();
+      this.{self::Class::_#Class#field#isSet} = true;
     }
     return this.{self::Class::_#Class#field};
   }
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart b/pkg/front_end/testcases/late_lowering/issue41922.dart
new file mode 100644
index 0000000..74438c8
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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.
+
+bool _called = false;
+
+String init(String val) {
+  if (!_called) {
+    _called = true;
+    throw new Exception();
+  }
+  return val;
+}
+
+class C {
+  static late String? s = init("lateValue");
+}
+
+main() {
+  throws(() {
+    C.s;
+  });
+  expect("lateValue", C.s);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.outline.expect
new file mode 100644
index 0000000..636ec1c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s;
+  static field core::bool _#s#isSet;
+  synthetic constructor •() → self::C
+    ;
+  static get s() → core::String?;
+  static set s(core::String? #t1) → void;
+}
+static field core::bool _called;
+static method init(core::String val) → core::String
+  ;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+static method throws(() → void f) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect
new file mode 100644
index 0000000..14ecf83
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s = null;
+  static field core::bool _#s#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → core::String? {
+    if(!self::C::_#s#isSet) {
+      self::C::_#s = self::init("lateValue");
+      self::C::_#s#isSet = true;
+    }
+    return self::C::_#s;
+  }
+  static set s(core::String? #t1) → void {
+    self::C::_#s#isSet = true;
+    self::C::_#s = #t1;
+  }
+}
+static field core::bool _called = false;
+static method init(core::String val) → core::String {
+  if(!self::_called) {
+    self::_called = true;
+    throw core::Exception::•();
+  }
+  return val;
+}
+static method main() → dynamic {
+  self::throws(() → core::Null? {
+    self::C::s;
+  });
+  self::expect("lateValue", self::C::s);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect
new file mode 100644
index 0000000..14ecf83
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s = null;
+  static field core::bool _#s#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → core::String? {
+    if(!self::C::_#s#isSet) {
+      self::C::_#s = self::init("lateValue");
+      self::C::_#s#isSet = true;
+    }
+    return self::C::_#s;
+  }
+  static set s(core::String? #t1) → void {
+    self::C::_#s#isSet = true;
+    self::C::_#s = #t1;
+  }
+}
+static field core::bool _called = false;
+static method init(core::String val) → core::String {
+  if(!self::_called) {
+    self::_called = true;
+    throw core::Exception::•();
+  }
+  return val;
+}
+static method main() → dynamic {
+  self::throws(() → core::Null? {
+    self::C::s;
+  });
+  self::expect("lateValue", self::C::s);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.textual_outline.expect
new file mode 100644
index 0000000..c407de0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+bool _called = false;
+String init(String val) { }
+class C {
+  static late String;
+  operator? ( ){ }
+  s = init("lateValue");
+}
+main() { }
+expect(expected, actual) { }
+throws(void Function() f) { }
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect
new file mode 100644
index 0000000..14ecf83
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s = null;
+  static field core::bool _#s#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → core::String? {
+    if(!self::C::_#s#isSet) {
+      self::C::_#s = self::init("lateValue");
+      self::C::_#s#isSet = true;
+    }
+    return self::C::_#s;
+  }
+  static set s(core::String? #t1) → void {
+    self::C::_#s#isSet = true;
+    self::C::_#s = #t1;
+  }
+}
+static field core::bool _called = false;
+static method init(core::String val) → core::String {
+  if(!self::_called) {
+    self::_called = true;
+    throw core::Exception::•();
+  }
+  return val;
+}
+static method main() → dynamic {
+  self::throws(() → core::Null? {
+    self::C::s;
+  });
+  self::expect("lateValue", self::C::s);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect
new file mode 100644
index 0000000..14ecf83
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s = null;
+  static field core::bool _#s#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → core::String? {
+    if(!self::C::_#s#isSet) {
+      self::C::_#s = self::init("lateValue");
+      self::C::_#s#isSet = true;
+    }
+    return self::C::_#s;
+  }
+  static set s(core::String? #t1) → void {
+    self::C::_#s#isSet = true;
+    self::C::_#s = #t1;
+  }
+}
+static field core::bool _called = false;
+static method init(core::String val) → core::String {
+  if(!self::_called) {
+    self::_called = true;
+    throw core::Exception::•();
+  }
+  return val;
+}
+static method main() → dynamic {
+  self::throws(() → core::Null? {
+    self::C::s;
+  });
+  self::expect("lateValue", self::C::s);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.expect
index 9a2d29b..d9bfacd 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.expect
@@ -20,8 +20,8 @@
     this.{self::A::_#A#nonNullableInstanceField} = #t2;
   get nullableInstanceField() → core::int? {
     if(!this.{self::A::_#A#nullableInstanceField#isSet}) {
-      this.{self::A::_#A#nullableInstanceField#isSet} = true;
       this.{self::A::_#A#nullableInstanceField} = self::method();
+      this.{self::A::_#A#nullableInstanceField#isSet} = true;
     }
     return this.{self::A::_#A#nullableInstanceField};
   }
@@ -35,8 +35,8 @@
     self::A::_#nonNullableStaticField = #t5;
   static get nullableStaticField() → core::int? {
     if(!self::A::_#nullableStaticField#isSet) {
-      self::A::_#nullableStaticField#isSet = true;
       self::A::_#nullableStaticField = self::method();
+      self::A::_#nullableStaticField#isSet = true;
     }
     return self::A::_#nullableStaticField;
   }
@@ -68,8 +68,8 @@
   self::_#nonNullableTopLevelField = #t8;
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = self::method();
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.transformed.expect
index 9a2d29b..d9bfacd 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.strong.transformed.expect
@@ -20,8 +20,8 @@
     this.{self::A::_#A#nonNullableInstanceField} = #t2;
   get nullableInstanceField() → core::int? {
     if(!this.{self::A::_#A#nullableInstanceField#isSet}) {
-      this.{self::A::_#A#nullableInstanceField#isSet} = true;
       this.{self::A::_#A#nullableInstanceField} = self::method();
+      this.{self::A::_#A#nullableInstanceField#isSet} = true;
     }
     return this.{self::A::_#A#nullableInstanceField};
   }
@@ -35,8 +35,8 @@
     self::A::_#nonNullableStaticField = #t5;
   static get nullableStaticField() → core::int? {
     if(!self::A::_#nullableStaticField#isSet) {
-      self::A::_#nullableStaticField#isSet = true;
       self::A::_#nullableStaticField = self::method();
+      self::A::_#nullableStaticField#isSet = true;
     }
     return self::A::_#nullableStaticField;
   }
@@ -68,8 +68,8 @@
   self::_#nonNullableTopLevelField = #t8;
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = self::method();
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.expect
index 9a2d29b..d9bfacd 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.expect
@@ -20,8 +20,8 @@
     this.{self::A::_#A#nonNullableInstanceField} = #t2;
   get nullableInstanceField() → core::int? {
     if(!this.{self::A::_#A#nullableInstanceField#isSet}) {
-      this.{self::A::_#A#nullableInstanceField#isSet} = true;
       this.{self::A::_#A#nullableInstanceField} = self::method();
+      this.{self::A::_#A#nullableInstanceField#isSet} = true;
     }
     return this.{self::A::_#A#nullableInstanceField};
   }
@@ -35,8 +35,8 @@
     self::A::_#nonNullableStaticField = #t5;
   static get nullableStaticField() → core::int? {
     if(!self::A::_#nullableStaticField#isSet) {
-      self::A::_#nullableStaticField#isSet = true;
       self::A::_#nullableStaticField = self::method();
+      self::A::_#nullableStaticField#isSet = true;
     }
     return self::A::_#nullableStaticField;
   }
@@ -68,8 +68,8 @@
   self::_#nonNullableTopLevelField = #t8;
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = self::method();
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.transformed.expect
index 9a2d29b..d9bfacd 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.transformed.expect
@@ -20,8 +20,8 @@
     this.{self::A::_#A#nonNullableInstanceField} = #t2;
   get nullableInstanceField() → core::int? {
     if(!this.{self::A::_#A#nullableInstanceField#isSet}) {
-      this.{self::A::_#A#nullableInstanceField#isSet} = true;
       this.{self::A::_#A#nullableInstanceField} = self::method();
+      this.{self::A::_#A#nullableInstanceField#isSet} = true;
     }
     return this.{self::A::_#A#nullableInstanceField};
   }
@@ -35,8 +35,8 @@
     self::A::_#nonNullableStaticField = #t5;
   static get nullableStaticField() → core::int? {
     if(!self::A::_#nullableStaticField#isSet) {
-      self::A::_#nullableStaticField#isSet = true;
       self::A::_#nullableStaticField = self::method();
+      self::A::_#nullableStaticField#isSet = true;
     }
     return self::A::_#nullableStaticField;
   }
@@ -68,8 +68,8 @@
   self::_#nonNullableTopLevelField = #t8;
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
-    self::_#nullableTopLevelField#isSet = true;
     self::_#nullableTopLevelField = self::method();
+    self::_#nullableTopLevelField#isSet = true;
   }
   return self::_#nullableTopLevelField;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.expect
index 9e5e4e1..18cb216 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.expect
@@ -33,8 +33,8 @@
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericField1() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField1#isSet}) {
-      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
       this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
     }
     return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1} in #t7{self::Class::T%};
   }
@@ -44,8 +44,8 @@
   }
   get lateGenericField2() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField2#isSet}) {
-      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
       this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
     }
     return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2} in #t9{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.transformed.expect
index 9e5e4e1..18cb216 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.strong.transformed.expect
@@ -33,8 +33,8 @@
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericField1() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField1#isSet}) {
-      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
       this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
     }
     return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1} in #t7{self::Class::T%};
   }
@@ -44,8 +44,8 @@
   }
   get lateGenericField2() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField2#isSet}) {
-      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
       this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
     }
     return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2} in #t9{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.expect
index 9e5e4e1..18cb216 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.expect
@@ -33,8 +33,8 @@
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericField1() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField1#isSet}) {
-      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
       this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
     }
     return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1} in #t7{self::Class::T%};
   }
@@ -44,8 +44,8 @@
   }
   get lateGenericField2() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField2#isSet}) {
-      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
       this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
     }
     return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2} in #t9{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.transformed.expect
index 9e5e4e1..18cb216 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.transformed.expect
@@ -33,8 +33,8 @@
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericField1() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField1#isSet}) {
-      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
       this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
     }
     return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1} in #t7{self::Class::T%};
   }
@@ -44,8 +44,8 @@
   }
   get lateGenericField2() → self::Class::T% {
     if(!this.{self::Class::_#Class#lateGenericField2#isSet}) {
-      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
       this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field};
+      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
     }
     return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2} in #t9{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
index ea54cfd..850426a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
@@ -45,8 +45,8 @@
       final self::Class::T% #t7 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericField#isSet} = true;
       this.{self::Class::_#Class#lateGenericField} = #t7;
+      this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
     return let final self::Class::T? #t8 = this.{self::Class::_#Class#lateGenericField} in #t8{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
index ea54cfd..850426a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
@@ -45,8 +45,8 @@
       final self::Class::T% #t7 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericField#isSet} = true;
       this.{self::Class::_#Class#lateGenericField} = #t7;
+      this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
     return let final self::Class::T? #t8 = this.{self::Class::_#Class#lateGenericField} in #t8{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
index ea54cfd..850426a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
@@ -45,8 +45,8 @@
       final self::Class::T% #t7 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericField#isSet} = true;
       this.{self::Class::_#Class#lateGenericField} = #t7;
+      this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
     return let final self::Class::T? #t8 = this.{self::Class::_#Class#lateGenericField} in #t8{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
index ea54cfd..850426a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
@@ -45,8 +45,8 @@
       final self::Class::T% #t7 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericField#isSet} = true;
       this.{self::Class::_#Class#lateGenericField} = #t7;
+      this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
     return let final self::Class::T? #t8 = this.{self::Class::_#Class#lateGenericField} in #t8{self::Class::T%};
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
index 883b25a..2f84c91 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
@@ -22,8 +22,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
index 883b25a..2f84c91 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
@@ -22,8 +22,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
index 883b25a..2f84c91 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
@@ -22,8 +22,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
index 883b25a..2f84c91 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
@@ -22,8 +22,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
index aa8b4d1..52eadc4 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
@@ -28,8 +28,8 @@
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -41,8 +41,8 @@
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -59,8 +59,8 @@
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -72,8 +72,8 @@
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -116,8 +116,8 @@
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = #t5;
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -129,8 +129,8 @@
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -142,8 +142,8 @@
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
index aa8b4d1..52eadc4 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
@@ -28,8 +28,8 @@
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -41,8 +41,8 @@
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -59,8 +59,8 @@
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -72,8 +72,8 @@
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -116,8 +116,8 @@
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = #t5;
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -129,8 +129,8 @@
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -142,8 +142,8 @@
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
index aa8b4d1..52eadc4 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
@@ -28,8 +28,8 @@
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -41,8 +41,8 @@
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -59,8 +59,8 @@
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -72,8 +72,8 @@
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -116,8 +116,8 @@
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = #t5;
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -129,8 +129,8 @@
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -142,8 +142,8 @@
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
index aa8b4d1..52eadc4 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
@@ -28,8 +28,8 @@
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -41,8 +41,8 @@
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
         throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -59,8 +59,8 @@
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -72,8 +72,8 @@
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -116,8 +116,8 @@
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = #t5;
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -129,8 +129,8 @@
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -142,8 +142,8 @@
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
       throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
index dc6b6ad..a134538 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
@@ -11,8 +11,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = initLateLocal.call(123);
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -28,8 +28,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
index dc6b6ad..a134538 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -11,8 +11,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = initLateLocal.call(123);
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -28,8 +28,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
index dc6b6ad..a134538 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
@@ -11,8 +11,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = initLateLocal.call(123);
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -28,8 +28,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
index dc6b6ad..a134538 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -11,8 +11,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = initLateLocal.call(123);
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -28,8 +28,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = initLateGenericLocal.call(value);
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
index 3ad795c..e3a3c24 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
@@ -119,8 +119,8 @@
   return null;
 static get field1() → asy::FutureOr<dynamic> {
   if(!self::_#field1#isSet) {
-    self::_#field1#isSet = true;
     self::_#field1 = self::method1();
+    self::_#field1#isSet = true;
   }
   return self::_#field1;
 }
@@ -130,8 +130,8 @@
 }
 static get field2() → asy::FutureOr<dynamic>? {
   if(!self::_#field2#isSet) {
-    self::_#field2#isSet = true;
     self::_#field2 = self::method2();
+    self::_#field2#isSet = true;
   }
   return self::_#field2;
 }
@@ -141,8 +141,8 @@
 }
 static get field3() → asy::FutureOr<dynamic> {
   if(!self::_#field3#isSet) {
-    self::_#field3#isSet = true;
     self::_#field3 = self::method3();
+    self::_#field3#isSet = true;
   }
   return self::_#field3;
 }
@@ -156,8 +156,8 @@
   self::_#field4 = #t16;
 static get field5() → asy::FutureOr<core::int?> {
   if(!self::_#field5#isSet) {
-    self::_#field5#isSet = true;
     self::_#field5 = self::method5();
+    self::_#field5#isSet = true;
   }
   return self::_#field5;
 }
@@ -167,8 +167,8 @@
 }
 static get field6() → asy::FutureOr<core::int?>? {
   if(!self::_#field6#isSet) {
-    self::_#field6#isSet = true;
     self::_#field6 = self::method6();
+    self::_#field6#isSet = true;
   }
   return self::_#field6;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
index 3ad795c..e3a3c24 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
@@ -119,8 +119,8 @@
   return null;
 static get field1() → asy::FutureOr<dynamic> {
   if(!self::_#field1#isSet) {
-    self::_#field1#isSet = true;
     self::_#field1 = self::method1();
+    self::_#field1#isSet = true;
   }
   return self::_#field1;
 }
@@ -130,8 +130,8 @@
 }
 static get field2() → asy::FutureOr<dynamic>? {
   if(!self::_#field2#isSet) {
-    self::_#field2#isSet = true;
     self::_#field2 = self::method2();
+    self::_#field2#isSet = true;
   }
   return self::_#field2;
 }
@@ -141,8 +141,8 @@
 }
 static get field3() → asy::FutureOr<dynamic> {
   if(!self::_#field3#isSet) {
-    self::_#field3#isSet = true;
     self::_#field3 = self::method3();
+    self::_#field3#isSet = true;
   }
   return self::_#field3;
 }
@@ -156,8 +156,8 @@
   self::_#field4 = #t16;
 static get field5() → asy::FutureOr<core::int?> {
   if(!self::_#field5#isSet) {
-    self::_#field5#isSet = true;
     self::_#field5 = self::method5();
+    self::_#field5#isSet = true;
   }
   return self::_#field5;
 }
@@ -167,8 +167,8 @@
 }
 static get field6() → asy::FutureOr<core::int?>? {
   if(!self::_#field6#isSet) {
-    self::_#field6#isSet = true;
     self::_#field6 = self::method6();
+    self::_#field6#isSet = true;
   }
   return self::_#field6;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
index 3ad795c..e3a3c24 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
@@ -119,8 +119,8 @@
   return null;
 static get field1() → asy::FutureOr<dynamic> {
   if(!self::_#field1#isSet) {
-    self::_#field1#isSet = true;
     self::_#field1 = self::method1();
+    self::_#field1#isSet = true;
   }
   return self::_#field1;
 }
@@ -130,8 +130,8 @@
 }
 static get field2() → asy::FutureOr<dynamic>? {
   if(!self::_#field2#isSet) {
-    self::_#field2#isSet = true;
     self::_#field2 = self::method2();
+    self::_#field2#isSet = true;
   }
   return self::_#field2;
 }
@@ -141,8 +141,8 @@
 }
 static get field3() → asy::FutureOr<dynamic> {
   if(!self::_#field3#isSet) {
-    self::_#field3#isSet = true;
     self::_#field3 = self::method3();
+    self::_#field3#isSet = true;
   }
   return self::_#field3;
 }
@@ -156,8 +156,8 @@
   self::_#field4 = #t16;
 static get field5() → asy::FutureOr<core::int?> {
   if(!self::_#field5#isSet) {
-    self::_#field5#isSet = true;
     self::_#field5 = self::method5();
+    self::_#field5#isSet = true;
   }
   return self::_#field5;
 }
@@ -167,8 +167,8 @@
 }
 static get field6() → asy::FutureOr<core::int?>? {
   if(!self::_#field6#isSet) {
-    self::_#field6#isSet = true;
     self::_#field6 = self::method6();
+    self::_#field6#isSet = true;
   }
   return self::_#field6;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
index 3ad795c..e3a3c24 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
@@ -119,8 +119,8 @@
   return null;
 static get field1() → asy::FutureOr<dynamic> {
   if(!self::_#field1#isSet) {
-    self::_#field1#isSet = true;
     self::_#field1 = self::method1();
+    self::_#field1#isSet = true;
   }
   return self::_#field1;
 }
@@ -130,8 +130,8 @@
 }
 static get field2() → asy::FutureOr<dynamic>? {
   if(!self::_#field2#isSet) {
-    self::_#field2#isSet = true;
     self::_#field2 = self::method2();
+    self::_#field2#isSet = true;
   }
   return self::_#field2;
 }
@@ -141,8 +141,8 @@
 }
 static get field3() → asy::FutureOr<dynamic> {
   if(!self::_#field3#isSet) {
-    self::_#field3#isSet = true;
     self::_#field3 = self::method3();
+    self::_#field3#isSet = true;
   }
   return self::_#field3;
 }
@@ -156,8 +156,8 @@
   self::_#field4 = #t16;
 static get field5() → asy::FutureOr<core::int?> {
   if(!self::_#field5#isSet) {
-    self::_#field5#isSet = true;
     self::_#field5 = self::method5();
+    self::_#field5#isSet = true;
   }
   return self::_#field5;
 }
@@ -167,8 +167,8 @@
 }
 static get field6() → asy::FutureOr<core::int?>? {
   if(!self::_#field6#isSet) {
-    self::_#field6#isSet = true;
     self::_#field6 = self::method6();
+    self::_#field6#isSet = true;
   }
   return self::_#field6;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
index 25a5097..9fbaf26 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
@@ -16,8 +16,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
index 25a5097..9fbaf26 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
@@ -16,8 +16,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
index 25a5097..9fbaf26 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
@@ -16,8 +16,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
index 25a5097..9fbaf26 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
@@ -16,8 +16,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal{T%};
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.expect
index 6a2319d..e44eb03 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.expect
@@ -19,8 +19,8 @@
     return 87;
   static get lateStaticField1() → core::int? {
     if(!self::Class::_#lateStaticField1#isSet) {
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = self::Class::lateStaticField1Init();
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -32,8 +32,8 @@
     return 42;
   static get lateStaticField2() → core::int? {
     if(!self::Class::_#lateStaticField2#isSet) {
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = self::Class::lateStaticField2Init();
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -50,8 +50,8 @@
     return 16;
   get lateInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = this.{self::Class::lateInstanceFieldInit}();
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -63,8 +63,8 @@
     return this.{self::Class::field};
   get lateGenericInstanceField() → self::Class::T? {
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = this.{self::Class::lateGenericInstanceFieldInit}();
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -104,8 +104,8 @@
   return 123;
 static get lateTopLevelField1() → core::int? {
   if(!self::_#lateTopLevelField1#isSet) {
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = self::lateTopLevelField1Init();
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -117,8 +117,8 @@
   return 87;
 static get Extension|lateExtensionField1() → core::int? {
   if(!self::_#Extension|lateExtensionField1#isSet) {
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = self::Extension|lateExtensionField1Init();
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -130,8 +130,8 @@
   return 42;
 static get Extension|lateExtensionField2() → core::int? {
   if(!self::_#Extension|lateExtensionField2#isSet) {
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = self::Extension|lateExtensionField2Init();
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.transformed.expect
index 6a2319d..e44eb03 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.strong.transformed.expect
@@ -19,8 +19,8 @@
     return 87;
   static get lateStaticField1() → core::int? {
     if(!self::Class::_#lateStaticField1#isSet) {
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = self::Class::lateStaticField1Init();
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -32,8 +32,8 @@
     return 42;
   static get lateStaticField2() → core::int? {
     if(!self::Class::_#lateStaticField2#isSet) {
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = self::Class::lateStaticField2Init();
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -50,8 +50,8 @@
     return 16;
   get lateInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = this.{self::Class::lateInstanceFieldInit}();
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -63,8 +63,8 @@
     return this.{self::Class::field};
   get lateGenericInstanceField() → self::Class::T? {
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = this.{self::Class::lateGenericInstanceFieldInit}();
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -104,8 +104,8 @@
   return 123;
 static get lateTopLevelField1() → core::int? {
   if(!self::_#lateTopLevelField1#isSet) {
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = self::lateTopLevelField1Init();
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -117,8 +117,8 @@
   return 87;
 static get Extension|lateExtensionField1() → core::int? {
   if(!self::_#Extension|lateExtensionField1#isSet) {
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = self::Extension|lateExtensionField1Init();
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -130,8 +130,8 @@
   return 42;
 static get Extension|lateExtensionField2() → core::int? {
   if(!self::_#Extension|lateExtensionField2#isSet) {
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = self::Extension|lateExtensionField2Init();
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.expect
index 6a2319d..e44eb03 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.expect
@@ -19,8 +19,8 @@
     return 87;
   static get lateStaticField1() → core::int? {
     if(!self::Class::_#lateStaticField1#isSet) {
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = self::Class::lateStaticField1Init();
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -32,8 +32,8 @@
     return 42;
   static get lateStaticField2() → core::int? {
     if(!self::Class::_#lateStaticField2#isSet) {
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = self::Class::lateStaticField2Init();
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -50,8 +50,8 @@
     return 16;
   get lateInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = this.{self::Class::lateInstanceFieldInit}();
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -63,8 +63,8 @@
     return this.{self::Class::field};
   get lateGenericInstanceField() → self::Class::T? {
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = this.{self::Class::lateGenericInstanceFieldInit}();
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -104,8 +104,8 @@
   return 123;
 static get lateTopLevelField1() → core::int? {
   if(!self::_#lateTopLevelField1#isSet) {
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = self::lateTopLevelField1Init();
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -117,8 +117,8 @@
   return 87;
 static get Extension|lateExtensionField1() → core::int? {
   if(!self::_#Extension|lateExtensionField1#isSet) {
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = self::Extension|lateExtensionField1Init();
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -130,8 +130,8 @@
   return 42;
 static get Extension|lateExtensionField2() → core::int? {
   if(!self::_#Extension|lateExtensionField2#isSet) {
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = self::Extension|lateExtensionField2Init();
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.transformed.expect
index 6a2319d..e44eb03 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.transformed.expect
@@ -19,8 +19,8 @@
     return 87;
   static get lateStaticField1() → core::int? {
     if(!self::Class::_#lateStaticField1#isSet) {
-      self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = self::Class::lateStaticField1Init();
+      self::Class::_#lateStaticField1#isSet = true;
     }
     return self::Class::_#lateStaticField1;
   }
@@ -32,8 +32,8 @@
     return 42;
   static get lateStaticField2() → core::int? {
     if(!self::Class::_#lateStaticField2#isSet) {
-      self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = self::Class::lateStaticField2Init();
+      self::Class::_#lateStaticField2#isSet = true;
     }
     return self::Class::_#lateStaticField2;
   }
@@ -50,8 +50,8 @@
     return 16;
   get lateInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = this.{self::Class::lateInstanceFieldInit}();
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateInstanceField};
   }
@@ -63,8 +63,8 @@
     return this.{self::Class::field};
   get lateGenericInstanceField() → self::Class::T? {
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
-      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = this.{self::Class::lateGenericInstanceFieldInit}();
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
     return this.{self::Class::_#Class#lateGenericInstanceField};
   }
@@ -104,8 +104,8 @@
   return 123;
 static get lateTopLevelField1() → core::int? {
   if(!self::_#lateTopLevelField1#isSet) {
-    self::_#lateTopLevelField1#isSet = true;
     self::_#lateTopLevelField1 = self::lateTopLevelField1Init();
+    self::_#lateTopLevelField1#isSet = true;
   }
   return self::_#lateTopLevelField1;
 }
@@ -117,8 +117,8 @@
   return 87;
 static get Extension|lateExtensionField1() → core::int? {
   if(!self::_#Extension|lateExtensionField1#isSet) {
-    self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = self::Extension|lateExtensionField1Init();
+    self::_#Extension|lateExtensionField1#isSet = true;
   }
   return self::_#Extension|lateExtensionField1;
 }
@@ -130,8 +130,8 @@
   return 42;
 static get Extension|lateExtensionField2() → core::int? {
   if(!self::_#Extension|lateExtensionField2#isSet) {
-    self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = self::Extension|lateExtensionField2Init();
+    self::_#Extension|lateExtensionField2#isSet = true;
   }
   return self::_#Extension|lateExtensionField2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
index 25dee5a..dea8137 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
@@ -9,8 +9,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = self::lateLocalInit();
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -26,8 +26,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
index 25dee5a..dea8137 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -9,8 +9,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = self::lateLocalInit();
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -26,8 +26,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
index 25dee5a..dea8137 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
@@ -9,8 +9,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = self::lateLocalInit();
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -26,8 +26,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
index 25dee5a..dea8137 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -9,8 +9,8 @@
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int? {
     if(!#lateLocal#isSet) {
-      #lateLocal#isSet = true;
       lateLocal = self::lateLocalInit();
+      #lateLocal#isSet = true;
     }
     return lateLocal;
   }
@@ -26,8 +26,8 @@
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
       if(!#lateGenericLocal#isSet) {
-        #lateGenericLocal#isSet = true;
         lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
       }
       return lateGenericLocal;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
index f5a665d..6e5f0ef 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
@@ -50,8 +50,8 @@
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
-      this.{self::C::_#C#y#isSet} = true;
       this.{self::C::_#C#y} = #t6;
+      this.{self::C::_#C#y#isSet} = true;
     }
     return this.{self::C::_#C#y};
   }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
index f5a665d..6e5f0ef 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
@@ -50,8 +50,8 @@
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
-      this.{self::C::_#C#y#isSet} = true;
       this.{self::C::_#C#y} = #t6;
+      this.{self::C::_#C#y#isSet} = true;
     }
     return this.{self::C::_#C#y};
   }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
index f5a665d..6e5f0ef 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
@@ -50,8 +50,8 @@
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
-      this.{self::C::_#C#y#isSet} = true;
       this.{self::C::_#C#y} = #t6;
+      this.{self::C::_#C#y#isSet} = true;
     }
     return this.{self::C::_#C#y};
   }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
index f5a665d..6e5f0ef 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
@@ -50,8 +50,8 @@
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
         throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
-      this.{self::C::_#C#y#isSet} = true;
       this.{self::C::_#C#y} = #t6;
+      this.{self::C::_#C#y#isSet} = true;
     }
     return this.{self::C::_#C#y};
   }
diff --git a/pkg/front_end/testcases/late_lowering/return_late.dart.strong.expect b/pkg/front_end/testcases/late_lowering/return_late.dart.strong.expect
index 7b6d380..1cc4a59 100644
--- a/pkg/front_end/testcases/late_lowering/return_late.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/return_late.dart.strong.expect
@@ -12,8 +12,8 @@
     core::bool #result#isSet = false;
     function #result#get() → self::Class::E% {
       if(!#result#isSet) {
-        #result#isSet = true;
         result = this.{self::Class::field};
+        #result#isSet = true;
       }
       return result{self::Class::E%};
     }
@@ -37,8 +37,8 @@
   core::bool #result#isSet = false;
   function #result#get() → core::int? {
     if(!#result#isSet) {
-      #result#isSet = true;
       result = value;
+      #result#isSet = true;
     }
     return result;
   }
diff --git a/pkg/front_end/testcases/late_lowering/return_late.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/return_late.dart.strong.transformed.expect
index 7b6d380..1cc4a59 100644
--- a/pkg/front_end/testcases/late_lowering/return_late.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/return_late.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
     core::bool #result#isSet = false;
     function #result#get() → self::Class::E% {
       if(!#result#isSet) {
-        #result#isSet = true;
         result = this.{self::Class::field};
+        #result#isSet = true;
       }
       return result{self::Class::E%};
     }
@@ -37,8 +37,8 @@
   core::bool #result#isSet = false;
   function #result#get() → core::int? {
     if(!#result#isSet) {
-      #result#isSet = true;
       result = value;
+      #result#isSet = true;
     }
     return result;
   }
diff --git a/pkg/front_end/testcases/late_lowering/return_late.dart.weak.expect b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.expect
index 7b6d380..1cc4a59 100644
--- a/pkg/front_end/testcases/late_lowering/return_late.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.expect
@@ -12,8 +12,8 @@
     core::bool #result#isSet = false;
     function #result#get() → self::Class::E% {
       if(!#result#isSet) {
-        #result#isSet = true;
         result = this.{self::Class::field};
+        #result#isSet = true;
       }
       return result{self::Class::E%};
     }
@@ -37,8 +37,8 @@
   core::bool #result#isSet = false;
   function #result#get() → core::int? {
     if(!#result#isSet) {
-      #result#isSet = true;
       result = value;
+      #result#isSet = true;
     }
     return result;
   }
diff --git a/pkg/front_end/testcases/late_lowering/return_late.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.transformed.expect
index 7b6d380..1cc4a59 100644
--- a/pkg/front_end/testcases/late_lowering/return_late.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.transformed.expect
@@ -12,8 +12,8 @@
     core::bool #result#isSet = false;
     function #result#get() → self::Class::E% {
       if(!#result#isSet) {
-        #result#isSet = true;
         result = this.{self::Class::field};
+        #result#isSet = true;
       }
       return result{self::Class::E%};
     }
@@ -37,8 +37,8 @@
   core::bool #result#isSet = false;
   function #result#get() → core::int? {
     if(!#result#isSet) {
-      #result#isSet = true;
       result = value;
+      #result#isSet = true;
     }
     return result;
   }
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect
index ac11cde..95a3402 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.expect
@@ -17,7 +17,10 @@
   method g() → void {}
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}();
+    #t1.{self::C::h}();
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect
index ac11cde..95a3402 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.strong.transformed.expect
@@ -17,7 +17,10 @@
   method g() → void {}
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}();
+    #t1.{self::C::h}();
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.expect
index ac11cde..95a3402 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.expect
@@ -17,7 +17,10 @@
   method g() → void {}
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}();
+    #t1.{self::C::h}();
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.transformed.expect
index ac11cde..95a3402 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.transformed.expect
@@ -17,7 +17,10 @@
   method g() → void {}
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}() in let final void #t3 = #t1.{self::C::h}() in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}();
+    #t1.{self::C::h}();
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect
index e8d7ee9..b21ab32 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.expect
@@ -35,7 +35,10 @@
   }
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")!;
+    #t1.{self::C::h}()!.{self::C::y} = 2;
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect
index e8d7ee9..b21ab32 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.strong.transformed.expect
@@ -35,7 +35,10 @@
   }
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")!;
+    #t1.{self::C::h}()!.{self::C::y} = 2;
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.expect
index e8d7ee9..b21ab32 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.expect
@@ -35,7 +35,10 @@
   }
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")!;
+    #t1.{self::C::h}()!.{self::C::y} = 2;
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.transformed.expect
index e8d7ee9..b21ab32 100644
--- a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.transformed.expect
@@ -35,7 +35,10 @@
   }
 }
 static method test(self::C x) → void {
-  let final self::C #t1 = x in let final void #t2 = #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")! in let final void #t3 = #t1.{self::C::h}()!.{self::C::y} = 2 in #t1;
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}()!.{self::D::g}().{self::D::[]}("Hi!")!;
+    #t1.{self::C::h}()!.{self::C::y} = 2;
+  } =>#t1;
 }
 static method main() → dynamic {
   self::test(new self::C::•());
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.expect
index 1e6793a..b67570c 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.expect
@@ -19,8 +19,18 @@
   return () → self::Class => self::Extension|extensionMethod(#this);
 static method main() → dynamic {
   self::Class? c;
-  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final void #t2 = #t1{self::Class}.{self::Class::method}() in #t1;
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : let final void #t4 = #t3{self::Class}.{self::Class::method}() in let final void #t5 = #t3{self::Class}.{self::Class::method}() in #t3;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : let final void #t7 = self::Extension|extensionMethod(#t6{self::Class}) in #t6;
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : let final void #t9 = self::Extension|extensionMethod(#t8{self::Class}) in let final void #t10 = self::Extension|extensionMethod(#t8{self::Class}) in #t8;
+  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t1{self::Class}.{self::Class::method}();
+  } =>#t1;
+  let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t2{self::Class}.{self::Class::method}();
+    #t2{self::Class}.{self::Class::method}();
+  } =>#t2;
+  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t3{self::Class});
+  } =>#t3;
+  let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t4{self::Class});
+    self::Extension|extensionMethod(#t4{self::Class});
+  } =>#t4;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.transformed.expect
index 1e6793a..b67570c 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.strong.transformed.expect
@@ -19,8 +19,18 @@
   return () → self::Class => self::Extension|extensionMethod(#this);
 static method main() → dynamic {
   self::Class? c;
-  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final void #t2 = #t1{self::Class}.{self::Class::method}() in #t1;
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : let final void #t4 = #t3{self::Class}.{self::Class::method}() in let final void #t5 = #t3{self::Class}.{self::Class::method}() in #t3;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : let final void #t7 = self::Extension|extensionMethod(#t6{self::Class}) in #t6;
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : let final void #t9 = self::Extension|extensionMethod(#t8{self::Class}) in let final void #t10 = self::Extension|extensionMethod(#t8{self::Class}) in #t8;
+  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t1{self::Class}.{self::Class::method}();
+  } =>#t1;
+  let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t2{self::Class}.{self::Class::method}();
+    #t2{self::Class}.{self::Class::method}();
+  } =>#t2;
+  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t3{self::Class});
+  } =>#t3;
+  let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t4{self::Class});
+    self::Extension|extensionMethod(#t4{self::Class});
+  } =>#t4;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.expect
index 1e6793a..b67570c 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.expect
@@ -19,8 +19,18 @@
   return () → self::Class => self::Extension|extensionMethod(#this);
 static method main() → dynamic {
   self::Class? c;
-  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final void #t2 = #t1{self::Class}.{self::Class::method}() in #t1;
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : let final void #t4 = #t3{self::Class}.{self::Class::method}() in let final void #t5 = #t3{self::Class}.{self::Class::method}() in #t3;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : let final void #t7 = self::Extension|extensionMethod(#t6{self::Class}) in #t6;
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : let final void #t9 = self::Extension|extensionMethod(#t8{self::Class}) in let final void #t10 = self::Extension|extensionMethod(#t8{self::Class}) in #t8;
+  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t1{self::Class}.{self::Class::method}();
+  } =>#t1;
+  let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t2{self::Class}.{self::Class::method}();
+    #t2{self::Class}.{self::Class::method}();
+  } =>#t2;
+  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t3{self::Class});
+  } =>#t3;
+  let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t4{self::Class});
+    self::Extension|extensionMethod(#t4{self::Class});
+  } =>#t4;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.transformed.expect
index 1e6793a..b67570c 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.transformed.expect
@@ -19,8 +19,18 @@
   return () → self::Class => self::Extension|extensionMethod(#this);
 static method main() → dynamic {
   self::Class? c;
-  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final void #t2 = #t1{self::Class}.{self::Class::method}() in #t1;
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : let final void #t4 = #t3{self::Class}.{self::Class::method}() in let final void #t5 = #t3{self::Class}.{self::Class::method}() in #t3;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{self::Class?} null : let final void #t7 = self::Extension|extensionMethod(#t6{self::Class}) in #t6;
-  let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{self::Class?} null : let final void #t9 = self::Extension|extensionMethod(#t8{self::Class}) in let final void #t10 = self::Extension|extensionMethod(#t8{self::Class}) in #t8;
+  let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t1{self::Class}.{self::Class::method}();
+  } =>#t1;
+  let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::Class?} null : block {
+    #t2{self::Class}.{self::Class::method}();
+    #t2{self::Class}.{self::Class::method}();
+  } =>#t2;
+  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t3{self::Class});
+  } =>#t3;
+  let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t4{self::Class});
+    self::Extension|extensionMethod(#t4{self::Class});
+  } =>#t4;
 }
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
index 5f0452d..ea9d20e 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
@@ -132,56 +132,62 @@
   return 42;
 static method warning(core::String s, core::List<core::String> l, core::Map<core::String, core::int> m) → dynamic {
   let final core::String #t2 = s in #t2.{core::String::==}(null) ?{core::int?} null : #t2.{core::String::length};
-  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : let final void #t4 = #t3.{core::String::length} in #t3;
-  let final core::String #t5 = s in #t5.{core::String::==}(null) ?{core::String} "foo" : #t5;
+  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : block {
+    #t3.{core::String::length};
+  } =>#t3;
+  let final core::String #t4 = s in #t4.{core::String::==}(null) ?{core::String} "foo" : #t4;
   s.{core::String::==}(null) ?{core::String} s = "foo" : null;
   block {
-    final core::List<core::String> #t6 = <core::String>[];
-    final core::Iterable<core::String>? #t7 = l;
-    if(!#t7.{core::Object::==}(null))
-      for (final core::String #t8 in #t7{core::Iterable<core::String>})
-        #t6.{core::List::add}(#t8);
-  } =>#t6;
+    final core::List<core::String> #t5 = <core::String>[];
+    final core::Iterable<core::String>? #t6 = l;
+    if(!#t6.{core::Object::==}(null))
+      for (final core::String #t7 in #t6{core::Iterable<core::String>})
+        #t5.{core::List::add}(#t7);
+  } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t9 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t10 = l;
-    if(!#t10.{core::Object::==}(null))
-      for (final dynamic #t11 in #t10{core::Iterable<core::String>}) {
-        final core::String #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::String;
-        #t9.{core::Set::add}(#t12);
+    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t9 = l;
+    if(!#t9.{core::Object::==}(null))
+      for (final dynamic #t10 in #t9{core::Iterable<core::String>}) {
+        final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
+        #t8.{core::Set::add}(#t11);
       }
-  } =>#t9;
+  } =>#t8;
   block {
-    final core::Set<core::String> #t13 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t14 = l;
-    if(!#t14.{core::Object::==}(null))
-      for (final core::String #t15 in #t14{core::Iterable<core::String>})
-        #t13.{core::Set::add}(#t15);
-  } =>#t13;
+    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t13 = l;
+    if(!#t13.{core::Object::==}(null))
+      for (final core::String #t14 in #t13{core::Iterable<core::String>})
+        #t12.{core::Set::add}(#t14);
+  } =>#t12;
   core::Map<core::String, core::int> b = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t17 = m;
-    if(!#t17.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t18 in #t17{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-  } =>#t16;
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t16 = m;
+    if(!#t16.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t17 in #t16{core::Map<core::String, core::int>}.{core::Map::entries})
+        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+  } =>#t15;
   block {
-    final core::Map<core::String, core::int> #t19 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t20 = m;
-    if(!#t20.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t21 in #t20{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-  } =>#t19;
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t19 = m;
+    if(!#t19.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t20 in #t19{core::Map<core::String, core::int>}.{core::Map::entries})
+        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+  } =>#t18;
   s!;
-  let final core::String #t22 = s in #t22.{core::String::==}(null) ?{core::String?} null : #t22.{core::String::substring}(0, 0);
-  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = 42;
-  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length} = #t24.{core::List::length}.{core::num::+}(42);
-  let final core::List<core::String> #t25 = l in #t25.{core::List::==}(null) ?{core::int?} null : #t25.{core::List::length}.{core::num::==}(null) ?{core::int} #t25.{core::List::length} = 42 : null;
-  let final core::String #t26 = s in #t26.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t26);
-  let final core::String #t27 = s in let final core::int #t28 = 42 in self::E|[](#t27, #t28).{core::num::==}(null) ?{core::int} self::E|[]=(#t27, #t28, 42) : null;
-  let final core::List<core::String> #t29 = l in let final core::int #t30 = 42 in #t29.{core::List::[]}(#t30).{core::String::==}(null) ?{core::String} #t29.{core::List::[]=}(#t30, "foo") : null;
-  let final core::List<core::String> #t31 = l in #t31.{core::List::length}.{core::num::==}(null) ?{core::int} #t31.{core::List::length} = 42 : null;
-  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t33 = #t32.{core::List::length} = 42 in #t32;
-  let final core::List<core::String> #t34 = l in #t34.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t35 = let final core::List<core::String> #t36 = #t34 in #t36.{core::List::length}.{core::num::==}(null) ?{core::int} #t36.{core::List::length} = 42 : null in #t34;
+  let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
+  let final core::List<core::String> #t22 = l in #t22.{core::List::==}(null) ?{core::int?} null : #t22.{core::List::length} = 42;
+  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = #t23.{core::List::length}.{core::num::+}(42);
+  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length}.{core::num::==}(null) ?{core::int} #t24.{core::List::length} = 42 : null;
+  let final core::String #t25 = s in #t25.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t25);
+  let final core::String #t26 = s in let final core::int #t27 = 42 in self::E|[](#t26, #t27).{core::num::==}(null) ?{core::int} self::E|[]=(#t26, #t27, 42) : null;
+  let final core::List<core::String> #t28 = l in let final core::int #t29 = 42 in #t28.{core::List::[]}(#t29).{core::String::==}(null) ?{core::String} #t28.{core::List::[]=}(#t29, "foo") : null;
+  let final core::List<core::String> #t30 = l in #t30.{core::List::length}.{core::num::==}(null) ?{core::int} #t30.{core::List::length} = 42 : null;
+  let final core::List<core::String> #t31 = l in #t31.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    #t31.{core::List::length} = 42;
+  } =>#t31;
+  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    let final core::List<core::String> #t33 = #t32 in #t33.{core::List::length}.{core::num::==}(null) ?{core::int} #t33.{core::List::length} = 42 : null;
+  } =>#t32;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index 2e60ba3..301af59 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -132,77 +132,83 @@
   return 42;
 static method warning(core::String s, core::List<core::String> l, core::Map<core::String, core::int> m) → dynamic {
   let final core::String #t2 = s in #t2.{core::String::==}(null) ?{core::int?} null : #t2.{core::String::length};
-  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : let final void #t4 = #t3.{core::String::length} in #t3;
-  let final core::String #t5 = s in #t5.{core::String::==}(null) ?{core::String} "foo" : #t5;
+  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : block {
+    #t3.{core::String::length};
+  } =>#t3;
+  let final core::String #t4 = s in #t4.{core::String::==}(null) ?{core::String} "foo" : #t4;
   s.{core::String::==}(null) ?{core::String} s = "foo" : null;
   block {
-    final core::List<core::String> #t6 = <core::String>[];
-    final core::Iterable<core::String>? #t7 = l;
-    if(!#t7.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t7{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::List<core::String> #t5 = <core::String>[];
+    final core::Iterable<core::String>? #t6 = l;
+    if(!#t6.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t6{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::String #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t6.{core::List::add}(#t8);
+        final core::String #t7 = :sync-for-iterator.{core::Iterator::current};
+        #t5.{core::List::add}(#t7);
       }
     }
-  } =>#t6;
+  } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t9 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t10 = l;
-    if(!#t10.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t10{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t9 = l;
+    if(!#t9.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t9{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::String;
-          #t9.{core::Set::add}(#t12);
+          final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
+          #t8.{core::Set::add}(#t11);
         }
       }
     }
-  } =>#t9;
+  } =>#t8;
   block {
-    final core::Set<core::String> #t13 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t14 = l;
-    if(!#t14.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t14{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t13 = l;
+    if(!#t13.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::String #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::Set::add}(#t15);
+        final core::String #t14 = :sync-for-iterator.{core::Iterator::current};
+        #t12.{core::Set::add}(#t14);
       }
     }
-  } =>#t13;
+  } =>#t12;
   core::Map<core::String, core::int> b = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t17 = m;
-    if(!#t17.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t17{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t16 = m;
+    if(!#t16.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t16{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String, core::int> #t18 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
+        final core::MapEntry<core::String, core::int> #t17 = :sync-for-iterator.{core::Iterator::current};
+        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
-  } =>#t16;
+  } =>#t15;
   block {
-    final core::Map<core::String, core::int> #t19 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t20 = m;
-    if(!#t20.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t20{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t19 = m;
+    if(!#t19.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t19{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String, core::int> #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        final core::MapEntry<core::String, core::int> #t20 = :sync-for-iterator.{core::Iterator::current};
+        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
       }
     }
-  } =>#t19;
+  } =>#t18;
   s!;
-  let final core::String #t22 = s in #t22.{core::String::==}(null) ?{core::String?} null : #t22.{core::String::substring}(0, 0);
-  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = 42;
-  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length} = #t24.{core::List::length}.{core::num::+}(42);
-  let final core::List<core::String> #t25 = l in #t25.{core::List::==}(null) ?{core::int?} null : #t25.{core::List::length}.{core::num::==}(null) ?{core::int} #t25.{core::List::length} = 42 : null;
-  let final core::String #t26 = s in #t26.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t26);
-  let final core::String #t27 = s in let final core::int #t28 = 42 in self::E|[](#t27, #t28).{core::num::==}(null) ?{core::int} self::E|[]=(#t27, #t28, 42) : null;
-  let final core::List<core::String> #t29 = l in let final core::int #t30 = 42 in #t29.{core::List::[]}(#t30).{core::String::==}(null) ?{core::String} #t29.{core::List::[]=}(#t30, "foo") : null;
-  let final core::List<core::String> #t31 = l in #t31.{core::List::length}.{core::num::==}(null) ?{core::int} #t31.{core::List::length} = 42 : null;
-  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t33 = #t32.{core::List::length} = 42 in #t32;
-  let final core::List<core::String> #t34 = l in #t34.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t35 = let final core::List<core::String> #t36 = #t34 in #t36.{core::List::length}.{core::num::==}(null) ?{core::int} #t36.{core::List::length} = 42 : null in #t34;
+  let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
+  let final core::List<core::String> #t22 = l in #t22.{core::List::==}(null) ?{core::int?} null : #t22.{core::List::length} = 42;
+  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = #t23.{core::List::length}.{core::num::+}(42);
+  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length}.{core::num::==}(null) ?{core::int} #t24.{core::List::length} = 42 : null;
+  let final core::String #t25 = s in #t25.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t25);
+  let final core::String #t26 = s in let final core::int #t27 = 42 in self::E|[](#t26, #t27).{core::num::==}(null) ?{core::int} self::E|[]=(#t26, #t27, 42) : null;
+  let final core::List<core::String> #t28 = l in let final core::int #t29 = 42 in #t28.{core::List::[]}(#t29).{core::String::==}(null) ?{core::String} #t28.{core::List::[]=}(#t29, "foo") : null;
+  let final core::List<core::String> #t30 = l in #t30.{core::List::length}.{core::num::==}(null) ?{core::int} #t30.{core::List::length} = 42 : null;
+  let final core::List<core::String> #t31 = l in #t31.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    #t31.{core::List::length} = 42;
+  } =>#t31;
+  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    let final core::List<core::String> #t33 = #t32 in #t33.{core::List::length}.{core::num::==}(null) ?{core::int} #t33.{core::List::length} = 42 : null;
+  } =>#t32;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
index 5f0452d..ea9d20e 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
@@ -132,56 +132,62 @@
   return 42;
 static method warning(core::String s, core::List<core::String> l, core::Map<core::String, core::int> m) → dynamic {
   let final core::String #t2 = s in #t2.{core::String::==}(null) ?{core::int?} null : #t2.{core::String::length};
-  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : let final void #t4 = #t3.{core::String::length} in #t3;
-  let final core::String #t5 = s in #t5.{core::String::==}(null) ?{core::String} "foo" : #t5;
+  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : block {
+    #t3.{core::String::length};
+  } =>#t3;
+  let final core::String #t4 = s in #t4.{core::String::==}(null) ?{core::String} "foo" : #t4;
   s.{core::String::==}(null) ?{core::String} s = "foo" : null;
   block {
-    final core::List<core::String> #t6 = <core::String>[];
-    final core::Iterable<core::String>? #t7 = l;
-    if(!#t7.{core::Object::==}(null))
-      for (final core::String #t8 in #t7{core::Iterable<core::String>})
-        #t6.{core::List::add}(#t8);
-  } =>#t6;
+    final core::List<core::String> #t5 = <core::String>[];
+    final core::Iterable<core::String>? #t6 = l;
+    if(!#t6.{core::Object::==}(null))
+      for (final core::String #t7 in #t6{core::Iterable<core::String>})
+        #t5.{core::List::add}(#t7);
+  } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t9 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t10 = l;
-    if(!#t10.{core::Object::==}(null))
-      for (final dynamic #t11 in #t10{core::Iterable<core::String>}) {
-        final core::String #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::String;
-        #t9.{core::Set::add}(#t12);
+    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t9 = l;
+    if(!#t9.{core::Object::==}(null))
+      for (final dynamic #t10 in #t9{core::Iterable<core::String>}) {
+        final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
+        #t8.{core::Set::add}(#t11);
       }
-  } =>#t9;
+  } =>#t8;
   block {
-    final core::Set<core::String> #t13 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t14 = l;
-    if(!#t14.{core::Object::==}(null))
-      for (final core::String #t15 in #t14{core::Iterable<core::String>})
-        #t13.{core::Set::add}(#t15);
-  } =>#t13;
+    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t13 = l;
+    if(!#t13.{core::Object::==}(null))
+      for (final core::String #t14 in #t13{core::Iterable<core::String>})
+        #t12.{core::Set::add}(#t14);
+  } =>#t12;
   core::Map<core::String, core::int> b = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t17 = m;
-    if(!#t17.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t18 in #t17{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-  } =>#t16;
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t16 = m;
+    if(!#t16.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t17 in #t16{core::Map<core::String, core::int>}.{core::Map::entries})
+        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+  } =>#t15;
   block {
-    final core::Map<core::String, core::int> #t19 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t20 = m;
-    if(!#t20.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t21 in #t20{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-  } =>#t19;
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t19 = m;
+    if(!#t19.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t20 in #t19{core::Map<core::String, core::int>}.{core::Map::entries})
+        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+  } =>#t18;
   s!;
-  let final core::String #t22 = s in #t22.{core::String::==}(null) ?{core::String?} null : #t22.{core::String::substring}(0, 0);
-  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = 42;
-  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length} = #t24.{core::List::length}.{core::num::+}(42);
-  let final core::List<core::String> #t25 = l in #t25.{core::List::==}(null) ?{core::int?} null : #t25.{core::List::length}.{core::num::==}(null) ?{core::int} #t25.{core::List::length} = 42 : null;
-  let final core::String #t26 = s in #t26.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t26);
-  let final core::String #t27 = s in let final core::int #t28 = 42 in self::E|[](#t27, #t28).{core::num::==}(null) ?{core::int} self::E|[]=(#t27, #t28, 42) : null;
-  let final core::List<core::String> #t29 = l in let final core::int #t30 = 42 in #t29.{core::List::[]}(#t30).{core::String::==}(null) ?{core::String} #t29.{core::List::[]=}(#t30, "foo") : null;
-  let final core::List<core::String> #t31 = l in #t31.{core::List::length}.{core::num::==}(null) ?{core::int} #t31.{core::List::length} = 42 : null;
-  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t33 = #t32.{core::List::length} = 42 in #t32;
-  let final core::List<core::String> #t34 = l in #t34.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t35 = let final core::List<core::String> #t36 = #t34 in #t36.{core::List::length}.{core::num::==}(null) ?{core::int} #t36.{core::List::length} = 42 : null in #t34;
+  let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
+  let final core::List<core::String> #t22 = l in #t22.{core::List::==}(null) ?{core::int?} null : #t22.{core::List::length} = 42;
+  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = #t23.{core::List::length}.{core::num::+}(42);
+  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length}.{core::num::==}(null) ?{core::int} #t24.{core::List::length} = 42 : null;
+  let final core::String #t25 = s in #t25.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t25);
+  let final core::String #t26 = s in let final core::int #t27 = 42 in self::E|[](#t26, #t27).{core::num::==}(null) ?{core::int} self::E|[]=(#t26, #t27, 42) : null;
+  let final core::List<core::String> #t28 = l in let final core::int #t29 = 42 in #t28.{core::List::[]}(#t29).{core::String::==}(null) ?{core::String} #t28.{core::List::[]=}(#t29, "foo") : null;
+  let final core::List<core::String> #t30 = l in #t30.{core::List::length}.{core::num::==}(null) ?{core::int} #t30.{core::List::length} = 42 : null;
+  let final core::List<core::String> #t31 = l in #t31.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    #t31.{core::List::length} = 42;
+  } =>#t31;
+  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    let final core::List<core::String> #t33 = #t32 in #t33.{core::List::length}.{core::num::==}(null) ?{core::int} #t33.{core::List::length} = 42 : null;
+  } =>#t32;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index 2e60ba3..301af59 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -132,77 +132,83 @@
   return 42;
 static method warning(core::String s, core::List<core::String> l, core::Map<core::String, core::int> m) → dynamic {
   let final core::String #t2 = s in #t2.{core::String::==}(null) ?{core::int?} null : #t2.{core::String::length};
-  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : let final void #t4 = #t3.{core::String::length} in #t3;
-  let final core::String #t5 = s in #t5.{core::String::==}(null) ?{core::String} "foo" : #t5;
+  let final core::String #t3 = s in #t3.{core::String::==}(null) ?{core::String} null : block {
+    #t3.{core::String::length};
+  } =>#t3;
+  let final core::String #t4 = s in #t4.{core::String::==}(null) ?{core::String} "foo" : #t4;
   s.{core::String::==}(null) ?{core::String} s = "foo" : null;
   block {
-    final core::List<core::String> #t6 = <core::String>[];
-    final core::Iterable<core::String>? #t7 = l;
-    if(!#t7.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t7{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::List<core::String> #t5 = <core::String>[];
+    final core::Iterable<core::String>? #t6 = l;
+    if(!#t6.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t6{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::String #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t6.{core::List::add}(#t8);
+        final core::String #t7 = :sync-for-iterator.{core::Iterator::current};
+        #t5.{core::List::add}(#t7);
       }
     }
-  } =>#t6;
+  } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t9 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t10 = l;
-    if(!#t10.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t10{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t9 = l;
+    if(!#t9.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t9{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::String;
-          #t9.{core::Set::add}(#t12);
+          final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
+          #t8.{core::Set::add}(#t11);
         }
       }
     }
-  } =>#t9;
+  } =>#t8;
   block {
-    final core::Set<core::String> #t13 = col::LinkedHashSet::•<core::String>();
-    final core::Iterable<core::String>? #t14 = l;
-    if(!#t14.{core::Object::==}(null)) {
-      core::Iterator<core::String> :sync-for-iterator = #t14{core::Iterable<core::String>}.{core::Iterable::iterator};
+    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t13 = l;
+    if(!#t13.{core::Object::==}(null)) {
+      core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::String #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::Set::add}(#t15);
+        final core::String #t14 = :sync-for-iterator.{core::Iterator::current};
+        #t12.{core::Set::add}(#t14);
       }
     }
-  } =>#t13;
+  } =>#t12;
   core::Map<core::String, core::int> b = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t17 = m;
-    if(!#t17.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t17{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t16 = m;
+    if(!#t16.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t16{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String, core::int> #t18 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
+        final core::MapEntry<core::String, core::int> #t17 = :sync-for-iterator.{core::Iterator::current};
+        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
-  } =>#t16;
+  } =>#t15;
   block {
-    final core::Map<core::String, core::int> #t19 = <core::String, core::int>{};
-    final core::Map<core::String, core::int>? #t20 = m;
-    if(!#t20.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t20{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t19 = m;
+    if(!#t19.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t19{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String, core::int> #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t19.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        final core::MapEntry<core::String, core::int> #t20 = :sync-for-iterator.{core::Iterator::current};
+        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
       }
     }
-  } =>#t19;
+  } =>#t18;
   s!;
-  let final core::String #t22 = s in #t22.{core::String::==}(null) ?{core::String?} null : #t22.{core::String::substring}(0, 0);
-  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = 42;
-  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length} = #t24.{core::List::length}.{core::num::+}(42);
-  let final core::List<core::String> #t25 = l in #t25.{core::List::==}(null) ?{core::int?} null : #t25.{core::List::length}.{core::num::==}(null) ?{core::int} #t25.{core::List::length} = 42 : null;
-  let final core::String #t26 = s in #t26.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t26);
-  let final core::String #t27 = s in let final core::int #t28 = 42 in self::E|[](#t27, #t28).{core::num::==}(null) ?{core::int} self::E|[]=(#t27, #t28, 42) : null;
-  let final core::List<core::String> #t29 = l in let final core::int #t30 = 42 in #t29.{core::List::[]}(#t30).{core::String::==}(null) ?{core::String} #t29.{core::List::[]=}(#t30, "foo") : null;
-  let final core::List<core::String> #t31 = l in #t31.{core::List::length}.{core::num::==}(null) ?{core::int} #t31.{core::List::length} = 42 : null;
-  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t33 = #t32.{core::List::length} = 42 in #t32;
-  let final core::List<core::String> #t34 = l in #t34.{core::List::==}(null) ?{core::List<core::String>} null : let final void #t35 = let final core::List<core::String> #t36 = #t34 in #t36.{core::List::length}.{core::num::==}(null) ?{core::int} #t36.{core::List::length} = 42 : null in #t34;
+  let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
+  let final core::List<core::String> #t22 = l in #t22.{core::List::==}(null) ?{core::int?} null : #t22.{core::List::length} = 42;
+  let final core::List<core::String> #t23 = l in #t23.{core::List::==}(null) ?{core::int?} null : #t23.{core::List::length} = #t23.{core::List::length}.{core::num::+}(42);
+  let final core::List<core::String> #t24 = l in #t24.{core::List::==}(null) ?{core::int?} null : #t24.{core::List::length}.{core::num::==}(null) ?{core::int} #t24.{core::List::length} = 42 : null;
+  let final core::String #t25 = s in #t25.{core::String::==}(null) ?{core::int?} null : self::E|get#foo(#t25);
+  let final core::String #t26 = s in let final core::int #t27 = 42 in self::E|[](#t26, #t27).{core::num::==}(null) ?{core::int} self::E|[]=(#t26, #t27, 42) : null;
+  let final core::List<core::String> #t28 = l in let final core::int #t29 = 42 in #t28.{core::List::[]}(#t29).{core::String::==}(null) ?{core::String} #t28.{core::List::[]=}(#t29, "foo") : null;
+  let final core::List<core::String> #t30 = l in #t30.{core::List::length}.{core::num::==}(null) ?{core::int} #t30.{core::List::length} = 42 : null;
+  let final core::List<core::String> #t31 = l in #t31.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    #t31.{core::List::length} = 42;
+  } =>#t31;
+  let final core::List<core::String> #t32 = l in #t32.{core::List::==}(null) ?{core::List<core::String>} null : block {
+    let final core::List<core::String> #t33 = #t32 in #t33.{core::List::length}.{core::num::==}(null) ?{core::int} #t33.{core::List::length} = 42 : null;
+  } =>#t32;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.expect
index f5cfaf9..8dc052e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.expect
@@ -33,8 +33,10 @@
   late core::int local = 42;
   core::String? s = null;
   dynamic c;
-  let final dynamic #t1 = c in #t1.{core::Object::==}(null) ?{dynamic} null : let final void #t2 = #t1.f in #t1;
-  let final dynamic #t3 = c in #t3.{core::Object::==}(null) ?{dynamic} null : #t3.[](0);
+  let final dynamic #t1 = c in #t1.{core::Object::==}(null) ?{dynamic} null : block {
+    #t1.f;
+  } =>#t1;
+  let final dynamic #t2 = c in #t2.{core::Object::==}(null) ?{dynamic} null : #t2.[](0);
 }
 
 library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.transformed.expect
index f5cfaf9..8dc052e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.transformed.expect
@@ -33,8 +33,10 @@
   late core::int local = 42;
   core::String? s = null;
   dynamic c;
-  let final dynamic #t1 = c in #t1.{core::Object::==}(null) ?{dynamic} null : let final void #t2 = #t1.f in #t1;
-  let final dynamic #t3 = c in #t3.{core::Object::==}(null) ?{dynamic} null : #t3.[](0);
+  let final dynamic #t1 = c in #t1.{core::Object::==}(null) ?{dynamic} null : block {
+    #t1.f;
+  } =>#t1;
+  let final dynamic #t2 = c in #t2.{core::Object::==}(null) ?{dynamic} null : #t2.[](0);
 }
 
 library;
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
index 5c396a9..af9230d 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
@@ -23,5 +23,7 @@
   self::A* a = new self::A::•();
   function f(dynamic x) → dynamic
     return x;
-  let final self::A* #t1 = a in let final void #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+  let final self::A* #t1 = a in block {
+    #t1.{self::A::add}(f).call("WHAT");
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
index 5c396a9..af9230d 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
@@ -23,5 +23,7 @@
   self::A* a = new self::A::•();
   function f(dynamic x) → dynamic
     return x;
-  let final self::A* #t1 = a in let final void #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+  let final self::A* #t1 = a in block {
+    #t1.{self::A::add}(f).call("WHAT");
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect
index 8b4190c..10e6c4d 100644
--- a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect
@@ -14,5 +14,7 @@
 static method main() → dynamic {
   let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
   math..toString();
-  ^^^^" in let final void #t2 = #t1.{core::Object::toString}() in #t1;
+  ^^^^" in block {
+    #t1.{core::Object::toString}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
index 8b4190c..10e6c4d 100644
--- a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
@@ -14,5 +14,7 @@
 static method main() → dynamic {
   let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
   math..toString();
-  ^^^^" in let final void #t2 = #t1.{core::Object::toString}() in #t1;
+  ^^^^" in block {
+    #t1.{core::Object::toString}();
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 288ca73..6fec5fe 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -139,6 +139,8 @@
 late_lowering/issue40373b: FormatterCrash
 late_lowering/issue40805: FormatterCrash
 late_lowering/issue41436b: FormatterCrash
+late_lowering/issue41922: FormatterCrash
+late_lowering/late_annotations: FormatterCrash
 late_lowering/late_field_inference: FormatterCrash
 late_lowering/late_field_with_initializer: FormatterCrash
 late_lowering/late_field_without_initializer: FormatterCrash
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index b778934..7a8b245 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -466,6 +466,9 @@
     List<int> index = <int>[];
     while (_byteOffset > 0) {
       int size = readUint32();
+      if (size <= 0) {
+        throw fail("invalid size '$size' reported at offset $byteOffset");
+      }
       int start = _byteOffset - size;
       if (start < 0) {
         throw fail("indicated size does not match file size");
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 78cd33e..4a5614a 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -75,7 +75,7 @@
 
   TreeNode currentParent;
 
-  TreeNode get context => currentMember ?? currentClass;
+  TreeNode get currentClassOrMember => currentMember ?? currentClass;
 
   static void check(Component component, {bool isOutline, bool afterConst}) {
     component.accept(
@@ -104,7 +104,7 @@
   }
 
   problem(TreeNode node, String details, {TreeNode context}) {
-    context ??= this.context;
+    context ??= currentClassOrMember;
     throw new VerificationError(context, node, details);
   }
 
diff --git a/pkg/kernel/test/binary/invalid_index_size.dart b/pkg/kernel/test/binary/invalid_index_size.dart
new file mode 100644
index 0000000..46f9bc4
--- /dev/null
+++ b/pkg/kernel/test/binary/invalid_index_size.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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:kernel/binary/ast_from_binary.dart' show ParseError;
+
+import 'utils.dart';
+
+main() {
+  Library lib1 = new Library(Uri.parse("foo://bar.dart"));
+  Component c1 = new Component(libraries: [lib1]);
+  List<int> serialized = serializeComponent(c1);
+  // The last 4 bytes is the size entry in the index. Overwrite that with 0's.
+  for (int i = serialized.length - 4; i < serialized.length; i++) {
+    serialized[i] = 0;
+  }
+  bool gotExpectedException = false;
+  try {
+    loadComponentFromBytes(serialized);
+    throw "The above line should have thrown.";
+  } on ParseError catch (e) {
+    if (e.toString().contains("invalid size")) {
+      gotExpectedException = true;
+    }
+  }
+  if (!gotExpectedException) {
+    throw "Didn't get the right exception!";
+  }
+}
diff --git a/pkg/nnbd_migration/README.md b/pkg/nnbd_migration/README.md
index 4e46dd6..f777eee 100644
--- a/pkg/nnbd_migration/README.md
+++ b/pkg/nnbd_migration/README.md
@@ -1,85 +1,138 @@
 # Null Safety Migration Tooling
 
-Note: the null safety migration tooling and workflow is in an early state;
-this doc will be updated as the steps and workflow are simplified.
+Note: the null safety migration tooling is in an early state and may have bugs
+and other issues.
 
-## Building the NNBD sdk
+For best results, use SDK version 2.9.0-10.0.dev or higher.
 
-In order to run the tool currently you have to be able to build your own copy
-of the Dart SDK.
+## How Migration Works
 
-To do this, run:
+The migration uses a _new interactive algorithm_ designed specifically for Dart
+null safety.
 
-```
-./tools/build.py -mrelease --nnbd create_sdk
+Typical code migration tools are designed to be run once, handle most cases, and
+let the developer do manual cleanup on the result. This does **not work well**
+for Null-Safety and attempting this workflow will result in a lot more manual
+work. Similarly, after your migration has been applied, the migration **cannot
+be rerun** without first reverting it.
+
+### Why does the interactive approach save so much time?
+
+Remember that Dart already has nullable types. Every type in old Dart code is
+nullable! What old Dart lacks is _non-null_ types.
+
+And like most migrations, our tool tries to preserve your code's current
+behavior. In the case of null safety, we may mark a lot of your types as
+nullable -- because they really were nullable before.
+
+Nulls are traced through your program as far as they can go, and types are
+marked nullable in this process. If the tool makes a single mistake or choice
+you disagree with, it can lead many excess nullable types.
+
+### Interactive feedback to the tool
+
+Unintentional null is the top cause of crashes in Dart programs. By marking your
+intention with comments like `/*?*/` and `/*!*/`, we can stop these
+unintentional nulls from spreading through your program in your migrated code.
+Adding a small number of these hints will have a huge impact on migration
+quality.
+
+The high level workflow of the tool is therefore driven through an interactive
+web UI. After running `dart migrate`, open the resulting url in a browser. Scan
+through the changes, use the "nullability trace" feature to find the best place
+to add a nullability hint (adding a hint in the best place can prevent dozens of
+types from being made nullable). Rerun the migration and repeat, committing the
+hints as you go. When the output is correct and acceptable, apply the migration
+and publish your null safe code!
+
+For example,
+
+```dart
+List<int> ints = const [0, null];
+int zero = ints[0];
+int one = zero + 1;
+List<int> zeroOne = [zero, one];
 ```
 
-The NNBD sdk now lives under the ReleaseX64NNBD sub-directory of your build
-directory, e.g.
+The default migration will be backwards compatible, but not ideal.
 
+```dart
+List<int?> ints = const [0, null];
+int? zero = ints[0];
+int one = zero! + 1;
+List<int?> zeroOne = <int?>[zero, one];
 ```
-xcodebuild/ReleaseX64NNBD/dart-sdk/
+
+`zero` should not be marked nullable, but it is. We then have cascading quality
+issues, such as null-checking a value that shouldn't have been marked null, and
+marking other variables as null due to deep null tracing. We can fix this all by
+adding a single `/*!*/` hint.
+
+```dart
+List<int?> ints = const [0, null];
+int/*?*/ zero = ints[0]!; // Just add /*?*/ here, the migration tool does the rest!
+int one = zero + 1;
+List<int> zeroOne = <int>[zero, one];
 ```
 
+If you add one hint before migrating, you have done the equivalent of making
+five manual edits after migrating. To find the best place to put your hints, use
+the preview tool's nullability trace feature. This lets you trace back up to the
+root cause of any type's inferred nullability. Add hints as close to the
+original source of null as possible to have the biggest impact to the migration.
+
+**Note**: The migration tool **cannot be rerun on a migrated codebase.** At
+that point in time, every nullable and non-nullable type is indistinguishable
+from an **intentionally** nullable or non-nullable type. The opportunity to
+change large numbers of types for you at once without also accidentally changing
+your intent has been lost. A long migration effort (such as one on a large
+project) can be done incrementally, by committing these hints over time.
+
 ## Migrating a package
 
-- build a NNBD version of the SDK (see above)
 - select a package to work on
-- in that package, edit the `analysis_options.yaml` to enable the NNBD
-  experiment from the POV of the analyzer:
-```yaml
-analyzer:
-  enable-experiment:
-    - non-nullable
-```
-- run `pub get` for the package (and, verify that the
-  `.dart_tool/package_config.json` file was created)
+- run `pub get` for the package
 
 Then, run the migration tool from the top-level of the package directory:
 
 ```
-<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
+dart migrate
 ```
 
-The migration tool will run, print the proposed changes to the console, and
-display a url for the preview tool. Open that url from a browser to see a rich
-preview of the proposed null safety changes.
+The migration tool will run and display a url for the web UI. Open that url from
+a browser to view, analyze, and improve the proposed null-safe migration.
 
 ## Using the tool
 
 1. Run the tool (see above).
-2. Once analysis and migration suggestions are complete, open the indicated url
-in a browser.
-3. Start with an important or interesting file in your package on the left
-side by clicking on it.
+2. Once analysis and migration is complete, open the indicated url in a browser.
+3. Start with an important or interesting file in your package on the left side
+   by clicking on it.
 4. Look at the proposed edits in the upper right, and click on them in turn.
 5. If you see an edit that looks wrong:
     1. Use the "trace view" in the bottom right to find the root cause
-    2. Go to your editor and make a change to the original file by adding a hint
-    (`String foo` ==> `String/*!*/ foo`) or making other changes as needed.
-    3. You can have the migration tool perform this itself, although right now
-       for large packages this takes a prohibitively long time.
-       1. ***Warning: DO NOT mix edits in your editor and edits applied by the
-       migration tool. We have not yet written the necessary logic to
-       prevent the migration tool from clobbering files edited while the
-       preview tool is running.*** 
-       2. To try this, from the 'Edit Details' area in the bottom right select
-       the `Force type to be non-nullable` or `Force type to be nullable`
-       links. These will add the indicated hints on disk and recompute the
-       migration suggestions. 
-6. After some edits are complete, control-C the migration and rerun it.  If
-some things are still wrong, return to step 5.
-7. Once all edits are complete and you've rerun migration and are satisfied with
-the output:
+    2. Either click on an "add hint" button to correct it at the root, or open
+       your editor and make the change manually.
+        1. Some changes are as simple as adding a `/*!*/` hint on a type. The
+           tool has buttons to do this for you.
+        2. Others may require larger refactors. These changes can be made in
+           your editor, and may often be committed and published immediately.
+    3. Periodically rerun the migration and repeat.
+6. Once you are satisfied with the proposed migration:
     1. Save your work using git or other means. Applying the migration will
-    overwrite the existing files on disk.
-    2. Rerun the migration with `--apply-changes`, or click the
-    `Apply Migration` button in the interface.
-8. Remove any SDK constraint in your pubspec.yaml.
-9. Remove any opt-out comments in your library files (e.g.:  `// @dart = 2.6`).
-10. Rerun `pub get` and test your package.
+       overwrite the existing files on disk.
+    2. Rerun the migration by clicking the `Apply Migration` button in the
+       interface.
+    3. Tip: leaving the web UI open may help you if you later have test failures
+       or analysis errors.
+7. Rerun `pub get` and test your package.
+    1. If a test fails, you may still use the preview to help you figure out
+       what went wrong.
+    2. If large changes are required, revert the migration, and go back to step
+       one.
+8. Commit and/or publish your migrated null-safe code
 
 ## Providing feedback
 
 Please file issues at https://github.com/dart-lang/sdk/issues, and reference the
-`analyzer-nnbd-migration` label (you may not be able to apply the label yourself). 
+`analyzer-nnbd-migration` label (you may not be able to apply the label yourself).
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index 88df6f6..a313f3c 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:convert' show jsonDecode;
 import 'dart:io' hide File;
 
 import 'package:analyzer/dart/analysis/results.dart';
@@ -46,6 +47,7 @@
   static const ignoreErrorsFlag = 'ignore-errors';
   static const previewPortOption = 'preview-port';
   static const sdkPathOption = 'sdk-path';
+  static const skipPubOutdatedFlag = 'skip-pub-outdated';
   static const summaryOption = 'summary';
   static const verboseFlag = 'verbose';
   static const webPreviewFlag = 'web-preview';
@@ -60,6 +62,8 @@
 
   final String sdkPath;
 
+  final bool skipPubOutdated;
+
   final String summary;
 
   final bool webPreview;
@@ -70,10 +74,103 @@
       @required this.ignoreErrors,
       @required this.previewPort,
       @required this.sdkPath,
+      @required this.skipPubOutdated,
       @required this.summary,
       @required this.webPreview});
 }
 
+@visibleForTesting
+class DependencyChecker {
+  final Context _pathContext;
+  final Logger _logger;
+  final ProcessManager _processManager;
+
+  DependencyChecker(this._pathContext, this._logger, this._processManager);
+
+  bool check() {
+    var pubPath = _pathContext.join(getSdkPath(), 'bin', 'pub');
+    var result = _processManager
+        .runSync(pubPath, ['outdated', '--mode=null-safety', '--json']);
+
+    var preNullSafetyPackages = <String, String>{};
+    try {
+      if ((result.stderr as String).isNotEmpty) {
+        throw FormatException(
+            '`pub outdated --mode=null-safety` exited with exit code '
+            '${result.exitCode} and stderr:\n\n${result.stderr}');
+      }
+      var outdatedOutput = jsonDecode(result.stdout as String);
+      var outdatedMap = _expectType<Map>(outdatedOutput, 'root');
+      var packageList = _expectType<List>(outdatedMap['packages'], 'packages');
+      for (var package_ in packageList) {
+        var package = _expectType<Map>(package_, '');
+        var current_ = _expectKey(package, 'current');
+        if (current_ == null) {
+          continue;
+        }
+        var current = _expectType<Map>(current_, 'current');
+        if (_expectType<bool>(current['nullSafety'], 'nullSafety')) {
+          // For whatever reason, there is no "current" version of this package.
+          // TODO(srawlins): We may want to report this to the user. But it may
+          // be inconsequential.
+          continue;
+        }
+
+        _expectKey(package, 'package');
+        _expectKey(current, 'version');
+        var name = _expectType<String>(package['package'], 'package');
+        // A version will be given, even if a package was provided with a local
+        // or git path.
+        var version = _expectType<String>(current['version'], 'version');
+        preNullSafetyPackages[name] = version;
+      }
+    } on FormatException catch (e) {
+      _logger.stderr('Warning: ${e.message}');
+      // Allow the program to continue; users should be allowed to attempt to
+      // migrate when `pub outdated` is misbehaving, or if there is a bug above.
+    }
+    if (preNullSafetyPackages.isNotEmpty) {
+      _logger.stderr(
+          'Warning: dependencies are outdated. The version(s) of one or more '
+          'packages currently checked out have not yet migrated to the Null '
+          'Safety feature.');
+      _logger.stderr('');
+      for (var package in preNullSafetyPackages.entries) {
+        _logger.stderr(
+            '    ${package.key}, currently at version ${package.value}');
+      }
+      _logger.stderr('');
+      _logger.stderr('It is highly recommended to upgrade all dependencies to '
+          'versions which have migrated. Use `pub outdated --mode=null-safety` '
+          'to check the status of dependencies. Visit '
+          'https://dart.dev/tools/pub/cmd/pub-outdated for more information.');
+      _logger.stderr('');
+      _logger.stderr('Force migration with --skip-outdated-dependencies-check '
+          '(not recommended)');
+      return false;
+    }
+    return true;
+  }
+
+  dynamic _expectKey(Map<Object, Object> map, String key) {
+    if (map.containsKey(key)) {
+      return map[key];
+    }
+    throw FormatException(
+        'Unexpected `pub outdated` JSON output: missing key ($key)', map);
+  }
+
+  T _expectType<T>(Object object, String errorKey) {
+    if (object is T) {
+      return object;
+    }
+    throw FormatException(
+        'Unexpected `pub outdated` JSON output: expected a '
+        '$T at "$errorKey", but got a ${object.runtimeType}',
+        object);
+  }
+}
+
 class MigrateCommand extends Command<dynamic> {
   final bool verbose;
 
@@ -118,6 +215,11 @@
   /// user.  Used in testing to allow user feedback messages to be tested.
   final Logger Function(bool isVerbose) loggerFactory;
 
+  /// Process manager that should be used to run processes. Used in testing to
+  /// redirect to mock processes.
+  @visibleForTesting
+  final ProcessManager processManager;
+
   /// Resource provider that should be used to access the filesystem.  Used in
   /// testing to redirect to an in-memory filesystem.
   final ResourceProvider resourceProvider;
@@ -145,7 +247,8 @@
       {@required this.binaryName,
       @visibleForTesting this.loggerFactory = _defaultLoggerFactory,
       @visibleForTesting this.defaultSdkPathOverride,
-      @visibleForTesting ResourceProvider resourceProvider})
+      @visibleForTesting ResourceProvider resourceProvider,
+      @visibleForTesting this.processManager = const ProcessManager.system()})
       : logger = loggerFactory(false),
         resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE;
@@ -217,6 +320,8 @@
           sdkPath: argResults[CommandLineOptions.sdkPathOption] as String ??
               defaultSdkPathOverride ??
               getSdkPath(),
+          skipPubOutdated:
+              argResults[CommandLineOptions.skipPubOutdatedFlag] as bool,
           summary: argResults[CommandLineOptions.summaryOption] as String,
           webPreview: webPreview);
       if (isVerbose) {
@@ -247,6 +352,10 @@
   void run(ArgResults argResults, {bool isVerbose}) async {
     decodeCommandLineArgs(argResults, isVerbose: isVerbose);
     if (exitCode != null) return;
+    if (!options.skipPubOutdated) {
+      _checkDependencies();
+    }
+    if (exitCode != null) return;
 
     logger.stdout('Migrating ${options.directory}');
     logger.stdout('');
@@ -370,6 +479,14 @@
     }
   }
 
+  void _checkDependencies() {
+    var successful =
+        DependencyChecker(pathContext, logger, processManager).check();
+    if (!successful) {
+      exitCode = 1;
+    }
+  }
+
   void _checkForErrors() {
     if (fileErrors.isEmpty) {
       logger.stdout('No analysis issues found.');
@@ -545,6 +662,12 @@
             'dynamically allocate a port.');
     parser.addOption(CommandLineOptions.sdkPathOption,
         help: 'The path to the Dart SDK.', hide: hide);
+    parser.addFlag(
+      CommandLineOptions.skipPubOutdatedFlag,
+      defaultsTo: false,
+      negatable: false,
+      help: 'Skip the `pub outdated --mode=null-safety` check.',
+    );
     parser.addOption(CommandLineOptions.summaryOption,
         help:
             'Output path for a machine-readable summary of migration changes');
@@ -571,6 +694,25 @@
   }
 }
 
+/// An abstraction over the static methods on [Process].
+///
+/// Used in tests to run mock processes.
+abstract class ProcessManager {
+  const factory ProcessManager.system() = SystemProcessManager;
+
+  /// Run a process synchronously, as in [Process.runSync].
+  ProcessResult runSync(String executable, List<String> arguments);
+}
+
+/// A [ProcessManager] that directs all method calls to static methods of
+/// [Process], in order to run real processes.
+class SystemProcessManager implements ProcessManager {
+  const SystemProcessManager();
+
+  ProcessResult runSync(String executable, List<String> arguments) =>
+      Process.runSync(executable, arguments);
+}
+
 class _BadArgException implements Exception {
   final String message;
 
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index ee0201b..e9c3f1d 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -226,7 +226,9 @@
     if (targetType != null) {
       var enclosingElement = baseElement.enclosingElement;
       if (enclosingElement is ClassElement) {
-        if (enclosingElement.typeParameters.isNotEmpty) {
+        if (targetType.type.resolveToBound(typeProvider.dynamicType)
+                is InterfaceType &&
+            enclosingElement.typeParameters.isNotEmpty) {
           substitution = _decoratedClassHierarchy
               .asInstanceOf(targetType, enclosingElement)
               .asSubstitution;
@@ -968,7 +970,7 @@
   @override
   DecoratedType visitInstanceCreationExpression(
       InstanceCreationExpression node) {
-    var callee = node.staticElement;
+    var callee = node.constructorName.staticElement;
     var typeParameters = callee.enclosingElement.typeParameters;
     Iterable<DartType> typeArgumentTypes;
     List<DecoratedType> decoratedTypeArguments;
@@ -1463,7 +1465,7 @@
     } else if (staticElement is ExtensionElement) {
       result = _makeNonNullLiteralType(node);
     } else if (staticElement == null) {
-      assert(node.toString() == 'void');
+      assert(node.toString() == 'void', "${node.toString()} != 'void'");
       result = _makeNullableVoidType(node);
     } else if (staticElement.enclosingElement is ClassElement &&
         (staticElement.enclosingElement as ClassElement).isEnum) {
@@ -2722,10 +2724,9 @@
         method.enclosingElement is ExtensionElement) {
       // Extension methods can be called on a `null` target, when the `on` type
       // of the extension is nullable.
-      _handleAssignment(target,
+      return _handleAssignment(target,
           destinationType:
               _variables.decoratedElementType(method.enclosingElement));
-      return _dispatch(target);
     } else {
       return _checkExpressionNotNull(target);
     }
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
index 8f62adb..7774927 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:collection/collection.dart';
 import 'package:crypto/crypto.dart';
-import 'package:meta/meta.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 29d4359..6047aa9 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -3371,6 +3371,22 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_is_promotion_implies_non_nullable_generic() async {
+    var content = '''
+int f<T>(T o) => o is List ? o.length : 0;
+main() {
+  f(null);
+}
+''';
+    var expected = '''
+int f<T>(T o) => o is List ? o.length : 0;
+main() {
+  f(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_isExpression_typeName_typeArguments() async {
     var content = '''
 bool f(a) => a is List<int>;
@@ -3869,6 +3885,28 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_methodInvocation_extension_invocation() async {
+    var content = '''
+extension on bool {
+  void f() {}
+}
+bool g<T>(T x) => true;
+void main() {
+  g<int>(null).f();
+}
+''';
+    var expected = '''
+extension on bool {
+  void f() {}
+}
+bool g<T>(T x) => true;
+void main() {
+  g<int?>(null).f();
+}
+''';
+    await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
+  }
+
   Future<void> test_methodInvocation_typeArguments_explicit() async {
     var content = '''
 T f<T>(T t) => t;
@@ -5343,6 +5381,42 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/39387')
+  Future<void> test_this_inside_extension() async {
+    var content = '''
+class C<T> {
+  T field;
+}
+extension on C<int> {
+  f() {
+    this.field = null;
+  }
+}
+extension on C<List<int>> {
+  f() {
+    this.field = null;
+  }
+}
+''';
+    var expected = '''
+
+class C<T> {
+  T field;
+}
+extension on C<int?> {
+  f() {
+    this.field = null;
+  }
+}
+extension on C<List<int?>> {
+  f() {
+    this.field = [null];
+  }
+}
+''';
+    await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
+  }
+
   Future<void> test_topLevelFunction_parameterType_implicit_dynamic() async {
     var content = '''
 Object f(x) => x;
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 95c3ce0..c4825b1 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -2907,6 +2907,31 @@
     // metadata was visited.
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/39387')
+  Future<void> test_extension_on_class_with_generic_type_arguments() async {
+    await analyze('''
+class C<T> {}
+void f(C<List> x) {}
+extension E on C<List> {
+  g() => f(this);
+}
+''');
+    // No assertions yet. This test crashes. When it stops crashing, consider
+    // adding assertion(s).
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/39387')
+  Future<void> test_extension_on_function_type() async {
+    await analyze('''
+extension CurryFunction<R, S, T> on R Function(S, T) {
+  /// Curry a binary function with its first argument.
+  R Function(T) curry(S first) => (T second) => this(first, second);
+}
+''');
+    // No assertions yet. This test crashes. When it stops crashing, consider
+    // adding assertion(s).
+  }
+
   Future<void> test_field_final_does_not_override_setter() async {
     await analyze('''
 abstract class A {
diff --git a/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
index e314cf2..77ca56e 100644
--- a/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
@@ -2,14 +2,12 @@
 // 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:analyzer/file_system/memory_file_system.dart';
 import 'package:nnbd_migration/src/front_end/migration_info.dart';
 import 'package:nnbd_migration/src/front_end/navigation_tree_renderer.dart';
 import 'package:nnbd_migration/src/front_end/path_mapper.dart';
 import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:path/path.dart' as path;
 
 import 'nnbd_migration_test_base.dart';
 
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 4bc0b9d..13635f2 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -37,7 +37,8 @@
             loggerFactory: (isVerbose) => test.logger = _TestLogger(isVerbose),
             defaultSdkPathOverride:
                 test.resourceProvider.convertPath(mock_sdk.sdkRoot),
-            resourceProvider: test.resourceProvider);
+            resourceProvider: test.resourceProvider,
+            processManager: test.processManager);
 
   @override
   Future<void> blockUntilSignalInterrupt() async {
@@ -61,6 +62,8 @@
 abstract class _MigrationCliTestBase {
   void set logger(_TestLogger logger);
 
+  _MockProcessManager get processManager;
+
   MemoryResourceProvider get resourceProvider;
 }
 
@@ -139,6 +142,32 @@
     }
   }
 
+  void assertPubOutdatedFailure(
+      {int pubOutdatedExitCode = 0,
+      String pubOutdatedStdout = '',
+      String pubOutdatedStderr = ''}) {
+    processManager._mockResult = ProcessResult(123 /* pid */,
+        pubOutdatedExitCode, pubOutdatedStdout, pubOutdatedStderr);
+    logger = _TestLogger(true);
+    var success =
+        DependencyChecker(resourceProvider.pathContext, logger, processManager)
+            .check();
+    expect(success, isFalse);
+  }
+
+  void assertPubOutdatedSuccess(
+      {int pubOutdatedExitCode = 0,
+      String pubOutdatedStdout = '',
+      String pubOutdatedStderr = ''}) {
+    processManager._mockResult = ProcessResult(123 /* pid */,
+        pubOutdatedExitCode, pubOutdatedStdout, pubOutdatedStderr);
+    logger = _TestLogger(true);
+    var success =
+        DependencyChecker(resourceProvider.pathContext, logger, processManager)
+            .check();
+    expect(success, isTrue);
+  }
+
   String createProjectDir(Map<String, String> contents,
       {String posixPath = '/test_project'}) {
     for (var entry in contents.entries) {
@@ -266,6 +295,20 @@
     expect(assertParseArgsSuccess(['--ignore-errors']).ignoreErrors, isTrue);
   }
 
+  test_flag_skip_pub_outdated_default() {
+    expect(assertParseArgsSuccess([]).skipPubOutdated, isFalse);
+  }
+
+  test_flag_skip_pub_outdated_disable() async {
+    // "--no-skip-pub-outdated" is not an option.
+    await assertParseArgsFailure(['--no-skip-pub-outdated']);
+  }
+
+  test_flag_skip_pub_outdated_enable() {
+    expect(assertParseArgsSuccess(['--skip-pub-outdated']).skipPubOutdated,
+        isTrue);
+  }
+
   test_flag_web_preview_default() {
     expect(assertParseArgsSuccess([]).webPreview, isTrue);
   }
@@ -406,6 +449,39 @@
     });
   }
 
+  test_lifecycle_preview_navigation_tree() async {
+    var projectContents = simpleProject(sourceText: 'int x;');
+    var projectDir = await createProjectDir(projectContents);
+    var cli = _createCli();
+    await runWithPreviewServer(cli, [projectDir], (url) async {
+      expect(
+          logger.stdoutBuffer.toString(), contains('No analysis issues found'));
+      await assertPreviewServerResponsive(url);
+      var uri = Uri.parse(url);
+      var authToken = uri.queryParameters['authToken'];
+      var treeResponse = await http.get(
+          uri.replace(
+              path: '/_preview/navigationTree.json',
+              queryParameters: {'authToken': authToken}),
+          headers: {'Content-Type': 'application/json; charset=UTF-8'});
+      var navRoots = jsonDecode(treeResponse.body);
+      for (final root in navRoots) {
+        var navTree = NavigationTreeNode.fromJson(root);
+        for (final file in navTree.subtree) {
+          if (file.href != null) {
+            print(file.href);
+            final contentsResponse = await http.get(
+                uri
+                    .resolve(file.href)
+                    .replace(queryParameters: {'authToken': authToken}),
+                headers: {'Content-Type': 'application/json; charset=UTF-8'});
+            assertHttpSuccess(contentsResponse);
+          }
+        }
+      }
+    });
+  }
+
   test_lifecycle_preview_region_link() async {
     var projectContents = simpleProject(sourceText: 'int x;');
     var projectDir = await createProjectDir(projectContents);
@@ -621,7 +697,6 @@
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       var regionJson = EditDetails.fromJson(jsonDecode(regionResponse.body));
       final traceEntry = regionJson.traces[0].entries[0];
-      final displayPath = traceEntry.link.path;
       final uriPath = traceEntry.link.href;
       // uriPath should be a working URI
       final contentsResponse = await http.get(
@@ -633,36 +708,49 @@
     });
   }
 
-  test_lifecycle_preview_navigation_tree() async {
-    var projectContents = simpleProject(sourceText: 'int x;');
+  test_lifecycle_skip_pub_outdated_disable() async {
+    var projectContents = simpleProject(sourceText: '''
+int f() => null;
+''');
     var projectDir = await createProjectDir(projectContents);
+    processManager._mockResult = ProcessResult(
+        123 /* pid */,
+        0 /* exitCode */,
+        '''
+{ "packages":
+  [
+    { "package": "abc", "current": { "version": "1.0.0", "nullSafety": false } }
+  ]
+}
+''' /* stdout */,
+        '' /* stderr */);
     var cli = _createCli();
-    await runWithPreviewServer(cli, [projectDir], (url) async {
-      expect(
-          logger.stdoutBuffer.toString(), contains('No analysis issues found'));
+    await cli.run(_parseArgs([projectDir]));
+    var output = logger.stderrBuffer.toString();
+    expect(output, contains('Warning: dependencies are outdated.'));
+    expect(cli.exitCode, 1);
+  }
+
+  test_lifecycle_skip_pub_outdated_enable() async {
+    var projectContents = simpleProject(sourceText: '''
+int f() => null;
+''');
+    var projectDir = await createProjectDir(projectContents);
+    processManager._mockResult = ProcessResult(
+        123 /* pid */,
+        0 /* exitCode */,
+        '''
+{ "packages":
+  [
+    { "package": "abc", "current": { "version": "1.0.0", "nullSafety": false } }
+  ]
+}
+''' /* stdout */,
+        '' /* stderr */);
+    var cli = _createCli();
+    await runWithPreviewServer(cli, ['--skip-pub-outdated', projectDir],
+        (url) async {
       await assertPreviewServerResponsive(url);
-      var uri = Uri.parse(url);
-      var authToken = uri.queryParameters['authToken'];
-      var treeResponse = await http.get(
-          uri.replace(
-              path: '/_preview/navigationTree.json',
-              queryParameters: {'authToken': authToken}),
-          headers: {'Content-Type': 'application/json; charset=UTF-8'});
-      var navRoots = jsonDecode(treeResponse.body);
-      for (final root in navRoots) {
-        var navTree = NavigationTreeNode.fromJson(root);
-        for (final file in navTree.subtree) {
-          if (file.href != null) {
-            print(file.href);
-            final contentsResponse = await http.get(
-                uri
-                    .resolve(file.href)
-                    .replace(queryParameters: {'authToken': authToken}),
-                headers: {'Content-Type': 'application/json; charset=UTF-8'});
-            assertHttpSuccess(contentsResponse);
-          }
-        }
-      }
     });
   }
 
@@ -835,6 +923,134 @@
             'Could not find an option named "this-option-does-not-exist"'));
   }
 
+  test_pub_outdated_has_malformed_json() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '{ "packages": }');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_no_packages() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '{}');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_no_pre_null_safety_packages() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc",
+      "current": { "version": "1.0.0", "nullSafety": true }
+    },
+    {
+      "package": "def",
+      "current": { "version": "2.0.0", "nullSafety": true }
+    }
+  ]
+}
+''');
+  }
+
+  test_pub_outdated_has_one_pre_null_safety_package() {
+    assertPubOutdatedFailure(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc",
+      "current": { "version": "1.0.0", "nullSafety": false }
+    },
+    {
+      "package": "def",
+      "current": { "version": "2.0.0", "nullSafety": true }
+    }
+  ]
+}
+''');
+    var stderrText = logger.stderrBuffer.toString();
+    expect(stderrText, contains('Warning:'));
+    expect(stderrText, contains('abc'));
+    expect(stderrText, contains('1.0.0'));
+  }
+
+  test_pub_outdated_has_package_with_missing_current() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc"
+    }
+  ]
+}
+''');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_package_with_missing_name() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "current": {
+        "version": "1.0.0",
+        "nullSafety": false
+      }
+    }
+  ]
+}
+''');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_package_with_missing_nullSafety() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc",
+      "current": {
+        "version": "1.0.0"
+      }
+    }
+  ]
+}
+''');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_package_with_missing_version() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc",
+      "current": {
+        "nullSafety": false
+      }
+    }
+  ]
+}
+''');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
+  test_pub_outdated_has_package_with_null_current() {
+    assertPubOutdatedSuccess(pubOutdatedStdout: '''
+{
+  "packages": [
+    {
+      "package": "abc",
+      "current": null
+    }
+  ]
+}
+''');
+    expect(logger.stderrBuffer.toString(), isEmpty);
+  }
+
+  test_pub_outdated_has_stderr() {
+    assertPubOutdatedSuccess(pubOutdatedStderr: 'anything');
+    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
+  }
+
   test_uses_physical_resource_provider_by_default() {
     var cli = MigrationCli(binaryName: 'nnbd_migration');
     expect(cli.resourceProvider, same(PhysicalResourceProvider.INSTANCE));
@@ -874,12 +1090,16 @@
   @override
   final resourceProvider;
 
+  @override
+  final processManager;
+
   _MigrationCliTestPosix()
       : resourceProvider = MemoryResourceProvider(
             context: path.style == path.Style.posix
                 ? null
                 : path.Context(
-                    style: path.Style.posix, current: '/working_dir'));
+                    style: path.Style.posix, current: '/working_dir')),
+        processManager = _MockProcessManager();
 }
 
 @reflectiveTest
@@ -888,12 +1108,31 @@
   @override
   final resourceProvider;
 
+  @override
+  final processManager;
+
   _MigrationCliTestWindows()
       : resourceProvider = MemoryResourceProvider(
             context: path.style == path.Style.windows
                 ? null
                 : path.Context(
-                    style: path.Style.windows, current: 'C:\\working_dir'));
+                    style: path.Style.windows, current: 'C:\\working_dir')),
+        processManager = _MockProcessManager();
+}
+
+class _MockProcessManager implements ProcessManager {
+  ProcessResult _mockResult;
+
+  dynamic noSuchMethod(Invocation invocation) {}
+
+  ProcessResult runSync(String executable, List<String> arguments) =>
+      _mockResult ??
+      ProcessResult(
+        123 /* pid */,
+        0 /* exitCode */,
+        '' /* stdout */,
+        '' /* stderr */,
+      );
 }
 
 /// TODO(paulberry): move into cli_util
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 6eec3f2..eb54807 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -536,11 +536,11 @@
 
   @override
   int compareTo(AnalyzerError other) {
-    if (severity != other.severity) return severity.compareTo(other.severity);
     if (file != other.file) return file.compareTo(other.file);
     if (line != other.line) return line.compareTo(other.line);
     if (column != other.column) return column.compareTo(other.column);
     if (length != other.length) return length.compareTo(other.length);
+    if (severity != other.severity) return severity.compareTo(other.severity);
     if (errorCode != other.errorCode) {
       return errorCode.compareTo(other.errorCode);
     }
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index fe588a6..6be64fb 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -541,10 +541,7 @@
 
     // Link to the summaries for the available packages, so that they don't
     // get recompiled into the test's own module.
-    var packages = _configuration.nnbdMode == NnbdMode.legacy
-        ? testPackages
-        : testPackagesNnbd;
-    for (var package in packages) {
+    for (var package in testPackages) {
       args.add("-s");
 
       // Since the summaries for the packages are not near the tests, we give
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index c75180c..540dfd2 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -305,15 +305,16 @@
         hasRuntimeError: testExpectation == Expectation.runtimeError,
         hasStaticWarning: false,
         hasCrash: testExpectation == Expectation.crash);
-
     var filename = configuration.architecture == Architecture.x64
         ? '$buildDir/gen/kernel-service.dart.snapshot'
         : '$buildDir/gen/kernel_service.dill';
     var dfePath = Path(filename).absolute.toNativePath();
     var args = [
-      if (expectations.contains(Expectation.crash)) '--suppress-core-dump',
       // '--dfe' has to be the first argument for run_vm_test to pick it up.
       '--dfe=$dfePath',
+      if (expectations.contains(Expectation.crash)) '--suppress-core-dump',
+      if (configuration.experiments.isNotEmpty)
+        '--enable-experiment=${configuration.experiments.join(",")}',
       ...configuration.standardOptions,
       ...configuration.vmOptions,
       test.name
diff --git a/pkg/test_runner/lib/src/utils.dart b/pkg/test_runner/lib/src/utils.dart
index 7daa0eb..ba61a15 100644
--- a/pkg/test_runner/lib/src/utils.dart
+++ b/pkg/test_runner/lib/src/utils.dart
@@ -21,22 +21,6 @@
 /// The names of the packages that are available for use in tests.
 const testPackages = [
   "async_helper",
-  "collection",
-  "expect",
-  "js",
-  "matcher",
-  "meta",
-  "path",
-  "stack_trace"
-];
-
-// TODO(nshahan): Grow this list until it matches the list above. We are
-// temporarily using a reduced set of packages in tests until they are compliant
-// or we can simply opt them out of the null safety feature without build
-// errors. This list should be consistent with the build target
-// utils/dartdevc:dartdevc_test_kernel_pkg
-const testPackagesNnbd = [
-  "async_helper",
   "expect",
   "js",
   "meta",
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index fcdd01d..a8017d7 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -223,8 +223,9 @@
   }
 
   var errors = <StaticError>[];
-  AnalysisCommandOutput.parseErrors(result.stderr as String, errors);
-  return errors;
+  var warnings = <StaticError>[];
+  AnalysisCommandOutput.parseErrors(result.stderr as String, errors, warnings);
+  return [...errors, ...warnings];
 }
 
 /// Invoke CFE on [path] and gather all static errors it reports.
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 83bcdd1..2704c99 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -178,15 +178,18 @@
   }
 
   @override
-  visitLet(Let node) {
+  visitBlockExpression(BlockExpression node) {
     // The BuilderInfo field `_i` is set up with a row of cascaded calls.
     // ```
     // static final BuilderInfo _i = BuilderInfo('MessageName')
     //     ..a(1, 'foo', PbFieldType.OM)
     //     ..a(2, 'bar', PbFieldType.OM)
     // ```
-    // Each cascaded call will be represented in kernel as a let, where the
-    // initializer will be a call to a method of `builderInfo`. For example:
+    // Each cascaded call will be represented in kernel as an entry in a
+    // BlockExpression (but starts out in a Let), where each statement in block
+    // is an ExpressionStatement, and where each statement will be a call to a
+    // method of `builderInfo`.
+    // For example:
     // ```
     // {protobuf::BuilderInfo::a}<dart.core::int*>(1, "foo", #C10)
     // ```
@@ -196,7 +199,21 @@
     // First argument is the tag-number of the added field.
     // Second argument is the field-name.
     // Further arguments are specific to the method.
-    final initializer = node.variable.initializer;
+    for (Statement statement in node.body.statements) {
+      if (statement is ExpressionStatement) {
+        _changeCascadeEntry(statement.expression);
+      }
+    }
+    node.body.accept(this);
+  }
+
+  @override
+  visitLet(Let node) {
+    // See comment in visitBlockExpression.
+    node.body.accept(this);
+  }
+
+  void _changeCascadeEntry(Expression initializer) {
     if (initializer is MethodInvocation &&
         initializer.interfaceTarget?.enclosingClass == builderInfoClass &&
         fieldAddingMethods.contains(initializer.name.name)) {
@@ -233,7 +250,6 @@
         );
       }
     }
-    node.body.accept(this);
   }
 }
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index 7857d67..223a0ed 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -30,7 +30,9 @@
   }
 }
 static method main(core::List<core::String*>* args) → dynamic {
-  core::Stopwatch* timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final void #t2 = [@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
+  core::Stopwatch* timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in block {
+    [@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}();
+  } =>#t1;
   for (core::int* i = 0; [@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::run();
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index d40f897..d941915 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -27,7 +27,9 @@
 [@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector* v = new self::_Vector::•(10);
 [@vm.inferred-type.metadata=dart.core::_Double?]static field core::double* x = 0.0;
 static method main(core::List<core::String*>* args) → dynamic {
-  core::Stopwatch* timer = let final core::Stopwatch #t3 = new core::Stopwatch::•() in let final void #t4 = [@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t3.{core::Stopwatch::start}() in #t3;
+  core::Stopwatch* timer = let final core::Stopwatch #t3 = new core::Stopwatch::•() in block {
+    [@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t3.{core::Stopwatch::start}();
+  } =>#t3;
   for (core::int* i = 0; [@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::x = [@vm.direct-call.metadata=_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=_Vector.*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 70f5ded..a64881c 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Changelog
 
+## 4.1.0
+- Expose more `@required` parameters on the named constructors of VM service objects.
+
 ## 4.0.4
 - Update to version `3.34.0` of the spec.
 - Fixed issue where `TimelineEvents` was not a valid service event kind.
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 01f4ea3..c3bc86a 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -2756,8 +2756,9 @@
     @required this.breakpointNumber,
     @required this.resolved,
     @required this.location,
+    @required String id,
     this.isSyntheticAsyncContinuation,
-  });
+  }) : super(id: id);
 
   Breakpoint._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     breakpointNumber = json['breakpointNumber'];
@@ -2800,7 +2801,8 @@
 
   ClassRef({
     @required this.name,
-  });
+    @required String id,
+  }) : super(id: id);
 
   ClassRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -2888,12 +2890,13 @@
     @required this.fields,
     @required this.functions,
     @required this.subclasses,
+    @required String id,
     this.error,
     this.location,
     this.superClass,
     this.superType,
     this.mixin,
-  });
+  }) : super(id: id);
 
   Class._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -3071,7 +3074,8 @@
   CodeRef({
     @required this.name,
     @required this.kind,
-  });
+    @required String id,
+  }) : super(id: id);
 
   CodeRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -3111,7 +3115,8 @@
   Code({
     @required this.name,
     @required this.kind,
-  });
+    @required String id,
+  }) : super(id: id);
 
   Code._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -3146,7 +3151,8 @@
 
   ContextRef({
     @required this.length,
-  });
+    @required String id,
+  }) : super(id: id);
 
   ContextRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     length = json['length'];
@@ -3189,8 +3195,9 @@
   Context({
     @required this.length,
     @required this.variables,
+    @required String id,
     this.parent,
-  });
+  }) : super(id: id);
 
   Context._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     length = json['length'];
@@ -3416,7 +3423,8 @@
   ErrorRef({
     @required this.kind,
     @required this.message,
-  });
+    @required String id,
+  }) : super(id: id);
 
   ErrorRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     kind = json['kind'];
@@ -3467,9 +3475,10 @@
   Error({
     @required this.kind,
     @required this.message,
+    @required String id,
     this.exception,
     this.stacktrace,
-  });
+  }) : super(id: id);
 
   Error._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     kind = json['kind'];
@@ -3827,7 +3836,8 @@
     @required this.isConst,
     @required this.isFinal,
     @required this.isStatic,
-  });
+    @required String id,
+  }) : super(id: id);
 
   FieldRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -3902,9 +3912,10 @@
     @required this.isConst,
     @required this.isFinal,
     @required this.isStatic,
+    @required String id,
     this.staticValue,
     this.location,
-  });
+  }) : super(id: id);
 
   Field._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -4107,7 +4118,8 @@
     @required this.owner,
     @required this.isStatic,
     @required this.isConst,
-  });
+    @required String id,
+  }) : super(id: id);
 
   FuncRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -4171,9 +4183,10 @@
     @required this.owner,
     @required this.isStatic,
     @required this.isConst,
+    @required String id,
     this.location,
     this.code,
-  });
+  }) : super(id: id);
 
   Func._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -4313,6 +4326,7 @@
   InstanceRef({
     @required this.kind,
     @required this.classRef,
+    @required String id,
     this.valueAsString,
     this.valueAsStringIsTruncated,
     this.length,
@@ -4322,7 +4336,7 @@
     this.pattern,
     this.closureFunction,
     this.closureContext,
-  });
+  }) : super(id: id);
 
   InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     kind = json['kind'];
@@ -4627,6 +4641,7 @@
   Instance({
     @required this.kind,
     @required this.classRef,
+    @required String id,
     this.valueAsString,
     this.valueAsStringIsTruncated,
     this.length,
@@ -4651,7 +4666,7 @@
     this.parameterIndex,
     this.targetType,
     this.bound,
-  });
+  }) : super(id: id);
 
   Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     kind = json['kind'];
@@ -5144,7 +5159,8 @@
   LibraryRef({
     @required this.name,
     @required this.uri,
-  });
+    @required String id,
+  }) : super(id: id);
 
   LibraryRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -5210,7 +5226,8 @@
     @required this.variables,
     @required this.functions,
     @required this.classes,
-  });
+    @required String id,
+  }) : super(id: id);
 
   Library._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
@@ -6068,7 +6085,8 @@
 
   ScriptRef({
     @required this.uri,
-  });
+    @required String id,
+  }) : super(id: id);
 
   ScriptRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     uri = json['uri'];
@@ -6153,11 +6171,12 @@
   Script({
     @required this.uri,
     @required this.library,
+    @required String id,
     this.lineOffset,
     this.columnOffset,
     this.source,
     this.tokenPosTable,
-  });
+  }) : super(id: id);
 
   Script._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     uri = json['uri'];
@@ -6688,7 +6707,8 @@
 
   TypeArgumentsRef({
     @required this.name,
-  });
+    @required String id,
+  }) : super(id: id);
 
   TypeArgumentsRef._fromJson(Map<String, dynamic> json)
       : super._fromJson(json) {
@@ -6731,7 +6751,8 @@
   TypeArguments({
     @required this.name,
     @required this.types,
-  });
+    @required String id,
+  }) : super(id: id);
 
   TypeArguments._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
     name = json['name'];
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index c066883..568f09c 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 4.0.4
+version: 4.1.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 146ec47..ba1b0fe 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -1399,7 +1399,11 @@
     gen.writeln();
     if (docs != null) gen.writeDocs(docs);
     gen.write('class ${name} ');
-    if (superName != null) gen.write('extends ${superName} ');
+    Type superType;
+    if (superName != null) {
+      superType = parent.getType(superName);
+      gen.write('extends ${superName} ');
+    }
     if (parent.getType('${name}Ref') != null) {
       gen.write('implements ${name}Ref ');
     }
@@ -1422,6 +1426,8 @@
 
     // ctors
 
+    bool hasRequiredParentFields = superType != null &&
+        (superType.name == 'ObjRef' || superType.name == 'Obj');
     // Default
     gen.write('${name}(');
     if (fields.isNotEmpty) {
@@ -1429,12 +1435,25 @@
       fields
           .where((field) => !field.optional)
           .forEach((field) => field.generateNamedParameter(gen));
+      if (hasRequiredParentFields) {
+        superType.fields.where((field) => !field.optional).forEach(
+            (field) => field.generateNamedParameter(gen, fromParent: true));
+      }
       fields
           .where((field) => field.optional)
           .forEach((field) => field.generateNamedParameter(gen));
       gen.write('}');
     }
-    gen.writeln(');');
+    gen.write(')');
+    if (hasRequiredParentFields) {
+      gen.write(' : super(');
+      superType.fields.where((field) => !field.optional).forEach((field) {
+        String name = field.generatableName;
+        gen.write('$name: $name');
+      });
+      gen.write(')');
+    }
+    gen.writeln(';');
 
     // Build from JSON.
     gen.writeln();
@@ -1833,11 +1852,17 @@
     if (parent.fields.any((field) => field.hasDocs)) gen.writeln();
   }
 
-  void generateNamedParameter(DartGenerator gen) {
+  void generateNamedParameter(DartGenerator gen, {bool fromParent = false}) {
     if (!optional) {
       gen.write('@required ');
     }
-    gen.writeStatement('this.${generatableName},');
+    if (fromParent) {
+      String typeName =
+          api.isEnumName(type.name) ? '/*${type.name}*/ String' : type.name;
+      gen.writeStatement('$typeName ${generatableName},');
+    } else {
+      gen.writeStatement('this.${generatableName},');
+    }
   }
 }
 
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 71d0437..f1eeeb2 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -652,8 +652,8 @@
 
 Dart_Handle DartUtils::GetDartType(const char* library_url,
                                    const char* class_name) {
-  return Dart_GetType(Dart_LookupLibrary(NewString(library_url)),
-                      NewString(class_name), 0, NULL);
+  return Dart_GetNonNullableType(Dart_LookupLibrary(NewString(library_url)),
+                                 NewString(class_name), 0, NULL);
 }
 
 Dart_Handle DartUtils::NewDartOSError() {
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index 726ecd1..ec96863 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -10,8 +10,8 @@
 #include <errno.h>     // NOLINT
 #include <sys/stat.h>  // NOLINT
 
-#include "bin/dartutils.h"
 #include "bin/crypto.h"
+#include "bin/dartutils.h"
 #include "bin/file.h"
 #include "bin/namespace.h"
 #include "bin/utils.h"
@@ -450,8 +450,8 @@
   // a uuid.
   uint32_t suffix_bytes = 0;
   const int kSuffixSize = sizeof(suffix_bytes);
-  if (!Crypto::GetRandomBytes(
-      kSuffixSize, reinterpret_cast<uint8_t*>(&suffix_bytes))) {
+  if (!Crypto::GetRandomBytes(kSuffixSize,
+                              reinterpret_cast<uint8_t*>(&suffix_bytes))) {
     // Getting random bytes failed, maybe the UUID will work?
     return CreateTempFromUUID(prefix);
   }
diff --git a/runtime/bin/elf_loader.cc b/runtime/bin/elf_loader.cc
index 8910736a..b3981bd 100644
--- a/runtime/bin/elf_loader.cc
+++ b/runtime/bin/elf_loader.cc
@@ -6,6 +6,7 @@
 #include <bin/file.h>
 #include <platform/elf.h>
 #include <platform/globals.h>
+#include <vm/bss_relocs.h>
 #include <vm/cpu.h>
 #include <vm/virtual_memory.h>
 
@@ -183,6 +184,9 @@
   /// corresponding symbol was not found, or if the dynamic symbol table could
   /// not be decoded.
   ///
+  /// Has the side effect of initializing the relocated addresses for the text
+  /// sections corresponding to non-null output parameters in the BSS segment.
+  ///
   /// On failure, the error may be retrieved by 'error()'.
   bool ResolveSymbols(const uint8_t** vm_data,
                       const uint8_t** vm_instrs,
@@ -235,6 +239,8 @@
   const char* dynamic_string_table_ = nullptr;
   const dart::elf::Symbol* dynamic_symbol_table_ = nullptr;
   uword dynamic_symbol_count_ = 0;
+  uword* vm_bss_ = nullptr;
+  uword* isolate_bss_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(LoadedElf);
 };
@@ -462,11 +468,21 @@
       dynamic_symbol_table_ = reinterpret_cast<const dart::elf::Symbol*>(
           base_->start() + header.memory_offset);
       dynamic_symbol_count_ = header.file_size / sizeof(dart::elf::Symbol);
+    } else if (strcmp(name, ".bss") == 0) {
+      auto const bss_size =
+          (BSS::kVmEntryCount + BSS::kIsolateEntryCount) * kWordSize;
+      CHECK_ERROR(header.memory_offset != 0, ".bss must be loaded.");
+      CHECK_ERROR(header.file_size >= bss_size,
+                  ".bss does not have enough space.");
+      vm_bss_ = reinterpret_cast<uword*>(base_->start() + header.memory_offset);
+      isolate_bss_ = vm_bss_ + BSS::kVmEntryCount;
+      // We set applicable BSS entries in ResolveSymbols().
     }
   }
 
   CHECK_ERROR(dynamic_string_table_ != nullptr, "Couldn't find .dynstr.");
   CHECK_ERROR(dynamic_symbol_table_ != nullptr, "Couldn't find .dynsym.");
+  CHECK_ERROR(vm_bss_ != nullptr, "Couldn't find .bss.");
   return true;
 }
 
@@ -488,10 +504,22 @@
       output = vm_data;
     } else if (strcmp(name, kVmSnapshotInstructionsAsmSymbol) == 0) {
       output = vm_instrs;
+      if (output != nullptr) {
+        // Store the value of the symbol in the VM BSS, as it contains the
+        // address of the VM instructions section relative to the DSO base.
+        BSS::InitializeBSSEntry(BSS::Relocation::InstructionsRelocatedAddress,
+                                sym.value, vm_bss_);
+      }
     } else if (strcmp(name, kIsolateSnapshotDataAsmSymbol) == 0) {
       output = isolate_data;
     } else if (strcmp(name, kIsolateSnapshotInstructionsAsmSymbol) == 0) {
       output = isolate_instrs;
+      if (output != nullptr) {
+        // Store the value of the symbol in the isolate BSS, as it contains the
+        // address of the isolate instructions section relative to the DSO base.
+        BSS::InitializeBSSEntry(BSS::Relocation::InstructionsRelocatedAddress,
+                                sym.value, isolate_bss_);
+      }
     }
 
     if (output != nullptr) {
diff --git a/runtime/bin/exe_utils.cc b/runtime/bin/exe_utils.cc
index d9333dc..9950ae6fa 100644
--- a/runtime/bin/exe_utils.cc
+++ b/runtime/bin/exe_utils.cc
@@ -67,7 +67,7 @@
 
 Utils::CStringUniquePtr EXEUtils::GetDirectoryPrefixFromExeName() {
   const char* name = nullptr;
-  const int kTargetSize = 4096;
+  const int kTargetSize = PATH_MAX;
   char target[kTargetSize];
   intptr_t target_size =
       Platform::ResolveExecutablePathInto(target, kTargetSize);
@@ -81,6 +81,7 @@
     ASSERT(target_size < kTargetSize);
   }
   Namespace* namespc = Namespace::Create(Namespace::Default());
+  char* result;
   if (File::GetType(namespc, name, false) == File::kIsLink) {
     char dir_path[kTargetSize];
     // cwd is currently wherever we launched from, so set the cwd to the
@@ -102,11 +103,20 @@
     } while (File::GetType(namespc, name, false) == File::kIsLink);
     target_size = strlen(name);
 
+    char absolute_path[kTargetSize];
+
+    // Get the absolute path after we've resolved all the symlinks and before
+    // we reset the cwd, otherwise path resolution will fail.
+    File::GetCanonicalPath(namespc, name, absolute_path, kTargetSize);
+
     // Reset cwd to the original value.
     Directory::SetCurrent(namespc, initial_dir_path.get());
+
+    result = GetDirectoryFromPath(absolute_path, nullptr);
+  } else {
+    result = GetDirectoryFromPath(target, nullptr);
   }
   namespc->Release();
-  char* result = GetDirectoryFromPath(name, nullptr);
   return Utils::CreateCStringUniquePtr(result == nullptr ? strdup("") : result);
 }
 
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 642ba9e..d900b10 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -261,9 +261,12 @@
   // The result will be populated into dest.
   static const char* LinkTarget(Namespace* namespc,
                                 const char* pathname,
-                                char* dest = NULL,
+                                char* dest = nullptr,
                                 int dest_size = 0);
-  static const char* GetCanonicalPath(Namespace* namespc, const char* path);
+  static const char* GetCanonicalPath(Namespace* namespc,
+                                      const char* path,
+                                      char* dest = nullptr,
+                                      int dest_size = 0);
   // Link LinkTarget, but pathname must be absolute.
   static const char* ReadLink(const char* pathname);
   static intptr_t ReadLinkInto(const char* pathname,
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 15352c0..2a3ffd4 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -652,7 +652,10 @@
   return target_name;
 }
 
-const char* File::GetCanonicalPath(Namespace* namespc, const char* name) {
+const char* File::GetCanonicalPath(Namespace* namespc,
+                                   const char* name,
+                                   char* dest,
+                                   int dest_size) {
   if (name == NULL) {
     return NULL;
   }
@@ -663,13 +666,17 @@
     return name;
   }
   char* abs_path;
-  char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
-  ASSERT(resolved_path != NULL);
+  if (dest == NULL) {
+    dest = DartUtils::ScopedCString(PATH_MAX + 1);
+  } else {
+    ASSERT(dest_size >= PATH_MAX);
+  }
+  ASSERT(dest != NULL);
   do {
-    abs_path = realpath(name, resolved_path);
+    abs_path = realpath(name, dest);
   } while ((abs_path == NULL) && (errno == EINTR));
   ASSERT(abs_path == NULL || IsAbsolutePath(abs_path));
-  ASSERT(abs_path == NULL || (abs_path == resolved_path));
+  ASSERT(abs_path == NULL || (abs_path == dest));
   return abs_path;
 }
 
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 39d667b..89426c0 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -598,7 +598,10 @@
   return ((pathname != NULL) && (pathname[0] == '/'));
 }
 
-const char* File::GetCanonicalPath(Namespace* namespc, const char* name) {
+const char* File::GetCanonicalPath(Namespace* namespc,
+                                   const char* name,
+                                   char* dest,
+                                   int dest_size) {
   if (name == NULL) {
     return NULL;
   }
@@ -609,13 +612,17 @@
     return name;
   }
   char* abs_path;
-  char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
-  ASSERT(resolved_path != NULL);
+  if (dest == NULL) {
+    dest = DartUtils::ScopedCString(PATH_MAX + 1);
+  } else {
+    ASSERT(dest_size >= PATH_MAX);
+  }
+  ASSERT(dest != NULL);
   do {
-    abs_path = realpath(name, resolved_path);
+    abs_path = realpath(name, dest);
   } while ((abs_path == NULL) && (errno == EINTR));
   ASSERT(abs_path == NULL || IsAbsolutePath(abs_path));
-  ASSERT(abs_path == NULL || (abs_path == resolved_path));
+  ASSERT(abs_path == NULL || (abs_path == dest));
   return abs_path;
 }
 
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index dab296d..92ee4fa 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -649,7 +649,10 @@
   return target_name;
 }
 
-const char* File::GetCanonicalPath(Namespace* namespc, const char* name) {
+const char* File::GetCanonicalPath(Namespace* namespc,
+                                   const char* name,
+                                   char* dest,
+                                   int dest_size) {
   if (name == NULL) {
     return NULL;
   }
@@ -660,13 +663,17 @@
     return name;
   }
   char* abs_path;
-  char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
-  ASSERT(resolved_path != NULL);
+  if (dest == NULL) {
+    dest = DartUtils::ScopedCString(PATH_MAX + 1);
+  } else {
+    ASSERT(dest_size >= PATH_MAX);
+  }
+  ASSERT(dest != NULL);
   do {
-    abs_path = realpath(name, resolved_path);
+    abs_path = realpath(name, dest);
   } while ((abs_path == NULL) && (errno == EINTR));
   ASSERT(abs_path == NULL || IsAbsolutePath(abs_path));
-  ASSERT(abs_path == NULL || (abs_path == resolved_path));
+  ASSERT(abs_path == NULL || (abs_path == dest));
   return abs_path;
 }
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index bc6ef93..e87cced 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -573,19 +573,25 @@
   return (pathname != NULL && pathname[0] == '/');
 }
 
-const char* File::GetCanonicalPath(Namespace* namespc, const char* pathname) {
+const char* File::GetCanonicalPath(Namespace* namespc,
+                                   const char* pathname,
+                                   char* dest,
+                                   int dest_size) {
   char* abs_path = NULL;
   if (pathname != NULL) {
     // On some older MacOs versions the default behaviour of realpath allocating
-    // space for the resolved_path when a NULL is passed in does not seem to
-    // work, so we explicitly allocate space.
-    char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
-    ASSERT(resolved_path != NULL);
+    // space for the dest when a NULL is passed in does not seem to work, so we
+    // explicitly allocate space.
+    if (dest == NULL) {
+      dest = DartUtils::ScopedCString(PATH_MAX + 1);
+    } else {
+      ASSERT(dest_size >= PATH_MAX);
+    }
     do {
-      abs_path = realpath(pathname, resolved_path);
+      abs_path = realpath(pathname, dest);
     } while ((abs_path == NULL) && (errno == EINTR));
     ASSERT((abs_path == NULL) || IsAbsolutePath(abs_path));
-    ASSERT((abs_path == NULL) || (abs_path == resolved_path));
+    ASSERT((abs_path == NULL) || (abs_path == dest));
   }
   return abs_path;
 }
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 2dc6b95..ff32a17 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -678,7 +678,10 @@
           ((pathname[2] == '\\') || (pathname[2] == '/')));
 }
 
-const char* File::GetCanonicalPath(Namespace* namespc, const char* pathname) {
+const char* File::GetCanonicalPath(Namespace* namespc,
+                                   const char* pathname,
+                                   char* dest,
+                                   int dest_size) {
   Utf8ToWideScope system_name(pathname);
   HANDLE file_handle =
       CreateFileW(system_name.wide(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
@@ -695,23 +698,33 @@
     SetLastError(error);
     return NULL;
   }
-  wchar_t* path;
-  path = reinterpret_cast<wchar_t*>(
-      Dart_ScopeAllocate(required_size * sizeof(*path)));
-  int result_size = GetFinalPathNameByHandle(file_handle, path, required_size,
-                                             VOLUME_NAME_DOS);
+  auto path = std::unique_ptr<wchar_t[]>(new wchar_t[required_size]);
+  int result_size = GetFinalPathNameByHandle(file_handle, path.get(),
+                                             required_size, VOLUME_NAME_DOS);
   ASSERT(result_size <= required_size - 1);
-  // Remove leading \\?\ if possible, unless input used it.
-  char* result;
-  if ((result_size < MAX_PATH - 1 + 4) && (result_size > 4) &&
-      (wcsncmp(path, L"\\\\?\\", 4) == 0) &&
-      (wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) {
-    result = StringUtilsWin::WideToUtf8(path + 4);
-  } else {
-    result = StringUtilsWin::WideToUtf8(path);
-  }
   CloseHandle(file_handle);
-  return result;
+
+  // Remove leading \\?\ if possible, unless input used it.
+  int offset = 0;
+  if ((result_size < MAX_PATH - 1 + 4) && (result_size > 4) &&
+      (wcsncmp(path.get(), L"\\\\?\\", 4) == 0) &&
+      (wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) {
+    offset = 4;
+  }
+  int utf8_size = WideCharToMultiByte(CP_UTF8, 0, path.get() + offset, -1,
+                                      nullptr, 0, nullptr, nullptr);
+  if (dest == NULL) {
+    dest = DartUtils::ScopedCString(utf8_size);
+    dest_size = utf8_size;
+  }
+  if (dest_size != 0) {
+    ASSERT(utf8_size <= dest_size);
+  }
+  if (0 == WideCharToMultiByte(CP_UTF8, 0, path.get() + offset, -1, dest,
+                               dest_size, NULL, NULL)) {
+    return NULL;
+  }
+  return dest;
 }
 
 const char* File::PathSeparator() {
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 8742d98..3a49f5d 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -76,8 +76,12 @@
 
 static Dart_Handle CreateRuntimeOptions(CommandLineOptions* options) {
   int options_count = options->count();
+  Dart_Handle string_type = DartUtils::GetDartType("dart:core", "String");
+  if (Dart_IsError(string_type)) {
+    return string_type;
+  }
   Dart_Handle dart_arguments =
-      Dart_NewListOf(Dart_CoreType_String, options_count);
+      Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), options_count);
   if (Dart_IsError(dart_arguments)) {
     return dart_arguments;
   }
diff --git a/runtime/bin/platform.cc b/runtime/bin/platform.cc
index 20003a0..1b04cfc 100644
--- a/runtime/bin/platform.cc
+++ b/runtime/bin/platform.cc
@@ -72,7 +72,10 @@
 void FUNCTION_NAME(Platform_ExecutableArguments)(Dart_NativeArguments args) {
   int end = Platform::GetScriptIndex();
   char** argv = Platform::GetArgv();
-  Dart_Handle result = Dart_NewListOf(Dart_CoreType_String, end - 1);
+  Dart_Handle string_type = DartUtils::GetDartType("dart:core", "String");
+  ThrowIfError(string_type);
+  Dart_Handle result =
+      Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), end - 1);
   for (intptr_t i = 1; i < end; i++) {
     Dart_Handle str = DartUtils::NewString(argv[i]);
     ThrowIfError(str);
diff --git a/runtime/docs/aot_binary_size_analysis.md b/runtime/docs/aot_binary_size_analysis.md
index 744f568..04a8e41 100644
--- a/runtime/docs/aot_binary_size_analysis.md
+++ b/runtime/docs/aot_binary_size_analysis.md
@@ -29,7 +29,7 @@
 size analysis tool:
 
 ```
-% dart pkg/vm/bin/run_binary_size_analysis.dart hello_sizes.json hello_sizes
+% dart pkg/vm/bin/snapshot_analysis.dart treemap hello_sizes.json hello_sizes
 Generated file:///.../sdk/hello_sizes/index.html
 % chrome hello_sizes/index.html
 ```
@@ -41,7 +41,7 @@
 comparison tool:
 
 ```
-% dart pkg/vm/bin/compare_sizes.dart app-sizes--before.json app-sizes--after.json
+% dart pkg/vm/bin/snapshot_analysis.dart compare app-sizes--before.json app-sizes--after.json
 
 +---------+--------+--------------+
 | Library | Method | Diff (Bytes) |
diff --git a/runtime/tools/ffi/sdk_lib_ffi_generator.dart b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
index 500f64a..1b3b364 100644
--- a/runtime/tools/ffi/sdk_lib_ffi_generator.dart
+++ b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
@@ -170,15 +170,13 @@
 $alignment  external $typedListType asTypedList(int length);
 """;
 
-  // TODO(38892): Stop generating documentation on setter.
   buffer.write("""
 /// Extension on [Pointer] specialized for the type argument [$nativeType].
 extension ${nativeType}Pointer on Pointer<$nativeType> {
   /// The $property at [address].
 $platform$truncate$alignment  external $dartType get value;
 
-  /// The $property at [address].
-$platform$truncate$alignment  external void set value($dartType value);
+  external void set value($dartType value);
 
   /// The $property at `address + ${sizeTimes}index`.
 $platform$truncate$alignment  external $dartType operator [](int index);
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 11527a7..c7512c4 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -268,12 +268,12 @@
   const char* kScriptChars =
       "import 'dart:nativewrappers';\n"
       "class Class extends NativeFieldWrapperClass1 {\n"
-      "  int init() native 'init';\n"
+      "  void init() native 'init';\n"
       "  int method(int param1, int param2) native 'method';\n"
       "}\n"
       "\n"
       "void benchmark(int count) {\n"
-      "  Class c = new Class();\n"
+      "  Class c = Class();\n"
       "  c.init();\n"
       "  for (int i = 0; i < count; i++) {\n"
       "    c.method(i,7);\n"
@@ -359,6 +359,10 @@
 // Measure compile of all kernel Service(CFE) functions.
 //
 BENCHMARK(KernelServiceCompileAll) {
+  if (FLAG_null_safety == kNullSafetyOptionStrong) {
+    // TODO(bkonyi): remove this check when we build the CFE in strong mode.
+    return;
+  }
   bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
   bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
   bin::Builtin::SetNativeResolver(bin::Builtin::kCLILibrary);
diff --git a/runtime/vm/bss_relocs.cc b/runtime/vm/bss_relocs.cc
index 7df4242..2ca72c5 100644
--- a/runtime/vm/bss_relocs.cc
+++ b/runtime/vm/bss_relocs.cc
@@ -3,28 +3,41 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/bss_relocs.h"
+#include "vm/native_symbol.h"
 #include "vm/runtime_entry.h"
 #include "vm/thread.h"
 
 namespace dart {
 
-static void InitializeBSSEntry(BSS::Relocation relocation,
-                               uword function_address,
-                               uword* bss_start) {
+void BSS::InitializeBSSEntry(BSS::Relocation relocation,
+                             uword new_value,
+                             uword* bss_start) {
   std::atomic<uword>* slot = reinterpret_cast<std::atomic<uword>*>(
       &bss_start[BSS::RelocationIndex(relocation)]);
   uword old_value = slot->load(std::memory_order_relaxed);
-  uword new_value = function_address;
   if (!slot->compare_exchange_strong(old_value, new_value,
                                      std::memory_order_relaxed)) {
     RELEASE_ASSERT(old_value == new_value);
   }
 }
 
-void BSS::Initialize(Thread* current, uword* bss_start) {
-  InitializeBSSEntry(BSS::Relocation::DRT_GetThreadForNativeCallback,
-                     reinterpret_cast<uword>(DLRT_GetThreadForNativeCallback),
-                     bss_start);
+void BSS::Initialize(Thread* current, uword* bss_start, bool vm) {
+  auto const instructions = reinterpret_cast<uword>(
+      current->isolate_group()->source()->snapshot_instructions);
+  uword dso_base;
+  // For non-natively loaded snapshots, this is instead initialized in
+  // LoadedElf::ResolveSymbols().
+  if (NativeSymbolResolver::LookupSharedObject(instructions, &dso_base)) {
+    InitializeBSSEntry(Relocation::InstructionsRelocatedAddress,
+                       instructions - dso_base, bss_start);
+  }
+
+  if (!vm) {
+    // Fill values at isolate-only indices.
+    InitializeBSSEntry(Relocation::DRT_GetThreadForNativeCallback,
+                       reinterpret_cast<uword>(DLRT_GetThreadForNativeCallback),
+                       bss_start);
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/bss_relocs.h b/runtime/vm/bss_relocs.h
index c557b46..d013c5d 100644
--- a/runtime/vm/bss_relocs.h
+++ b/runtime/vm/bss_relocs.h
@@ -12,16 +12,33 @@
 
 class BSS : public AllStatic {
  public:
+  // Entries found in both the VM and isolate BSS come first. Each has its own
+  // portion of the BSS segment, so just the indices are shared, not the values
+  // stored at the index.
   enum class Relocation : intptr_t {
-    DRT_GetThreadForNativeCallback = 0,
-    NumRelocations = 1
+    InstructionsRelocatedAddress,
+    // End of shared entries.
+    DRT_GetThreadForNativeCallback,
+    // End of isolate-only entries.
   };
 
-  static intptr_t RelocationIndex(Relocation reloc) {
+  static constexpr intptr_t kVmEntryCount =
+      static_cast<intptr_t>(Relocation::InstructionsRelocatedAddress) + 1;
+
+  static constexpr intptr_t kIsolateEntryCount =
+      static_cast<intptr_t>(Relocation::DRT_GetThreadForNativeCallback) + 1;
+
+  static constexpr intptr_t RelocationIndex(Relocation reloc) {
     return static_cast<intptr_t>(reloc);
   }
 
-  static void Initialize(Thread* current, uword* bss);
+  static void Initialize(Thread* current, uword* bss, bool vm);
+
+  // Currently only used externally by LoadedElf::ResolveSymbols() to set the
+  // relocated address without changing the embedder interface.
+  static void InitializeBSSEntry(BSS::Relocation relocation,
+                                 uword new_value,
+                                 uword* bss_start);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index ec53422..d97b37d 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -4739,6 +4739,19 @@
   delete[] clusters_by_cid_;
 }
 
+void Serializer::FlushBytesWrittenToRoot() {
+#if defined(DART_PRECOMPILER)
+  if (profile_writer_ != nullptr) {
+    ASSERT(object_currently_writing_.id_ == 0);
+    // All bytes between objects are attributed into root node.
+    profile_writer_->AttributeBytesTo(
+        V8SnapshotProfileWriter::ArtificialRootId(),
+        stream_.Position() - object_currently_writing_.stream_start_);
+    object_currently_writing_.stream_start_ = stream_.Position();
+  }
+#endif
+}
+
 void Serializer::TraceStartWritingObject(const char* type,
                                          ObjectPtr obj,
                                          StringPtr name) {
@@ -4765,6 +4778,7 @@
     name_str = str.ToCString();
   }
 
+  FlushBytesWrittenToRoot();
   object_currently_writing_.object_ = obj;
   object_currently_writing_.id_ = id;
   object_currently_writing_.stream_start_ = stream_.Position();
@@ -4780,6 +4794,7 @@
         {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
         stream_.Position() - object_currently_writing_.stream_start_);
     object_currently_writing_ = ProfilingObject();
+    object_currently_writing_.stream_start_ = stream_.Position();
   }
 }
 
@@ -5606,6 +5621,8 @@
   Write<int32_t>(kSectionMarker);
 #endif
 
+  FlushBytesWrittenToRoot();
+
   PrintSnapshotSizes();
 
   // Note we are not clearing the object id table. The full ref table
@@ -5670,9 +5687,10 @@
     WriteRootRef(*p, kObjectStoreFieldNames[p - from]);
   }
 
+  FlushBytesWrittenToRoot();
   // The dispatch table is serialized only for precompiled snapshots.
   WriteDispatchTable(dispatch_table_entries);
-
+  object_currently_writing_.stream_start_ = stream_.Position();
 #if defined(DART_PRECOMPILER)
   // If any bytes were written for the dispatch table, add it to the profile.
   if (dispatch_table_size_ > 0 && profile_writer_ != nullptr) {
@@ -6647,6 +6665,19 @@
 
   deserializer.ReadVMSnapshot();
 
+#if defined(DART_PRECOMPILED_RUNTIME)
+  // Initialize entries in the VM portion of the BSS segment.
+  ASSERT(Snapshot::IncludesCode(kind_));
+  Image image(instructions_image_);
+  if (image.bss_offset() != 0) {
+    // The const cast is safe because we're translating from the start of the
+    // instructions (read-only) to the start of the BSS (read-write).
+    uword* const bss_start = const_cast<uword*>(reinterpret_cast<const uword*>(
+        instructions_image_ + image.bss_offset()));
+    BSS::Initialize(thread_, bss_start, /*vm=*/true);
+  }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+
   return ApiError::null();
 }
 
@@ -6714,7 +6745,7 @@
     }
   }
 
-  // Initialize symbols in the BSS, if present.
+  // Initialize entries in the isolate portion of the BSS segment.
   ASSERT(Snapshot::IncludesCode(kind_));
   Image image(instructions_image_);
   if (image.bss_offset() != 0) {
@@ -6722,7 +6753,7 @@
     // instructions (read-only) to the start of the BSS (read-write).
     uword* const bss_start = const_cast<uword*>(reinterpret_cast<const uword*>(
         instructions_image_ + image.bss_offset()));
-    BSS::Initialize(thread_, bss_start);
+    BSS::Initialize(thread_, bss_start, /*vm=*/false);
   }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index ddf07cb..bc86035 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -253,6 +253,7 @@
   WriteStream* stream() { return &stream_; }
   intptr_t bytes_written() { return stream_.bytes_written(); }
 
+  void FlushBytesWrittenToRoot();
   void TraceStartWritingObject(const char* type, ObjectPtr obj, StringPtr name);
   void TraceEndWritingObject();
 
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 512537e..20c0e5e 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -52,7 +52,7 @@
       "    i = 10; s1 = 'abcd'; k = 20; s2 = 'B'; s3 = 'C';"
       "    func(i, k);"
       "    return i + k; }"
-      "  static int moo() {"
+      "  static void moo() {"
       "    var i = A.foo();"
       "    if (i != 30) throw '$i != 30';"
       "  }\n"
diff --git a/runtime/vm/compiler/backend/bce_test.cc b/runtime/vm/compiler/backend/bce_test.cc
index 44bc798..4567e63 100644
--- a/runtime/vm/compiler/backend/bce_test.cc
+++ b/runtime/vm/compiler/backend/bce_test.cc
@@ -145,7 +145,7 @@
   const char* kScriptChars =
       R"(
       foo(int i) {
-        var l = new List<int>(3);
+        var l = List<int>.filled(3, 0);
         return l[i % 3] ?? l[i % (-3)];
       }
       main() {
@@ -278,7 +278,7 @@
   const char* kScriptChars =
       R"(
       List<int> foo(int count) {
-        var x = new List<int>(count);
+        var x = new List<int>.filled(count, 42);
         for (int i = 0; i < count; i++) {
           x[i] = 0;
         }
@@ -291,7 +291,7 @@
         foo(100);
       }
     )";
-  TestScriptJIT(kScriptChars, 2, 0);
+  TestScriptJIT(kScriptChars, 2, 1);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index c20199f..67bc54f 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1582,7 +1582,6 @@
       for (PhiIterator it(join); !it.Done(); it.Advance()) {
         auto phi = it.Current();
         if (TransformDefinition(phi)) {
-          phi->UnuseAllInputs();
           it.RemoveCurrentFromGraph();
         }
       }
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 6c7297f..49ba718 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -2231,8 +2231,26 @@
 
   for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
-    for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
-         it.Advance()) {
+    BlockEntryInstr* const block = block_it.Current();
+    if (auto join = block->AsJoinEntry()) {
+      for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        PhiInstr* current = it.Current();
+        if (current->HasUnmatchedInputRepresentations()) {
+          // Can't canonicalize this instruction until all conversions for its
+          // inputs are inserted.
+          continue;
+        }
+
+        Definition* replacement = current->Canonicalize(this);
+        ASSERT(replacement != nullptr);
+        if (replacement != current) {
+          current->ReplaceUsesWith(replacement);
+          it.RemoveCurrentFromGraph();
+          changed = true;
+        }
+      }
+    }
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
       Instruction* current = it.Current();
       if (current->HasUnmatchedInputRepresentations()) {
         // Can't canonicalize this instruction until all conversions for its
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index f0e0620..2808975 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -5477,8 +5477,11 @@
 }
 
 Definition* PhiInstr::GetReplacementForRedundantPhi() const {
-  ASSERT(InputCount() > 1);
   Definition* first = InputAt(0)->definition();
+  if (InputCount() == 1) {
+    return first;
+  }
+  ASSERT(InputCount() > 1);
   Definition* first_origin = first->OriginalDefinition();
   bool look_for_redefinition = false;
   for (intptr_t i = 1; i < InputCount(); ++i) {
@@ -5516,6 +5519,19 @@
   }
 }
 
+Definition* PhiInstr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* replacement = GetReplacementForRedundantPhi();
+  return (replacement != nullptr) ? replacement : this;
+}
+
+// Removes current phi from graph and sets current to previous phi.
+void PhiIterator::RemoveCurrentFromGraph() {
+  Current()->UnuseAllInputs();
+  (*phis_)[index_] = phis_->Last();
+  phis_->RemoveLast();
+  --index_;
+}
+
 Instruction* CheckConditionInstr::Canonicalize(FlowGraph* graph) {
   if (StrictCompareInstr* strict_compare = comparison()->AsStrictCompare()) {
     if ((InputAt(0)->definition()->OriginalDefinition() ==
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 1e7e67e..9376cab 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -1776,11 +1776,7 @@
   PhiInstr* Current() const { return (*phis_)[index_]; }
 
   // Removes current phi from graph and sets current to previous phi.
-  void RemoveCurrentFromGraph() {
-    (*phis_)[index_] = phis_->Last();
-    phis_->RemoveLast();
-    --index_;
-  }
+  void RemoveCurrentFromGraph();
 
  private:
   ZoneGrowableArray<PhiInstr*>* phis_;
@@ -2441,6 +2437,8 @@
   // The replacement is selected among values redefined by inputs.
   Definition* GetReplacementForRedundantPhi() const;
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
   PRINT_TO_SUPPORT
 
   enum ReceiverType { kUnknownReceiver = -1, kNotReceiver = 0, kReceiver = 1 };
diff --git a/runtime/vm/compiler/backend/il_test.cc b/runtime/vm/compiler/backend/il_test.cc
index e764780..ad763a3 100644
--- a/runtime/vm/compiler/backend/il_test.cc
+++ b/runtime/vm/compiler/backend/il_test.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "platform/utils.h"
 #include "vm/compiler/backend/il_test_helper.h"
 #include "vm/unit_test.h"
 
@@ -45,26 +46,28 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(IRTest_EliminateWriteBarrier) {
-  const char* kScript =
-      R"(
+  const char* tag = (FLAG_null_safety == kNullSafetyOptionStrong) ? "?" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
       class Container<T> {
         operator []=(var index, var value) {
           return data[index] = value;
         }
 
-        List<T> data = new List<T>()..length = 10;
+        List<T%s> data = List<T%s>.filled(10, null);
       }
 
-      Container<int> x = new Container<int>();
+      Container<int> x = Container<int>();
 
       foo() {
         for (int i = 0; i < 10; ++i) {
           x[i] = i;
         }
       }
-    )";
+    )", tag, tag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
   const auto& function = Function::Handle(GetFunction(root_library, "foo"));
 
   Invoke(root_library, "foo");
@@ -128,7 +131,9 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(IRTest_InitializingStores) {
-  const char* kScript = R"(
+  const char* tag = (FLAG_null_safety == kNullSafetyOptionStrong) ? "?" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class Bar {
       var f;
       var g;
@@ -140,7 +145,7 @@
     f3() {
       return () { };
     }
-    f4<T>({T value}) {
+    f4<T>({T%s value}) {
       return () { return value; };
     }
     main() {
@@ -149,8 +154,11 @@
       f3();
       f4();
     }
-  )";
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  )",
+  tag), std::free);
+  // clang-format on
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
   Invoke(root_library, "main");
 
   RunInitializingStoresTest(root_library, "f1", CompilerPass::kJIT,
diff --git a/runtime/vm/compiler/backend/reachability_fence_test.cc b/runtime/vm/compiler/backend/reachability_fence_test.cc
index 782bc02..d0e6e8f 100644
--- a/runtime/vm/compiler/backend/reachability_fence_test.cc
+++ b/runtime/vm/compiler/backend/reachability_fence_test.cc
@@ -15,14 +15,19 @@
 namespace dart {
 
 ISOLATE_UNIT_TEST_CASE(ReachabilityFence_Simple) {
-  const char* kScript =
-      R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* nullAssertTag = null_safety ? "!" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          R"(
       import 'dart:_internal' show reachabilityFence;
 
       int someGlobal = 0;
 
       class A {
-        int a;
+        int%s a;
       }
 
       void someFunction(int arg) {
@@ -31,12 +36,14 @@
 
       main() {
         final object = A()..a = 10;
-        someFunction(object.a);
+        someFunction(object.a%s);
         reachabilityFence(object);
       }
-      )";
+      )",
+      nullableTag, nullAssertTag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
@@ -71,14 +78,18 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(ReachabilityFence_Loop) {
-  const char* kScript =
-      R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* nullAssertTag = null_safety ? "!" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
       import 'dart:_internal' show reachabilityFence;
 
       int someGlobal = 0;
 
       class A {
-        int a;
+        int%s a;
       }
 
       @pragma('vm:never-inline')
@@ -93,13 +104,14 @@
       main() {
         final object = makeSomeA();
         for(int i = 0; i < 100000; i++) {
-          someFunction(object.a);
+          someFunction(object.a%s);
           reachabilityFence(object);
         }
       }
-      )";
+      )", nullableTag, nullAssertTag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
@@ -134,14 +146,18 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(ReachabilityFence_NoCanonicalize) {
-  const char* kScript =
-      R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* nullAssertTag = null_safety ? "!" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
       import 'dart:_internal' show reachabilityFence;
 
       int someGlobal = 0;
 
       class A {
-        int a;
+        int%s a;
       }
 
       @pragma('vm:never-inline')
@@ -157,15 +173,16 @@
         final object = makeSomeA();
         reachabilityFence(object);
         for(int i = 0; i < 100000; i++) {
-          someFunction(object.a);
+          someFunction(object.a%s);
           reachabilityFence(object);
         }
         reachabilityFence(object);
         reachabilityFence(object);
       }
-      )";
+      )", nullableTag, nullAssertTag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 45c4b24..c211abb 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -3683,14 +3683,6 @@
             if (FLAG_trace_optimization) {
               THR_Print("Removing dead phi v%" Pd "\n", phi->ssa_temp_index());
             }
-          } else if (auto* replacement = phi->GetReplacementForRedundantPhi()) {
-            phi->ReplaceUsesWith(replacement);
-            phi->UnuseAllInputs();
-            (*join->phis_)[i] = nullptr;
-            if (FLAG_trace_optimization) {
-              THR_Print("Removing redundant phi v%" Pd "\n",
-                        phi->ssa_temp_index());
-            }
           } else {
             (*join->phis_)[to_index++] = phi;
           }
@@ -3782,7 +3774,6 @@
       for (PhiIterator it(join); !it.Done(); it.Advance()) {
         PhiInstr* current = it.Current();
         if (!live.Contains(current->ssa_temp_index())) {
-          current->UnuseAllInputs();
           it.RemoveCurrentFromGraph();
         }
       }
@@ -3799,7 +3790,6 @@
           continue;
         }
       }
-      current->UnuseAllInputs();
       it.RemoveCurrentFromGraph();
     }
   }
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index fdbd957..5027e27 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -905,7 +905,7 @@
   const char* kScript = R"(
     class Bar {
       Bar() { a = null; }
-      Object a;
+      dynamic a;
     }
 
     Bar foo() {
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index fcf1393..119b2f3 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -20,12 +20,9 @@
             false,
             "Generate always trampolines (for testing purposes).");
 
-// The trampolines will be disguised as FreeListElement objects, with a 1-word
-// object header in front of the jump code.
-const intptr_t kOffsetInTrampoline = kWordSize;
-const intptr_t kTrampolineSize = Utils::RoundUp(
-    kOffsetInTrampoline + PcRelativeTrampolineJumpPattern::kLengthInBytes,
-    kObjectAlignment);
+const intptr_t kTrampolineSize =
+    Utils::RoundUp(PcRelativeTrampolineJumpPattern::kLengthInBytes,
+                   ImageWriter::kBareInstructionsAlignment);
 
 CodeRelocator::CodeRelocator(Thread* thread,
                              GrowableArray<CodePtr>* code_objects,
@@ -402,8 +399,7 @@
       FindDestinationInText(callee, unresolved_trampoline->offset_into_target);
   const int32_t distance = destination_text - trampoline_text_offset;
 
-  PcRelativeTrampolineJumpPattern pattern(trampoline_start +
-                                          kOffsetInTrampoline);
+  PcRelativeTrampolineJumpPattern pattern(trampoline_start);
   pattern.Initialize();
   pattern.set_distance(distance);
   ASSERT(pattern.distance() == distance);
@@ -467,25 +463,6 @@
   return destination_.raw();
 }
 
-static void MarkAsFreeListElement(uint8_t* trampoline_bytes,
-                                  intptr_t trampoline_length) {
-  uint32_t tags = 0;
-#if defined(IS_SIMARM_X64)
-  // Account for difference in kObjectAlignment between host and target.
-  tags = ObjectLayout::SizeTag::update(trampoline_length * 2, tags);
-#else
-  tags = ObjectLayout::SizeTag::update(trampoline_length, tags);
-#endif
-  tags = ObjectLayout::ClassIdTag::update(kFreeListElement, tags);
-  tags = ObjectLayout::OldBit::update(true, tags);
-  tags = ObjectLayout::OldAndNotMarkedBit::update(true, tags);
-  tags = ObjectLayout::OldAndNotRememberedBit::update(true, tags);
-  tags = ObjectLayout::NewBit::update(false, tags);
-
-  auto header_word = reinterpret_cast<uintptr_t*>(trampoline_bytes);
-  *header_word = tags;
-}
-
 void CodeRelocator::BuildTrampolinesForAlmostOutOfRangeCalls() {
   while (!all_unresolved_calls_.IsEmpty()) {
     UnresolvedCall* unresolved_call = all_unresolved_calls_.First();
@@ -497,8 +474,7 @@
     const intptr_t future_boundary =
         next_text_offset_ + max_instructions_size_ +
         kTrampolineSize *
-            (unresolved_calls_by_destination_.Length() + max_calls_) +
-        kOffsetInTrampoline;
+            (unresolved_calls_by_destination_.Length() + max_calls_);
     if (IsTargetInRangeFor(unresolved_call, future_boundary) &&
         !FLAG_always_generate_trampolines_for_testing) {
       break;
@@ -530,14 +506,19 @@
       // [ImageWriter], which will eventually write out the bytes and delete the
       // buffer.
       auto trampoline_bytes = new uint8_t[kTrampolineSize];
-      memset(trampoline_bytes, 0x00, kTrampolineSize);
+      ASSERT((kTrampolineSize % compiler::target::kWordSize) == 0);
+      for (uint8_t* cur = trampoline_bytes;
+           cur < trampoline_bytes + kTrampolineSize;
+           cur += compiler::target::kWordSize) {
+        *reinterpret_cast<compiler::target::uword*>(cur) =
+            kBreakInstructionFiller;
+      }
       auto unresolved_trampoline = new UnresolvedTrampoline{
           unresolved_call->callee,
           unresolved_call->offset_into_target,
           trampoline_bytes,
-          next_text_offset_ + kOffsetInTrampoline,
+          next_text_offset_,
       };
-      MarkAsFreeListElement(trampoline_bytes, kTrampolineSize);
       AddTrampolineToText(callee, trampoline_bytes, kTrampolineSize);
       EnqueueUnresolvedTrampoline(unresolved_trampoline);
       trampoline_text_offset = unresolved_trampoline->text_offset;
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index 737e213..53b16e8 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -13,28 +13,32 @@
 
 ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_JoinSuccessors) {
   DEBUG_ONLY(FLAG_trace_write_barrier_elimination = true);
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* nullAssertTag = null_safety ? "!" : "";
 
   // This is a regression test for a bug where we were using
   // JoinEntry::SuccessorCount() to determine the number of outgoing blocks
   // from the join block. JoinEntry::SuccessorCount() is in fact always 0;
   // JoinEntry::last_instruction()->SuccessorCount() should be used instead.
-  const char* kScript =
-      R"(
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr, R"(
       class C {
-        int value;
-        C next;
-        C prev;
+        int%s value;
+        C%s next;
+        C%s prev;
       }
 
       @pragma("vm:never-inline")
       fn() {}
 
       foo(int x) {
-        C prev = C();
-        C next;
+        C%s prev = C();
+        C%s next;
         while (x --> 0) {
           next = C();
-          next.prev = prev;
+          next%s.prev = prev;
           prev?.next = next;
           prev = next;
           fn();
@@ -43,9 +47,12 @@
       }
 
       main() { foo(10); }
-      )";
+      )",
+      nullableTag, nullableTag, nullableTag, nullableTag,
+      nullableTag, nullAssertTag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
@@ -77,15 +84,17 @@
 
 ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_AtLeastOnce) {
   DEBUG_ONLY(FLAG_trace_write_barrier_elimination = true);
-
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
   // Ensure that we process every block at least once during the analysis
   // phase so that the out-sets will be initialized. If we don't process
   // each block at least once, the store "c.next = n" will be marked
   // NoWriteBarrier.
-  const char* kScript =
-      R"(
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                                     R"(
       class C {
-        C next;
+        %s C next;
       }
 
       @pragma("vm:never-inline")
@@ -102,9 +111,9 @@
       }
 
       main() { foo(0); foo(10); }
-      )";
-
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+      )", lateTag), std::free);
+  // clang-format on
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
@@ -133,13 +142,18 @@
 ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_Arrays) {
   DEBUG_ONLY(FLAG_trace_write_barrier_elimination = true);
 
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* lateTag = null_safety ? "late" : "";
+
   // Test that array allocations are not considered usable after a
   // may-trigger-GC instruction (in this case CheckStackOverflow), unlike
   // normal allocations, which are only interruped by a Dart call.
-  const char* kScript =
-      R"(
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
       class C {
-        C next;
+        %s C next;
       }
 
       @pragma("vm:never-inline")
@@ -148,7 +162,7 @@
       foo(int x) {
         C c = C();
         C n = C();
-        List<C> array = List<C>(1);
+        List<C%s> array = List<C%s>.filled(1, null);
         while (x --> 0) {
           c.next = n;
           n = c;
@@ -159,9 +173,10 @@
       }
 
       main() { foo(10); }
-      )";
+      )", lateTag, nullableTag, nullableTag), std::free);
+  // clang-format on
 
-  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& root_library = Library::Handle(LoadTestScript(kScript.get()));
 
   Invoke(root_library, "main");
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 24eea81..f8467df 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3033,12 +3033,17 @@
       return store->type_argument_legacy_string();
   }
   UNREACHABLE();
-  return NULL;
+  return TypeArguments::null();
 }
 
 DART_EXPORT Dart_Handle Dart_NewListOf(Dart_CoreType_Id element_type_id,
                                        intptr_t length) {
   DARTSCOPE(Thread::Current());
+  if (T->isolate()->null_safety() && element_type_id != Dart_CoreType_Dynamic) {
+    return Api::NewError(
+        "Cannot use legacy types with --null-safety enabled. "
+        "Use Dart_NewListOfType or Dart_NewListOfTypeFilled instead.");
+  }
   CHECK_LENGTH(length, Array::kMaxElements);
   CHECK_CALLBACK_STATE(T);
   const Array& arr = Array::Handle(Z, Array::New(length));
@@ -5584,6 +5589,11 @@
                                      Dart_Handle class_name,
                                      intptr_t number_of_type_arguments,
                                      Dart_Handle* type_arguments) {
+  if (Thread::Current()->isolate()->null_safety()) {
+    return Api::NewError(
+        "Cannot use legacy types with --null-safety enabled. "
+        "Use Dart_GetNullableType or Dart_GetNonNullableType instead.");
+  }
   return GetTypeCommon(library, class_name, number_of_type_arguments,
                        type_arguments, Nullability::kLegacy);
 }
@@ -6520,24 +6530,33 @@
   Dwarf* debug_dwarf =
       generate_debug ? new (Z) Dwarf(Z, nullptr, debug_elf) : nullptr;
 
+  // Here, both VM and isolate will be compiled into a single snapshot.
+  // In assembly generation, each serialized text section gets a separate
+  // pointer into the BSS segment and BSS slots are created for each, since
+  // we may not serialize both VM and isolate. Here, we always serialize both,
+  // so make a BSS segment large enough for both, with the VM entries coming
+  // first.
+  auto const isolate_offset = BSS::kVmEntryCount * compiler::target::kWordSize;
+  auto const bss_size =
+      isolate_offset + BSS::kIsolateEntryCount * compiler::target::kWordSize;
   // Note that the BSS section must come first because it cannot be placed in
   // between any two non-writable segments, due to a bug in Jelly Bean's ELF
   // loader. See also Elf::WriteProgramTable().
-  const intptr_t bss_base =
-      elf->AddBSSData("_kDartBSSData", sizeof(compiler::target::uword));
+  const intptr_t vm_bss_base = elf->AddBSSData("_kDartBSSData", bss_size);
+  const intptr_t isolate_bss_base = vm_bss_base + isolate_offset;
   // Add the BSS section to the separately saved debugging information, even
   // though there will be no code in it to relocate, since it precedes the
   // .text sections and thus affects their virtual addresses.
   if (debug_dwarf != nullptr) {
-    debug_elf->AddBSSData("_kDartBSSData", sizeof(compiler::target::uword));
+    debug_elf->AddBSSData("_kDartBSSData", bss_size);
   }
 
   BlobImageWriter vm_image_writer(T, &vm_snapshot_instructions_buffer,
                                   ApiReallocate, kInitialSize, debug_dwarf,
-                                  bss_base, elf, elf_dwarf);
+                                  vm_bss_base, elf, elf_dwarf);
   BlobImageWriter isolate_image_writer(T, &isolate_snapshot_instructions_buffer,
                                        ApiReallocate, kInitialSize, debug_dwarf,
-                                       bss_base, elf, elf_dwarf);
+                                       isolate_bss_base, elf, elf_dwarf);
   FullSnapshotWriter writer(Snapshot::kFullAOT, &vm_snapshot_data_buffer,
                             &isolate_snapshot_data_buffer, ApiReallocate,
                             &vm_image_writer, &isolate_image_writer);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 4f1551d..6b501e6 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1079,7 +1079,7 @@
   EXPECT_VALID(result);
   EXPECT(is_static);
 
-  Dart_Handle klass = Dart_GetType(lib, NewString("Foo"), 0, NULL);
+  Dart_Handle klass = Dart_GetNonNullableType(lib, NewString("Foo"), 0, NULL);
   EXPECT_VALID(klass);
 
   Dart_Handle instance = Dart_Allocate(klass);
@@ -1174,7 +1174,7 @@
 TEST_CASE(DartAPI_ClassLibrary) {
   Dart_Handle lib = Dart_LookupLibrary(NewString("dart:core"));
   EXPECT_VALID(lib);
-  Dart_Handle type = Dart_GetType(lib, NewString("int"), 0, NULL);
+  Dart_Handle type = Dart_GetNonNullableType(lib, NewString("int"), 0, NULL);
   EXPECT_VALID(type);
   Dart_Handle result = Dart_ClassLibrary(type);
   EXPECT_VALID(result);
@@ -1695,7 +1695,7 @@
 TEST_CASE(DartAPI_ListAccess) {
   const char* kScriptChars =
       "List testMain() {"
-      "  List a = new List();"
+      "  List a = List.empty(growable: true);"
       "  a.add(10);"
       "  a.add(20);"
       "  a.add(30);"
@@ -4034,7 +4034,9 @@
   EXPECT_VALID(double_type);
   EXPECT_VALID(Dart_ListSetAt(type_args, 1, double_type));
   Dart_Handle myclass0_type =
-      Dart_GetType(lib, NewString("MyClass0"), 2, &type_args);
+      (FLAG_null_safety == kNullSafetyOptionStrong)
+          ? Dart_GetNonNullableType(lib, NewString("MyClass0"), 2, &type_args)
+          : Dart_GetType(lib, NewString("MyClass0"), 2, &type_args);
   EXPECT_VALID(myclass0_type);
 
   type_args = Dart_NewList(2);
@@ -4046,7 +4048,9 @@
   EXPECT_VALID(list_type);
   EXPECT_VALID(Dart_ListSetAt(type_args, 1, list_type));
   Dart_Handle myclass1_type =
-      Dart_GetType(lib, NewString("MyClass1"), 2, &type_args);
+      (FLAG_null_safety == kNullSafetyOptionStrong)
+          ? Dart_GetNonNullableType(lib, NewString("MyClass1"), 2, &type_args)
+          : Dart_GetType(lib, NewString("MyClass1"), 2, &type_args);
   EXPECT_VALID(myclass1_type);
 
   // Now create objects of the type and validate the object type matches
@@ -4220,7 +4224,7 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("Fields"), 0, NULL);
+  Dart_Handle type = Dart_GetNonNullableType(lib, NewString("Fields"), 0, NULL);
   EXPECT_VALID(type);
   Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(instance);
@@ -4413,7 +4417,9 @@
 }
 
 TEST_CASE(DartAPI_SetField_BadType) {
-  const char* kScriptChars = "int foo;\n";
+  const char* kScriptChars = (FLAG_null_safety == kNullSafetyOptionStrong)
+                                 ? "late int foo;\n"
+                                 : "int foo;\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle name = NewString("foo");
   Dart_Handle result = Dart_SetField(lib, name, Dart_True());
@@ -4435,22 +4441,29 @@
 }
 
 TEST_CASE(DartAPI_InjectNativeFields2) {
-  const char* kScriptChars =
-      "class NativeFields extends NativeFieldsWrapper {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "}\n"
-      "NativeFields testMain() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  return obj;\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class NativeFields extends NativeFieldsWrapper {\n"
+                  "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+                  "  int fld1;\n"
+                  "  final int fld;\n"
+                  "  static int%s fld3;\n"
+                  "  static const int fld4 = 10;\n"
+                  "}\n"
+                  "NativeFields testMain() {\n"
+                  "  NativeFields obj = new NativeFields(10, 20);\n"
+                  "  return obj;\n"
+                  "}\n",
+                  nullableTag), std::free);
+  // clang-format on
+
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
   Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
+      TestCase::LoadTestScript(kScriptChars.get(), NULL, USER_TEST_URI, false);
 
   // Invoke a function which returns an object of type NativeFields.
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4462,24 +4475,31 @@
 }
 
 TEST_CASE(DartAPI_InjectNativeFields3) {
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';"
-      "class NativeFields extends NativeFieldWrapperClass2 {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "}\n"
-      "NativeFields testMain() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  return obj;\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "import 'dart:nativewrappers';"
+                  "class NativeFields extends NativeFieldWrapperClass2 {\n"
+                  "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+                  "  int fld1;\n"
+                  "  final int fld2;\n"
+                  "  static int%s fld3;\n"
+                  "  static const int fld4 = 10;\n"
+                  "}\n"
+                  "NativeFields testMain() {\n"
+                  "  NativeFields obj = new NativeFields(10, 20);\n"
+                  "  return obj;\n"
+                  "}\n",
+                  nullableTag), std::free);
+  // clang-format on
   Dart_Handle result;
   const int kNumNativeFields = 2;
 
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars.get(), native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4504,22 +4524,27 @@
 }
 
 TEST_CASE(DartAPI_InjectNativeFields4) {
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';"
-      "class NativeFields extends NativeFieldWrapperClass2 {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "}\n"
-      "NativeFields testMain() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  return obj;\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class NativeFields extends NativeFieldsWrapperClass2 {\n"
+                  "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+                  "  int fld1;\n"
+                  "  final int fld;\n"
+                  "  static int%s fld3;\n"
+                  "  static const int fld4 = 10;\n"
+                  "}\n"
+                  "NativeFields testMain() {\n"
+                  "  NativeFields obj = new NativeFields(10, 20);\n"
+                  "  return obj;\n"
+                  "}\n",
+                  nullableTag), std::free);
+  // clang-format on
   Dart_Handle result;
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars.get(), NULL);
 
   // Invoke a function which returns an object of type NativeFields.
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4585,27 +4610,36 @@
 }
 
 TEST_CASE(DartAPI_TestNativeFieldsAccess) {
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';"
-      "class NativeFields extends NativeFieldWrapperClass2 {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "  int initNativeFlds() native 'TestNativeFieldsAccess_init';\n"
-      "  int accessNativeFlds(int i) native 'TestNativeFieldsAccess_access';\n"
-      "}\n"
-      "NativeFields testMain() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  obj.initNativeFlds();\n"
-      "  obj.accessNativeFlds(null);\n"
-      "  return obj;\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(
+          nullptr,
+          "import 'dart:nativewrappers';"
+          "class NativeFields extends NativeFieldWrapperClass2 {\n"
+          "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+          "  int fld1;\n"
+          "  final int fld2;\n"
+          "  static int%s fld3;\n"
+          "  static const int fld4 = 10;\n"
+          "  int%s initNativeFlds() native 'TestNativeFieldsAccess_init';\n"
+          "  int%s accessNativeFlds(int%s i) native "
+          "'TestNativeFieldsAccess_access';\n"
+          "}\n"
+          "NativeFields testMain() {\n"
+          "  NativeFields obj = new NativeFields(10, 20);\n"
+          "  obj.initNativeFlds();\n"
+          "  obj.accessNativeFlds(null);\n"
+          "  return obj;\n"
+          "}\n",
+          nullableTag, nullableTag, nullableTag, nullableTag),
+      std::free);
+  // clang-format on
 
   // Load up a test script in the test library.
-  Dart_Handle lib =
-      TestCase::LoadTestScript(kScriptChars, TestNativeFieldsAccess_lookup);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars.get(),
+                                             TestNativeFieldsAccess_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4717,22 +4751,30 @@
 }
 
 TEST_CASE(DartAPI_ImplicitNativeFieldAccess) {
-  const char* kScriptChars =
-      "import 'dart:nativewrappers';"
-      "class NativeFields extends NativeFieldWrapperClass4 {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld0;\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "}\n"
-      "NativeFields testMain() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  return obj;\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "import 'dart:nativewrappers';"
+                  "class NativeFields extends NativeFieldWrapperClass4 {\n"
+                  "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+                  "  int%s fld0;\n"
+                  "  int fld1;\n"
+                  "  final int fld2;\n"
+                  "  static int%s fld3;\n"
+                  "  static const int fld4 = 10;\n"
+                  "}\n"
+                  "NativeFields testMain() {\n"
+                  "  NativeFields obj = new NativeFields(10, 20);\n"
+                  "  return obj;\n"
+                  "}\n",
+                  nullableTag, nullableTag),
+      std::free);
+  // clang-format on
   // Load up a test script in the test library.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars.get(), native_field_lookup);
 
   // Invoke a function which returns an object of type NativeFields.
   Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
@@ -4743,26 +4785,35 @@
 }
 
 TEST_CASE(DartAPI_NegativeNativeFieldAccess) {
-  const char* kScriptChars =
-      "class NativeFields {\n"
-      "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  static int fld3;\n"
-      "  static const int fld4 = 10;\n"
-      "}\n"
-      "NativeFields testMain1() {\n"
-      "  NativeFields obj = new NativeFields(10, 20);\n"
-      "  return obj;\n"
-      "}\n"
-      "Function testMain2() {\n"
-      "  return () {};\n"
-      "}\n";
+  bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "import 'dart:nativewrappers';\n"
+                  "class NativeFields {\n"
+                  "  NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
+                  "  int fld1;\n"
+                  "  final int fld2;\n"
+                  "  static int%s fld3;\n"
+                  "  static const int fld4 = 10;\n"
+                  "}\n"
+                  "NativeFields testMain1() {\n"
+                  "  NativeFields obj = new NativeFields(10, 20);\n"
+                  "  return obj;\n"
+                  "}\n"
+                  "Function testMain2() {\n"
+                  "  return () {};\n"
+                  "}\n",
+                  nullableTag),
+      std::free);
+  // clang-format on
+
   Dart_Handle result;
   CHECK_API_SCOPE(thread);
 
   // Create a test library and Load up a test script in it.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars.get(), NULL);
 
   // Invoke a function which returns an object of type NativeFields.
   Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain1"), 0, NULL);
@@ -4823,7 +4874,8 @@
   Dart_Handle result;
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("TestClass"), 0, NULL);
   EXPECT_VALID(type);
 
   // Invoke a function which returns an object.
@@ -4865,7 +4917,8 @@
 
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("TestClass"), 0, NULL);
   EXPECT_VALID(type);
 
   result = Dart_GetField(type, NewString("fld2"));
@@ -4886,7 +4939,8 @@
 
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("TestClass"), 0, NULL);
   EXPECT_VALID(type);
 
   result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13));
@@ -4927,9 +4981,11 @@
       "}\n";
 
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("MyClass"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("MyClass"), 0, NULL);
   EXPECT_VALID(type);
-  Dart_Handle intf = Dart_GetType(lib, NewString("MyInterface"), 0, NULL);
+  Dart_Handle intf =
+      Dart_GetNonNullableType(lib, NewString("MyInterface"), 0, NULL);
   EXPECT_VALID(intf);
   Dart_Handle args[1];
   args[0] = Dart_NewInteger(11);
@@ -5135,7 +5191,8 @@
   // factories.
   Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core"));
   EXPECT_VALID(core_lib);
-  Dart_Handle list_type = Dart_GetType(core_lib, NewString("List"), 0, NULL);
+  Dart_Handle list_type =
+      Dart_GetNonNullableType(core_lib, NewString("List"), 0, NULL);
   EXPECT_VALID(list_type);
 
   const int kNumArgs = 1;
@@ -5156,16 +5213,21 @@
   const int kNumArgs = 1;
   Dart_Handle args[kNumArgs];
   const char* str;
-
+  Dart_Handle result;
   Dart_Handle string_list = Dart_NewListOf(Dart_CoreType_String, 1);
-  EXPECT_VALID(string_list);
-  args[0] = string_list;
-  Dart_Handle result =
-      Dart_Invoke(lib, NewString("expectListOfString"), kNumArgs, args);
-  EXPECT_VALID(result);
-  result = Dart_StringToCString(result, &str);
-  EXPECT_VALID(result);
-  EXPECT_STREQ("null", str);
+  if (!Dart_IsError(string_list)) {
+    args[0] = string_list;
+    Dart_Handle result =
+        Dart_Invoke(lib, NewString("expectListOfString"), kNumArgs, args);
+    EXPECT_VALID(result);
+    result = Dart_StringToCString(result, &str);
+    EXPECT_VALID(result);
+    EXPECT_STREQ("null", str);
+  } else {
+    EXPECT_ERROR(string_list,
+                 "Cannot use legacy types with --null-safety enabled. "
+                 "Use Dart_NewListOfType or Dart_NewListOfTypeFilled instead.");
+  }
 
   Dart_Handle dynamic_list = Dart_NewListOf(Dart_CoreType_Dynamic, 1);
   EXPECT_VALID(dynamic_list);
@@ -5176,12 +5238,17 @@
   EXPECT_STREQ("null", str);
 
   Dart_Handle int_list = Dart_NewListOf(Dart_CoreType_Int, 1);
-  EXPECT_VALID(int_list);
-  args[0] = int_list;
-  result = Dart_Invoke(lib, NewString("expectListOfInt"), kNumArgs, args);
-  EXPECT_VALID(result);
-  result = Dart_StringToCString(result, &str);
-  EXPECT_STREQ("null", str);
+  if (!Dart_IsError(int_list)) {
+    args[0] = int_list;
+    result = Dart_Invoke(lib, NewString("expectListOfInt"), kNumArgs, args);
+    EXPECT_VALID(result);
+    result = Dart_StringToCString(result, &str);
+    EXPECT_STREQ("null", str);
+  } else {
+    EXPECT_ERROR(int_list,
+                 "Cannot use legacy types with --null-safety enabled. "
+                 "Use Dart_NewListOfType or Dart_NewListOfTypeFilled instead.");
+  }
 }
 
 TEST_CASE(DartAPI_NewListOfType) {
@@ -5197,7 +5264,8 @@
       "void expectListOfNever(List<Never> _) {}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
-  Dart_Handle zxhandle_type = Dart_GetType(lib, NewString("ZXHandle"), 0, NULL);
+  Dart_Handle zxhandle_type =
+      Dart_GetNullableType(lib, NewString("ZXHandle"), 0, NULL);
   EXPECT_VALID(zxhandle_type);
 
   Dart_Handle zxhandle = Dart_New(zxhandle_type, Dart_Null(), 0, NULL);
@@ -5209,7 +5277,7 @@
   EXPECT_VALID(Dart_ListSetAt(zxhandle_list, 0, zxhandle));
 
   Dart_Handle readresult_type =
-      Dart_GetType(lib, NewString("ChannelReadResult"), 0, NULL);
+      Dart_GetNonNullableType(lib, NewString("ChannelReadResult"), 0, NULL);
   EXPECT_VALID(zxhandle_type);
 
   const int kNumArgs = 1;
@@ -5228,7 +5296,7 @@
   EXPECT_VALID(dart_core);
 
   Dart_Handle string_type =
-      Dart_GetType(dart_core, NewString("String"), 0, NULL);
+      Dart_GetNonNullableType(dart_core, NewString("String"), 0, NULL);
   EXPECT_VALID(string_type);
   Dart_Handle string_list = Dart_NewListOfType(string_type, 0);
   EXPECT_VALID(string_list);
@@ -5293,7 +5361,7 @@
   EXPECT(Dart_IdentityEquals(result, zxhandle));
 
   Dart_Handle readresult_type =
-      Dart_GetType(lib, NewString("ChannelReadResult"), 0, NULL);
+      Dart_GetNonNullableType(lib, NewString("ChannelReadResult"), 0, NULL);
   EXPECT_VALID(zxhandle_type);
 
   const int kNumArgs = 1;
@@ -5355,7 +5423,8 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("Methods"), 0, NULL);
   EXPECT_VALID(type);
   Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(instance);
@@ -5461,7 +5530,8 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("Methods"), 0, NULL);
   Dart_Handle result;
   EXPECT_VALID(type);
   Dart_Handle name = NewString("_staticMethod");
@@ -5554,7 +5624,8 @@
 
   // Shared setup.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("Methods"), 0, NULL);
   EXPECT_VALID(type);
   Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(instance);
@@ -5672,7 +5743,8 @@
   // Create a test library and Load up a test script in it.
   // The test library must have a dart: url so it can import dart:_internal.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("TestClass"), 0, NULL);
   EXPECT_VALID(type);
 
   // Invoke a function which returns an object.
@@ -5806,7 +5878,8 @@
 static intptr_t native_arg_str_peer = 100;
 static void NativeArgumentCreate(Dart_NativeArguments args) {
   Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
-  Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("MyObject"), 0, NULL);
   EXPECT_VALID(type);
 
   // Allocate without a constructor.
@@ -6038,94 +6111,53 @@
   const Dart_Handle name = NewString("Class");
   // Lookup the legacy type for Class.
   Dart_Handle type = Dart_GetType(lib, name, 0, NULL);
-  EXPECT_VALID(type);
-  bool result = false;
-  EXPECT_VALID(Dart_IsLegacyType(type, &result));
-  EXPECT(result);
+  Dart_Handle nonNullableType;
+  Dart_Handle nullableType;
+  if (Dart_IsError(type)) {
+    EXPECT_ERROR(
+        type,
+        "Cannot use legacy types with --null-safety enabled. "
+        "Use Dart_GetNullableType or Dart_GetNonNullableType instead.");
 
-  // Legacy -> Nullable
-  Dart_Handle nullableType = Dart_TypeToNullableType(type);
-  EXPECT_VALID(nullableType);
-  result = false;
-  EXPECT_VALID(Dart_IsNullableType(nullableType, &result));
-  EXPECT(result);
-  EXPECT(Dart_IdentityEquals(nullableType,
-                             Dart_GetNullableType(lib, name, 0, nullptr)));
+    nonNullableType = Dart_GetNonNullableType(lib, name, 0, nullptr);
+    EXPECT_VALID(nonNullableType);
+    nullableType = Dart_GetNullableType(lib, name, 0, nullptr);
+  } else {
+    EXPECT_VALID(type);
+    bool result = false;
+    EXPECT_VALID(Dart_IsLegacyType(type, &result));
+    EXPECT(result);
 
-  // Legacy -> Non-Nullable
-  Dart_Handle nonNullableType = Dart_TypeToNonNullableType(type);
-  EXPECT_VALID(nonNullableType);
-  result = false;
-  EXPECT_VALID(Dart_IsNonNullableType(nonNullableType, &result));
-  EXPECT(result);
-  EXPECT(Dart_IdentityEquals(nonNullableType,
-                             Dart_GetNonNullableType(lib, name, 0, nullptr)));
+    // Legacy -> Nullable
+    nullableType = Dart_TypeToNullableType(type);
+    EXPECT_VALID(nullableType);
+    result = false;
+    EXPECT_VALID(Dart_IsNullableType(nullableType, &result));
+    EXPECT(result);
+    EXPECT(Dart_IdentityEquals(nullableType,
+                               Dart_GetNullableType(lib, name, 0, nullptr)));
+
+    // Legacy -> Non-Nullable
+    nonNullableType = Dart_TypeToNonNullableType(type);
+    EXPECT_VALID(nonNullableType);
+    result = false;
+    EXPECT_VALID(Dart_IsNonNullableType(nonNullableType, &result));
+    EXPECT(result);
+    EXPECT(Dart_IdentityEquals(nonNullableType,
+                               Dart_GetNonNullableType(lib, name, 0, nullptr)));
+  }
 
   // Nullable -> Non-Nullable
   EXPECT(Dart_IdentityEquals(
       nonNullableType,
       Dart_TypeToNonNullableType(Dart_GetNullableType(lib, name, 0, nullptr))));
 
-  // Nullable -> Non-Nullable
+  // Non-Nullable -> Nullable
   EXPECT(Dart_IdentityEquals(
       nullableType,
       Dart_TypeToNullableType(Dart_GetNonNullableType(lib, name, 0, nullptr))));
 }
 
-TEST_CASE(DartAPI_GetType) {
-  const char* kScriptChars =
-      "library testlib;\n"
-      "class Class {\n"
-      "  static var name = 'Class';\n"
-      "}\n"
-      "\n"
-      "class _Class {\n"
-      "  static var name = '_Class';\n"
-      "}\n";
-
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-
-  // Lookup a class.
-  Dart_Handle type = Dart_GetType(lib, NewString("Class"), 0, NULL);
-  EXPECT_VALID(type);
-  bool result = false;
-  EXPECT_VALID(Dart_IsLegacyType(type, &result));
-  EXPECT(result);
-  Dart_Handle name = Dart_GetField(type, NewString("name"));
-  EXPECT_VALID(name);
-  const char* name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
-  EXPECT_STREQ("Class", name_cstr);
-
-  // Lookup a private class.
-  type = Dart_GetType(lib, NewString("_Class"), 0, NULL);
-  EXPECT_VALID(type);
-  result = false;
-  EXPECT_VALID(Dart_IsLegacyType(type, &result));
-  EXPECT(result);
-  name = Dart_GetField(type, NewString("name"));
-  EXPECT_VALID(name);
-  name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
-  EXPECT_STREQ("_Class", name_cstr);
-
-  // Lookup a class that does not exist.
-  type = Dart_GetType(lib, NewString("DoesNotExist"), 0, NULL);
-  EXPECT(Dart_IsError(type));
-  EXPECT_STREQ("Type 'DoesNotExist' not found in library 'testlib'.",
-               Dart_GetError(type));
-
-  // Lookup a class from an error library.  The error propagates.
-  type = Dart_GetType(Api::NewError("myerror"), NewString("Class"), 0, NULL);
-  EXPECT(Dart_IsError(type));
-  EXPECT_STREQ("myerror", Dart_GetError(type));
-
-  // Lookup a type using an error class name.  The error propagates.
-  type = Dart_GetType(lib, Api::NewError("myerror"), 0, NULL);
-  EXPECT(Dart_IsError(type));
-  EXPECT_STREQ("myerror", Dart_GetError(type));
-}
-
 TEST_CASE(DartAPI_GetNullableType) {
   const char* kScriptChars =
       "library testlib;\n"
@@ -6263,7 +6295,8 @@
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 
   // Fetch InstanceOfTest class.
-  Dart_Handle type = Dart_GetType(lib, NewString("InstanceOfTest"), 0, NULL);
+  Dart_Handle type =
+      Dart_GetNonNullableType(lib, NewString("InstanceOfTest"), 0, NULL);
   EXPECT_VALID(type);
 
   // Invoke a function which returns an object of type InstanceOf..
@@ -6279,7 +6312,8 @@
   EXPECT(is_instance);
 
   // Fetch OtherClass and check if instanceOfTestObj is instance of it.
-  Dart_Handle otherType = Dart_GetType(lib, NewString("OtherClass"), 0, NULL);
+  Dart_Handle otherType =
+      Dart_GetNonNullableType(lib, NewString("OtherClass"), 0, NULL);
   EXPECT_VALID(otherType);
 
   result = Dart_ObjectIsType(instanceOfTestObj, otherType, &is_instance);
@@ -6472,7 +6506,7 @@
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
   EXPECT(Dart_IsLibrary(lib));
-  Dart_Handle type = Dart_GetType(lib, NewString("Test"), 0, NULL);
+  Dart_Handle type = Dart_GetNonNullableType(lib, NewString("Test"), 0, NULL);
   EXPECT_VALID(type);
 
   result = Dart_SetNativeResolver(Dart_Null(), &MyNativeResolver1, NULL);
@@ -8206,9 +8240,9 @@
       "void main() {\n"
       "  var v;\n"
       "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = new List();\n"
+      "    var t = [];\n"
       "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(new List(100));\n"
+      "      t.add(List.filled(100, null));\n"
       "    }\n"
       "    v = t;\n"
       "    notifyIdle();\n"
@@ -8237,9 +8271,9 @@
       "void main() {\n"
       "  var v;\n"
       "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = new List();\n"
+      "    var t = [];\n"
       "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(new List(100));\n"
+      "      t.add(List.filled(100, null));\n"
       "    }\n"
       "    v = t;\n"
       "    notifyIdle();\n"
@@ -8269,9 +8303,9 @@
       "void main() {\n"
       "  var v;\n"
       "  for (var i = 0; i < 100; i++) {\n"
-      "    var t = new List();\n"
+      "    var t = [];\n"
       "    for (var j = 0; j < 10000; j++) {\n"
-      "      t.add(new List(100));\n"
+      "      t.add(List.filled(100, null));\n"
       "    }\n"
       "    v = t;\n"
       "    notifyLowMemory();\n"
@@ -8346,6 +8380,7 @@
           if (!condition) {
             throw 'Failed to validate InvokeVMServiceMethod() response.';
           }
+          return false;
         }
         bool validateResult(Uint8List bytes) {
           final map = json.decode(utf8.decode(bytes));
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index 6ed8438..7fb427c4 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -642,22 +642,6 @@
   AddSection(shstrtab_, ".shstrtab");
 }
 
-// The VM segment comes after the program header segment and BSS segments,
-// both of which are a single page.
-static constexpr uword kVmSnapshotOffset = 2 * Elf::kPageSize;
-
-// Find the relocated base of the loaded ELF snapshot. Returns 0 if there is
-// no loaded ELF snapshot.
-uword Elf::SnapshotRelocatedBaseAddress(uword vm_start) {
-  // We can't running from a loaded ELF snapshot if this is the case.
-  if (vm_start < kVmSnapshotOffset) return 0;
-
-  const Image vm_instructions_image(reinterpret_cast<const void*>(vm_start));
-  if (!vm_instructions_image.compiled_to_elf()) return 0;
-
-  return vm_start - kVmSnapshotOffset;
-}
-
 void Elf::AddSection(Section* section, const char* name) {
   ASSERT(section_table_file_size_ < 0);
   ASSERT(!shstrtab_->HasBeenFinalized());
@@ -824,8 +808,6 @@
   FinalizeProgramTable();
   ComputeFileOffsets();
 
-  ASSERT(VerifySegmentOrder());
-
   // Finally, write the ELF file contents.
   WriteHeader();
   WriteProgramTable();
@@ -891,63 +873,6 @@
   file_offset += section_table_file_size_;
 }
 
-bool Elf::VerifySegmentOrder() {
-  // We can only verify the segment order after FinalizeProgramTable(), since
-  // we assume that all segments have been added, including the two program
-  // table segments.
-  ASSERT(program_table_file_size_ > 0);
-
-  // Find the names and symbols for the .bss and .text segments.
-  auto const bss_section_name = shstrtab_->Lookup(".bss");
-  // For separate debugging information for assembly snapshots, no .bss section
-  // is added. However, we're only interested in strict segment orders when
-  // generating ELF snapshots, so only continue when there's a .bss section.
-  if (bss_section_name == -1) return true;
-  auto const text_section_name = shstrtab_->Lookup(".text");
-  ASSERT(text_section_name != -1);
-
-  auto const bss_symbol_name = dynstrtab_->Lookup("_kDartBSSData");
-  auto const vm_symbol_name =
-      dynstrtab_->Lookup(kVmSnapshotInstructionsAsmSymbol);
-  auto const isolate_symbol_name =
-      dynstrtab_->Lookup(kIsolateSnapshotInstructionsAsmSymbol);
-  ASSERT(bss_symbol_name != -1);
-  ASSERT(vm_symbol_name != -1);
-  ASSERT(isolate_symbol_name != -1);
-
-  auto const bss_symbol = dynsym_->FindSymbolWithNameIndex(bss_symbol_name);
-  auto const vm_symbol = dynsym_->FindSymbolWithNameIndex(vm_symbol_name);
-  auto const isolate_symbol =
-      dynsym_->FindSymbolWithNameIndex(isolate_symbol_name);
-  ASSERT(bss_symbol != nullptr);
-  ASSERT(vm_symbol != nullptr);
-  ASSERT(isolate_symbol != nullptr);
-
-  // Check that the first non-program table segments are in the expected order.
-  auto const bss_segment = segments_[2];
-  ASSERT_EQUAL(bss_segment->segment_type, elf::PT_LOAD);
-  ASSERT_EQUAL(bss_segment->section_name(), bss_section_name);
-  ASSERT_EQUAL(bss_segment->memory_offset(), bss_symbol->offset);
-  ASSERT_EQUAL(bss_segment->MemorySize(), bss_symbol->size);
-  auto const vm_segment = segments_[3];
-  ASSERT_EQUAL(vm_segment->segment_type, elf::PT_LOAD);
-  ASSERT_EQUAL(vm_segment->section_name(), text_section_name);
-  ASSERT_EQUAL(vm_segment->memory_offset(), vm_symbol->offset);
-  ASSERT_EQUAL(vm_segment->MemorySize(), vm_symbol->size);
-  auto const isolate_segment = segments_[4];
-  ASSERT_EQUAL(isolate_segment->segment_type, elf::PT_LOAD);
-  ASSERT_EQUAL(isolate_segment->section_name(), text_section_name);
-  ASSERT_EQUAL(isolate_segment->memory_offset(), isolate_symbol->offset);
-  ASSERT_EQUAL(isolate_segment->MemorySize(), isolate_symbol->size);
-
-  // Also make sure that the memory offset of the VM segment is as expected.
-  ASSERT_EQUAL(bss_segment->memory_offset(), kPageSize);
-  ASSERT(bss_segment->MemorySize() <= kPageSize);
-  ASSERT_EQUAL(vm_segment->memory_offset(), kVmSnapshotOffset);
-
-  return true;
-}
-
 void Elf::WriteHeader() {
 #if defined(TARGET_ARCH_IS_32_BIT)
   uint8_t size = elf::ELFCLASS32;
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index c204457..17ce455 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -26,12 +26,6 @@
 
   static const intptr_t kPageSize = 4096;
 
-  // Used by the non-symbolic stack frame printer to calculate the relocated
-  // base address of the loaded ELF snapshot given the start of the VM
-  // instructions. Only works for ELF snapshots written by Dart, not those
-  // compiled from assembly.
-  static uword SnapshotRelocatedBaseAddress(uword vm_start);
-
   intptr_t NextMemoryOffset() const { return memory_offset_; }
   intptr_t NextSectionIndex() const { return sections_.length(); }
   intptr_t AddText(const char* name, const uint8_t* bytes, intptr_t size);
@@ -92,7 +86,6 @@
 
   void FinalizeProgramTable();
   void ComputeFileOffsets();
-  bool VerifySegmentOrder();
 
   void WriteHeader();
   void WriteSectionTable();
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index 3334ea1..5c13efe 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -32,7 +32,7 @@
       "class A {\n"
       "  var f1 = 3.0;\n"
       "  dynamic f2 = 3;\n"
-      "  var f3 = new List(4);\n"
+      "  var f3 = List<dynamic>.filled(4, null);\n"
       "  foo() {\n"
       "    f1 = f1 + f1;\n"
       "  }\n"
@@ -43,14 +43,14 @@
       "}\n"
       "\n"
       "runFoo() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.foo();\n"
       "  }\n"
       "}\n"
       "\n"
       "runBar() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.bar();\n"
       "  }\n"
@@ -83,7 +83,7 @@
       "class A {\n"
       "  var f1 = 3.0;\n"
       "  dynamic f2 = 3;\n"
-      "  final f3 = new List(4);\n"
+      "  final f3 = List<dynamic>.filled(4, null);\n"
       "  foo() {\n"
       "    f1 = f1 + f1;\n"
       "  }\n"
@@ -94,14 +94,14 @@
       "}\n"
       "\n"
       "runFoo() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.foo();\n"
       "  }\n"
       "}\n"
       "\n"
       "runBar() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.bar();\n"
       "  }\n"
@@ -136,7 +136,7 @@
       "class A {\n"
       "  var f1 = 3.0;\n"
       "  dynamic f2 = 3;\n"
-      "  final f3 = new List();\n"
+      "  final f3 = List.empty(growable: true);\n"
       "  foo() {\n"
       "    f1 = f1 + f1;\n"
       "  }\n"
@@ -147,14 +147,14 @@
       "}\n"
       "\n"
       "runFoo() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.foo();\n"
       "  }\n"
       "}\n"
       "\n"
       "runBar() {\n"
-      "  var a = new A();\n"
+      "  var a = A();\n"
       "  for (int i = 0; i < 2000; i++) {\n"
       "    a.bar();\n"
       "  }\n"
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index 33c8500..461513d 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -68,7 +68,7 @@
 TEST_CASE(LargeSweep) {
   const char* kScriptChars =
       "main() {\n"
-      "  return new List(8 * 1024 * 1024);\n"
+      "  return List.filled(8 * 1024 * 1024, null);\n"
       "}\n";
   NOT_IN_PRODUCT(FLAG_verbose_gc = true);
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 0b0b911..63a49e6 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -310,11 +310,17 @@
   auto& owner = Object::Handle(zone);
   auto& url = String::Handle(zone);
   auto& name = String::Handle(zone);
+  intptr_t trampolines_total_size = 0;
 
   JSONWriter js;
   js.OpenArray();
   for (intptr_t i = 0; i < instructions_.length(); i++) {
     auto& data = instructions_[i];
+    const bool is_trampoline = data.code_ == nullptr;
+    if (is_trampoline) {
+      trampolines_total_size += data.trampoline_length;
+      continue;
+    }
     owner = WeakSerializationReference::Unwrap(data.code_->owner());
     js.OpenObject();
     if (owner.IsFunction()) {
@@ -337,6 +343,12 @@
     js.PrintProperty("s", SizeInSnapshot(data.insns_->raw()));
     js.CloseObject();
   }
+  if (trampolines_total_size != 0) {
+    js.OpenObject();
+    js.PrintProperty("n", "[Stub] Trampoline");
+    js.PrintProperty("s", trampolines_total_size);
+    js.CloseObject();
+  }
   js.CloseArray();
 
   auto file_open = Dart::file_open_callback();
@@ -409,6 +421,9 @@
 }
 
 void ImageWriter::WriteROData(WriteStream* stream) {
+#if defined(DART_PRECOMPILER)
+  const intptr_t start_position = stream->Position();
+#endif
   stream->Align(kMaxObjectAlignment);
 
   // Heap page starts here.
@@ -419,6 +434,14 @@
   // Zero values for other image header fields.
   stream->Align(kMaxObjectAlignment);
   ASSERT(stream->Position() - section_start == Image::kHeaderSize);
+#if defined(DART_PRECOMPILER)
+  if (profile_writer_ != nullptr) {
+    const intptr_t end_position = stream->Position();
+    profile_writer_->AttributeBytesTo(
+        V8SnapshotProfileWriter::ArtificialRootId(),
+        end_position - start_position);
+  }
+#endif
 
   // Heap page objects start here.
 
@@ -661,6 +684,13 @@
 
   text_offset += Align(kMaxObjectAlignment, text_offset);
   ASSERT_EQUAL(text_offset, Image::kHeaderSize);
+#if defined(DART_PRECOMPILER)
+  if (profile_writer_ != nullptr) {
+    profile_writer_->AttributeBytesTo(
+        V8SnapshotProfileWriter::ArtificialRootId(),
+        (next_text_offset_ - image_size) + Image::kHeaderSize);
+  }
+#endif
 
   // Only valid if bare_instruction_payloads is true.
   V8SnapshotProfileWriter::ObjectId instructions_section_id(offset_space_, -1);
@@ -906,10 +936,10 @@
   Align(Image::kBssAlignment);
   assembly_stream_.Print("%s:\n", bss_symbol);
 
-  // Currently we only put one symbol in the data section, the address of
-  // DLRT_GetThreadForNativeCallback, which is populated when the snapshot is
-  // loaded.
-  WriteWordLiteralText(0);
+  auto const entry_count = vm ? BSS::kVmEntryCount : BSS::kIsolateEntryCount;
+  for (intptr_t i = 0; i < entry_count; i++) {
+    WriteWordLiteralText(0);
+  }
 #endif
 
 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID) ||                  \
@@ -1095,15 +1125,24 @@
   instructions_blob_stream_.WriteTargetWord(image_size);
 #if defined(DART_PRECOMPILER)
   // Store the offset of the BSS section from the instructions section here.
-  // The lowest bit is set to indicate we compiled directly to ELF.
-  const word bss_offset = bss_base_ - segment_base;
+  // If not compiling to ELF (and thus no BSS segment), write 0.
+  const word bss_offset = elf_ != nullptr ? bss_base_ - segment_base : 0;
   ASSERT_EQUAL(Utils::RoundDown(bss_offset, Image::kBssAlignment), bss_offset);
-  instructions_blob_stream_.WriteTargetWord(bss_offset | 0x1);
+  // Set the lowest bit if we are compiling to ELF.
+  const word compiled_to_elf = elf_ != nullptr ? 0x1 : 0x0;
+  instructions_blob_stream_.WriteTargetWord(bss_offset | compiled_to_elf);
 #else
   instructions_blob_stream_.WriteTargetWord(0);  // No relocations.
 #endif
   instructions_blob_stream_.Align(kMaxObjectAlignment);
   ASSERT_EQUAL(instructions_blob_stream_.Position(), Image::kHeaderSize);
+#if defined(DART_PRECOMPILER)
+  if (profile_writer_ != nullptr) {
+    profile_writer_->AttributeBytesTo(
+        V8SnapshotProfileWriter::ArtificialRootId(),
+        (image_size - next_text_offset_) + Image::kHeaderSize);
+  }
+#endif
 
   // Only valid when bare_instructions_payloads is true.
   const V8SnapshotProfileWriter::ObjectId instructions_section_id(
@@ -1277,12 +1316,12 @@
             insns.PayloadStart() + reloc_offset);
 
         // Overwrite the relocation position in the instruction stream with the
-        // (positive) offset of the start of the payload from the start of the
-        // BSS segment plus the addend in the relocation.
-        instructions_blob_stream_.SetPosition(payload_offset + reloc_offset);
+        // offset of the BSS segment from the relocation position plus the
+        // addend in the relocation.
+        auto const text_offset = payload_offset + reloc_offset;
+        instructions_blob_stream_.SetPosition(text_offset);
 
-        const compiler::target::word offset =
-            bss_base_ - (segment_base + payload_offset + reloc_offset) + addend;
+        const compiler::target::word offset = bss_offset - text_offset + addend;
         instructions_blob_stream_.WriteTargetWord(offset);
       }
 
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 72411fb..da66a90 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -274,36 +274,44 @@
 }
 
 TEST_CASE(IsolateReload_KernelIncrementalCompileBaseClass) {
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
   // clang-format off
-  Dart_SourceFile sourcefiles[] = {
+  auto kSourceFile1 =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class State<T, U> {\n"
+                                "  T%s t;\n"
+                                "  U%s u;\n"
+                                "  State(List l) {\n"
+                                "    t = l[0] is T ? l[0] : null;\n"
+                                "    u = l[1] is U ? l[1] : null;\n"
+                                "  }\n"
+                                "}\n",
+                                nullableTag, nullableTag),
+                              std::free);
+  Dart_SourceFile sourcefiles[3] = {
       {
           "file:///test-app.dart",
           "import 'test-util.dart';\n"
           "main() {\n"
           "  var v = doWork();"
-          "  return v == 42 ? 1: v == null ? -1: 0;\n"
+          "  return v == 42 ? 1 : v == null ? -1 : 0;\n"
           "}\n",
       },
       {
           "file:///test-lib.dart",
-          "class State<T, U> {\n"
-          "  T t;\n"
-          "  U u;\n"
-          "  State(List l) {\n"
-          "    t = l[0] is T? l[0]: null;\n"
-          "    u = l[1] is U? l[1]: null;\n"
-          "  }\n"
-          "}\n",
+          kSourceFile1.get()
       },
       {
-          "file:///test-util.dart",
-          "import 'test-lib.dart';\n"
-          "class MyAccountState extends State<int, String> {\n"
-          "  MyAccountState(List l): super(l) {}\n"
-          "  first() => t;\n"
-          "}\n"
-          "doWork() => new MyAccountState(<dynamic>[42, 'abc']).first();\n"
-      }};
+        "file:///test-util.dart",
+        "import 'test-lib.dart';\n"
+        "class MyAccountState extends State<int, String> {\n"
+        "  MyAccountState(List l): super(l) {}\n"
+        "  first() => t;\n"
+        "}\n"
+        "doWork() => new MyAccountState(<dynamic>[42, 'abc']).first();\n"
+      }
+  };
   // clang-format on
 
   Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
@@ -316,20 +324,22 @@
   EXPECT_VALID(result);
   EXPECT_EQ(1, value);
 
-  // clang-format off
-  Dart_SourceFile updated_sourcefiles[] = {
-      {
-          "file:///test-lib.dart",
-          "class State<U, T> {\n"
-          "  T t;\n"
-          "  U u;\n"
-          "  State(List l) {\n"
-          "    t = l[0] is T? l[0]: null;\n"
-          "    u = l[1] is U? l[1]: null;\n"
-          "  }\n"
-          "}\n",
-      }};
-  // clang-format on
+  auto kUpdatedSourceFile =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "class State<U, T> {\n"
+                                          "  T%s t;\n"
+                                          "  U%s u;\n"
+                                          "  State(List l) {\n"
+                                          "    t = l[0] is T ? l[0] : null;\n"
+                                          "    u = l[1] is U ? l[1] : null;\n"
+                                          "  }\n"
+                                          "}\n",
+                                          nullableTag, nullableTag),
+                              std::free);
+  Dart_SourceFile updated_sourcefiles[1] = {{
+      "file:///test-lib.dart",
+      kUpdatedSourceFile.get(),
+  }};
   {
     const uint8_t* kernel_buffer = NULL;
     intptr_t kernel_buffer_size = 0;
@@ -717,34 +727,46 @@
 }
 
 TEST_CASE(IsolateReload_ConstructorChanged) {
-  const char* kScript =
-      "class A {\n"
-      "  int field;\n"
-      "  A() { field = 20; }\n"
-      "}\n"
-      "var savedA = new A();\n"
-      "main() {\n"
-      "  var newA = new A();\n"
-      "  return 'saved:${savedA.field} new:${newA.field}';\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class A {\n"
+                  "  %s int field;\n"
+                  "  A() { field = 20; }\n"
+                  "}\n"
+                  "var savedA = A();\n"
+                  "main() {\n"
+                  "  var newA = A();\n"
+                  "  return 'saved:${savedA.field} new:${newA.field}';\n"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("saved:20 new:20", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadScript =
-      "var _unused;"
-      "class A {\n"
-      "  int field;\n"
-      "  A() { field = 10; }\n"
-      "}\n"
-      "var savedA = new A();\n"
-      "main() {\n"
-      "  var newA = new A();\n"
-      "  return 'saved:${savedA.field} new:${newA.field}';\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "var _unused;"
+                  "class A {\n"
+                  "  %s int field;\n"
+                  "  A() { field = 10; }\n"
+                  "}\n"
+                  "var savedA = A();\n"
+                  "main() {\n"
+                  "  var newA = A();\n"
+                  "  return 'saved:${savedA.field} new:${newA.field}';\n"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ("saved:20 new:10", SimpleInvokeStr(lib, "main"));
 }
@@ -1823,10 +1845,10 @@
       "class C {\n"
       "  foo() => 'old';\n"
       "}\n"
-      "List list = new List(2);\n"
-      "Set set = new Set();\n"
+      "List list = List<dynamic>.filled(2, null);\n"
+      "Set set = Set();\n"
       "main() {\n"
-      "  var c = new C();\n"
+      "  var c = C();\n"
       "  list[0] = c.foo;\n"
       "  list[1] = c.foo;\n"
       "  set.add(c.foo);\n"
@@ -1851,10 +1873,10 @@
       "class C {\n"
       "  foo() => 'new';\n"
       "}\n"
-      "List list = new List(2);\n"
-      "Set set = new Set();\n"
+      "List list = List<dynamic>.filled(2, null);\n"
+      "Set set = Set();\n"
       "main() {\n"
-      "  var c = new C();\n"
+      "  var c = C();\n"
       "  list[0] = c.foo;\n"
       "  list[1] = c.foo;\n"
       "  set.add(c.foo);\n"
@@ -3423,120 +3445,161 @@
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializers) {
-  const char* kScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                            "class Foo {\n"
+                                            "  int x = 4;\n"
+                                            "}\n"
+                                            "%s Foo value;\n"
+                                            "main() {\n"
+                                            "  value = Foo();\n"
+                                            "  return value.x;\n"
+                                            "}\n",
+                                            lateTag),
+                                         std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = 7;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return value.y;\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                                  "class Foo {\n"
+                                                  "  int x = 4;\n"
+                                                  "  int y = 7;\n"
+                                                  "}\n"
+                                                  "%s Foo value;\n"
+                                                  "main() {\n"
+                                                  "  return value.y;\n"
+                                                  "}\n",
+                                                  lateTag),
+                                               std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances.
   EXPECT_EQ(7, SimpleInvoke(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersReferenceStaticField) {
-  const char* kScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "int myInitialValue = 8 * 7;\n"
+                                          "class Foo {\n"
+                                          "  int x = 4;\n"
+                                          "}\n"
+                                          "%s Foo value;\n"
+                                          "main() {\n"
+                                          "  value = Foo();\n"
+                                          "  return value.x;\n"
+                                          "}\n",
+                                          lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y.
-  const char* kReloadScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = myInitialValue;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return value.y;\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "int myInitialValue = 8 * 7;\n"
+                                          "class Foo {\n"
+                                          "  int x = 4;\n"
+                                          "  int y = myInitialValue;\n"
+                                          "}\n"
+                                          "%s Foo value;\n"
+                                          "main() {\n"
+                                          "  return value.y;\n"
+                                          "}\n",
+                                          lateTag),
+                              std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances.
   EXPECT_EQ(56, SimpleInvoke(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersLazy) {
-  const char* kScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "Foo value1;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  value1 = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "int myInitialValue = 8 * 7;\n"
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "%s Foo value1;\n"
+                                "main() {\n"
+                                "  value = Foo();\n"
+                                "  value1 = Foo();\n"
+                                "  return value.x;\n"
+                                "}\n",
+                                lateTag, lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y.
-  const char* kReloadScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = myInitialValue++;\n"
-      "}\n"
-      "Foo value;\n"
-      "Foo value1;\n"
-      "main() {\n"
-      "  return '${myInitialValue} ${value.y} ${value1.y} ${myInitialValue}';\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "int myInitialValue = 8 * 7;\n"
+                  "class Foo {\n"
+                  "  int x = 4;\n"
+                  "  int y = myInitialValue++;\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "%s Foo value1;\n"
+                  "main() {\n"
+                  "  return '${myInitialValue} ${value.y} ${value1.y} "
+                  "${myInitialValue}';\n"
+                  "}\n",
+                  lateTag, lateTag),
+      std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that field initializers ran lazily.
   EXPECT_STREQ("56 56 57 58", SimpleInvokeStr(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersLazyConst) {
-  const char* kScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                            "class Foo {\n"
+                                            "  int x = 4;\n"
+                                            "}\n"
+                                            "%s Foo value;\n"
+                                            "main() {\n"
+                                            "  value = Foo();\n"
+                                            "  return value.x;\n"
+                                            "}\n",
+                                            lateTag),
+                                         std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
@@ -3544,158 +3607,204 @@
   // function in the VM because the initializer is a literal, but we should not
   // eagerly initialize with the literal so that the behavior doesn't depend on
   // this optimization.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = 5;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return 0;\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                                  "class Foo {\n"
+                                                  "  int x = 4;\n"
+                                                  "  int y = 5;\n"
+                                                  "}\n"
+                                                  "%s Foo value;\n"
+                                                  "main() {\n"
+                                                  "  return 0;\n"
+                                                  "}\n",
+                                                  lateTag),
+                                               std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_EQ(0, SimpleInvoke(lib, "main"));
 
   // Change y's initializer and check this new initializer is used.
-  const char* kReloadScript2 =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = 6;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return value.y;\n"
-      "}\n";
+  auto kReloadScript2 =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "class Foo {\n"
+                                          "  int x = 4;\n"
+                                          "  int y = 6;\n"
+                                          "}\n"
+                                          "%s Foo value;\n"
+                                          "main() {\n"
+                                          "  return value.y;\n"
+                                          "}\n",
+                                          lateTag),
+                              std::free);
 
-  lib = TestCase::ReloadTestScript(kReloadScript2);
+  lib = TestCase::ReloadTestScript(kReloadScript2.get());
   EXPECT_VALID(lib);
   EXPECT_EQ(6, SimpleInvoke(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersLazyTransitive) {
-  const char* kScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "Foo value1;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  value1 = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "int myInitialValue = 8 * 7;\n"
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "%s Foo value1;\n"
+                                "main() {\n"
+                                "  value = Foo();\n"
+                                "  value1 = Foo();\n"
+                                "  return value.x;\n"
+                                "}\n",
+                                lateTag, lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y. Do not touch y.
-  const char* kReloadScript =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = myInitialValue++;\n"
-      "}\n"
-      "Foo value;\n"
-      "Foo value1;\n"
-      "main() {\n"
-      "  return '${myInitialValue}';\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "int myInitialValue = 8 * 7;\n"
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "  int y = myInitialValue++;\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "%s Foo value1;\n"
+                                "main() {\n"
+                                "  return '${myInitialValue}';\n"
+                                "}\n",
+                                lateTag, lateTag),
+                              std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ("56", SimpleInvokeStr(lib, "main"));
 
   // Reload again. Field y's getter still needs to keep for initialization even
   // though it is no longer new.
-  const char* kReloadScript2 =
-      "int myInitialValue = 8 * 7;\n"
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = myInitialValue++;\n"
-      "}\n"
-      "Foo value;\n"
-      "Foo value1;\n"
-      "main() {\n"
-      "  return '${myInitialValue} ${value.y} ${value1.y} ${myInitialValue}';\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript2 = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "int myInitialValue = 8 * 7;\n"
+                  "class Foo {\n"
+                  "  int x = 4;\n"
+                  "  int y = myInitialValue++;\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "%s Foo value1;\n"
+                  "main() {\n"
+                  "  return '${myInitialValue} ${value.y} ${value1.y} "
+                  "${myInitialValue}';\n"
+                  "}\n",
+                  lateTag, lateTag),
+      std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript2);
+  lib = TestCase::ReloadTestScript(kReloadScript2.get());
   EXPECT_VALID(lib);
   // Verify that field initializers ran lazily.
   EXPECT_STREQ("56 56 57 58", SimpleInvokeStr(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersThrows) {
-  const char* kScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                            "class Foo {\n"
+                                            "  int x = 4;\n"
+                                            "}\n"
+                                            "%s Foo value;\n"
+                                            "main() {\n"
+                                            "  value = Foo();\n"
+                                            "  return value.x;\n"
+                                            "}\n",
+                                            lateTag),
+                                         std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = throw 'exception';\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  try {\n"
-      "    return value.y.toString();\n"
-      "  } catch (e) {\n"
-      "    return e.toString();\n"
-      "  }\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "  int y = throw 'exception';\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "main() {\n"
+                                "  try {\n"
+                                "    return value.y.toString();\n"
+                                "  } catch (e) {\n"
+                                "    return e.toString();\n"
+                                "  }\n"
+                                "}\n",
+                                lateTag),
+                              std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances.
   EXPECT_STREQ("exception", SimpleInvokeStr(lib, "main"));
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersCyclicInitialization) {
-  const char* kScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "class Foo {\n"
+                                            "  int x = 4;\n"
+                                            "}\n"
+                                            "%s Foo value;\n"
+                                            "main() {\n"
+                                            "  value = Foo();\n"
+                                            "  return value.x;\n"
+                                            "}\n",
+                                            lateTag),
+                                         std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = value.y;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  try {\n"
-      "    return value.y.toString();\n"
-      "  } catch (e) {\n"
-      "    return e.toString();\n"
-      "  }\n"
-      "}\n";
-
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  // clang-format off
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "  int y = value.y;\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "main() {\n"
+                                "  try {\n"
+                                "    return value.y.toString();\n"
+                                "  } catch (e) {\n"
+                                "    return e.toString();\n"
+                                "  }\n"
+                                "}\n",
+                                lateTag),
+                              std::free);
+  // clang-format on
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ("Stack Overflow", SimpleInvokeStr(lib, "main"));
 }
@@ -3703,143 +3812,190 @@
 // When an initializer expression has a syntax error, we detect it at reload
 // time.
 TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError) {
-  const char* kScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                            "class Foo {\n"
+                                            "  int x = 4;\n"
+                                            "}\n"
+                                            "%s Foo value;\n"
+                                            "main() {\n"
+                                            "  value = Foo();\n"
+                                            "  return value.x;\n"
+                                            "}\n",
+                                            lateTag),
+                                         std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y with a syntax error in the initializing expression.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  int x = 4;\n"
-      "  int y = ......;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return '${value.y == null}';"
-      "}\n";
+  // clang-format off
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class Foo {\n"
+                                "  int x = 4;\n"
+                                "  int y = ......;\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "main() {\n"
+                                "  return '${value.y == null}';"
+                                "}\n",
+                                lateTag),
+                              std::free);
+  // clang-format on
 
   // The reload fails because the initializing expression is parsed at
   // class finalization time.
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_ERROR(lib, "...");
 }
 
 // When an initializer expression has a syntax error, we detect it at reload
 // time.
 TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError2) {
-  const char* kScript =
-      "class Foo {\n"
-      "  Foo() { /* default constructor */ }\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class Foo {\n"
+                  "  Foo() { /* default constructor */ }\n"
+                  "  int x = 4;\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "main() {\n"
+                  "  value = Foo();\n"
+                  "  return value.x;\n"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y with a syntax error in the initializing expression.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  Foo() { /* default constructor */ }\n"
-      "  int x = 4;\n"
-      "  int y = ......;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return '${value.y == null}';"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class Foo {\n"
+                  "  Foo() { /* default constructor */ }\n"
+                  "  int x = 4;\n"
+                  "  int y = ......;\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "main() {\n"
+                  "  return '${value.y == null}';"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
   // The reload fails because the initializing expression is parsed at
   // class finalization time.
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_ERROR(lib, "...");
 }
 
 // When an initializer expression has a syntax error, we detect it at reload
 // time.
 TEST_CASE(IsolateReload_RunNewFieldInitializersSyntaxError3) {
-  const char* kScript =
-      "class Foo {\n"
-      "  Foo() { /* default constructor */ }\n"
-      "  int x = 4;\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  return value.x;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class Foo {\n"
+                  "  Foo() { /* default constructor */ }\n"
+                  "  int x = 4;\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "main() {\n"
+                  "  value = Foo();\n"
+                  "  return value.x;\n"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
 
   // Add the field y with a syntax error in the initializing expression.
-  const char* kReloadScript =
-      "class Foo {\n"
-      "  Foo() { /* default constructor */ }\n"
-      "  int x = 4;\n"
-      "  int y = ......\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return '${value.y == null}';"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class Foo {\n"
+                  "  Foo() { /* default constructor */ }\n"
+                  "  int x = 4;\n"
+                  "  int y = ......\n"
+                  "}\n"
+                  "%s Foo value;\n"
+                  "main() {\n"
+                  "  return '${value.y == null}';"
+                  "}\n",
+                  lateTag),
+      std::free);
+  // clang-format on
 
   // The reload fails because the initializing expression is parsed at
   // class finalization time.
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_ERROR(lib, "......");
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersSuperClass) {
-  const char* kScript =
-      "class Super {\n"
-      "  static var foo = 'right';\n"
-      "}\n"
-      "class Foo extends Super {\n"
-      "  static var foo = 'wrong';\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  Super.foo;\n"
-      "  Foo.foo;\n"
-      "  value = new Foo();\n"
-      "  return 0;\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class Super {\n"
+                                "  static var foo = 'right';\n"
+                                "}\n"
+                                "class Foo extends Super {\n"
+                                "  static var foo = 'wrong';\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "main() {\n"
+                                "  Super.foo;\n"
+                                "  Foo.foo;\n"
+                                "  value = Foo();\n"
+                                "  return 0;\n"
+                                "}\n",
+                                lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_EQ(0, SimpleInvoke(lib, "main"));
 
-  const char* kReloadScript =
-      "class Super {\n"
-      "  static var foo = 'right';\n"
-      "  var newField = foo;\n"
-      "}\n"
-      "class Foo extends Super {\n"
-      "  static var foo = 'wrong';\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return value.newField;\n"
-      "}\n";
+  // clang-format on
+  auto kReloadScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                          "class Super {\n"
+                                          "  static var foo = 'right';\n"
+                                          "  var newField = foo;\n"
+                                          "}\n"
+                                          "class Foo extends Super {\n"
+                                          "  static var foo = 'wrong';\n"
+                                          "}\n"
+                                          "%s Foo value;\n"
+                                          "main() {\n"
+                                          "  return value.newField;\n"
+                                          "}\n",
+                                          lateTag),
+                              std::free);
+  // clang-format off
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances in the
   // correct scope.
@@ -3851,50 +4007,62 @@
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersWithConsts) {
-  const char* kScript =
-      "class C {\n"
-      "  final x;\n"
-      "  const C(this.x);\n"
-      "}\n"
-      "var a = const C(const C(1));\n"
-      "var b = const C(const C(2));\n"
-      "var c = const C(const C(3));\n"
-      "var d = const C(const C(4));\n"
-      "class Foo {\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  value = new Foo();\n"
-      "  a; b; c; d;\n"
-      "  return 'Okay';\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class C {\n"
+                                "  final x;\n"
+                                "  const C(this.x);\n"
+                                "}\n"
+                                "var a = const C(const C(1));\n"
+                                "var b = const C(const C(2));\n"
+                                "var c = const C(const C(3));\n"
+                                "var d = const C(const C(4));\n"
+                                "class Foo {\n"
+                                "}\n"
+                                "%s Foo value;\n"
+                                "main() {\n"
+                                "  value = Foo();\n"
+                                "  a; b; c; d;\n"
+                                "  return 'Okay';\n"
+                                "}\n",
+                                lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), nullptr);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadScript =
-      "class C {\n"
-      "  final x;\n"
-      "  const C(this.x);\n"
-      "}\n"
-      "var a = const C(const C(1));\n"
-      "var b = const C(const C(2));\n"
-      "var c = const C(const C(3));\n"
-      "var d = const C(const C(4));\n"
-      "class Foo {\n"
-      "  var d = const C(const C(4));\n"
-      "  var c = const C(const C(3));\n"
-      "  var b = const C(const C(2));\n"
-      "  var a = const C(const C(1));\n"
-      "}\n"
-      "Foo value;\n"
-      "main() {\n"
-      "  return '${identical(a, value.a)} ${identical(b, value.b)}'"
-      "      ' ${identical(c, value.c)} ${identical(d, value.d)}';\n"
-      "}\n";
-
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(
+          nullptr,
+          "class C {\n"
+          "  final x;\n"
+          "  const C(this.x);\n"
+          "}\n"
+          "var a = const C(const C(1));\n"
+          "var b = const C(const C(2));\n"
+          "var c = const C(const C(3));\n"
+          "var d = const C(const C(4));\n"
+          "class Foo {\n"
+          "  var d = const C(const C(4));\n"
+          "  var c = const C(const C(3));\n"
+          "  var b = const C(const C(2));\n"
+          "  var a = const C(const C(1));\n"
+          "}\n"
+          "%s Foo value;\n"
+          "main() {\n"
+          "  return '${identical(a, value.a)} ${identical(b, value.b)}'"
+          "      ' ${identical(c, value.c)} ${identical(d, value.d)}';\n"
+          "}\n",
+          lateTag),
+      std::free);
+  // clang-format on
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances and the const
   // expressions were properly canonicalized.
@@ -3902,36 +4070,49 @@
 }
 
 TEST_CASE(IsolateReload_RunNewFieldInitializersWithGenerics) {
-  const char* kScript =
-      "class Foo<T> {\n"
-      "  T x;\n"
-      "}\n"
-      "Foo value1;\n"
-      "Foo value2;\n"
-      "main() {\n"
-      "  value1 = new Foo<String>();\n"
-      "  value2 = new Foo<int>();\n"
-      "  return 'Okay';\n"
-      "}\n";
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = null_safety ? "?" : "";
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                "class Foo<T> {\n"
+                                "  T%s x;\n"
+                                "}\n"
+                                "%s Foo value1;\n"
+                                "%s Foo value2;\n"
+                                "main() {\n"
+                                "  value1 = Foo<String>();\n"
+                                "  value2 = Foo<int>();\n"
+                                "  return 'Okay';\n"
+                                "}\n",
+                                nullableTag, lateTag, lateTag),
+                              std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadScript =
-      "class Foo<T> {\n"
-      "  T x;\n"
-      "  List<T> y = new List<T>();"
-      "  dynamic z = <T,T>{};"
-      "}\n"
-      "Foo value1;\n"
-      "Foo value2;\n"
-      "main() {\n"
-      "  return '${value1.y.runtimeType} ${value1.z.runtimeType}'"
-      "      ' ${value2.y.runtimeType} ${value2.z.runtimeType}';\n"
-      "}\n";
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(
+      OS::SCreate(nullptr,
+                  "class Foo<T> {\n"
+                  "  T%s x;\n"
+                  "  List<T> y = List<T>.empty();"
+                  "  dynamic z = <T,T>{};"
+                  "}\n"
+                  "%s Foo value1;\n"
+                  "%s Foo value2;\n"
+                  "main() {\n"
+                  "  return '${value1.y.runtimeType} ${value1.z.runtimeType}'"
+                  "      ' ${value2.y.runtimeType} ${value2.z.runtimeType}';\n"
+                  "}\n",
+                  nullableTag, lateTag, lateTag),
+      std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   // Verify that we ran field initializers on existing instances and
   // correct type arguments were used.
@@ -4066,26 +4247,33 @@
 }
 
 TEST_CASE(IsolateReload_ExistingFieldChangesType) {
-  const char* kScript = R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr,
+                                                     R"(
     class Foo {
       int x = 42;
     }
-    Foo value;
+    %s Foo value;
     main() {
-      value = new Foo();
+      value = Foo();
       return 'Okay';
     }
-  )";
+  )",
+  lateTag), std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
-  const char* kReloadScript = R"(
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class Foo {
       double x = 42.0;
     }
-    Foo value;
+    %s Foo value;
     main() {
       try {
         return value.x.toString();
@@ -4093,9 +4281,11 @@
         return e.toString();
       }
     }
-  )";
+  )",
+  lateTag), std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ(
       "type 'int' is not a subtype of type 'double' of 'function result'",
@@ -4135,33 +4325,38 @@
 }
 
 TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirect) {
-  const char* kScript = R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B extends A {}
     class Foo {
       A x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
-      value = new Foo(new B());
+      value = Foo(B());
       return 'Okay';
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
   // B is no longer a subtype of A.
-  const char* kReloadScript = R"(
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B {}
     class Foo {
       A x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
       try {
         return value.x.toString();
@@ -4169,9 +4364,10 @@
         return e.toString();
       }
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ("type 'B' is not a subtype of type 'A' of 'function result'",
                SimpleInvokeStr(lib, "main"));
@@ -4214,33 +4410,38 @@
 }
 
 TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirectGeneric) {
-  const char* kScript = R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B extends A {}
     class Foo {
       List<A> x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
-      value = new Foo(new List<B>());
+      value = Foo(List<B>.empty());
       return 'Okay';
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
   // B is no longer a subtype of A.
-  const char* kReloadScript = R"(
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B {}
     class Foo {
       List<A> x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
       try {
         return value.x.toString();
@@ -4248,9 +4449,10 @@
         return e.toString();
       }
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ(
       "type 'List<B>' is not a subtype of type 'List<A>' of 'function result'",
@@ -4262,7 +4464,7 @@
     class A {}
     class B extends A {}
     List<A> value = init();
-    init() => new List<B>();
+    init() => List<B>.empty();
     main() {
       return value.toString();
     }
@@ -4277,7 +4479,7 @@
     class A {}
     class B {}
     List<A> value = init();
-    init() => new List<A>();
+    init() => List<A>.empty();
     main() {
       try {
         return value.toString();
@@ -4295,7 +4497,11 @@
 }
 
 TEST_CASE(IsolateReload_ExistingFieldChangesTypeIndirectFunction) {
-  const char* kScript = R"(
+  const bool null_safety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* lateTag = null_safety ? "late" : "";
+
+  // clang-format off
+  auto kScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B extends A {}
     typedef bool Predicate(B b);
@@ -4303,19 +4509,21 @@
       Predicate x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
-      value = new Foo((A a) => true);
+      value = Foo((A a) => true);
       return 'Okay';
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript.get(), NULL);
   EXPECT_VALID(lib);
   EXPECT_STREQ("Okay", SimpleInvokeStr(lib, "main"));
 
   // B is no longer a subtype of A.
-  const char* kReloadScript = R"(
+  // clang-format off
+  auto kReloadScript = Utils::CStringUniquePtr(OS::SCreate(nullptr, R"(
     class A {}
     class B {}
     typedef bool Predicate(B b);
@@ -4323,7 +4531,7 @@
       Predicate x;
       Foo(this.x);
     }
-    Foo value;
+    %s Foo value;
     main() {
       try {
         return value.x.toString();
@@ -4331,9 +4539,10 @@
         return e.toString();
       }
     }
-  )";
+  )", lateTag), std::free);
+  // clang-format on
 
-  lib = TestCase::ReloadTestScript(kReloadScript);
+  lib = TestCase::ReloadTestScript(kReloadScript.get());
   EXPECT_VALID(lib);
   EXPECT_STREQ(
       "type '(A) => bool' is not a subtype of type '(B) => bool' of 'function "
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index d4dc8f3..10a09c9 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -28,11 +28,11 @@
       // Ignores printed lines.
       "var _nullPrintClosure = (String line) {};\n"
       "void entry(message) {}\n"
-      "int testMain() {\n"
+      "void testMain() {\n"
       "  Isolate.spawn(entry, null);\n"
       // TODO(floitsch): the following code is only to bump the event loop
       // so it executes asynchronous microtasks.
-      "  var rp = new RawReceivePort();\n"
+      "  var rp = RawReceivePort();\n"
       "  rp.sendPort.send(null);\n"
       "  rp.handler = (_) { rp.close(); };\n"
       "}\n";
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index e3e3b52..3a77645 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -137,7 +137,7 @@
   while (reader->offset() > 0) {
     intptr_t size = reader->ReadUInt32();
     intptr_t start = reader->offset() - size;
-    if (start < 0) {
+    if (start < 0 || size <= 0) {
       if (error != nullptr) {
         *error = kKernelInvalidSizeIndicated;
       }
diff --git a/runtime/vm/native_symbol.h b/runtime/vm/native_symbol.h
index 84aad3c..9aa8ba4 100644
--- a/runtime/vm/native_symbol.h
+++ b/runtime/vm/native_symbol.h
@@ -17,7 +17,9 @@
   static void Init();
   static void Cleanup();
   static char* LookupSymbolName(uword pc, uword* start);
-  static bool LookupSharedObject(uword pc, uword* dso_base, char** dso_name);
+  static bool LookupSharedObject(uword pc,
+                                 uword* dso_base = nullptr,
+                                 char** dso_name = nullptr);
   static void FreeSymbolName(char* name);
   static void AddSymbols(const char* dso_name, void* buffer, size_t size);
 };
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d1f78aa..1e4781c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -23621,28 +23621,31 @@
 // Prints the best representation(s) for the call address.
 static void PrintNonSymbolicStackFrameBody(ZoneTextBuffer* buffer,
                                            uword call_addr,
-                                           uword isolate_dso_base,
                                            uword isolate_instructions,
-                                           uword vm_instructions) {
+                                           uword vm_instructions,
+                                           uword isolate_relocated_address) {
   const Image vm_image(reinterpret_cast<const void*>(vm_instructions));
   const Image isolate_image(
       reinterpret_cast<const void*>(isolate_instructions));
 
   if (isolate_image.contains(call_addr)) {
-    if (isolate_image.compiled_to_elf() && isolate_dso_base != 0) {
-      buffer->Printf(" virt %" Pp "", call_addr - isolate_dso_base);
+    auto const symbol_name = kIsolateSnapshotInstructionsAsmSymbol;
+    auto const offset = call_addr - isolate_instructions;
+    // Only print the relocated address of the call when we know the saved
+    // debugging information (if any) will have the same relocated address.
+    if (isolate_image.compiled_to_elf()) {
+      buffer->Printf(" virt %" Pp "", isolate_relocated_address + offset);
     }
-    buffer->Printf(" %s+0x%" Px "", kIsolateSnapshotInstructionsAsmSymbol,
-                   call_addr - isolate_instructions);
+    buffer->Printf(" %s+0x%" Px "", symbol_name, offset);
   } else if (vm_image.contains(call_addr)) {
+    auto const offset = call_addr - vm_instructions;
     // We currently don't print 'virt' entries for vm addresses, even if
     // they were compiled to ELF, as we should never encounter these in
     // non-symbolic stack traces (since stub addresses are stripped).
     //
     // In case they leak due to code issues elsewhere, we still print them as
     // <vm symbol>+<offset>, just to distinguish from other cases.
-    buffer->Printf(" %s+0x%" Px "", kVmSnapshotInstructionsAsmSymbol,
-                   call_addr - vm_instructions);
+    buffer->Printf(" %s+0x%" Px "", kVmSnapshotInstructionsAsmSymbol, offset);
   } else {
     // This case should never happen, since these are not addresses within the
     // VM or app isolate instructions sections, so make it easy to notice.
@@ -23703,6 +23706,16 @@
   PrintSymbolicStackFrameBody(buffer, function_name, url, line, column);
 }
 
+// Find the relocated base of the given instructions section.
+uword InstructionsRelocatedAddress(uword instructions_start) {
+  Image image(reinterpret_cast<const uint8_t*>(instructions_start));
+  auto const bss_start =
+      reinterpret_cast<const uword*>(instructions_start + image.bss_offset());
+  auto const index =
+      BSS::RelocationIndex(BSS::Relocation::InstructionsRelocatedAddress);
+  return bss_start[index];
+}
+
 const char* StackTrace::ToCString() const {
   auto const T = Thread::Current();
   auto const zone = T->zone();
@@ -23721,38 +23734,10 @@
       T->isolate_group()->source()->snapshot_instructions);
   auto const vm_instructions = reinterpret_cast<uword>(
       Dart::vm_isolate()->group()->source()->snapshot_instructions);
-  uword isolate_dso_base;
-  if (!NativeSymbolResolver::LookupSharedObject(isolate_instructions,
-                                                &isolate_dso_base, nullptr)) {
-    // This isn't a natively loaded snapshot, so try to detect non-natively
-    // loaded compiled-to-ELF snapshots.
-    const Image vm_image(reinterpret_cast<const void*>(vm_instructions));
-    const Image isolate_image(
-        reinterpret_cast<const void*>(isolate_instructions));
-
-    if (vm_image.compiled_to_elf() && isolate_image.compiled_to_elf()) {
-      // If the VM and isolate were loaded from the same snapshot, then the
-      // isolate instructions will immediately follow the VM instructions in
-      // memory, and the VM section is always at a fixed offset from the DSO
-      // base in snapshots we generate.
-      const uword next_section_after_vm =
-          Utils::RoundUp(reinterpret_cast<uword>(vm_image.object_start()) +
-                             vm_image.object_size(),
-                         Elf::kPageSize);
-      if (isolate_instructions == next_section_after_vm) {
-        isolate_dso_base = Elf::SnapshotRelocatedBaseAddress(vm_instructions);
-      }
-      // If not, then we have no way of reverse-engineering the DSO base for
-      // the isolate without extending the embedder to return this information
-      // or encoding it somehow in the instructions image like the BSS offset.
-      //
-      // For the latter, the Image header size must match the HeapPage header
-      // size, and there's no remaining unused space in the Image header on
-      // 64-bit architectures. Thus, we'd have to increase the header size of
-      // both HeapPage and Image or create a special Object to put in the body
-      // of the Image to store extended header information.
-    }
-  }
+  auto const vm_relocated_address =
+      InstructionsRelocatedAddress(vm_instructions);
+  auto const isolate_relocated_address =
+      InstructionsRelocatedAddress(isolate_instructions);
   if (FLAG_dwarf_stack_traces_mode) {
     // The Dart standard requires the output of StackTrace.toString to include
     // all pending activations with precise source locations (i.e., to expand
@@ -23767,15 +23752,14 @@
     OSThread* thread = OSThread::Current();
     buffer.Printf("pid: %" Pd ", tid: %" Pd ", name %s\n", OS::ProcessId(),
                   OSThread::ThreadIdToIntPtr(thread->id()), thread->name());
+    // Print the dso_base of the VM and isolate_instructions. We print both here
+    // as the VM and isolate may be loaded from different snapshot images.
+    buffer.Printf("isolate_dso_base: %" Px "",
+                  isolate_instructions - isolate_relocated_address);
+    buffer.Printf(", vm_dso_base: %" Px "\n",
+                  vm_instructions - vm_relocated_address);
     buffer.Printf("isolate_instructions: %" Px "", isolate_instructions);
-    buffer.Printf(" vm_instructions: %" Px "", vm_instructions);
-    // Print the dso_base of the isolate_instructions, since printed stack
-    // traces won't include stub frames. If VM isolates ever start including
-    // Dart code, adjust this appropriately.
-    if (isolate_dso_base != 0) {
-      buffer.Printf(" isolate_dso_base: %" Px "", isolate_dso_base);
-    }
-    buffer.Printf("\n");
+    buffer.Printf(", vm_instructions: %" Px "\n", vm_instructions);
   }
 #endif
 
@@ -23828,9 +23812,9 @@
             // This output is formatted like Android's debuggerd. Note debuggerd
             // prints call addresses instead of return addresses.
             buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
-            PrintNonSymbolicStackFrameBody(&buffer, call_addr, isolate_dso_base,
-                                           isolate_instructions,
-                                           vm_instructions);
+            PrintNonSymbolicStackFrameBody(
+                &buffer, call_addr, isolate_instructions, vm_instructions,
+                isolate_relocated_address);
             frame_index++;
             continue;
           } else if (function.IsNull()) {
@@ -23838,9 +23822,9 @@
             // retained, so instead print the static symbol + offset like the
             // non-symbolic stack traces.
             PrintSymbolicStackFrameIndex(&buffer, frame_index);
-            PrintNonSymbolicStackFrameBody(&buffer, call_addr, isolate_dso_base,
-                                           isolate_instructions,
-                                           vm_instructions);
+            PrintNonSymbolicStackFrameBody(
+                &buffer, call_addr, isolate_instructions, vm_instructions,
+                isolate_relocated_address);
             frame_index++;
             continue;
           }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 210d32c..d09eace 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1814,8 +1814,8 @@
   char buffer[1024];
   Utils::SNPrint(buffer, sizeof(buffer),
                  "main() {\n"
-                 "  new List(%" Pd
-                 ");\n"
+                 "  List.filled(%" Pd
+                 ", null);\n"
                  "}\n",
                  length);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
@@ -1843,8 +1843,8 @@
   char buffer[1024];
   Utils::SNPrint(buffer, sizeof(buffer),
                  "main() {\n"
-                 "  return new List(%" Pd
-                 ");\n"
+                 "  return List.filled(%" Pd
+                 ", null);\n"
                  "}\n",
                  kOneTooMany);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
@@ -1857,8 +1857,8 @@
   char buffer[1024];
   Utils::SNPrint(buffer, sizeof(buffer),
                  "main() {\n"
-                 "  return new List(%" Pd
-                 ");\n"
+                 "  return List.filled(%" Pd
+                 ", null);\n"
                  "}\n",
                  Array::kMaxElements);
   Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
@@ -3748,39 +3748,45 @@
 }
 
 TEST_CASE(Metadata) {
-  const char* kScriptChars =
-      "@metafoo                       \n"
-      "class Meta {                   \n"
-      "  final m;                     \n"
-      "  const Meta(this.m);          \n"
-      "}                              \n"
-      "                               \n"
-      "const metafoo = 'metafoo';     \n"
-      "const metabar = 'meta' 'bar';  \n"
-      "                               \n"
-      "@metafoo                       \n"
-      "@Meta(0) String gVar;          \n"
-      "                               \n"
-      "@metafoo                       \n"
-      "get tlGetter => gVar;          \n"
-      "                               \n"
-      "@metabar                       \n"
-      "class A {                      \n"
-      "  @metafoo                     \n"
-      "  @metabar                     \n"
-      "  @Meta('baz')                 \n"
-      "  var aField;                  \n"
-      "                               \n"
-      "  @metabar @Meta('baa')        \n"
-      "  int aFunc(a,b) => a + b;     \n"
-      "}                              \n"
-      "                               \n"
-      "@Meta('main')                  \n"
-      "A main() {                     \n"
-      "  return new A();              \n"
-      "}                              \n";
+  bool nullSafety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = nullSafety ? "?" : "";
+  // clang-format off
+  auto kScriptChars =
+      Utils::CStringUniquePtr(OS::SCreate(nullptr,
+        "@metafoo                       \n"
+        "class Meta {                   \n"
+        "  final m;                     \n"
+        "  const Meta(this.m);          \n"
+        "}                              \n"
+        "                               \n"
+        "const metafoo = 'metafoo';     \n"
+        "const metabar = 'meta' 'bar';  \n"
+        "                               \n"
+        "@metafoo                       \n"
+        "@Meta(0) String%s gVar;        \n"
+        "                               \n"
+        "@metafoo                       \n"
+        "get tlGetter => gVar;          \n"
+        "                               \n"
+        "@metabar                       \n"
+        "class A {                      \n"
+        "  @metafoo                     \n"
+        "  @metabar                     \n"
+        "  @Meta('baz')                 \n"
+        "  var aField;                  \n"
+        "                               \n"
+        "  @metabar @Meta('baa')        \n"
+        "  int aFunc(a,b) => a + b;     \n"
+        "}                              \n"
+        "                               \n"
+        "@Meta('main')                  \n"
+        "A main() {                     \n"
+        "  return A();                  \n"
+        "}                              \n",
+        nullableTag), std::free);
+  // clang-format on
 
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars.get(), NULL);
   EXPECT_VALID(h_lib);
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
@@ -4412,8 +4418,8 @@
   const char* kScript =
       "import 'dart:collection';\n"
       "makeMap() {\n"
-      "  Function eq = (a, b) => true;\n"
-      "  Function hc = (a) => 42;\n"
+      "  bool Function(dynamic, dynamic) eq = (a, b) => true;\n"
+      "  int Function(dynamic) hc = (a) => 42;\n"
       "  return new LinkedHashMap(equals: eq, hashCode: hc);\n"
       "}";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 62167d5..211367b 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -936,8 +936,8 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   const char* kScript =
-      "List foo() => new List(4);\n"
-      "List bar() => new List();\n";
+      "List foo() => List.filled(4, null);\n"
+      "List bar() => List.empty(growable: true);\n";
   const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
@@ -2437,20 +2437,20 @@
 ISOLATE_UNIT_TEST_CASE(Profiler_GetSourceReport) {
   EnableProfiler();
   const char* kScript =
-      "doWork(i) => i * i;\n"
-      "main() {\n"
-      "  var sum = 0;\n"
-      "  for (var i = 0; i < 100; i++) {\n"
+      "int doWork(i) => i * i;\n"
+      "int main() {\n"
+      "  int sum = 0;\n"
+      "  for (int i = 0; i < 100; i++) {\n"
       "     sum += doWork(i);\n"
       "  }\n"
       "  return sum;\n"
       "}\n";
 
   // Token position of * in `i * i`.
-  const TokenPosition squarePosition = TokenPosition(15);
+  const TokenPosition squarePosition = TokenPosition(19);
 
   // Token position of the call to `doWork`.
-  const TokenPosition callPosition = TokenPosition(90);
+  const TokenPosition callPosition = TokenPosition(95);
 
   DisableNativeProfileScope dnps;
   // Disable profiling for this thread.
@@ -2542,14 +2542,14 @@
   }
 
   // Verify positions in do_work.
-  EXPECT_SUBSTRING("\"positions\":[\"ControlFlow\",15]", js.ToCString());
+  EXPECT_SUBSTRING("\"positions\":[\"ControlFlow\",19]", js.ToCString());
   // Verify exclusive ticks in do_work.
   EXPECT_SUBSTRING("\"exclusiveTicks\":[1,2]", js.ToCString());
   // Verify inclusive ticks in do_work.
   EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString());
 
   // Verify positions in main.
-  EXPECT_SUBSTRING("\"positions\":[90]", js.ToCString());
+  EXPECT_SUBSTRING("\"positions\":[95]", js.ToCString());
   // Verify exclusive ticks in main.
   EXPECT_SUBSTRING("\"exclusiveTicks\":[0]", js.ToCString());
   // Verify inclusive ticks in main.
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 4be78c66..44a52c1 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -699,29 +699,37 @@
 }
 
 VM_UNIT_TEST_CASE(FullSnapshot) {
-  const char* kScriptChars =
-      "class Fields  {\n"
-      "  Fields(int i, int j) : fld1 = i, fld2 = j {}\n"
-      "  int fld1;\n"
-      "  final int fld2;\n"
-      "  final int bigint_fld = 0xfffffffffff;\n"
-      "  static int fld3;\n"
-      "  static const int smi_sfld = 10;\n"
-      "  static const int bigint_sfld = 0xfffffffffff;\n"
-      "}\n"
-      "class Expect {\n"
-      "  static void equals(x, y) {\n"
-      "    if (x != y) throw new ArgumentError('not equal');\n"
-      "  }\n"
-      "}\n"
-      "class FieldsTest {\n"
-      "  static Fields testMain() {\n"
-      "    Expect.equals(true, Fields.bigint_sfld == 0xfffffffffff);\n"
-      "    Fields obj = new Fields(10, 20);\n"
-      "    Expect.equals(true, obj.bigint_fld == 0xfffffffffff);\n"
-      "    return obj;\n"
-      "  }\n"
-      "}\n";
+  bool nullSafety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = nullSafety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(
+          nullptr,
+          "class Fields  {\n"
+          "  Fields(int i, int j) : fld1 = i, fld2 = j {}\n"
+          "  int fld1;\n"
+          "  final int fld2;\n"
+          "  final int bigint_fld = 0xfffffffffff;\n"
+          "  static int%s fld3;\n"
+          "  static const int smi_sfld = 10;\n"
+          "  static const int bigint_sfld = 0xfffffffffff;\n"
+          "}\n"
+          "class Expect {\n"
+          "  static void equals(x, y) {\n"
+          "    if (x != y) throw new ArgumentError('not equal');\n"
+          "  }\n"
+          "}\n"
+          "class FieldsTest {\n"
+          "  static Fields testMain() {\n"
+          "    Expect.equals(true, Fields.bigint_sfld == 0xfffffffffff);\n"
+          "    Fields obj = new Fields(10, 20);\n"
+          "    Expect.equals(true, obj.bigint_fld == 0xfffffffffff);\n"
+          "    return obj;\n"
+          "  }\n"
+          "}\n",
+          nullableTag),
+      std::free);
+  // clang-format on
   Dart_Handle result;
 
   uint8_t* isolate_snapshot_data_buffer;
@@ -733,7 +741,7 @@
     TestIsolateScope __test_isolate__;
 
     // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
+    TestCase::LoadTestScript(kScriptChars.get(), NULL);
 
     Thread* thread = Thread::Current();
     TransitionNativeToVM transition(thread);
@@ -848,19 +856,19 @@
       "  return \"\\u{10000}\\u{1F601}\\u{1F637}\\u{20000}\";\n"
       "}\n"
       "getLeadSurrogateString() {\n"
-      "  return new String.fromCharCodes([0xd800]);\n"
+      "  return String.fromCharCodes([0xd800]);\n"
       "}\n"
       "getTrailSurrogateString() {\n"
       "  return \"\\u{10000}\".substring(1);\n"
       "}\n"
       "getSurrogatesString() {\n"
-      "  return new String.fromCharCodes([0xdc00, 0xdc00, 0xd800, 0xd800]);\n"
+      "  return String.fromCharCodes([0xdc00, 0xdc00, 0xd800, 0xd800]);\n"
       "}\n"
       "getCrappyString() {\n"
-      "  return new String.fromCharCodes([0xd800, 32, 0xdc00, 32]);\n"
+      "  return String.fromCharCodes([0xd800, 32, 0xdc00, 32]);\n"
       "}\n"
       "getList() {\n"
-      "  return new List(kArrayLength);\n"
+      "  return List.filled(kArrayLength, null);\n"
       "}\n";
 
   TestCase::CreateTestIsolate();
@@ -959,20 +967,20 @@
   static const char* kScriptChars =
       "final int kArrayLength = 10;\n"
       "getList() {\n"
-      "  return new List(kArrayLength);\n"
+      "  return List.filled(kArrayLength, null);\n"
       "}\n"
       "getIntList() {\n"
-      "  var list = new List<int>(kArrayLength);\n"
+      "  var list = List<int>.filled(kArrayLength, 0);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = i;\n"
       "  return list;\n"
       "}\n"
       "getStringList() {\n"
-      "  var list = new List<String>(kArrayLength);\n"
+      "  var list = List<String>.filled(kArrayLength, '');\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = i.toString();\n"
       "  return list;\n"
       "}\n"
       "getMixedList() {\n"
-      "  var list = new List(kArrayLength);\n"
+      "  var list = List<dynamic>.filled(kArrayLength, null);\n"
       "  list[0] = 0;\n"
       "  list[1] = '1';\n"
       "  list[2] = 2.2;\n"
@@ -1291,46 +1299,46 @@
       "final int kArrayLength = 10;\n"
       "getStringList() {\n"
       "  var s = 'Hello, world!';\n"
-      "  var list = new List<String>(kArrayLength);\n"
+      "  var list = List<String>.filled(kArrayLength, '');\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = s;\n"
       "  return list;\n"
       "}\n"
       "getMintList() {\n"
       "  var mint = 0x7FFFFFFFFFFFFFFF;\n"
-      "  var list = new List(kArrayLength);\n"
+      "  var list = List.filled(kArrayLength, 0);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = mint;\n"
       "  return list;\n"
       "}\n"
       "getDoubleList() {\n"
       "  var d = 3.14;\n"
-      "  var list = new List<double>(kArrayLength);\n"
+      "  var list = List<double>.filled(kArrayLength, 0.0);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = d;\n"
       "  return list;\n"
       "}\n"
       "getTypedDataList() {\n"
-      "  var byte_array = new Uint8List(256);\n"
-      "  var list = new List(kArrayLength);\n"
+      "  var byte_array = Uint8List(256);\n"
+      "  var list = List<dynamic>.filled(kArrayLength, null);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = byte_array;\n"
       "  return list;\n"
       "}\n"
       "getTypedDataViewList() {\n"
-      "  var uint8_list = new Uint8List(256);\n"
+      "  var uint8_list = Uint8List(256);\n"
       "  uint8_list[64] = 1;\n"
       "  var uint8_list_view =\n"
-      "      new Uint8List.view(uint8_list.buffer, 64, 128);\n"
-      "  var list = new List(kArrayLength);\n"
+      "      Uint8List.view(uint8_list.buffer, 64, 128);\n"
+      "  var list = List<dynamic>.filled(kArrayLength, null);\n"
       "  for (var i = 0; i < kArrayLength; i++) list[i] = uint8_list_view;\n"
       "  return list;\n"
       "}\n"
       "getMixedList() {\n"
-      "  var list = new List(kArrayLength);\n"
+      "  var list = List<dynamic>.filled(kArrayLength, null);\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
       "    list[i] = ((i % 2) == 0) ? 'A' : 2.72;\n"
       "  }\n"
       "  return list;\n"
       "}\n"
       "getSelfRefList() {\n"
-      "  var list = new List(kArrayLength);\n"
+      "  var list = List<dynamic>.filled(kArrayLength, null, growable: true);\n"
       "  for (var i = 0; i < kArrayLength; i++) {\n"
       "    list[i] = list;\n"
       "  }\n"
@@ -1697,71 +1705,71 @@
   static const char* kScriptChars =
       "import 'dart:typed_data';\n"
       "getTypedDataList() {\n"
-      "  var list = new List(10);\n"
+      "  var list = List<dynamic>.filled(10, null);\n"
       "  var index = 0;\n"
-      "  list[index++] = new Int8List(256);\n"
-      "  list[index++] = new Uint8List(256);\n"
-      "  list[index++] = new Int16List(256);\n"
-      "  list[index++] = new Uint16List(256);\n"
-      "  list[index++] = new Int32List(256);\n"
-      "  list[index++] = new Uint32List(256);\n"
-      "  list[index++] = new Int64List(256);\n"
-      "  list[index++] = new Uint64List(256);\n"
-      "  list[index++] = new Float32List(256);\n"
-      "  list[index++] = new Float64List(256);\n"
+      "  list[index++] = Int8List(256);\n"
+      "  list[index++] = Uint8List(256);\n"
+      "  list[index++] = Int16List(256);\n"
+      "  list[index++] = Uint16List(256);\n"
+      "  list[index++] = Int32List(256);\n"
+      "  list[index++] = Uint32List(256);\n"
+      "  list[index++] = Int64List(256);\n"
+      "  list[index++] = Uint64List(256);\n"
+      "  list[index++] = Float32List(256);\n"
+      "  list[index++] = Float64List(256);\n"
       "  return list;\n"
       "}\n"
       "getTypedDataViewList() {\n"
-      "  var list = new List(30);\n"
+      "  var list = List<dynamic>.filled(30, null);\n"
       "  var index = 0;\n"
-      "  list[index++] = new Int8List.view(new Int8List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Uint8List(256).buffer);\n"
-      "  list[index++] = new Int16List.view(new Int16List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Uint16List(256).buffer);\n"
-      "  list[index++] = new Int32List.view(new Int32List(256).buffer);\n"
-      "  list[index++] = new Uint32List.view(new Uint32List(256).buffer);\n"
-      "  list[index++] = new Int64List.view(new Int64List(256).buffer);\n"
-      "  list[index++] = new Uint64List.view(new Uint64List(256).buffer);\n"
-      "  list[index++] = new Float32List.view(new Float32List(256).buffer);\n"
-      "  list[index++] = new Float64List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int8List.view(Int8List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(Uint8List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = Int32List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = Uint32List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = Int64List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = Uint64List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = Float32List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = Float64List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int8List.view(new Int16List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Uint16List(256).buffer);\n"
-      "  list[index++] = new Int8List.view(new Int32List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Uint32List(256).buffer);\n"
-      "  list[index++] = new Int8List.view(new Int64List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Uint64List(256).buffer);\n"
-      "  list[index++] = new Int8List.view(new Float32List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Float32List(256).buffer);\n"
-      "  list[index++] = new Int8List.view(new Float64List(256).buffer);\n"
-      "  list[index++] = new Uint8List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int16List.view(new Int8List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Uint8List(256).buffer);\n"
-      "  list[index++] = new Int16List.view(new Int32List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Uint32List(256).buffer);\n"
-      "  list[index++] = new Int16List.view(new Int64List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Uint64List(256).buffer);\n"
-      "  list[index++] = new Int16List.view(new Float32List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Float32List(256).buffer);\n"
-      "  list[index++] = new Int16List.view(new Float64List(256).buffer);\n"
-      "  list[index++] = new Uint16List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Int8List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Uint8List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Float64List(256).buffer);\n"
       "  return list;\n"
       "}\n"
       "getMultipleTypedDataViewList() {\n"
-      "  var list = new List(10);\n"
+      "  var list = List<dynamic>.filled(10, null);\n"
       "  var index = 0;\n"
-      "  var data = new Uint8List(256).buffer;\n"
-      "  list[index++] = new Int8List.view(data);\n"
-      "  list[index++] = new Uint8List.view(data);\n"
-      "  list[index++] = new Int16List.view(data);\n"
-      "  list[index++] = new Uint16List.view(data);\n"
-      "  list[index++] = new Int32List.view(data);\n"
-      "  list[index++] = new Uint32List.view(data);\n"
-      "  list[index++] = new Int64List.view(data);\n"
-      "  list[index++] = new Uint64List.view(data);\n"
-      "  list[index++] = new Float32List.view(data);\n"
-      "  list[index++] = new Float64List.view(data);\n"
+      "  var data = Uint8List(256).buffer;\n"
+      "  list[index++] = Int8List.view(data);\n"
+      "  list[index++] = Uint8List.view(data);\n"
+      "  list[index++] = Int16List.view(data);\n"
+      "  list[index++] = Uint16List.view(data);\n"
+      "  list[index++] = Int32List.view(data);\n"
+      "  list[index++] = Uint32List.view(data);\n"
+      "  list[index++] = Int64List.view(data);\n"
+      "  list[index++] = Uint64List.view(data);\n"
+      "  list[index++] = Float32List.view(data);\n"
+      "  list[index++] = Float64List.view(data);\n"
       "  return list;\n"
       "}\n";
 
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 15800b7..4b474f5 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -159,86 +159,97 @@
 
 // Unit test case to verify stack frame iteration.
 TEST_CASE(ValidateStackFrameIteration) {
-  const char* kScriptChars =
-      "class StackFrame {"
-      "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-      "  static int frameCount() native \"StackFrame_frameCount\";"
-      "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-      "  static validateFrame(int index,"
-      "                       String name) native \"StackFrame_validateFrame\";"
-      "} "
-      "class First {"
-      "  First() { }"
-      "  int method1(int param) {"
-      "    if (param == 1) {"
-      "      param = method2(200);"
-      "    } else {"
-      "      param = method2(100);"
-      "    }"
-      "  }"
-      "  int method2(int param) {"
-      "    if (param == 200) {"
-      "      First.staticmethod(this, param);"
-      "    } else {"
-      "      First.staticmethod(this, 10);"
-      "    }"
-      "  }"
-      "  static int staticmethod(First obj, int param) {"
-      "    if (param == 10) {"
-      "      obj.method3(10);"
-      "    } else {"
-      "      obj.method3(200);"
-      "    }"
-      "  }"
-      "  method3(int param) {"
-      "    StackFrame.equals(9, StackFrame.frameCount());"
-      "    StackFrame.equals(7, StackFrame.dartFrameCount());"
-      "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-      "    StackFrame.validateFrame(1, \"First_method3\");"
-      "    StackFrame.validateFrame(2, \"First_staticmethod\");"
-      "    StackFrame.validateFrame(3, \"First_method2\");"
-      "    StackFrame.validateFrame(4, \"First_method1\");"
-      "    StackFrame.validateFrame(5, \"Second_method1\");"
-      "    StackFrame.validateFrame(6, \"StackFrameTest_testMain\");"
-      "  }"
-      "}"
-      "class Second {"
-      "  Second() { }"
-      "  int method1(int param) {"
-      "    if (param == 1) {"
-      "      param = method2(200);"
-      "    } else {"
-      "      First obj = new First();"
-      "      param = obj.method1(1);"
-      "      param = obj.method1(2);"
-      "    }"
-      "  }"
-      "  int method2(int param) {"
-      "    Second.staticmethod(this, param);"
-      "  }"
-      "  static int staticmethod(Second obj, int param) {"
-      "    obj.method3(10);"
-      "  }"
-      "  method3(int param) {"
-      "    StackFrame.equals(8, StackFrame.frameCount());"
-      "    StackFrame.equals(6, StackFrame.dartFrameCount());"
-      "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-      "    StackFrame.validateFrame(1, \"Second_method3\");"
-      "    StackFrame.validateFrame(2, \"Second_staticmethod\");"
-      "    StackFrame.validateFrame(3, \"Second_method2\");"
-      "    StackFrame.validateFrame(4, \"Second_method1\");"
-      "    StackFrame.validateFrame(5, \"StackFrameTest_testMain\");"
-      "  }"
-      "}"
-      "class StackFrameTest {"
-      "  static testMain() {"
-      "    Second obj = new Second();"
-      "    obj.method1(1);"
-      "    obj.method1(2);"
-      "  }"
-      "}";
+  bool nullSafety = (FLAG_null_safety == kNullSafetyOptionStrong);
+  const char* nullableTag = nullSafety ? "?" : "";
+  // clang-format off
+  auto kScriptChars = Utils::CStringUniquePtr(
+      OS::SCreate(
+          nullptr,
+          "class StackFrame {"
+          "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
+          "  static int frameCount() native \"StackFrame_frameCount\";"
+          "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
+          "  static validateFrame(int index,"
+          "                       String name) native "
+          "\"StackFrame_validateFrame\";"
+          "} "
+          "class First {"
+          "  First() { }"
+          "  int%s method1(int%s param) {"
+          "    if (param == 1) {"
+          "      param = method2(200);"
+          "    } else {"
+          "      param = method2(100);"
+          "    }"
+          "  }"
+          "  int%s method2(int param) {"
+          "    if (param == 200) {"
+          "      First.staticmethod(this, param);"
+          "    } else {"
+          "      First.staticmethod(this, 10);"
+          "    }"
+          "  }"
+          "  static int%s staticmethod(First obj, int param) {"
+          "    if (param == 10) {"
+          "      obj.method3(10);"
+          "    } else {"
+          "      obj.method3(200);"
+          "    }"
+          "  }"
+          "  method3(int param) {"
+          "    StackFrame.equals(9, StackFrame.frameCount());"
+          "    StackFrame.equals(7, StackFrame.dartFrameCount());"
+          "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
+          "    StackFrame.validateFrame(1, \"First_method3\");"
+          "    StackFrame.validateFrame(2, \"First_staticmethod\");"
+          "    StackFrame.validateFrame(3, \"First_method2\");"
+          "    StackFrame.validateFrame(4, \"First_method1\");"
+          "    StackFrame.validateFrame(5, \"Second_method1\");"
+          "    StackFrame.validateFrame(6, \"StackFrameTest_testMain\");"
+          "  }"
+          "}"
+          "class Second {"
+          "  Second() { }"
+          "  int%s method1(int%s param) {"
+          "    if (param == 1) {"
+          "      param = method2(200);"
+          "    } else {"
+          "      First obj = new First();"
+          "      param = obj.method1(1);"
+          "      param = obj.method1(2);"
+          "    }"
+          "  }"
+          "  int%s method2(int param) {"
+          "    Second.staticmethod(this, param);"
+          "  }"
+          "  static int%s staticmethod(Second obj, int param) {"
+          "    obj.method3(10);"
+          "  }"
+          "  method3(int param) {"
+          "    StackFrame.equals(8, StackFrame.frameCount());"
+          "    StackFrame.equals(6, StackFrame.dartFrameCount());"
+          "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
+          "    StackFrame.validateFrame(1, \"Second_method3\");"
+          "    StackFrame.validateFrame(2, \"Second_staticmethod\");"
+          "    StackFrame.validateFrame(3, \"Second_method2\");"
+          "    StackFrame.validateFrame(4, \"Second_method1\");"
+          "    StackFrame.validateFrame(5, \"StackFrameTest_testMain\");"
+          "  }"
+          "}"
+          "class StackFrameTest {"
+          "  static testMain() {"
+          "    Second obj = new Second();"
+          "    obj.method1(1);"
+          "    obj.method1(2);"
+          "  }"
+          "}",
+          nullableTag, nullableTag, nullableTag, nullableTag, nullableTag,
+          nullableTag, nullableTag, nullableTag),
+      std::free);
+  // clang-format on
   Dart_Handle lib = TestCase::LoadTestScript(
-      kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
+      kScriptChars.get(),
+      reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
   Dart_Handle cls = Dart_GetClass(lib, NewString("StackFrameTest"));
   EXPECT_VALID(Dart_Invoke(cls, NewString("testMain"), 0, NULL));
 }
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
index 7d22307..4f4c1c1 100644
--- a/runtime/vm/v8_snapshot_writer.cc
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -34,6 +34,16 @@
 
   strings_.Insert({"<unknown>", kUnknownString});
   strings_.Insert({"<artificial root>", kArtificialRootString});
+
+  nodes_.Insert({ArtificialRootId(),
+                 {
+                     kArtificialRoot,
+                     kArtificialRootString,
+                     ArtificialRootId(),
+                     0,
+                     nullptr,
+                     0,
+                 }});
 }
 
 void V8SnapshotProfileWriter::SetObjectTypeAndName(ObjectId object_id,
@@ -90,10 +100,9 @@
   };
 }
 
-V8SnapshotProfileWriter::NodeInfo V8SnapshotProfileWriter::ArtificialRoot() {
-  return {
-      kArtificialRoot, kArtificialRootString, {kArtificial, 0}, 0, nullptr, 0,
-  };
+const V8SnapshotProfileWriter::NodeInfo&
+V8SnapshotProfileWriter::ArtificialRoot() {
+  return nodes_.Lookup(ArtificialRootId())->value;
 }
 
 V8SnapshotProfileWriter::NodeInfo* V8SnapshotProfileWriter::EnsureId(
@@ -212,8 +221,7 @@
 
     writer->CloseObject();
 
-    writer->PrintProperty64("node_count",
-                            nodes_.Size() + 1 /* artificial root */);
+    writer->PrintProperty64("node_count", nodes_.Size());
     writer->PrintProperty64("edge_count", edge_count_ + roots_.Size());
   }
   writer->CloseObject();
@@ -227,6 +235,9 @@
     auto it = nodes_.GetIterator();
     while ((entry = it.Next()) != nullptr) {
       ASSERT(entry->key == entry->value.id);
+      if (entry->value.id == ArtificialRootId()) {
+        continue;  // Written separately above.
+      }
       entry->value.offset = offset;
       WriteNodeInfo(writer, entry->value);
       offset += kNumNodeFields;
@@ -250,6 +261,10 @@
 
     auto nodes_it = nodes_.GetIterator();
     while ((entry = nodes_it.Next()) != nullptr) {
+      if (entry->value.edges == nullptr) {
+        continue;  // Artificial root, its edges are written separately above.
+      }
+
       for (intptr_t i = 0; i < entry->value.edges->length(); ++i) {
         WriteEdgeInfo(writer, entry->value.edges->At(i));
       }
diff --git a/runtime/vm/v8_snapshot_writer.h b/runtime/vm/v8_snapshot_writer.h
index 98f19ed..34486ff 100644
--- a/runtime/vm/v8_snapshot_writer.h
+++ b/runtime/vm/v8_snapshot_writer.h
@@ -105,6 +105,8 @@
 
   intptr_t EnsureString(const char* str);
 
+  static ObjectId ArtificialRootId() { return {kArtificial, 0}; }
+
  private:
   static constexpr intptr_t kNumNodeFields = 5;
   static constexpr intptr_t kNumEdgeFields = 3;
@@ -145,7 +147,7 @@
   };
 
   NodeInfo DefaultNode(ObjectId object_id);
-  static NodeInfo ArtificialRoot();
+  const NodeInfo& ArtificialRoot();
 
   NodeInfo* EnsureId(ObjectId object_id);
   static intptr_t NodeIdFor(ObjectId id) {
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index de44234..b5b010a 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -99,6 +99,7 @@
  *   for String examples and recipes.
  * * [Dart Up and Running](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#strings-and-regular-expressions)
  */
+@pragma('vm:entry-point')
 abstract class String implements Comparable<String>, Pattern {
   /**
    * Allocates a new String for the specified [charCodes].
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index f9f0f63..770d1bf 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -102,10 +102,6 @@
   /// being stored, and the 8-bit value is sign-extended when it is loaded.
   external int get value;
 
-  /// The 8-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 8 bits (as if by `.toSigned(8)`) before
-  /// being stored, and the 8-bit value is sign-extended when it is loaded.
   external void set value(int value);
 
   /// The 8-bit two's complement integer at `address + index`.
@@ -140,12 +136,6 @@
   /// The [address] must be 2-byte aligned.
   external int get value;
 
-  /// The 16-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 16 bits (as if by `.toSigned(16)`) before
-  /// being stored, and the 16-bit value is sign-extended when it is loaded.
-  ///
-  /// The [address] must be 2-byte aligned.
   external void set value(int value);
 
   /// The 16-bit two's complement integer at `address + 2 * index`.
@@ -186,12 +176,6 @@
   /// The [address] must be 4-byte aligned.
   external int get value;
 
-  /// The 32-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 32 bits (as if by `.toSigned(32)`) before
-  /// being stored, and the 32-bit value is sign-extended when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(int value);
 
   /// The 32-bit two's complement integer at `address + 4 * index`.
@@ -229,9 +213,6 @@
   /// The [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 64-bit two's complement integer at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 64-bit two's complement integer at `address + 8 * index`.
@@ -264,10 +245,6 @@
   /// being stored, and the 8-bit value is zero-extended when it is loaded.
   external int get value;
 
-  /// The 8-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 8 bits (as if by `.toUnsigned(8)`) before
-  /// being stored, and the 8-bit value is zero-extended when it is loaded.
   external void set value(int value);
 
   /// The 8-bit unsigned integer at `address + index`.
@@ -302,12 +279,6 @@
   /// The [address] must be 2-byte aligned.
   external int get value;
 
-  /// The 16-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 16 bits (as if by `.toUnsigned(16)`) before
-  /// being stored, and the 16-bit value is zero-extended when it is loaded.
-  ///
-  /// The [address] must be 2-byte aligned.
   external void set value(int value);
 
   /// The 16-bit unsigned integer at `address + 2 * index`.
@@ -348,12 +319,6 @@
   /// The [address] must be 4-byte aligned.
   external int get value;
 
-  /// The 32-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 32 bits (as if by `.toUnsigned(32)`) before
-  /// being stored, and the 32-bit value is zero-extended when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(int value);
 
   /// The 32-bit unsigned integer at `address + 4 * index`.
@@ -391,9 +356,6 @@
   /// The [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 64-bit unsigned integer at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 64-bit unsigned integer at `address + 8 * index`.
@@ -433,17 +395,6 @@
   /// platforms the [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 32 or 64-bit two's complement integer at [address].
-  ///
-  /// On 32-bit platforms this is a 32-bit integer, and on 64-bit platforms
-  /// this is a 64-bit integer.
-  ///
-  /// On 32-bit platforms a Dart integer is truncated to 32 bits (as if by
-  /// `.toSigned(32)`) before being stored, and the 32-bit value is
-  /// sign-extended when it is loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 32 or 64-bit two's complement integer at `address + (4 or 8) * index`.
@@ -483,12 +434,6 @@
   /// The [address] must be 4-byte aligned.
   external double get value;
 
-  /// The float at [address].
-  ///
-  /// A Dart double loses precision before being stored, and the float value is
-  /// converted to a double when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(double value);
 
   /// The float at `address + 4 * index`.
@@ -526,9 +471,6 @@
   /// The [address] must be 8-byte aligned.
   external double get value;
 
-  /// The double at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(double value);
 
   /// The double at `address + 8 * index`.
@@ -568,13 +510,6 @@
   /// platforms the [address] must be 8-byte aligned.
   external Pointer<T> get value;
 
-  /// Store a Dart value into this location.
-  ///
-  /// A [Pointer] is unboxed before being stored (as if by `.address`), and the
-  /// pointer is boxed (as if by `Pointer.fromAddress`) when loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
   external void set value(Pointer<T> value);
 
   /// Load a Dart value from this location offset by [index].
diff --git a/sdk_nnbd/lib/core/string.dart b/sdk_nnbd/lib/core/string.dart
index c9cc847..b7bba38 100644
--- a/sdk_nnbd/lib/core/string.dart
+++ b/sdk_nnbd/lib/core/string.dart
@@ -97,6 +97,7 @@
  *   for String examples and recipes.
  * * [Dart Up and Running](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#strings-and-regular-expressions)
  */
+@pragma('vm:entry-point')
 abstract class String implements Comparable<String>, Pattern {
   /**
    * Allocates a new String for the specified [charCodes].
diff --git a/sdk_nnbd/lib/ffi/ffi.dart b/sdk_nnbd/lib/ffi/ffi.dart
index 202f4f6..3b6e236 100644
--- a/sdk_nnbd/lib/ffi/ffi.dart
+++ b/sdk_nnbd/lib/ffi/ffi.dart
@@ -101,10 +101,6 @@
   /// being stored, and the 8-bit value is sign-extended when it is loaded.
   external int get value;
 
-  /// The 8-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 8 bits (as if by `.toSigned(8)`) before
-  /// being stored, and the 8-bit value is sign-extended when it is loaded.
   external void set value(int value);
 
   /// The 8-bit two's complement integer at `address + index`.
@@ -139,12 +135,6 @@
   /// The [address] must be 2-byte aligned.
   external int get value;
 
-  /// The 16-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 16 bits (as if by `.toSigned(16)`) before
-  /// being stored, and the 16-bit value is sign-extended when it is loaded.
-  ///
-  /// The [address] must be 2-byte aligned.
   external void set value(int value);
 
   /// The 16-bit two's complement integer at `address + 2 * index`.
@@ -185,12 +175,6 @@
   /// The [address] must be 4-byte aligned.
   external int get value;
 
-  /// The 32-bit two's complement integer at [address].
-  ///
-  /// A Dart integer is truncated to 32 bits (as if by `.toSigned(32)`) before
-  /// being stored, and the 32-bit value is sign-extended when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(int value);
 
   /// The 32-bit two's complement integer at `address + 4 * index`.
@@ -228,9 +212,6 @@
   /// The [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 64-bit two's complement integer at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 64-bit two's complement integer at `address + 8 * index`.
@@ -263,10 +244,6 @@
   /// being stored, and the 8-bit value is zero-extended when it is loaded.
   external int get value;
 
-  /// The 8-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 8 bits (as if by `.toUnsigned(8)`) before
-  /// being stored, and the 8-bit value is zero-extended when it is loaded.
   external void set value(int value);
 
   /// The 8-bit unsigned integer at `address + index`.
@@ -301,12 +278,6 @@
   /// The [address] must be 2-byte aligned.
   external int get value;
 
-  /// The 16-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 16 bits (as if by `.toUnsigned(16)`) before
-  /// being stored, and the 16-bit value is zero-extended when it is loaded.
-  ///
-  /// The [address] must be 2-byte aligned.
   external void set value(int value);
 
   /// The 16-bit unsigned integer at `address + 2 * index`.
@@ -347,12 +318,6 @@
   /// The [address] must be 4-byte aligned.
   external int get value;
 
-  /// The 32-bit unsigned integer at [address].
-  ///
-  /// A Dart integer is truncated to 32 bits (as if by `.toUnsigned(32)`) before
-  /// being stored, and the 32-bit value is zero-extended when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(int value);
 
   /// The 32-bit unsigned integer at `address + 4 * index`.
@@ -390,9 +355,6 @@
   /// The [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 64-bit unsigned integer at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 64-bit unsigned integer at `address + 8 * index`.
@@ -432,17 +394,6 @@
   /// platforms the [address] must be 8-byte aligned.
   external int get value;
 
-  /// The 32 or 64-bit two's complement integer at [address].
-  ///
-  /// On 32-bit platforms this is a 32-bit integer, and on 64-bit platforms
-  /// this is a 64-bit integer.
-  ///
-  /// On 32-bit platforms a Dart integer is truncated to 32 bits (as if by
-  /// `.toSigned(32)`) before being stored, and the 32-bit value is
-  /// sign-extended when it is loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
   external void set value(int value);
 
   /// The 32 or 64-bit two's complement integer at `address + (4 or 8) * index`.
@@ -482,12 +433,6 @@
   /// The [address] must be 4-byte aligned.
   external double get value;
 
-  /// The float at [address].
-  ///
-  /// A Dart double loses precision before being stored, and the float value is
-  /// converted to a double when it is loaded.
-  ///
-  /// The [address] must be 4-byte aligned.
   external void set value(double value);
 
   /// The float at `address + 4 * index`.
@@ -525,9 +470,6 @@
   /// The [address] must be 8-byte aligned.
   external double get value;
 
-  /// The double at [address].
-  ///
-  /// The [address] must be 8-byte aligned.
   external void set value(double value);
 
   /// The double at `address + 8 * index`.
@@ -567,13 +509,6 @@
   /// platforms the [address] must be 8-byte aligned.
   external Pointer<T> get value;
 
-  /// Store a Dart value into this location.
-  ///
-  /// A [Pointer] is unboxed before being stored (as if by `.address`), and the
-  /// pointer is boxed (as if by `Pointer.fromAddress`) when loaded.
-  ///
-  /// On 32-bit platforms the [address] must be 4-byte aligned, and on 64-bit
-  /// platforms the [address] must be 8-byte aligned.
   external void set value(Pointer<T> value);
 
   /// Load a Dart value from this location offset by [index].
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 78c548d..798ffdd 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -6,8 +6,6 @@
 Language/Classes/Abstract_Instance_Members/*: Skip # Not migrated to NNBD
 Language/Classes/Class_Member_Conflicts/*: Skip # Not migrated to NNBD
 Language/Classes/Constructors/*: Skip # Not migrated to NNBD
-Language/Classes/Constructors/Constant_Constructors/*: Skip # Not migrated to NNBD
-Language/Classes/Constructors/Factories/*: Skip # Not migrated to NNBD
 Language/Classes/Constructors/Generative_Constructors/*: Skip # Not migrated to NNBD
 Language/Classes/Getters/*: Skip # Not migrated to NNBD
 Language/Classes/Instance_Methods/*: Skip # Not migrated to NNBD
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index 7269570..36cf01d 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -94,7 +94,7 @@
       new C5<num>().F18();
     }
     """),
-        options: [Flags.printLegacyStars]);
+        options: [Flags.noSoundNullSafety, Flags.printLegacyStars]);
 
     var types = env.types;
 
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 3584feb..c61a86b 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -5,6 +5,7 @@
 // @dart = 2.7
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/universe/call_structure.dart';
@@ -32,7 +33,7 @@
       ${createUses(signatures, prefix: 't')}
       ${createUses(signatures, prefix: 'm')}
     }
-    """);
+    """, options: [Flags.noSoundNullSafety]);
 
     for (FunctionTypeData data in signatures) {
       DartType functionType = env.getElementType('t${data.name}');
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index 30e126a..1d8e384 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -5,6 +5,7 @@
 // @dart = 2.7
 
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
@@ -52,7 +53,7 @@
   new C().futureT();
   new C().futureOrT();
 }
-""");
+""", options: [Flags.noSoundNullSafety]);
     FunctionType getFunctionType(String name, String expectedType,
         [ClassEntity cls]) {
       FunctionType type = env.getMemberType(name, cls);
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index f166770..3d88054 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -8,6 +8,7 @@
 
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/types.dart';
 import 'package:expect/expect.dart';
@@ -60,7 +61,8 @@
       main() {
         new C();
       }
-      """, expectNoErrors: true).then((env) {
+      """, options: [Flags.noSoundNullSafety], expectNoErrors: true)
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       testTypes(env, T, S, expectSubtype);
     }
@@ -318,7 +320,8 @@
         a.m4(null, null);
         a.m5(null, null);
       }
-      """, expectNoErrors: true).then((env) {
+      """, options: [Flags.noSoundNullSafety], expectNoErrors: true)
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       testTypes(env, T, S, expectSubtype);
     }
@@ -371,6 +374,7 @@
     ${createUses(functionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then(functionSubtypingHelper);
 }
@@ -382,6 +386,7 @@
     ${createUses(functionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then(functionSubtypingHelper);
 }
@@ -464,6 +469,7 @@
     ${createUses(optionalFunctionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then((env) => functionSubtypingOptionalHelper(env));
 }
@@ -475,6 +481,7 @@
     ${createUses(optionalFunctionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then((env) => functionSubtypingOptionalHelper(env));
 }
@@ -545,6 +552,7 @@
     ${createUses(namedFunctionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then((env) => functionSubtypingNamedHelper(env));
 }
@@ -556,6 +564,7 @@
     ${createUses(namedFunctionTypesData)}
   }
   """),
+          options: [Flags.noSoundNullSafety],
           expectNoErrors: true)
       .then((env) => functionSubtypingNamedHelper(env));
 }
@@ -612,7 +621,8 @@
         new E<int, num>();
         new F();
       }
-      """, expectNoErrors: true).then((env) {
+      """, options: [Flags.noSoundNullSafety], expectNoErrors: true)
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       testTypes(env, T, S, expectSubtype);
     }
@@ -745,7 +755,8 @@
         takeVoid(null);
         takeObject(null);
       }
-      """, expectNoErrors: true).then((env) {
+      """, options: [Flags.noSoundNullSafety], expectNoErrors: true)
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
       if (expectSubtype) {
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index 9072baa..ff3aae1 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -8,6 +8,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
@@ -59,7 +60,7 @@
         new E();
         new F();
       }
-      ''');
+      ''', options: [Flags.noSoundNullSafety]);
   var types = env.types;
   ClassEntity A = env.getElement("A");
   ClassEntity B = env.getElement("B");
@@ -122,7 +123,7 @@
       class Class<T,S> {}
 
       main() => new Class();
-      """);
+      """, options: [Flags.noSoundNullSafety]);
   var types = env.types;
   InterfaceType Class_T_S = env["Class"];
   Expect.isNotNull(Class_T_S);
diff --git a/tests/language/call/constructor_on_unresolvable_class_test.dart b/tests/language/call/constructor_on_unresolvable_class_test.dart
index d068b53..f3fa482 100644
--- a/tests/language/call/constructor_on_unresolvable_class_test.dart
+++ b/tests/language/call/constructor_on_unresolvable_class_test.dart
@@ -11,14 +11,14 @@
 main() {
   new A();
   //  ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'A'.
   new A.foo();
   //  ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'A.foo'.
   new lib.A();
   //  ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'lib.A'.
 }
diff --git a/tests/language/class/variable_shadow_class_test.dart b/tests/language/class/variable_shadow_class_test.dart
index d82fef7..35a1fda 100644
--- a/tests/language/class/variable_shadow_class_test.dart
+++ b/tests/language/class/variable_shadow_class_test.dart
@@ -15,8 +15,9 @@
     var Test;
     // Now this refers to the variable.
     var i = new Test.named(10);
-    //          ^^^^
+    //          ^^^^^^^^^^
     // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
+    //          ^^^^
     // [cfe] Method not found: 'Test.named'.
     Expect.equals(10, i.field);
   }
diff --git a/tests/language/constructor/reference_test.dart b/tests/language/constructor/reference_test.dart
index 52e1235..cecfbf3 100644
--- a/tests/language/constructor/reference_test.dart
+++ b/tests/language/constructor/reference_test.dart
@@ -13,7 +13,7 @@
   new Foo.bar();
   new Foo.bar.baz();
   //  ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //          ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   new Foo<int>();
@@ -33,13 +33,13 @@
   new Foo.bar<int>.baz();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //         ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  //  ^^^^^^^
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //               ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   new Foo.bar.baz<int>();
   //  ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //          ^^^
   // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -50,7 +50,7 @@
   const Foo.bar();
   const Foo.bar.baz();
   //    ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //            ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   const Foo<int>();
@@ -70,13 +70,13 @@
   const Foo.bar<int>.baz();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //           ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  //    ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //                 ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   const Foo.bar.baz<int>();
   //    ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //            ^^^
   // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -106,8 +106,8 @@
   Foo.bar<int>.baz();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //     ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+//^^^^^^^
+// [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //           ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   Foo.bar.baz<int>();
diff --git a/tests/language/import/collection_no_prefix_test.dart b/tests/language/import/collection_no_prefix_test.dart
new file mode 100644
index 0000000..cf4f490
--- /dev/null
+++ b/tests/language/import/collection_no_prefix_test.dart
@@ -0,0 +1,14 @@
+// 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 test program importing the core library explicitly.
+
+library ImportCollectionNoPrefixTest.dart;
+
+import "dart:collection";
+
+main() {
+  var e = new SplayTreeMap();
+  print('"dart:collection" imported, $e allocated');
+}
diff --git a/tests/language/import/combinators2_runtime_test.dart b/tests/language/import/combinators2_runtime_test.dart
new file mode 100644
index 0000000..ec0051d
--- /dev/null
+++ b/tests/language/import/combinators2_runtime_test.dart
@@ -0,0 +1,19 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2012, 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 test program importing with show/hide combinators.
+
+// Show "hide" and "show", hide "ugly".
+import "import1_lib.dart" show hide, show hide ugly;
+
+main() {
+  print(hide);
+  print(show);
+
+  // Ugly is hidden.
+
+}
diff --git a/tests/language/import/combinators2_test.dart b/tests/language/import/combinators2_test.dart
new file mode 100644
index 0000000..47a2db0
--- /dev/null
+++ b/tests/language/import/combinators2_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2012, 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 test program importing with show/hide combinators.
+
+// Show "hide" and "show", hide "ugly".
+import "import1_lib.dart" show hide, show hide ugly;
+
+main() {
+  print(hide);
+  print(show);
+
+  // Ugly is hidden.
+  print(ugly);
+  //    ^^^^
+  // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
+  // [cfe] Getter not found: 'ugly'.
+}
diff --git a/tests/language/import/combinators_part.dart b/tests/language/import/combinators_part.dart
new file mode 100644
index 0000000..9db5453
--- /dev/null
+++ b/tests/language/import/combinators_part.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, 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.
+
+// This file is part of the test import_combinators_test.dart
+
+part of importCombinatorsTest;
+
+lookBehindCurtain() {
+  return show; // show is an imported identifier.
+}
diff --git a/tests/language/import/combinators_test.dart b/tests/language/import/combinators_test.dart
new file mode 100644
index 0000000..c330983
--- /dev/null
+++ b/tests/language/import/combinators_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, 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 test program importing with show/hide combinators.
+
+library importCombinatorsTest;
+
+import "package:expect/expect.dart";
+import "import1_lib.dart" show hide, show hide ugly;
+import "export1_lib.dart";
+import "dart:math" as M show e;
+
+part "combinators_part.dart";
+
+main() {
+  Expect.equals("hide", hide);
+  Expect.equals("show", show);
+  // Top-level function from part, refers to imported variable show.
+  Expect.equals("show", lookBehindCurtain());
+  // Top-level variable E from export1_lib.dart.
+  Expect.equals("E", e);
+  // Top-level variable E imported from dart:math.
+  Expect.equals(2.718281828459045, M.e);
+  // Constant LN2 from math library, re-exported by export1_lib.dart.
+  Expect.equals(0.6931471805599453, ln2);
+}
diff --git a/tests/language/import/conditional_import_test.dart b/tests/language/import/conditional_import_test.dart
new file mode 100644
index 0000000..4aa3b31
--- /dev/null
+++ b/tests/language/import/conditional_import_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2016, 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";
+import "package:async_helper/async_helper.dart";
+
+// All three libraries have an HttpRequest class.
+import "conditional_import_test.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" deferred as d show HttpRequest;
+
+class HttpRequest {}
+
+void main() {
+  asyncStart();
+  var io = const bool.fromEnvironment("dart.library.io");
+  var html = const bool.fromEnvironment("dart.library.html");
+  () async {
+    // Shouldn't fail. Shouldn't time out.
+    await d.loadLibrary().timeout(const Duration(seconds: 5));
+    if (io) {
+      print("io");
+      Expect.throws(() => new d.HttpRequest()); // Class is abstract in dart:io
+    } else if (html) {
+      print("html");
+      dynamic r = new d.HttpRequest(); // Shouldn't throw
+      var o = r.open; // Shouldn't fail, the open method is there.
+    } else {
+      print("none");
+      dynamic r = new d.HttpRequest();
+      Expect.isTrue(r is HttpRequest);
+    }
+    asyncEnd();
+  }();
+}
diff --git a/tests/language/import/conditional_string_test.dart b/tests/language/import/conditional_string_test.dart
new file mode 100644
index 0000000..2eafa52
--- /dev/null
+++ b/tests/language/import/conditional_string_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2016, 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";
+import "package:async_helper/async_helper.dart";
+
+// All three libraries have an HttpRequest class.
+import "conditional_string_test.dart"
+    if (dart.library.io == "true") "dart:io"
+    if (dart.library.html == "true") "dart:html" deferred as d show HttpRequest;
+
+class HttpRequest {}
+
+void main() {
+  asyncStart();
+  var io = const String.fromEnvironment("dart.library.io");
+  var html = const String.fromEnvironment("dart.library.html");
+  () async {
+    // Shouldn't fail. Shouldn't time out.
+    await d.loadLibrary().timeout(const Duration(seconds: 5));
+    if (io == "true") {
+      print("io");
+      Expect.throws(() => new d.HttpRequest()); // Class is abstract in dart:io
+    } else if (html == "true") {
+      print("html");
+      dynamic r = new d.HttpRequest(); // Shouldn't throw
+      var o = r.open; // Shouldn't fail, the open method is there.
+    } else {
+      print("none");
+      dynamic r = new d.HttpRequest();
+      Expect.isTrue(r is HttpRequest);
+    }
+    asyncEnd();
+  }();
+}
diff --git a/tests/language/import/config_corelib_general.dart b/tests/language/import/config_corelib_general.dart
new file mode 100644
index 0000000..295f09a
--- /dev/null
+++ b/tests/language/import/config_corelib_general.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2015, 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.
+
+class Classy {
+  String get name => "classy general";
+  String httpSpecific() => throw UnimplementedError();
+  String ioSpecific() => throw UnimplementedError();
+}
+
+bool general() => true;
+bool httpSpecific() => false;
+bool ioSpecific() => false;
+final String name = "general";
diff --git a/tests/language/import/config_corelib_http.dart b/tests/language/import/config_corelib_http.dart
new file mode 100644
index 0000000..857e391
--- /dev/null
+++ b/tests/language/import/config_corelib_http.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2015, 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 "dart:http";
+
+class Classy {
+  String get name => "classy http";
+  String httpSpecific() => "classy http";
+  String ioSpecific() => throw UnimplementedError();
+}
+
+bool general() => true;
+bool httpSpecific() => true;
+bool ioSpecific() => false;
+final String name = "http";
diff --git a/tests/language/import/config_corelib_io.dart b/tests/language/import/config_corelib_io.dart
new file mode 100644
index 0000000..5e1543d
--- /dev/null
+++ b/tests/language/import/config_corelib_io.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2015, 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 "dart:io";
+
+class Classy {
+  String get name => "classy io";
+  String httpSpecific() => throw UnimplementedError();
+  String ioSpecific() => "classy io";
+}
+
+bool general() => true;
+bool httpSpecific() => false;
+bool ioSpecific() => true;
+final String name = "io";
diff --git a/tests/language/import/config_corelib_test.dart b/tests/language/import/config_corelib_test.dart
new file mode 100644
index 0000000..362e41e
--- /dev/null
+++ b/tests/language/import/config_corelib_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2015, 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';
+
+import 'config_corelib_general.dart'
+    if (dart.library.io) 'config_corelib_io.dart'
+    if (dart.library.http) 'config_corelib_http.dart' as lib;
+
+class SubClassy extends lib.Classy {
+  String get superName => super.name;
+}
+
+main() {
+  var io = const bool.fromEnvironment("dart.library.io");
+  var http = const bool.fromEnvironment("dart.library.http");
+
+  var cy = new SubClassy();
+
+  if (io) {
+    Expect.isTrue(lib.general());
+    Expect.equals("io", lib.name);
+    Expect.equals("classy io", cy.name);
+
+    Expect.isTrue(lib.ioSpecific());
+    Expect.equals("classy io", cy.ioSpecific());
+
+    Expect.isFalse(lib.httpSpecific());
+    Expect.throws(cy.httpSpecific);
+  } else if (http) {
+    Expect.isTrue(lib.general());
+    Expect.equals("http", lib.name);
+    Expect.equals("classy http", cy.name);
+
+    Expect.isFalse(lib.ioSpecific());
+    Expect.throws(cy.ioSpecific);
+
+    Expect.isTrue(lib.httpSpecific());
+    Expect.equals("classy http", cy.httpSpecific());
+  } else {
+    Expect.isTrue(lib.general());
+    Expect.equals("general", lib.name);
+    Expect.equals("classy general", cy.name);
+
+    Expect.isFalse(lib.ioSpecific());
+    Expect.throws(cy.ioSpecific);
+
+    Expect.isFalse(lib.httpSpecific());
+    Expect.throws(cy.httpSpecific);
+  }
+}
diff --git a/tests/language/import/core_no_prefix_test.dart b/tests/language/import/core_no_prefix_test.dart
new file mode 100644
index 0000000..254744f
--- /dev/null
+++ b/tests/language/import/core_no_prefix_test.dart
@@ -0,0 +1,13 @@
+// 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 test program importing the core library explicitly.
+
+library ImportCoreNoPrefixTest.dart;
+
+import "dart:core";
+
+main() {
+  print('"dart:core" imported.');
+}
diff --git a/tests/language/import/core_prefix_test.dart b/tests/language/import/core_prefix_test.dart
new file mode 100644
index 0000000..0f3374b
--- /dev/null
+++ b/tests/language/import/core_prefix_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, 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.
+// Test explicit import of dart:core in the source code..
+
+library ImportCorePrefixTest.dart;
+
+import "package:expect/expect.dart";
+import "dart:core" as mycore;
+
+class Object {}
+
+class Map {
+  Map(this._lat, this._long);
+
+  get isPrimeMeridian => _long == 0;
+
+  var _lat;
+  var _long;
+}
+
+void main() {
+  var test = new mycore.Map<mycore.int, mycore.String>();
+  mycore.bool boolval = false;
+  mycore.int variable = 10;
+  mycore.num value = 10;
+  mycore.dynamic d = null;
+  mycore.print(new mycore.Object());
+  mycore.print(new Object());
+
+  var greenwich = new Map(51, 0);
+  var kpao = new Map(37, -122);
+  Expect.isTrue(greenwich.isPrimeMeridian);
+  Expect.isFalse(kpao.isPrimeMeridian);
+}
diff --git a/tests/language/import/core_test.dart b/tests/language/import/core_test.dart
new file mode 100644
index 0000000..1256012
--- /dev/null
+++ b/tests/language/import/core_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2012, 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.
+// Test explicit import of dart:core in the source code..
+
+library ImportCoreTest.dart;
+
+import "dart:core";
+
+void main() {
+  var test = new Map<int, String>();
+  bool value = false;
+  int variable = 10;
+  num intval = 10;
+}
diff --git a/tests/language/import/cyclic_test.dart b/tests/language/import/cyclic_test.dart
new file mode 100644
index 0000000..d266b87
--- /dev/null
+++ b/tests/language/import/cyclic_test.dart
@@ -0,0 +1,9 @@
+library CyclicImportTest;
+
+import 'sub/sub.dart';
+
+var value = 42;
+
+main() {
+  subMain();
+}
diff --git a/tests/language/import/duplicate_import_liba.dart b/tests/language/import/duplicate_import_liba.dart
new file mode 100644
index 0000000..b8af1a7
--- /dev/null
+++ b/tests/language/import/duplicate_import_liba.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, 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 liba;
+
+var field;
+
+void method() {}
+
+class Class {}
+
+void methodOrClass() {}
diff --git a/tests/language/import/duplicate_libb.dart b/tests/language/import/duplicate_libb.dart
new file mode 100644
index 0000000..456147f
--- /dev/null
+++ b/tests/language/import/duplicate_libb.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, 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 libb;
+
+var field;
+
+void method() {}
+
+class Class {}
+
+class methodOrClass {}
diff --git a/tests/language/import/duplicate_prefix_test.dart b/tests/language/import/duplicate_prefix_test.dart
new file mode 100644
index 0000000..bb5a36c
--- /dev/null
+++ b/tests/language/import/duplicate_prefix_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, 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.
+
+// Importing with a duplicate prefix is allowed.
+
+import "duplicate_import_liba.dart" as a;
+import "duplicate_libb.dart" as a;
+
+void main() {}
diff --git a/tests/language/import/export1_lib.dart b/tests/language/import/export1_lib.dart
new file mode 100644
index 0000000..3f7be5b
--- /dev/null
+++ b/tests/language/import/export1_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2012, 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 export1_lib;
+
+export "dart:math" show ln10, ln2, e;
+
+var e = "E"; // Hides constant E from math lib.
diff --git a/tests/language/import/hidden_import_test.dart b/tests/language/import/hidden_import_test.dart
new file mode 100644
index 0000000..4c51a19
--- /dev/null
+++ b/tests/language/import/hidden_import_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, 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.
+
+// Tests that dart: imports are implicitly hidden and cause warning on use.
+
+library hidden_import;
+
+import 'hidden_lib.dart';
+import 'hidden_lib.dart' as prefix;
+import 'dart:async';
+import 'dart:async' as prefix;
+
+main() {
+  new Future();
+  new prefix.Future();
+}
diff --git a/tests/language/import/hidden_lib.dart b/tests/language/import/hidden_lib.dart
new file mode 100644
index 0000000..de7f2df
--- /dev/null
+++ b/tests/language/import/hidden_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2013, 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 hidden_import_lib;
+
+class Future {}
diff --git a/tests/language/import/hidden_runtime_test.dart b/tests/language/import/hidden_runtime_test.dart
new file mode 100644
index 0000000..6a9964e
--- /dev/null
+++ b/tests/language/import/hidden_runtime_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2013, 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.
+
+// Tests that dart: imports are implicitly hidden and cause warning on use.
+
+library hidden_import;
+
+import 'hidden_lib.dart';
+import 'hidden_lib.dart' as prefix;
+import 'dart:async';
+import 'dart:async' as prefix;
+
+main() {
+
+
+}
diff --git a/tests/language/import/import1_lib.dart b/tests/language/import/import1_lib.dart
new file mode 100644
index 0000000..bf45808
--- /dev/null
+++ b/tests/language/import/import1_lib.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2012, 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 import1_lib;
+
+int libfunc(a, b) => a + b;
+
+var show = 'show';
+var hide = 'hide';
+
+var ugly = 'ugly';
+
+class Q {
+  var _s;
+  Q(s) : _s = s;
+  toString() => "LQQK: '$_s'";
+}
diff --git a/tests/language/import/internal_library_runtime_test.dart b/tests/language/import/internal_library_runtime_test.dart
new file mode 100644
index 0000000..a0e4c23
--- /dev/null
+++ b/tests/language/import/internal_library_runtime_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2013, 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.
+
+// Test that a private library cannot be accessed from outside the platform.
+
+library internal_library_test;
+
+import 'dart:core'; // This loads 'dart:_foreign_helper' and 'patch:core'.
+
+
+
+
+void main() {
+
+
+}
diff --git a/tests/language/import/internal_library_test.dart b/tests/language/import/internal_library_test.dart
new file mode 100644
index 0000000..4983fd9
--- /dev/null
+++ b/tests/language/import/internal_library_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, 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.
+
+// Test that a private library cannot be accessed from outside the platform.
+
+library internal_library_test;
+
+import 'dart:core'; // This loads 'dart:_foreign_helper' and 'patch:core'.
+import 'dart:_foreign_helper';
+//     ^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.IMPORT_INTERNAL_LIBRARY
+// [cfe] Can't access platform private library.
+//     ^
+// [cfe] Not found: 'dart:_foreign_helper'
+
+part 'dart:_foreign_helper';
+//   ^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.PART_OF_NON_PART
+// [cfe] Can't access platform private library.
+//   ^
+// [cfe] Can't use 'org-dartlang-untranslatable-uri:dart%3A_foreign_helper' as a part, because it has no 'part of' declaration.
+//   ^
+// [cfe] Not found: 'dart:_foreign_helper'
+
+void main() {
+  JS('int', '0');
+//^
+// [cfe] Method not found: 'JS'.
+  JS('int', '0');
+//^
+// [cfe] Method not found: 'JS'.
+}
diff --git a/tests/language/import/nonexisting_dart_uri_runtime_test.dart b/tests/language/import/nonexisting_dart_uri_runtime_test.dart
new file mode 100644
index 0000000..f31c56d
--- /dev/null
+++ b/tests/language/import/nonexisting_dart_uri_runtime_test.dart
@@ -0,0 +1,10 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2018, 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() {}
diff --git a/tests/language/import/nonexisting_dart_uri_test.dart b/tests/language/import/nonexisting_dart_uri_test.dart
new file mode 100644
index 0000000..cb25b61
--- /dev/null
+++ b/tests/language/import/nonexisting_dart_uri_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, 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 "dart:nonexisting/nonexisting.dart";
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.URI_DOES_NOT_EXIST
+// [cfe] Not found: 'dart:nonexisting/nonexisting.dart'
+
+main() {}
diff --git a/tests/language/import/private_runtime_test.dart b/tests/language/import/private_runtime_test.dart
new file mode 100644
index 0000000..81914a9
--- /dev/null
+++ b/tests/language/import/private_runtime_test.dart
@@ -0,0 +1,13 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2013, 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.
+// Check that private dart:_ libraries cannot be imported.
+
+
+
+main() {
+  print("Done.");
+}
diff --git a/tests/language/import/private_test.dart b/tests/language/import/private_test.dart
new file mode 100644
index 0000000..deb2f1e
--- /dev/null
+++ b/tests/language/import/private_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2013, 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.
+// Check that private dart:_ libraries cannot be imported.
+
+import "dart:_internal";
+//     ^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.IMPORT_INTERNAL_LIBRARY
+// [cfe] Can't access platform private library.
+
+main() {
+  print("Done.");
+}
diff --git a/tests/language/import/self_runtime_test.dart b/tests/language/import/self_runtime_test.dart
new file mode 100644
index 0000000..47dac6e
--- /dev/null
+++ b/tests/language/import/self_runtime_test.dart
@@ -0,0 +1,23 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2014, 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.
+//
+// Check that private names cannot be imported even if the library imports
+// itself.
+
+library import_self;
+
+import "package:expect/expect.dart";
+
+// Eliminate the import of the unmodified file or else the analyzer
+// will generate the static error in the import_self_test_none case.
+
+
+var _x = "The quick brown fox jumps over the dazy log";
+
+main() {
+
+}
diff --git a/tests/language/import/self_test.dart b/tests/language/import/self_test.dart
new file mode 100644
index 0000000..1feeb88
--- /dev/null
+++ b/tests/language/import/self_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, 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.
+//
+// Check that private names cannot be imported even if the library imports
+// itself.
+
+library import_self;
+
+import "package:expect/expect.dart";
+
+// Eliminate the import of the unmodified file or else the analyzer
+// will generate the static error in the import_self_test_none case.
+import "self_test.dart" as p;
+
+var _x = "The quick brown fox jumps over the dazy log";
+
+main() {
+  p._x;
+  //^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [cfe] Getter not found: '_x'.
+}
diff --git a/tests/language/import/show_lib.dart b/tests/language/import/show_lib.dart
new file mode 100644
index 0000000..a3d7325
--- /dev/null
+++ b/tests/language/import/show_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2013, 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 import_show_lib;
+
+get theEnd => "http://www.endoftheinternet.com/";
diff --git a/tests/language/import/show_test.dart b/tests/language/import/show_test.dart
new file mode 100644
index 0000000..cb3a488
--- /dev/null
+++ b/tests/language/import/show_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2013, 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 import_show_test;
+
+import "package:expect/expect.dart";
+import "show_lib.dart" show theEnd;
+
+main() {
+  var foo = theEnd;
+  Expect.equals("http://www.endoftheinternet.com/", foo);
+}
diff --git a/tests/language/import/sub/sub.dart b/tests/language/import/sub/sub.dart
new file mode 100644
index 0000000..cd90247
--- /dev/null
+++ b/tests/language/import/sub/sub.dart
@@ -0,0 +1,8 @@
+library sub;
+
+import '../cyclic_test.dart';
+import 'package:expect/expect.dart';
+
+subMain() {
+  Expect.equals(42, value);
+}
diff --git a/tests/language/import/transitive_private_library_access_test.dart b/tests/language/import/transitive_private_library_access_test.dart
new file mode 100644
index 0000000..9dcdaed
--- /dev/null
+++ b/tests/language/import/transitive_private_library_access_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2015, 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 test program to check that we can resolve unqualified identifiers
+
+// Import 'dart:typed_data' which internally imports 'dart:_internal'.
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+main() {
+  ClassID.GetID(4); /*@compile-error=unspecified*/
+}
diff --git a/tests/language/initializing_formal/access_test.dart b/tests/language/initializing_formal/access_test.dart
new file mode 100644
index 0000000..79ce73f
--- /dev/null
+++ b/tests/language/initializing_formal/access_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, 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";
+
+class C {
+  final int x;
+  final int y;
+
+  const C.constant(this.x) : y = x + 1;
+
+  C(this.x) : y = x + 1 {
+    int z = x + 2;
+    assert(z == y + 1);
+  }
+}
+
+main() {
+  C c = new C(2);
+  Expect.equals(c.x, 2);
+  Expect.equals(c.y, 3);
+  const C cc = const C.constant(4);
+  Expect.equals(cc.x, 4);
+  Expect.equals(cc.y, 5);
+}
diff --git a/tests/language/initializing_formal/capture_test.dart b/tests/language/initializing_formal/capture_test.dart
new file mode 100644
index 0000000..3fd2d2c
--- /dev/null
+++ b/tests/language/initializing_formal/capture_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2016, 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";
+
+class A {
+  var x, y;
+  A(this.x) : y = (() => x);
+}
+
+main() {
+  A a = new A(2);
+  a.x = 3;
+  Expect.equals(a.x, 3);
+  Expect.equals(a.y(), 2);
+}
diff --git a/tests/language/initializing_formal/final_test.dart b/tests/language/initializing_formal/final_test.dart
new file mode 100644
index 0000000..d08f6d2
--- /dev/null
+++ b/tests/language/initializing_formal/final_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2016, 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";
+
+class A {
+  var x, y;
+  // This should cause an error because `x` is final when accessed as an
+  // initializing formal.
+  A(this.x)
+      : y = (() {
+          /*@compile-error=unspecified*/ x = 3;
+        });
+}
+
+main() {}
diff --git a/tests/language/initializing_formal/promotion_test.dart b/tests/language/initializing_formal/promotion_test.dart
new file mode 100644
index 0000000..4820de2
--- /dev/null
+++ b/tests/language/initializing_formal/promotion_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2016, 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";
+
+class B {}
+
+class A {
+  B? x, y;
+  // Promotion occurs for the initializing formal because C <: B.
+  A(this.x) : y = (x is C) ? x.x : x;
+}
+
+class C extends A implements B {
+  C(B? x) : super(x);
+}
+
+main() {
+  C c = new C(null);
+  C cc = new C(c);
+  Expect.equals(c.y, null);
+  Expect.equals(cc.y, null);
+}
diff --git a/tests/language/initializing_formal/scope_test.dart b/tests/language/initializing_formal/scope_test.dart
new file mode 100644
index 0000000..f75308f
--- /dev/null
+++ b/tests/language/initializing_formal/scope_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2016, 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";
+
+// Duplicate definition checks for `this.x` will check the scopes associated
+// with the constructor, not all enclosing scopes; so this is not a conflict.
+var x;
+
+class A {
+  var x;
+  A(this.x) {
+    // In the body the field is in scope, not the initializing formal;
+    // so we can use the setter.
+    x += 1;
+  }
+}
+
+main() {
+  A a = new A(2);
+  Expect.equals(a.x, 3);
+}
diff --git a/tests/language/initializing_formal/type_annotation_runtime_test.dart b/tests/language/initializing_formal/type_annotation_runtime_test.dart
new file mode 100644
index 0000000..c09a0ff
--- /dev/null
+++ b/tests/language/initializing_formal/type_annotation_runtime_test.dart
@@ -0,0 +1,23 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2017, 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.
+
+// Testing the static checks for type annotations on initializing formals.
+
+class C {
+  num a;
+  C.sameType(num this.a);
+  C.subType(int this.a);
+
+
+}
+
+main() {
+  new C.sameType(3.14);
+  new C.subType(42);
+
+
+}
diff --git a/tests/language/initializing_formal/type_annotation_test.dart b/tests/language/initializing_formal/type_annotation_test.dart
new file mode 100644
index 0000000..b15ad9a
--- /dev/null
+++ b/tests/language/initializing_formal/type_annotation_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2017, 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.
+
+// Testing the static checks for type annotations on initializing formals.
+
+class C {
+  num a;
+  C.sameType(num this.a);
+  C.subType(int this.a);
+  C.superType(dynamic this.a);
+  //          ^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_PARAMETER_DECLARATION
+  //                       ^
+  // [cfe] The type of parameter 'a', 'dynamic' is not a subtype of the corresponding field's type, 'num'.
+  C.unrelatedType(String this.a);
+  //              ^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_PARAMETER_DECLARATION
+  //              ^^^^^^^^^^^^^
+  // [analyzer] STATIC_WARNING.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE
+  //                          ^
+  // [cfe] The type of parameter 'a', 'String' is not a subtype of the corresponding field's type, 'num'.
+}
+
+main() {
+  new C.sameType(3.14);
+  new C.subType(42);
+  new C.superType([]);
+  new C.unrelatedType('String');
+}
diff --git a/tests/language/initializing_formal/type_test.dart b/tests/language/initializing_formal/type_test.dart
new file mode 100644
index 0000000..41a9f2a
--- /dev/null
+++ b/tests/language/initializing_formal/type_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2016, 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.
+
+class A {
+  num x;
+  int y;
+  // x has type int in the initialization list, but num inside the constructor
+  // body.
+  A(int this.x) : y = x { // OK.
+    int z = x;
+    //      ^
+    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
+  }
+}
+
+main() {
+  A(0);
+}
diff --git a/tests/language/instance/call_wrong_argument_count_test.dart b/tests/language/instance/call_wrong_argument_count_test.dart
new file mode 100644
index 0000000..8f0c710
--- /dev/null
+++ b/tests/language/instance/call_wrong_argument_count_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+/// Test mismatch in argument counts.
+
+class Niederhorn {
+  int goodCall(int a, int b, int c) {
+    return a + b;
+  }
+}
+
+main() {
+  var niederhorn = Niederhorn();
+  niederhorn.goodCall(1, 2, 3);
+  niederhorn.goodCall(1, 2, 3, 4);
+  //                 ^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
+  // [cfe] Too many positional arguments: 3 allowed, but 4 found.
+}
diff --git a/tests/language/instance/compound_assignment_operator_test.dart b/tests/language/instance/compound_assignment_operator_test.dart
new file mode 100644
index 0000000..b992acc
--- /dev/null
+++ b/tests/language/instance/compound_assignment_operator_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2012, 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.
+// Test correct instance compound assignment operator.
+
+import "package:expect/expect.dart";
+
+class A {
+  A() : f = 2 {}
+  var f;
+  operator [](index) => f;
+  operator []=(index, value) => f = value;
+
+  var _g = 0;
+  var gGetCount = 0;
+  var gSetCount = 0;
+  get g {
+    gGetCount++;
+    return _g;
+  }
+
+  set g(value) {
+    gSetCount++;
+    _g = value;
+  }
+}
+
+class B {
+  B()
+      : _a = new A(),
+        count = 0 {}
+  get a {
+    count++;
+    return _a;
+  }
+
+  var _a;
+  var count;
+}
+
+var globalA;
+var fooCounter = 0;
+foo() {
+  fooCounter++;
+  return globalA;
+}
+
+main() {
+  B b = new B();
+  Expect.equals(0, b.count);
+  Expect.equals(2, b.a.f);
+  Expect.equals(1, b.count);
+  var o = b.a;
+  Expect.equals(2, b.count);
+  b.a.f = 1;
+  Expect.equals(3, b.count);
+  Expect.equals(1, b._a.f);
+  b.a.f += 1;
+  Expect.equals(4, b.count);
+  Expect.equals(2, b._a.f);
+
+  b.count = 0;
+  b._a.f = 2;
+  Expect.equals(0, b.count);
+  Expect.equals(2, b.a[0]);
+  Expect.equals(1, b.count);
+  o = b.a;
+  Expect.equals(2, b.count);
+  b.a[0] = 1;
+  Expect.equals(3, b.count);
+  Expect.equals(1, b._a.f);
+  b.a[0] += 1;
+  Expect.equals(4, b.count);
+  Expect.equals(2, b._a.f);
+
+  b._a.g++;
+  Expect.equals(1, b._a.gGetCount);
+  Expect.equals(1, b._a.gSetCount);
+  Expect.equals(1, b._a._g);
+
+  globalA = b._a;
+  globalA.f = 0;
+  foo().f += 1;
+  Expect.equals(1, fooCounter);
+  Expect.equals(1, globalA.f);
+}
diff --git a/tests/language/instance/field_initializer_test.dart b/tests/language/instance/field_initializer_test.dart
new file mode 100644
index 0000000..1cb5c93
--- /dev/null
+++ b/tests/language/instance/field_initializer_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+class A {
+  int x = 1;
+  A() {}
+  A.reassign() : x = 2 {}
+  A.reassign2(this.x) {}
+}
+
+class B extends A {
+  B() : super() {}
+  B.reassign() : super.reassign() {}
+  B.reassign2() : super.reassign2(3) {}
+}
+
+class InstanceFieldInitializerTest {
+  static testMain() {
+    Expect.equals(1, new A().x);
+    Expect.equals(2, new A.reassign().x);
+    Expect.equals(3, new A.reassign2(3).x);
+
+    Expect.equals(1, new B().x);
+    Expect.equals(2, new B.reassign().x);
+    Expect.equals(3, new B.reassign2().x);
+  }
+}
+
+main() {
+  InstanceFieldInitializerTest.testMain();
+}
diff --git a/tests/language/instance/incr_deopt_test.dart b/tests/language/instance/incr_deopt_test.dart
new file mode 100644
index 0000000..d9424fd
--- /dev/null
+++ b/tests/language/instance/incr_deopt_test.dart
@@ -0,0 +1,56 @@
+// 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.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
+
+import "package:expect/expect.dart";
+
+// Check correct deoptimization of instance field increment.
+
+main() {
+  var a = new A();
+  var aa = new A();
+  for (int i = 0; i < 20; i++) {
+    a.Incr();
+    myIncr(aa);
+    conditionalIncr(false, a);
+  }
+  Expect.equals(20, a.f);
+  Expect.equals(20, aa.f);
+  a.f = 1.0;
+  // Deoptimize ++ part of instance increment.
+  a.Incr();
+  Expect.equals(2.0, a.f);
+  var b = new B();
+  // Deoptimize getfield part of instance increment.
+  myIncr(b);
+  Expect.equals(1.0, b.f);
+  // Deoptimize since no type feedback was collected.
+  var old = a.f;
+  conditionalIncr(true, a);
+  Expect.equals(old + 1, a.f);
+}
+
+myIncr(var a) {
+  a.f++;
+}
+
+conditionalIncr(var f, var a) {
+  if (f) {
+    a.f++;
+  }
+}
+
+class A {
+  A() : f = 0;
+  Incr() {
+    f++;
+  }
+
+  var f;
+}
+
+class B {
+  B() : f = 0;
+  var f;
+}
diff --git a/tests/language/instance/inline_test.dart b/tests/language/instance/inline_test.dart
new file mode 100644
index 0000000..0e58815
--- /dev/null
+++ b/tests/language/instance/inline_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, 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";
+
+// Test inlining of assignments in parameter passing. If [StringScanner.charAt]
+// is inlined, the argument expression `++byteOffset` should not be duplicated.
+
+class StringScanner {
+  final String string;
+  int byteOffset = -1;
+
+  StringScanner(this.string);
+
+  int nextByte() => charAt(++byteOffset);
+
+  int charAt(index) => (string.length > index) ? string.codeUnitAt(index) : -1;
+}
+
+void main() {
+  var scanner = new StringScanner('az9');
+  Expect.equals(0x61, scanner.nextByte()); // Expect a.
+  Expect.equals(0x7A, scanner.nextByte()); // Expect z.
+  Expect.equals(0x39, scanner.nextByte()); // Expect 9.
+  Expect.equals(-1, scanner.nextByte());
+}
diff --git a/tests/language/instance/method2_test.dart b/tests/language/instance/method2_test.dart
new file mode 100644
index 0000000..de92967
--- /dev/null
+++ b/tests/language/instance/method2_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+/// Check that we correctly flag the use of an instance method (as a closure)
+/// from a static method.
+
+class Goofy {
+  String instMethod() {
+    return "woof";
+  }
+
+  static Function bark() {
+    return instMethod;
+    //     ^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_MEMBER_ACCESS_FROM_STATIC
+    // [cfe] Getter not found: 'instMethod'.
+  }
+}
+
+main() {
+  var s = Goofy.bark();
+}
diff --git a/tests/language/instance/method_test.dart b/tests/language/instance/method_test.dart
new file mode 100644
index 0000000..f2de913
--- /dev/null
+++ b/tests/language/instance/method_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+/// Check that we correctly flag the use of an instance method from a static
+/// method.
+
+class Goofy {
+  String instMethod() {
+    return "woof";
+  }
+
+  static String bark() {
+    return instMethod();
+    //     ^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_MEMBER_ACCESS_FROM_STATIC
+    // [cfe] Method not found: 'instMethod'.
+  }
+}
+
+main() {
+  Goofy.bark();
+}
diff --git a/tests/language/interceptor/interceptor2_test.dart b/tests/language/interceptor/interceptor2_test.dart
new file mode 100644
index 0000000..06260c8
--- /dev/null
+++ b/tests/language/interceptor/interceptor2_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, 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";
+
+// Regression test for issue http://dartbug.com/6903: dart2js used to
+// not generate an interceptor forwarder when a getter call and a
+// method call on an intercepted method were both used.
+
+class A {
+  get iterator => () => 499;
+}
+
+main() {
+  var a = <dynamic>[
+    new A(),
+    [1, 1]
+  ];
+  Expect.equals(499, a[0].iterator());
+  Expect.equals(499, (a[0].iterator)());
+  for (var i in a[1]) {
+    Expect.equals(1, i);
+  }
+}
diff --git a/tests/language/interceptor/interceptor3_test.dart b/tests/language/interceptor/interceptor3_test.dart
new file mode 100644
index 0000000..b22b26d
--- /dev/null
+++ b/tests/language/interceptor/interceptor3_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, 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";
+
+// Test that code motion in the presence of interceptors work in dart2js.
+
+main() {
+  var a = <dynamic>[2, '2'];
+  var b = a[1];
+  if (a[0] == 2 && b is String) {
+    Expect.isTrue(b.contains('2'));
+  } else {
+    b.isEven();
+  }
+}
diff --git a/tests/language/interceptor/interceptor4_test.dart b/tests/language/interceptor/interceptor4_test.dart
new file mode 100644
index 0000000..00bac28
--- /dev/null
+++ b/tests/language/interceptor/interceptor4_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2012, 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";
+
+// Test that dart2js gets the right interceptor for an int.
+
+main() {
+  var a = [1];
+  var b = a[0];
+  Expect.equals('1', b.toString());
+  Expect.isTrue(b.isOdd);
+}
diff --git a/tests/language/interceptor/interceptor5_test.dart b/tests/language/interceptor/interceptor5_test.dart
new file mode 100644
index 0000000..41b76e9
--- /dev/null
+++ b/tests/language/interceptor/interceptor5_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, 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";
+
+get X => [() => 123];
+
+main() {
+  Expect.equals(123, X.last());
+}
diff --git a/tests/language/interceptor/interceptor7_test.dart b/tests/language/interceptor/interceptor7_test.dart
new file mode 100644
index 0000000..7e88bcd
--- /dev/null
+++ b/tests/language/interceptor/interceptor7_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2013, 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.
+
+// Test that dart2js uses the right interceptor when call a method on
+// something that has type number.
+
+import 'package:expect/expect.dart';
+
+var array = <dynamic>[];
+
+main() {
+  array.add(false);
+  dynamic x = array[0] ? 1.5 : 2;
+  Expect.isTrue(x.isEven);
+}
diff --git a/tests/language/interceptor/interceptor8_test.dart b/tests/language/interceptor/interceptor8_test.dart
new file mode 100644
index 0000000..0890124
--- /dev/null
+++ b/tests/language/interceptor/interceptor8_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2013, 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.
+
+// Regression test for dart2js whose codegen used to not consider a double
+// could be instantiated when doing int / int.
+
+var a = [5, 2];
+
+main() {
+  print(a[0] / a[1]);
+}
diff --git a/tests/language/interceptor/interceptor9_test.dart b/tests/language/interceptor/interceptor9_test.dart
new file mode 100644
index 0000000..07525a5
--- /dev/null
+++ b/tests/language/interceptor/interceptor9_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, 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.
+
+// Regression test for dart2js whose codegen in some cases did not take is
+// tests into account when computing the set of classes for interceptors.
+// See http://dartbug.com/17325
+
+import "package:expect/expect.dart";
+import "dart:typed_data";
+
+confuse(x, [y = null]) => new DateTime.now().day == 42 ? y : x;
+
+boom() {
+  var x = confuse(new Uint8List(22), "");
+  Expect.isTrue(x is Uint8List);
+  x.startsWith("a");
+  x.endsWith("u");
+}
+
+main() {
+  try {
+    var f;
+    if (confuse(true)) {
+      // prevent inlining
+      f = boom;
+    }
+    f();
+  } catch (e) {
+    if (e is ExpectException) throw e;
+  }
+}
diff --git a/tests/language/interceptor/interceptor_test.dart b/tests/language/interceptor/interceptor_test.dart
new file mode 100644
index 0000000..7faf174
--- /dev/null
+++ b/tests/language/interceptor/interceptor_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, 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";
+
+// Test that interceptors (that is, methods in classes implemented as
+// JavaScript primitives) in dart2js work.
+
+class A {
+  codeUnitAt(a) => a;
+}
+
+main() {
+  var res = <dynamic>[[], 1, 'foo', new A()];
+  Expect.throws(() => res[0].codeUnitAt(1));
+  Expect.throws(() => (res[0].codeUnitAt)(1));
+
+  Expect.throws(() => res[1].codeUnitAt(1));
+  Expect.throws(() => (res[1].codeUnitAt)(1));
+
+  Expect.equals(111, res[2].codeUnitAt(1));
+  Expect.equals(111, (res[2].codeUnitAt)(1));
+  Expect.throws(() => res[2].codeUnitAt(1, 4));
+  Expect.throws(() => res[2].codeUnitAt());
+  Expect.throws(() => (res[2].codeUnitAt)(1, 4));
+  Expect.throws(() => (res[2].codeUnitAt)());
+
+  Expect.equals(1, res[3].codeUnitAt(1));
+  Expect.equals(1, (res[3].codeUnitAt)(1));
+  Expect.throws(() => res[3].codeUnitAt(1, 4));
+  Expect.throws(() => res[3].codeUnitAt());
+  Expect.throws(() => (res[3].codeUnitAt)(1, 4));
+  Expect.throws(() => (res[3].codeUnitAt)());
+}
diff --git a/tests/language/interface/constants_test.dart b/tests/language/interface/constants_test.dart
new file mode 100644
index 0000000..5654066
--- /dev/null
+++ b/tests/language/interface/constants_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2012, 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";
+
+abstract class Constants {
+  static const int FIVE = 5;
+}
+
+class InterfaceConstantsTest {
+  InterfaceConstantsTest() {}
+
+  static void testMain() {
+    Expect.equals(5, Constants.FIVE);
+  }
+}
+
+main() {
+  InterfaceConstantsTest.testMain();
+}
diff --git a/tests/language/interface/cycle_test.dart b/tests/language/interface/cycle_test.dart
new file mode 100644
index 0000000..0e44708
--- /dev/null
+++ b/tests/language/interface/cycle_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2012, 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.
+// Check fail because of cycles in super interface relationship.
+
+class C implements B {}
+
+class A implements B {}
+
+class B
+  implements A // //# 01: compile-time error
+  implements A // //# 02: compile-time error
+{}
+
+main() {
+  new C(); // //# 01: continued
+  new List<C>(); // //# 02: continued
+}
diff --git a/tests/language/interface/duplicate_implements_test.dart b/tests/language/interface/duplicate_implements_test.dart
new file mode 100644
index 0000000..41c10fa
--- /dev/null
+++ b/tests/language/interface/duplicate_implements_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, 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.
+// Check that duplicate types in implements/extends list are
+// compile-time errors.
+
+abstract class I {}
+
+abstract class J {}
+
+abstract class K<T> {}
+
+class X implements I, J, I { } //              //# 01: compile-time error
+class X implements J, I, K<int>, K<int> { } // //# 02: compile-time error
+
+abstract class Z implements I, J, J { } //             //# 03: compile-time error
+abstract class Z implements K<int>, K<int> { } //      //# 04: compile-time error
+
+main() {
+  X x = new X(); // //# 01: continued
+  X x = new X(); // //# 02: continued
+  Z z = new Z(); // //# 03: continued
+  Z z = new Z(); // //# 04: continued
+}
diff --git a/tests/language/interface/duplicate_interface_implements_runtime_test.dart b/tests/language/interface/duplicate_interface_implements_runtime_test.dart
new file mode 100644
index 0000000..aced31d
--- /dev/null
+++ b/tests/language/interface/duplicate_interface_implements_runtime_test.dart
@@ -0,0 +1,18 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2013, 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 "duplicate_interface_lib.dart" as alib;
+import "duplicate_interface_lib.dart" show InterfA;
+
+// Expect error since InterfA and alib.InterfA refer to the same interface.
+class Foo implements InterfA
+
+{}
+
+main() {
+  new Foo();
+}
diff --git a/tests/language/interface/duplicate_interface_implements_test.dart b/tests/language/interface/duplicate_interface_implements_test.dart
new file mode 100644
index 0000000..4564aad
--- /dev/null
+++ b/tests/language/interface/duplicate_interface_implements_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, 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 "duplicate_interface_lib.dart" as alib;
+import "duplicate_interface_lib.dart" show InterfA;
+
+// Expect error since InterfA and alib.InterfA refer to the same interface.
+class Foo implements InterfA
+    , alib.InterfA
+    //^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_REPEATED
+{}
+
+main() {
+  new Foo();
+}
diff --git a/tests/language/interface/duplicate_interface_lib.dart b/tests/language/interface/duplicate_interface_lib.dart
new file mode 100644
index 0000000..b369b3a
--- /dev/null
+++ b/tests/language/interface/duplicate_interface_lib.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2013, 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.
+// Check fail because of cycles in super class relationship.
+
+library Interface_Lib;
+
+class InterfA {}
+
+class InterfB {}
diff --git a/tests/language/interface/duplicate_interface_test.dart b/tests/language/interface/duplicate_interface_test.dart
new file mode 100644
index 0000000..d957be9
--- /dev/null
+++ b/tests/language/interface/duplicate_interface_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, 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.
+// Check fail because of cycles in super class relationship.
+
+library duplicateInterfaceTest;
+
+import 'package:expect/expect.dart';
+import "duplicate_interface_lib.dart" as alib;
+
+class InterfB {}
+
+// Ok since InterfB and alib.InterfB are not the same interface
+class Foo implements InterfB, alib.InterfB {}
+
+main() {
+  Expect.isTrue(new Foo() is InterfB);
+  Expect.isTrue(new Foo() is alib.InterfB);
+}
diff --git a/tests/language/interface/implements_futureor_runtime_test.dart b/tests/language/interface/implements_futureor_runtime_test.dart
new file mode 100644
index 0000000..257056b
--- /dev/null
+++ b/tests/language/interface/implements_futureor_runtime_test.dart
@@ -0,0 +1,16 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2018, 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 'dart:async';
+
+class A<T>
+
+{}
+
+void main() {
+  A a = new A();
+}
diff --git a/tests/language/interface/implements_futureor_test.dart b/tests/language/interface/implements_futureor_test.dart
new file mode 100644
index 0000000..1ec6779
--- /dev/null
+++ b/tests/language/interface/implements_futureor_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, 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 'dart:async';
+
+class A<T> implements FutureOr<T> {}
+//                    ^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_DISALLOWED_CLASS
+//    ^
+// [cfe] The type 'FutureOr' can't be used in an 'implements' clause.
+
+void main() {
+  A a = new A();
+}
diff --git a/tests/language/interface/inherit_field_test.dart b/tests/language/interface/inherit_field_test.dart
new file mode 100644
index 0000000..fa43fb9
--- /dev/null
+++ b/tests/language/interface/inherit_field_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, 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.
+
+// Test that it is legal to override a field with a field in an interface.
+
+abstract class IA {
+  final int foo;
+  IA(this.foo);
+}
+
+abstract class IB implements IA {
+  final int foo;
+  IB(this.foo);
+}
+
+class B implements IB {
+  int _f = 123;
+  int get foo => _f;
+}
+
+main() {
+  IB b = new B();
+  print('b.foo = ${b.foo}');
+}
diff --git a/tests/language/interface/injection1_runtime_test.dart b/tests/language/interface/injection1_runtime_test.dart
new file mode 100644
index 0000000..ab438b4
--- /dev/null
+++ b/tests/language/interface/injection1_runtime_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2012, 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.
+
+// The removed language feature "interface injection" is now a syntax error.
+
+import "package:expect/expect.dart";
+
+abstract class S { }
+abstract class I { }
+
+
+class C implements I { }
+
+main() {
+  Expect.isFalse(new C() is S);
+}
diff --git a/tests/language/interface/injection1_test.dart b/tests/language/interface/injection1_test.dart
new file mode 100644
index 0000000..9a3faf4
--- /dev/null
+++ b/tests/language/interface/injection1_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2012, 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.
+
+// The removed language feature "interface injection" is now a syntax error.
+
+import "package:expect/expect.dart";
+
+abstract class S { }
+abstract class I { }
+abstract class I implements S;
+//             ^
+// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+// [cfe] 'I' is already declared in this scope.
+//                          ^
+// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
+// [cfe] A class declaration must have a body, even if it is empty.
+//                           ^
+// [analyzer] SYNTACTIC_ERROR.UNEXPECTED_TOKEN
+// [cfe] Unexpected token ';'.
+
+class C implements I { }
+//                 ^
+// [cfe] 'I' isn't a type.
+
+main() {
+  Expect.isFalse(new C() is S);
+}
diff --git a/tests/language/interface/injection2_runtime_test.dart b/tests/language/interface/injection2_runtime_test.dart
new file mode 100644
index 0000000..a8a6788
--- /dev/null
+++ b/tests/language/interface/injection2_runtime_test.dart
@@ -0,0 +1,18 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2012, 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.
+
+// The removed language feature "interface injection" is now a syntax error.
+
+import "package:expect/expect.dart";
+
+abstract class S { }
+class C { }
+
+
+main() {
+  Expect.isFalse(new C() is S);
+}
diff --git a/tests/language/interface/injection2_test.dart b/tests/language/interface/injection2_test.dart
new file mode 100644
index 0000000..e49d5bd
--- /dev/null
+++ b/tests/language/interface/injection2_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2012, 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.
+
+// The removed language feature "interface injection" is now a syntax error.
+
+import "package:expect/expect.dart";
+
+abstract class S { }
+class C { }
+class C implements S;
+//    ^
+// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
+// [cfe] 'C' is already declared in this scope.
+//                 ^
+// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
+// [cfe] A class declaration must have a body, even if it is empty.
+//                  ^
+// [analyzer] SYNTACTIC_ERROR.UNEXPECTED_TOKEN
+// [cfe] Unexpected token ';'.
+
+main() {
+  Expect.isFalse(new C() is S);
+  //                 ^
+  // [cfe] Method not found: 'C'.
+}
diff --git a/tests/language/interface/interface2_test.dart b/tests/language/interface/interface2_test.dart
new file mode 100644
index 0000000..7b8282c
--- /dev/null
+++ b/tests/language/interface/interface2_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+/// A class must implement a known interface.
+
+class Interface2NegativeTest implements BooHoo {}
+//                                      ^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
+// [cfe] Type 'BooHoo' not found.
+//                                      ^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+
+main() {
+  Interface2NegativeTest();
+}
diff --git a/tests/language/interface/interface_test.dart b/tests/language/interface/interface_test.dart
new file mode 100644
index 0000000..b05e0a6
--- /dev/null
+++ b/tests/language/interface/interface_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2012, 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 test program for testing Interfaces.
+
+abstract class Ai {
+  int foo();
+}
+
+abstract class Bi implements Ai {
+  factory Bi() = InterfaceTest;
+  //      ^
+  // [cfe] Factory redirects to class 'InterfaceTest', which is abstract and can't be instantiated.
+  //             ^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR
+}
+
+abstract class Simple implements Ai {}
+
+abstract class Aai {}
+
+abstract class Abi {}
+
+abstract class Bar {}
+
+abstract class Foo implements Bar {}
+
+abstract class Baz implements Bar, Foo {}
+
+abstract class InterfaceTest implements Ai, Aai, Abi, Baz, Bi {
+  var f;
+
+  InterfaceTest() {}
+  int foo() {
+    return 1;
+  }
+
+  // intentionally unimplemented methods
+  beta(); // Abstract.
+  String beta1(); // Abstract.
+  String beta2(double d); // Abstract.
+}
+
+main() {
+  new Bi();
+}
diff --git a/tests/language/interface/runtime_test.dart b/tests/language/interface/runtime_test.dart
new file mode 100644
index 0000000..b789fe7
--- /dev/null
+++ b/tests/language/interface/runtime_test.dart
@@ -0,0 +1,45 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// Copyright (c) 2012, 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 test program for testing Interfaces.
+
+abstract class Ai {
+  int foo();
+}
+
+abstract class Bi implements Ai {
+
+}
+
+abstract class Simple implements Ai {}
+
+abstract class Aai {}
+
+abstract class Abi {}
+
+abstract class Bar {}
+
+abstract class Foo implements Bar {}
+
+abstract class Baz implements Bar, Foo {}
+
+abstract class InterfaceTest implements Ai, Aai, Abi, Baz, Bi {
+  var f;
+
+  InterfaceTest() {}
+  int foo() {
+    return 1;
+  }
+
+  // intentionally unimplemented methods
+  beta(); // Abstract.
+  String beta1(); // Abstract.
+  String beta2(double d); // Abstract.
+}
+
+main() {
+
+}
diff --git a/tests/language/interface/static_method_test.dart b/tests/language/interface/static_method_test.dart
new file mode 100644
index 0000000..b07e7b9
--- /dev/null
+++ b/tests/language/interface/static_method_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+abstract class A {
+  static void foo();
+  //               ^
+  // [analyzer] SYNTACTIC_ERROR.MISSING_FUNCTION_BODY
+  // [cfe] Expected a function body or '=>'.
+}
+
+main() {
+  A();
+//^
+// [analyzer] STATIC_WARNING.INSTANTIATE_ABSTRACT_CLASS
+// [cfe] The class 'A' is abstract and can't be instantiated.
+}
diff --git a/tests/language/label/label3_runtime_1_test.dart b/tests/language/label/label3_runtime_1_test.dart
new file mode 100644
index 0000000..76da501
--- /dev/null
+++ b/tests/language/label/label3_runtime_1_test.dart
@@ -0,0 +1,14 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  L: while (false) {
+    if (true) break L;
+  }
+  // Illegal: L is out of scope.
+
+}
diff --git a/tests/language/label/label3_runtime_test.dart b/tests/language/label/label3_runtime_test.dart
new file mode 100644
index 0000000..afcaad7
--- /dev/null
+++ b/tests/language/label/label3_runtime_test.dart
@@ -0,0 +1,14 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  L: while (false) {
+
+  }
+  // Illegal: L is out of scope.
+
+}
diff --git a/tests/language/label/label3_test.dart b/tests/language/label/label3_test.dart
new file mode 100644
index 0000000..cdea8e4
--- /dev/null
+++ b/tests/language/label/label3_test.dart
@@ -0,0 +1,17 @@
+// 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() {
+  L: while (false) {
+    if (true) break L;
+  }
+  // Illegal: L is out of scope.
+  continue L;
+//^^^^^^^^
+// [analyzer] SYNTACTIC_ERROR.CONTINUE_OUTSIDE_OF_LOOP
+// [cfe] A continue statement can't be used outside of a loop or switch statement.
+//         ^
+// [analyzer] COMPILE_TIME_ERROR.LABEL_UNDEFINED
+// [cfe] Can't find label 'L'.
+}
diff --git a/tests/language/label/label5_runtime_test.dart b/tests/language/label/label5_runtime_test.dart
new file mode 100644
index 0000000..fd934f0
--- /dev/null
+++ b/tests/language/label/label5_runtime_test.dart
@@ -0,0 +1,14 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  var L = 33;
+  while (false) {
+    // Illegal: L is not a label.
+
+  }
+}
diff --git a/tests/language/label/label5_test.dart b/tests/language/label/label5_test.dart
new file mode 100644
index 0000000..9856809
--- /dev/null
+++ b/tests/language/label/label5_test.dart
@@ -0,0 +1,14 @@
+// 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() {
+  var L = 33;
+  while (false) {
+    // Illegal: L is not a label.
+    if (true) break L;
+    //              ^
+    // [analyzer] COMPILE_TIME_ERROR.LABEL_UNDEFINED
+    // [cfe] Can't break to 'L'.
+  }
+}
diff --git a/tests/language/label/label6_runtime_1_test.dart b/tests/language/label/label6_runtime_1_test.dart
new file mode 100644
index 0000000..effe712
--- /dev/null
+++ b/tests/language/label/label6_runtime_1_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  L:
+  while (false) {
+    break;
+
+    void innerfunc() {
+      // Illegal: jump target is outside of function
+
+    }
+
+    innerfunc();
+  }
+}
diff --git a/tests/language/label/label6_runtime_2_test.dart b/tests/language/label/label6_runtime_2_test.dart
new file mode 100644
index 0000000..732c430
--- /dev/null
+++ b/tests/language/label/label6_runtime_2_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  L:
+  while (false) {
+
+    break L;
+    void innerfunc() {
+      // Illegal: jump target is outside of function
+
+    }
+
+    innerfunc();
+  }
+}
diff --git a/tests/language/label/label6_runtime_test.dart b/tests/language/label/label6_runtime_test.dart
new file mode 100644
index 0000000..e240a78
--- /dev/null
+++ b/tests/language/label/label6_runtime_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  L:
+  while (false) {
+
+
+    void innerfunc() {
+      // Illegal: jump target is outside of function
+
+    }
+
+    innerfunc();
+  }
+}
diff --git a/tests/language/label/label6_test.dart b/tests/language/label/label6_test.dart
new file mode 100644
index 0000000..5219b01
--- /dev/null
+++ b/tests/language/label/label6_test.dart
@@ -0,0 +1,21 @@
+// 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() {
+  L:
+  while (false) {
+    break;
+    break L;
+    void innerfunc() {
+      // Illegal: jump target is outside of function
+      if (true) break L;
+      //        ^
+      // [cfe] Can't break to 'L' in a different function.
+      //              ^
+      // [analyzer] COMPILE_TIME_ERROR.LABEL_IN_OUTER_SCOPE
+    }
+
+    innerfunc();
+  }
+}
diff --git a/tests/language/label/label8_runtime_test.dart b/tests/language/label/label8_runtime_test.dart
new file mode 100644
index 0000000..4573cbc
--- /dev/null
+++ b/tests/language/label/label8_runtime_test.dart
@@ -0,0 +1,20 @@
+// TODO(multitest): This was automatically migrated from a multitest and may
+// contain strange or dead code.
+
+// 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() {
+  int i = 0;
+  // Grammar doesn't allow label on block for switch statement.
+  switch(i)
+
+  {
+    case 111:
+      while (false) {
+
+      }
+      i++;
+  }
+}
diff --git a/tests/language/label/label8_test.dart b/tests/language/label/label8_test.dart
new file mode 100644
index 0000000..e17e3b1
--- /dev/null
+++ b/tests/language/label/label8_test.dart
@@ -0,0 +1,43 @@
+// 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() {
+  int i = 0;
+  // Grammar doesn't allow label on block for switch statement.
+  switch(i)
+  //      ^
+  // [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
+  // [cfe] A switch statement must have a body, even if it is empty.
+    L:
+  {
+    case 111:
+//  ^^^^
+// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
+// [cfe] Expected ';' after this.
+//  ^^^^
+// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [cfe] Expected an identifier, but got 'case'.
+//  ^^^^
+// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
+// [cfe] Getter not found: 'case'.
+//  ^^^^
+// [analyzer] SYNTACTIC_ERROR.MISSING_STATEMENT
+//       ^^^
+// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [cfe] Expected ';' after this.
+//          ^
+// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [cfe] Expected ';' after this.
+//          ^
+// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
+// [cfe] Expected an identifier, but got ':'.
+//          ^
+// [analyzer] SYNTACTIC_ERROR.UNEXPECTED_TOKEN
+// [cfe] Unexpected token ':'.
+      while (false) {
+        break L;
+      }
+      i++;
+  }
+}
diff --git a/tests/language/label/label_test.dart b/tests/language/label/label_test.dart
new file mode 100644
index 0000000..74f3cd7
--- /dev/null
+++ b/tests/language/label/label_test.dart
@@ -0,0 +1,352 @@
+// 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 test program to test check that we can parse labels.
+
+import "package:expect/expect.dart";
+
+class Helper {
+  static int ticks = 0;
+
+  // Helper function to prevent endless loops in case labels or
+  // break/continue is broken.
+  static doAgain() {
+    ++ticks;
+    if (ticks > 300) {
+      // obfuscating man's assert(false)
+      Expect.equals(true, false);
+    }
+    return true;
+  }
+
+  static test1() {
+    var i = 1;
+    while (doAgain()) {
+      if (i > 0) break;
+      return 0;
+    }
+    return 111;
+  }
+
+  static test2() {
+    // Make sure we break out to default label.
+    var i = 1;
+    L:
+    while (doAgain()) {
+      // unused label
+      if (i > 0) break;
+      return 0;
+    }
+    return 111;
+  }
+
+  static test3() {
+    // Make sure we break out of outer loop.
+    var i = 1;
+    L:
+    while (doAgain()) {
+      while (doAgain()) {
+        if (i > 0) break L;
+        return 0;
+      }
+      return 1;
+    }
+    return 111;
+  }
+
+  static test4() {
+    // Make sure we break out of inner loop.
+    var i = 100;
+    L:
+    while (doAgain()) {
+      // unused label
+      while (doAgain()) {
+        if (i > 0) break;
+        return 0;
+      }
+      return 111;
+    }
+    return 1;
+  }
+
+  static test5() {
+    // Make sure we jump to loop condition.
+    var i = 10;
+    while (i > 0) {
+      i--;
+      if (true) continue; // without the if the following return is dead code.
+      return 0;
+    }
+    return 111;
+  }
+
+  static test6() {
+    // Make sure we jump to loop condition.
+    L:
+    for (int i = 10; i > 0; i--) {
+      // unreferenced label, should warn
+      if (true) continue; // without the if the following return is dead code.
+      return 0;
+    }
+    // Make sure this L does not conflict with previous L.
+    var k = 20;
+    L:
+    while (doAgain()) {
+      L0:
+      while (doAgain()) break L; // unreferenced label L0, should warn
+      return 1;
+    }
+    return 111;
+  }
+
+  static test7() {
+    // Just weird stuff.
+    var i = 10;
+    L:
+    do {
+      L:
+      while (doAgain()) {
+        if (true) break L; // without the if the following line is dead code.
+        continue L;
+      }
+      i = 0;
+      continue L;
+    } while (i == 10 && doAgain());
+    return 111;
+  }
+
+  static test8() {
+    L:
+    while (false) {
+      var L = 33; // OK, shouldn't collide with label.
+      if (true) break L;
+    }
+    return 111;
+  }
+
+  static test9() {
+    var i = 111;
+    L1:
+    if (i == 0) {
+      // unreferenced label, should warn
+      return 0;
+    }
+
+    L2:
+    while (i == 0) {
+      // unreferenced label, should warn
+      return 0;
+    }
+
+    L3: // useless label, should warn
+    return i;
+  }
+
+  // Labels should be allowed on block/if/for/switch/while/do stmts.
+  static test10() {
+    int i = 111;
+    // block
+    while (doAgain()) {
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      }
+      break;
+    }
+    Expect.equals(111, i);
+
+    while (doAgain()) {
+      L:
+      if (doAgain()) {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      }
+      break;
+    }
+    Expect.equals(111, i);
+
+    while (doAgain()) {
+      L:
+      for (; doAgain();) {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      }
+      break;
+    }
+    Expect.equals(111, i);
+
+    L:
+    for (i in [111]) {
+      while (doAgain()) {
+        break L;
+      }
+      i--;
+      break;
+    }
+    Expect.equals(111, i);
+
+    L:
+    for (var j in [111]) {
+      while (doAgain()) {
+        break L;
+      }
+      i--;
+      break;
+    }
+    Expect.equals(111, i);
+
+    while (doAgain()) {
+      L:
+      switch (i) {
+        case 111:
+          while (doAgain()) {
+            break L;
+          }
+          i--;
+          break;
+        default:
+          i--;
+      }
+      break;
+    }
+    Expect.equals(111, i);
+
+    while (doAgain()) {
+      L:
+      do {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      } while (doAgain());
+      break;
+    }
+    Expect.equals(111, i);
+
+    while (doAgain()) {
+      L:
+      try {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      } finally {}
+      break;
+    }
+    Expect.equals(111, i);
+
+    return i;
+  }
+
+  static test11() {
+    // Kind of odd, but is valid and shouldn't be flagged as useless either.
+    L:
+    break L;
+    return 111;
+  }
+
+  static test12() {
+    int i = 111;
+
+    // label the inner block on compound stmts
+    if (true)
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      }
+    Expect.equals(111, i);
+
+    // loop will execute each time, but won't execute code below the break
+    var forCount = 0;
+    for (forCount = 0; forCount < 2; forCount++)
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+        break;
+      }
+    Expect.equals(111, i);
+    Expect.equals(forCount, 2);
+
+    for (i in [111])
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+        break;
+      }
+    Expect.equals(111, i);
+
+    for (var j in [111])
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+        break;
+      }
+    Expect.equals(111, i);
+
+    if (false) {} else
+      L:
+      {
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+      }
+    Expect.equals(111, i);
+
+    int whileCount = 0;
+    while (whileCount < 2)
+      L:
+      {
+        whileCount++;
+        while (doAgain()) {
+          break L;
+        }
+        i--;
+        break;
+      }
+    Expect.equals(111, i);
+    Expect.equals(2, whileCount);
+
+    return i;
+  }
+}
+
+class LabelTest {
+  static testMain() {
+    Expect.equals(111, Helper.test1());
+    Expect.equals(111, Helper.test2());
+    Expect.equals(111, Helper.test3());
+    Expect.equals(111, Helper.test4());
+    Expect.equals(111, Helper.test5());
+    Expect.equals(111, Helper.test6());
+    Expect.equals(111, Helper.test7());
+    Expect.equals(111, Helper.test8());
+    Expect.equals(111, Helper.test9());
+    Expect.equals(111, Helper.test10());
+    Expect.equals(111, Helper.test11());
+    Expect.equals(111, Helper.test12());
+  }
+}
+
+main() {
+  LabelTest.testMain();
+}
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
index 00c2449..ddf79bd 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
@@ -5,6 +5,9 @@
 // Opt out of Null Safety:
 // @dart = 2.6
 
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
 import 'package:expect/expect.dart';
 import 'null_safe_library.dart';
 
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
index 6a2acd5..3721c69 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
 import 'package:expect/expect.dart';
 import 'legacy_library.dart';
 
diff --git a/tests/language/nnbd/normalization/generic_function_type_object_normalization_test.dart b/tests/language/nnbd/normalization/generic_function_type_object_normalization_test.dart
new file mode 100644
index 0000000..4cb9036d
--- /dev/null
+++ b/tests/language/nnbd/normalization/generic_function_type_object_normalization_test.dart
@@ -0,0 +1,198 @@
+// Copyright (c) 2020, 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 'dart:async';
+import 'type_builder.dart';
+
+// Tests for runtime type object normalization.
+
+// Check that two objects have equal runtime types,
+// compared in any order.
+void checkTypeEquals2(Object? a, Object? b) {
+  checkEquals2(a.runtimeType, b.runtimeType);
+}
+
+// Check that two objects have unequal runtime types,
+// compared in any order.
+void checkTypeNotEquals2(Object? a, Object? b) {
+  checkNotEquals2(a.runtimeType, b.runtimeType);
+}
+
+// Check that three objects have equal runtime types,
+// compared in combination and any order.
+void checkTypeEquals3(Object? a, Object? b, Object? c) {
+  checkTypeEquals2(a, b);
+  checkTypeEquals2(a, c);
+  checkTypeEquals2(b, c);
+}
+
+// Check that three objects have unequal runtime types,
+// compared in combination and any order.
+void checkTypeNotEquals3(Object? a, Object? b, Object? c) {
+  checkTypeNotEquals2(a, b);
+  checkTypeNotEquals2(a, c);
+  checkTypeNotEquals2(b, c);
+}
+
+// Tests of generic function types.
+
+class SimpleBoundTests<T> {
+  // These are equal if `T` is equivalent to a top type or Object
+  T f1<S extends FutureOr<T>>() => throw "Unused";
+  T f2<R extends T>() => throw "Unused";
+
+  // These are equal if `T` is equivalent to Never or Null
+  T g1<S extends FutureOr<T>?>() => throw "Unused";
+  T g2<R extends Future<T>?>() => throw "Unused";
+
+  // These are equal if `T` is nullable
+  T h1<S extends FutureOr<T>?>() => throw "Unused";
+  T h2<R extends FutureOr<T>>() => throw "Unused";
+
+  // If `T` is a top type, check that the appropriate
+  // equalities and disequalities hold.
+  static void checkAtTopType<T>() {
+    var a = SimpleBoundTests<T>();
+    checkTypeEquals2(a.f1, a.f2);
+    checkTypeNotEquals2(a.g1, a.g2);
+    checkTypeEquals2(a.h1, a.h2);
+  }
+
+  // Check the top type related equalites and inequalities
+  // at various top types.
+  static void checkTopTypes() {
+    checkAtTopType<Object?>();
+    checkAtTopType<void>();
+    checkAtTopType<dynamic>();
+    checkAtTopType<FutureOr<Object?>>();
+  }
+
+  // Check that the types of the methods above are equal or not at
+  // a bottom type
+  static void checkAtBottomType<T>() {
+    var a = SimpleBoundTests<T>();
+    checkTypeNotEquals2(a.f1, a.f2);
+    checkTypeEquals2(a.g1, a.g2);
+    if (null is T) {
+      checkTypeEquals2(a.h1, a.h2);
+    } else {
+      checkTypeNotEquals2(a.h1, a.h2);
+    }
+  }
+
+  // Check that the types of the methods above are equal or not at
+  // the bottom types
+  static void checkBottomTypes() {
+    checkAtBottomType<Null>();
+    checkAtBottomType<Never>();
+    checkAtBottomType<Never?>();
+  }
+
+  // Check that the methods above have different types given
+  // a non-top, non-nullable type.
+  static void checkAtNonNullableType<T extends Object>() {
+    var a = SimpleBoundTests<T>();
+    checkTypeNotEquals2(a.f1, a.f2);
+    checkTypeNotEquals2(a.g1, a.g2);
+    checkTypeNotEquals2(a.h1, a.h2);
+  }
+
+  // Check that the methods above have different types for
+  // several non-top non-nullable types.
+  static void checkNonNullableTypes() {
+    checkAtNonNullableType<int>();
+    checkAtNonNullableType<String>();
+    checkAtNonNullableType<Iterable<int>>();
+    checkAtNonNullableType<Future<Object>>();
+  }
+
+  // Check that the methods above are equal or not given
+  // a non-top nullable type.
+  static void checkAtNullableType<T>() {
+    var a = SimpleBoundTests<T>();
+    checkTypeNotEquals2(a.f1, a.f2);
+    checkTypeNotEquals2(a.g1, a.g2);
+    checkTypeEquals2(a.h1, a.h2);
+  }
+
+  // Check that the methods above are equal or not for
+  // several non-top nullable types.
+  static void checkNullableTypes() {
+    checkAtNullableType<int?>();
+    checkAtNullableType<String?>();
+    checkAtNullableType<Iterable<int>?>();
+    checkAtNullableType<Future<Object>?>();
+  }
+
+  static void check() {
+    checkTopTypes();
+    checkBottomTypes();
+    checkNonNullableTypes();
+    checkNullableTypes();
+  }
+}
+
+class NeverTests<T> {
+  T f1<S extends T>(T x) => throw "Unused";
+  S f2<S extends T>(Object? x) => throw "Unused";
+  Never f3<S extends T>(Object? x) => throw "Unused";
+
+  R g1<S extends T, R extends S>(List<S> x) => throw "Unused";
+  Never g2<S extends T, R extends S>(List<Never> x) => throw "Unused";
+
+  FutureOr<R> h1<S extends T, R extends S>(S? x) => throw "Unused";
+  Future<Never> h2<S extends T, R extends S>(Null x) => throw "Unused";
+
+  //  void Function<S0 extends FutureOr<R>, S1 extends R, S2 extends R?>()
+  // TODO(41952) restore the proper type above when nullable bounds work
+  // correctly in the CFE.
+  Function i1<R>() =>
+      <T0 extends FutureOr<R>, T1 extends R, T2 extends R?>() {};
+
+  void Function<S0 extends Future<Never>, S1 extends Never, S2 extends Null>()
+      i2<R>() =>
+          <R0 extends Future<Never>, R1 extends Never, R2 extends Null>() {};
+}
+
+void neverBoundTests() {
+  {
+    var o = NeverTests<Never>();
+    checkTypeEquals3(o.f1, o.f2, o.f3);
+    checkTypeEquals2(o.g1, o.g2);
+    checkTypeEquals2(o.h1, o.h2);
+    checkTypeEquals2(o.i1<Never>(), o.i2<Never>());
+    checkTypeNotEquals2(o.i1<Null>(), o.i2<Null>());
+  }
+  {
+    var o = NeverTests<Null>();
+    checkTypeNotEquals3(o.f1, o.f2, o.f3);
+    checkTypeNotEquals2(o.g1, o.g2);
+    checkTypeNotEquals2(o.h1, o.h2);
+    checkTypeNotEquals2(o.i1<Never>(), o.i2<Never>());
+    checkTypeNotEquals2(o.i1<Null>(), o.i2<Null>());
+  }
+}
+
+void fBoundedTests() {
+  void f1<T extends FutureOr<T>>() {}
+  void f2<S extends FutureOr<S>>() {}
+
+  checkTypeEquals2(f1, f2);
+
+  void g1<T extends List<S>, S extends T>() {}
+  void g2<T0 extends List<S0>, S0 extends T0>() {}
+
+  checkTypeEquals2(g1, g2);
+
+  void h1<T extends FutureOr<T?>?>() {}
+  void h2<S extends FutureOr<S?>>() {}
+
+  checkTypeEquals2(h1, h2);
+}
+
+void main() {
+  SimpleBoundTests.check();
+  neverBoundTests();
+  fBoundedTests();
+}
diff --git a/tests/language/nnbd/normalization/type_builder.dart b/tests/language/nnbd/normalization/type_builder.dart
new file mode 100644
index 0000000..c858dc5
--- /dev/null
+++ b/tests/language/nnbd/normalization/type_builder.dart
@@ -0,0 +1,170 @@
+// Copyright (c) 2020, 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 'dart:async';
+import 'package:expect/expect.dart';
+
+// This defines a set of higher order combinators for building objects
+// of type Type at runtime.  A key constraint behind this design is that
+// the structure of the Type objects is constructed at runtime by
+// applying type constructors (e.g. `FutureOr`) to types provided via
+// instantiation of generic methods.  This ensures that normalization
+// is performed at runtime (or during optimization in the compiler) rather
+// than as a simple static rewrite in the front end.
+
+// A TypeBuilder is a parametric type builder that allows composing together
+// different builders at runtime.  The intuition is that a
+// TypeBuilder represents a latent computation of a type `T`.
+// TypeBuilders can be composed together to produce computations
+// which compute more complex types.  For example, we define below
+// `FutureOr` combinator which given a TypeBuilder for a type `T`
+// produces a TypeBuilder for the type `FutureOr<T>`.
+// The type represented by a TypeBuilder can be reified into a runtime
+// type object by calling the TypeBuilder with a generic function which
+// uses its type parameter to produce a runtime type object as desired.
+// So for example, calling the TypeBuilder representing the type `int`
+// with `<T>() => T` produces the runtime Type representation of `int`.
+typedef TypeBuilder = Type Function(Type Function<T>());
+
+// Given a type `T`, produce a TypeBuilder which builds `T`
+TypeBuilder $Primitive<T>() => (build) => build<T>();
+
+// Given a TypeBuilder for a type `T`, return a TypeBuilder for `FutureOr<T>`
+TypeBuilder $FutureOr(TypeBuilder of) =>
+    (build) => of(<T>() => build<FutureOr<T>>());
+
+// Given a TypeBuilder for a type `T`, return a TypeBuilder for `T?`
+TypeBuilder $OrNull(TypeBuilder of) => (build) => of(<T>() => build<T?>());
+
+// Given a TypeBuilder for a type `T`, return a TypeBuilder for `List<T>`
+TypeBuilder $List(TypeBuilder of) => (build) => of(<T>() => build<List<T>>());
+
+// Given a TypeBuilder for a type `T`, return a TypeBuilder for `Future<T>`
+TypeBuilder $Future(TypeBuilder of) =>
+    (build) => of(<T>() => build<Future<T>>());
+
+// Given a TypeBuilder for a type `From` and a TypeBuilder for a type `To`,
+// return a TypeBuilder for `To Function(From)`
+TypeBuilder $Function1(TypeBuilder from, TypeBuilder to) =>
+    (build) => from(<From>() => to(<To>() => build<To Function(From)>()));
+
+// Given a TypeBuilder for a type `From` and a TypeBuilder for a type `To`,
+// return a TypeBuilder for `To Function({From a})`
+TypeBuilder $FunctionOptionalNamedA(TypeBuilder from, TypeBuilder to) =>
+    (build) => from(<From>() => to(<To>() => build<To Function({From a})>()));
+
+// Given a TypeBuilder for a type `From` and a TypeBuilder for a type `To`,
+// return a TypeBuilder for `To Function({From b})`
+TypeBuilder $FunctionOptionalNamedB(TypeBuilder from, TypeBuilder to) =>
+    (build) => from(<From>() => to(<To>() => build<To Function({From b})>()));
+
+// Given a TypeBuilder for a type `From` and a TypeBuilder for a type `To`,
+// return a TypeBuilder for `To Function({required From a})`
+TypeBuilder $FunctionRequiredNamedA(TypeBuilder from, TypeBuilder to) =>
+    (build) =>
+        from(<From>() => to(<To>() => build<To Function({required From a})>()));
+
+// Define some primitive TypeBuilder objects
+TypeBuilder $int = $Primitive<int>();
+TypeBuilder $Object = $Primitive<Object>();
+TypeBuilder $ObjectQ = $OrNull($Object);
+TypeBuilder $dynamic = $Primitive<dynamic>();
+TypeBuilder $void = $Primitive<void>();
+TypeBuilder $Never = $Primitive<Never>();
+TypeBuilder $Null = $Primitive<Null>();
+
+// A helper class for testing equality of objects produced
+// by the .runtimeType method.
+class Rep<T> {}
+
+TypeBuilder $Rep(TypeBuilder of) => (build) => of(<R>() => build<Rep<R>>());
+
+// A helper class for testing equality of objects produced
+// by implicit calls to noSuchMethod.
+class NSM {
+  Type noSuchMethod(i) => i.typeArguments.first;
+}
+
+// Given a TypeBuilder for `T`, reify `T` directly to a Type object
+Type typeObjectOf(TypeBuilder build) => build(<T>() => T);
+
+// Given a TypeBuilder for a type `T`, create an instance o of `Rep<T>`
+// and return the result of calling o.runtimeType
+Type runtimeTypeOfRepOf(TypeBuilder build) =>
+    build(<T>() => Rep<T>().runtimeType);
+
+// Given a TypeBuilder for a type `T`, cause an invocation NSM.noSuchMethod
+// `T` as a runtime type object in the `typeArguments` list of the Invocation
+// object passed to the handler, and return that runtime type object as the
+// result.
+Type noSuchMethodTypeOf(TypeBuilder build) =>
+    build(<T>() => (NSM() as dynamic).method<T>());
+
+// Check that two objects are equal to themselves
+void checkReflexivity2(Object? a, Object? b) {
+  Expect.equals(a, a);
+  Expect.equals(b, b);
+}
+
+// Check that two objects are equal
+// compared in any order.
+void checkEquals2(Object? a, Object? b) {
+  checkReflexivity2(a, b);
+  Expect.equals(a, b);
+  Expect.equals(b, a);
+}
+
+// Given a list of objects, check that each is
+// equal to every element of the list.
+void checkAllEquals(List<Object?> elements) {
+  var count = elements.length;
+  for (var element1 in elements) {
+    for (var element2 in elements) {
+      Expect.equals(element1, element2);
+      Expect.equals(element2, element1);
+    }
+  }
+}
+
+// Check that two objects are unequal
+// compared in any order.
+void checkNotEquals2(Object? a, Object? b) {
+  checkReflexivity2(a, b);
+  Expect.notEquals(a, b);
+  Expect.notEquals(b, a);
+}
+
+// Given two TypeBuilder objects, check that reifying the type
+// represented by the two builders produces equal types, whether
+// that reification happens via a direct reification; via reification
+// as a generic type on a class; or via reification as a type argument to
+// a noSuchMethod handler invocation.
+void checkTypeEqualities(TypeBuilder a, TypeBuilder b) {
+  checkAllEquals([
+    typeObjectOf(a),
+    typeObjectOf(b),
+    noSuchMethodTypeOf(a),
+    noSuchMethodTypeOf(b)
+  ]);
+
+  checkAllEquals([
+    typeObjectOf($Rep(a)),
+    typeObjectOf($Rep(b)),
+    noSuchMethodTypeOf($Rep(a)),
+    noSuchMethodTypeOf($Rep(b)),
+    runtimeTypeOfRepOf(a),
+    runtimeTypeOfRepOf(b)
+  ]);
+}
+
+// Given two TypeBuilder objects, check that reifying the type
+// represented by the two builders produces unequal types, whether
+// that reification happens via a direct reification; via reification
+// as a generic type on a class; or via reification as a type argument to
+// a noSuchMethod handler invocation.
+void checkTypeInequalities(TypeBuilder a, TypeBuilder b) {
+  checkNotEquals2(typeObjectOf(a), typeObjectOf(b));
+  checkNotEquals2(runtimeTypeOfRepOf(a), runtimeTypeOfRepOf(b));
+  checkNotEquals2(noSuchMethodTypeOf(a), noSuchMethodTypeOf(b));
+}
diff --git a/tests/language/nnbd/normalization/type_object_normalization_test.dart b/tests/language/nnbd/normalization/type_object_normalization_test.dart
new file mode 100644
index 0000000..9d3ebbe8
--- /dev/null
+++ b/tests/language/nnbd/normalization/type_object_normalization_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2020, 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 'dart:async';
+import 'type_builder.dart';
+
+// Tests for runtime type object normalization.
+
+// Tests of non-generic function types.
+void simpleTypeTests() {
+  // Different top types are not runtime equal
+  checkTypeInequalities($ObjectQ, $dynamic);
+  checkTypeInequalities($ObjectQ, $void);
+  checkTypeInequalities($dynamic, $void);
+
+  // FutureOr^n of top type is that top type
+  checkTypeEqualities($FutureOr($FutureOr($ObjectQ)), $ObjectQ);
+  checkTypeEqualities($FutureOr($FutureOr($dynamic)), $dynamic);
+  checkTypeEqualities($FutureOr($FutureOr($void)), $void);
+
+  // FutureOr^n of top type is not a different top type
+  checkTypeInequalities($FutureOr($FutureOr($ObjectQ)), $dynamic);
+  checkTypeInequalities($FutureOr($FutureOr($ObjectQ)), $void);
+  checkTypeInequalities($FutureOr($FutureOr($dynamic)), $void);
+
+  // FutureOr of Object is Object
+  checkTypeEqualities($FutureOr($Object), $Object);
+  checkTypeEqualities($FutureOr($FutureOr($Object)), $Object);
+
+  // FutureOr of Object is not a top type
+  checkTypeInequalities($FutureOr($Object), $ObjectQ);
+  checkTypeInequalities($FutureOr($FutureOr($Object)), $dynamic);
+  checkTypeInequalities($FutureOr($FutureOr($FutureOr($Object))), $void);
+
+  // FutureOr of Never is Future<Never>
+  checkTypeEqualities($FutureOr($Never), $Future($Never));
+
+  // FutureOr of Null is Future<Null>?
+  checkTypeEqualities($FutureOr($Null), $OrNull($Future($Null)));
+
+  // FutureOr of Null is not Future<Null>
+  checkTypeInequalities($FutureOr($Null), $Future($Null));
+
+  // Top type or Null is that top type
+  checkTypeEqualities($OrNull($ObjectQ), $ObjectQ);
+  checkTypeEqualities($OrNull($dynamic), $dynamic);
+  checkTypeEqualities($OrNull($void), $void);
+  checkTypeEqualities($OrNull($FutureOr($ObjectQ)), $ObjectQ);
+
+  // Never is not Null
+  checkTypeInequalities($Never, $Null);
+
+  // Never? is Null
+  checkTypeEqualities($OrNull($Never), $Null);
+
+  // Null? is Null
+  checkTypeEqualities($OrNull($Null), $Null);
+
+  // FutureOr<T>? is FutureOr<T> if T is nullable
+  checkTypeEqualities(
+      $OrNull($FutureOr($OrNull($int))), $FutureOr($OrNull($int)));
+
+  // FutureOr<T>? is not FutureOr<T> if T is not nullable
+  checkTypeInequalities($OrNull($FutureOr($int)), $FutureOr($int));
+
+  // FutureOr<T>? is not FutureOr<T?> if T is not nullable
+  checkTypeInequalities($OrNull($FutureOr($int)), $FutureOr($OrNull($int)));
+
+  // T?? is T?
+  checkTypeEqualities($OrNull($OrNull($OrNull($int))), $OrNull($int));
+
+  // Top?? is Top
+  checkTypeEqualities($OrNull($OrNull($dynamic)), $dynamic);
+
+  // List<T> is List<R> if T is R
+  checkTypeEqualities($List($FutureOr($Never)), $List($Future($Never)));
+  checkTypeEqualities($List($OrNull($Never)), $List($Null));
+  checkTypeEqualities($List($FutureOr($Object)), $List($Object));
+
+  // B Function(A) is D Function(C) if A is C and B is D
+  checkTypeEqualities(
+      $Function1(
+          $OrNull($FutureOr($OrNull($Null))), $FutureOr($FutureOr($Object))),
+      $Function1($OrNull($Future($Null)), $Object));
+
+  // B Function({A a}) is D Function({C a}) if A is C and B is D
+  checkTypeEqualities(
+      $FunctionOptionalNamedA(
+          $OrNull($FutureOr($OrNull($Null))), $FutureOr($FutureOr($Object))),
+      $FunctionOptionalNamedA($OrNull($Future($Null)), $Object));
+
+  // B Function({A a}) is not D Function({C b}) even if A is C and B is D
+  checkTypeInequalities(
+      $FunctionOptionalNamedA(
+          $OrNull($FutureOr($OrNull($Null))), $FutureOr($FutureOr($Object))),
+      $FunctionOptionalNamedB($OrNull($Future($Null)), $Object));
+
+  // B Function({required A a}) is D Function({required C a}) if A is C and B is D
+  checkTypeEqualities(
+      $FunctionRequiredNamedA(
+          $OrNull($FutureOr($OrNull($Null))), $FutureOr($FutureOr($Object))),
+      $FunctionRequiredNamedA($OrNull($Future($Null)), $Object));
+
+  // B Function({required A a}) is not D Function({C a}) even if A is C and B is D
+  checkTypeInequalities(
+      $FunctionRequiredNamedA(
+          $OrNull($FutureOr($OrNull($Null))), $FutureOr($FutureOr($Object))),
+      $FunctionOptionalNamedA($OrNull($Future($Null)), $Object));
+}
+
+void main() {
+  simpleTypeTests();
+}
diff --git a/tests/language/nnbd/normalization/type_object_normalization_weak_test.dart b/tests/language/nnbd/normalization/type_object_normalization_weak_test.dart
new file mode 100644
index 0000000..ddd9b60
--- /dev/null
+++ b/tests/language/nnbd/normalization/type_object_normalization_weak_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2020, 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.7
+
+// Requirements=nnbd-weak
+
+import 'dart:async';
+import 'type_builder.dart';
+
+// Tests for runtime type object normalization with legacy types
+
+// TypeBuilder for legacy `*` types.  Note that the type parameter `S` may
+// be a non-legacy type, but by passing it on as an argument to `build` here
+// in a legacy library, a legacy `*` marker is added.
+TypeBuilder $Star(TypeBuilder of) => (build) => of(<S>() => build<S>());
+
+// These tests check that normalization handles `*` types correctly
+void legacyTypeNormalizationTests() {
+  // FutureOr<Object*> is Object*
+  checkTypeEqualities($FutureOr($Star($Object)), $Star($Object));
+
+  // Never*? is Null
+  checkTypeEqualities($OrNull($Star($Never)), $Null);
+
+  // FutureOr<R>* is FutureOr<R> if R is nullable
+  checkTypeEqualities(
+      $Star($FutureOr($OrNull($int))), $FutureOr($OrNull($int)));
+
+  // R*? is R?
+  checkTypeEqualities($OrNull($Star($int)), $OrNull($int));
+
+  // Top* is Top
+  checkTypeEqualities($Star($ObjectQ), $ObjectQ);
+  checkTypeEqualities($Star($dynamic), $dynamic);
+  checkTypeEqualities($Star($void), $void);
+
+  // Null* is Null
+  checkTypeEqualities($Star($Null), $Null);
+
+  // R?* is R?
+  checkTypeEqualities($Star($OrNull($int)), $OrNull($int));
+
+  // R*** is R*
+  checkTypeEqualities($Star($Star($Star($int))), $Star($int));
+}
+
+// These tests check that equality ignores `*` types in weak mode, but
+// does not equate Null and Never and does not ignore required.
+void weakModeTests() {
+  // Object* is Object
+  checkTypeEqualities($Star($Object), $Object);
+
+  // int* is int
+  checkTypeEqualities($Star($int), $int);
+
+  // Null* is Null
+  checkTypeEqualities($Star($Null), $Null);
+
+  // Never* is Never
+  checkTypeEqualities($Star($Never), $Never);
+
+  // List<T> is List<S> if T is S
+  checkTypeEqualities($List($Star($Object)), $List($Object));
+
+  // List<T> is List<S> if T is S
+  checkTypeEqualities($List($FutureOr($Star($Object))), $List($Object));
+
+  // Never is not Null, even in weak mode
+  checkTypeInequalities($Never, $Null);
+
+  // Never* is not Null, even in weak mode
+  checkTypeInequalities($Star($Never), $Null);
+
+  // Object* is not Object?, even in weak mode
+  checkTypeInequalities($Star($Object), $ObjectQ);
+
+  // B Function(A) is D Function(C) if A is C and B is D
+  checkTypeEqualities($Function1($Star($Object), $OrNull($Star($int))),
+      $Function1($Object, $OrNull($int)));
+
+  // B Function({A a}) is D Function({C a}) if A is C and B is D
+  checkTypeEqualities(
+      $FunctionOptionalNamedA($Star($Object), $OrNull($Star($int))),
+      $FunctionOptionalNamedA($Object, $OrNull($int)));
+
+  // B Function({required A a}) is D Function({required C a}) if A is C and B is D
+  checkTypeEqualities(
+      $FunctionRequiredNamedA($Star($Object), $OrNull($Star($int))),
+      $FunctionRequiredNamedA($Object, $OrNull($int)));
+
+  // B Function({required A a}) is not D Function({C a}) even if A is C and B is D
+  checkTypeInequalities($FunctionRequiredNamedA($Object, $OrNull($int)),
+      $FunctionOptionalNamedA($Object, $OrNull($int)));
+}
+
+void main() {
+  legacyTypeNormalizationTests();
+  weakModeTests();
+}
diff --git a/tests/language/nnbd/static_errors/export_legacy_symbol_test.dart b/tests/language/nnbd/static_errors/export_legacy_symbol_test.dart
index c28b2ed..25ea45c 100644
--- a/tests/language/nnbd/static_errors/export_legacy_symbol_test.dart
+++ b/tests/language/nnbd/static_errors/export_legacy_symbol_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
 // SharedOptions=--enable-experiment=non-nullable
 
 import 'export_legacy_symbol_opted_out_library.dart';
diff --git a/tests/language/nnbd/subtyping/function_type_bounds_test.dart b/tests/language/nnbd/subtyping/function_type_bounds_test.dart
index fca16f8..1a0c6a4 100644
--- a/tests/language/nnbd/subtyping/function_type_bounds_test.dart
+++ b/tests/language/nnbd/subtyping/function_type_bounds_test.dart
@@ -2,7 +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.
 
-// Requirements=nnbd
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/nnbd/subtyping/mixed_bottom_type_strong_test.dart b/tests/language/nnbd/subtyping/mixed_bottom_type_strong_test.dart
deleted file mode 100644
index 5044d65..0000000
--- a/tests/language/nnbd/subtyping/mixed_bottom_type_strong_test.dart
+++ /dev/null
@@ -1,16 +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.6
-
-// Requirements=nnbd-strong
-
-import 'package:expect/expect.dart';
-import 'mixed_bottom_type_lib.dart';
-
-main() {
-  // The subtype check `void Function(String) <: void Function(Null)` should be
-  // false in strong mode semantics since `Null </: String`.
-  Expect.isFalse(stringFunction is void Function(Null));
-}
diff --git a/tests/language/nnbd/subtyping/non_nullable_instantiation_with_nullable_test.dart b/tests/language/nnbd/subtyping/non_nullable_instantiation_with_nullable_test.dart
index 7dc4d3f..07845ba 100644
--- a/tests/language/nnbd/subtyping/non_nullable_instantiation_with_nullable_test.dart
+++ b/tests/language/nnbd/subtyping/non_nullable_instantiation_with_nullable_test.dart
@@ -4,7 +4,8 @@
 
 // @dart = 2.6
 
-// Requirements=nnbd
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language/nnbd/subtyping/recursive_legacy_type_bounds_test.dart b/tests/language/nnbd/subtyping/recursive_legacy_type_bounds_test.dart
index 6cf9b28..d735c81 100644
--- a/tests/language/nnbd/subtyping/recursive_legacy_type_bounds_test.dart
+++ b/tests/language/nnbd/subtyping/recursive_legacy_type_bounds_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
 import 'package:expect/expect.dart';
 
 import 'recursive_legacy_type_bounds_lib.dart';
diff --git a/tests/language/nnbd/type_equality/function_type_equality_nnbd_lib.dart b/tests/language/nnbd/type_equality/function_type_equality_nnbd_lib.dart
new file mode 100644
index 0000000..f0b0410
--- /dev/null
+++ b/tests/language/nnbd/type_equality/function_type_equality_nnbd_lib.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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';
+
+void fn() => null;
+void fn2() => null;
+int voidToInt() => 42;
+int voidToInt2() => 42;
+int? voidToNullableInt() => 42;
+int? voidToNullableInt2() => 42;
+void positionalIntToVoid(int i) => null;
+void positionalNullableIntToVoid(int? i) => null;
+void positionalNullableIntToVoid2(int? i) => null;
+void optionalIntToVoid([int i = 0]) => null;
+void optionalIntToVoid2([int i = 0]) => null;
+void optionalNullableIntToVoid([int? i]) => null;
+void optionalNullableIntToVoid2([int? i]) => null;
+void namedIntToVoid({int i = 0}) => null;
+void namedIntToVoid2({int i = 0}) => null;
+void namedNullableIntToVoid({int? i}) => null;
+void namedNullableIntToVoid2({int? i}) => null;
+void requiredIntToVoid({required int i}) => null;
+void requiredIntToVoid2({required int i}) => null;
+void requiredNullableIntToVoid({required int? i}) => null;
+void requiredNullableIntToVoid2({required int? i}) => null;
+void gn(bool b, [int i = 0]) => null;
+void hn(bool b, {int i = 0}) => null;
diff --git a/tests/language/nnbd/type_equality/function_type_equality_test.dart b/tests/language/nnbd/type_equality/function_type_equality_test.dart
index 10fffac..16357eb 100644
--- a/tests/language/nnbd/type_equality/function_type_equality_test.dart
+++ b/tests/language/nnbd/type_equality/function_type_equality_test.dart
@@ -4,31 +4,7 @@
 
 import 'package:expect/expect.dart';
 
-import 'function_type_equality_legacy_lib.dart' as legacy;
-
-void fn() => null;
-void fn2() => null;
-int voidToInt() => 42;
-int voidToInt2() => 42;
-int? voidToNullableInt() => 42;
-int? voidToNullableInt2() => 42;
-void positionalIntToVoid(int i) => null;
-void positionalNullableIntToVoid(int? i) => null;
-void positionalNullableIntToVoid2(int? i) => null;
-void optionalIntToVoid([int i = 0]) => null;
-void optionalIntToVoid2([int i = 0]) => null;
-void optionalNullableIntToVoid([int? i]) => null;
-void optionalNullableIntToVoid2([int? i]) => null;
-void namedIntToVoid({int i = 0}) => null;
-void namedIntToVoid2({int i = 0}) => null;
-void namedNullableIntToVoid({int? i}) => null;
-void namedNullableIntToVoid2({int? i}) => null;
-void requiredIntToVoid({required int i}) => null;
-void requiredIntToVoid2({required int i}) => null;
-void requiredNullableIntToVoid({required int? i}) => null;
-void requiredNullableIntToVoid2({required int? i}) => null;
-void gn(bool b, [int i = 0]) => null;
-void hn(bool b, {int i = 0}) => null;
+import 'function_type_equality_nnbd_lib.dart';
 
 main() {
   // Same functions with different names.
@@ -47,28 +23,6 @@
   Expect.equals(requiredNullableIntToVoid.runtimeType,
       requiredNullableIntToVoid2.runtimeType);
 
-  // Same signatures but one is from a legacy library.
-  Expect.equals(fn.runtimeType, legacy.fn.runtimeType);
-  Expect.equals(voidToInt.runtimeType, legacy.voidToInt.runtimeType);
-  Expect.equals(
-      positionalIntToVoid.runtimeType, legacy.positionalIntToVoid.runtimeType);
-  Expect.equals(
-      optionalIntToVoid.runtimeType, legacy.optionalIntToVoid.runtimeType);
-  Expect.equals(namedIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
-  Expect.equals(gn.runtimeType, legacy.gn.runtimeType);
-  Expect.equals(hn.runtimeType, legacy.hn.runtimeType);
-
-  // Nullable types are not equal to legacy types.
-  Expect.notEquals(positionalNullableIntToVoid.runtimeType,
-      legacy.positionalIntToVoid.runtimeType);
-  Expect.notEquals(optionalNullableIntToVoid.runtimeType,
-      legacy.optionalIntToVoid.runtimeType);
-  Expect.notEquals(
-      namedNullableIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
-  Expect.notEquals(voidToNullableInt.runtimeType, legacy.voidToInt.runtimeType);
-
   // Required named arguments are not equal to named arguments.
   Expect.notEquals(requiredIntToVoid.runtimeType, namedIntToVoid.runtimeType);
-  Expect.notEquals(
-      requiredIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
 }
diff --git a/tests/language/nnbd/type_equality/function_type_equality_weak_test.dart b/tests/language/nnbd/type_equality/function_type_equality_weak_test.dart
new file mode 100644
index 0000000..b750f1b
--- /dev/null
+++ b/tests/language/nnbd/type_equality/function_type_equality_weak_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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.
+
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
+import 'package:expect/expect.dart';
+
+import 'function_type_equality_nnbd_lib.dart';
+import 'function_type_equality_legacy_lib.dart' as legacy;
+
+main() {
+  // Same signatures but one is from a legacy library.
+  Expect.equals(fn.runtimeType, legacy.fn.runtimeType);
+  Expect.equals(voidToInt.runtimeType, legacy.voidToInt.runtimeType);
+  Expect.equals(
+      positionalIntToVoid.runtimeType, legacy.positionalIntToVoid.runtimeType);
+  Expect.equals(
+      optionalIntToVoid.runtimeType, legacy.optionalIntToVoid.runtimeType);
+  Expect.equals(namedIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
+  Expect.equals(gn.runtimeType, legacy.gn.runtimeType);
+  Expect.equals(hn.runtimeType, legacy.hn.runtimeType);
+
+  // Nullable types are not equal to legacy types.
+  Expect.notEquals(positionalNullableIntToVoid.runtimeType,
+      legacy.positionalIntToVoid.runtimeType);
+  Expect.notEquals(optionalNullableIntToVoid.runtimeType,
+      legacy.optionalIntToVoid.runtimeType);
+  Expect.notEquals(
+      namedNullableIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
+  Expect.notEquals(voidToNullableInt.runtimeType, legacy.voidToInt.runtimeType);
+
+  // Required named arguments are not equal to named arguments.
+  Expect.notEquals(
+      requiredIntToVoid.runtimeType, legacy.namedIntToVoid.runtimeType);
+}
diff --git a/tests/language/nnbd/type_equality/futureOr_normalization_legacy_test.dart b/tests/language/nnbd/type_equality/futureOr_normalization_legacy_test.dart
index e159821..caf9611 100644
--- a/tests/language/nnbd/type_equality/futureOr_normalization_legacy_test.dart
+++ b/tests/language/nnbd/type_equality/futureOr_normalization_legacy_test.dart
@@ -5,6 +5,9 @@
 // Opt out of Null Safety:
 // @dart = 2.6
 
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
 import 'dart:async';
 
 import 'package:expect/expect.dart';
diff --git a/tests/language/nnbd/type_equality/futureOr_normalization_test.dart b/tests/language/nnbd/type_equality/futureOr_normalization_test.dart
index 5592e73..0c0e3a0 100644
--- a/tests/language/nnbd/type_equality/futureOr_normalization_test.dart
+++ b/tests/language/nnbd/type_equality/futureOr_normalization_test.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:async';
 
+// Requirements=nnbd
+
 import 'package:expect/expect.dart';
 
 import 'futureOr_normalization_null_safe_lib.dart';
-import 'futureOr_normalization_legacy_lib.dart' as legacy;
 
 class A {}
 
@@ -42,7 +43,4 @@
       extractType<Embed<FutureOr<int?>>>(), embedNullableFutureOrType<int?>());
   Expect.equals(
       extractType<Embed<FutureOr<A?>>>(), embedNullableFutureOrType<A?>());
-
-  // Object* == FutureOr<Object*>
-  Expect.equals(legacy.object, legacy.nonNullableFutureOrOfLegacyObject());
 }
diff --git a/tests/language/nnbd/type_equality/futureOr_normalization_weak_test.dart b/tests/language/nnbd/type_equality/futureOr_normalization_weak_test.dart
new file mode 100644
index 0000000..f94ec37
--- /dev/null
+++ b/tests/language/nnbd/type_equality/futureOr_normalization_weak_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, 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 'dart:async';
+
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
+import 'package:expect/expect.dart';
+
+import 'futureOr_normalization_legacy_lib.dart' as legacy;
+import 'futureOr_normalization_null_safe_lib.dart';
+
+main() {
+  // Object* == FutureOr<Object*>
+  Expect.equals(legacy.object, legacy.nonNullableFutureOrOfLegacyObject());
+}
diff --git a/tests/language/nnbd/type_equality/generic_function_type_equality_null_safe_lib.dart b/tests/language/nnbd/type_equality/generic_function_type_equality_null_safe_lib.dart
index bda1426..16abcb9 100644
--- a/tests/language/nnbd/type_equality/generic_function_type_equality_null_safe_lib.dart
+++ b/tests/language/nnbd/type_equality/generic_function_type_equality_null_safe_lib.dart
@@ -5,3 +5,33 @@
 class B {}
 
 class C extends B {}
+
+void fn<T>() => null;
+void fn2<R>() => null;
+T voidToT<T>() => null as T;
+S voidToS<S>() => null as S;
+void positionalTToVoid<T>(T i) => null;
+void positionalSToVoid<S>(S i) => null;
+void positionalNullableTToVoid<T>(T? i) => null;
+void positionalNullableSToVoid<S>(S? i) => null;
+void optionalTToVoid<T>([List<T> i = const <Never>[]]) => null;
+void optionalSToVoid<S>([List<S> i = const <Never>[]]) => null;
+void optionalNullableTToVoid<T>([T? i]) => null;
+void optionalNullableSToVoid<S>([S? i]) => null;
+void namedTToVoid<T>({List<T> i = const <Never>[]}) => null;
+void namedSToVoid<S>({List<S> i = const <Never>[]}) => null;
+void namedNullableTToVoid<T>({T? i}) => null;
+void namedNullableSToVoid<S>({S? i}) => null;
+void requiredTToVoid<T>({required T i}) => null;
+void requiredSToVoid<S>({required S i}) => null;
+void requiredNullableTToVoid<T>({required T? i}) => null;
+void requiredNullableSToVoid<S>({required S? i}) => null;
+
+void positionalTToVoidWithBound<T extends B>(T i) => null;
+void optionalTToVoidWithBound<T extends B>([List<T> i = const <Never>[]]) =>
+    null;
+void namedTToVoidWithBound<T extends B>({List<T> i = const <Never>[]}) => null;
+
+class A<T extends B> {
+  void fn(T i) => null;
+}
diff --git a/tests/language/nnbd/type_equality/generic_function_type_equality_test.dart b/tests/language/nnbd/type_equality/generic_function_type_equality_test.dart
index bd18b9a..22da2f8 100644
--- a/tests/language/nnbd/type_equality/generic_function_type_equality_test.dart
+++ b/tests/language/nnbd/type_equality/generic_function_type_equality_test.dart
@@ -2,40 +2,11 @@
 // 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.
 
+// Requirements=nnbd
+
 import 'package:expect/expect.dart';
-import 'generic_function_type_equality_legacy_lib.dart' as legacy;
 import 'generic_function_type_equality_null_safe_lib.dart';
 
-void fn<T>() => null;
-void fn2<R>() => null;
-T voidToT<T>() => null as T;
-S voidToS<S>() => null as S;
-void positionalTToVoid<T>(T i) => null;
-void positionalSToVoid<S>(S i) => null;
-void positionalNullableTToVoid<T>(T? i) => null;
-void positionalNullableSToVoid<S>(S? i) => null;
-void optionalTToVoid<T>([List<T> i = const <Never>[]]) => null;
-void optionalSToVoid<S>([List<S> i = const <Never>[]]) => null;
-void optionalNullableTToVoid<T>([T? i]) => null;
-void optionalNullableSToVoid<S>([S? i]) => null;
-void namedTToVoid<T>({List<T> i = const <Never>[]}) => null;
-void namedSToVoid<S>({List<S> i = const <Never>[]}) => null;
-void namedNullableTToVoid<T>({T? i}) => null;
-void namedNullableSToVoid<S>({S? i}) => null;
-void requiredTToVoid<T>({required T i}) => null;
-void requiredSToVoid<S>({required S i}) => null;
-void requiredNullableTToVoid<T>({required T? i}) => null;
-void requiredNullableSToVoid<S>({required S? i}) => null;
-
-void positionalTToVoidWithBound<T extends B>(T i) => null;
-void optionalTToVoidWithBound<T extends B>([List<T> i = const <Never>[]]) =>
-    null;
-void namedTToVoidWithBound<T extends B>({List<T> i = const <Never>[]}) => null;
-
-class A<T extends B> {
-  void fn(T i) => null;
-}
-
 main() {
   // Same functions with different names.
   Expect.equals(fn.runtimeType, fn2.runtimeType);
@@ -53,33 +24,8 @@
   Expect.equals(
       requiredNullableTToVoid.runtimeType, requiredNullableSToVoid.runtimeType);
 
-  // Default type bounds are not equal. T extends Object? vs T extends Object*
-  Expect.notEquals(fn.runtimeType, legacy.fn.runtimeType);
-  Expect.notEquals(voidToT.runtimeType, legacy.voidToR.runtimeType);
-  Expect.notEquals(
-      positionalTToVoid.runtimeType, legacy.positionalRToVoid.runtimeType);
-  Expect.notEquals(
-      optionalTToVoid.runtimeType, legacy.optionalRToVoid.runtimeType);
-  Expect.notEquals(namedTToVoid.runtimeType, legacy.namedRToVoid.runtimeType);
-
-  // Type arguments in methods tear-offs from null safe libraries become Object?
-  // and Object* from legacy libraries and are not equal.
-  Expect.notEquals(A().fn.runtimeType, legacy.A().fn.runtimeType);
-  Expect.notEquals(A().fn.runtimeType, legacy.rawAFnTearoff.runtimeType);
-  Expect.notEquals(A<C>().fn.runtimeType, legacy.A<C>().fn.runtimeType);
-
-  // Same signatures but one is from a legacy library.
-  Expect.equals(positionalTToVoidWithBound.runtimeType,
-      legacy.positionalTToVoidWithBound.runtimeType);
-  Expect.equals(optionalTToVoidWithBound.runtimeType,
-      legacy.optionalTToVoidWithBound.runtimeType);
-  Expect.equals(namedTToVoidWithBound.runtimeType,
-      legacy.namedTToVoidWithBound.runtimeType);
-
   // Required named arguments are not equal to named arguments.
   Expect.notEquals(namedTToVoid.runtimeType, requiredTToVoid.runtimeType);
   Expect.notEquals(
       namedNullableTToVoid.runtimeType, requiredNullableTToVoid.runtimeType);
-  Expect.notEquals(
-      requiredTToVoid.runtimeType, legacy.namedRToVoid.runtimeType);
 }
diff --git a/tests/language/nnbd/type_equality/generic_function_type_equality_weak_test.dart b/tests/language/nnbd/type_equality/generic_function_type_equality_weak_test.dart
new file mode 100644
index 0000000..6f9007e
--- /dev/null
+++ b/tests/language/nnbd/type_equality/generic_function_type_equality_weak_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, 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.
+
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
+import 'package:expect/expect.dart';
+import 'generic_function_type_equality_legacy_lib.dart' as legacy;
+import 'generic_function_type_equality_null_safe_lib.dart';
+
+main() {
+  // Default type bounds are not equal. T extends Object? vs T extends Object*
+  Expect.notEquals(fn.runtimeType, legacy.fn.runtimeType);
+  Expect.notEquals(voidToT.runtimeType, legacy.voidToR.runtimeType);
+  Expect.notEquals(
+      positionalTToVoid.runtimeType, legacy.positionalRToVoid.runtimeType);
+  Expect.notEquals(
+      optionalTToVoid.runtimeType, legacy.optionalRToVoid.runtimeType);
+  Expect.notEquals(namedTToVoid.runtimeType, legacy.namedRToVoid.runtimeType);
+
+  // Type arguments in methods tear-offs from null safe libraries become Object?
+  // and Object* from legacy libraries and are not equal.
+  Expect.notEquals(A().fn.runtimeType, legacy.A().fn.runtimeType);
+  Expect.notEquals(A().fn.runtimeType, legacy.rawAFnTearoff.runtimeType);
+  Expect.notEquals(A<C>().fn.runtimeType, legacy.A<C>().fn.runtimeType);
+
+  // Same signatures but one is from a legacy library.
+  Expect.equals(positionalTToVoidWithBound.runtimeType,
+      legacy.positionalTToVoidWithBound.runtimeType);
+  Expect.equals(optionalTToVoidWithBound.runtimeType,
+      legacy.optionalTToVoidWithBound.runtimeType);
+  Expect.equals(namedTToVoidWithBound.runtimeType,
+      legacy.namedTToVoidWithBound.runtimeType);
+
+  // Required named arguments are not equal to named arguments.
+  Expect.notEquals(
+      requiredTToVoid.runtimeType, legacy.namedRToVoid.runtimeType);
+}
diff --git a/tests/language/nnbd/type_object/equality_test.dart b/tests/language/nnbd/type_object/equality_test.dart
index fdbf783..e96d8fb 100644
--- a/tests/language/nnbd/type_object/equality_test.dart
+++ b/tests/language/nnbd/type_object/equality_test.dart
@@ -2,9 +2,9 @@
 // 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";
+// Requirements=nnbd
 
-import "legacy_library.dart";
+import "package:expect/expect.dart";
 
 class A {}
 
@@ -33,13 +33,6 @@
 
   Expect.isTrue(type<int?>() == type<int?>());
   Expect.isFalse(type<int?>() == type<int>());
-  Expect.isFalse(type<int?>() == legacyType<int>());
   Expect.isFalse(type<int>() == type<int?>());
   Expect.isTrue(type<int>() == type<int>());
-  Expect.isTrue(type<int>() == legacyType<int>());
-  Expect.isFalse(legacyType<int>() == type<int?>());
-  Expect.isTrue(legacyType<int>() == type<int>());
-  Expect.isTrue(legacyType<int>() == legacyType<int>());
-
-  Expect.isTrue(listType<int>() == legacyListType<int>());
 }
diff --git a/tests/language/nnbd/type_object/equality_weak_test.dart b/tests/language/nnbd/type_object/equality_weak_test.dart
new file mode 100644
index 0000000..dfbb369
--- /dev/null
+++ b/tests/language/nnbd/type_object/equality_weak_test.dart
@@ -0,0 +1,28 @@
+// 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.
+
+// Can't run in strong mode since it contains a legacy library.
+// Requirements=nnbd-weak
+
+import "package:expect/expect.dart";
+
+import "legacy_library.dart";
+
+class A {}
+
+class B {}
+
+Type type<T>() => T;
+
+Type listType<T>() => <T>[].runtimeType;
+
+main() {
+  Expect.isFalse(type<int?>() == legacyType<int>());
+  Expect.isTrue(type<int>() == legacyType<int>());
+  Expect.isFalse(legacyType<int>() == type<int?>());
+  Expect.isTrue(legacyType<int>() == type<int>());
+  Expect.isTrue(legacyType<int>() == legacyType<int>());
+
+  Expect.isTrue(listType<int>() == legacyListType<int>());
+}
diff --git a/tests/language_2/call/constructor_on_unresolvable_class_test.dart b/tests/language_2/call/constructor_on_unresolvable_class_test.dart
index d068b53..f3fa482 100644
--- a/tests/language_2/call/constructor_on_unresolvable_class_test.dart
+++ b/tests/language_2/call/constructor_on_unresolvable_class_test.dart
@@ -11,14 +11,14 @@
 main() {
   new A();
   //  ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'A'.
   new A.foo();
   //  ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'A.foo'.
   new lib.A();
   //  ^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'lib.A'.
 }
diff --git a/tests/language_2/class/variable_shadow_class_test.dart b/tests/language_2/class/variable_shadow_class_test.dart
index d82fef7..35a1fda 100644
--- a/tests/language_2/class/variable_shadow_class_test.dart
+++ b/tests/language_2/class/variable_shadow_class_test.dart
@@ -15,8 +15,9 @@
     var Test;
     // Now this refers to the variable.
     var i = new Test.named(10);
-    //          ^^^^
+    //          ^^^^^^^^^^
     // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
+    //          ^^^^
     // [cfe] Method not found: 'Test.named'.
     Expect.equals(10, i.field);
   }
diff --git a/tests/language_2/constructor/reference_test.dart b/tests/language_2/constructor/reference_test.dart
index 52e1235..cecfbf3 100644
--- a/tests/language_2/constructor/reference_test.dart
+++ b/tests/language_2/constructor/reference_test.dart
@@ -13,7 +13,7 @@
   new Foo.bar();
   new Foo.bar.baz();
   //  ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //          ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   new Foo<int>();
@@ -33,13 +33,13 @@
   new Foo.bar<int>.baz();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //         ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  //  ^^^^^^^
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //               ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   new Foo.bar.baz<int>();
   //  ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //          ^^^
   // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -50,7 +50,7 @@
   const Foo.bar();
   const Foo.bar.baz();
   //    ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //            ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   const Foo<int>();
@@ -70,13 +70,13 @@
   const Foo.bar<int>.baz();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //           ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  //    ^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //                 ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   const Foo.bar.baz<int>();
   //    ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_TYPE
   //            ^^^
   // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -106,8 +106,8 @@
   Foo.bar<int>.baz();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
-  //     ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+//^^^^^^^
+// [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   //           ^
   // [cfe] Method not found: 'Foo.bar.baz'.
   Foo.bar.baz<int>();
diff --git a/tests/language_2/interface/interface2_test.dart b/tests/language_2/interface/interface2_test.dart
index 7b8282c..6a0a762 100644
--- a/tests/language_2/interface/interface2_test.dart
+++ b/tests/language_2/interface/interface2_test.dart
@@ -8,8 +8,6 @@
 //                                      ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
 // [cfe] Type 'BooHoo' not found.
-//                                      ^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
 
 main() {
   Interface2NegativeTest();
diff --git a/tests/language_2/malformed/inheritance_test.dart b/tests/language_2/malformed/inheritance_test.dart
index e82cc7a..55154d7 100644
--- a/tests/language_2/malformed/inheritance_test.dart
+++ b/tests/language_2/malformed/inheritance_test.dart
@@ -12,8 +12,6 @@
     //      ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Type 'Unresolved' not found.
-    //      ^^^^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
     {
 }
 
@@ -32,8 +30,6 @@
     //                  ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
     // [cfe] Type 'Unresolved' not found.
-    //                  ^^^^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
     {
 }
 
@@ -50,8 +46,6 @@
     //         ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Type 'Unresolved' not found.
-    //         ^^^^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
     {
 }
 
diff --git a/tests/language_2/malformed/malformed_test.dart b/tests/language_2/malformed/malformed_test.dart
index 2a11ce8..e2ee13a 100644
--- a/tests/language_2/malformed/malformed_test.dart
+++ b/tests/language_2/malformed/malformed_test.dart
@@ -105,11 +105,11 @@
 
   new undeclared_prefix.Unresolved();
   //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'undeclared_prefix.Unresolved'.
   new undeclared_prefix.Unresolved<int>();
   //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'undeclared_prefix.Unresolved'.
 
   try {
diff --git a/tests/language_2/new/create_unresolved_type_test.dart b/tests/language_2/new/create_unresolved_type_test.dart
index 296859c..b1ce560 100644
--- a/tests/language_2/new/create_unresolved_type_test.dart
+++ b/tests/language_2/new/create_unresolved_type_test.dart
@@ -5,6 +5,6 @@
 main() {
   new F<int>();
   //  ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'F'.
 }
diff --git a/tests/language_2/prefix/transitive_import_prefix_test.dart b/tests/language_2/prefix/transitive_import_prefix_test.dart
index 5146240..9186560 100644
--- a/tests/language_2/prefix/transitive_import_prefix_test.dart
+++ b/tests/language_2/prefix/transitive_import_prefix_test.dart
@@ -7,7 +7,7 @@
   // Library prefixes in the imported libraries should not be visible here.
   new lib11.Library11(1);
   //  ^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'lib11.Library11'.
   lib11.Library11.static_func();
 //^^^^^
diff --git a/tests/language_2/prefix/unresolved_class_test.dart b/tests/language_2/prefix/unresolved_class_test.dart
index 901063c..dd46a62 100644
--- a/tests/language_2/prefix/unresolved_class_test.dart
+++ b/tests/language_2/prefix/unresolved_class_test.dart
@@ -10,8 +10,6 @@
     //      ^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Type 'lib12.Library13' not found.
-    //      ^^^^^^^^^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
 {}
 
 class Implementer
@@ -19,8 +17,6 @@
     //         ^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Type 'lib12.Library13' not found.
-    //         ^^^^^^^^^^^^^^^
-    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
 {}
 
 main() {
diff --git a/tests/language_2/private/access_test.dart b/tests/language_2/private/access_test.dart
index 2851659..a1cf6a1 100644
--- a/tests/language_2/private/access_test.dart
+++ b/tests/language_2/private/access_test.dart
@@ -19,7 +19,7 @@
 // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
   new _Class();
   //  ^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: '_Class'.
   private._Class();
 //^
diff --git a/tests/language_2/regress/regress21793_test.dart b/tests/language_2/regress/regress21793_test.dart
index 6b8e87e..d767690 100644
--- a/tests/language_2/regress/regress21793_test.dart
+++ b/tests/language_2/regress/regress21793_test.dart
@@ -15,6 +15,6 @@
 main() {
   print(new A()(499));
   //        ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
   // [cfe] Method not found: 'A'.
 }
diff --git a/tests/language_2/regress/regress34495_test.dart b/tests/language_2/regress/regress34495_test.dart
index dee281c..cce9bfe 100644
--- a/tests/language_2/regress/regress34495_test.dart
+++ b/tests/language_2/regress/regress34495_test.dart
@@ -4,7 +4,7 @@
 
 final foo = A<B>.foo();
 //          ^
-// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+// [analyzer] STATIC_WARNING.NEW_WITH_NON_TYPE
 // [cfe] Method not found: 'A'.
 //            ^
 // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
diff --git a/tests/language_2/regress/regress41983_test.dart b/tests/language_2/regress/regress41983_test.dart
new file mode 100644
index 0000000..87f9519
--- /dev/null
+++ b/tests/language_2/regress/regress41983_test.dart
@@ -0,0 +1,20014 @@
+// Copyright (c) 2020, 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";
+
+main() {
+  List<int> ints = new List<int>()
+    ..add(0)
+    ..add(1)
+    ..add(2)
+    ..add(3)
+    ..add(4)
+    ..add(5)
+    ..add(6)
+    ..add(7)
+    ..add(8)
+    ..add(9)
+    ..add(10)
+    ..add(11)
+    ..add(12)
+    ..add(13)
+    ..add(14)
+    ..add(15)
+    ..add(16)
+    ..add(17)
+    ..add(18)
+    ..add(19)
+    ..add(20)
+    ..add(21)
+    ..add(22)
+    ..add(23)
+    ..add(24)
+    ..add(25)
+    ..add(26)
+    ..add(27)
+    ..add(28)
+    ..add(29)
+    ..add(30)
+    ..add(31)
+    ..add(32)
+    ..add(33)
+    ..add(34)
+    ..add(35)
+    ..add(36)
+    ..add(37)
+    ..add(38)
+    ..add(39)
+    ..add(40)
+    ..add(41)
+    ..add(42)
+    ..add(43)
+    ..add(44)
+    ..add(45)
+    ..add(46)
+    ..add(47)
+    ..add(48)
+    ..add(49)
+    ..add(50)
+    ..add(51)
+    ..add(52)
+    ..add(53)
+    ..add(54)
+    ..add(55)
+    ..add(56)
+    ..add(57)
+    ..add(58)
+    ..add(59)
+    ..add(60)
+    ..add(61)
+    ..add(62)
+    ..add(63)
+    ..add(64)
+    ..add(65)
+    ..add(66)
+    ..add(67)
+    ..add(68)
+    ..add(69)
+    ..add(70)
+    ..add(71)
+    ..add(72)
+    ..add(73)
+    ..add(74)
+    ..add(75)
+    ..add(76)
+    ..add(77)
+    ..add(78)
+    ..add(79)
+    ..add(80)
+    ..add(81)
+    ..add(82)
+    ..add(83)
+    ..add(84)
+    ..add(85)
+    ..add(86)
+    ..add(87)
+    ..add(88)
+    ..add(89)
+    ..add(90)
+    ..add(91)
+    ..add(92)
+    ..add(93)
+    ..add(94)
+    ..add(95)
+    ..add(96)
+    ..add(97)
+    ..add(98)
+    ..add(99)
+    ..add(100)
+    ..add(101)
+    ..add(102)
+    ..add(103)
+    ..add(104)
+    ..add(105)
+    ..add(106)
+    ..add(107)
+    ..add(108)
+    ..add(109)
+    ..add(110)
+    ..add(111)
+    ..add(112)
+    ..add(113)
+    ..add(114)
+    ..add(115)
+    ..add(116)
+    ..add(117)
+    ..add(118)
+    ..add(119)
+    ..add(120)
+    ..add(121)
+    ..add(122)
+    ..add(123)
+    ..add(124)
+    ..add(125)
+    ..add(126)
+    ..add(127)
+    ..add(128)
+    ..add(129)
+    ..add(130)
+    ..add(131)
+    ..add(132)
+    ..add(133)
+    ..add(134)
+    ..add(135)
+    ..add(136)
+    ..add(137)
+    ..add(138)
+    ..add(139)
+    ..add(140)
+    ..add(141)
+    ..add(142)
+    ..add(143)
+    ..add(144)
+    ..add(145)
+    ..add(146)
+    ..add(147)
+    ..add(148)
+    ..add(149)
+    ..add(150)
+    ..add(151)
+    ..add(152)
+    ..add(153)
+    ..add(154)
+    ..add(155)
+    ..add(156)
+    ..add(157)
+    ..add(158)
+    ..add(159)
+    ..add(160)
+    ..add(161)
+    ..add(162)
+    ..add(163)
+    ..add(164)
+    ..add(165)
+    ..add(166)
+    ..add(167)
+    ..add(168)
+    ..add(169)
+    ..add(170)
+    ..add(171)
+    ..add(172)
+    ..add(173)
+    ..add(174)
+    ..add(175)
+    ..add(176)
+    ..add(177)
+    ..add(178)
+    ..add(179)
+    ..add(180)
+    ..add(181)
+    ..add(182)
+    ..add(183)
+    ..add(184)
+    ..add(185)
+    ..add(186)
+    ..add(187)
+    ..add(188)
+    ..add(189)
+    ..add(190)
+    ..add(191)
+    ..add(192)
+    ..add(193)
+    ..add(194)
+    ..add(195)
+    ..add(196)
+    ..add(197)
+    ..add(198)
+    ..add(199)
+    ..add(200)
+    ..add(201)
+    ..add(202)
+    ..add(203)
+    ..add(204)
+    ..add(205)
+    ..add(206)
+    ..add(207)
+    ..add(208)
+    ..add(209)
+    ..add(210)
+    ..add(211)
+    ..add(212)
+    ..add(213)
+    ..add(214)
+    ..add(215)
+    ..add(216)
+    ..add(217)
+    ..add(218)
+    ..add(219)
+    ..add(220)
+    ..add(221)
+    ..add(222)
+    ..add(223)
+    ..add(224)
+    ..add(225)
+    ..add(226)
+    ..add(227)
+    ..add(228)
+    ..add(229)
+    ..add(230)
+    ..add(231)
+    ..add(232)
+    ..add(233)
+    ..add(234)
+    ..add(235)
+    ..add(236)
+    ..add(237)
+    ..add(238)
+    ..add(239)
+    ..add(240)
+    ..add(241)
+    ..add(242)
+    ..add(243)
+    ..add(244)
+    ..add(245)
+    ..add(246)
+    ..add(247)
+    ..add(248)
+    ..add(249)
+    ..add(250)
+    ..add(251)
+    ..add(252)
+    ..add(253)
+    ..add(254)
+    ..add(255)
+    ..add(256)
+    ..add(257)
+    ..add(258)
+    ..add(259)
+    ..add(260)
+    ..add(261)
+    ..add(262)
+    ..add(263)
+    ..add(264)
+    ..add(265)
+    ..add(266)
+    ..add(267)
+    ..add(268)
+    ..add(269)
+    ..add(270)
+    ..add(271)
+    ..add(272)
+    ..add(273)
+    ..add(274)
+    ..add(275)
+    ..add(276)
+    ..add(277)
+    ..add(278)
+    ..add(279)
+    ..add(280)
+    ..add(281)
+    ..add(282)
+    ..add(283)
+    ..add(284)
+    ..add(285)
+    ..add(286)
+    ..add(287)
+    ..add(288)
+    ..add(289)
+    ..add(290)
+    ..add(291)
+    ..add(292)
+    ..add(293)
+    ..add(294)
+    ..add(295)
+    ..add(296)
+    ..add(297)
+    ..add(298)
+    ..add(299)
+    ..add(300)
+    ..add(301)
+    ..add(302)
+    ..add(303)
+    ..add(304)
+    ..add(305)
+    ..add(306)
+    ..add(307)
+    ..add(308)
+    ..add(309)
+    ..add(310)
+    ..add(311)
+    ..add(312)
+    ..add(313)
+    ..add(314)
+    ..add(315)
+    ..add(316)
+    ..add(317)
+    ..add(318)
+    ..add(319)
+    ..add(320)
+    ..add(321)
+    ..add(322)
+    ..add(323)
+    ..add(324)
+    ..add(325)
+    ..add(326)
+    ..add(327)
+    ..add(328)
+    ..add(329)
+    ..add(330)
+    ..add(331)
+    ..add(332)
+    ..add(333)
+    ..add(334)
+    ..add(335)
+    ..add(336)
+    ..add(337)
+    ..add(338)
+    ..add(339)
+    ..add(340)
+    ..add(341)
+    ..add(342)
+    ..add(343)
+    ..add(344)
+    ..add(345)
+    ..add(346)
+    ..add(347)
+    ..add(348)
+    ..add(349)
+    ..add(350)
+    ..add(351)
+    ..add(352)
+    ..add(353)
+    ..add(354)
+    ..add(355)
+    ..add(356)
+    ..add(357)
+    ..add(358)
+    ..add(359)
+    ..add(360)
+    ..add(361)
+    ..add(362)
+    ..add(363)
+    ..add(364)
+    ..add(365)
+    ..add(366)
+    ..add(367)
+    ..add(368)
+    ..add(369)
+    ..add(370)
+    ..add(371)
+    ..add(372)
+    ..add(373)
+    ..add(374)
+    ..add(375)
+    ..add(376)
+    ..add(377)
+    ..add(378)
+    ..add(379)
+    ..add(380)
+    ..add(381)
+    ..add(382)
+    ..add(383)
+    ..add(384)
+    ..add(385)
+    ..add(386)
+    ..add(387)
+    ..add(388)
+    ..add(389)
+    ..add(390)
+    ..add(391)
+    ..add(392)
+    ..add(393)
+    ..add(394)
+    ..add(395)
+    ..add(396)
+    ..add(397)
+    ..add(398)
+    ..add(399)
+    ..add(400)
+    ..add(401)
+    ..add(402)
+    ..add(403)
+    ..add(404)
+    ..add(405)
+    ..add(406)
+    ..add(407)
+    ..add(408)
+    ..add(409)
+    ..add(410)
+    ..add(411)
+    ..add(412)
+    ..add(413)
+    ..add(414)
+    ..add(415)
+    ..add(416)
+    ..add(417)
+    ..add(418)
+    ..add(419)
+    ..add(420)
+    ..add(421)
+    ..add(422)
+    ..add(423)
+    ..add(424)
+    ..add(425)
+    ..add(426)
+    ..add(427)
+    ..add(428)
+    ..add(429)
+    ..add(430)
+    ..add(431)
+    ..add(432)
+    ..add(433)
+    ..add(434)
+    ..add(435)
+    ..add(436)
+    ..add(437)
+    ..add(438)
+    ..add(439)
+    ..add(440)
+    ..add(441)
+    ..add(442)
+    ..add(443)
+    ..add(444)
+    ..add(445)
+    ..add(446)
+    ..add(447)
+    ..add(448)
+    ..add(449)
+    ..add(450)
+    ..add(451)
+    ..add(452)
+    ..add(453)
+    ..add(454)
+    ..add(455)
+    ..add(456)
+    ..add(457)
+    ..add(458)
+    ..add(459)
+    ..add(460)
+    ..add(461)
+    ..add(462)
+    ..add(463)
+    ..add(464)
+    ..add(465)
+    ..add(466)
+    ..add(467)
+    ..add(468)
+    ..add(469)
+    ..add(470)
+    ..add(471)
+    ..add(472)
+    ..add(473)
+    ..add(474)
+    ..add(475)
+    ..add(476)
+    ..add(477)
+    ..add(478)
+    ..add(479)
+    ..add(480)
+    ..add(481)
+    ..add(482)
+    ..add(483)
+    ..add(484)
+    ..add(485)
+    ..add(486)
+    ..add(487)
+    ..add(488)
+    ..add(489)
+    ..add(490)
+    ..add(491)
+    ..add(492)
+    ..add(493)
+    ..add(494)
+    ..add(495)
+    ..add(496)
+    ..add(497)
+    ..add(498)
+    ..add(499)
+    ..add(500)
+    ..add(501)
+    ..add(502)
+    ..add(503)
+    ..add(504)
+    ..add(505)
+    ..add(506)
+    ..add(507)
+    ..add(508)
+    ..add(509)
+    ..add(510)
+    ..add(511)
+    ..add(512)
+    ..add(513)
+    ..add(514)
+    ..add(515)
+    ..add(516)
+    ..add(517)
+    ..add(518)
+    ..add(519)
+    ..add(520)
+    ..add(521)
+    ..add(522)
+    ..add(523)
+    ..add(524)
+    ..add(525)
+    ..add(526)
+    ..add(527)
+    ..add(528)
+    ..add(529)
+    ..add(530)
+    ..add(531)
+    ..add(532)
+    ..add(533)
+    ..add(534)
+    ..add(535)
+    ..add(536)
+    ..add(537)
+    ..add(538)
+    ..add(539)
+    ..add(540)
+    ..add(541)
+    ..add(542)
+    ..add(543)
+    ..add(544)
+    ..add(545)
+    ..add(546)
+    ..add(547)
+    ..add(548)
+    ..add(549)
+    ..add(550)
+    ..add(551)
+    ..add(552)
+    ..add(553)
+    ..add(554)
+    ..add(555)
+    ..add(556)
+    ..add(557)
+    ..add(558)
+    ..add(559)
+    ..add(560)
+    ..add(561)
+    ..add(562)
+    ..add(563)
+    ..add(564)
+    ..add(565)
+    ..add(566)
+    ..add(567)
+    ..add(568)
+    ..add(569)
+    ..add(570)
+    ..add(571)
+    ..add(572)
+    ..add(573)
+    ..add(574)
+    ..add(575)
+    ..add(576)
+    ..add(577)
+    ..add(578)
+    ..add(579)
+    ..add(580)
+    ..add(581)
+    ..add(582)
+    ..add(583)
+    ..add(584)
+    ..add(585)
+    ..add(586)
+    ..add(587)
+    ..add(588)
+    ..add(589)
+    ..add(590)
+    ..add(591)
+    ..add(592)
+    ..add(593)
+    ..add(594)
+    ..add(595)
+    ..add(596)
+    ..add(597)
+    ..add(598)
+    ..add(599)
+    ..add(600)
+    ..add(601)
+    ..add(602)
+    ..add(603)
+    ..add(604)
+    ..add(605)
+    ..add(606)
+    ..add(607)
+    ..add(608)
+    ..add(609)
+    ..add(610)
+    ..add(611)
+    ..add(612)
+    ..add(613)
+    ..add(614)
+    ..add(615)
+    ..add(616)
+    ..add(617)
+    ..add(618)
+    ..add(619)
+    ..add(620)
+    ..add(621)
+    ..add(622)
+    ..add(623)
+    ..add(624)
+    ..add(625)
+    ..add(626)
+    ..add(627)
+    ..add(628)
+    ..add(629)
+    ..add(630)
+    ..add(631)
+    ..add(632)
+    ..add(633)
+    ..add(634)
+    ..add(635)
+    ..add(636)
+    ..add(637)
+    ..add(638)
+    ..add(639)
+    ..add(640)
+    ..add(641)
+    ..add(642)
+    ..add(643)
+    ..add(644)
+    ..add(645)
+    ..add(646)
+    ..add(647)
+    ..add(648)
+    ..add(649)
+    ..add(650)
+    ..add(651)
+    ..add(652)
+    ..add(653)
+    ..add(654)
+    ..add(655)
+    ..add(656)
+    ..add(657)
+    ..add(658)
+    ..add(659)
+    ..add(660)
+    ..add(661)
+    ..add(662)
+    ..add(663)
+    ..add(664)
+    ..add(665)
+    ..add(666)
+    ..add(667)
+    ..add(668)
+    ..add(669)
+    ..add(670)
+    ..add(671)
+    ..add(672)
+    ..add(673)
+    ..add(674)
+    ..add(675)
+    ..add(676)
+    ..add(677)
+    ..add(678)
+    ..add(679)
+    ..add(680)
+    ..add(681)
+    ..add(682)
+    ..add(683)
+    ..add(684)
+    ..add(685)
+    ..add(686)
+    ..add(687)
+    ..add(688)
+    ..add(689)
+    ..add(690)
+    ..add(691)
+    ..add(692)
+    ..add(693)
+    ..add(694)
+    ..add(695)
+    ..add(696)
+    ..add(697)
+    ..add(698)
+    ..add(699)
+    ..add(700)
+    ..add(701)
+    ..add(702)
+    ..add(703)
+    ..add(704)
+    ..add(705)
+    ..add(706)
+    ..add(707)
+    ..add(708)
+    ..add(709)
+    ..add(710)
+    ..add(711)
+    ..add(712)
+    ..add(713)
+    ..add(714)
+    ..add(715)
+    ..add(716)
+    ..add(717)
+    ..add(718)
+    ..add(719)
+    ..add(720)
+    ..add(721)
+    ..add(722)
+    ..add(723)
+    ..add(724)
+    ..add(725)
+    ..add(726)
+    ..add(727)
+    ..add(728)
+    ..add(729)
+    ..add(730)
+    ..add(731)
+    ..add(732)
+    ..add(733)
+    ..add(734)
+    ..add(735)
+    ..add(736)
+    ..add(737)
+    ..add(738)
+    ..add(739)
+    ..add(740)
+    ..add(741)
+    ..add(742)
+    ..add(743)
+    ..add(744)
+    ..add(745)
+    ..add(746)
+    ..add(747)
+    ..add(748)
+    ..add(749)
+    ..add(750)
+    ..add(751)
+    ..add(752)
+    ..add(753)
+    ..add(754)
+    ..add(755)
+    ..add(756)
+    ..add(757)
+    ..add(758)
+    ..add(759)
+    ..add(760)
+    ..add(761)
+    ..add(762)
+    ..add(763)
+    ..add(764)
+    ..add(765)
+    ..add(766)
+    ..add(767)
+    ..add(768)
+    ..add(769)
+    ..add(770)
+    ..add(771)
+    ..add(772)
+    ..add(773)
+    ..add(774)
+    ..add(775)
+    ..add(776)
+    ..add(777)
+    ..add(778)
+    ..add(779)
+    ..add(780)
+    ..add(781)
+    ..add(782)
+    ..add(783)
+    ..add(784)
+    ..add(785)
+    ..add(786)
+    ..add(787)
+    ..add(788)
+    ..add(789)
+    ..add(790)
+    ..add(791)
+    ..add(792)
+    ..add(793)
+    ..add(794)
+    ..add(795)
+    ..add(796)
+    ..add(797)
+    ..add(798)
+    ..add(799)
+    ..add(800)
+    ..add(801)
+    ..add(802)
+    ..add(803)
+    ..add(804)
+    ..add(805)
+    ..add(806)
+    ..add(807)
+    ..add(808)
+    ..add(809)
+    ..add(810)
+    ..add(811)
+    ..add(812)
+    ..add(813)
+    ..add(814)
+    ..add(815)
+    ..add(816)
+    ..add(817)
+    ..add(818)
+    ..add(819)
+    ..add(820)
+    ..add(821)
+    ..add(822)
+    ..add(823)
+    ..add(824)
+    ..add(825)
+    ..add(826)
+    ..add(827)
+    ..add(828)
+    ..add(829)
+    ..add(830)
+    ..add(831)
+    ..add(832)
+    ..add(833)
+    ..add(834)
+    ..add(835)
+    ..add(836)
+    ..add(837)
+    ..add(838)
+    ..add(839)
+    ..add(840)
+    ..add(841)
+    ..add(842)
+    ..add(843)
+    ..add(844)
+    ..add(845)
+    ..add(846)
+    ..add(847)
+    ..add(848)
+    ..add(849)
+    ..add(850)
+    ..add(851)
+    ..add(852)
+    ..add(853)
+    ..add(854)
+    ..add(855)
+    ..add(856)
+    ..add(857)
+    ..add(858)
+    ..add(859)
+    ..add(860)
+    ..add(861)
+    ..add(862)
+    ..add(863)
+    ..add(864)
+    ..add(865)
+    ..add(866)
+    ..add(867)
+    ..add(868)
+    ..add(869)
+    ..add(870)
+    ..add(871)
+    ..add(872)
+    ..add(873)
+    ..add(874)
+    ..add(875)
+    ..add(876)
+    ..add(877)
+    ..add(878)
+    ..add(879)
+    ..add(880)
+    ..add(881)
+    ..add(882)
+    ..add(883)
+    ..add(884)
+    ..add(885)
+    ..add(886)
+    ..add(887)
+    ..add(888)
+    ..add(889)
+    ..add(890)
+    ..add(891)
+    ..add(892)
+    ..add(893)
+    ..add(894)
+    ..add(895)
+    ..add(896)
+    ..add(897)
+    ..add(898)
+    ..add(899)
+    ..add(900)
+    ..add(901)
+    ..add(902)
+    ..add(903)
+    ..add(904)
+    ..add(905)
+    ..add(906)
+    ..add(907)
+    ..add(908)
+    ..add(909)
+    ..add(910)
+    ..add(911)
+    ..add(912)
+    ..add(913)
+    ..add(914)
+    ..add(915)
+    ..add(916)
+    ..add(917)
+    ..add(918)
+    ..add(919)
+    ..add(920)
+    ..add(921)
+    ..add(922)
+    ..add(923)
+    ..add(924)
+    ..add(925)
+    ..add(926)
+    ..add(927)
+    ..add(928)
+    ..add(929)
+    ..add(930)
+    ..add(931)
+    ..add(932)
+    ..add(933)
+    ..add(934)
+    ..add(935)
+    ..add(936)
+    ..add(937)
+    ..add(938)
+    ..add(939)
+    ..add(940)
+    ..add(941)
+    ..add(942)
+    ..add(943)
+    ..add(944)
+    ..add(945)
+    ..add(946)
+    ..add(947)
+    ..add(948)
+    ..add(949)
+    ..add(950)
+    ..add(951)
+    ..add(952)
+    ..add(953)
+    ..add(954)
+    ..add(955)
+    ..add(956)
+    ..add(957)
+    ..add(958)
+    ..add(959)
+    ..add(960)
+    ..add(961)
+    ..add(962)
+    ..add(963)
+    ..add(964)
+    ..add(965)
+    ..add(966)
+    ..add(967)
+    ..add(968)
+    ..add(969)
+    ..add(970)
+    ..add(971)
+    ..add(972)
+    ..add(973)
+    ..add(974)
+    ..add(975)
+    ..add(976)
+    ..add(977)
+    ..add(978)
+    ..add(979)
+    ..add(980)
+    ..add(981)
+    ..add(982)
+    ..add(983)
+    ..add(984)
+    ..add(985)
+    ..add(986)
+    ..add(987)
+    ..add(988)
+    ..add(989)
+    ..add(990)
+    ..add(991)
+    ..add(992)
+    ..add(993)
+    ..add(994)
+    ..add(995)
+    ..add(996)
+    ..add(997)
+    ..add(998)
+    ..add(999)
+    ..add(1000)
+    ..add(1001)
+    ..add(1002)
+    ..add(1003)
+    ..add(1004)
+    ..add(1005)
+    ..add(1006)
+    ..add(1007)
+    ..add(1008)
+    ..add(1009)
+    ..add(1010)
+    ..add(1011)
+    ..add(1012)
+    ..add(1013)
+    ..add(1014)
+    ..add(1015)
+    ..add(1016)
+    ..add(1017)
+    ..add(1018)
+    ..add(1019)
+    ..add(1020)
+    ..add(1021)
+    ..add(1022)
+    ..add(1023)
+    ..add(1024)
+    ..add(1025)
+    ..add(1026)
+    ..add(1027)
+    ..add(1028)
+    ..add(1029)
+    ..add(1030)
+    ..add(1031)
+    ..add(1032)
+    ..add(1033)
+    ..add(1034)
+    ..add(1035)
+    ..add(1036)
+    ..add(1037)
+    ..add(1038)
+    ..add(1039)
+    ..add(1040)
+    ..add(1041)
+    ..add(1042)
+    ..add(1043)
+    ..add(1044)
+    ..add(1045)
+    ..add(1046)
+    ..add(1047)
+    ..add(1048)
+    ..add(1049)
+    ..add(1050)
+    ..add(1051)
+    ..add(1052)
+    ..add(1053)
+    ..add(1054)
+    ..add(1055)
+    ..add(1056)
+    ..add(1057)
+    ..add(1058)
+    ..add(1059)
+    ..add(1060)
+    ..add(1061)
+    ..add(1062)
+    ..add(1063)
+    ..add(1064)
+    ..add(1065)
+    ..add(1066)
+    ..add(1067)
+    ..add(1068)
+    ..add(1069)
+    ..add(1070)
+    ..add(1071)
+    ..add(1072)
+    ..add(1073)
+    ..add(1074)
+    ..add(1075)
+    ..add(1076)
+    ..add(1077)
+    ..add(1078)
+    ..add(1079)
+    ..add(1080)
+    ..add(1081)
+    ..add(1082)
+    ..add(1083)
+    ..add(1084)
+    ..add(1085)
+    ..add(1086)
+    ..add(1087)
+    ..add(1088)
+    ..add(1089)
+    ..add(1090)
+    ..add(1091)
+    ..add(1092)
+    ..add(1093)
+    ..add(1094)
+    ..add(1095)
+    ..add(1096)
+    ..add(1097)
+    ..add(1098)
+    ..add(1099)
+    ..add(1100)
+    ..add(1101)
+    ..add(1102)
+    ..add(1103)
+    ..add(1104)
+    ..add(1105)
+    ..add(1106)
+    ..add(1107)
+    ..add(1108)
+    ..add(1109)
+    ..add(1110)
+    ..add(1111)
+    ..add(1112)
+    ..add(1113)
+    ..add(1114)
+    ..add(1115)
+    ..add(1116)
+    ..add(1117)
+    ..add(1118)
+    ..add(1119)
+    ..add(1120)
+    ..add(1121)
+    ..add(1122)
+    ..add(1123)
+    ..add(1124)
+    ..add(1125)
+    ..add(1126)
+    ..add(1127)
+    ..add(1128)
+    ..add(1129)
+    ..add(1130)
+    ..add(1131)
+    ..add(1132)
+    ..add(1133)
+    ..add(1134)
+    ..add(1135)
+    ..add(1136)
+    ..add(1137)
+    ..add(1138)
+    ..add(1139)
+    ..add(1140)
+    ..add(1141)
+    ..add(1142)
+    ..add(1143)
+    ..add(1144)
+    ..add(1145)
+    ..add(1146)
+    ..add(1147)
+    ..add(1148)
+    ..add(1149)
+    ..add(1150)
+    ..add(1151)
+    ..add(1152)
+    ..add(1153)
+    ..add(1154)
+    ..add(1155)
+    ..add(1156)
+    ..add(1157)
+    ..add(1158)
+    ..add(1159)
+    ..add(1160)
+    ..add(1161)
+    ..add(1162)
+    ..add(1163)
+    ..add(1164)
+    ..add(1165)
+    ..add(1166)
+    ..add(1167)
+    ..add(1168)
+    ..add(1169)
+    ..add(1170)
+    ..add(1171)
+    ..add(1172)
+    ..add(1173)
+    ..add(1174)
+    ..add(1175)
+    ..add(1176)
+    ..add(1177)
+    ..add(1178)
+    ..add(1179)
+    ..add(1180)
+    ..add(1181)
+    ..add(1182)
+    ..add(1183)
+    ..add(1184)
+    ..add(1185)
+    ..add(1186)
+    ..add(1187)
+    ..add(1188)
+    ..add(1189)
+    ..add(1190)
+    ..add(1191)
+    ..add(1192)
+    ..add(1193)
+    ..add(1194)
+    ..add(1195)
+    ..add(1196)
+    ..add(1197)
+    ..add(1198)
+    ..add(1199)
+    ..add(1200)
+    ..add(1201)
+    ..add(1202)
+    ..add(1203)
+    ..add(1204)
+    ..add(1205)
+    ..add(1206)
+    ..add(1207)
+    ..add(1208)
+    ..add(1209)
+    ..add(1210)
+    ..add(1211)
+    ..add(1212)
+    ..add(1213)
+    ..add(1214)
+    ..add(1215)
+    ..add(1216)
+    ..add(1217)
+    ..add(1218)
+    ..add(1219)
+    ..add(1220)
+    ..add(1221)
+    ..add(1222)
+    ..add(1223)
+    ..add(1224)
+    ..add(1225)
+    ..add(1226)
+    ..add(1227)
+    ..add(1228)
+    ..add(1229)
+    ..add(1230)
+    ..add(1231)
+    ..add(1232)
+    ..add(1233)
+    ..add(1234)
+    ..add(1235)
+    ..add(1236)
+    ..add(1237)
+    ..add(1238)
+    ..add(1239)
+    ..add(1240)
+    ..add(1241)
+    ..add(1242)
+    ..add(1243)
+    ..add(1244)
+    ..add(1245)
+    ..add(1246)
+    ..add(1247)
+    ..add(1248)
+    ..add(1249)
+    ..add(1250)
+    ..add(1251)
+    ..add(1252)
+    ..add(1253)
+    ..add(1254)
+    ..add(1255)
+    ..add(1256)
+    ..add(1257)
+    ..add(1258)
+    ..add(1259)
+    ..add(1260)
+    ..add(1261)
+    ..add(1262)
+    ..add(1263)
+    ..add(1264)
+    ..add(1265)
+    ..add(1266)
+    ..add(1267)
+    ..add(1268)
+    ..add(1269)
+    ..add(1270)
+    ..add(1271)
+    ..add(1272)
+    ..add(1273)
+    ..add(1274)
+    ..add(1275)
+    ..add(1276)
+    ..add(1277)
+    ..add(1278)
+    ..add(1279)
+    ..add(1280)
+    ..add(1281)
+    ..add(1282)
+    ..add(1283)
+    ..add(1284)
+    ..add(1285)
+    ..add(1286)
+    ..add(1287)
+    ..add(1288)
+    ..add(1289)
+    ..add(1290)
+    ..add(1291)
+    ..add(1292)
+    ..add(1293)
+    ..add(1294)
+    ..add(1295)
+    ..add(1296)
+    ..add(1297)
+    ..add(1298)
+    ..add(1299)
+    ..add(1300)
+    ..add(1301)
+    ..add(1302)
+    ..add(1303)
+    ..add(1304)
+    ..add(1305)
+    ..add(1306)
+    ..add(1307)
+    ..add(1308)
+    ..add(1309)
+    ..add(1310)
+    ..add(1311)
+    ..add(1312)
+    ..add(1313)
+    ..add(1314)
+    ..add(1315)
+    ..add(1316)
+    ..add(1317)
+    ..add(1318)
+    ..add(1319)
+    ..add(1320)
+    ..add(1321)
+    ..add(1322)
+    ..add(1323)
+    ..add(1324)
+    ..add(1325)
+    ..add(1326)
+    ..add(1327)
+    ..add(1328)
+    ..add(1329)
+    ..add(1330)
+    ..add(1331)
+    ..add(1332)
+    ..add(1333)
+    ..add(1334)
+    ..add(1335)
+    ..add(1336)
+    ..add(1337)
+    ..add(1338)
+    ..add(1339)
+    ..add(1340)
+    ..add(1341)
+    ..add(1342)
+    ..add(1343)
+    ..add(1344)
+    ..add(1345)
+    ..add(1346)
+    ..add(1347)
+    ..add(1348)
+    ..add(1349)
+    ..add(1350)
+    ..add(1351)
+    ..add(1352)
+    ..add(1353)
+    ..add(1354)
+    ..add(1355)
+    ..add(1356)
+    ..add(1357)
+    ..add(1358)
+    ..add(1359)
+    ..add(1360)
+    ..add(1361)
+    ..add(1362)
+    ..add(1363)
+    ..add(1364)
+    ..add(1365)
+    ..add(1366)
+    ..add(1367)
+    ..add(1368)
+    ..add(1369)
+    ..add(1370)
+    ..add(1371)
+    ..add(1372)
+    ..add(1373)
+    ..add(1374)
+    ..add(1375)
+    ..add(1376)
+    ..add(1377)
+    ..add(1378)
+    ..add(1379)
+    ..add(1380)
+    ..add(1381)
+    ..add(1382)
+    ..add(1383)
+    ..add(1384)
+    ..add(1385)
+    ..add(1386)
+    ..add(1387)
+    ..add(1388)
+    ..add(1389)
+    ..add(1390)
+    ..add(1391)
+    ..add(1392)
+    ..add(1393)
+    ..add(1394)
+    ..add(1395)
+    ..add(1396)
+    ..add(1397)
+    ..add(1398)
+    ..add(1399)
+    ..add(1400)
+    ..add(1401)
+    ..add(1402)
+    ..add(1403)
+    ..add(1404)
+    ..add(1405)
+    ..add(1406)
+    ..add(1407)
+    ..add(1408)
+    ..add(1409)
+    ..add(1410)
+    ..add(1411)
+    ..add(1412)
+    ..add(1413)
+    ..add(1414)
+    ..add(1415)
+    ..add(1416)
+    ..add(1417)
+    ..add(1418)
+    ..add(1419)
+    ..add(1420)
+    ..add(1421)
+    ..add(1422)
+    ..add(1423)
+    ..add(1424)
+    ..add(1425)
+    ..add(1426)
+    ..add(1427)
+    ..add(1428)
+    ..add(1429)
+    ..add(1430)
+    ..add(1431)
+    ..add(1432)
+    ..add(1433)
+    ..add(1434)
+    ..add(1435)
+    ..add(1436)
+    ..add(1437)
+    ..add(1438)
+    ..add(1439)
+    ..add(1440)
+    ..add(1441)
+    ..add(1442)
+    ..add(1443)
+    ..add(1444)
+    ..add(1445)
+    ..add(1446)
+    ..add(1447)
+    ..add(1448)
+    ..add(1449)
+    ..add(1450)
+    ..add(1451)
+    ..add(1452)
+    ..add(1453)
+    ..add(1454)
+    ..add(1455)
+    ..add(1456)
+    ..add(1457)
+    ..add(1458)
+    ..add(1459)
+    ..add(1460)
+    ..add(1461)
+    ..add(1462)
+    ..add(1463)
+    ..add(1464)
+    ..add(1465)
+    ..add(1466)
+    ..add(1467)
+    ..add(1468)
+    ..add(1469)
+    ..add(1470)
+    ..add(1471)
+    ..add(1472)
+    ..add(1473)
+    ..add(1474)
+    ..add(1475)
+    ..add(1476)
+    ..add(1477)
+    ..add(1478)
+    ..add(1479)
+    ..add(1480)
+    ..add(1481)
+    ..add(1482)
+    ..add(1483)
+    ..add(1484)
+    ..add(1485)
+    ..add(1486)
+    ..add(1487)
+    ..add(1488)
+    ..add(1489)
+    ..add(1490)
+    ..add(1491)
+    ..add(1492)
+    ..add(1493)
+    ..add(1494)
+    ..add(1495)
+    ..add(1496)
+    ..add(1497)
+    ..add(1498)
+    ..add(1499)
+    ..add(1500)
+    ..add(1501)
+    ..add(1502)
+    ..add(1503)
+    ..add(1504)
+    ..add(1505)
+    ..add(1506)
+    ..add(1507)
+    ..add(1508)
+    ..add(1509)
+    ..add(1510)
+    ..add(1511)
+    ..add(1512)
+    ..add(1513)
+    ..add(1514)
+    ..add(1515)
+    ..add(1516)
+    ..add(1517)
+    ..add(1518)
+    ..add(1519)
+    ..add(1520)
+    ..add(1521)
+    ..add(1522)
+    ..add(1523)
+    ..add(1524)
+    ..add(1525)
+    ..add(1526)
+    ..add(1527)
+    ..add(1528)
+    ..add(1529)
+    ..add(1530)
+    ..add(1531)
+    ..add(1532)
+    ..add(1533)
+    ..add(1534)
+    ..add(1535)
+    ..add(1536)
+    ..add(1537)
+    ..add(1538)
+    ..add(1539)
+    ..add(1540)
+    ..add(1541)
+    ..add(1542)
+    ..add(1543)
+    ..add(1544)
+    ..add(1545)
+    ..add(1546)
+    ..add(1547)
+    ..add(1548)
+    ..add(1549)
+    ..add(1550)
+    ..add(1551)
+    ..add(1552)
+    ..add(1553)
+    ..add(1554)
+    ..add(1555)
+    ..add(1556)
+    ..add(1557)
+    ..add(1558)
+    ..add(1559)
+    ..add(1560)
+    ..add(1561)
+    ..add(1562)
+    ..add(1563)
+    ..add(1564)
+    ..add(1565)
+    ..add(1566)
+    ..add(1567)
+    ..add(1568)
+    ..add(1569)
+    ..add(1570)
+    ..add(1571)
+    ..add(1572)
+    ..add(1573)
+    ..add(1574)
+    ..add(1575)
+    ..add(1576)
+    ..add(1577)
+    ..add(1578)
+    ..add(1579)
+    ..add(1580)
+    ..add(1581)
+    ..add(1582)
+    ..add(1583)
+    ..add(1584)
+    ..add(1585)
+    ..add(1586)
+    ..add(1587)
+    ..add(1588)
+    ..add(1589)
+    ..add(1590)
+    ..add(1591)
+    ..add(1592)
+    ..add(1593)
+    ..add(1594)
+    ..add(1595)
+    ..add(1596)
+    ..add(1597)
+    ..add(1598)
+    ..add(1599)
+    ..add(1600)
+    ..add(1601)
+    ..add(1602)
+    ..add(1603)
+    ..add(1604)
+    ..add(1605)
+    ..add(1606)
+    ..add(1607)
+    ..add(1608)
+    ..add(1609)
+    ..add(1610)
+    ..add(1611)
+    ..add(1612)
+    ..add(1613)
+    ..add(1614)
+    ..add(1615)
+    ..add(1616)
+    ..add(1617)
+    ..add(1618)
+    ..add(1619)
+    ..add(1620)
+    ..add(1621)
+    ..add(1622)
+    ..add(1623)
+    ..add(1624)
+    ..add(1625)
+    ..add(1626)
+    ..add(1627)
+    ..add(1628)
+    ..add(1629)
+    ..add(1630)
+    ..add(1631)
+    ..add(1632)
+    ..add(1633)
+    ..add(1634)
+    ..add(1635)
+    ..add(1636)
+    ..add(1637)
+    ..add(1638)
+    ..add(1639)
+    ..add(1640)
+    ..add(1641)
+    ..add(1642)
+    ..add(1643)
+    ..add(1644)
+    ..add(1645)
+    ..add(1646)
+    ..add(1647)
+    ..add(1648)
+    ..add(1649)
+    ..add(1650)
+    ..add(1651)
+    ..add(1652)
+    ..add(1653)
+    ..add(1654)
+    ..add(1655)
+    ..add(1656)
+    ..add(1657)
+    ..add(1658)
+    ..add(1659)
+    ..add(1660)
+    ..add(1661)
+    ..add(1662)
+    ..add(1663)
+    ..add(1664)
+    ..add(1665)
+    ..add(1666)
+    ..add(1667)
+    ..add(1668)
+    ..add(1669)
+    ..add(1670)
+    ..add(1671)
+    ..add(1672)
+    ..add(1673)
+    ..add(1674)
+    ..add(1675)
+    ..add(1676)
+    ..add(1677)
+    ..add(1678)
+    ..add(1679)
+    ..add(1680)
+    ..add(1681)
+    ..add(1682)
+    ..add(1683)
+    ..add(1684)
+    ..add(1685)
+    ..add(1686)
+    ..add(1687)
+    ..add(1688)
+    ..add(1689)
+    ..add(1690)
+    ..add(1691)
+    ..add(1692)
+    ..add(1693)
+    ..add(1694)
+    ..add(1695)
+    ..add(1696)
+    ..add(1697)
+    ..add(1698)
+    ..add(1699)
+    ..add(1700)
+    ..add(1701)
+    ..add(1702)
+    ..add(1703)
+    ..add(1704)
+    ..add(1705)
+    ..add(1706)
+    ..add(1707)
+    ..add(1708)
+    ..add(1709)
+    ..add(1710)
+    ..add(1711)
+    ..add(1712)
+    ..add(1713)
+    ..add(1714)
+    ..add(1715)
+    ..add(1716)
+    ..add(1717)
+    ..add(1718)
+    ..add(1719)
+    ..add(1720)
+    ..add(1721)
+    ..add(1722)
+    ..add(1723)
+    ..add(1724)
+    ..add(1725)
+    ..add(1726)
+    ..add(1727)
+    ..add(1728)
+    ..add(1729)
+    ..add(1730)
+    ..add(1731)
+    ..add(1732)
+    ..add(1733)
+    ..add(1734)
+    ..add(1735)
+    ..add(1736)
+    ..add(1737)
+    ..add(1738)
+    ..add(1739)
+    ..add(1740)
+    ..add(1741)
+    ..add(1742)
+    ..add(1743)
+    ..add(1744)
+    ..add(1745)
+    ..add(1746)
+    ..add(1747)
+    ..add(1748)
+    ..add(1749)
+    ..add(1750)
+    ..add(1751)
+    ..add(1752)
+    ..add(1753)
+    ..add(1754)
+    ..add(1755)
+    ..add(1756)
+    ..add(1757)
+    ..add(1758)
+    ..add(1759)
+    ..add(1760)
+    ..add(1761)
+    ..add(1762)
+    ..add(1763)
+    ..add(1764)
+    ..add(1765)
+    ..add(1766)
+    ..add(1767)
+    ..add(1768)
+    ..add(1769)
+    ..add(1770)
+    ..add(1771)
+    ..add(1772)
+    ..add(1773)
+    ..add(1774)
+    ..add(1775)
+    ..add(1776)
+    ..add(1777)
+    ..add(1778)
+    ..add(1779)
+    ..add(1780)
+    ..add(1781)
+    ..add(1782)
+    ..add(1783)
+    ..add(1784)
+    ..add(1785)
+    ..add(1786)
+    ..add(1787)
+    ..add(1788)
+    ..add(1789)
+    ..add(1790)
+    ..add(1791)
+    ..add(1792)
+    ..add(1793)
+    ..add(1794)
+    ..add(1795)
+    ..add(1796)
+    ..add(1797)
+    ..add(1798)
+    ..add(1799)
+    ..add(1800)
+    ..add(1801)
+    ..add(1802)
+    ..add(1803)
+    ..add(1804)
+    ..add(1805)
+    ..add(1806)
+    ..add(1807)
+    ..add(1808)
+    ..add(1809)
+    ..add(1810)
+    ..add(1811)
+    ..add(1812)
+    ..add(1813)
+    ..add(1814)
+    ..add(1815)
+    ..add(1816)
+    ..add(1817)
+    ..add(1818)
+    ..add(1819)
+    ..add(1820)
+    ..add(1821)
+    ..add(1822)
+    ..add(1823)
+    ..add(1824)
+    ..add(1825)
+    ..add(1826)
+    ..add(1827)
+    ..add(1828)
+    ..add(1829)
+    ..add(1830)
+    ..add(1831)
+    ..add(1832)
+    ..add(1833)
+    ..add(1834)
+    ..add(1835)
+    ..add(1836)
+    ..add(1837)
+    ..add(1838)
+    ..add(1839)
+    ..add(1840)
+    ..add(1841)
+    ..add(1842)
+    ..add(1843)
+    ..add(1844)
+    ..add(1845)
+    ..add(1846)
+    ..add(1847)
+    ..add(1848)
+    ..add(1849)
+    ..add(1850)
+    ..add(1851)
+    ..add(1852)
+    ..add(1853)
+    ..add(1854)
+    ..add(1855)
+    ..add(1856)
+    ..add(1857)
+    ..add(1858)
+    ..add(1859)
+    ..add(1860)
+    ..add(1861)
+    ..add(1862)
+    ..add(1863)
+    ..add(1864)
+    ..add(1865)
+    ..add(1866)
+    ..add(1867)
+    ..add(1868)
+    ..add(1869)
+    ..add(1870)
+    ..add(1871)
+    ..add(1872)
+    ..add(1873)
+    ..add(1874)
+    ..add(1875)
+    ..add(1876)
+    ..add(1877)
+    ..add(1878)
+    ..add(1879)
+    ..add(1880)
+    ..add(1881)
+    ..add(1882)
+    ..add(1883)
+    ..add(1884)
+    ..add(1885)
+    ..add(1886)
+    ..add(1887)
+    ..add(1888)
+    ..add(1889)
+    ..add(1890)
+    ..add(1891)
+    ..add(1892)
+    ..add(1893)
+    ..add(1894)
+    ..add(1895)
+    ..add(1896)
+    ..add(1897)
+    ..add(1898)
+    ..add(1899)
+    ..add(1900)
+    ..add(1901)
+    ..add(1902)
+    ..add(1903)
+    ..add(1904)
+    ..add(1905)
+    ..add(1906)
+    ..add(1907)
+    ..add(1908)
+    ..add(1909)
+    ..add(1910)
+    ..add(1911)
+    ..add(1912)
+    ..add(1913)
+    ..add(1914)
+    ..add(1915)
+    ..add(1916)
+    ..add(1917)
+    ..add(1918)
+    ..add(1919)
+    ..add(1920)
+    ..add(1921)
+    ..add(1922)
+    ..add(1923)
+    ..add(1924)
+    ..add(1925)
+    ..add(1926)
+    ..add(1927)
+    ..add(1928)
+    ..add(1929)
+    ..add(1930)
+    ..add(1931)
+    ..add(1932)
+    ..add(1933)
+    ..add(1934)
+    ..add(1935)
+    ..add(1936)
+    ..add(1937)
+    ..add(1938)
+    ..add(1939)
+    ..add(1940)
+    ..add(1941)
+    ..add(1942)
+    ..add(1943)
+    ..add(1944)
+    ..add(1945)
+    ..add(1946)
+    ..add(1947)
+    ..add(1948)
+    ..add(1949)
+    ..add(1950)
+    ..add(1951)
+    ..add(1952)
+    ..add(1953)
+    ..add(1954)
+    ..add(1955)
+    ..add(1956)
+    ..add(1957)
+    ..add(1958)
+    ..add(1959)
+    ..add(1960)
+    ..add(1961)
+    ..add(1962)
+    ..add(1963)
+    ..add(1964)
+    ..add(1965)
+    ..add(1966)
+    ..add(1967)
+    ..add(1968)
+    ..add(1969)
+    ..add(1970)
+    ..add(1971)
+    ..add(1972)
+    ..add(1973)
+    ..add(1974)
+    ..add(1975)
+    ..add(1976)
+    ..add(1977)
+    ..add(1978)
+    ..add(1979)
+    ..add(1980)
+    ..add(1981)
+    ..add(1982)
+    ..add(1983)
+    ..add(1984)
+    ..add(1985)
+    ..add(1986)
+    ..add(1987)
+    ..add(1988)
+    ..add(1989)
+    ..add(1990)
+    ..add(1991)
+    ..add(1992)
+    ..add(1993)
+    ..add(1994)
+    ..add(1995)
+    ..add(1996)
+    ..add(1997)
+    ..add(1998)
+    ..add(1999)
+    ..add(2000)
+    ..add(2001)
+    ..add(2002)
+    ..add(2003)
+    ..add(2004)
+    ..add(2005)
+    ..add(2006)
+    ..add(2007)
+    ..add(2008)
+    ..add(2009)
+    ..add(2010)
+    ..add(2011)
+    ..add(2012)
+    ..add(2013)
+    ..add(2014)
+    ..add(2015)
+    ..add(2016)
+    ..add(2017)
+    ..add(2018)
+    ..add(2019)
+    ..add(2020)
+    ..add(2021)
+    ..add(2022)
+    ..add(2023)
+    ..add(2024)
+    ..add(2025)
+    ..add(2026)
+    ..add(2027)
+    ..add(2028)
+    ..add(2029)
+    ..add(2030)
+    ..add(2031)
+    ..add(2032)
+    ..add(2033)
+    ..add(2034)
+    ..add(2035)
+    ..add(2036)
+    ..add(2037)
+    ..add(2038)
+    ..add(2039)
+    ..add(2040)
+    ..add(2041)
+    ..add(2042)
+    ..add(2043)
+    ..add(2044)
+    ..add(2045)
+    ..add(2046)
+    ..add(2047)
+    ..add(2048)
+    ..add(2049)
+    ..add(2050)
+    ..add(2051)
+    ..add(2052)
+    ..add(2053)
+    ..add(2054)
+    ..add(2055)
+    ..add(2056)
+    ..add(2057)
+    ..add(2058)
+    ..add(2059)
+    ..add(2060)
+    ..add(2061)
+    ..add(2062)
+    ..add(2063)
+    ..add(2064)
+    ..add(2065)
+    ..add(2066)
+    ..add(2067)
+    ..add(2068)
+    ..add(2069)
+    ..add(2070)
+    ..add(2071)
+    ..add(2072)
+    ..add(2073)
+    ..add(2074)
+    ..add(2075)
+    ..add(2076)
+    ..add(2077)
+    ..add(2078)
+    ..add(2079)
+    ..add(2080)
+    ..add(2081)
+    ..add(2082)
+    ..add(2083)
+    ..add(2084)
+    ..add(2085)
+    ..add(2086)
+    ..add(2087)
+    ..add(2088)
+    ..add(2089)
+    ..add(2090)
+    ..add(2091)
+    ..add(2092)
+    ..add(2093)
+    ..add(2094)
+    ..add(2095)
+    ..add(2096)
+    ..add(2097)
+    ..add(2098)
+    ..add(2099)
+    ..add(2100)
+    ..add(2101)
+    ..add(2102)
+    ..add(2103)
+    ..add(2104)
+    ..add(2105)
+    ..add(2106)
+    ..add(2107)
+    ..add(2108)
+    ..add(2109)
+    ..add(2110)
+    ..add(2111)
+    ..add(2112)
+    ..add(2113)
+    ..add(2114)
+    ..add(2115)
+    ..add(2116)
+    ..add(2117)
+    ..add(2118)
+    ..add(2119)
+    ..add(2120)
+    ..add(2121)
+    ..add(2122)
+    ..add(2123)
+    ..add(2124)
+    ..add(2125)
+    ..add(2126)
+    ..add(2127)
+    ..add(2128)
+    ..add(2129)
+    ..add(2130)
+    ..add(2131)
+    ..add(2132)
+    ..add(2133)
+    ..add(2134)
+    ..add(2135)
+    ..add(2136)
+    ..add(2137)
+    ..add(2138)
+    ..add(2139)
+    ..add(2140)
+    ..add(2141)
+    ..add(2142)
+    ..add(2143)
+    ..add(2144)
+    ..add(2145)
+    ..add(2146)
+    ..add(2147)
+    ..add(2148)
+    ..add(2149)
+    ..add(2150)
+    ..add(2151)
+    ..add(2152)
+    ..add(2153)
+    ..add(2154)
+    ..add(2155)
+    ..add(2156)
+    ..add(2157)
+    ..add(2158)
+    ..add(2159)
+    ..add(2160)
+    ..add(2161)
+    ..add(2162)
+    ..add(2163)
+    ..add(2164)
+    ..add(2165)
+    ..add(2166)
+    ..add(2167)
+    ..add(2168)
+    ..add(2169)
+    ..add(2170)
+    ..add(2171)
+    ..add(2172)
+    ..add(2173)
+    ..add(2174)
+    ..add(2175)
+    ..add(2176)
+    ..add(2177)
+    ..add(2178)
+    ..add(2179)
+    ..add(2180)
+    ..add(2181)
+    ..add(2182)
+    ..add(2183)
+    ..add(2184)
+    ..add(2185)
+    ..add(2186)
+    ..add(2187)
+    ..add(2188)
+    ..add(2189)
+    ..add(2190)
+    ..add(2191)
+    ..add(2192)
+    ..add(2193)
+    ..add(2194)
+    ..add(2195)
+    ..add(2196)
+    ..add(2197)
+    ..add(2198)
+    ..add(2199)
+    ..add(2200)
+    ..add(2201)
+    ..add(2202)
+    ..add(2203)
+    ..add(2204)
+    ..add(2205)
+    ..add(2206)
+    ..add(2207)
+    ..add(2208)
+    ..add(2209)
+    ..add(2210)
+    ..add(2211)
+    ..add(2212)
+    ..add(2213)
+    ..add(2214)
+    ..add(2215)
+    ..add(2216)
+    ..add(2217)
+    ..add(2218)
+    ..add(2219)
+    ..add(2220)
+    ..add(2221)
+    ..add(2222)
+    ..add(2223)
+    ..add(2224)
+    ..add(2225)
+    ..add(2226)
+    ..add(2227)
+    ..add(2228)
+    ..add(2229)
+    ..add(2230)
+    ..add(2231)
+    ..add(2232)
+    ..add(2233)
+    ..add(2234)
+    ..add(2235)
+    ..add(2236)
+    ..add(2237)
+    ..add(2238)
+    ..add(2239)
+    ..add(2240)
+    ..add(2241)
+    ..add(2242)
+    ..add(2243)
+    ..add(2244)
+    ..add(2245)
+    ..add(2246)
+    ..add(2247)
+    ..add(2248)
+    ..add(2249)
+    ..add(2250)
+    ..add(2251)
+    ..add(2252)
+    ..add(2253)
+    ..add(2254)
+    ..add(2255)
+    ..add(2256)
+    ..add(2257)
+    ..add(2258)
+    ..add(2259)
+    ..add(2260)
+    ..add(2261)
+    ..add(2262)
+    ..add(2263)
+    ..add(2264)
+    ..add(2265)
+    ..add(2266)
+    ..add(2267)
+    ..add(2268)
+    ..add(2269)
+    ..add(2270)
+    ..add(2271)
+    ..add(2272)
+    ..add(2273)
+    ..add(2274)
+    ..add(2275)
+    ..add(2276)
+    ..add(2277)
+    ..add(2278)
+    ..add(2279)
+    ..add(2280)
+    ..add(2281)
+    ..add(2282)
+    ..add(2283)
+    ..add(2284)
+    ..add(2285)
+    ..add(2286)
+    ..add(2287)
+    ..add(2288)
+    ..add(2289)
+    ..add(2290)
+    ..add(2291)
+    ..add(2292)
+    ..add(2293)
+    ..add(2294)
+    ..add(2295)
+    ..add(2296)
+    ..add(2297)
+    ..add(2298)
+    ..add(2299)
+    ..add(2300)
+    ..add(2301)
+    ..add(2302)
+    ..add(2303)
+    ..add(2304)
+    ..add(2305)
+    ..add(2306)
+    ..add(2307)
+    ..add(2308)
+    ..add(2309)
+    ..add(2310)
+    ..add(2311)
+    ..add(2312)
+    ..add(2313)
+    ..add(2314)
+    ..add(2315)
+    ..add(2316)
+    ..add(2317)
+    ..add(2318)
+    ..add(2319)
+    ..add(2320)
+    ..add(2321)
+    ..add(2322)
+    ..add(2323)
+    ..add(2324)
+    ..add(2325)
+    ..add(2326)
+    ..add(2327)
+    ..add(2328)
+    ..add(2329)
+    ..add(2330)
+    ..add(2331)
+    ..add(2332)
+    ..add(2333)
+    ..add(2334)
+    ..add(2335)
+    ..add(2336)
+    ..add(2337)
+    ..add(2338)
+    ..add(2339)
+    ..add(2340)
+    ..add(2341)
+    ..add(2342)
+    ..add(2343)
+    ..add(2344)
+    ..add(2345)
+    ..add(2346)
+    ..add(2347)
+    ..add(2348)
+    ..add(2349)
+    ..add(2350)
+    ..add(2351)
+    ..add(2352)
+    ..add(2353)
+    ..add(2354)
+    ..add(2355)
+    ..add(2356)
+    ..add(2357)
+    ..add(2358)
+    ..add(2359)
+    ..add(2360)
+    ..add(2361)
+    ..add(2362)
+    ..add(2363)
+    ..add(2364)
+    ..add(2365)
+    ..add(2366)
+    ..add(2367)
+    ..add(2368)
+    ..add(2369)
+    ..add(2370)
+    ..add(2371)
+    ..add(2372)
+    ..add(2373)
+    ..add(2374)
+    ..add(2375)
+    ..add(2376)
+    ..add(2377)
+    ..add(2378)
+    ..add(2379)
+    ..add(2380)
+    ..add(2381)
+    ..add(2382)
+    ..add(2383)
+    ..add(2384)
+    ..add(2385)
+    ..add(2386)
+    ..add(2387)
+    ..add(2388)
+    ..add(2389)
+    ..add(2390)
+    ..add(2391)
+    ..add(2392)
+    ..add(2393)
+    ..add(2394)
+    ..add(2395)
+    ..add(2396)
+    ..add(2397)
+    ..add(2398)
+    ..add(2399)
+    ..add(2400)
+    ..add(2401)
+    ..add(2402)
+    ..add(2403)
+    ..add(2404)
+    ..add(2405)
+    ..add(2406)
+    ..add(2407)
+    ..add(2408)
+    ..add(2409)
+    ..add(2410)
+    ..add(2411)
+    ..add(2412)
+    ..add(2413)
+    ..add(2414)
+    ..add(2415)
+    ..add(2416)
+    ..add(2417)
+    ..add(2418)
+    ..add(2419)
+    ..add(2420)
+    ..add(2421)
+    ..add(2422)
+    ..add(2423)
+    ..add(2424)
+    ..add(2425)
+    ..add(2426)
+    ..add(2427)
+    ..add(2428)
+    ..add(2429)
+    ..add(2430)
+    ..add(2431)
+    ..add(2432)
+    ..add(2433)
+    ..add(2434)
+    ..add(2435)
+    ..add(2436)
+    ..add(2437)
+    ..add(2438)
+    ..add(2439)
+    ..add(2440)
+    ..add(2441)
+    ..add(2442)
+    ..add(2443)
+    ..add(2444)
+    ..add(2445)
+    ..add(2446)
+    ..add(2447)
+    ..add(2448)
+    ..add(2449)
+    ..add(2450)
+    ..add(2451)
+    ..add(2452)
+    ..add(2453)
+    ..add(2454)
+    ..add(2455)
+    ..add(2456)
+    ..add(2457)
+    ..add(2458)
+    ..add(2459)
+    ..add(2460)
+    ..add(2461)
+    ..add(2462)
+    ..add(2463)
+    ..add(2464)
+    ..add(2465)
+    ..add(2466)
+    ..add(2467)
+    ..add(2468)
+    ..add(2469)
+    ..add(2470)
+    ..add(2471)
+    ..add(2472)
+    ..add(2473)
+    ..add(2474)
+    ..add(2475)
+    ..add(2476)
+    ..add(2477)
+    ..add(2478)
+    ..add(2479)
+    ..add(2480)
+    ..add(2481)
+    ..add(2482)
+    ..add(2483)
+    ..add(2484)
+    ..add(2485)
+    ..add(2486)
+    ..add(2487)
+    ..add(2488)
+    ..add(2489)
+    ..add(2490)
+    ..add(2491)
+    ..add(2492)
+    ..add(2493)
+    ..add(2494)
+    ..add(2495)
+    ..add(2496)
+    ..add(2497)
+    ..add(2498)
+    ..add(2499)
+    ..add(2500)
+    ..add(2501)
+    ..add(2502)
+    ..add(2503)
+    ..add(2504)
+    ..add(2505)
+    ..add(2506)
+    ..add(2507)
+    ..add(2508)
+    ..add(2509)
+    ..add(2510)
+    ..add(2511)
+    ..add(2512)
+    ..add(2513)
+    ..add(2514)
+    ..add(2515)
+    ..add(2516)
+    ..add(2517)
+    ..add(2518)
+    ..add(2519)
+    ..add(2520)
+    ..add(2521)
+    ..add(2522)
+    ..add(2523)
+    ..add(2524)
+    ..add(2525)
+    ..add(2526)
+    ..add(2527)
+    ..add(2528)
+    ..add(2529)
+    ..add(2530)
+    ..add(2531)
+    ..add(2532)
+    ..add(2533)
+    ..add(2534)
+    ..add(2535)
+    ..add(2536)
+    ..add(2537)
+    ..add(2538)
+    ..add(2539)
+    ..add(2540)
+    ..add(2541)
+    ..add(2542)
+    ..add(2543)
+    ..add(2544)
+    ..add(2545)
+    ..add(2546)
+    ..add(2547)
+    ..add(2548)
+    ..add(2549)
+    ..add(2550)
+    ..add(2551)
+    ..add(2552)
+    ..add(2553)
+    ..add(2554)
+    ..add(2555)
+    ..add(2556)
+    ..add(2557)
+    ..add(2558)
+    ..add(2559)
+    ..add(2560)
+    ..add(2561)
+    ..add(2562)
+    ..add(2563)
+    ..add(2564)
+    ..add(2565)
+    ..add(2566)
+    ..add(2567)
+    ..add(2568)
+    ..add(2569)
+    ..add(2570)
+    ..add(2571)
+    ..add(2572)
+    ..add(2573)
+    ..add(2574)
+    ..add(2575)
+    ..add(2576)
+    ..add(2577)
+    ..add(2578)
+    ..add(2579)
+    ..add(2580)
+    ..add(2581)
+    ..add(2582)
+    ..add(2583)
+    ..add(2584)
+    ..add(2585)
+    ..add(2586)
+    ..add(2587)
+    ..add(2588)
+    ..add(2589)
+    ..add(2590)
+    ..add(2591)
+    ..add(2592)
+    ..add(2593)
+    ..add(2594)
+    ..add(2595)
+    ..add(2596)
+    ..add(2597)
+    ..add(2598)
+    ..add(2599)
+    ..add(2600)
+    ..add(2601)
+    ..add(2602)
+    ..add(2603)
+    ..add(2604)
+    ..add(2605)
+    ..add(2606)
+    ..add(2607)
+    ..add(2608)
+    ..add(2609)
+    ..add(2610)
+    ..add(2611)
+    ..add(2612)
+    ..add(2613)
+    ..add(2614)
+    ..add(2615)
+    ..add(2616)
+    ..add(2617)
+    ..add(2618)
+    ..add(2619)
+    ..add(2620)
+    ..add(2621)
+    ..add(2622)
+    ..add(2623)
+    ..add(2624)
+    ..add(2625)
+    ..add(2626)
+    ..add(2627)
+    ..add(2628)
+    ..add(2629)
+    ..add(2630)
+    ..add(2631)
+    ..add(2632)
+    ..add(2633)
+    ..add(2634)
+    ..add(2635)
+    ..add(2636)
+    ..add(2637)
+    ..add(2638)
+    ..add(2639)
+    ..add(2640)
+    ..add(2641)
+    ..add(2642)
+    ..add(2643)
+    ..add(2644)
+    ..add(2645)
+    ..add(2646)
+    ..add(2647)
+    ..add(2648)
+    ..add(2649)
+    ..add(2650)
+    ..add(2651)
+    ..add(2652)
+    ..add(2653)
+    ..add(2654)
+    ..add(2655)
+    ..add(2656)
+    ..add(2657)
+    ..add(2658)
+    ..add(2659)
+    ..add(2660)
+    ..add(2661)
+    ..add(2662)
+    ..add(2663)
+    ..add(2664)
+    ..add(2665)
+    ..add(2666)
+    ..add(2667)
+    ..add(2668)
+    ..add(2669)
+    ..add(2670)
+    ..add(2671)
+    ..add(2672)
+    ..add(2673)
+    ..add(2674)
+    ..add(2675)
+    ..add(2676)
+    ..add(2677)
+    ..add(2678)
+    ..add(2679)
+    ..add(2680)
+    ..add(2681)
+    ..add(2682)
+    ..add(2683)
+    ..add(2684)
+    ..add(2685)
+    ..add(2686)
+    ..add(2687)
+    ..add(2688)
+    ..add(2689)
+    ..add(2690)
+    ..add(2691)
+    ..add(2692)
+    ..add(2693)
+    ..add(2694)
+    ..add(2695)
+    ..add(2696)
+    ..add(2697)
+    ..add(2698)
+    ..add(2699)
+    ..add(2700)
+    ..add(2701)
+    ..add(2702)
+    ..add(2703)
+    ..add(2704)
+    ..add(2705)
+    ..add(2706)
+    ..add(2707)
+    ..add(2708)
+    ..add(2709)
+    ..add(2710)
+    ..add(2711)
+    ..add(2712)
+    ..add(2713)
+    ..add(2714)
+    ..add(2715)
+    ..add(2716)
+    ..add(2717)
+    ..add(2718)
+    ..add(2719)
+    ..add(2720)
+    ..add(2721)
+    ..add(2722)
+    ..add(2723)
+    ..add(2724)
+    ..add(2725)
+    ..add(2726)
+    ..add(2727)
+    ..add(2728)
+    ..add(2729)
+    ..add(2730)
+    ..add(2731)
+    ..add(2732)
+    ..add(2733)
+    ..add(2734)
+    ..add(2735)
+    ..add(2736)
+    ..add(2737)
+    ..add(2738)
+    ..add(2739)
+    ..add(2740)
+    ..add(2741)
+    ..add(2742)
+    ..add(2743)
+    ..add(2744)
+    ..add(2745)
+    ..add(2746)
+    ..add(2747)
+    ..add(2748)
+    ..add(2749)
+    ..add(2750)
+    ..add(2751)
+    ..add(2752)
+    ..add(2753)
+    ..add(2754)
+    ..add(2755)
+    ..add(2756)
+    ..add(2757)
+    ..add(2758)
+    ..add(2759)
+    ..add(2760)
+    ..add(2761)
+    ..add(2762)
+    ..add(2763)
+    ..add(2764)
+    ..add(2765)
+    ..add(2766)
+    ..add(2767)
+    ..add(2768)
+    ..add(2769)
+    ..add(2770)
+    ..add(2771)
+    ..add(2772)
+    ..add(2773)
+    ..add(2774)
+    ..add(2775)
+    ..add(2776)
+    ..add(2777)
+    ..add(2778)
+    ..add(2779)
+    ..add(2780)
+    ..add(2781)
+    ..add(2782)
+    ..add(2783)
+    ..add(2784)
+    ..add(2785)
+    ..add(2786)
+    ..add(2787)
+    ..add(2788)
+    ..add(2789)
+    ..add(2790)
+    ..add(2791)
+    ..add(2792)
+    ..add(2793)
+    ..add(2794)
+    ..add(2795)
+    ..add(2796)
+    ..add(2797)
+    ..add(2798)
+    ..add(2799)
+    ..add(2800)
+    ..add(2801)
+    ..add(2802)
+    ..add(2803)
+    ..add(2804)
+    ..add(2805)
+    ..add(2806)
+    ..add(2807)
+    ..add(2808)
+    ..add(2809)
+    ..add(2810)
+    ..add(2811)
+    ..add(2812)
+    ..add(2813)
+    ..add(2814)
+    ..add(2815)
+    ..add(2816)
+    ..add(2817)
+    ..add(2818)
+    ..add(2819)
+    ..add(2820)
+    ..add(2821)
+    ..add(2822)
+    ..add(2823)
+    ..add(2824)
+    ..add(2825)
+    ..add(2826)
+    ..add(2827)
+    ..add(2828)
+    ..add(2829)
+    ..add(2830)
+    ..add(2831)
+    ..add(2832)
+    ..add(2833)
+    ..add(2834)
+    ..add(2835)
+    ..add(2836)
+    ..add(2837)
+    ..add(2838)
+    ..add(2839)
+    ..add(2840)
+    ..add(2841)
+    ..add(2842)
+    ..add(2843)
+    ..add(2844)
+    ..add(2845)
+    ..add(2846)
+    ..add(2847)
+    ..add(2848)
+    ..add(2849)
+    ..add(2850)
+    ..add(2851)
+    ..add(2852)
+    ..add(2853)
+    ..add(2854)
+    ..add(2855)
+    ..add(2856)
+    ..add(2857)
+    ..add(2858)
+    ..add(2859)
+    ..add(2860)
+    ..add(2861)
+    ..add(2862)
+    ..add(2863)
+    ..add(2864)
+    ..add(2865)
+    ..add(2866)
+    ..add(2867)
+    ..add(2868)
+    ..add(2869)
+    ..add(2870)
+    ..add(2871)
+    ..add(2872)
+    ..add(2873)
+    ..add(2874)
+    ..add(2875)
+    ..add(2876)
+    ..add(2877)
+    ..add(2878)
+    ..add(2879)
+    ..add(2880)
+    ..add(2881)
+    ..add(2882)
+    ..add(2883)
+    ..add(2884)
+    ..add(2885)
+    ..add(2886)
+    ..add(2887)
+    ..add(2888)
+    ..add(2889)
+    ..add(2890)
+    ..add(2891)
+    ..add(2892)
+    ..add(2893)
+    ..add(2894)
+    ..add(2895)
+    ..add(2896)
+    ..add(2897)
+    ..add(2898)
+    ..add(2899)
+    ..add(2900)
+    ..add(2901)
+    ..add(2902)
+    ..add(2903)
+    ..add(2904)
+    ..add(2905)
+    ..add(2906)
+    ..add(2907)
+    ..add(2908)
+    ..add(2909)
+    ..add(2910)
+    ..add(2911)
+    ..add(2912)
+    ..add(2913)
+    ..add(2914)
+    ..add(2915)
+    ..add(2916)
+    ..add(2917)
+    ..add(2918)
+    ..add(2919)
+    ..add(2920)
+    ..add(2921)
+    ..add(2922)
+    ..add(2923)
+    ..add(2924)
+    ..add(2925)
+    ..add(2926)
+    ..add(2927)
+    ..add(2928)
+    ..add(2929)
+    ..add(2930)
+    ..add(2931)
+    ..add(2932)
+    ..add(2933)
+    ..add(2934)
+    ..add(2935)
+    ..add(2936)
+    ..add(2937)
+    ..add(2938)
+    ..add(2939)
+    ..add(2940)
+    ..add(2941)
+    ..add(2942)
+    ..add(2943)
+    ..add(2944)
+    ..add(2945)
+    ..add(2946)
+    ..add(2947)
+    ..add(2948)
+    ..add(2949)
+    ..add(2950)
+    ..add(2951)
+    ..add(2952)
+    ..add(2953)
+    ..add(2954)
+    ..add(2955)
+    ..add(2956)
+    ..add(2957)
+    ..add(2958)
+    ..add(2959)
+    ..add(2960)
+    ..add(2961)
+    ..add(2962)
+    ..add(2963)
+    ..add(2964)
+    ..add(2965)
+    ..add(2966)
+    ..add(2967)
+    ..add(2968)
+    ..add(2969)
+    ..add(2970)
+    ..add(2971)
+    ..add(2972)
+    ..add(2973)
+    ..add(2974)
+    ..add(2975)
+    ..add(2976)
+    ..add(2977)
+    ..add(2978)
+    ..add(2979)
+    ..add(2980)
+    ..add(2981)
+    ..add(2982)
+    ..add(2983)
+    ..add(2984)
+    ..add(2985)
+    ..add(2986)
+    ..add(2987)
+    ..add(2988)
+    ..add(2989)
+    ..add(2990)
+    ..add(2991)
+    ..add(2992)
+    ..add(2993)
+    ..add(2994)
+    ..add(2995)
+    ..add(2996)
+    ..add(2997)
+    ..add(2998)
+    ..add(2999)
+    ..add(3000)
+    ..add(3001)
+    ..add(3002)
+    ..add(3003)
+    ..add(3004)
+    ..add(3005)
+    ..add(3006)
+    ..add(3007)
+    ..add(3008)
+    ..add(3009)
+    ..add(3010)
+    ..add(3011)
+    ..add(3012)
+    ..add(3013)
+    ..add(3014)
+    ..add(3015)
+    ..add(3016)
+    ..add(3017)
+    ..add(3018)
+    ..add(3019)
+    ..add(3020)
+    ..add(3021)
+    ..add(3022)
+    ..add(3023)
+    ..add(3024)
+    ..add(3025)
+    ..add(3026)
+    ..add(3027)
+    ..add(3028)
+    ..add(3029)
+    ..add(3030)
+    ..add(3031)
+    ..add(3032)
+    ..add(3033)
+    ..add(3034)
+    ..add(3035)
+    ..add(3036)
+    ..add(3037)
+    ..add(3038)
+    ..add(3039)
+    ..add(3040)
+    ..add(3041)
+    ..add(3042)
+    ..add(3043)
+    ..add(3044)
+    ..add(3045)
+    ..add(3046)
+    ..add(3047)
+    ..add(3048)
+    ..add(3049)
+    ..add(3050)
+    ..add(3051)
+    ..add(3052)
+    ..add(3053)
+    ..add(3054)
+    ..add(3055)
+    ..add(3056)
+    ..add(3057)
+    ..add(3058)
+    ..add(3059)
+    ..add(3060)
+    ..add(3061)
+    ..add(3062)
+    ..add(3063)
+    ..add(3064)
+    ..add(3065)
+    ..add(3066)
+    ..add(3067)
+    ..add(3068)
+    ..add(3069)
+    ..add(3070)
+    ..add(3071)
+    ..add(3072)
+    ..add(3073)
+    ..add(3074)
+    ..add(3075)
+    ..add(3076)
+    ..add(3077)
+    ..add(3078)
+    ..add(3079)
+    ..add(3080)
+    ..add(3081)
+    ..add(3082)
+    ..add(3083)
+    ..add(3084)
+    ..add(3085)
+    ..add(3086)
+    ..add(3087)
+    ..add(3088)
+    ..add(3089)
+    ..add(3090)
+    ..add(3091)
+    ..add(3092)
+    ..add(3093)
+    ..add(3094)
+    ..add(3095)
+    ..add(3096)
+    ..add(3097)
+    ..add(3098)
+    ..add(3099)
+    ..add(3100)
+    ..add(3101)
+    ..add(3102)
+    ..add(3103)
+    ..add(3104)
+    ..add(3105)
+    ..add(3106)
+    ..add(3107)
+    ..add(3108)
+    ..add(3109)
+    ..add(3110)
+    ..add(3111)
+    ..add(3112)
+    ..add(3113)
+    ..add(3114)
+    ..add(3115)
+    ..add(3116)
+    ..add(3117)
+    ..add(3118)
+    ..add(3119)
+    ..add(3120)
+    ..add(3121)
+    ..add(3122)
+    ..add(3123)
+    ..add(3124)
+    ..add(3125)
+    ..add(3126)
+    ..add(3127)
+    ..add(3128)
+    ..add(3129)
+    ..add(3130)
+    ..add(3131)
+    ..add(3132)
+    ..add(3133)
+    ..add(3134)
+    ..add(3135)
+    ..add(3136)
+    ..add(3137)
+    ..add(3138)
+    ..add(3139)
+    ..add(3140)
+    ..add(3141)
+    ..add(3142)
+    ..add(3143)
+    ..add(3144)
+    ..add(3145)
+    ..add(3146)
+    ..add(3147)
+    ..add(3148)
+    ..add(3149)
+    ..add(3150)
+    ..add(3151)
+    ..add(3152)
+    ..add(3153)
+    ..add(3154)
+    ..add(3155)
+    ..add(3156)
+    ..add(3157)
+    ..add(3158)
+    ..add(3159)
+    ..add(3160)
+    ..add(3161)
+    ..add(3162)
+    ..add(3163)
+    ..add(3164)
+    ..add(3165)
+    ..add(3166)
+    ..add(3167)
+    ..add(3168)
+    ..add(3169)
+    ..add(3170)
+    ..add(3171)
+    ..add(3172)
+    ..add(3173)
+    ..add(3174)
+    ..add(3175)
+    ..add(3176)
+    ..add(3177)
+    ..add(3178)
+    ..add(3179)
+    ..add(3180)
+    ..add(3181)
+    ..add(3182)
+    ..add(3183)
+    ..add(3184)
+    ..add(3185)
+    ..add(3186)
+    ..add(3187)
+    ..add(3188)
+    ..add(3189)
+    ..add(3190)
+    ..add(3191)
+    ..add(3192)
+    ..add(3193)
+    ..add(3194)
+    ..add(3195)
+    ..add(3196)
+    ..add(3197)
+    ..add(3198)
+    ..add(3199)
+    ..add(3200)
+    ..add(3201)
+    ..add(3202)
+    ..add(3203)
+    ..add(3204)
+    ..add(3205)
+    ..add(3206)
+    ..add(3207)
+    ..add(3208)
+    ..add(3209)
+    ..add(3210)
+    ..add(3211)
+    ..add(3212)
+    ..add(3213)
+    ..add(3214)
+    ..add(3215)
+    ..add(3216)
+    ..add(3217)
+    ..add(3218)
+    ..add(3219)
+    ..add(3220)
+    ..add(3221)
+    ..add(3222)
+    ..add(3223)
+    ..add(3224)
+    ..add(3225)
+    ..add(3226)
+    ..add(3227)
+    ..add(3228)
+    ..add(3229)
+    ..add(3230)
+    ..add(3231)
+    ..add(3232)
+    ..add(3233)
+    ..add(3234)
+    ..add(3235)
+    ..add(3236)
+    ..add(3237)
+    ..add(3238)
+    ..add(3239)
+    ..add(3240)
+    ..add(3241)
+    ..add(3242)
+    ..add(3243)
+    ..add(3244)
+    ..add(3245)
+    ..add(3246)
+    ..add(3247)
+    ..add(3248)
+    ..add(3249)
+    ..add(3250)
+    ..add(3251)
+    ..add(3252)
+    ..add(3253)
+    ..add(3254)
+    ..add(3255)
+    ..add(3256)
+    ..add(3257)
+    ..add(3258)
+    ..add(3259)
+    ..add(3260)
+    ..add(3261)
+    ..add(3262)
+    ..add(3263)
+    ..add(3264)
+    ..add(3265)
+    ..add(3266)
+    ..add(3267)
+    ..add(3268)
+    ..add(3269)
+    ..add(3270)
+    ..add(3271)
+    ..add(3272)
+    ..add(3273)
+    ..add(3274)
+    ..add(3275)
+    ..add(3276)
+    ..add(3277)
+    ..add(3278)
+    ..add(3279)
+    ..add(3280)
+    ..add(3281)
+    ..add(3282)
+    ..add(3283)
+    ..add(3284)
+    ..add(3285)
+    ..add(3286)
+    ..add(3287)
+    ..add(3288)
+    ..add(3289)
+    ..add(3290)
+    ..add(3291)
+    ..add(3292)
+    ..add(3293)
+    ..add(3294)
+    ..add(3295)
+    ..add(3296)
+    ..add(3297)
+    ..add(3298)
+    ..add(3299)
+    ..add(3300)
+    ..add(3301)
+    ..add(3302)
+    ..add(3303)
+    ..add(3304)
+    ..add(3305)
+    ..add(3306)
+    ..add(3307)
+    ..add(3308)
+    ..add(3309)
+    ..add(3310)
+    ..add(3311)
+    ..add(3312)
+    ..add(3313)
+    ..add(3314)
+    ..add(3315)
+    ..add(3316)
+    ..add(3317)
+    ..add(3318)
+    ..add(3319)
+    ..add(3320)
+    ..add(3321)
+    ..add(3322)
+    ..add(3323)
+    ..add(3324)
+    ..add(3325)
+    ..add(3326)
+    ..add(3327)
+    ..add(3328)
+    ..add(3329)
+    ..add(3330)
+    ..add(3331)
+    ..add(3332)
+    ..add(3333)
+    ..add(3334)
+    ..add(3335)
+    ..add(3336)
+    ..add(3337)
+    ..add(3338)
+    ..add(3339)
+    ..add(3340)
+    ..add(3341)
+    ..add(3342)
+    ..add(3343)
+    ..add(3344)
+    ..add(3345)
+    ..add(3346)
+    ..add(3347)
+    ..add(3348)
+    ..add(3349)
+    ..add(3350)
+    ..add(3351)
+    ..add(3352)
+    ..add(3353)
+    ..add(3354)
+    ..add(3355)
+    ..add(3356)
+    ..add(3357)
+    ..add(3358)
+    ..add(3359)
+    ..add(3360)
+    ..add(3361)
+    ..add(3362)
+    ..add(3363)
+    ..add(3364)
+    ..add(3365)
+    ..add(3366)
+    ..add(3367)
+    ..add(3368)
+    ..add(3369)
+    ..add(3370)
+    ..add(3371)
+    ..add(3372)
+    ..add(3373)
+    ..add(3374)
+    ..add(3375)
+    ..add(3376)
+    ..add(3377)
+    ..add(3378)
+    ..add(3379)
+    ..add(3380)
+    ..add(3381)
+    ..add(3382)
+    ..add(3383)
+    ..add(3384)
+    ..add(3385)
+    ..add(3386)
+    ..add(3387)
+    ..add(3388)
+    ..add(3389)
+    ..add(3390)
+    ..add(3391)
+    ..add(3392)
+    ..add(3393)
+    ..add(3394)
+    ..add(3395)
+    ..add(3396)
+    ..add(3397)
+    ..add(3398)
+    ..add(3399)
+    ..add(3400)
+    ..add(3401)
+    ..add(3402)
+    ..add(3403)
+    ..add(3404)
+    ..add(3405)
+    ..add(3406)
+    ..add(3407)
+    ..add(3408)
+    ..add(3409)
+    ..add(3410)
+    ..add(3411)
+    ..add(3412)
+    ..add(3413)
+    ..add(3414)
+    ..add(3415)
+    ..add(3416)
+    ..add(3417)
+    ..add(3418)
+    ..add(3419)
+    ..add(3420)
+    ..add(3421)
+    ..add(3422)
+    ..add(3423)
+    ..add(3424)
+    ..add(3425)
+    ..add(3426)
+    ..add(3427)
+    ..add(3428)
+    ..add(3429)
+    ..add(3430)
+    ..add(3431)
+    ..add(3432)
+    ..add(3433)
+    ..add(3434)
+    ..add(3435)
+    ..add(3436)
+    ..add(3437)
+    ..add(3438)
+    ..add(3439)
+    ..add(3440)
+    ..add(3441)
+    ..add(3442)
+    ..add(3443)
+    ..add(3444)
+    ..add(3445)
+    ..add(3446)
+    ..add(3447)
+    ..add(3448)
+    ..add(3449)
+    ..add(3450)
+    ..add(3451)
+    ..add(3452)
+    ..add(3453)
+    ..add(3454)
+    ..add(3455)
+    ..add(3456)
+    ..add(3457)
+    ..add(3458)
+    ..add(3459)
+    ..add(3460)
+    ..add(3461)
+    ..add(3462)
+    ..add(3463)
+    ..add(3464)
+    ..add(3465)
+    ..add(3466)
+    ..add(3467)
+    ..add(3468)
+    ..add(3469)
+    ..add(3470)
+    ..add(3471)
+    ..add(3472)
+    ..add(3473)
+    ..add(3474)
+    ..add(3475)
+    ..add(3476)
+    ..add(3477)
+    ..add(3478)
+    ..add(3479)
+    ..add(3480)
+    ..add(3481)
+    ..add(3482)
+    ..add(3483)
+    ..add(3484)
+    ..add(3485)
+    ..add(3486)
+    ..add(3487)
+    ..add(3488)
+    ..add(3489)
+    ..add(3490)
+    ..add(3491)
+    ..add(3492)
+    ..add(3493)
+    ..add(3494)
+    ..add(3495)
+    ..add(3496)
+    ..add(3497)
+    ..add(3498)
+    ..add(3499)
+    ..add(3500)
+    ..add(3501)
+    ..add(3502)
+    ..add(3503)
+    ..add(3504)
+    ..add(3505)
+    ..add(3506)
+    ..add(3507)
+    ..add(3508)
+    ..add(3509)
+    ..add(3510)
+    ..add(3511)
+    ..add(3512)
+    ..add(3513)
+    ..add(3514)
+    ..add(3515)
+    ..add(3516)
+    ..add(3517)
+    ..add(3518)
+    ..add(3519)
+    ..add(3520)
+    ..add(3521)
+    ..add(3522)
+    ..add(3523)
+    ..add(3524)
+    ..add(3525)
+    ..add(3526)
+    ..add(3527)
+    ..add(3528)
+    ..add(3529)
+    ..add(3530)
+    ..add(3531)
+    ..add(3532)
+    ..add(3533)
+    ..add(3534)
+    ..add(3535)
+    ..add(3536)
+    ..add(3537)
+    ..add(3538)
+    ..add(3539)
+    ..add(3540)
+    ..add(3541)
+    ..add(3542)
+    ..add(3543)
+    ..add(3544)
+    ..add(3545)
+    ..add(3546)
+    ..add(3547)
+    ..add(3548)
+    ..add(3549)
+    ..add(3550)
+    ..add(3551)
+    ..add(3552)
+    ..add(3553)
+    ..add(3554)
+    ..add(3555)
+    ..add(3556)
+    ..add(3557)
+    ..add(3558)
+    ..add(3559)
+    ..add(3560)
+    ..add(3561)
+    ..add(3562)
+    ..add(3563)
+    ..add(3564)
+    ..add(3565)
+    ..add(3566)
+    ..add(3567)
+    ..add(3568)
+    ..add(3569)
+    ..add(3570)
+    ..add(3571)
+    ..add(3572)
+    ..add(3573)
+    ..add(3574)
+    ..add(3575)
+    ..add(3576)
+    ..add(3577)
+    ..add(3578)
+    ..add(3579)
+    ..add(3580)
+    ..add(3581)
+    ..add(3582)
+    ..add(3583)
+    ..add(3584)
+    ..add(3585)
+    ..add(3586)
+    ..add(3587)
+    ..add(3588)
+    ..add(3589)
+    ..add(3590)
+    ..add(3591)
+    ..add(3592)
+    ..add(3593)
+    ..add(3594)
+    ..add(3595)
+    ..add(3596)
+    ..add(3597)
+    ..add(3598)
+    ..add(3599)
+    ..add(3600)
+    ..add(3601)
+    ..add(3602)
+    ..add(3603)
+    ..add(3604)
+    ..add(3605)
+    ..add(3606)
+    ..add(3607)
+    ..add(3608)
+    ..add(3609)
+    ..add(3610)
+    ..add(3611)
+    ..add(3612)
+    ..add(3613)
+    ..add(3614)
+    ..add(3615)
+    ..add(3616)
+    ..add(3617)
+    ..add(3618)
+    ..add(3619)
+    ..add(3620)
+    ..add(3621)
+    ..add(3622)
+    ..add(3623)
+    ..add(3624)
+    ..add(3625)
+    ..add(3626)
+    ..add(3627)
+    ..add(3628)
+    ..add(3629)
+    ..add(3630)
+    ..add(3631)
+    ..add(3632)
+    ..add(3633)
+    ..add(3634)
+    ..add(3635)
+    ..add(3636)
+    ..add(3637)
+    ..add(3638)
+    ..add(3639)
+    ..add(3640)
+    ..add(3641)
+    ..add(3642)
+    ..add(3643)
+    ..add(3644)
+    ..add(3645)
+    ..add(3646)
+    ..add(3647)
+    ..add(3648)
+    ..add(3649)
+    ..add(3650)
+    ..add(3651)
+    ..add(3652)
+    ..add(3653)
+    ..add(3654)
+    ..add(3655)
+    ..add(3656)
+    ..add(3657)
+    ..add(3658)
+    ..add(3659)
+    ..add(3660)
+    ..add(3661)
+    ..add(3662)
+    ..add(3663)
+    ..add(3664)
+    ..add(3665)
+    ..add(3666)
+    ..add(3667)
+    ..add(3668)
+    ..add(3669)
+    ..add(3670)
+    ..add(3671)
+    ..add(3672)
+    ..add(3673)
+    ..add(3674)
+    ..add(3675)
+    ..add(3676)
+    ..add(3677)
+    ..add(3678)
+    ..add(3679)
+    ..add(3680)
+    ..add(3681)
+    ..add(3682)
+    ..add(3683)
+    ..add(3684)
+    ..add(3685)
+    ..add(3686)
+    ..add(3687)
+    ..add(3688)
+    ..add(3689)
+    ..add(3690)
+    ..add(3691)
+    ..add(3692)
+    ..add(3693)
+    ..add(3694)
+    ..add(3695)
+    ..add(3696)
+    ..add(3697)
+    ..add(3698)
+    ..add(3699)
+    ..add(3700)
+    ..add(3701)
+    ..add(3702)
+    ..add(3703)
+    ..add(3704)
+    ..add(3705)
+    ..add(3706)
+    ..add(3707)
+    ..add(3708)
+    ..add(3709)
+    ..add(3710)
+    ..add(3711)
+    ..add(3712)
+    ..add(3713)
+    ..add(3714)
+    ..add(3715)
+    ..add(3716)
+    ..add(3717)
+    ..add(3718)
+    ..add(3719)
+    ..add(3720)
+    ..add(3721)
+    ..add(3722)
+    ..add(3723)
+    ..add(3724)
+    ..add(3725)
+    ..add(3726)
+    ..add(3727)
+    ..add(3728)
+    ..add(3729)
+    ..add(3730)
+    ..add(3731)
+    ..add(3732)
+    ..add(3733)
+    ..add(3734)
+    ..add(3735)
+    ..add(3736)
+    ..add(3737)
+    ..add(3738)
+    ..add(3739)
+    ..add(3740)
+    ..add(3741)
+    ..add(3742)
+    ..add(3743)
+    ..add(3744)
+    ..add(3745)
+    ..add(3746)
+    ..add(3747)
+    ..add(3748)
+    ..add(3749)
+    ..add(3750)
+    ..add(3751)
+    ..add(3752)
+    ..add(3753)
+    ..add(3754)
+    ..add(3755)
+    ..add(3756)
+    ..add(3757)
+    ..add(3758)
+    ..add(3759)
+    ..add(3760)
+    ..add(3761)
+    ..add(3762)
+    ..add(3763)
+    ..add(3764)
+    ..add(3765)
+    ..add(3766)
+    ..add(3767)
+    ..add(3768)
+    ..add(3769)
+    ..add(3770)
+    ..add(3771)
+    ..add(3772)
+    ..add(3773)
+    ..add(3774)
+    ..add(3775)
+    ..add(3776)
+    ..add(3777)
+    ..add(3778)
+    ..add(3779)
+    ..add(3780)
+    ..add(3781)
+    ..add(3782)
+    ..add(3783)
+    ..add(3784)
+    ..add(3785)
+    ..add(3786)
+    ..add(3787)
+    ..add(3788)
+    ..add(3789)
+    ..add(3790)
+    ..add(3791)
+    ..add(3792)
+    ..add(3793)
+    ..add(3794)
+    ..add(3795)
+    ..add(3796)
+    ..add(3797)
+    ..add(3798)
+    ..add(3799)
+    ..add(3800)
+    ..add(3801)
+    ..add(3802)
+    ..add(3803)
+    ..add(3804)
+    ..add(3805)
+    ..add(3806)
+    ..add(3807)
+    ..add(3808)
+    ..add(3809)
+    ..add(3810)
+    ..add(3811)
+    ..add(3812)
+    ..add(3813)
+    ..add(3814)
+    ..add(3815)
+    ..add(3816)
+    ..add(3817)
+    ..add(3818)
+    ..add(3819)
+    ..add(3820)
+    ..add(3821)
+    ..add(3822)
+    ..add(3823)
+    ..add(3824)
+    ..add(3825)
+    ..add(3826)
+    ..add(3827)
+    ..add(3828)
+    ..add(3829)
+    ..add(3830)
+    ..add(3831)
+    ..add(3832)
+    ..add(3833)
+    ..add(3834)
+    ..add(3835)
+    ..add(3836)
+    ..add(3837)
+    ..add(3838)
+    ..add(3839)
+    ..add(3840)
+    ..add(3841)
+    ..add(3842)
+    ..add(3843)
+    ..add(3844)
+    ..add(3845)
+    ..add(3846)
+    ..add(3847)
+    ..add(3848)
+    ..add(3849)
+    ..add(3850)
+    ..add(3851)
+    ..add(3852)
+    ..add(3853)
+    ..add(3854)
+    ..add(3855)
+    ..add(3856)
+    ..add(3857)
+    ..add(3858)
+    ..add(3859)
+    ..add(3860)
+    ..add(3861)
+    ..add(3862)
+    ..add(3863)
+    ..add(3864)
+    ..add(3865)
+    ..add(3866)
+    ..add(3867)
+    ..add(3868)
+    ..add(3869)
+    ..add(3870)
+    ..add(3871)
+    ..add(3872)
+    ..add(3873)
+    ..add(3874)
+    ..add(3875)
+    ..add(3876)
+    ..add(3877)
+    ..add(3878)
+    ..add(3879)
+    ..add(3880)
+    ..add(3881)
+    ..add(3882)
+    ..add(3883)
+    ..add(3884)
+    ..add(3885)
+    ..add(3886)
+    ..add(3887)
+    ..add(3888)
+    ..add(3889)
+    ..add(3890)
+    ..add(3891)
+    ..add(3892)
+    ..add(3893)
+    ..add(3894)
+    ..add(3895)
+    ..add(3896)
+    ..add(3897)
+    ..add(3898)
+    ..add(3899)
+    ..add(3900)
+    ..add(3901)
+    ..add(3902)
+    ..add(3903)
+    ..add(3904)
+    ..add(3905)
+    ..add(3906)
+    ..add(3907)
+    ..add(3908)
+    ..add(3909)
+    ..add(3910)
+    ..add(3911)
+    ..add(3912)
+    ..add(3913)
+    ..add(3914)
+    ..add(3915)
+    ..add(3916)
+    ..add(3917)
+    ..add(3918)
+    ..add(3919)
+    ..add(3920)
+    ..add(3921)
+    ..add(3922)
+    ..add(3923)
+    ..add(3924)
+    ..add(3925)
+    ..add(3926)
+    ..add(3927)
+    ..add(3928)
+    ..add(3929)
+    ..add(3930)
+    ..add(3931)
+    ..add(3932)
+    ..add(3933)
+    ..add(3934)
+    ..add(3935)
+    ..add(3936)
+    ..add(3937)
+    ..add(3938)
+    ..add(3939)
+    ..add(3940)
+    ..add(3941)
+    ..add(3942)
+    ..add(3943)
+    ..add(3944)
+    ..add(3945)
+    ..add(3946)
+    ..add(3947)
+    ..add(3948)
+    ..add(3949)
+    ..add(3950)
+    ..add(3951)
+    ..add(3952)
+    ..add(3953)
+    ..add(3954)
+    ..add(3955)
+    ..add(3956)
+    ..add(3957)
+    ..add(3958)
+    ..add(3959)
+    ..add(3960)
+    ..add(3961)
+    ..add(3962)
+    ..add(3963)
+    ..add(3964)
+    ..add(3965)
+    ..add(3966)
+    ..add(3967)
+    ..add(3968)
+    ..add(3969)
+    ..add(3970)
+    ..add(3971)
+    ..add(3972)
+    ..add(3973)
+    ..add(3974)
+    ..add(3975)
+    ..add(3976)
+    ..add(3977)
+    ..add(3978)
+    ..add(3979)
+    ..add(3980)
+    ..add(3981)
+    ..add(3982)
+    ..add(3983)
+    ..add(3984)
+    ..add(3985)
+    ..add(3986)
+    ..add(3987)
+    ..add(3988)
+    ..add(3989)
+    ..add(3990)
+    ..add(3991)
+    ..add(3992)
+    ..add(3993)
+    ..add(3994)
+    ..add(3995)
+    ..add(3996)
+    ..add(3997)
+    ..add(3998)
+    ..add(3999)
+    ..add(4000)
+    ..add(4001)
+    ..add(4002)
+    ..add(4003)
+    ..add(4004)
+    ..add(4005)
+    ..add(4006)
+    ..add(4007)
+    ..add(4008)
+    ..add(4009)
+    ..add(4010)
+    ..add(4011)
+    ..add(4012)
+    ..add(4013)
+    ..add(4014)
+    ..add(4015)
+    ..add(4016)
+    ..add(4017)
+    ..add(4018)
+    ..add(4019)
+    ..add(4020)
+    ..add(4021)
+    ..add(4022)
+    ..add(4023)
+    ..add(4024)
+    ..add(4025)
+    ..add(4026)
+    ..add(4027)
+    ..add(4028)
+    ..add(4029)
+    ..add(4030)
+    ..add(4031)
+    ..add(4032)
+    ..add(4033)
+    ..add(4034)
+    ..add(4035)
+    ..add(4036)
+    ..add(4037)
+    ..add(4038)
+    ..add(4039)
+    ..add(4040)
+    ..add(4041)
+    ..add(4042)
+    ..add(4043)
+    ..add(4044)
+    ..add(4045)
+    ..add(4046)
+    ..add(4047)
+    ..add(4048)
+    ..add(4049)
+    ..add(4050)
+    ..add(4051)
+    ..add(4052)
+    ..add(4053)
+    ..add(4054)
+    ..add(4055)
+    ..add(4056)
+    ..add(4057)
+    ..add(4058)
+    ..add(4059)
+    ..add(4060)
+    ..add(4061)
+    ..add(4062)
+    ..add(4063)
+    ..add(4064)
+    ..add(4065)
+    ..add(4066)
+    ..add(4067)
+    ..add(4068)
+    ..add(4069)
+    ..add(4070)
+    ..add(4071)
+    ..add(4072)
+    ..add(4073)
+    ..add(4074)
+    ..add(4075)
+    ..add(4076)
+    ..add(4077)
+    ..add(4078)
+    ..add(4079)
+    ..add(4080)
+    ..add(4081)
+    ..add(4082)
+    ..add(4083)
+    ..add(4084)
+    ..add(4085)
+    ..add(4086)
+    ..add(4087)
+    ..add(4088)
+    ..add(4089)
+    ..add(4090)
+    ..add(4091)
+    ..add(4092)
+    ..add(4093)
+    ..add(4094)
+    ..add(4095)
+    ..add(4096)
+    ..add(4097)
+    ..add(4098)
+    ..add(4099)
+    ..add(4100)
+    ..add(4101)
+    ..add(4102)
+    ..add(4103)
+    ..add(4104)
+    ..add(4105)
+    ..add(4106)
+    ..add(4107)
+    ..add(4108)
+    ..add(4109)
+    ..add(4110)
+    ..add(4111)
+    ..add(4112)
+    ..add(4113)
+    ..add(4114)
+    ..add(4115)
+    ..add(4116)
+    ..add(4117)
+    ..add(4118)
+    ..add(4119)
+    ..add(4120)
+    ..add(4121)
+    ..add(4122)
+    ..add(4123)
+    ..add(4124)
+    ..add(4125)
+    ..add(4126)
+    ..add(4127)
+    ..add(4128)
+    ..add(4129)
+    ..add(4130)
+    ..add(4131)
+    ..add(4132)
+    ..add(4133)
+    ..add(4134)
+    ..add(4135)
+    ..add(4136)
+    ..add(4137)
+    ..add(4138)
+    ..add(4139)
+    ..add(4140)
+    ..add(4141)
+    ..add(4142)
+    ..add(4143)
+    ..add(4144)
+    ..add(4145)
+    ..add(4146)
+    ..add(4147)
+    ..add(4148)
+    ..add(4149)
+    ..add(4150)
+    ..add(4151)
+    ..add(4152)
+    ..add(4153)
+    ..add(4154)
+    ..add(4155)
+    ..add(4156)
+    ..add(4157)
+    ..add(4158)
+    ..add(4159)
+    ..add(4160)
+    ..add(4161)
+    ..add(4162)
+    ..add(4163)
+    ..add(4164)
+    ..add(4165)
+    ..add(4166)
+    ..add(4167)
+    ..add(4168)
+    ..add(4169)
+    ..add(4170)
+    ..add(4171)
+    ..add(4172)
+    ..add(4173)
+    ..add(4174)
+    ..add(4175)
+    ..add(4176)
+    ..add(4177)
+    ..add(4178)
+    ..add(4179)
+    ..add(4180)
+    ..add(4181)
+    ..add(4182)
+    ..add(4183)
+    ..add(4184)
+    ..add(4185)
+    ..add(4186)
+    ..add(4187)
+    ..add(4188)
+    ..add(4189)
+    ..add(4190)
+    ..add(4191)
+    ..add(4192)
+    ..add(4193)
+    ..add(4194)
+    ..add(4195)
+    ..add(4196)
+    ..add(4197)
+    ..add(4198)
+    ..add(4199)
+    ..add(4200)
+    ..add(4201)
+    ..add(4202)
+    ..add(4203)
+    ..add(4204)
+    ..add(4205)
+    ..add(4206)
+    ..add(4207)
+    ..add(4208)
+    ..add(4209)
+    ..add(4210)
+    ..add(4211)
+    ..add(4212)
+    ..add(4213)
+    ..add(4214)
+    ..add(4215)
+    ..add(4216)
+    ..add(4217)
+    ..add(4218)
+    ..add(4219)
+    ..add(4220)
+    ..add(4221)
+    ..add(4222)
+    ..add(4223)
+    ..add(4224)
+    ..add(4225)
+    ..add(4226)
+    ..add(4227)
+    ..add(4228)
+    ..add(4229)
+    ..add(4230)
+    ..add(4231)
+    ..add(4232)
+    ..add(4233)
+    ..add(4234)
+    ..add(4235)
+    ..add(4236)
+    ..add(4237)
+    ..add(4238)
+    ..add(4239)
+    ..add(4240)
+    ..add(4241)
+    ..add(4242)
+    ..add(4243)
+    ..add(4244)
+    ..add(4245)
+    ..add(4246)
+    ..add(4247)
+    ..add(4248)
+    ..add(4249)
+    ..add(4250)
+    ..add(4251)
+    ..add(4252)
+    ..add(4253)
+    ..add(4254)
+    ..add(4255)
+    ..add(4256)
+    ..add(4257)
+    ..add(4258)
+    ..add(4259)
+    ..add(4260)
+    ..add(4261)
+    ..add(4262)
+    ..add(4263)
+    ..add(4264)
+    ..add(4265)
+    ..add(4266)
+    ..add(4267)
+    ..add(4268)
+    ..add(4269)
+    ..add(4270)
+    ..add(4271)
+    ..add(4272)
+    ..add(4273)
+    ..add(4274)
+    ..add(4275)
+    ..add(4276)
+    ..add(4277)
+    ..add(4278)
+    ..add(4279)
+    ..add(4280)
+    ..add(4281)
+    ..add(4282)
+    ..add(4283)
+    ..add(4284)
+    ..add(4285)
+    ..add(4286)
+    ..add(4287)
+    ..add(4288)
+    ..add(4289)
+    ..add(4290)
+    ..add(4291)
+    ..add(4292)
+    ..add(4293)
+    ..add(4294)
+    ..add(4295)
+    ..add(4296)
+    ..add(4297)
+    ..add(4298)
+    ..add(4299)
+    ..add(4300)
+    ..add(4301)
+    ..add(4302)
+    ..add(4303)
+    ..add(4304)
+    ..add(4305)
+    ..add(4306)
+    ..add(4307)
+    ..add(4308)
+    ..add(4309)
+    ..add(4310)
+    ..add(4311)
+    ..add(4312)
+    ..add(4313)
+    ..add(4314)
+    ..add(4315)
+    ..add(4316)
+    ..add(4317)
+    ..add(4318)
+    ..add(4319)
+    ..add(4320)
+    ..add(4321)
+    ..add(4322)
+    ..add(4323)
+    ..add(4324)
+    ..add(4325)
+    ..add(4326)
+    ..add(4327)
+    ..add(4328)
+    ..add(4329)
+    ..add(4330)
+    ..add(4331)
+    ..add(4332)
+    ..add(4333)
+    ..add(4334)
+    ..add(4335)
+    ..add(4336)
+    ..add(4337)
+    ..add(4338)
+    ..add(4339)
+    ..add(4340)
+    ..add(4341)
+    ..add(4342)
+    ..add(4343)
+    ..add(4344)
+    ..add(4345)
+    ..add(4346)
+    ..add(4347)
+    ..add(4348)
+    ..add(4349)
+    ..add(4350)
+    ..add(4351)
+    ..add(4352)
+    ..add(4353)
+    ..add(4354)
+    ..add(4355)
+    ..add(4356)
+    ..add(4357)
+    ..add(4358)
+    ..add(4359)
+    ..add(4360)
+    ..add(4361)
+    ..add(4362)
+    ..add(4363)
+    ..add(4364)
+    ..add(4365)
+    ..add(4366)
+    ..add(4367)
+    ..add(4368)
+    ..add(4369)
+    ..add(4370)
+    ..add(4371)
+    ..add(4372)
+    ..add(4373)
+    ..add(4374)
+    ..add(4375)
+    ..add(4376)
+    ..add(4377)
+    ..add(4378)
+    ..add(4379)
+    ..add(4380)
+    ..add(4381)
+    ..add(4382)
+    ..add(4383)
+    ..add(4384)
+    ..add(4385)
+    ..add(4386)
+    ..add(4387)
+    ..add(4388)
+    ..add(4389)
+    ..add(4390)
+    ..add(4391)
+    ..add(4392)
+    ..add(4393)
+    ..add(4394)
+    ..add(4395)
+    ..add(4396)
+    ..add(4397)
+    ..add(4398)
+    ..add(4399)
+    ..add(4400)
+    ..add(4401)
+    ..add(4402)
+    ..add(4403)
+    ..add(4404)
+    ..add(4405)
+    ..add(4406)
+    ..add(4407)
+    ..add(4408)
+    ..add(4409)
+    ..add(4410)
+    ..add(4411)
+    ..add(4412)
+    ..add(4413)
+    ..add(4414)
+    ..add(4415)
+    ..add(4416)
+    ..add(4417)
+    ..add(4418)
+    ..add(4419)
+    ..add(4420)
+    ..add(4421)
+    ..add(4422)
+    ..add(4423)
+    ..add(4424)
+    ..add(4425)
+    ..add(4426)
+    ..add(4427)
+    ..add(4428)
+    ..add(4429)
+    ..add(4430)
+    ..add(4431)
+    ..add(4432)
+    ..add(4433)
+    ..add(4434)
+    ..add(4435)
+    ..add(4436)
+    ..add(4437)
+    ..add(4438)
+    ..add(4439)
+    ..add(4440)
+    ..add(4441)
+    ..add(4442)
+    ..add(4443)
+    ..add(4444)
+    ..add(4445)
+    ..add(4446)
+    ..add(4447)
+    ..add(4448)
+    ..add(4449)
+    ..add(4450)
+    ..add(4451)
+    ..add(4452)
+    ..add(4453)
+    ..add(4454)
+    ..add(4455)
+    ..add(4456)
+    ..add(4457)
+    ..add(4458)
+    ..add(4459)
+    ..add(4460)
+    ..add(4461)
+    ..add(4462)
+    ..add(4463)
+    ..add(4464)
+    ..add(4465)
+    ..add(4466)
+    ..add(4467)
+    ..add(4468)
+    ..add(4469)
+    ..add(4470)
+    ..add(4471)
+    ..add(4472)
+    ..add(4473)
+    ..add(4474)
+    ..add(4475)
+    ..add(4476)
+    ..add(4477)
+    ..add(4478)
+    ..add(4479)
+    ..add(4480)
+    ..add(4481)
+    ..add(4482)
+    ..add(4483)
+    ..add(4484)
+    ..add(4485)
+    ..add(4486)
+    ..add(4487)
+    ..add(4488)
+    ..add(4489)
+    ..add(4490)
+    ..add(4491)
+    ..add(4492)
+    ..add(4493)
+    ..add(4494)
+    ..add(4495)
+    ..add(4496)
+    ..add(4497)
+    ..add(4498)
+    ..add(4499)
+    ..add(4500)
+    ..add(4501)
+    ..add(4502)
+    ..add(4503)
+    ..add(4504)
+    ..add(4505)
+    ..add(4506)
+    ..add(4507)
+    ..add(4508)
+    ..add(4509)
+    ..add(4510)
+    ..add(4511)
+    ..add(4512)
+    ..add(4513)
+    ..add(4514)
+    ..add(4515)
+    ..add(4516)
+    ..add(4517)
+    ..add(4518)
+    ..add(4519)
+    ..add(4520)
+    ..add(4521)
+    ..add(4522)
+    ..add(4523)
+    ..add(4524)
+    ..add(4525)
+    ..add(4526)
+    ..add(4527)
+    ..add(4528)
+    ..add(4529)
+    ..add(4530)
+    ..add(4531)
+    ..add(4532)
+    ..add(4533)
+    ..add(4534)
+    ..add(4535)
+    ..add(4536)
+    ..add(4537)
+    ..add(4538)
+    ..add(4539)
+    ..add(4540)
+    ..add(4541)
+    ..add(4542)
+    ..add(4543)
+    ..add(4544)
+    ..add(4545)
+    ..add(4546)
+    ..add(4547)
+    ..add(4548)
+    ..add(4549)
+    ..add(4550)
+    ..add(4551)
+    ..add(4552)
+    ..add(4553)
+    ..add(4554)
+    ..add(4555)
+    ..add(4556)
+    ..add(4557)
+    ..add(4558)
+    ..add(4559)
+    ..add(4560)
+    ..add(4561)
+    ..add(4562)
+    ..add(4563)
+    ..add(4564)
+    ..add(4565)
+    ..add(4566)
+    ..add(4567)
+    ..add(4568)
+    ..add(4569)
+    ..add(4570)
+    ..add(4571)
+    ..add(4572)
+    ..add(4573)
+    ..add(4574)
+    ..add(4575)
+    ..add(4576)
+    ..add(4577)
+    ..add(4578)
+    ..add(4579)
+    ..add(4580)
+    ..add(4581)
+    ..add(4582)
+    ..add(4583)
+    ..add(4584)
+    ..add(4585)
+    ..add(4586)
+    ..add(4587)
+    ..add(4588)
+    ..add(4589)
+    ..add(4590)
+    ..add(4591)
+    ..add(4592)
+    ..add(4593)
+    ..add(4594)
+    ..add(4595)
+    ..add(4596)
+    ..add(4597)
+    ..add(4598)
+    ..add(4599)
+    ..add(4600)
+    ..add(4601)
+    ..add(4602)
+    ..add(4603)
+    ..add(4604)
+    ..add(4605)
+    ..add(4606)
+    ..add(4607)
+    ..add(4608)
+    ..add(4609)
+    ..add(4610)
+    ..add(4611)
+    ..add(4612)
+    ..add(4613)
+    ..add(4614)
+    ..add(4615)
+    ..add(4616)
+    ..add(4617)
+    ..add(4618)
+    ..add(4619)
+    ..add(4620)
+    ..add(4621)
+    ..add(4622)
+    ..add(4623)
+    ..add(4624)
+    ..add(4625)
+    ..add(4626)
+    ..add(4627)
+    ..add(4628)
+    ..add(4629)
+    ..add(4630)
+    ..add(4631)
+    ..add(4632)
+    ..add(4633)
+    ..add(4634)
+    ..add(4635)
+    ..add(4636)
+    ..add(4637)
+    ..add(4638)
+    ..add(4639)
+    ..add(4640)
+    ..add(4641)
+    ..add(4642)
+    ..add(4643)
+    ..add(4644)
+    ..add(4645)
+    ..add(4646)
+    ..add(4647)
+    ..add(4648)
+    ..add(4649)
+    ..add(4650)
+    ..add(4651)
+    ..add(4652)
+    ..add(4653)
+    ..add(4654)
+    ..add(4655)
+    ..add(4656)
+    ..add(4657)
+    ..add(4658)
+    ..add(4659)
+    ..add(4660)
+    ..add(4661)
+    ..add(4662)
+    ..add(4663)
+    ..add(4664)
+    ..add(4665)
+    ..add(4666)
+    ..add(4667)
+    ..add(4668)
+    ..add(4669)
+    ..add(4670)
+    ..add(4671)
+    ..add(4672)
+    ..add(4673)
+    ..add(4674)
+    ..add(4675)
+    ..add(4676)
+    ..add(4677)
+    ..add(4678)
+    ..add(4679)
+    ..add(4680)
+    ..add(4681)
+    ..add(4682)
+    ..add(4683)
+    ..add(4684)
+    ..add(4685)
+    ..add(4686)
+    ..add(4687)
+    ..add(4688)
+    ..add(4689)
+    ..add(4690)
+    ..add(4691)
+    ..add(4692)
+    ..add(4693)
+    ..add(4694)
+    ..add(4695)
+    ..add(4696)
+    ..add(4697)
+    ..add(4698)
+    ..add(4699)
+    ..add(4700)
+    ..add(4701)
+    ..add(4702)
+    ..add(4703)
+    ..add(4704)
+    ..add(4705)
+    ..add(4706)
+    ..add(4707)
+    ..add(4708)
+    ..add(4709)
+    ..add(4710)
+    ..add(4711)
+    ..add(4712)
+    ..add(4713)
+    ..add(4714)
+    ..add(4715)
+    ..add(4716)
+    ..add(4717)
+    ..add(4718)
+    ..add(4719)
+    ..add(4720)
+    ..add(4721)
+    ..add(4722)
+    ..add(4723)
+    ..add(4724)
+    ..add(4725)
+    ..add(4726)
+    ..add(4727)
+    ..add(4728)
+    ..add(4729)
+    ..add(4730)
+    ..add(4731)
+    ..add(4732)
+    ..add(4733)
+    ..add(4734)
+    ..add(4735)
+    ..add(4736)
+    ..add(4737)
+    ..add(4738)
+    ..add(4739)
+    ..add(4740)
+    ..add(4741)
+    ..add(4742)
+    ..add(4743)
+    ..add(4744)
+    ..add(4745)
+    ..add(4746)
+    ..add(4747)
+    ..add(4748)
+    ..add(4749)
+    ..add(4750)
+    ..add(4751)
+    ..add(4752)
+    ..add(4753)
+    ..add(4754)
+    ..add(4755)
+    ..add(4756)
+    ..add(4757)
+    ..add(4758)
+    ..add(4759)
+    ..add(4760)
+    ..add(4761)
+    ..add(4762)
+    ..add(4763)
+    ..add(4764)
+    ..add(4765)
+    ..add(4766)
+    ..add(4767)
+    ..add(4768)
+    ..add(4769)
+    ..add(4770)
+    ..add(4771)
+    ..add(4772)
+    ..add(4773)
+    ..add(4774)
+    ..add(4775)
+    ..add(4776)
+    ..add(4777)
+    ..add(4778)
+    ..add(4779)
+    ..add(4780)
+    ..add(4781)
+    ..add(4782)
+    ..add(4783)
+    ..add(4784)
+    ..add(4785)
+    ..add(4786)
+    ..add(4787)
+    ..add(4788)
+    ..add(4789)
+    ..add(4790)
+    ..add(4791)
+    ..add(4792)
+    ..add(4793)
+    ..add(4794)
+    ..add(4795)
+    ..add(4796)
+    ..add(4797)
+    ..add(4798)
+    ..add(4799)
+    ..add(4800)
+    ..add(4801)
+    ..add(4802)
+    ..add(4803)
+    ..add(4804)
+    ..add(4805)
+    ..add(4806)
+    ..add(4807)
+    ..add(4808)
+    ..add(4809)
+    ..add(4810)
+    ..add(4811)
+    ..add(4812)
+    ..add(4813)
+    ..add(4814)
+    ..add(4815)
+    ..add(4816)
+    ..add(4817)
+    ..add(4818)
+    ..add(4819)
+    ..add(4820)
+    ..add(4821)
+    ..add(4822)
+    ..add(4823)
+    ..add(4824)
+    ..add(4825)
+    ..add(4826)
+    ..add(4827)
+    ..add(4828)
+    ..add(4829)
+    ..add(4830)
+    ..add(4831)
+    ..add(4832)
+    ..add(4833)
+    ..add(4834)
+    ..add(4835)
+    ..add(4836)
+    ..add(4837)
+    ..add(4838)
+    ..add(4839)
+    ..add(4840)
+    ..add(4841)
+    ..add(4842)
+    ..add(4843)
+    ..add(4844)
+    ..add(4845)
+    ..add(4846)
+    ..add(4847)
+    ..add(4848)
+    ..add(4849)
+    ..add(4850)
+    ..add(4851)
+    ..add(4852)
+    ..add(4853)
+    ..add(4854)
+    ..add(4855)
+    ..add(4856)
+    ..add(4857)
+    ..add(4858)
+    ..add(4859)
+    ..add(4860)
+    ..add(4861)
+    ..add(4862)
+    ..add(4863)
+    ..add(4864)
+    ..add(4865)
+    ..add(4866)
+    ..add(4867)
+    ..add(4868)
+    ..add(4869)
+    ..add(4870)
+    ..add(4871)
+    ..add(4872)
+    ..add(4873)
+    ..add(4874)
+    ..add(4875)
+    ..add(4876)
+    ..add(4877)
+    ..add(4878)
+    ..add(4879)
+    ..add(4880)
+    ..add(4881)
+    ..add(4882)
+    ..add(4883)
+    ..add(4884)
+    ..add(4885)
+    ..add(4886)
+    ..add(4887)
+    ..add(4888)
+    ..add(4889)
+    ..add(4890)
+    ..add(4891)
+    ..add(4892)
+    ..add(4893)
+    ..add(4894)
+    ..add(4895)
+    ..add(4896)
+    ..add(4897)
+    ..add(4898)
+    ..add(4899)
+    ..add(4900)
+    ..add(4901)
+    ..add(4902)
+    ..add(4903)
+    ..add(4904)
+    ..add(4905)
+    ..add(4906)
+    ..add(4907)
+    ..add(4908)
+    ..add(4909)
+    ..add(4910)
+    ..add(4911)
+    ..add(4912)
+    ..add(4913)
+    ..add(4914)
+    ..add(4915)
+    ..add(4916)
+    ..add(4917)
+    ..add(4918)
+    ..add(4919)
+    ..add(4920)
+    ..add(4921)
+    ..add(4922)
+    ..add(4923)
+    ..add(4924)
+    ..add(4925)
+    ..add(4926)
+    ..add(4927)
+    ..add(4928)
+    ..add(4929)
+    ..add(4930)
+    ..add(4931)
+    ..add(4932)
+    ..add(4933)
+    ..add(4934)
+    ..add(4935)
+    ..add(4936)
+    ..add(4937)
+    ..add(4938)
+    ..add(4939)
+    ..add(4940)
+    ..add(4941)
+    ..add(4942)
+    ..add(4943)
+    ..add(4944)
+    ..add(4945)
+    ..add(4946)
+    ..add(4947)
+    ..add(4948)
+    ..add(4949)
+    ..add(4950)
+    ..add(4951)
+    ..add(4952)
+    ..add(4953)
+    ..add(4954)
+    ..add(4955)
+    ..add(4956)
+    ..add(4957)
+    ..add(4958)
+    ..add(4959)
+    ..add(4960)
+    ..add(4961)
+    ..add(4962)
+    ..add(4963)
+    ..add(4964)
+    ..add(4965)
+    ..add(4966)
+    ..add(4967)
+    ..add(4968)
+    ..add(4969)
+    ..add(4970)
+    ..add(4971)
+    ..add(4972)
+    ..add(4973)
+    ..add(4974)
+    ..add(4975)
+    ..add(4976)
+    ..add(4977)
+    ..add(4978)
+    ..add(4979)
+    ..add(4980)
+    ..add(4981)
+    ..add(4982)
+    ..add(4983)
+    ..add(4984)
+    ..add(4985)
+    ..add(4986)
+    ..add(4987)
+    ..add(4988)
+    ..add(4989)
+    ..add(4990)
+    ..add(4991)
+    ..add(4992)
+    ..add(4993)
+    ..add(4994)
+    ..add(4995)
+    ..add(4996)
+    ..add(4997)
+    ..add(4998)
+    ..add(4999)
+    ..add(5000)
+    ..add(5001)
+    ..add(5002)
+    ..add(5003)
+    ..add(5004)
+    ..add(5005)
+    ..add(5006)
+    ..add(5007)
+    ..add(5008)
+    ..add(5009)
+    ..add(5010)
+    ..add(5011)
+    ..add(5012)
+    ..add(5013)
+    ..add(5014)
+    ..add(5015)
+    ..add(5016)
+    ..add(5017)
+    ..add(5018)
+    ..add(5019)
+    ..add(5020)
+    ..add(5021)
+    ..add(5022)
+    ..add(5023)
+    ..add(5024)
+    ..add(5025)
+    ..add(5026)
+    ..add(5027)
+    ..add(5028)
+    ..add(5029)
+    ..add(5030)
+    ..add(5031)
+    ..add(5032)
+    ..add(5033)
+    ..add(5034)
+    ..add(5035)
+    ..add(5036)
+    ..add(5037)
+    ..add(5038)
+    ..add(5039)
+    ..add(5040)
+    ..add(5041)
+    ..add(5042)
+    ..add(5043)
+    ..add(5044)
+    ..add(5045)
+    ..add(5046)
+    ..add(5047)
+    ..add(5048)
+    ..add(5049)
+    ..add(5050)
+    ..add(5051)
+    ..add(5052)
+    ..add(5053)
+    ..add(5054)
+    ..add(5055)
+    ..add(5056)
+    ..add(5057)
+    ..add(5058)
+    ..add(5059)
+    ..add(5060)
+    ..add(5061)
+    ..add(5062)
+    ..add(5063)
+    ..add(5064)
+    ..add(5065)
+    ..add(5066)
+    ..add(5067)
+    ..add(5068)
+    ..add(5069)
+    ..add(5070)
+    ..add(5071)
+    ..add(5072)
+    ..add(5073)
+    ..add(5074)
+    ..add(5075)
+    ..add(5076)
+    ..add(5077)
+    ..add(5078)
+    ..add(5079)
+    ..add(5080)
+    ..add(5081)
+    ..add(5082)
+    ..add(5083)
+    ..add(5084)
+    ..add(5085)
+    ..add(5086)
+    ..add(5087)
+    ..add(5088)
+    ..add(5089)
+    ..add(5090)
+    ..add(5091)
+    ..add(5092)
+    ..add(5093)
+    ..add(5094)
+    ..add(5095)
+    ..add(5096)
+    ..add(5097)
+    ..add(5098)
+    ..add(5099)
+    ..add(5100)
+    ..add(5101)
+    ..add(5102)
+    ..add(5103)
+    ..add(5104)
+    ..add(5105)
+    ..add(5106)
+    ..add(5107)
+    ..add(5108)
+    ..add(5109)
+    ..add(5110)
+    ..add(5111)
+    ..add(5112)
+    ..add(5113)
+    ..add(5114)
+    ..add(5115)
+    ..add(5116)
+    ..add(5117)
+    ..add(5118)
+    ..add(5119)
+    ..add(5120)
+    ..add(5121)
+    ..add(5122)
+    ..add(5123)
+    ..add(5124)
+    ..add(5125)
+    ..add(5126)
+    ..add(5127)
+    ..add(5128)
+    ..add(5129)
+    ..add(5130)
+    ..add(5131)
+    ..add(5132)
+    ..add(5133)
+    ..add(5134)
+    ..add(5135)
+    ..add(5136)
+    ..add(5137)
+    ..add(5138)
+    ..add(5139)
+    ..add(5140)
+    ..add(5141)
+    ..add(5142)
+    ..add(5143)
+    ..add(5144)
+    ..add(5145)
+    ..add(5146)
+    ..add(5147)
+    ..add(5148)
+    ..add(5149)
+    ..add(5150)
+    ..add(5151)
+    ..add(5152)
+    ..add(5153)
+    ..add(5154)
+    ..add(5155)
+    ..add(5156)
+    ..add(5157)
+    ..add(5158)
+    ..add(5159)
+    ..add(5160)
+    ..add(5161)
+    ..add(5162)
+    ..add(5163)
+    ..add(5164)
+    ..add(5165)
+    ..add(5166)
+    ..add(5167)
+    ..add(5168)
+    ..add(5169)
+    ..add(5170)
+    ..add(5171)
+    ..add(5172)
+    ..add(5173)
+    ..add(5174)
+    ..add(5175)
+    ..add(5176)
+    ..add(5177)
+    ..add(5178)
+    ..add(5179)
+    ..add(5180)
+    ..add(5181)
+    ..add(5182)
+    ..add(5183)
+    ..add(5184)
+    ..add(5185)
+    ..add(5186)
+    ..add(5187)
+    ..add(5188)
+    ..add(5189)
+    ..add(5190)
+    ..add(5191)
+    ..add(5192)
+    ..add(5193)
+    ..add(5194)
+    ..add(5195)
+    ..add(5196)
+    ..add(5197)
+    ..add(5198)
+    ..add(5199)
+    ..add(5200)
+    ..add(5201)
+    ..add(5202)
+    ..add(5203)
+    ..add(5204)
+    ..add(5205)
+    ..add(5206)
+    ..add(5207)
+    ..add(5208)
+    ..add(5209)
+    ..add(5210)
+    ..add(5211)
+    ..add(5212)
+    ..add(5213)
+    ..add(5214)
+    ..add(5215)
+    ..add(5216)
+    ..add(5217)
+    ..add(5218)
+    ..add(5219)
+    ..add(5220)
+    ..add(5221)
+    ..add(5222)
+    ..add(5223)
+    ..add(5224)
+    ..add(5225)
+    ..add(5226)
+    ..add(5227)
+    ..add(5228)
+    ..add(5229)
+    ..add(5230)
+    ..add(5231)
+    ..add(5232)
+    ..add(5233)
+    ..add(5234)
+    ..add(5235)
+    ..add(5236)
+    ..add(5237)
+    ..add(5238)
+    ..add(5239)
+    ..add(5240)
+    ..add(5241)
+    ..add(5242)
+    ..add(5243)
+    ..add(5244)
+    ..add(5245)
+    ..add(5246)
+    ..add(5247)
+    ..add(5248)
+    ..add(5249)
+    ..add(5250)
+    ..add(5251)
+    ..add(5252)
+    ..add(5253)
+    ..add(5254)
+    ..add(5255)
+    ..add(5256)
+    ..add(5257)
+    ..add(5258)
+    ..add(5259)
+    ..add(5260)
+    ..add(5261)
+    ..add(5262)
+    ..add(5263)
+    ..add(5264)
+    ..add(5265)
+    ..add(5266)
+    ..add(5267)
+    ..add(5268)
+    ..add(5269)
+    ..add(5270)
+    ..add(5271)
+    ..add(5272)
+    ..add(5273)
+    ..add(5274)
+    ..add(5275)
+    ..add(5276)
+    ..add(5277)
+    ..add(5278)
+    ..add(5279)
+    ..add(5280)
+    ..add(5281)
+    ..add(5282)
+    ..add(5283)
+    ..add(5284)
+    ..add(5285)
+    ..add(5286)
+    ..add(5287)
+    ..add(5288)
+    ..add(5289)
+    ..add(5290)
+    ..add(5291)
+    ..add(5292)
+    ..add(5293)
+    ..add(5294)
+    ..add(5295)
+    ..add(5296)
+    ..add(5297)
+    ..add(5298)
+    ..add(5299)
+    ..add(5300)
+    ..add(5301)
+    ..add(5302)
+    ..add(5303)
+    ..add(5304)
+    ..add(5305)
+    ..add(5306)
+    ..add(5307)
+    ..add(5308)
+    ..add(5309)
+    ..add(5310)
+    ..add(5311)
+    ..add(5312)
+    ..add(5313)
+    ..add(5314)
+    ..add(5315)
+    ..add(5316)
+    ..add(5317)
+    ..add(5318)
+    ..add(5319)
+    ..add(5320)
+    ..add(5321)
+    ..add(5322)
+    ..add(5323)
+    ..add(5324)
+    ..add(5325)
+    ..add(5326)
+    ..add(5327)
+    ..add(5328)
+    ..add(5329)
+    ..add(5330)
+    ..add(5331)
+    ..add(5332)
+    ..add(5333)
+    ..add(5334)
+    ..add(5335)
+    ..add(5336)
+    ..add(5337)
+    ..add(5338)
+    ..add(5339)
+    ..add(5340)
+    ..add(5341)
+    ..add(5342)
+    ..add(5343)
+    ..add(5344)
+    ..add(5345)
+    ..add(5346)
+    ..add(5347)
+    ..add(5348)
+    ..add(5349)
+    ..add(5350)
+    ..add(5351)
+    ..add(5352)
+    ..add(5353)
+    ..add(5354)
+    ..add(5355)
+    ..add(5356)
+    ..add(5357)
+    ..add(5358)
+    ..add(5359)
+    ..add(5360)
+    ..add(5361)
+    ..add(5362)
+    ..add(5363)
+    ..add(5364)
+    ..add(5365)
+    ..add(5366)
+    ..add(5367)
+    ..add(5368)
+    ..add(5369)
+    ..add(5370)
+    ..add(5371)
+    ..add(5372)
+    ..add(5373)
+    ..add(5374)
+    ..add(5375)
+    ..add(5376)
+    ..add(5377)
+    ..add(5378)
+    ..add(5379)
+    ..add(5380)
+    ..add(5381)
+    ..add(5382)
+    ..add(5383)
+    ..add(5384)
+    ..add(5385)
+    ..add(5386)
+    ..add(5387)
+    ..add(5388)
+    ..add(5389)
+    ..add(5390)
+    ..add(5391)
+    ..add(5392)
+    ..add(5393)
+    ..add(5394)
+    ..add(5395)
+    ..add(5396)
+    ..add(5397)
+    ..add(5398)
+    ..add(5399)
+    ..add(5400)
+    ..add(5401)
+    ..add(5402)
+    ..add(5403)
+    ..add(5404)
+    ..add(5405)
+    ..add(5406)
+    ..add(5407)
+    ..add(5408)
+    ..add(5409)
+    ..add(5410)
+    ..add(5411)
+    ..add(5412)
+    ..add(5413)
+    ..add(5414)
+    ..add(5415)
+    ..add(5416)
+    ..add(5417)
+    ..add(5418)
+    ..add(5419)
+    ..add(5420)
+    ..add(5421)
+    ..add(5422)
+    ..add(5423)
+    ..add(5424)
+    ..add(5425)
+    ..add(5426)
+    ..add(5427)
+    ..add(5428)
+    ..add(5429)
+    ..add(5430)
+    ..add(5431)
+    ..add(5432)
+    ..add(5433)
+    ..add(5434)
+    ..add(5435)
+    ..add(5436)
+    ..add(5437)
+    ..add(5438)
+    ..add(5439)
+    ..add(5440)
+    ..add(5441)
+    ..add(5442)
+    ..add(5443)
+    ..add(5444)
+    ..add(5445)
+    ..add(5446)
+    ..add(5447)
+    ..add(5448)
+    ..add(5449)
+    ..add(5450)
+    ..add(5451)
+    ..add(5452)
+    ..add(5453)
+    ..add(5454)
+    ..add(5455)
+    ..add(5456)
+    ..add(5457)
+    ..add(5458)
+    ..add(5459)
+    ..add(5460)
+    ..add(5461)
+    ..add(5462)
+    ..add(5463)
+    ..add(5464)
+    ..add(5465)
+    ..add(5466)
+    ..add(5467)
+    ..add(5468)
+    ..add(5469)
+    ..add(5470)
+    ..add(5471)
+    ..add(5472)
+    ..add(5473)
+    ..add(5474)
+    ..add(5475)
+    ..add(5476)
+    ..add(5477)
+    ..add(5478)
+    ..add(5479)
+    ..add(5480)
+    ..add(5481)
+    ..add(5482)
+    ..add(5483)
+    ..add(5484)
+    ..add(5485)
+    ..add(5486)
+    ..add(5487)
+    ..add(5488)
+    ..add(5489)
+    ..add(5490)
+    ..add(5491)
+    ..add(5492)
+    ..add(5493)
+    ..add(5494)
+    ..add(5495)
+    ..add(5496)
+    ..add(5497)
+    ..add(5498)
+    ..add(5499)
+    ..add(5500)
+    ..add(5501)
+    ..add(5502)
+    ..add(5503)
+    ..add(5504)
+    ..add(5505)
+    ..add(5506)
+    ..add(5507)
+    ..add(5508)
+    ..add(5509)
+    ..add(5510)
+    ..add(5511)
+    ..add(5512)
+    ..add(5513)
+    ..add(5514)
+    ..add(5515)
+    ..add(5516)
+    ..add(5517)
+    ..add(5518)
+    ..add(5519)
+    ..add(5520)
+    ..add(5521)
+    ..add(5522)
+    ..add(5523)
+    ..add(5524)
+    ..add(5525)
+    ..add(5526)
+    ..add(5527)
+    ..add(5528)
+    ..add(5529)
+    ..add(5530)
+    ..add(5531)
+    ..add(5532)
+    ..add(5533)
+    ..add(5534)
+    ..add(5535)
+    ..add(5536)
+    ..add(5537)
+    ..add(5538)
+    ..add(5539)
+    ..add(5540)
+    ..add(5541)
+    ..add(5542)
+    ..add(5543)
+    ..add(5544)
+    ..add(5545)
+    ..add(5546)
+    ..add(5547)
+    ..add(5548)
+    ..add(5549)
+    ..add(5550)
+    ..add(5551)
+    ..add(5552)
+    ..add(5553)
+    ..add(5554)
+    ..add(5555)
+    ..add(5556)
+    ..add(5557)
+    ..add(5558)
+    ..add(5559)
+    ..add(5560)
+    ..add(5561)
+    ..add(5562)
+    ..add(5563)
+    ..add(5564)
+    ..add(5565)
+    ..add(5566)
+    ..add(5567)
+    ..add(5568)
+    ..add(5569)
+    ..add(5570)
+    ..add(5571)
+    ..add(5572)
+    ..add(5573)
+    ..add(5574)
+    ..add(5575)
+    ..add(5576)
+    ..add(5577)
+    ..add(5578)
+    ..add(5579)
+    ..add(5580)
+    ..add(5581)
+    ..add(5582)
+    ..add(5583)
+    ..add(5584)
+    ..add(5585)
+    ..add(5586)
+    ..add(5587)
+    ..add(5588)
+    ..add(5589)
+    ..add(5590)
+    ..add(5591)
+    ..add(5592)
+    ..add(5593)
+    ..add(5594)
+    ..add(5595)
+    ..add(5596)
+    ..add(5597)
+    ..add(5598)
+    ..add(5599)
+    ..add(5600)
+    ..add(5601)
+    ..add(5602)
+    ..add(5603)
+    ..add(5604)
+    ..add(5605)
+    ..add(5606)
+    ..add(5607)
+    ..add(5608)
+    ..add(5609)
+    ..add(5610)
+    ..add(5611)
+    ..add(5612)
+    ..add(5613)
+    ..add(5614)
+    ..add(5615)
+    ..add(5616)
+    ..add(5617)
+    ..add(5618)
+    ..add(5619)
+    ..add(5620)
+    ..add(5621)
+    ..add(5622)
+    ..add(5623)
+    ..add(5624)
+    ..add(5625)
+    ..add(5626)
+    ..add(5627)
+    ..add(5628)
+    ..add(5629)
+    ..add(5630)
+    ..add(5631)
+    ..add(5632)
+    ..add(5633)
+    ..add(5634)
+    ..add(5635)
+    ..add(5636)
+    ..add(5637)
+    ..add(5638)
+    ..add(5639)
+    ..add(5640)
+    ..add(5641)
+    ..add(5642)
+    ..add(5643)
+    ..add(5644)
+    ..add(5645)
+    ..add(5646)
+    ..add(5647)
+    ..add(5648)
+    ..add(5649)
+    ..add(5650)
+    ..add(5651)
+    ..add(5652)
+    ..add(5653)
+    ..add(5654)
+    ..add(5655)
+    ..add(5656)
+    ..add(5657)
+    ..add(5658)
+    ..add(5659)
+    ..add(5660)
+    ..add(5661)
+    ..add(5662)
+    ..add(5663)
+    ..add(5664)
+    ..add(5665)
+    ..add(5666)
+    ..add(5667)
+    ..add(5668)
+    ..add(5669)
+    ..add(5670)
+    ..add(5671)
+    ..add(5672)
+    ..add(5673)
+    ..add(5674)
+    ..add(5675)
+    ..add(5676)
+    ..add(5677)
+    ..add(5678)
+    ..add(5679)
+    ..add(5680)
+    ..add(5681)
+    ..add(5682)
+    ..add(5683)
+    ..add(5684)
+    ..add(5685)
+    ..add(5686)
+    ..add(5687)
+    ..add(5688)
+    ..add(5689)
+    ..add(5690)
+    ..add(5691)
+    ..add(5692)
+    ..add(5693)
+    ..add(5694)
+    ..add(5695)
+    ..add(5696)
+    ..add(5697)
+    ..add(5698)
+    ..add(5699)
+    ..add(5700)
+    ..add(5701)
+    ..add(5702)
+    ..add(5703)
+    ..add(5704)
+    ..add(5705)
+    ..add(5706)
+    ..add(5707)
+    ..add(5708)
+    ..add(5709)
+    ..add(5710)
+    ..add(5711)
+    ..add(5712)
+    ..add(5713)
+    ..add(5714)
+    ..add(5715)
+    ..add(5716)
+    ..add(5717)
+    ..add(5718)
+    ..add(5719)
+    ..add(5720)
+    ..add(5721)
+    ..add(5722)
+    ..add(5723)
+    ..add(5724)
+    ..add(5725)
+    ..add(5726)
+    ..add(5727)
+    ..add(5728)
+    ..add(5729)
+    ..add(5730)
+    ..add(5731)
+    ..add(5732)
+    ..add(5733)
+    ..add(5734)
+    ..add(5735)
+    ..add(5736)
+    ..add(5737)
+    ..add(5738)
+    ..add(5739)
+    ..add(5740)
+    ..add(5741)
+    ..add(5742)
+    ..add(5743)
+    ..add(5744)
+    ..add(5745)
+    ..add(5746)
+    ..add(5747)
+    ..add(5748)
+    ..add(5749)
+    ..add(5750)
+    ..add(5751)
+    ..add(5752)
+    ..add(5753)
+    ..add(5754)
+    ..add(5755)
+    ..add(5756)
+    ..add(5757)
+    ..add(5758)
+    ..add(5759)
+    ..add(5760)
+    ..add(5761)
+    ..add(5762)
+    ..add(5763)
+    ..add(5764)
+    ..add(5765)
+    ..add(5766)
+    ..add(5767)
+    ..add(5768)
+    ..add(5769)
+    ..add(5770)
+    ..add(5771)
+    ..add(5772)
+    ..add(5773)
+    ..add(5774)
+    ..add(5775)
+    ..add(5776)
+    ..add(5777)
+    ..add(5778)
+    ..add(5779)
+    ..add(5780)
+    ..add(5781)
+    ..add(5782)
+    ..add(5783)
+    ..add(5784)
+    ..add(5785)
+    ..add(5786)
+    ..add(5787)
+    ..add(5788)
+    ..add(5789)
+    ..add(5790)
+    ..add(5791)
+    ..add(5792)
+    ..add(5793)
+    ..add(5794)
+    ..add(5795)
+    ..add(5796)
+    ..add(5797)
+    ..add(5798)
+    ..add(5799)
+    ..add(5800)
+    ..add(5801)
+    ..add(5802)
+    ..add(5803)
+    ..add(5804)
+    ..add(5805)
+    ..add(5806)
+    ..add(5807)
+    ..add(5808)
+    ..add(5809)
+    ..add(5810)
+    ..add(5811)
+    ..add(5812)
+    ..add(5813)
+    ..add(5814)
+    ..add(5815)
+    ..add(5816)
+    ..add(5817)
+    ..add(5818)
+    ..add(5819)
+    ..add(5820)
+    ..add(5821)
+    ..add(5822)
+    ..add(5823)
+    ..add(5824)
+    ..add(5825)
+    ..add(5826)
+    ..add(5827)
+    ..add(5828)
+    ..add(5829)
+    ..add(5830)
+    ..add(5831)
+    ..add(5832)
+    ..add(5833)
+    ..add(5834)
+    ..add(5835)
+    ..add(5836)
+    ..add(5837)
+    ..add(5838)
+    ..add(5839)
+    ..add(5840)
+    ..add(5841)
+    ..add(5842)
+    ..add(5843)
+    ..add(5844)
+    ..add(5845)
+    ..add(5846)
+    ..add(5847)
+    ..add(5848)
+    ..add(5849)
+    ..add(5850)
+    ..add(5851)
+    ..add(5852)
+    ..add(5853)
+    ..add(5854)
+    ..add(5855)
+    ..add(5856)
+    ..add(5857)
+    ..add(5858)
+    ..add(5859)
+    ..add(5860)
+    ..add(5861)
+    ..add(5862)
+    ..add(5863)
+    ..add(5864)
+    ..add(5865)
+    ..add(5866)
+    ..add(5867)
+    ..add(5868)
+    ..add(5869)
+    ..add(5870)
+    ..add(5871)
+    ..add(5872)
+    ..add(5873)
+    ..add(5874)
+    ..add(5875)
+    ..add(5876)
+    ..add(5877)
+    ..add(5878)
+    ..add(5879)
+    ..add(5880)
+    ..add(5881)
+    ..add(5882)
+    ..add(5883)
+    ..add(5884)
+    ..add(5885)
+    ..add(5886)
+    ..add(5887)
+    ..add(5888)
+    ..add(5889)
+    ..add(5890)
+    ..add(5891)
+    ..add(5892)
+    ..add(5893)
+    ..add(5894)
+    ..add(5895)
+    ..add(5896)
+    ..add(5897)
+    ..add(5898)
+    ..add(5899)
+    ..add(5900)
+    ..add(5901)
+    ..add(5902)
+    ..add(5903)
+    ..add(5904)
+    ..add(5905)
+    ..add(5906)
+    ..add(5907)
+    ..add(5908)
+    ..add(5909)
+    ..add(5910)
+    ..add(5911)
+    ..add(5912)
+    ..add(5913)
+    ..add(5914)
+    ..add(5915)
+    ..add(5916)
+    ..add(5917)
+    ..add(5918)
+    ..add(5919)
+    ..add(5920)
+    ..add(5921)
+    ..add(5922)
+    ..add(5923)
+    ..add(5924)
+    ..add(5925)
+    ..add(5926)
+    ..add(5927)
+    ..add(5928)
+    ..add(5929)
+    ..add(5930)
+    ..add(5931)
+    ..add(5932)
+    ..add(5933)
+    ..add(5934)
+    ..add(5935)
+    ..add(5936)
+    ..add(5937)
+    ..add(5938)
+    ..add(5939)
+    ..add(5940)
+    ..add(5941)
+    ..add(5942)
+    ..add(5943)
+    ..add(5944)
+    ..add(5945)
+    ..add(5946)
+    ..add(5947)
+    ..add(5948)
+    ..add(5949)
+    ..add(5950)
+    ..add(5951)
+    ..add(5952)
+    ..add(5953)
+    ..add(5954)
+    ..add(5955)
+    ..add(5956)
+    ..add(5957)
+    ..add(5958)
+    ..add(5959)
+    ..add(5960)
+    ..add(5961)
+    ..add(5962)
+    ..add(5963)
+    ..add(5964)
+    ..add(5965)
+    ..add(5966)
+    ..add(5967)
+    ..add(5968)
+    ..add(5969)
+    ..add(5970)
+    ..add(5971)
+    ..add(5972)
+    ..add(5973)
+    ..add(5974)
+    ..add(5975)
+    ..add(5976)
+    ..add(5977)
+    ..add(5978)
+    ..add(5979)
+    ..add(5980)
+    ..add(5981)
+    ..add(5982)
+    ..add(5983)
+    ..add(5984)
+    ..add(5985)
+    ..add(5986)
+    ..add(5987)
+    ..add(5988)
+    ..add(5989)
+    ..add(5990)
+    ..add(5991)
+    ..add(5992)
+    ..add(5993)
+    ..add(5994)
+    ..add(5995)
+    ..add(5996)
+    ..add(5997)
+    ..add(5998)
+    ..add(5999)
+    ..add(6000)
+    ..add(6001)
+    ..add(6002)
+    ..add(6003)
+    ..add(6004)
+    ..add(6005)
+    ..add(6006)
+    ..add(6007)
+    ..add(6008)
+    ..add(6009)
+    ..add(6010)
+    ..add(6011)
+    ..add(6012)
+    ..add(6013)
+    ..add(6014)
+    ..add(6015)
+    ..add(6016)
+    ..add(6017)
+    ..add(6018)
+    ..add(6019)
+    ..add(6020)
+    ..add(6021)
+    ..add(6022)
+    ..add(6023)
+    ..add(6024)
+    ..add(6025)
+    ..add(6026)
+    ..add(6027)
+    ..add(6028)
+    ..add(6029)
+    ..add(6030)
+    ..add(6031)
+    ..add(6032)
+    ..add(6033)
+    ..add(6034)
+    ..add(6035)
+    ..add(6036)
+    ..add(6037)
+    ..add(6038)
+    ..add(6039)
+    ..add(6040)
+    ..add(6041)
+    ..add(6042)
+    ..add(6043)
+    ..add(6044)
+    ..add(6045)
+    ..add(6046)
+    ..add(6047)
+    ..add(6048)
+    ..add(6049)
+    ..add(6050)
+    ..add(6051)
+    ..add(6052)
+    ..add(6053)
+    ..add(6054)
+    ..add(6055)
+    ..add(6056)
+    ..add(6057)
+    ..add(6058)
+    ..add(6059)
+    ..add(6060)
+    ..add(6061)
+    ..add(6062)
+    ..add(6063)
+    ..add(6064)
+    ..add(6065)
+    ..add(6066)
+    ..add(6067)
+    ..add(6068)
+    ..add(6069)
+    ..add(6070)
+    ..add(6071)
+    ..add(6072)
+    ..add(6073)
+    ..add(6074)
+    ..add(6075)
+    ..add(6076)
+    ..add(6077)
+    ..add(6078)
+    ..add(6079)
+    ..add(6080)
+    ..add(6081)
+    ..add(6082)
+    ..add(6083)
+    ..add(6084)
+    ..add(6085)
+    ..add(6086)
+    ..add(6087)
+    ..add(6088)
+    ..add(6089)
+    ..add(6090)
+    ..add(6091)
+    ..add(6092)
+    ..add(6093)
+    ..add(6094)
+    ..add(6095)
+    ..add(6096)
+    ..add(6097)
+    ..add(6098)
+    ..add(6099)
+    ..add(6100)
+    ..add(6101)
+    ..add(6102)
+    ..add(6103)
+    ..add(6104)
+    ..add(6105)
+    ..add(6106)
+    ..add(6107)
+    ..add(6108)
+    ..add(6109)
+    ..add(6110)
+    ..add(6111)
+    ..add(6112)
+    ..add(6113)
+    ..add(6114)
+    ..add(6115)
+    ..add(6116)
+    ..add(6117)
+    ..add(6118)
+    ..add(6119)
+    ..add(6120)
+    ..add(6121)
+    ..add(6122)
+    ..add(6123)
+    ..add(6124)
+    ..add(6125)
+    ..add(6126)
+    ..add(6127)
+    ..add(6128)
+    ..add(6129)
+    ..add(6130)
+    ..add(6131)
+    ..add(6132)
+    ..add(6133)
+    ..add(6134)
+    ..add(6135)
+    ..add(6136)
+    ..add(6137)
+    ..add(6138)
+    ..add(6139)
+    ..add(6140)
+    ..add(6141)
+    ..add(6142)
+    ..add(6143)
+    ..add(6144)
+    ..add(6145)
+    ..add(6146)
+    ..add(6147)
+    ..add(6148)
+    ..add(6149)
+    ..add(6150)
+    ..add(6151)
+    ..add(6152)
+    ..add(6153)
+    ..add(6154)
+    ..add(6155)
+    ..add(6156)
+    ..add(6157)
+    ..add(6158)
+    ..add(6159)
+    ..add(6160)
+    ..add(6161)
+    ..add(6162)
+    ..add(6163)
+    ..add(6164)
+    ..add(6165)
+    ..add(6166)
+    ..add(6167)
+    ..add(6168)
+    ..add(6169)
+    ..add(6170)
+    ..add(6171)
+    ..add(6172)
+    ..add(6173)
+    ..add(6174)
+    ..add(6175)
+    ..add(6176)
+    ..add(6177)
+    ..add(6178)
+    ..add(6179)
+    ..add(6180)
+    ..add(6181)
+    ..add(6182)
+    ..add(6183)
+    ..add(6184)
+    ..add(6185)
+    ..add(6186)
+    ..add(6187)
+    ..add(6188)
+    ..add(6189)
+    ..add(6190)
+    ..add(6191)
+    ..add(6192)
+    ..add(6193)
+    ..add(6194)
+    ..add(6195)
+    ..add(6196)
+    ..add(6197)
+    ..add(6198)
+    ..add(6199)
+    ..add(6200)
+    ..add(6201)
+    ..add(6202)
+    ..add(6203)
+    ..add(6204)
+    ..add(6205)
+    ..add(6206)
+    ..add(6207)
+    ..add(6208)
+    ..add(6209)
+    ..add(6210)
+    ..add(6211)
+    ..add(6212)
+    ..add(6213)
+    ..add(6214)
+    ..add(6215)
+    ..add(6216)
+    ..add(6217)
+    ..add(6218)
+    ..add(6219)
+    ..add(6220)
+    ..add(6221)
+    ..add(6222)
+    ..add(6223)
+    ..add(6224)
+    ..add(6225)
+    ..add(6226)
+    ..add(6227)
+    ..add(6228)
+    ..add(6229)
+    ..add(6230)
+    ..add(6231)
+    ..add(6232)
+    ..add(6233)
+    ..add(6234)
+    ..add(6235)
+    ..add(6236)
+    ..add(6237)
+    ..add(6238)
+    ..add(6239)
+    ..add(6240)
+    ..add(6241)
+    ..add(6242)
+    ..add(6243)
+    ..add(6244)
+    ..add(6245)
+    ..add(6246)
+    ..add(6247)
+    ..add(6248)
+    ..add(6249)
+    ..add(6250)
+    ..add(6251)
+    ..add(6252)
+    ..add(6253)
+    ..add(6254)
+    ..add(6255)
+    ..add(6256)
+    ..add(6257)
+    ..add(6258)
+    ..add(6259)
+    ..add(6260)
+    ..add(6261)
+    ..add(6262)
+    ..add(6263)
+    ..add(6264)
+    ..add(6265)
+    ..add(6266)
+    ..add(6267)
+    ..add(6268)
+    ..add(6269)
+    ..add(6270)
+    ..add(6271)
+    ..add(6272)
+    ..add(6273)
+    ..add(6274)
+    ..add(6275)
+    ..add(6276)
+    ..add(6277)
+    ..add(6278)
+    ..add(6279)
+    ..add(6280)
+    ..add(6281)
+    ..add(6282)
+    ..add(6283)
+    ..add(6284)
+    ..add(6285)
+    ..add(6286)
+    ..add(6287)
+    ..add(6288)
+    ..add(6289)
+    ..add(6290)
+    ..add(6291)
+    ..add(6292)
+    ..add(6293)
+    ..add(6294)
+    ..add(6295)
+    ..add(6296)
+    ..add(6297)
+    ..add(6298)
+    ..add(6299)
+    ..add(6300)
+    ..add(6301)
+    ..add(6302)
+    ..add(6303)
+    ..add(6304)
+    ..add(6305)
+    ..add(6306)
+    ..add(6307)
+    ..add(6308)
+    ..add(6309)
+    ..add(6310)
+    ..add(6311)
+    ..add(6312)
+    ..add(6313)
+    ..add(6314)
+    ..add(6315)
+    ..add(6316)
+    ..add(6317)
+    ..add(6318)
+    ..add(6319)
+    ..add(6320)
+    ..add(6321)
+    ..add(6322)
+    ..add(6323)
+    ..add(6324)
+    ..add(6325)
+    ..add(6326)
+    ..add(6327)
+    ..add(6328)
+    ..add(6329)
+    ..add(6330)
+    ..add(6331)
+    ..add(6332)
+    ..add(6333)
+    ..add(6334)
+    ..add(6335)
+    ..add(6336)
+    ..add(6337)
+    ..add(6338)
+    ..add(6339)
+    ..add(6340)
+    ..add(6341)
+    ..add(6342)
+    ..add(6343)
+    ..add(6344)
+    ..add(6345)
+    ..add(6346)
+    ..add(6347)
+    ..add(6348)
+    ..add(6349)
+    ..add(6350)
+    ..add(6351)
+    ..add(6352)
+    ..add(6353)
+    ..add(6354)
+    ..add(6355)
+    ..add(6356)
+    ..add(6357)
+    ..add(6358)
+    ..add(6359)
+    ..add(6360)
+    ..add(6361)
+    ..add(6362)
+    ..add(6363)
+    ..add(6364)
+    ..add(6365)
+    ..add(6366)
+    ..add(6367)
+    ..add(6368)
+    ..add(6369)
+    ..add(6370)
+    ..add(6371)
+    ..add(6372)
+    ..add(6373)
+    ..add(6374)
+    ..add(6375)
+    ..add(6376)
+    ..add(6377)
+    ..add(6378)
+    ..add(6379)
+    ..add(6380)
+    ..add(6381)
+    ..add(6382)
+    ..add(6383)
+    ..add(6384)
+    ..add(6385)
+    ..add(6386)
+    ..add(6387)
+    ..add(6388)
+    ..add(6389)
+    ..add(6390)
+    ..add(6391)
+    ..add(6392)
+    ..add(6393)
+    ..add(6394)
+    ..add(6395)
+    ..add(6396)
+    ..add(6397)
+    ..add(6398)
+    ..add(6399)
+    ..add(6400)
+    ..add(6401)
+    ..add(6402)
+    ..add(6403)
+    ..add(6404)
+    ..add(6405)
+    ..add(6406)
+    ..add(6407)
+    ..add(6408)
+    ..add(6409)
+    ..add(6410)
+    ..add(6411)
+    ..add(6412)
+    ..add(6413)
+    ..add(6414)
+    ..add(6415)
+    ..add(6416)
+    ..add(6417)
+    ..add(6418)
+    ..add(6419)
+    ..add(6420)
+    ..add(6421)
+    ..add(6422)
+    ..add(6423)
+    ..add(6424)
+    ..add(6425)
+    ..add(6426)
+    ..add(6427)
+    ..add(6428)
+    ..add(6429)
+    ..add(6430)
+    ..add(6431)
+    ..add(6432)
+    ..add(6433)
+    ..add(6434)
+    ..add(6435)
+    ..add(6436)
+    ..add(6437)
+    ..add(6438)
+    ..add(6439)
+    ..add(6440)
+    ..add(6441)
+    ..add(6442)
+    ..add(6443)
+    ..add(6444)
+    ..add(6445)
+    ..add(6446)
+    ..add(6447)
+    ..add(6448)
+    ..add(6449)
+    ..add(6450)
+    ..add(6451)
+    ..add(6452)
+    ..add(6453)
+    ..add(6454)
+    ..add(6455)
+    ..add(6456)
+    ..add(6457)
+    ..add(6458)
+    ..add(6459)
+    ..add(6460)
+    ..add(6461)
+    ..add(6462)
+    ..add(6463)
+    ..add(6464)
+    ..add(6465)
+    ..add(6466)
+    ..add(6467)
+    ..add(6468)
+    ..add(6469)
+    ..add(6470)
+    ..add(6471)
+    ..add(6472)
+    ..add(6473)
+    ..add(6474)
+    ..add(6475)
+    ..add(6476)
+    ..add(6477)
+    ..add(6478)
+    ..add(6479)
+    ..add(6480)
+    ..add(6481)
+    ..add(6482)
+    ..add(6483)
+    ..add(6484)
+    ..add(6485)
+    ..add(6486)
+    ..add(6487)
+    ..add(6488)
+    ..add(6489)
+    ..add(6490)
+    ..add(6491)
+    ..add(6492)
+    ..add(6493)
+    ..add(6494)
+    ..add(6495)
+    ..add(6496)
+    ..add(6497)
+    ..add(6498)
+    ..add(6499)
+    ..add(6500)
+    ..add(6501)
+    ..add(6502)
+    ..add(6503)
+    ..add(6504)
+    ..add(6505)
+    ..add(6506)
+    ..add(6507)
+    ..add(6508)
+    ..add(6509)
+    ..add(6510)
+    ..add(6511)
+    ..add(6512)
+    ..add(6513)
+    ..add(6514)
+    ..add(6515)
+    ..add(6516)
+    ..add(6517)
+    ..add(6518)
+    ..add(6519)
+    ..add(6520)
+    ..add(6521)
+    ..add(6522)
+    ..add(6523)
+    ..add(6524)
+    ..add(6525)
+    ..add(6526)
+    ..add(6527)
+    ..add(6528)
+    ..add(6529)
+    ..add(6530)
+    ..add(6531)
+    ..add(6532)
+    ..add(6533)
+    ..add(6534)
+    ..add(6535)
+    ..add(6536)
+    ..add(6537)
+    ..add(6538)
+    ..add(6539)
+    ..add(6540)
+    ..add(6541)
+    ..add(6542)
+    ..add(6543)
+    ..add(6544)
+    ..add(6545)
+    ..add(6546)
+    ..add(6547)
+    ..add(6548)
+    ..add(6549)
+    ..add(6550)
+    ..add(6551)
+    ..add(6552)
+    ..add(6553)
+    ..add(6554)
+    ..add(6555)
+    ..add(6556)
+    ..add(6557)
+    ..add(6558)
+    ..add(6559)
+    ..add(6560)
+    ..add(6561)
+    ..add(6562)
+    ..add(6563)
+    ..add(6564)
+    ..add(6565)
+    ..add(6566)
+    ..add(6567)
+    ..add(6568)
+    ..add(6569)
+    ..add(6570)
+    ..add(6571)
+    ..add(6572)
+    ..add(6573)
+    ..add(6574)
+    ..add(6575)
+    ..add(6576)
+    ..add(6577)
+    ..add(6578)
+    ..add(6579)
+    ..add(6580)
+    ..add(6581)
+    ..add(6582)
+    ..add(6583)
+    ..add(6584)
+    ..add(6585)
+    ..add(6586)
+    ..add(6587)
+    ..add(6588)
+    ..add(6589)
+    ..add(6590)
+    ..add(6591)
+    ..add(6592)
+    ..add(6593)
+    ..add(6594)
+    ..add(6595)
+    ..add(6596)
+    ..add(6597)
+    ..add(6598)
+    ..add(6599)
+    ..add(6600)
+    ..add(6601)
+    ..add(6602)
+    ..add(6603)
+    ..add(6604)
+    ..add(6605)
+    ..add(6606)
+    ..add(6607)
+    ..add(6608)
+    ..add(6609)
+    ..add(6610)
+    ..add(6611)
+    ..add(6612)
+    ..add(6613)
+    ..add(6614)
+    ..add(6615)
+    ..add(6616)
+    ..add(6617)
+    ..add(6618)
+    ..add(6619)
+    ..add(6620)
+    ..add(6621)
+    ..add(6622)
+    ..add(6623)
+    ..add(6624)
+    ..add(6625)
+    ..add(6626)
+    ..add(6627)
+    ..add(6628)
+    ..add(6629)
+    ..add(6630)
+    ..add(6631)
+    ..add(6632)
+    ..add(6633)
+    ..add(6634)
+    ..add(6635)
+    ..add(6636)
+    ..add(6637)
+    ..add(6638)
+    ..add(6639)
+    ..add(6640)
+    ..add(6641)
+    ..add(6642)
+    ..add(6643)
+    ..add(6644)
+    ..add(6645)
+    ..add(6646)
+    ..add(6647)
+    ..add(6648)
+    ..add(6649)
+    ..add(6650)
+    ..add(6651)
+    ..add(6652)
+    ..add(6653)
+    ..add(6654)
+    ..add(6655)
+    ..add(6656)
+    ..add(6657)
+    ..add(6658)
+    ..add(6659)
+    ..add(6660)
+    ..add(6661)
+    ..add(6662)
+    ..add(6663)
+    ..add(6664)
+    ..add(6665)
+    ..add(6666)
+    ..add(6667)
+    ..add(6668)
+    ..add(6669)
+    ..add(6670)
+    ..add(6671)
+    ..add(6672)
+    ..add(6673)
+    ..add(6674)
+    ..add(6675)
+    ..add(6676)
+    ..add(6677)
+    ..add(6678)
+    ..add(6679)
+    ..add(6680)
+    ..add(6681)
+    ..add(6682)
+    ..add(6683)
+    ..add(6684)
+    ..add(6685)
+    ..add(6686)
+    ..add(6687)
+    ..add(6688)
+    ..add(6689)
+    ..add(6690)
+    ..add(6691)
+    ..add(6692)
+    ..add(6693)
+    ..add(6694)
+    ..add(6695)
+    ..add(6696)
+    ..add(6697)
+    ..add(6698)
+    ..add(6699)
+    ..add(6700)
+    ..add(6701)
+    ..add(6702)
+    ..add(6703)
+    ..add(6704)
+    ..add(6705)
+    ..add(6706)
+    ..add(6707)
+    ..add(6708)
+    ..add(6709)
+    ..add(6710)
+    ..add(6711)
+    ..add(6712)
+    ..add(6713)
+    ..add(6714)
+    ..add(6715)
+    ..add(6716)
+    ..add(6717)
+    ..add(6718)
+    ..add(6719)
+    ..add(6720)
+    ..add(6721)
+    ..add(6722)
+    ..add(6723)
+    ..add(6724)
+    ..add(6725)
+    ..add(6726)
+    ..add(6727)
+    ..add(6728)
+    ..add(6729)
+    ..add(6730)
+    ..add(6731)
+    ..add(6732)
+    ..add(6733)
+    ..add(6734)
+    ..add(6735)
+    ..add(6736)
+    ..add(6737)
+    ..add(6738)
+    ..add(6739)
+    ..add(6740)
+    ..add(6741)
+    ..add(6742)
+    ..add(6743)
+    ..add(6744)
+    ..add(6745)
+    ..add(6746)
+    ..add(6747)
+    ..add(6748)
+    ..add(6749)
+    ..add(6750)
+    ..add(6751)
+    ..add(6752)
+    ..add(6753)
+    ..add(6754)
+    ..add(6755)
+    ..add(6756)
+    ..add(6757)
+    ..add(6758)
+    ..add(6759)
+    ..add(6760)
+    ..add(6761)
+    ..add(6762)
+    ..add(6763)
+    ..add(6764)
+    ..add(6765)
+    ..add(6766)
+    ..add(6767)
+    ..add(6768)
+    ..add(6769)
+    ..add(6770)
+    ..add(6771)
+    ..add(6772)
+    ..add(6773)
+    ..add(6774)
+    ..add(6775)
+    ..add(6776)
+    ..add(6777)
+    ..add(6778)
+    ..add(6779)
+    ..add(6780)
+    ..add(6781)
+    ..add(6782)
+    ..add(6783)
+    ..add(6784)
+    ..add(6785)
+    ..add(6786)
+    ..add(6787)
+    ..add(6788)
+    ..add(6789)
+    ..add(6790)
+    ..add(6791)
+    ..add(6792)
+    ..add(6793)
+    ..add(6794)
+    ..add(6795)
+    ..add(6796)
+    ..add(6797)
+    ..add(6798)
+    ..add(6799)
+    ..add(6800)
+    ..add(6801)
+    ..add(6802)
+    ..add(6803)
+    ..add(6804)
+    ..add(6805)
+    ..add(6806)
+    ..add(6807)
+    ..add(6808)
+    ..add(6809)
+    ..add(6810)
+    ..add(6811)
+    ..add(6812)
+    ..add(6813)
+    ..add(6814)
+    ..add(6815)
+    ..add(6816)
+    ..add(6817)
+    ..add(6818)
+    ..add(6819)
+    ..add(6820)
+    ..add(6821)
+    ..add(6822)
+    ..add(6823)
+    ..add(6824)
+    ..add(6825)
+    ..add(6826)
+    ..add(6827)
+    ..add(6828)
+    ..add(6829)
+    ..add(6830)
+    ..add(6831)
+    ..add(6832)
+    ..add(6833)
+    ..add(6834)
+    ..add(6835)
+    ..add(6836)
+    ..add(6837)
+    ..add(6838)
+    ..add(6839)
+    ..add(6840)
+    ..add(6841)
+    ..add(6842)
+    ..add(6843)
+    ..add(6844)
+    ..add(6845)
+    ..add(6846)
+    ..add(6847)
+    ..add(6848)
+    ..add(6849)
+    ..add(6850)
+    ..add(6851)
+    ..add(6852)
+    ..add(6853)
+    ..add(6854)
+    ..add(6855)
+    ..add(6856)
+    ..add(6857)
+    ..add(6858)
+    ..add(6859)
+    ..add(6860)
+    ..add(6861)
+    ..add(6862)
+    ..add(6863)
+    ..add(6864)
+    ..add(6865)
+    ..add(6866)
+    ..add(6867)
+    ..add(6868)
+    ..add(6869)
+    ..add(6870)
+    ..add(6871)
+    ..add(6872)
+    ..add(6873)
+    ..add(6874)
+    ..add(6875)
+    ..add(6876)
+    ..add(6877)
+    ..add(6878)
+    ..add(6879)
+    ..add(6880)
+    ..add(6881)
+    ..add(6882)
+    ..add(6883)
+    ..add(6884)
+    ..add(6885)
+    ..add(6886)
+    ..add(6887)
+    ..add(6888)
+    ..add(6889)
+    ..add(6890)
+    ..add(6891)
+    ..add(6892)
+    ..add(6893)
+    ..add(6894)
+    ..add(6895)
+    ..add(6896)
+    ..add(6897)
+    ..add(6898)
+    ..add(6899)
+    ..add(6900)
+    ..add(6901)
+    ..add(6902)
+    ..add(6903)
+    ..add(6904)
+    ..add(6905)
+    ..add(6906)
+    ..add(6907)
+    ..add(6908)
+    ..add(6909)
+    ..add(6910)
+    ..add(6911)
+    ..add(6912)
+    ..add(6913)
+    ..add(6914)
+    ..add(6915)
+    ..add(6916)
+    ..add(6917)
+    ..add(6918)
+    ..add(6919)
+    ..add(6920)
+    ..add(6921)
+    ..add(6922)
+    ..add(6923)
+    ..add(6924)
+    ..add(6925)
+    ..add(6926)
+    ..add(6927)
+    ..add(6928)
+    ..add(6929)
+    ..add(6930)
+    ..add(6931)
+    ..add(6932)
+    ..add(6933)
+    ..add(6934)
+    ..add(6935)
+    ..add(6936)
+    ..add(6937)
+    ..add(6938)
+    ..add(6939)
+    ..add(6940)
+    ..add(6941)
+    ..add(6942)
+    ..add(6943)
+    ..add(6944)
+    ..add(6945)
+    ..add(6946)
+    ..add(6947)
+    ..add(6948)
+    ..add(6949)
+    ..add(6950)
+    ..add(6951)
+    ..add(6952)
+    ..add(6953)
+    ..add(6954)
+    ..add(6955)
+    ..add(6956)
+    ..add(6957)
+    ..add(6958)
+    ..add(6959)
+    ..add(6960)
+    ..add(6961)
+    ..add(6962)
+    ..add(6963)
+    ..add(6964)
+    ..add(6965)
+    ..add(6966)
+    ..add(6967)
+    ..add(6968)
+    ..add(6969)
+    ..add(6970)
+    ..add(6971)
+    ..add(6972)
+    ..add(6973)
+    ..add(6974)
+    ..add(6975)
+    ..add(6976)
+    ..add(6977)
+    ..add(6978)
+    ..add(6979)
+    ..add(6980)
+    ..add(6981)
+    ..add(6982)
+    ..add(6983)
+    ..add(6984)
+    ..add(6985)
+    ..add(6986)
+    ..add(6987)
+    ..add(6988)
+    ..add(6989)
+    ..add(6990)
+    ..add(6991)
+    ..add(6992)
+    ..add(6993)
+    ..add(6994)
+    ..add(6995)
+    ..add(6996)
+    ..add(6997)
+    ..add(6998)
+    ..add(6999)
+    ..add(7000)
+    ..add(7001)
+    ..add(7002)
+    ..add(7003)
+    ..add(7004)
+    ..add(7005)
+    ..add(7006)
+    ..add(7007)
+    ..add(7008)
+    ..add(7009)
+    ..add(7010)
+    ..add(7011)
+    ..add(7012)
+    ..add(7013)
+    ..add(7014)
+    ..add(7015)
+    ..add(7016)
+    ..add(7017)
+    ..add(7018)
+    ..add(7019)
+    ..add(7020)
+    ..add(7021)
+    ..add(7022)
+    ..add(7023)
+    ..add(7024)
+    ..add(7025)
+    ..add(7026)
+    ..add(7027)
+    ..add(7028)
+    ..add(7029)
+    ..add(7030)
+    ..add(7031)
+    ..add(7032)
+    ..add(7033)
+    ..add(7034)
+    ..add(7035)
+    ..add(7036)
+    ..add(7037)
+    ..add(7038)
+    ..add(7039)
+    ..add(7040)
+    ..add(7041)
+    ..add(7042)
+    ..add(7043)
+    ..add(7044)
+    ..add(7045)
+    ..add(7046)
+    ..add(7047)
+    ..add(7048)
+    ..add(7049)
+    ..add(7050)
+    ..add(7051)
+    ..add(7052)
+    ..add(7053)
+    ..add(7054)
+    ..add(7055)
+    ..add(7056)
+    ..add(7057)
+    ..add(7058)
+    ..add(7059)
+    ..add(7060)
+    ..add(7061)
+    ..add(7062)
+    ..add(7063)
+    ..add(7064)
+    ..add(7065)
+    ..add(7066)
+    ..add(7067)
+    ..add(7068)
+    ..add(7069)
+    ..add(7070)
+    ..add(7071)
+    ..add(7072)
+    ..add(7073)
+    ..add(7074)
+    ..add(7075)
+    ..add(7076)
+    ..add(7077)
+    ..add(7078)
+    ..add(7079)
+    ..add(7080)
+    ..add(7081)
+    ..add(7082)
+    ..add(7083)
+    ..add(7084)
+    ..add(7085)
+    ..add(7086)
+    ..add(7087)
+    ..add(7088)
+    ..add(7089)
+    ..add(7090)
+    ..add(7091)
+    ..add(7092)
+    ..add(7093)
+    ..add(7094)
+    ..add(7095)
+    ..add(7096)
+    ..add(7097)
+    ..add(7098)
+    ..add(7099)
+    ..add(7100)
+    ..add(7101)
+    ..add(7102)
+    ..add(7103)
+    ..add(7104)
+    ..add(7105)
+    ..add(7106)
+    ..add(7107)
+    ..add(7108)
+    ..add(7109)
+    ..add(7110)
+    ..add(7111)
+    ..add(7112)
+    ..add(7113)
+    ..add(7114)
+    ..add(7115)
+    ..add(7116)
+    ..add(7117)
+    ..add(7118)
+    ..add(7119)
+    ..add(7120)
+    ..add(7121)
+    ..add(7122)
+    ..add(7123)
+    ..add(7124)
+    ..add(7125)
+    ..add(7126)
+    ..add(7127)
+    ..add(7128)
+    ..add(7129)
+    ..add(7130)
+    ..add(7131)
+    ..add(7132)
+    ..add(7133)
+    ..add(7134)
+    ..add(7135)
+    ..add(7136)
+    ..add(7137)
+    ..add(7138)
+    ..add(7139)
+    ..add(7140)
+    ..add(7141)
+    ..add(7142)
+    ..add(7143)
+    ..add(7144)
+    ..add(7145)
+    ..add(7146)
+    ..add(7147)
+    ..add(7148)
+    ..add(7149)
+    ..add(7150)
+    ..add(7151)
+    ..add(7152)
+    ..add(7153)
+    ..add(7154)
+    ..add(7155)
+    ..add(7156)
+    ..add(7157)
+    ..add(7158)
+    ..add(7159)
+    ..add(7160)
+    ..add(7161)
+    ..add(7162)
+    ..add(7163)
+    ..add(7164)
+    ..add(7165)
+    ..add(7166)
+    ..add(7167)
+    ..add(7168)
+    ..add(7169)
+    ..add(7170)
+    ..add(7171)
+    ..add(7172)
+    ..add(7173)
+    ..add(7174)
+    ..add(7175)
+    ..add(7176)
+    ..add(7177)
+    ..add(7178)
+    ..add(7179)
+    ..add(7180)
+    ..add(7181)
+    ..add(7182)
+    ..add(7183)
+    ..add(7184)
+    ..add(7185)
+    ..add(7186)
+    ..add(7187)
+    ..add(7188)
+    ..add(7189)
+    ..add(7190)
+    ..add(7191)
+    ..add(7192)
+    ..add(7193)
+    ..add(7194)
+    ..add(7195)
+    ..add(7196)
+    ..add(7197)
+    ..add(7198)
+    ..add(7199)
+    ..add(7200)
+    ..add(7201)
+    ..add(7202)
+    ..add(7203)
+    ..add(7204)
+    ..add(7205)
+    ..add(7206)
+    ..add(7207)
+    ..add(7208)
+    ..add(7209)
+    ..add(7210)
+    ..add(7211)
+    ..add(7212)
+    ..add(7213)
+    ..add(7214)
+    ..add(7215)
+    ..add(7216)
+    ..add(7217)
+    ..add(7218)
+    ..add(7219)
+    ..add(7220)
+    ..add(7221)
+    ..add(7222)
+    ..add(7223)
+    ..add(7224)
+    ..add(7225)
+    ..add(7226)
+    ..add(7227)
+    ..add(7228)
+    ..add(7229)
+    ..add(7230)
+    ..add(7231)
+    ..add(7232)
+    ..add(7233)
+    ..add(7234)
+    ..add(7235)
+    ..add(7236)
+    ..add(7237)
+    ..add(7238)
+    ..add(7239)
+    ..add(7240)
+    ..add(7241)
+    ..add(7242)
+    ..add(7243)
+    ..add(7244)
+    ..add(7245)
+    ..add(7246)
+    ..add(7247)
+    ..add(7248)
+    ..add(7249)
+    ..add(7250)
+    ..add(7251)
+    ..add(7252)
+    ..add(7253)
+    ..add(7254)
+    ..add(7255)
+    ..add(7256)
+    ..add(7257)
+    ..add(7258)
+    ..add(7259)
+    ..add(7260)
+    ..add(7261)
+    ..add(7262)
+    ..add(7263)
+    ..add(7264)
+    ..add(7265)
+    ..add(7266)
+    ..add(7267)
+    ..add(7268)
+    ..add(7269)
+    ..add(7270)
+    ..add(7271)
+    ..add(7272)
+    ..add(7273)
+    ..add(7274)
+    ..add(7275)
+    ..add(7276)
+    ..add(7277)
+    ..add(7278)
+    ..add(7279)
+    ..add(7280)
+    ..add(7281)
+    ..add(7282)
+    ..add(7283)
+    ..add(7284)
+    ..add(7285)
+    ..add(7286)
+    ..add(7287)
+    ..add(7288)
+    ..add(7289)
+    ..add(7290)
+    ..add(7291)
+    ..add(7292)
+    ..add(7293)
+    ..add(7294)
+    ..add(7295)
+    ..add(7296)
+    ..add(7297)
+    ..add(7298)
+    ..add(7299)
+    ..add(7300)
+    ..add(7301)
+    ..add(7302)
+    ..add(7303)
+    ..add(7304)
+    ..add(7305)
+    ..add(7306)
+    ..add(7307)
+    ..add(7308)
+    ..add(7309)
+    ..add(7310)
+    ..add(7311)
+    ..add(7312)
+    ..add(7313)
+    ..add(7314)
+    ..add(7315)
+    ..add(7316)
+    ..add(7317)
+    ..add(7318)
+    ..add(7319)
+    ..add(7320)
+    ..add(7321)
+    ..add(7322)
+    ..add(7323)
+    ..add(7324)
+    ..add(7325)
+    ..add(7326)
+    ..add(7327)
+    ..add(7328)
+    ..add(7329)
+    ..add(7330)
+    ..add(7331)
+    ..add(7332)
+    ..add(7333)
+    ..add(7334)
+    ..add(7335)
+    ..add(7336)
+    ..add(7337)
+    ..add(7338)
+    ..add(7339)
+    ..add(7340)
+    ..add(7341)
+    ..add(7342)
+    ..add(7343)
+    ..add(7344)
+    ..add(7345)
+    ..add(7346)
+    ..add(7347)
+    ..add(7348)
+    ..add(7349)
+    ..add(7350)
+    ..add(7351)
+    ..add(7352)
+    ..add(7353)
+    ..add(7354)
+    ..add(7355)
+    ..add(7356)
+    ..add(7357)
+    ..add(7358)
+    ..add(7359)
+    ..add(7360)
+    ..add(7361)
+    ..add(7362)
+    ..add(7363)
+    ..add(7364)
+    ..add(7365)
+    ..add(7366)
+    ..add(7367)
+    ..add(7368)
+    ..add(7369)
+    ..add(7370)
+    ..add(7371)
+    ..add(7372)
+    ..add(7373)
+    ..add(7374)
+    ..add(7375)
+    ..add(7376)
+    ..add(7377)
+    ..add(7378)
+    ..add(7379)
+    ..add(7380)
+    ..add(7381)
+    ..add(7382)
+    ..add(7383)
+    ..add(7384)
+    ..add(7385)
+    ..add(7386)
+    ..add(7387)
+    ..add(7388)
+    ..add(7389)
+    ..add(7390)
+    ..add(7391)
+    ..add(7392)
+    ..add(7393)
+    ..add(7394)
+    ..add(7395)
+    ..add(7396)
+    ..add(7397)
+    ..add(7398)
+    ..add(7399)
+    ..add(7400)
+    ..add(7401)
+    ..add(7402)
+    ..add(7403)
+    ..add(7404)
+    ..add(7405)
+    ..add(7406)
+    ..add(7407)
+    ..add(7408)
+    ..add(7409)
+    ..add(7410)
+    ..add(7411)
+    ..add(7412)
+    ..add(7413)
+    ..add(7414)
+    ..add(7415)
+    ..add(7416)
+    ..add(7417)
+    ..add(7418)
+    ..add(7419)
+    ..add(7420)
+    ..add(7421)
+    ..add(7422)
+    ..add(7423)
+    ..add(7424)
+    ..add(7425)
+    ..add(7426)
+    ..add(7427)
+    ..add(7428)
+    ..add(7429)
+    ..add(7430)
+    ..add(7431)
+    ..add(7432)
+    ..add(7433)
+    ..add(7434)
+    ..add(7435)
+    ..add(7436)
+    ..add(7437)
+    ..add(7438)
+    ..add(7439)
+    ..add(7440)
+    ..add(7441)
+    ..add(7442)
+    ..add(7443)
+    ..add(7444)
+    ..add(7445)
+    ..add(7446)
+    ..add(7447)
+    ..add(7448)
+    ..add(7449)
+    ..add(7450)
+    ..add(7451)
+    ..add(7452)
+    ..add(7453)
+    ..add(7454)
+    ..add(7455)
+    ..add(7456)
+    ..add(7457)
+    ..add(7458)
+    ..add(7459)
+    ..add(7460)
+    ..add(7461)
+    ..add(7462)
+    ..add(7463)
+    ..add(7464)
+    ..add(7465)
+    ..add(7466)
+    ..add(7467)
+    ..add(7468)
+    ..add(7469)
+    ..add(7470)
+    ..add(7471)
+    ..add(7472)
+    ..add(7473)
+    ..add(7474)
+    ..add(7475)
+    ..add(7476)
+    ..add(7477)
+    ..add(7478)
+    ..add(7479)
+    ..add(7480)
+    ..add(7481)
+    ..add(7482)
+    ..add(7483)
+    ..add(7484)
+    ..add(7485)
+    ..add(7486)
+    ..add(7487)
+    ..add(7488)
+    ..add(7489)
+    ..add(7490)
+    ..add(7491)
+    ..add(7492)
+    ..add(7493)
+    ..add(7494)
+    ..add(7495)
+    ..add(7496)
+    ..add(7497)
+    ..add(7498)
+    ..add(7499)
+    ..add(7500)
+    ..add(7501)
+    ..add(7502)
+    ..add(7503)
+    ..add(7504)
+    ..add(7505)
+    ..add(7506)
+    ..add(7507)
+    ..add(7508)
+    ..add(7509)
+    ..add(7510)
+    ..add(7511)
+    ..add(7512)
+    ..add(7513)
+    ..add(7514)
+    ..add(7515)
+    ..add(7516)
+    ..add(7517)
+    ..add(7518)
+    ..add(7519)
+    ..add(7520)
+    ..add(7521)
+    ..add(7522)
+    ..add(7523)
+    ..add(7524)
+    ..add(7525)
+    ..add(7526)
+    ..add(7527)
+    ..add(7528)
+    ..add(7529)
+    ..add(7530)
+    ..add(7531)
+    ..add(7532)
+    ..add(7533)
+    ..add(7534)
+    ..add(7535)
+    ..add(7536)
+    ..add(7537)
+    ..add(7538)
+    ..add(7539)
+    ..add(7540)
+    ..add(7541)
+    ..add(7542)
+    ..add(7543)
+    ..add(7544)
+    ..add(7545)
+    ..add(7546)
+    ..add(7547)
+    ..add(7548)
+    ..add(7549)
+    ..add(7550)
+    ..add(7551)
+    ..add(7552)
+    ..add(7553)
+    ..add(7554)
+    ..add(7555)
+    ..add(7556)
+    ..add(7557)
+    ..add(7558)
+    ..add(7559)
+    ..add(7560)
+    ..add(7561)
+    ..add(7562)
+    ..add(7563)
+    ..add(7564)
+    ..add(7565)
+    ..add(7566)
+    ..add(7567)
+    ..add(7568)
+    ..add(7569)
+    ..add(7570)
+    ..add(7571)
+    ..add(7572)
+    ..add(7573)
+    ..add(7574)
+    ..add(7575)
+    ..add(7576)
+    ..add(7577)
+    ..add(7578)
+    ..add(7579)
+    ..add(7580)
+    ..add(7581)
+    ..add(7582)
+    ..add(7583)
+    ..add(7584)
+    ..add(7585)
+    ..add(7586)
+    ..add(7587)
+    ..add(7588)
+    ..add(7589)
+    ..add(7590)
+    ..add(7591)
+    ..add(7592)
+    ..add(7593)
+    ..add(7594)
+    ..add(7595)
+    ..add(7596)
+    ..add(7597)
+    ..add(7598)
+    ..add(7599)
+    ..add(7600)
+    ..add(7601)
+    ..add(7602)
+    ..add(7603)
+    ..add(7604)
+    ..add(7605)
+    ..add(7606)
+    ..add(7607)
+    ..add(7608)
+    ..add(7609)
+    ..add(7610)
+    ..add(7611)
+    ..add(7612)
+    ..add(7613)
+    ..add(7614)
+    ..add(7615)
+    ..add(7616)
+    ..add(7617)
+    ..add(7618)
+    ..add(7619)
+    ..add(7620)
+    ..add(7621)
+    ..add(7622)
+    ..add(7623)
+    ..add(7624)
+    ..add(7625)
+    ..add(7626)
+    ..add(7627)
+    ..add(7628)
+    ..add(7629)
+    ..add(7630)
+    ..add(7631)
+    ..add(7632)
+    ..add(7633)
+    ..add(7634)
+    ..add(7635)
+    ..add(7636)
+    ..add(7637)
+    ..add(7638)
+    ..add(7639)
+    ..add(7640)
+    ..add(7641)
+    ..add(7642)
+    ..add(7643)
+    ..add(7644)
+    ..add(7645)
+    ..add(7646)
+    ..add(7647)
+    ..add(7648)
+    ..add(7649)
+    ..add(7650)
+    ..add(7651)
+    ..add(7652)
+    ..add(7653)
+    ..add(7654)
+    ..add(7655)
+    ..add(7656)
+    ..add(7657)
+    ..add(7658)
+    ..add(7659)
+    ..add(7660)
+    ..add(7661)
+    ..add(7662)
+    ..add(7663)
+    ..add(7664)
+    ..add(7665)
+    ..add(7666)
+    ..add(7667)
+    ..add(7668)
+    ..add(7669)
+    ..add(7670)
+    ..add(7671)
+    ..add(7672)
+    ..add(7673)
+    ..add(7674)
+    ..add(7675)
+    ..add(7676)
+    ..add(7677)
+    ..add(7678)
+    ..add(7679)
+    ..add(7680)
+    ..add(7681)
+    ..add(7682)
+    ..add(7683)
+    ..add(7684)
+    ..add(7685)
+    ..add(7686)
+    ..add(7687)
+    ..add(7688)
+    ..add(7689)
+    ..add(7690)
+    ..add(7691)
+    ..add(7692)
+    ..add(7693)
+    ..add(7694)
+    ..add(7695)
+    ..add(7696)
+    ..add(7697)
+    ..add(7698)
+    ..add(7699)
+    ..add(7700)
+    ..add(7701)
+    ..add(7702)
+    ..add(7703)
+    ..add(7704)
+    ..add(7705)
+    ..add(7706)
+    ..add(7707)
+    ..add(7708)
+    ..add(7709)
+    ..add(7710)
+    ..add(7711)
+    ..add(7712)
+    ..add(7713)
+    ..add(7714)
+    ..add(7715)
+    ..add(7716)
+    ..add(7717)
+    ..add(7718)
+    ..add(7719)
+    ..add(7720)
+    ..add(7721)
+    ..add(7722)
+    ..add(7723)
+    ..add(7724)
+    ..add(7725)
+    ..add(7726)
+    ..add(7727)
+    ..add(7728)
+    ..add(7729)
+    ..add(7730)
+    ..add(7731)
+    ..add(7732)
+    ..add(7733)
+    ..add(7734)
+    ..add(7735)
+    ..add(7736)
+    ..add(7737)
+    ..add(7738)
+    ..add(7739)
+    ..add(7740)
+    ..add(7741)
+    ..add(7742)
+    ..add(7743)
+    ..add(7744)
+    ..add(7745)
+    ..add(7746)
+    ..add(7747)
+    ..add(7748)
+    ..add(7749)
+    ..add(7750)
+    ..add(7751)
+    ..add(7752)
+    ..add(7753)
+    ..add(7754)
+    ..add(7755)
+    ..add(7756)
+    ..add(7757)
+    ..add(7758)
+    ..add(7759)
+    ..add(7760)
+    ..add(7761)
+    ..add(7762)
+    ..add(7763)
+    ..add(7764)
+    ..add(7765)
+    ..add(7766)
+    ..add(7767)
+    ..add(7768)
+    ..add(7769)
+    ..add(7770)
+    ..add(7771)
+    ..add(7772)
+    ..add(7773)
+    ..add(7774)
+    ..add(7775)
+    ..add(7776)
+    ..add(7777)
+    ..add(7778)
+    ..add(7779)
+    ..add(7780)
+    ..add(7781)
+    ..add(7782)
+    ..add(7783)
+    ..add(7784)
+    ..add(7785)
+    ..add(7786)
+    ..add(7787)
+    ..add(7788)
+    ..add(7789)
+    ..add(7790)
+    ..add(7791)
+    ..add(7792)
+    ..add(7793)
+    ..add(7794)
+    ..add(7795)
+    ..add(7796)
+    ..add(7797)
+    ..add(7798)
+    ..add(7799)
+    ..add(7800)
+    ..add(7801)
+    ..add(7802)
+    ..add(7803)
+    ..add(7804)
+    ..add(7805)
+    ..add(7806)
+    ..add(7807)
+    ..add(7808)
+    ..add(7809)
+    ..add(7810)
+    ..add(7811)
+    ..add(7812)
+    ..add(7813)
+    ..add(7814)
+    ..add(7815)
+    ..add(7816)
+    ..add(7817)
+    ..add(7818)
+    ..add(7819)
+    ..add(7820)
+    ..add(7821)
+    ..add(7822)
+    ..add(7823)
+    ..add(7824)
+    ..add(7825)
+    ..add(7826)
+    ..add(7827)
+    ..add(7828)
+    ..add(7829)
+    ..add(7830)
+    ..add(7831)
+    ..add(7832)
+    ..add(7833)
+    ..add(7834)
+    ..add(7835)
+    ..add(7836)
+    ..add(7837)
+    ..add(7838)
+    ..add(7839)
+    ..add(7840)
+    ..add(7841)
+    ..add(7842)
+    ..add(7843)
+    ..add(7844)
+    ..add(7845)
+    ..add(7846)
+    ..add(7847)
+    ..add(7848)
+    ..add(7849)
+    ..add(7850)
+    ..add(7851)
+    ..add(7852)
+    ..add(7853)
+    ..add(7854)
+    ..add(7855)
+    ..add(7856)
+    ..add(7857)
+    ..add(7858)
+    ..add(7859)
+    ..add(7860)
+    ..add(7861)
+    ..add(7862)
+    ..add(7863)
+    ..add(7864)
+    ..add(7865)
+    ..add(7866)
+    ..add(7867)
+    ..add(7868)
+    ..add(7869)
+    ..add(7870)
+    ..add(7871)
+    ..add(7872)
+    ..add(7873)
+    ..add(7874)
+    ..add(7875)
+    ..add(7876)
+    ..add(7877)
+    ..add(7878)
+    ..add(7879)
+    ..add(7880)
+    ..add(7881)
+    ..add(7882)
+    ..add(7883)
+    ..add(7884)
+    ..add(7885)
+    ..add(7886)
+    ..add(7887)
+    ..add(7888)
+    ..add(7889)
+    ..add(7890)
+    ..add(7891)
+    ..add(7892)
+    ..add(7893)
+    ..add(7894)
+    ..add(7895)
+    ..add(7896)
+    ..add(7897)
+    ..add(7898)
+    ..add(7899)
+    ..add(7900)
+    ..add(7901)
+    ..add(7902)
+    ..add(7903)
+    ..add(7904)
+    ..add(7905)
+    ..add(7906)
+    ..add(7907)
+    ..add(7908)
+    ..add(7909)
+    ..add(7910)
+    ..add(7911)
+    ..add(7912)
+    ..add(7913)
+    ..add(7914)
+    ..add(7915)
+    ..add(7916)
+    ..add(7917)
+    ..add(7918)
+    ..add(7919)
+    ..add(7920)
+    ..add(7921)
+    ..add(7922)
+    ..add(7923)
+    ..add(7924)
+    ..add(7925)
+    ..add(7926)
+    ..add(7927)
+    ..add(7928)
+    ..add(7929)
+    ..add(7930)
+    ..add(7931)
+    ..add(7932)
+    ..add(7933)
+    ..add(7934)
+    ..add(7935)
+    ..add(7936)
+    ..add(7937)
+    ..add(7938)
+    ..add(7939)
+    ..add(7940)
+    ..add(7941)
+    ..add(7942)
+    ..add(7943)
+    ..add(7944)
+    ..add(7945)
+    ..add(7946)
+    ..add(7947)
+    ..add(7948)
+    ..add(7949)
+    ..add(7950)
+    ..add(7951)
+    ..add(7952)
+    ..add(7953)
+    ..add(7954)
+    ..add(7955)
+    ..add(7956)
+    ..add(7957)
+    ..add(7958)
+    ..add(7959)
+    ..add(7960)
+    ..add(7961)
+    ..add(7962)
+    ..add(7963)
+    ..add(7964)
+    ..add(7965)
+    ..add(7966)
+    ..add(7967)
+    ..add(7968)
+    ..add(7969)
+    ..add(7970)
+    ..add(7971)
+    ..add(7972)
+    ..add(7973)
+    ..add(7974)
+    ..add(7975)
+    ..add(7976)
+    ..add(7977)
+    ..add(7978)
+    ..add(7979)
+    ..add(7980)
+    ..add(7981)
+    ..add(7982)
+    ..add(7983)
+    ..add(7984)
+    ..add(7985)
+    ..add(7986)
+    ..add(7987)
+    ..add(7988)
+    ..add(7989)
+    ..add(7990)
+    ..add(7991)
+    ..add(7992)
+    ..add(7993)
+    ..add(7994)
+    ..add(7995)
+    ..add(7996)
+    ..add(7997)
+    ..add(7998)
+    ..add(7999)
+    ..add(8000)
+    ..add(8001)
+    ..add(8002)
+    ..add(8003)
+    ..add(8004)
+    ..add(8005)
+    ..add(8006)
+    ..add(8007)
+    ..add(8008)
+    ..add(8009)
+    ..add(8010)
+    ..add(8011)
+    ..add(8012)
+    ..add(8013)
+    ..add(8014)
+    ..add(8015)
+    ..add(8016)
+    ..add(8017)
+    ..add(8018)
+    ..add(8019)
+    ..add(8020)
+    ..add(8021)
+    ..add(8022)
+    ..add(8023)
+    ..add(8024)
+    ..add(8025)
+    ..add(8026)
+    ..add(8027)
+    ..add(8028)
+    ..add(8029)
+    ..add(8030)
+    ..add(8031)
+    ..add(8032)
+    ..add(8033)
+    ..add(8034)
+    ..add(8035)
+    ..add(8036)
+    ..add(8037)
+    ..add(8038)
+    ..add(8039)
+    ..add(8040)
+    ..add(8041)
+    ..add(8042)
+    ..add(8043)
+    ..add(8044)
+    ..add(8045)
+    ..add(8046)
+    ..add(8047)
+    ..add(8048)
+    ..add(8049)
+    ..add(8050)
+    ..add(8051)
+    ..add(8052)
+    ..add(8053)
+    ..add(8054)
+    ..add(8055)
+    ..add(8056)
+    ..add(8057)
+    ..add(8058)
+    ..add(8059)
+    ..add(8060)
+    ..add(8061)
+    ..add(8062)
+    ..add(8063)
+    ..add(8064)
+    ..add(8065)
+    ..add(8066)
+    ..add(8067)
+    ..add(8068)
+    ..add(8069)
+    ..add(8070)
+    ..add(8071)
+    ..add(8072)
+    ..add(8073)
+    ..add(8074)
+    ..add(8075)
+    ..add(8076)
+    ..add(8077)
+    ..add(8078)
+    ..add(8079)
+    ..add(8080)
+    ..add(8081)
+    ..add(8082)
+    ..add(8083)
+    ..add(8084)
+    ..add(8085)
+    ..add(8086)
+    ..add(8087)
+    ..add(8088)
+    ..add(8089)
+    ..add(8090)
+    ..add(8091)
+    ..add(8092)
+    ..add(8093)
+    ..add(8094)
+    ..add(8095)
+    ..add(8096)
+    ..add(8097)
+    ..add(8098)
+    ..add(8099)
+    ..add(8100)
+    ..add(8101)
+    ..add(8102)
+    ..add(8103)
+    ..add(8104)
+    ..add(8105)
+    ..add(8106)
+    ..add(8107)
+    ..add(8108)
+    ..add(8109)
+    ..add(8110)
+    ..add(8111)
+    ..add(8112)
+    ..add(8113)
+    ..add(8114)
+    ..add(8115)
+    ..add(8116)
+    ..add(8117)
+    ..add(8118)
+    ..add(8119)
+    ..add(8120)
+    ..add(8121)
+    ..add(8122)
+    ..add(8123)
+    ..add(8124)
+    ..add(8125)
+    ..add(8126)
+    ..add(8127)
+    ..add(8128)
+    ..add(8129)
+    ..add(8130)
+    ..add(8131)
+    ..add(8132)
+    ..add(8133)
+    ..add(8134)
+    ..add(8135)
+    ..add(8136)
+    ..add(8137)
+    ..add(8138)
+    ..add(8139)
+    ..add(8140)
+    ..add(8141)
+    ..add(8142)
+    ..add(8143)
+    ..add(8144)
+    ..add(8145)
+    ..add(8146)
+    ..add(8147)
+    ..add(8148)
+    ..add(8149)
+    ..add(8150)
+    ..add(8151)
+    ..add(8152)
+    ..add(8153)
+    ..add(8154)
+    ..add(8155)
+    ..add(8156)
+    ..add(8157)
+    ..add(8158)
+    ..add(8159)
+    ..add(8160)
+    ..add(8161)
+    ..add(8162)
+    ..add(8163)
+    ..add(8164)
+    ..add(8165)
+    ..add(8166)
+    ..add(8167)
+    ..add(8168)
+    ..add(8169)
+    ..add(8170)
+    ..add(8171)
+    ..add(8172)
+    ..add(8173)
+    ..add(8174)
+    ..add(8175)
+    ..add(8176)
+    ..add(8177)
+    ..add(8178)
+    ..add(8179)
+    ..add(8180)
+    ..add(8181)
+    ..add(8182)
+    ..add(8183)
+    ..add(8184)
+    ..add(8185)
+    ..add(8186)
+    ..add(8187)
+    ..add(8188)
+    ..add(8189)
+    ..add(8190)
+    ..add(8191)
+    ..add(8192)
+    ..add(8193)
+    ..add(8194)
+    ..add(8195)
+    ..add(8196)
+    ..add(8197)
+    ..add(8198)
+    ..add(8199)
+    ..add(8200)
+    ..add(8201)
+    ..add(8202)
+    ..add(8203)
+    ..add(8204)
+    ..add(8205)
+    ..add(8206)
+    ..add(8207)
+    ..add(8208)
+    ..add(8209)
+    ..add(8210)
+    ..add(8211)
+    ..add(8212)
+    ..add(8213)
+    ..add(8214)
+    ..add(8215)
+    ..add(8216)
+    ..add(8217)
+    ..add(8218)
+    ..add(8219)
+    ..add(8220)
+    ..add(8221)
+    ..add(8222)
+    ..add(8223)
+    ..add(8224)
+    ..add(8225)
+    ..add(8226)
+    ..add(8227)
+    ..add(8228)
+    ..add(8229)
+    ..add(8230)
+    ..add(8231)
+    ..add(8232)
+    ..add(8233)
+    ..add(8234)
+    ..add(8235)
+    ..add(8236)
+    ..add(8237)
+    ..add(8238)
+    ..add(8239)
+    ..add(8240)
+    ..add(8241)
+    ..add(8242)
+    ..add(8243)
+    ..add(8244)
+    ..add(8245)
+    ..add(8246)
+    ..add(8247)
+    ..add(8248)
+    ..add(8249)
+    ..add(8250)
+    ..add(8251)
+    ..add(8252)
+    ..add(8253)
+    ..add(8254)
+    ..add(8255)
+    ..add(8256)
+    ..add(8257)
+    ..add(8258)
+    ..add(8259)
+    ..add(8260)
+    ..add(8261)
+    ..add(8262)
+    ..add(8263)
+    ..add(8264)
+    ..add(8265)
+    ..add(8266)
+    ..add(8267)
+    ..add(8268)
+    ..add(8269)
+    ..add(8270)
+    ..add(8271)
+    ..add(8272)
+    ..add(8273)
+    ..add(8274)
+    ..add(8275)
+    ..add(8276)
+    ..add(8277)
+    ..add(8278)
+    ..add(8279)
+    ..add(8280)
+    ..add(8281)
+    ..add(8282)
+    ..add(8283)
+    ..add(8284)
+    ..add(8285)
+    ..add(8286)
+    ..add(8287)
+    ..add(8288)
+    ..add(8289)
+    ..add(8290)
+    ..add(8291)
+    ..add(8292)
+    ..add(8293)
+    ..add(8294)
+    ..add(8295)
+    ..add(8296)
+    ..add(8297)
+    ..add(8298)
+    ..add(8299)
+    ..add(8300)
+    ..add(8301)
+    ..add(8302)
+    ..add(8303)
+    ..add(8304)
+    ..add(8305)
+    ..add(8306)
+    ..add(8307)
+    ..add(8308)
+    ..add(8309)
+    ..add(8310)
+    ..add(8311)
+    ..add(8312)
+    ..add(8313)
+    ..add(8314)
+    ..add(8315)
+    ..add(8316)
+    ..add(8317)
+    ..add(8318)
+    ..add(8319)
+    ..add(8320)
+    ..add(8321)
+    ..add(8322)
+    ..add(8323)
+    ..add(8324)
+    ..add(8325)
+    ..add(8326)
+    ..add(8327)
+    ..add(8328)
+    ..add(8329)
+    ..add(8330)
+    ..add(8331)
+    ..add(8332)
+    ..add(8333)
+    ..add(8334)
+    ..add(8335)
+    ..add(8336)
+    ..add(8337)
+    ..add(8338)
+    ..add(8339)
+    ..add(8340)
+    ..add(8341)
+    ..add(8342)
+    ..add(8343)
+    ..add(8344)
+    ..add(8345)
+    ..add(8346)
+    ..add(8347)
+    ..add(8348)
+    ..add(8349)
+    ..add(8350)
+    ..add(8351)
+    ..add(8352)
+    ..add(8353)
+    ..add(8354)
+    ..add(8355)
+    ..add(8356)
+    ..add(8357)
+    ..add(8358)
+    ..add(8359)
+    ..add(8360)
+    ..add(8361)
+    ..add(8362)
+    ..add(8363)
+    ..add(8364)
+    ..add(8365)
+    ..add(8366)
+    ..add(8367)
+    ..add(8368)
+    ..add(8369)
+    ..add(8370)
+    ..add(8371)
+    ..add(8372)
+    ..add(8373)
+    ..add(8374)
+    ..add(8375)
+    ..add(8376)
+    ..add(8377)
+    ..add(8378)
+    ..add(8379)
+    ..add(8380)
+    ..add(8381)
+    ..add(8382)
+    ..add(8383)
+    ..add(8384)
+    ..add(8385)
+    ..add(8386)
+    ..add(8387)
+    ..add(8388)
+    ..add(8389)
+    ..add(8390)
+    ..add(8391)
+    ..add(8392)
+    ..add(8393)
+    ..add(8394)
+    ..add(8395)
+    ..add(8396)
+    ..add(8397)
+    ..add(8398)
+    ..add(8399)
+    ..add(8400)
+    ..add(8401)
+    ..add(8402)
+    ..add(8403)
+    ..add(8404)
+    ..add(8405)
+    ..add(8406)
+    ..add(8407)
+    ..add(8408)
+    ..add(8409)
+    ..add(8410)
+    ..add(8411)
+    ..add(8412)
+    ..add(8413)
+    ..add(8414)
+    ..add(8415)
+    ..add(8416)
+    ..add(8417)
+    ..add(8418)
+    ..add(8419)
+    ..add(8420)
+    ..add(8421)
+    ..add(8422)
+    ..add(8423)
+    ..add(8424)
+    ..add(8425)
+    ..add(8426)
+    ..add(8427)
+    ..add(8428)
+    ..add(8429)
+    ..add(8430)
+    ..add(8431)
+    ..add(8432)
+    ..add(8433)
+    ..add(8434)
+    ..add(8435)
+    ..add(8436)
+    ..add(8437)
+    ..add(8438)
+    ..add(8439)
+    ..add(8440)
+    ..add(8441)
+    ..add(8442)
+    ..add(8443)
+    ..add(8444)
+    ..add(8445)
+    ..add(8446)
+    ..add(8447)
+    ..add(8448)
+    ..add(8449)
+    ..add(8450)
+    ..add(8451)
+    ..add(8452)
+    ..add(8453)
+    ..add(8454)
+    ..add(8455)
+    ..add(8456)
+    ..add(8457)
+    ..add(8458)
+    ..add(8459)
+    ..add(8460)
+    ..add(8461)
+    ..add(8462)
+    ..add(8463)
+    ..add(8464)
+    ..add(8465)
+    ..add(8466)
+    ..add(8467)
+    ..add(8468)
+    ..add(8469)
+    ..add(8470)
+    ..add(8471)
+    ..add(8472)
+    ..add(8473)
+    ..add(8474)
+    ..add(8475)
+    ..add(8476)
+    ..add(8477)
+    ..add(8478)
+    ..add(8479)
+    ..add(8480)
+    ..add(8481)
+    ..add(8482)
+    ..add(8483)
+    ..add(8484)
+    ..add(8485)
+    ..add(8486)
+    ..add(8487)
+    ..add(8488)
+    ..add(8489)
+    ..add(8490)
+    ..add(8491)
+    ..add(8492)
+    ..add(8493)
+    ..add(8494)
+    ..add(8495)
+    ..add(8496)
+    ..add(8497)
+    ..add(8498)
+    ..add(8499)
+    ..add(8500)
+    ..add(8501)
+    ..add(8502)
+    ..add(8503)
+    ..add(8504)
+    ..add(8505)
+    ..add(8506)
+    ..add(8507)
+    ..add(8508)
+    ..add(8509)
+    ..add(8510)
+    ..add(8511)
+    ..add(8512)
+    ..add(8513)
+    ..add(8514)
+    ..add(8515)
+    ..add(8516)
+    ..add(8517)
+    ..add(8518)
+    ..add(8519)
+    ..add(8520)
+    ..add(8521)
+    ..add(8522)
+    ..add(8523)
+    ..add(8524)
+    ..add(8525)
+    ..add(8526)
+    ..add(8527)
+    ..add(8528)
+    ..add(8529)
+    ..add(8530)
+    ..add(8531)
+    ..add(8532)
+    ..add(8533)
+    ..add(8534)
+    ..add(8535)
+    ..add(8536)
+    ..add(8537)
+    ..add(8538)
+    ..add(8539)
+    ..add(8540)
+    ..add(8541)
+    ..add(8542)
+    ..add(8543)
+    ..add(8544)
+    ..add(8545)
+    ..add(8546)
+    ..add(8547)
+    ..add(8548)
+    ..add(8549)
+    ..add(8550)
+    ..add(8551)
+    ..add(8552)
+    ..add(8553)
+    ..add(8554)
+    ..add(8555)
+    ..add(8556)
+    ..add(8557)
+    ..add(8558)
+    ..add(8559)
+    ..add(8560)
+    ..add(8561)
+    ..add(8562)
+    ..add(8563)
+    ..add(8564)
+    ..add(8565)
+    ..add(8566)
+    ..add(8567)
+    ..add(8568)
+    ..add(8569)
+    ..add(8570)
+    ..add(8571)
+    ..add(8572)
+    ..add(8573)
+    ..add(8574)
+    ..add(8575)
+    ..add(8576)
+    ..add(8577)
+    ..add(8578)
+    ..add(8579)
+    ..add(8580)
+    ..add(8581)
+    ..add(8582)
+    ..add(8583)
+    ..add(8584)
+    ..add(8585)
+    ..add(8586)
+    ..add(8587)
+    ..add(8588)
+    ..add(8589)
+    ..add(8590)
+    ..add(8591)
+    ..add(8592)
+    ..add(8593)
+    ..add(8594)
+    ..add(8595)
+    ..add(8596)
+    ..add(8597)
+    ..add(8598)
+    ..add(8599)
+    ..add(8600)
+    ..add(8601)
+    ..add(8602)
+    ..add(8603)
+    ..add(8604)
+    ..add(8605)
+    ..add(8606)
+    ..add(8607)
+    ..add(8608)
+    ..add(8609)
+    ..add(8610)
+    ..add(8611)
+    ..add(8612)
+    ..add(8613)
+    ..add(8614)
+    ..add(8615)
+    ..add(8616)
+    ..add(8617)
+    ..add(8618)
+    ..add(8619)
+    ..add(8620)
+    ..add(8621)
+    ..add(8622)
+    ..add(8623)
+    ..add(8624)
+    ..add(8625)
+    ..add(8626)
+    ..add(8627)
+    ..add(8628)
+    ..add(8629)
+    ..add(8630)
+    ..add(8631)
+    ..add(8632)
+    ..add(8633)
+    ..add(8634)
+    ..add(8635)
+    ..add(8636)
+    ..add(8637)
+    ..add(8638)
+    ..add(8639)
+    ..add(8640)
+    ..add(8641)
+    ..add(8642)
+    ..add(8643)
+    ..add(8644)
+    ..add(8645)
+    ..add(8646)
+    ..add(8647)
+    ..add(8648)
+    ..add(8649)
+    ..add(8650)
+    ..add(8651)
+    ..add(8652)
+    ..add(8653)
+    ..add(8654)
+    ..add(8655)
+    ..add(8656)
+    ..add(8657)
+    ..add(8658)
+    ..add(8659)
+    ..add(8660)
+    ..add(8661)
+    ..add(8662)
+    ..add(8663)
+    ..add(8664)
+    ..add(8665)
+    ..add(8666)
+    ..add(8667)
+    ..add(8668)
+    ..add(8669)
+    ..add(8670)
+    ..add(8671)
+    ..add(8672)
+    ..add(8673)
+    ..add(8674)
+    ..add(8675)
+    ..add(8676)
+    ..add(8677)
+    ..add(8678)
+    ..add(8679)
+    ..add(8680)
+    ..add(8681)
+    ..add(8682)
+    ..add(8683)
+    ..add(8684)
+    ..add(8685)
+    ..add(8686)
+    ..add(8687)
+    ..add(8688)
+    ..add(8689)
+    ..add(8690)
+    ..add(8691)
+    ..add(8692)
+    ..add(8693)
+    ..add(8694)
+    ..add(8695)
+    ..add(8696)
+    ..add(8697)
+    ..add(8698)
+    ..add(8699)
+    ..add(8700)
+    ..add(8701)
+    ..add(8702)
+    ..add(8703)
+    ..add(8704)
+    ..add(8705)
+    ..add(8706)
+    ..add(8707)
+    ..add(8708)
+    ..add(8709)
+    ..add(8710)
+    ..add(8711)
+    ..add(8712)
+    ..add(8713)
+    ..add(8714)
+    ..add(8715)
+    ..add(8716)
+    ..add(8717)
+    ..add(8718)
+    ..add(8719)
+    ..add(8720)
+    ..add(8721)
+    ..add(8722)
+    ..add(8723)
+    ..add(8724)
+    ..add(8725)
+    ..add(8726)
+    ..add(8727)
+    ..add(8728)
+    ..add(8729)
+    ..add(8730)
+    ..add(8731)
+    ..add(8732)
+    ..add(8733)
+    ..add(8734)
+    ..add(8735)
+    ..add(8736)
+    ..add(8737)
+    ..add(8738)
+    ..add(8739)
+    ..add(8740)
+    ..add(8741)
+    ..add(8742)
+    ..add(8743)
+    ..add(8744)
+    ..add(8745)
+    ..add(8746)
+    ..add(8747)
+    ..add(8748)
+    ..add(8749)
+    ..add(8750)
+    ..add(8751)
+    ..add(8752)
+    ..add(8753)
+    ..add(8754)
+    ..add(8755)
+    ..add(8756)
+    ..add(8757)
+    ..add(8758)
+    ..add(8759)
+    ..add(8760)
+    ..add(8761)
+    ..add(8762)
+    ..add(8763)
+    ..add(8764)
+    ..add(8765)
+    ..add(8766)
+    ..add(8767)
+    ..add(8768)
+    ..add(8769)
+    ..add(8770)
+    ..add(8771)
+    ..add(8772)
+    ..add(8773)
+    ..add(8774)
+    ..add(8775)
+    ..add(8776)
+    ..add(8777)
+    ..add(8778)
+    ..add(8779)
+    ..add(8780)
+    ..add(8781)
+    ..add(8782)
+    ..add(8783)
+    ..add(8784)
+    ..add(8785)
+    ..add(8786)
+    ..add(8787)
+    ..add(8788)
+    ..add(8789)
+    ..add(8790)
+    ..add(8791)
+    ..add(8792)
+    ..add(8793)
+    ..add(8794)
+    ..add(8795)
+    ..add(8796)
+    ..add(8797)
+    ..add(8798)
+    ..add(8799)
+    ..add(8800)
+    ..add(8801)
+    ..add(8802)
+    ..add(8803)
+    ..add(8804)
+    ..add(8805)
+    ..add(8806)
+    ..add(8807)
+    ..add(8808)
+    ..add(8809)
+    ..add(8810)
+    ..add(8811)
+    ..add(8812)
+    ..add(8813)
+    ..add(8814)
+    ..add(8815)
+    ..add(8816)
+    ..add(8817)
+    ..add(8818)
+    ..add(8819)
+    ..add(8820)
+    ..add(8821)
+    ..add(8822)
+    ..add(8823)
+    ..add(8824)
+    ..add(8825)
+    ..add(8826)
+    ..add(8827)
+    ..add(8828)
+    ..add(8829)
+    ..add(8830)
+    ..add(8831)
+    ..add(8832)
+    ..add(8833)
+    ..add(8834)
+    ..add(8835)
+    ..add(8836)
+    ..add(8837)
+    ..add(8838)
+    ..add(8839)
+    ..add(8840)
+    ..add(8841)
+    ..add(8842)
+    ..add(8843)
+    ..add(8844)
+    ..add(8845)
+    ..add(8846)
+    ..add(8847)
+    ..add(8848)
+    ..add(8849)
+    ..add(8850)
+    ..add(8851)
+    ..add(8852)
+    ..add(8853)
+    ..add(8854)
+    ..add(8855)
+    ..add(8856)
+    ..add(8857)
+    ..add(8858)
+    ..add(8859)
+    ..add(8860)
+    ..add(8861)
+    ..add(8862)
+    ..add(8863)
+    ..add(8864)
+    ..add(8865)
+    ..add(8866)
+    ..add(8867)
+    ..add(8868)
+    ..add(8869)
+    ..add(8870)
+    ..add(8871)
+    ..add(8872)
+    ..add(8873)
+    ..add(8874)
+    ..add(8875)
+    ..add(8876)
+    ..add(8877)
+    ..add(8878)
+    ..add(8879)
+    ..add(8880)
+    ..add(8881)
+    ..add(8882)
+    ..add(8883)
+    ..add(8884)
+    ..add(8885)
+    ..add(8886)
+    ..add(8887)
+    ..add(8888)
+    ..add(8889)
+    ..add(8890)
+    ..add(8891)
+    ..add(8892)
+    ..add(8893)
+    ..add(8894)
+    ..add(8895)
+    ..add(8896)
+    ..add(8897)
+    ..add(8898)
+    ..add(8899)
+    ..add(8900)
+    ..add(8901)
+    ..add(8902)
+    ..add(8903)
+    ..add(8904)
+    ..add(8905)
+    ..add(8906)
+    ..add(8907)
+    ..add(8908)
+    ..add(8909)
+    ..add(8910)
+    ..add(8911)
+    ..add(8912)
+    ..add(8913)
+    ..add(8914)
+    ..add(8915)
+    ..add(8916)
+    ..add(8917)
+    ..add(8918)
+    ..add(8919)
+    ..add(8920)
+    ..add(8921)
+    ..add(8922)
+    ..add(8923)
+    ..add(8924)
+    ..add(8925)
+    ..add(8926)
+    ..add(8927)
+    ..add(8928)
+    ..add(8929)
+    ..add(8930)
+    ..add(8931)
+    ..add(8932)
+    ..add(8933)
+    ..add(8934)
+    ..add(8935)
+    ..add(8936)
+    ..add(8937)
+    ..add(8938)
+    ..add(8939)
+    ..add(8940)
+    ..add(8941)
+    ..add(8942)
+    ..add(8943)
+    ..add(8944)
+    ..add(8945)
+    ..add(8946)
+    ..add(8947)
+    ..add(8948)
+    ..add(8949)
+    ..add(8950)
+    ..add(8951)
+    ..add(8952)
+    ..add(8953)
+    ..add(8954)
+    ..add(8955)
+    ..add(8956)
+    ..add(8957)
+    ..add(8958)
+    ..add(8959)
+    ..add(8960)
+    ..add(8961)
+    ..add(8962)
+    ..add(8963)
+    ..add(8964)
+    ..add(8965)
+    ..add(8966)
+    ..add(8967)
+    ..add(8968)
+    ..add(8969)
+    ..add(8970)
+    ..add(8971)
+    ..add(8972)
+    ..add(8973)
+    ..add(8974)
+    ..add(8975)
+    ..add(8976)
+    ..add(8977)
+    ..add(8978)
+    ..add(8979)
+    ..add(8980)
+    ..add(8981)
+    ..add(8982)
+    ..add(8983)
+    ..add(8984)
+    ..add(8985)
+    ..add(8986)
+    ..add(8987)
+    ..add(8988)
+    ..add(8989)
+    ..add(8990)
+    ..add(8991)
+    ..add(8992)
+    ..add(8993)
+    ..add(8994)
+    ..add(8995)
+    ..add(8996)
+    ..add(8997)
+    ..add(8998)
+    ..add(8999)
+    ..add(9000)
+    ..add(9001)
+    ..add(9002)
+    ..add(9003)
+    ..add(9004)
+    ..add(9005)
+    ..add(9006)
+    ..add(9007)
+    ..add(9008)
+    ..add(9009)
+    ..add(9010)
+    ..add(9011)
+    ..add(9012)
+    ..add(9013)
+    ..add(9014)
+    ..add(9015)
+    ..add(9016)
+    ..add(9017)
+    ..add(9018)
+    ..add(9019)
+    ..add(9020)
+    ..add(9021)
+    ..add(9022)
+    ..add(9023)
+    ..add(9024)
+    ..add(9025)
+    ..add(9026)
+    ..add(9027)
+    ..add(9028)
+    ..add(9029)
+    ..add(9030)
+    ..add(9031)
+    ..add(9032)
+    ..add(9033)
+    ..add(9034)
+    ..add(9035)
+    ..add(9036)
+    ..add(9037)
+    ..add(9038)
+    ..add(9039)
+    ..add(9040)
+    ..add(9041)
+    ..add(9042)
+    ..add(9043)
+    ..add(9044)
+    ..add(9045)
+    ..add(9046)
+    ..add(9047)
+    ..add(9048)
+    ..add(9049)
+    ..add(9050)
+    ..add(9051)
+    ..add(9052)
+    ..add(9053)
+    ..add(9054)
+    ..add(9055)
+    ..add(9056)
+    ..add(9057)
+    ..add(9058)
+    ..add(9059)
+    ..add(9060)
+    ..add(9061)
+    ..add(9062)
+    ..add(9063)
+    ..add(9064)
+    ..add(9065)
+    ..add(9066)
+    ..add(9067)
+    ..add(9068)
+    ..add(9069)
+    ..add(9070)
+    ..add(9071)
+    ..add(9072)
+    ..add(9073)
+    ..add(9074)
+    ..add(9075)
+    ..add(9076)
+    ..add(9077)
+    ..add(9078)
+    ..add(9079)
+    ..add(9080)
+    ..add(9081)
+    ..add(9082)
+    ..add(9083)
+    ..add(9084)
+    ..add(9085)
+    ..add(9086)
+    ..add(9087)
+    ..add(9088)
+    ..add(9089)
+    ..add(9090)
+    ..add(9091)
+    ..add(9092)
+    ..add(9093)
+    ..add(9094)
+    ..add(9095)
+    ..add(9096)
+    ..add(9097)
+    ..add(9098)
+    ..add(9099)
+    ..add(9100)
+    ..add(9101)
+    ..add(9102)
+    ..add(9103)
+    ..add(9104)
+    ..add(9105)
+    ..add(9106)
+    ..add(9107)
+    ..add(9108)
+    ..add(9109)
+    ..add(9110)
+    ..add(9111)
+    ..add(9112)
+    ..add(9113)
+    ..add(9114)
+    ..add(9115)
+    ..add(9116)
+    ..add(9117)
+    ..add(9118)
+    ..add(9119)
+    ..add(9120)
+    ..add(9121)
+    ..add(9122)
+    ..add(9123)
+    ..add(9124)
+    ..add(9125)
+    ..add(9126)
+    ..add(9127)
+    ..add(9128)
+    ..add(9129)
+    ..add(9130)
+    ..add(9131)
+    ..add(9132)
+    ..add(9133)
+    ..add(9134)
+    ..add(9135)
+    ..add(9136)
+    ..add(9137)
+    ..add(9138)
+    ..add(9139)
+    ..add(9140)
+    ..add(9141)
+    ..add(9142)
+    ..add(9143)
+    ..add(9144)
+    ..add(9145)
+    ..add(9146)
+    ..add(9147)
+    ..add(9148)
+    ..add(9149)
+    ..add(9150)
+    ..add(9151)
+    ..add(9152)
+    ..add(9153)
+    ..add(9154)
+    ..add(9155)
+    ..add(9156)
+    ..add(9157)
+    ..add(9158)
+    ..add(9159)
+    ..add(9160)
+    ..add(9161)
+    ..add(9162)
+    ..add(9163)
+    ..add(9164)
+    ..add(9165)
+    ..add(9166)
+    ..add(9167)
+    ..add(9168)
+    ..add(9169)
+    ..add(9170)
+    ..add(9171)
+    ..add(9172)
+    ..add(9173)
+    ..add(9174)
+    ..add(9175)
+    ..add(9176)
+    ..add(9177)
+    ..add(9178)
+    ..add(9179)
+    ..add(9180)
+    ..add(9181)
+    ..add(9182)
+    ..add(9183)
+    ..add(9184)
+    ..add(9185)
+    ..add(9186)
+    ..add(9187)
+    ..add(9188)
+    ..add(9189)
+    ..add(9190)
+    ..add(9191)
+    ..add(9192)
+    ..add(9193)
+    ..add(9194)
+    ..add(9195)
+    ..add(9196)
+    ..add(9197)
+    ..add(9198)
+    ..add(9199)
+    ..add(9200)
+    ..add(9201)
+    ..add(9202)
+    ..add(9203)
+    ..add(9204)
+    ..add(9205)
+    ..add(9206)
+    ..add(9207)
+    ..add(9208)
+    ..add(9209)
+    ..add(9210)
+    ..add(9211)
+    ..add(9212)
+    ..add(9213)
+    ..add(9214)
+    ..add(9215)
+    ..add(9216)
+    ..add(9217)
+    ..add(9218)
+    ..add(9219)
+    ..add(9220)
+    ..add(9221)
+    ..add(9222)
+    ..add(9223)
+    ..add(9224)
+    ..add(9225)
+    ..add(9226)
+    ..add(9227)
+    ..add(9228)
+    ..add(9229)
+    ..add(9230)
+    ..add(9231)
+    ..add(9232)
+    ..add(9233)
+    ..add(9234)
+    ..add(9235)
+    ..add(9236)
+    ..add(9237)
+    ..add(9238)
+    ..add(9239)
+    ..add(9240)
+    ..add(9241)
+    ..add(9242)
+    ..add(9243)
+    ..add(9244)
+    ..add(9245)
+    ..add(9246)
+    ..add(9247)
+    ..add(9248)
+    ..add(9249)
+    ..add(9250)
+    ..add(9251)
+    ..add(9252)
+    ..add(9253)
+    ..add(9254)
+    ..add(9255)
+    ..add(9256)
+    ..add(9257)
+    ..add(9258)
+    ..add(9259)
+    ..add(9260)
+    ..add(9261)
+    ..add(9262)
+    ..add(9263)
+    ..add(9264)
+    ..add(9265)
+    ..add(9266)
+    ..add(9267)
+    ..add(9268)
+    ..add(9269)
+    ..add(9270)
+    ..add(9271)
+    ..add(9272)
+    ..add(9273)
+    ..add(9274)
+    ..add(9275)
+    ..add(9276)
+    ..add(9277)
+    ..add(9278)
+    ..add(9279)
+    ..add(9280)
+    ..add(9281)
+    ..add(9282)
+    ..add(9283)
+    ..add(9284)
+    ..add(9285)
+    ..add(9286)
+    ..add(9287)
+    ..add(9288)
+    ..add(9289)
+    ..add(9290)
+    ..add(9291)
+    ..add(9292)
+    ..add(9293)
+    ..add(9294)
+    ..add(9295)
+    ..add(9296)
+    ..add(9297)
+    ..add(9298)
+    ..add(9299)
+    ..add(9300)
+    ..add(9301)
+    ..add(9302)
+    ..add(9303)
+    ..add(9304)
+    ..add(9305)
+    ..add(9306)
+    ..add(9307)
+    ..add(9308)
+    ..add(9309)
+    ..add(9310)
+    ..add(9311)
+    ..add(9312)
+    ..add(9313)
+    ..add(9314)
+    ..add(9315)
+    ..add(9316)
+    ..add(9317)
+    ..add(9318)
+    ..add(9319)
+    ..add(9320)
+    ..add(9321)
+    ..add(9322)
+    ..add(9323)
+    ..add(9324)
+    ..add(9325)
+    ..add(9326)
+    ..add(9327)
+    ..add(9328)
+    ..add(9329)
+    ..add(9330)
+    ..add(9331)
+    ..add(9332)
+    ..add(9333)
+    ..add(9334)
+    ..add(9335)
+    ..add(9336)
+    ..add(9337)
+    ..add(9338)
+    ..add(9339)
+    ..add(9340)
+    ..add(9341)
+    ..add(9342)
+    ..add(9343)
+    ..add(9344)
+    ..add(9345)
+    ..add(9346)
+    ..add(9347)
+    ..add(9348)
+    ..add(9349)
+    ..add(9350)
+    ..add(9351)
+    ..add(9352)
+    ..add(9353)
+    ..add(9354)
+    ..add(9355)
+    ..add(9356)
+    ..add(9357)
+    ..add(9358)
+    ..add(9359)
+    ..add(9360)
+    ..add(9361)
+    ..add(9362)
+    ..add(9363)
+    ..add(9364)
+    ..add(9365)
+    ..add(9366)
+    ..add(9367)
+    ..add(9368)
+    ..add(9369)
+    ..add(9370)
+    ..add(9371)
+    ..add(9372)
+    ..add(9373)
+    ..add(9374)
+    ..add(9375)
+    ..add(9376)
+    ..add(9377)
+    ..add(9378)
+    ..add(9379)
+    ..add(9380)
+    ..add(9381)
+    ..add(9382)
+    ..add(9383)
+    ..add(9384)
+    ..add(9385)
+    ..add(9386)
+    ..add(9387)
+    ..add(9388)
+    ..add(9389)
+    ..add(9390)
+    ..add(9391)
+    ..add(9392)
+    ..add(9393)
+    ..add(9394)
+    ..add(9395)
+    ..add(9396)
+    ..add(9397)
+    ..add(9398)
+    ..add(9399)
+    ..add(9400)
+    ..add(9401)
+    ..add(9402)
+    ..add(9403)
+    ..add(9404)
+    ..add(9405)
+    ..add(9406)
+    ..add(9407)
+    ..add(9408)
+    ..add(9409)
+    ..add(9410)
+    ..add(9411)
+    ..add(9412)
+    ..add(9413)
+    ..add(9414)
+    ..add(9415)
+    ..add(9416)
+    ..add(9417)
+    ..add(9418)
+    ..add(9419)
+    ..add(9420)
+    ..add(9421)
+    ..add(9422)
+    ..add(9423)
+    ..add(9424)
+    ..add(9425)
+    ..add(9426)
+    ..add(9427)
+    ..add(9428)
+    ..add(9429)
+    ..add(9430)
+    ..add(9431)
+    ..add(9432)
+    ..add(9433)
+    ..add(9434)
+    ..add(9435)
+    ..add(9436)
+    ..add(9437)
+    ..add(9438)
+    ..add(9439)
+    ..add(9440)
+    ..add(9441)
+    ..add(9442)
+    ..add(9443)
+    ..add(9444)
+    ..add(9445)
+    ..add(9446)
+    ..add(9447)
+    ..add(9448)
+    ..add(9449)
+    ..add(9450)
+    ..add(9451)
+    ..add(9452)
+    ..add(9453)
+    ..add(9454)
+    ..add(9455)
+    ..add(9456)
+    ..add(9457)
+    ..add(9458)
+    ..add(9459)
+    ..add(9460)
+    ..add(9461)
+    ..add(9462)
+    ..add(9463)
+    ..add(9464)
+    ..add(9465)
+    ..add(9466)
+    ..add(9467)
+    ..add(9468)
+    ..add(9469)
+    ..add(9470)
+    ..add(9471)
+    ..add(9472)
+    ..add(9473)
+    ..add(9474)
+    ..add(9475)
+    ..add(9476)
+    ..add(9477)
+    ..add(9478)
+    ..add(9479)
+    ..add(9480)
+    ..add(9481)
+    ..add(9482)
+    ..add(9483)
+    ..add(9484)
+    ..add(9485)
+    ..add(9486)
+    ..add(9487)
+    ..add(9488)
+    ..add(9489)
+    ..add(9490)
+    ..add(9491)
+    ..add(9492)
+    ..add(9493)
+    ..add(9494)
+    ..add(9495)
+    ..add(9496)
+    ..add(9497)
+    ..add(9498)
+    ..add(9499)
+    ..add(9500)
+    ..add(9501)
+    ..add(9502)
+    ..add(9503)
+    ..add(9504)
+    ..add(9505)
+    ..add(9506)
+    ..add(9507)
+    ..add(9508)
+    ..add(9509)
+    ..add(9510)
+    ..add(9511)
+    ..add(9512)
+    ..add(9513)
+    ..add(9514)
+    ..add(9515)
+    ..add(9516)
+    ..add(9517)
+    ..add(9518)
+    ..add(9519)
+    ..add(9520)
+    ..add(9521)
+    ..add(9522)
+    ..add(9523)
+    ..add(9524)
+    ..add(9525)
+    ..add(9526)
+    ..add(9527)
+    ..add(9528)
+    ..add(9529)
+    ..add(9530)
+    ..add(9531)
+    ..add(9532)
+    ..add(9533)
+    ..add(9534)
+    ..add(9535)
+    ..add(9536)
+    ..add(9537)
+    ..add(9538)
+    ..add(9539)
+    ..add(9540)
+    ..add(9541)
+    ..add(9542)
+    ..add(9543)
+    ..add(9544)
+    ..add(9545)
+    ..add(9546)
+    ..add(9547)
+    ..add(9548)
+    ..add(9549)
+    ..add(9550)
+    ..add(9551)
+    ..add(9552)
+    ..add(9553)
+    ..add(9554)
+    ..add(9555)
+    ..add(9556)
+    ..add(9557)
+    ..add(9558)
+    ..add(9559)
+    ..add(9560)
+    ..add(9561)
+    ..add(9562)
+    ..add(9563)
+    ..add(9564)
+    ..add(9565)
+    ..add(9566)
+    ..add(9567)
+    ..add(9568)
+    ..add(9569)
+    ..add(9570)
+    ..add(9571)
+    ..add(9572)
+    ..add(9573)
+    ..add(9574)
+    ..add(9575)
+    ..add(9576)
+    ..add(9577)
+    ..add(9578)
+    ..add(9579)
+    ..add(9580)
+    ..add(9581)
+    ..add(9582)
+    ..add(9583)
+    ..add(9584)
+    ..add(9585)
+    ..add(9586)
+    ..add(9587)
+    ..add(9588)
+    ..add(9589)
+    ..add(9590)
+    ..add(9591)
+    ..add(9592)
+    ..add(9593)
+    ..add(9594)
+    ..add(9595)
+    ..add(9596)
+    ..add(9597)
+    ..add(9598)
+    ..add(9599)
+    ..add(9600)
+    ..add(9601)
+    ..add(9602)
+    ..add(9603)
+    ..add(9604)
+    ..add(9605)
+    ..add(9606)
+    ..add(9607)
+    ..add(9608)
+    ..add(9609)
+    ..add(9610)
+    ..add(9611)
+    ..add(9612)
+    ..add(9613)
+    ..add(9614)
+    ..add(9615)
+    ..add(9616)
+    ..add(9617)
+    ..add(9618)
+    ..add(9619)
+    ..add(9620)
+    ..add(9621)
+    ..add(9622)
+    ..add(9623)
+    ..add(9624)
+    ..add(9625)
+    ..add(9626)
+    ..add(9627)
+    ..add(9628)
+    ..add(9629)
+    ..add(9630)
+    ..add(9631)
+    ..add(9632)
+    ..add(9633)
+    ..add(9634)
+    ..add(9635)
+    ..add(9636)
+    ..add(9637)
+    ..add(9638)
+    ..add(9639)
+    ..add(9640)
+    ..add(9641)
+    ..add(9642)
+    ..add(9643)
+    ..add(9644)
+    ..add(9645)
+    ..add(9646)
+    ..add(9647)
+    ..add(9648)
+    ..add(9649)
+    ..add(9650)
+    ..add(9651)
+    ..add(9652)
+    ..add(9653)
+    ..add(9654)
+    ..add(9655)
+    ..add(9656)
+    ..add(9657)
+    ..add(9658)
+    ..add(9659)
+    ..add(9660)
+    ..add(9661)
+    ..add(9662)
+    ..add(9663)
+    ..add(9664)
+    ..add(9665)
+    ..add(9666)
+    ..add(9667)
+    ..add(9668)
+    ..add(9669)
+    ..add(9670)
+    ..add(9671)
+    ..add(9672)
+    ..add(9673)
+    ..add(9674)
+    ..add(9675)
+    ..add(9676)
+    ..add(9677)
+    ..add(9678)
+    ..add(9679)
+    ..add(9680)
+    ..add(9681)
+    ..add(9682)
+    ..add(9683)
+    ..add(9684)
+    ..add(9685)
+    ..add(9686)
+    ..add(9687)
+    ..add(9688)
+    ..add(9689)
+    ..add(9690)
+    ..add(9691)
+    ..add(9692)
+    ..add(9693)
+    ..add(9694)
+    ..add(9695)
+    ..add(9696)
+    ..add(9697)
+    ..add(9698)
+    ..add(9699)
+    ..add(9700)
+    ..add(9701)
+    ..add(9702)
+    ..add(9703)
+    ..add(9704)
+    ..add(9705)
+    ..add(9706)
+    ..add(9707)
+    ..add(9708)
+    ..add(9709)
+    ..add(9710)
+    ..add(9711)
+    ..add(9712)
+    ..add(9713)
+    ..add(9714)
+    ..add(9715)
+    ..add(9716)
+    ..add(9717)
+    ..add(9718)
+    ..add(9719)
+    ..add(9720)
+    ..add(9721)
+    ..add(9722)
+    ..add(9723)
+    ..add(9724)
+    ..add(9725)
+    ..add(9726)
+    ..add(9727)
+    ..add(9728)
+    ..add(9729)
+    ..add(9730)
+    ..add(9731)
+    ..add(9732)
+    ..add(9733)
+    ..add(9734)
+    ..add(9735)
+    ..add(9736)
+    ..add(9737)
+    ..add(9738)
+    ..add(9739)
+    ..add(9740)
+    ..add(9741)
+    ..add(9742)
+    ..add(9743)
+    ..add(9744)
+    ..add(9745)
+    ..add(9746)
+    ..add(9747)
+    ..add(9748)
+    ..add(9749)
+    ..add(9750)
+    ..add(9751)
+    ..add(9752)
+    ..add(9753)
+    ..add(9754)
+    ..add(9755)
+    ..add(9756)
+    ..add(9757)
+    ..add(9758)
+    ..add(9759)
+    ..add(9760)
+    ..add(9761)
+    ..add(9762)
+    ..add(9763)
+    ..add(9764)
+    ..add(9765)
+    ..add(9766)
+    ..add(9767)
+    ..add(9768)
+    ..add(9769)
+    ..add(9770)
+    ..add(9771)
+    ..add(9772)
+    ..add(9773)
+    ..add(9774)
+    ..add(9775)
+    ..add(9776)
+    ..add(9777)
+    ..add(9778)
+    ..add(9779)
+    ..add(9780)
+    ..add(9781)
+    ..add(9782)
+    ..add(9783)
+    ..add(9784)
+    ..add(9785)
+    ..add(9786)
+    ..add(9787)
+    ..add(9788)
+    ..add(9789)
+    ..add(9790)
+    ..add(9791)
+    ..add(9792)
+    ..add(9793)
+    ..add(9794)
+    ..add(9795)
+    ..add(9796)
+    ..add(9797)
+    ..add(9798)
+    ..add(9799)
+    ..add(9800)
+    ..add(9801)
+    ..add(9802)
+    ..add(9803)
+    ..add(9804)
+    ..add(9805)
+    ..add(9806)
+    ..add(9807)
+    ..add(9808)
+    ..add(9809)
+    ..add(9810)
+    ..add(9811)
+    ..add(9812)
+    ..add(9813)
+    ..add(9814)
+    ..add(9815)
+    ..add(9816)
+    ..add(9817)
+    ..add(9818)
+    ..add(9819)
+    ..add(9820)
+    ..add(9821)
+    ..add(9822)
+    ..add(9823)
+    ..add(9824)
+    ..add(9825)
+    ..add(9826)
+    ..add(9827)
+    ..add(9828)
+    ..add(9829)
+    ..add(9830)
+    ..add(9831)
+    ..add(9832)
+    ..add(9833)
+    ..add(9834)
+    ..add(9835)
+    ..add(9836)
+    ..add(9837)
+    ..add(9838)
+    ..add(9839)
+    ..add(9840)
+    ..add(9841)
+    ..add(9842)
+    ..add(9843)
+    ..add(9844)
+    ..add(9845)
+    ..add(9846)
+    ..add(9847)
+    ..add(9848)
+    ..add(9849)
+    ..add(9850)
+    ..add(9851)
+    ..add(9852)
+    ..add(9853)
+    ..add(9854)
+    ..add(9855)
+    ..add(9856)
+    ..add(9857)
+    ..add(9858)
+    ..add(9859)
+    ..add(9860)
+    ..add(9861)
+    ..add(9862)
+    ..add(9863)
+    ..add(9864)
+    ..add(9865)
+    ..add(9866)
+    ..add(9867)
+    ..add(9868)
+    ..add(9869)
+    ..add(9870)
+    ..add(9871)
+    ..add(9872)
+    ..add(9873)
+    ..add(9874)
+    ..add(9875)
+    ..add(9876)
+    ..add(9877)
+    ..add(9878)
+    ..add(9879)
+    ..add(9880)
+    ..add(9881)
+    ..add(9882)
+    ..add(9883)
+    ..add(9884)
+    ..add(9885)
+    ..add(9886)
+    ..add(9887)
+    ..add(9888)
+    ..add(9889)
+    ..add(9890)
+    ..add(9891)
+    ..add(9892)
+    ..add(9893)
+    ..add(9894)
+    ..add(9895)
+    ..add(9896)
+    ..add(9897)
+    ..add(9898)
+    ..add(9899)
+    ..add(9900)
+    ..add(9901)
+    ..add(9902)
+    ..add(9903)
+    ..add(9904)
+    ..add(9905)
+    ..add(9906)
+    ..add(9907)
+    ..add(9908)
+    ..add(9909)
+    ..add(9910)
+    ..add(9911)
+    ..add(9912)
+    ..add(9913)
+    ..add(9914)
+    ..add(9915)
+    ..add(9916)
+    ..add(9917)
+    ..add(9918)
+    ..add(9919)
+    ..add(9920)
+    ..add(9921)
+    ..add(9922)
+    ..add(9923)
+    ..add(9924)
+    ..add(9925)
+    ..add(9926)
+    ..add(9927)
+    ..add(9928)
+    ..add(9929)
+    ..add(9930)
+    ..add(9931)
+    ..add(9932)
+    ..add(9933)
+    ..add(9934)
+    ..add(9935)
+    ..add(9936)
+    ..add(9937)
+    ..add(9938)
+    ..add(9939)
+    ..add(9940)
+    ..add(9941)
+    ..add(9942)
+    ..add(9943)
+    ..add(9944)
+    ..add(9945)
+    ..add(9946)
+    ..add(9947)
+    ..add(9948)
+    ..add(9949)
+    ..add(9950)
+    ..add(9951)
+    ..add(9952)
+    ..add(9953)
+    ..add(9954)
+    ..add(9955)
+    ..add(9956)
+    ..add(9957)
+    ..add(9958)
+    ..add(9959)
+    ..add(9960)
+    ..add(9961)
+    ..add(9962)
+    ..add(9963)
+    ..add(9964)
+    ..add(9965)
+    ..add(9966)
+    ..add(9967)
+    ..add(9968)
+    ..add(9969)
+    ..add(9970)
+    ..add(9971)
+    ..add(9972)
+    ..add(9973)
+    ..add(9974)
+    ..add(9975)
+    ..add(9976)
+    ..add(9977)
+    ..add(9978)
+    ..add(9979)
+    ..add(9980)
+    ..add(9981)
+    ..add(9982)
+    ..add(9983)
+    ..add(9984)
+    ..add(9985)
+    ..add(9986)
+    ..add(9987)
+    ..add(9988)
+    ..add(9989)
+    ..add(9990)
+    ..add(9991)
+    ..add(9992)
+    ..add(9993)
+    ..add(9994)
+    ..add(9995)
+    ..add(9996)
+    ..add(9997)
+    ..add(9998)
+    ..add(9999)
+    ..add(10000)
+    ..add(10001)
+    ..add(10002)
+    ..add(10003)
+    ..add(10004)
+    ..add(10005)
+    ..add(10006)
+    ..add(10007)
+    ..add(10008)
+    ..add(10009)
+    ..add(10010)
+    ..add(10011)
+    ..add(10012)
+    ..add(10013)
+    ..add(10014)
+    ..add(10015)
+    ..add(10016)
+    ..add(10017)
+    ..add(10018)
+    ..add(10019)
+    ..add(10020)
+    ..add(10021)
+    ..add(10022)
+    ..add(10023)
+    ..add(10024)
+    ..add(10025)
+    ..add(10026)
+    ..add(10027)
+    ..add(10028)
+    ..add(10029)
+    ..add(10030)
+    ..add(10031)
+    ..add(10032)
+    ..add(10033)
+    ..add(10034)
+    ..add(10035)
+    ..add(10036)
+    ..add(10037)
+    ..add(10038)
+    ..add(10039)
+    ..add(10040)
+    ..add(10041)
+    ..add(10042)
+    ..add(10043)
+    ..add(10044)
+    ..add(10045)
+    ..add(10046)
+    ..add(10047)
+    ..add(10048)
+    ..add(10049)
+    ..add(10050)
+    ..add(10051)
+    ..add(10052)
+    ..add(10053)
+    ..add(10054)
+    ..add(10055)
+    ..add(10056)
+    ..add(10057)
+    ..add(10058)
+    ..add(10059)
+    ..add(10060)
+    ..add(10061)
+    ..add(10062)
+    ..add(10063)
+    ..add(10064)
+    ..add(10065)
+    ..add(10066)
+    ..add(10067)
+    ..add(10068)
+    ..add(10069)
+    ..add(10070)
+    ..add(10071)
+    ..add(10072)
+    ..add(10073)
+    ..add(10074)
+    ..add(10075)
+    ..add(10076)
+    ..add(10077)
+    ..add(10078)
+    ..add(10079)
+    ..add(10080)
+    ..add(10081)
+    ..add(10082)
+    ..add(10083)
+    ..add(10084)
+    ..add(10085)
+    ..add(10086)
+    ..add(10087)
+    ..add(10088)
+    ..add(10089)
+    ..add(10090)
+    ..add(10091)
+    ..add(10092)
+    ..add(10093)
+    ..add(10094)
+    ..add(10095)
+    ..add(10096)
+    ..add(10097)
+    ..add(10098)
+    ..add(10099)
+    ..add(10100)
+    ..add(10101)
+    ..add(10102)
+    ..add(10103)
+    ..add(10104)
+    ..add(10105)
+    ..add(10106)
+    ..add(10107)
+    ..add(10108)
+    ..add(10109)
+    ..add(10110)
+    ..add(10111)
+    ..add(10112)
+    ..add(10113)
+    ..add(10114)
+    ..add(10115)
+    ..add(10116)
+    ..add(10117)
+    ..add(10118)
+    ..add(10119)
+    ..add(10120)
+    ..add(10121)
+    ..add(10122)
+    ..add(10123)
+    ..add(10124)
+    ..add(10125)
+    ..add(10126)
+    ..add(10127)
+    ..add(10128)
+    ..add(10129)
+    ..add(10130)
+    ..add(10131)
+    ..add(10132)
+    ..add(10133)
+    ..add(10134)
+    ..add(10135)
+    ..add(10136)
+    ..add(10137)
+    ..add(10138)
+    ..add(10139)
+    ..add(10140)
+    ..add(10141)
+    ..add(10142)
+    ..add(10143)
+    ..add(10144)
+    ..add(10145)
+    ..add(10146)
+    ..add(10147)
+    ..add(10148)
+    ..add(10149)
+    ..add(10150)
+    ..add(10151)
+    ..add(10152)
+    ..add(10153)
+    ..add(10154)
+    ..add(10155)
+    ..add(10156)
+    ..add(10157)
+    ..add(10158)
+    ..add(10159)
+    ..add(10160)
+    ..add(10161)
+    ..add(10162)
+    ..add(10163)
+    ..add(10164)
+    ..add(10165)
+    ..add(10166)
+    ..add(10167)
+    ..add(10168)
+    ..add(10169)
+    ..add(10170)
+    ..add(10171)
+    ..add(10172)
+    ..add(10173)
+    ..add(10174)
+    ..add(10175)
+    ..add(10176)
+    ..add(10177)
+    ..add(10178)
+    ..add(10179)
+    ..add(10180)
+    ..add(10181)
+    ..add(10182)
+    ..add(10183)
+    ..add(10184)
+    ..add(10185)
+    ..add(10186)
+    ..add(10187)
+    ..add(10188)
+    ..add(10189)
+    ..add(10190)
+    ..add(10191)
+    ..add(10192)
+    ..add(10193)
+    ..add(10194)
+    ..add(10195)
+    ..add(10196)
+    ..add(10197)
+    ..add(10198)
+    ..add(10199)
+    ..add(10200)
+    ..add(10201)
+    ..add(10202)
+    ..add(10203)
+    ..add(10204)
+    ..add(10205)
+    ..add(10206)
+    ..add(10207)
+    ..add(10208)
+    ..add(10209)
+    ..add(10210)
+    ..add(10211)
+    ..add(10212)
+    ..add(10213)
+    ..add(10214)
+    ..add(10215)
+    ..add(10216)
+    ..add(10217)
+    ..add(10218)
+    ..add(10219)
+    ..add(10220)
+    ..add(10221)
+    ..add(10222)
+    ..add(10223)
+    ..add(10224)
+    ..add(10225)
+    ..add(10226)
+    ..add(10227)
+    ..add(10228)
+    ..add(10229)
+    ..add(10230)
+    ..add(10231)
+    ..add(10232)
+    ..add(10233)
+    ..add(10234)
+    ..add(10235)
+    ..add(10236)
+    ..add(10237)
+    ..add(10238)
+    ..add(10239)
+    ..add(10240)
+    ..add(10241)
+    ..add(10242)
+    ..add(10243)
+    ..add(10244)
+    ..add(10245)
+    ..add(10246)
+    ..add(10247)
+    ..add(10248)
+    ..add(10249)
+    ..add(10250)
+    ..add(10251)
+    ..add(10252)
+    ..add(10253)
+    ..add(10254)
+    ..add(10255)
+    ..add(10256)
+    ..add(10257)
+    ..add(10258)
+    ..add(10259)
+    ..add(10260)
+    ..add(10261)
+    ..add(10262)
+    ..add(10263)
+    ..add(10264)
+    ..add(10265)
+    ..add(10266)
+    ..add(10267)
+    ..add(10268)
+    ..add(10269)
+    ..add(10270)
+    ..add(10271)
+    ..add(10272)
+    ..add(10273)
+    ..add(10274)
+    ..add(10275)
+    ..add(10276)
+    ..add(10277)
+    ..add(10278)
+    ..add(10279)
+    ..add(10280)
+    ..add(10281)
+    ..add(10282)
+    ..add(10283)
+    ..add(10284)
+    ..add(10285)
+    ..add(10286)
+    ..add(10287)
+    ..add(10288)
+    ..add(10289)
+    ..add(10290)
+    ..add(10291)
+    ..add(10292)
+    ..add(10293)
+    ..add(10294)
+    ..add(10295)
+    ..add(10296)
+    ..add(10297)
+    ..add(10298)
+    ..add(10299)
+    ..add(10300)
+    ..add(10301)
+    ..add(10302)
+    ..add(10303)
+    ..add(10304)
+    ..add(10305)
+    ..add(10306)
+    ..add(10307)
+    ..add(10308)
+    ..add(10309)
+    ..add(10310)
+    ..add(10311)
+    ..add(10312)
+    ..add(10313)
+    ..add(10314)
+    ..add(10315)
+    ..add(10316)
+    ..add(10317)
+    ..add(10318)
+    ..add(10319)
+    ..add(10320)
+    ..add(10321)
+    ..add(10322)
+    ..add(10323)
+    ..add(10324)
+    ..add(10325)
+    ..add(10326)
+    ..add(10327)
+    ..add(10328)
+    ..add(10329)
+    ..add(10330)
+    ..add(10331)
+    ..add(10332)
+    ..add(10333)
+    ..add(10334)
+    ..add(10335)
+    ..add(10336)
+    ..add(10337)
+    ..add(10338)
+    ..add(10339)
+    ..add(10340)
+    ..add(10341)
+    ..add(10342)
+    ..add(10343)
+    ..add(10344)
+    ..add(10345)
+    ..add(10346)
+    ..add(10347)
+    ..add(10348)
+    ..add(10349)
+    ..add(10350)
+    ..add(10351)
+    ..add(10352)
+    ..add(10353)
+    ..add(10354)
+    ..add(10355)
+    ..add(10356)
+    ..add(10357)
+    ..add(10358)
+    ..add(10359)
+    ..add(10360)
+    ..add(10361)
+    ..add(10362)
+    ..add(10363)
+    ..add(10364)
+    ..add(10365)
+    ..add(10366)
+    ..add(10367)
+    ..add(10368)
+    ..add(10369)
+    ..add(10370)
+    ..add(10371)
+    ..add(10372)
+    ..add(10373)
+    ..add(10374)
+    ..add(10375)
+    ..add(10376)
+    ..add(10377)
+    ..add(10378)
+    ..add(10379)
+    ..add(10380)
+    ..add(10381)
+    ..add(10382)
+    ..add(10383)
+    ..add(10384)
+    ..add(10385)
+    ..add(10386)
+    ..add(10387)
+    ..add(10388)
+    ..add(10389)
+    ..add(10390)
+    ..add(10391)
+    ..add(10392)
+    ..add(10393)
+    ..add(10394)
+    ..add(10395)
+    ..add(10396)
+    ..add(10397)
+    ..add(10398)
+    ..add(10399)
+    ..add(10400)
+    ..add(10401)
+    ..add(10402)
+    ..add(10403)
+    ..add(10404)
+    ..add(10405)
+    ..add(10406)
+    ..add(10407)
+    ..add(10408)
+    ..add(10409)
+    ..add(10410)
+    ..add(10411)
+    ..add(10412)
+    ..add(10413)
+    ..add(10414)
+    ..add(10415)
+    ..add(10416)
+    ..add(10417)
+    ..add(10418)
+    ..add(10419)
+    ..add(10420)
+    ..add(10421)
+    ..add(10422)
+    ..add(10423)
+    ..add(10424)
+    ..add(10425)
+    ..add(10426)
+    ..add(10427)
+    ..add(10428)
+    ..add(10429)
+    ..add(10430)
+    ..add(10431)
+    ..add(10432)
+    ..add(10433)
+    ..add(10434)
+    ..add(10435)
+    ..add(10436)
+    ..add(10437)
+    ..add(10438)
+    ..add(10439)
+    ..add(10440)
+    ..add(10441)
+    ..add(10442)
+    ..add(10443)
+    ..add(10444)
+    ..add(10445)
+    ..add(10446)
+    ..add(10447)
+    ..add(10448)
+    ..add(10449)
+    ..add(10450)
+    ..add(10451)
+    ..add(10452)
+    ..add(10453)
+    ..add(10454)
+    ..add(10455)
+    ..add(10456)
+    ..add(10457)
+    ..add(10458)
+    ..add(10459)
+    ..add(10460)
+    ..add(10461)
+    ..add(10462)
+    ..add(10463)
+    ..add(10464)
+    ..add(10465)
+    ..add(10466)
+    ..add(10467)
+    ..add(10468)
+    ..add(10469)
+    ..add(10470)
+    ..add(10471)
+    ..add(10472)
+    ..add(10473)
+    ..add(10474)
+    ..add(10475)
+    ..add(10476)
+    ..add(10477)
+    ..add(10478)
+    ..add(10479)
+    ..add(10480)
+    ..add(10481)
+    ..add(10482)
+    ..add(10483)
+    ..add(10484)
+    ..add(10485)
+    ..add(10486)
+    ..add(10487)
+    ..add(10488)
+    ..add(10489)
+    ..add(10490)
+    ..add(10491)
+    ..add(10492)
+    ..add(10493)
+    ..add(10494)
+    ..add(10495)
+    ..add(10496)
+    ..add(10497)
+    ..add(10498)
+    ..add(10499)
+    ..add(10500)
+    ..add(10501)
+    ..add(10502)
+    ..add(10503)
+    ..add(10504)
+    ..add(10505)
+    ..add(10506)
+    ..add(10507)
+    ..add(10508)
+    ..add(10509)
+    ..add(10510)
+    ..add(10511)
+    ..add(10512)
+    ..add(10513)
+    ..add(10514)
+    ..add(10515)
+    ..add(10516)
+    ..add(10517)
+    ..add(10518)
+    ..add(10519)
+    ..add(10520)
+    ..add(10521)
+    ..add(10522)
+    ..add(10523)
+    ..add(10524)
+    ..add(10525)
+    ..add(10526)
+    ..add(10527)
+    ..add(10528)
+    ..add(10529)
+    ..add(10530)
+    ..add(10531)
+    ..add(10532)
+    ..add(10533)
+    ..add(10534)
+    ..add(10535)
+    ..add(10536)
+    ..add(10537)
+    ..add(10538)
+    ..add(10539)
+    ..add(10540)
+    ..add(10541)
+    ..add(10542)
+    ..add(10543)
+    ..add(10544)
+    ..add(10545)
+    ..add(10546)
+    ..add(10547)
+    ..add(10548)
+    ..add(10549)
+    ..add(10550)
+    ..add(10551)
+    ..add(10552)
+    ..add(10553)
+    ..add(10554)
+    ..add(10555)
+    ..add(10556)
+    ..add(10557)
+    ..add(10558)
+    ..add(10559)
+    ..add(10560)
+    ..add(10561)
+    ..add(10562)
+    ..add(10563)
+    ..add(10564)
+    ..add(10565)
+    ..add(10566)
+    ..add(10567)
+    ..add(10568)
+    ..add(10569)
+    ..add(10570)
+    ..add(10571)
+    ..add(10572)
+    ..add(10573)
+    ..add(10574)
+    ..add(10575)
+    ..add(10576)
+    ..add(10577)
+    ..add(10578)
+    ..add(10579)
+    ..add(10580)
+    ..add(10581)
+    ..add(10582)
+    ..add(10583)
+    ..add(10584)
+    ..add(10585)
+    ..add(10586)
+    ..add(10587)
+    ..add(10588)
+    ..add(10589)
+    ..add(10590)
+    ..add(10591)
+    ..add(10592)
+    ..add(10593)
+    ..add(10594)
+    ..add(10595)
+    ..add(10596)
+    ..add(10597)
+    ..add(10598)
+    ..add(10599)
+    ..add(10600)
+    ..add(10601)
+    ..add(10602)
+    ..add(10603)
+    ..add(10604)
+    ..add(10605)
+    ..add(10606)
+    ..add(10607)
+    ..add(10608)
+    ..add(10609)
+    ..add(10610)
+    ..add(10611)
+    ..add(10612)
+    ..add(10613)
+    ..add(10614)
+    ..add(10615)
+    ..add(10616)
+    ..add(10617)
+    ..add(10618)
+    ..add(10619)
+    ..add(10620)
+    ..add(10621)
+    ..add(10622)
+    ..add(10623)
+    ..add(10624)
+    ..add(10625)
+    ..add(10626)
+    ..add(10627)
+    ..add(10628)
+    ..add(10629)
+    ..add(10630)
+    ..add(10631)
+    ..add(10632)
+    ..add(10633)
+    ..add(10634)
+    ..add(10635)
+    ..add(10636)
+    ..add(10637)
+    ..add(10638)
+    ..add(10639)
+    ..add(10640)
+    ..add(10641)
+    ..add(10642)
+    ..add(10643)
+    ..add(10644)
+    ..add(10645)
+    ..add(10646)
+    ..add(10647)
+    ..add(10648)
+    ..add(10649)
+    ..add(10650)
+    ..add(10651)
+    ..add(10652)
+    ..add(10653)
+    ..add(10654)
+    ..add(10655)
+    ..add(10656)
+    ..add(10657)
+    ..add(10658)
+    ..add(10659)
+    ..add(10660)
+    ..add(10661)
+    ..add(10662)
+    ..add(10663)
+    ..add(10664)
+    ..add(10665)
+    ..add(10666)
+    ..add(10667)
+    ..add(10668)
+    ..add(10669)
+    ..add(10670)
+    ..add(10671)
+    ..add(10672)
+    ..add(10673)
+    ..add(10674)
+    ..add(10675)
+    ..add(10676)
+    ..add(10677)
+    ..add(10678)
+    ..add(10679)
+    ..add(10680)
+    ..add(10681)
+    ..add(10682)
+    ..add(10683)
+    ..add(10684)
+    ..add(10685)
+    ..add(10686)
+    ..add(10687)
+    ..add(10688)
+    ..add(10689)
+    ..add(10690)
+    ..add(10691)
+    ..add(10692)
+    ..add(10693)
+    ..add(10694)
+    ..add(10695)
+    ..add(10696)
+    ..add(10697)
+    ..add(10698)
+    ..add(10699)
+    ..add(10700)
+    ..add(10701)
+    ..add(10702)
+    ..add(10703)
+    ..add(10704)
+    ..add(10705)
+    ..add(10706)
+    ..add(10707)
+    ..add(10708)
+    ..add(10709)
+    ..add(10710)
+    ..add(10711)
+    ..add(10712)
+    ..add(10713)
+    ..add(10714)
+    ..add(10715)
+    ..add(10716)
+    ..add(10717)
+    ..add(10718)
+    ..add(10719)
+    ..add(10720)
+    ..add(10721)
+    ..add(10722)
+    ..add(10723)
+    ..add(10724)
+    ..add(10725)
+    ..add(10726)
+    ..add(10727)
+    ..add(10728)
+    ..add(10729)
+    ..add(10730)
+    ..add(10731)
+    ..add(10732)
+    ..add(10733)
+    ..add(10734)
+    ..add(10735)
+    ..add(10736)
+    ..add(10737)
+    ..add(10738)
+    ..add(10739)
+    ..add(10740)
+    ..add(10741)
+    ..add(10742)
+    ..add(10743)
+    ..add(10744)
+    ..add(10745)
+    ..add(10746)
+    ..add(10747)
+    ..add(10748)
+    ..add(10749)
+    ..add(10750)
+    ..add(10751)
+    ..add(10752)
+    ..add(10753)
+    ..add(10754)
+    ..add(10755)
+    ..add(10756)
+    ..add(10757)
+    ..add(10758)
+    ..add(10759)
+    ..add(10760)
+    ..add(10761)
+    ..add(10762)
+    ..add(10763)
+    ..add(10764)
+    ..add(10765)
+    ..add(10766)
+    ..add(10767)
+    ..add(10768)
+    ..add(10769)
+    ..add(10770)
+    ..add(10771)
+    ..add(10772)
+    ..add(10773)
+    ..add(10774)
+    ..add(10775)
+    ..add(10776)
+    ..add(10777)
+    ..add(10778)
+    ..add(10779)
+    ..add(10780)
+    ..add(10781)
+    ..add(10782)
+    ..add(10783)
+    ..add(10784)
+    ..add(10785)
+    ..add(10786)
+    ..add(10787)
+    ..add(10788)
+    ..add(10789)
+    ..add(10790)
+    ..add(10791)
+    ..add(10792)
+    ..add(10793)
+    ..add(10794)
+    ..add(10795)
+    ..add(10796)
+    ..add(10797)
+    ..add(10798)
+    ..add(10799)
+    ..add(10800)
+    ..add(10801)
+    ..add(10802)
+    ..add(10803)
+    ..add(10804)
+    ..add(10805)
+    ..add(10806)
+    ..add(10807)
+    ..add(10808)
+    ..add(10809)
+    ..add(10810)
+    ..add(10811)
+    ..add(10812)
+    ..add(10813)
+    ..add(10814)
+    ..add(10815)
+    ..add(10816)
+    ..add(10817)
+    ..add(10818)
+    ..add(10819)
+    ..add(10820)
+    ..add(10821)
+    ..add(10822)
+    ..add(10823)
+    ..add(10824)
+    ..add(10825)
+    ..add(10826)
+    ..add(10827)
+    ..add(10828)
+    ..add(10829)
+    ..add(10830)
+    ..add(10831)
+    ..add(10832)
+    ..add(10833)
+    ..add(10834)
+    ..add(10835)
+    ..add(10836)
+    ..add(10837)
+    ..add(10838)
+    ..add(10839)
+    ..add(10840)
+    ..add(10841)
+    ..add(10842)
+    ..add(10843)
+    ..add(10844)
+    ..add(10845)
+    ..add(10846)
+    ..add(10847)
+    ..add(10848)
+    ..add(10849)
+    ..add(10850)
+    ..add(10851)
+    ..add(10852)
+    ..add(10853)
+    ..add(10854)
+    ..add(10855)
+    ..add(10856)
+    ..add(10857)
+    ..add(10858)
+    ..add(10859)
+    ..add(10860)
+    ..add(10861)
+    ..add(10862)
+    ..add(10863)
+    ..add(10864)
+    ..add(10865)
+    ..add(10866)
+    ..add(10867)
+    ..add(10868)
+    ..add(10869)
+    ..add(10870)
+    ..add(10871)
+    ..add(10872)
+    ..add(10873)
+    ..add(10874)
+    ..add(10875)
+    ..add(10876)
+    ..add(10877)
+    ..add(10878)
+    ..add(10879)
+    ..add(10880)
+    ..add(10881)
+    ..add(10882)
+    ..add(10883)
+    ..add(10884)
+    ..add(10885)
+    ..add(10886)
+    ..add(10887)
+    ..add(10888)
+    ..add(10889)
+    ..add(10890)
+    ..add(10891)
+    ..add(10892)
+    ..add(10893)
+    ..add(10894)
+    ..add(10895)
+    ..add(10896)
+    ..add(10897)
+    ..add(10898)
+    ..add(10899)
+    ..add(10900)
+    ..add(10901)
+    ..add(10902)
+    ..add(10903)
+    ..add(10904)
+    ..add(10905)
+    ..add(10906)
+    ..add(10907)
+    ..add(10908)
+    ..add(10909)
+    ..add(10910)
+    ..add(10911)
+    ..add(10912)
+    ..add(10913)
+    ..add(10914)
+    ..add(10915)
+    ..add(10916)
+    ..add(10917)
+    ..add(10918)
+    ..add(10919)
+    ..add(10920)
+    ..add(10921)
+    ..add(10922)
+    ..add(10923)
+    ..add(10924)
+    ..add(10925)
+    ..add(10926)
+    ..add(10927)
+    ..add(10928)
+    ..add(10929)
+    ..add(10930)
+    ..add(10931)
+    ..add(10932)
+    ..add(10933)
+    ..add(10934)
+    ..add(10935)
+    ..add(10936)
+    ..add(10937)
+    ..add(10938)
+    ..add(10939)
+    ..add(10940)
+    ..add(10941)
+    ..add(10942)
+    ..add(10943)
+    ..add(10944)
+    ..add(10945)
+    ..add(10946)
+    ..add(10947)
+    ..add(10948)
+    ..add(10949)
+    ..add(10950)
+    ..add(10951)
+    ..add(10952)
+    ..add(10953)
+    ..add(10954)
+    ..add(10955)
+    ..add(10956)
+    ..add(10957)
+    ..add(10958)
+    ..add(10959)
+    ..add(10960)
+    ..add(10961)
+    ..add(10962)
+    ..add(10963)
+    ..add(10964)
+    ..add(10965)
+    ..add(10966)
+    ..add(10967)
+    ..add(10968)
+    ..add(10969)
+    ..add(10970)
+    ..add(10971)
+    ..add(10972)
+    ..add(10973)
+    ..add(10974)
+    ..add(10975)
+    ..add(10976)
+    ..add(10977)
+    ..add(10978)
+    ..add(10979)
+    ..add(10980)
+    ..add(10981)
+    ..add(10982)
+    ..add(10983)
+    ..add(10984)
+    ..add(10985)
+    ..add(10986)
+    ..add(10987)
+    ..add(10988)
+    ..add(10989)
+    ..add(10990)
+    ..add(10991)
+    ..add(10992)
+    ..add(10993)
+    ..add(10994)
+    ..add(10995)
+    ..add(10996)
+    ..add(10997)
+    ..add(10998)
+    ..add(10999)
+    ..add(11000)
+    ..add(11001)
+    ..add(11002)
+    ..add(11003)
+    ..add(11004)
+    ..add(11005)
+    ..add(11006)
+    ..add(11007)
+    ..add(11008)
+    ..add(11009)
+    ..add(11010)
+    ..add(11011)
+    ..add(11012)
+    ..add(11013)
+    ..add(11014)
+    ..add(11015)
+    ..add(11016)
+    ..add(11017)
+    ..add(11018)
+    ..add(11019)
+    ..add(11020)
+    ..add(11021)
+    ..add(11022)
+    ..add(11023)
+    ..add(11024)
+    ..add(11025)
+    ..add(11026)
+    ..add(11027)
+    ..add(11028)
+    ..add(11029)
+    ..add(11030)
+    ..add(11031)
+    ..add(11032)
+    ..add(11033)
+    ..add(11034)
+    ..add(11035)
+    ..add(11036)
+    ..add(11037)
+    ..add(11038)
+    ..add(11039)
+    ..add(11040)
+    ..add(11041)
+    ..add(11042)
+    ..add(11043)
+    ..add(11044)
+    ..add(11045)
+    ..add(11046)
+    ..add(11047)
+    ..add(11048)
+    ..add(11049)
+    ..add(11050)
+    ..add(11051)
+    ..add(11052)
+    ..add(11053)
+    ..add(11054)
+    ..add(11055)
+    ..add(11056)
+    ..add(11057)
+    ..add(11058)
+    ..add(11059)
+    ..add(11060)
+    ..add(11061)
+    ..add(11062)
+    ..add(11063)
+    ..add(11064)
+    ..add(11065)
+    ..add(11066)
+    ..add(11067)
+    ..add(11068)
+    ..add(11069)
+    ..add(11070)
+    ..add(11071)
+    ..add(11072)
+    ..add(11073)
+    ..add(11074)
+    ..add(11075)
+    ..add(11076)
+    ..add(11077)
+    ..add(11078)
+    ..add(11079)
+    ..add(11080)
+    ..add(11081)
+    ..add(11082)
+    ..add(11083)
+    ..add(11084)
+    ..add(11085)
+    ..add(11086)
+    ..add(11087)
+    ..add(11088)
+    ..add(11089)
+    ..add(11090)
+    ..add(11091)
+    ..add(11092)
+    ..add(11093)
+    ..add(11094)
+    ..add(11095)
+    ..add(11096)
+    ..add(11097)
+    ..add(11098)
+    ..add(11099)
+    ..add(11100)
+    ..add(11101)
+    ..add(11102)
+    ..add(11103)
+    ..add(11104)
+    ..add(11105)
+    ..add(11106)
+    ..add(11107)
+    ..add(11108)
+    ..add(11109)
+    ..add(11110)
+    ..add(11111)
+    ..add(11112)
+    ..add(11113)
+    ..add(11114)
+    ..add(11115)
+    ..add(11116)
+    ..add(11117)
+    ..add(11118)
+    ..add(11119)
+    ..add(11120)
+    ..add(11121)
+    ..add(11122)
+    ..add(11123)
+    ..add(11124)
+    ..add(11125)
+    ..add(11126)
+    ..add(11127)
+    ..add(11128)
+    ..add(11129)
+    ..add(11130)
+    ..add(11131)
+    ..add(11132)
+    ..add(11133)
+    ..add(11134)
+    ..add(11135)
+    ..add(11136)
+    ..add(11137)
+    ..add(11138)
+    ..add(11139)
+    ..add(11140)
+    ..add(11141)
+    ..add(11142)
+    ..add(11143)
+    ..add(11144)
+    ..add(11145)
+    ..add(11146)
+    ..add(11147)
+    ..add(11148)
+    ..add(11149)
+    ..add(11150)
+    ..add(11151)
+    ..add(11152)
+    ..add(11153)
+    ..add(11154)
+    ..add(11155)
+    ..add(11156)
+    ..add(11157)
+    ..add(11158)
+    ..add(11159)
+    ..add(11160)
+    ..add(11161)
+    ..add(11162)
+    ..add(11163)
+    ..add(11164)
+    ..add(11165)
+    ..add(11166)
+    ..add(11167)
+    ..add(11168)
+    ..add(11169)
+    ..add(11170)
+    ..add(11171)
+    ..add(11172)
+    ..add(11173)
+    ..add(11174)
+    ..add(11175)
+    ..add(11176)
+    ..add(11177)
+    ..add(11178)
+    ..add(11179)
+    ..add(11180)
+    ..add(11181)
+    ..add(11182)
+    ..add(11183)
+    ..add(11184)
+    ..add(11185)
+    ..add(11186)
+    ..add(11187)
+    ..add(11188)
+    ..add(11189)
+    ..add(11190)
+    ..add(11191)
+    ..add(11192)
+    ..add(11193)
+    ..add(11194)
+    ..add(11195)
+    ..add(11196)
+    ..add(11197)
+    ..add(11198)
+    ..add(11199)
+    ..add(11200)
+    ..add(11201)
+    ..add(11202)
+    ..add(11203)
+    ..add(11204)
+    ..add(11205)
+    ..add(11206)
+    ..add(11207)
+    ..add(11208)
+    ..add(11209)
+    ..add(11210)
+    ..add(11211)
+    ..add(11212)
+    ..add(11213)
+    ..add(11214)
+    ..add(11215)
+    ..add(11216)
+    ..add(11217)
+    ..add(11218)
+    ..add(11219)
+    ..add(11220)
+    ..add(11221)
+    ..add(11222)
+    ..add(11223)
+    ..add(11224)
+    ..add(11225)
+    ..add(11226)
+    ..add(11227)
+    ..add(11228)
+    ..add(11229)
+    ..add(11230)
+    ..add(11231)
+    ..add(11232)
+    ..add(11233)
+    ..add(11234)
+    ..add(11235)
+    ..add(11236)
+    ..add(11237)
+    ..add(11238)
+    ..add(11239)
+    ..add(11240)
+    ..add(11241)
+    ..add(11242)
+    ..add(11243)
+    ..add(11244)
+    ..add(11245)
+    ..add(11246)
+    ..add(11247)
+    ..add(11248)
+    ..add(11249)
+    ..add(11250)
+    ..add(11251)
+    ..add(11252)
+    ..add(11253)
+    ..add(11254)
+    ..add(11255)
+    ..add(11256)
+    ..add(11257)
+    ..add(11258)
+    ..add(11259)
+    ..add(11260)
+    ..add(11261)
+    ..add(11262)
+    ..add(11263)
+    ..add(11264)
+    ..add(11265)
+    ..add(11266)
+    ..add(11267)
+    ..add(11268)
+    ..add(11269)
+    ..add(11270)
+    ..add(11271)
+    ..add(11272)
+    ..add(11273)
+    ..add(11274)
+    ..add(11275)
+    ..add(11276)
+    ..add(11277)
+    ..add(11278)
+    ..add(11279)
+    ..add(11280)
+    ..add(11281)
+    ..add(11282)
+    ..add(11283)
+    ..add(11284)
+    ..add(11285)
+    ..add(11286)
+    ..add(11287)
+    ..add(11288)
+    ..add(11289)
+    ..add(11290)
+    ..add(11291)
+    ..add(11292)
+    ..add(11293)
+    ..add(11294)
+    ..add(11295)
+    ..add(11296)
+    ..add(11297)
+    ..add(11298)
+    ..add(11299)
+    ..add(11300)
+    ..add(11301)
+    ..add(11302)
+    ..add(11303)
+    ..add(11304)
+    ..add(11305)
+    ..add(11306)
+    ..add(11307)
+    ..add(11308)
+    ..add(11309)
+    ..add(11310)
+    ..add(11311)
+    ..add(11312)
+    ..add(11313)
+    ..add(11314)
+    ..add(11315)
+    ..add(11316)
+    ..add(11317)
+    ..add(11318)
+    ..add(11319)
+    ..add(11320)
+    ..add(11321)
+    ..add(11322)
+    ..add(11323)
+    ..add(11324)
+    ..add(11325)
+    ..add(11326)
+    ..add(11327)
+    ..add(11328)
+    ..add(11329)
+    ..add(11330)
+    ..add(11331)
+    ..add(11332)
+    ..add(11333)
+    ..add(11334)
+    ..add(11335)
+    ..add(11336)
+    ..add(11337)
+    ..add(11338)
+    ..add(11339)
+    ..add(11340)
+    ..add(11341)
+    ..add(11342)
+    ..add(11343)
+    ..add(11344)
+    ..add(11345)
+    ..add(11346)
+    ..add(11347)
+    ..add(11348)
+    ..add(11349)
+    ..add(11350)
+    ..add(11351)
+    ..add(11352)
+    ..add(11353)
+    ..add(11354)
+    ..add(11355)
+    ..add(11356)
+    ..add(11357)
+    ..add(11358)
+    ..add(11359)
+    ..add(11360)
+    ..add(11361)
+    ..add(11362)
+    ..add(11363)
+    ..add(11364)
+    ..add(11365)
+    ..add(11366)
+    ..add(11367)
+    ..add(11368)
+    ..add(11369)
+    ..add(11370)
+    ..add(11371)
+    ..add(11372)
+    ..add(11373)
+    ..add(11374)
+    ..add(11375)
+    ..add(11376)
+    ..add(11377)
+    ..add(11378)
+    ..add(11379)
+    ..add(11380)
+    ..add(11381)
+    ..add(11382)
+    ..add(11383)
+    ..add(11384)
+    ..add(11385)
+    ..add(11386)
+    ..add(11387)
+    ..add(11388)
+    ..add(11389)
+    ..add(11390)
+    ..add(11391)
+    ..add(11392)
+    ..add(11393)
+    ..add(11394)
+    ..add(11395)
+    ..add(11396)
+    ..add(11397)
+    ..add(11398)
+    ..add(11399)
+    ..add(11400)
+    ..add(11401)
+    ..add(11402)
+    ..add(11403)
+    ..add(11404)
+    ..add(11405)
+    ..add(11406)
+    ..add(11407)
+    ..add(11408)
+    ..add(11409)
+    ..add(11410)
+    ..add(11411)
+    ..add(11412)
+    ..add(11413)
+    ..add(11414)
+    ..add(11415)
+    ..add(11416)
+    ..add(11417)
+    ..add(11418)
+    ..add(11419)
+    ..add(11420)
+    ..add(11421)
+    ..add(11422)
+    ..add(11423)
+    ..add(11424)
+    ..add(11425)
+    ..add(11426)
+    ..add(11427)
+    ..add(11428)
+    ..add(11429)
+    ..add(11430)
+    ..add(11431)
+    ..add(11432)
+    ..add(11433)
+    ..add(11434)
+    ..add(11435)
+    ..add(11436)
+    ..add(11437)
+    ..add(11438)
+    ..add(11439)
+    ..add(11440)
+    ..add(11441)
+    ..add(11442)
+    ..add(11443)
+    ..add(11444)
+    ..add(11445)
+    ..add(11446)
+    ..add(11447)
+    ..add(11448)
+    ..add(11449)
+    ..add(11450)
+    ..add(11451)
+    ..add(11452)
+    ..add(11453)
+    ..add(11454)
+    ..add(11455)
+    ..add(11456)
+    ..add(11457)
+    ..add(11458)
+    ..add(11459)
+    ..add(11460)
+    ..add(11461)
+    ..add(11462)
+    ..add(11463)
+    ..add(11464)
+    ..add(11465)
+    ..add(11466)
+    ..add(11467)
+    ..add(11468)
+    ..add(11469)
+    ..add(11470)
+    ..add(11471)
+    ..add(11472)
+    ..add(11473)
+    ..add(11474)
+    ..add(11475)
+    ..add(11476)
+    ..add(11477)
+    ..add(11478)
+    ..add(11479)
+    ..add(11480)
+    ..add(11481)
+    ..add(11482)
+    ..add(11483)
+    ..add(11484)
+    ..add(11485)
+    ..add(11486)
+    ..add(11487)
+    ..add(11488)
+    ..add(11489)
+    ..add(11490)
+    ..add(11491)
+    ..add(11492)
+    ..add(11493)
+    ..add(11494)
+    ..add(11495)
+    ..add(11496)
+    ..add(11497)
+    ..add(11498)
+    ..add(11499)
+    ..add(11500)
+    ..add(11501)
+    ..add(11502)
+    ..add(11503)
+    ..add(11504)
+    ..add(11505)
+    ..add(11506)
+    ..add(11507)
+    ..add(11508)
+    ..add(11509)
+    ..add(11510)
+    ..add(11511)
+    ..add(11512)
+    ..add(11513)
+    ..add(11514)
+    ..add(11515)
+    ..add(11516)
+    ..add(11517)
+    ..add(11518)
+    ..add(11519)
+    ..add(11520)
+    ..add(11521)
+    ..add(11522)
+    ..add(11523)
+    ..add(11524)
+    ..add(11525)
+    ..add(11526)
+    ..add(11527)
+    ..add(11528)
+    ..add(11529)
+    ..add(11530)
+    ..add(11531)
+    ..add(11532)
+    ..add(11533)
+    ..add(11534)
+    ..add(11535)
+    ..add(11536)
+    ..add(11537)
+    ..add(11538)
+    ..add(11539)
+    ..add(11540)
+    ..add(11541)
+    ..add(11542)
+    ..add(11543)
+    ..add(11544)
+    ..add(11545)
+    ..add(11546)
+    ..add(11547)
+    ..add(11548)
+    ..add(11549)
+    ..add(11550)
+    ..add(11551)
+    ..add(11552)
+    ..add(11553)
+    ..add(11554)
+    ..add(11555)
+    ..add(11556)
+    ..add(11557)
+    ..add(11558)
+    ..add(11559)
+    ..add(11560)
+    ..add(11561)
+    ..add(11562)
+    ..add(11563)
+    ..add(11564)
+    ..add(11565)
+    ..add(11566)
+    ..add(11567)
+    ..add(11568)
+    ..add(11569)
+    ..add(11570)
+    ..add(11571)
+    ..add(11572)
+    ..add(11573)
+    ..add(11574)
+    ..add(11575)
+    ..add(11576)
+    ..add(11577)
+    ..add(11578)
+    ..add(11579)
+    ..add(11580)
+    ..add(11581)
+    ..add(11582)
+    ..add(11583)
+    ..add(11584)
+    ..add(11585)
+    ..add(11586)
+    ..add(11587)
+    ..add(11588)
+    ..add(11589)
+    ..add(11590)
+    ..add(11591)
+    ..add(11592)
+    ..add(11593)
+    ..add(11594)
+    ..add(11595)
+    ..add(11596)
+    ..add(11597)
+    ..add(11598)
+    ..add(11599)
+    ..add(11600)
+    ..add(11601)
+    ..add(11602)
+    ..add(11603)
+    ..add(11604)
+    ..add(11605)
+    ..add(11606)
+    ..add(11607)
+    ..add(11608)
+    ..add(11609)
+    ..add(11610)
+    ..add(11611)
+    ..add(11612)
+    ..add(11613)
+    ..add(11614)
+    ..add(11615)
+    ..add(11616)
+    ..add(11617)
+    ..add(11618)
+    ..add(11619)
+    ..add(11620)
+    ..add(11621)
+    ..add(11622)
+    ..add(11623)
+    ..add(11624)
+    ..add(11625)
+    ..add(11626)
+    ..add(11627)
+    ..add(11628)
+    ..add(11629)
+    ..add(11630)
+    ..add(11631)
+    ..add(11632)
+    ..add(11633)
+    ..add(11634)
+    ..add(11635)
+    ..add(11636)
+    ..add(11637)
+    ..add(11638)
+    ..add(11639)
+    ..add(11640)
+    ..add(11641)
+    ..add(11642)
+    ..add(11643)
+    ..add(11644)
+    ..add(11645)
+    ..add(11646)
+    ..add(11647)
+    ..add(11648)
+    ..add(11649)
+    ..add(11650)
+    ..add(11651)
+    ..add(11652)
+    ..add(11653)
+    ..add(11654)
+    ..add(11655)
+    ..add(11656)
+    ..add(11657)
+    ..add(11658)
+    ..add(11659)
+    ..add(11660)
+    ..add(11661)
+    ..add(11662)
+    ..add(11663)
+    ..add(11664)
+    ..add(11665)
+    ..add(11666)
+    ..add(11667)
+    ..add(11668)
+    ..add(11669)
+    ..add(11670)
+    ..add(11671)
+    ..add(11672)
+    ..add(11673)
+    ..add(11674)
+    ..add(11675)
+    ..add(11676)
+    ..add(11677)
+    ..add(11678)
+    ..add(11679)
+    ..add(11680)
+    ..add(11681)
+    ..add(11682)
+    ..add(11683)
+    ..add(11684)
+    ..add(11685)
+    ..add(11686)
+    ..add(11687)
+    ..add(11688)
+    ..add(11689)
+    ..add(11690)
+    ..add(11691)
+    ..add(11692)
+    ..add(11693)
+    ..add(11694)
+    ..add(11695)
+    ..add(11696)
+    ..add(11697)
+    ..add(11698)
+    ..add(11699)
+    ..add(11700)
+    ..add(11701)
+    ..add(11702)
+    ..add(11703)
+    ..add(11704)
+    ..add(11705)
+    ..add(11706)
+    ..add(11707)
+    ..add(11708)
+    ..add(11709)
+    ..add(11710)
+    ..add(11711)
+    ..add(11712)
+    ..add(11713)
+    ..add(11714)
+    ..add(11715)
+    ..add(11716)
+    ..add(11717)
+    ..add(11718)
+    ..add(11719)
+    ..add(11720)
+    ..add(11721)
+    ..add(11722)
+    ..add(11723)
+    ..add(11724)
+    ..add(11725)
+    ..add(11726)
+    ..add(11727)
+    ..add(11728)
+    ..add(11729)
+    ..add(11730)
+    ..add(11731)
+    ..add(11732)
+    ..add(11733)
+    ..add(11734)
+    ..add(11735)
+    ..add(11736)
+    ..add(11737)
+    ..add(11738)
+    ..add(11739)
+    ..add(11740)
+    ..add(11741)
+    ..add(11742)
+    ..add(11743)
+    ..add(11744)
+    ..add(11745)
+    ..add(11746)
+    ..add(11747)
+    ..add(11748)
+    ..add(11749)
+    ..add(11750)
+    ..add(11751)
+    ..add(11752)
+    ..add(11753)
+    ..add(11754)
+    ..add(11755)
+    ..add(11756)
+    ..add(11757)
+    ..add(11758)
+    ..add(11759)
+    ..add(11760)
+    ..add(11761)
+    ..add(11762)
+    ..add(11763)
+    ..add(11764)
+    ..add(11765)
+    ..add(11766)
+    ..add(11767)
+    ..add(11768)
+    ..add(11769)
+    ..add(11770)
+    ..add(11771)
+    ..add(11772)
+    ..add(11773)
+    ..add(11774)
+    ..add(11775)
+    ..add(11776)
+    ..add(11777)
+    ..add(11778)
+    ..add(11779)
+    ..add(11780)
+    ..add(11781)
+    ..add(11782)
+    ..add(11783)
+    ..add(11784)
+    ..add(11785)
+    ..add(11786)
+    ..add(11787)
+    ..add(11788)
+    ..add(11789)
+    ..add(11790)
+    ..add(11791)
+    ..add(11792)
+    ..add(11793)
+    ..add(11794)
+    ..add(11795)
+    ..add(11796)
+    ..add(11797)
+    ..add(11798)
+    ..add(11799)
+    ..add(11800)
+    ..add(11801)
+    ..add(11802)
+    ..add(11803)
+    ..add(11804)
+    ..add(11805)
+    ..add(11806)
+    ..add(11807)
+    ..add(11808)
+    ..add(11809)
+    ..add(11810)
+    ..add(11811)
+    ..add(11812)
+    ..add(11813)
+    ..add(11814)
+    ..add(11815)
+    ..add(11816)
+    ..add(11817)
+    ..add(11818)
+    ..add(11819)
+    ..add(11820)
+    ..add(11821)
+    ..add(11822)
+    ..add(11823)
+    ..add(11824)
+    ..add(11825)
+    ..add(11826)
+    ..add(11827)
+    ..add(11828)
+    ..add(11829)
+    ..add(11830)
+    ..add(11831)
+    ..add(11832)
+    ..add(11833)
+    ..add(11834)
+    ..add(11835)
+    ..add(11836)
+    ..add(11837)
+    ..add(11838)
+    ..add(11839)
+    ..add(11840)
+    ..add(11841)
+    ..add(11842)
+    ..add(11843)
+    ..add(11844)
+    ..add(11845)
+    ..add(11846)
+    ..add(11847)
+    ..add(11848)
+    ..add(11849)
+    ..add(11850)
+    ..add(11851)
+    ..add(11852)
+    ..add(11853)
+    ..add(11854)
+    ..add(11855)
+    ..add(11856)
+    ..add(11857)
+    ..add(11858)
+    ..add(11859)
+    ..add(11860)
+    ..add(11861)
+    ..add(11862)
+    ..add(11863)
+    ..add(11864)
+    ..add(11865)
+    ..add(11866)
+    ..add(11867)
+    ..add(11868)
+    ..add(11869)
+    ..add(11870)
+    ..add(11871)
+    ..add(11872)
+    ..add(11873)
+    ..add(11874)
+    ..add(11875)
+    ..add(11876)
+    ..add(11877)
+    ..add(11878)
+    ..add(11879)
+    ..add(11880)
+    ..add(11881)
+    ..add(11882)
+    ..add(11883)
+    ..add(11884)
+    ..add(11885)
+    ..add(11886)
+    ..add(11887)
+    ..add(11888)
+    ..add(11889)
+    ..add(11890)
+    ..add(11891)
+    ..add(11892)
+    ..add(11893)
+    ..add(11894)
+    ..add(11895)
+    ..add(11896)
+    ..add(11897)
+    ..add(11898)
+    ..add(11899)
+    ..add(11900)
+    ..add(11901)
+    ..add(11902)
+    ..add(11903)
+    ..add(11904)
+    ..add(11905)
+    ..add(11906)
+    ..add(11907)
+    ..add(11908)
+    ..add(11909)
+    ..add(11910)
+    ..add(11911)
+    ..add(11912)
+    ..add(11913)
+    ..add(11914)
+    ..add(11915)
+    ..add(11916)
+    ..add(11917)
+    ..add(11918)
+    ..add(11919)
+    ..add(11920)
+    ..add(11921)
+    ..add(11922)
+    ..add(11923)
+    ..add(11924)
+    ..add(11925)
+    ..add(11926)
+    ..add(11927)
+    ..add(11928)
+    ..add(11929)
+    ..add(11930)
+    ..add(11931)
+    ..add(11932)
+    ..add(11933)
+    ..add(11934)
+    ..add(11935)
+    ..add(11936)
+    ..add(11937)
+    ..add(11938)
+    ..add(11939)
+    ..add(11940)
+    ..add(11941)
+    ..add(11942)
+    ..add(11943)
+    ..add(11944)
+    ..add(11945)
+    ..add(11946)
+    ..add(11947)
+    ..add(11948)
+    ..add(11949)
+    ..add(11950)
+    ..add(11951)
+    ..add(11952)
+    ..add(11953)
+    ..add(11954)
+    ..add(11955)
+    ..add(11956)
+    ..add(11957)
+    ..add(11958)
+    ..add(11959)
+    ..add(11960)
+    ..add(11961)
+    ..add(11962)
+    ..add(11963)
+    ..add(11964)
+    ..add(11965)
+    ..add(11966)
+    ..add(11967)
+    ..add(11968)
+    ..add(11969)
+    ..add(11970)
+    ..add(11971)
+    ..add(11972)
+    ..add(11973)
+    ..add(11974)
+    ..add(11975)
+    ..add(11976)
+    ..add(11977)
+    ..add(11978)
+    ..add(11979)
+    ..add(11980)
+    ..add(11981)
+    ..add(11982)
+    ..add(11983)
+    ..add(11984)
+    ..add(11985)
+    ..add(11986)
+    ..add(11987)
+    ..add(11988)
+    ..add(11989)
+    ..add(11990)
+    ..add(11991)
+    ..add(11992)
+    ..add(11993)
+    ..add(11994)
+    ..add(11995)
+    ..add(11996)
+    ..add(11997)
+    ..add(11998)
+    ..add(11999)
+    ..add(12000)
+    ..add(12001)
+    ..add(12002)
+    ..add(12003)
+    ..add(12004)
+    ..add(12005)
+    ..add(12006)
+    ..add(12007)
+    ..add(12008)
+    ..add(12009)
+    ..add(12010)
+    ..add(12011)
+    ..add(12012)
+    ..add(12013)
+    ..add(12014)
+    ..add(12015)
+    ..add(12016)
+    ..add(12017)
+    ..add(12018)
+    ..add(12019)
+    ..add(12020)
+    ..add(12021)
+    ..add(12022)
+    ..add(12023)
+    ..add(12024)
+    ..add(12025)
+    ..add(12026)
+    ..add(12027)
+    ..add(12028)
+    ..add(12029)
+    ..add(12030)
+    ..add(12031)
+    ..add(12032)
+    ..add(12033)
+    ..add(12034)
+    ..add(12035)
+    ..add(12036)
+    ..add(12037)
+    ..add(12038)
+    ..add(12039)
+    ..add(12040)
+    ..add(12041)
+    ..add(12042)
+    ..add(12043)
+    ..add(12044)
+    ..add(12045)
+    ..add(12046)
+    ..add(12047)
+    ..add(12048)
+    ..add(12049)
+    ..add(12050)
+    ..add(12051)
+    ..add(12052)
+    ..add(12053)
+    ..add(12054)
+    ..add(12055)
+    ..add(12056)
+    ..add(12057)
+    ..add(12058)
+    ..add(12059)
+    ..add(12060)
+    ..add(12061)
+    ..add(12062)
+    ..add(12063)
+    ..add(12064)
+    ..add(12065)
+    ..add(12066)
+    ..add(12067)
+    ..add(12068)
+    ..add(12069)
+    ..add(12070)
+    ..add(12071)
+    ..add(12072)
+    ..add(12073)
+    ..add(12074)
+    ..add(12075)
+    ..add(12076)
+    ..add(12077)
+    ..add(12078)
+    ..add(12079)
+    ..add(12080)
+    ..add(12081)
+    ..add(12082)
+    ..add(12083)
+    ..add(12084)
+    ..add(12085)
+    ..add(12086)
+    ..add(12087)
+    ..add(12088)
+    ..add(12089)
+    ..add(12090)
+    ..add(12091)
+    ..add(12092)
+    ..add(12093)
+    ..add(12094)
+    ..add(12095)
+    ..add(12096)
+    ..add(12097)
+    ..add(12098)
+    ..add(12099)
+    ..add(12100)
+    ..add(12101)
+    ..add(12102)
+    ..add(12103)
+    ..add(12104)
+    ..add(12105)
+    ..add(12106)
+    ..add(12107)
+    ..add(12108)
+    ..add(12109)
+    ..add(12110)
+    ..add(12111)
+    ..add(12112)
+    ..add(12113)
+    ..add(12114)
+    ..add(12115)
+    ..add(12116)
+    ..add(12117)
+    ..add(12118)
+    ..add(12119)
+    ..add(12120)
+    ..add(12121)
+    ..add(12122)
+    ..add(12123)
+    ..add(12124)
+    ..add(12125)
+    ..add(12126)
+    ..add(12127)
+    ..add(12128)
+    ..add(12129)
+    ..add(12130)
+    ..add(12131)
+    ..add(12132)
+    ..add(12133)
+    ..add(12134)
+    ..add(12135)
+    ..add(12136)
+    ..add(12137)
+    ..add(12138)
+    ..add(12139)
+    ..add(12140)
+    ..add(12141)
+    ..add(12142)
+    ..add(12143)
+    ..add(12144)
+    ..add(12145)
+    ..add(12146)
+    ..add(12147)
+    ..add(12148)
+    ..add(12149)
+    ..add(12150)
+    ..add(12151)
+    ..add(12152)
+    ..add(12153)
+    ..add(12154)
+    ..add(12155)
+    ..add(12156)
+    ..add(12157)
+    ..add(12158)
+    ..add(12159)
+    ..add(12160)
+    ..add(12161)
+    ..add(12162)
+    ..add(12163)
+    ..add(12164)
+    ..add(12165)
+    ..add(12166)
+    ..add(12167)
+    ..add(12168)
+    ..add(12169)
+    ..add(12170)
+    ..add(12171)
+    ..add(12172)
+    ..add(12173)
+    ..add(12174)
+    ..add(12175)
+    ..add(12176)
+    ..add(12177)
+    ..add(12178)
+    ..add(12179)
+    ..add(12180)
+    ..add(12181)
+    ..add(12182)
+    ..add(12183)
+    ..add(12184)
+    ..add(12185)
+    ..add(12186)
+    ..add(12187)
+    ..add(12188)
+    ..add(12189)
+    ..add(12190)
+    ..add(12191)
+    ..add(12192)
+    ..add(12193)
+    ..add(12194)
+    ..add(12195)
+    ..add(12196)
+    ..add(12197)
+    ..add(12198)
+    ..add(12199)
+    ..add(12200)
+    ..add(12201)
+    ..add(12202)
+    ..add(12203)
+    ..add(12204)
+    ..add(12205)
+    ..add(12206)
+    ..add(12207)
+    ..add(12208)
+    ..add(12209)
+    ..add(12210)
+    ..add(12211)
+    ..add(12212)
+    ..add(12213)
+    ..add(12214)
+    ..add(12215)
+    ..add(12216)
+    ..add(12217)
+    ..add(12218)
+    ..add(12219)
+    ..add(12220)
+    ..add(12221)
+    ..add(12222)
+    ..add(12223)
+    ..add(12224)
+    ..add(12225)
+    ..add(12226)
+    ..add(12227)
+    ..add(12228)
+    ..add(12229)
+    ..add(12230)
+    ..add(12231)
+    ..add(12232)
+    ..add(12233)
+    ..add(12234)
+    ..add(12235)
+    ..add(12236)
+    ..add(12237)
+    ..add(12238)
+    ..add(12239)
+    ..add(12240)
+    ..add(12241)
+    ..add(12242)
+    ..add(12243)
+    ..add(12244)
+    ..add(12245)
+    ..add(12246)
+    ..add(12247)
+    ..add(12248)
+    ..add(12249)
+    ..add(12250)
+    ..add(12251)
+    ..add(12252)
+    ..add(12253)
+    ..add(12254)
+    ..add(12255)
+    ..add(12256)
+    ..add(12257)
+    ..add(12258)
+    ..add(12259)
+    ..add(12260)
+    ..add(12261)
+    ..add(12262)
+    ..add(12263)
+    ..add(12264)
+    ..add(12265)
+    ..add(12266)
+    ..add(12267)
+    ..add(12268)
+    ..add(12269)
+    ..add(12270)
+    ..add(12271)
+    ..add(12272)
+    ..add(12273)
+    ..add(12274)
+    ..add(12275)
+    ..add(12276)
+    ..add(12277)
+    ..add(12278)
+    ..add(12279)
+    ..add(12280)
+    ..add(12281)
+    ..add(12282)
+    ..add(12283)
+    ..add(12284)
+    ..add(12285)
+    ..add(12286)
+    ..add(12287)
+    ..add(12288)
+    ..add(12289)
+    ..add(12290)
+    ..add(12291)
+    ..add(12292)
+    ..add(12293)
+    ..add(12294)
+    ..add(12295)
+    ..add(12296)
+    ..add(12297)
+    ..add(12298)
+    ..add(12299)
+    ..add(12300)
+    ..add(12301)
+    ..add(12302)
+    ..add(12303)
+    ..add(12304)
+    ..add(12305)
+    ..add(12306)
+    ..add(12307)
+    ..add(12308)
+    ..add(12309)
+    ..add(12310)
+    ..add(12311)
+    ..add(12312)
+    ..add(12313)
+    ..add(12314)
+    ..add(12315)
+    ..add(12316)
+    ..add(12317)
+    ..add(12318)
+    ..add(12319)
+    ..add(12320)
+    ..add(12321)
+    ..add(12322)
+    ..add(12323)
+    ..add(12324)
+    ..add(12325)
+    ..add(12326)
+    ..add(12327)
+    ..add(12328)
+    ..add(12329)
+    ..add(12330)
+    ..add(12331)
+    ..add(12332)
+    ..add(12333)
+    ..add(12334)
+    ..add(12335)
+    ..add(12336)
+    ..add(12337)
+    ..add(12338)
+    ..add(12339)
+    ..add(12340)
+    ..add(12341)
+    ..add(12342)
+    ..add(12343)
+    ..add(12344)
+    ..add(12345)
+    ..add(12346)
+    ..add(12347)
+    ..add(12348)
+    ..add(12349)
+    ..add(12350)
+    ..add(12351)
+    ..add(12352)
+    ..add(12353)
+    ..add(12354)
+    ..add(12355)
+    ..add(12356)
+    ..add(12357)
+    ..add(12358)
+    ..add(12359)
+    ..add(12360)
+    ..add(12361)
+    ..add(12362)
+    ..add(12363)
+    ..add(12364)
+    ..add(12365)
+    ..add(12366)
+    ..add(12367)
+    ..add(12368)
+    ..add(12369)
+    ..add(12370)
+    ..add(12371)
+    ..add(12372)
+    ..add(12373)
+    ..add(12374)
+    ..add(12375)
+    ..add(12376)
+    ..add(12377)
+    ..add(12378)
+    ..add(12379)
+    ..add(12380)
+    ..add(12381)
+    ..add(12382)
+    ..add(12383)
+    ..add(12384)
+    ..add(12385)
+    ..add(12386)
+    ..add(12387)
+    ..add(12388)
+    ..add(12389)
+    ..add(12390)
+    ..add(12391)
+    ..add(12392)
+    ..add(12393)
+    ..add(12394)
+    ..add(12395)
+    ..add(12396)
+    ..add(12397)
+    ..add(12398)
+    ..add(12399)
+    ..add(12400)
+    ..add(12401)
+    ..add(12402)
+    ..add(12403)
+    ..add(12404)
+    ..add(12405)
+    ..add(12406)
+    ..add(12407)
+    ..add(12408)
+    ..add(12409)
+    ..add(12410)
+    ..add(12411)
+    ..add(12412)
+    ..add(12413)
+    ..add(12414)
+    ..add(12415)
+    ..add(12416)
+    ..add(12417)
+    ..add(12418)
+    ..add(12419)
+    ..add(12420)
+    ..add(12421)
+    ..add(12422)
+    ..add(12423)
+    ..add(12424)
+    ..add(12425)
+    ..add(12426)
+    ..add(12427)
+    ..add(12428)
+    ..add(12429)
+    ..add(12430)
+    ..add(12431)
+    ..add(12432)
+    ..add(12433)
+    ..add(12434)
+    ..add(12435)
+    ..add(12436)
+    ..add(12437)
+    ..add(12438)
+    ..add(12439)
+    ..add(12440)
+    ..add(12441)
+    ..add(12442)
+    ..add(12443)
+    ..add(12444)
+    ..add(12445)
+    ..add(12446)
+    ..add(12447)
+    ..add(12448)
+    ..add(12449)
+    ..add(12450)
+    ..add(12451)
+    ..add(12452)
+    ..add(12453)
+    ..add(12454)
+    ..add(12455)
+    ..add(12456)
+    ..add(12457)
+    ..add(12458)
+    ..add(12459)
+    ..add(12460)
+    ..add(12461)
+    ..add(12462)
+    ..add(12463)
+    ..add(12464)
+    ..add(12465)
+    ..add(12466)
+    ..add(12467)
+    ..add(12468)
+    ..add(12469)
+    ..add(12470)
+    ..add(12471)
+    ..add(12472)
+    ..add(12473)
+    ..add(12474)
+    ..add(12475)
+    ..add(12476)
+    ..add(12477)
+    ..add(12478)
+    ..add(12479)
+    ..add(12480)
+    ..add(12481)
+    ..add(12482)
+    ..add(12483)
+    ..add(12484)
+    ..add(12485)
+    ..add(12486)
+    ..add(12487)
+    ..add(12488)
+    ..add(12489)
+    ..add(12490)
+    ..add(12491)
+    ..add(12492)
+    ..add(12493)
+    ..add(12494)
+    ..add(12495)
+    ..add(12496)
+    ..add(12497)
+    ..add(12498)
+    ..add(12499)
+    ..add(12500)
+    ..add(12501)
+    ..add(12502)
+    ..add(12503)
+    ..add(12504)
+    ..add(12505)
+    ..add(12506)
+    ..add(12507)
+    ..add(12508)
+    ..add(12509)
+    ..add(12510)
+    ..add(12511)
+    ..add(12512)
+    ..add(12513)
+    ..add(12514)
+    ..add(12515)
+    ..add(12516)
+    ..add(12517)
+    ..add(12518)
+    ..add(12519)
+    ..add(12520)
+    ..add(12521)
+    ..add(12522)
+    ..add(12523)
+    ..add(12524)
+    ..add(12525)
+    ..add(12526)
+    ..add(12527)
+    ..add(12528)
+    ..add(12529)
+    ..add(12530)
+    ..add(12531)
+    ..add(12532)
+    ..add(12533)
+    ..add(12534)
+    ..add(12535)
+    ..add(12536)
+    ..add(12537)
+    ..add(12538)
+    ..add(12539)
+    ..add(12540)
+    ..add(12541)
+    ..add(12542)
+    ..add(12543)
+    ..add(12544)
+    ..add(12545)
+    ..add(12546)
+    ..add(12547)
+    ..add(12548)
+    ..add(12549)
+    ..add(12550)
+    ..add(12551)
+    ..add(12552)
+    ..add(12553)
+    ..add(12554)
+    ..add(12555)
+    ..add(12556)
+    ..add(12557)
+    ..add(12558)
+    ..add(12559)
+    ..add(12560)
+    ..add(12561)
+    ..add(12562)
+    ..add(12563)
+    ..add(12564)
+    ..add(12565)
+    ..add(12566)
+    ..add(12567)
+    ..add(12568)
+    ..add(12569)
+    ..add(12570)
+    ..add(12571)
+    ..add(12572)
+    ..add(12573)
+    ..add(12574)
+    ..add(12575)
+    ..add(12576)
+    ..add(12577)
+    ..add(12578)
+    ..add(12579)
+    ..add(12580)
+    ..add(12581)
+    ..add(12582)
+    ..add(12583)
+    ..add(12584)
+    ..add(12585)
+    ..add(12586)
+    ..add(12587)
+    ..add(12588)
+    ..add(12589)
+    ..add(12590)
+    ..add(12591)
+    ..add(12592)
+    ..add(12593)
+    ..add(12594)
+    ..add(12595)
+    ..add(12596)
+    ..add(12597)
+    ..add(12598)
+    ..add(12599)
+    ..add(12600)
+    ..add(12601)
+    ..add(12602)
+    ..add(12603)
+    ..add(12604)
+    ..add(12605)
+    ..add(12606)
+    ..add(12607)
+    ..add(12608)
+    ..add(12609)
+    ..add(12610)
+    ..add(12611)
+    ..add(12612)
+    ..add(12613)
+    ..add(12614)
+    ..add(12615)
+    ..add(12616)
+    ..add(12617)
+    ..add(12618)
+    ..add(12619)
+    ..add(12620)
+    ..add(12621)
+    ..add(12622)
+    ..add(12623)
+    ..add(12624)
+    ..add(12625)
+    ..add(12626)
+    ..add(12627)
+    ..add(12628)
+    ..add(12629)
+    ..add(12630)
+    ..add(12631)
+    ..add(12632)
+    ..add(12633)
+    ..add(12634)
+    ..add(12635)
+    ..add(12636)
+    ..add(12637)
+    ..add(12638)
+    ..add(12639)
+    ..add(12640)
+    ..add(12641)
+    ..add(12642)
+    ..add(12643)
+    ..add(12644)
+    ..add(12645)
+    ..add(12646)
+    ..add(12647)
+    ..add(12648)
+    ..add(12649)
+    ..add(12650)
+    ..add(12651)
+    ..add(12652)
+    ..add(12653)
+    ..add(12654)
+    ..add(12655)
+    ..add(12656)
+    ..add(12657)
+    ..add(12658)
+    ..add(12659)
+    ..add(12660)
+    ..add(12661)
+    ..add(12662)
+    ..add(12663)
+    ..add(12664)
+    ..add(12665)
+    ..add(12666)
+    ..add(12667)
+    ..add(12668)
+    ..add(12669)
+    ..add(12670)
+    ..add(12671)
+    ..add(12672)
+    ..add(12673)
+    ..add(12674)
+    ..add(12675)
+    ..add(12676)
+    ..add(12677)
+    ..add(12678)
+    ..add(12679)
+    ..add(12680)
+    ..add(12681)
+    ..add(12682)
+    ..add(12683)
+    ..add(12684)
+    ..add(12685)
+    ..add(12686)
+    ..add(12687)
+    ..add(12688)
+    ..add(12689)
+    ..add(12690)
+    ..add(12691)
+    ..add(12692)
+    ..add(12693)
+    ..add(12694)
+    ..add(12695)
+    ..add(12696)
+    ..add(12697)
+    ..add(12698)
+    ..add(12699)
+    ..add(12700)
+    ..add(12701)
+    ..add(12702)
+    ..add(12703)
+    ..add(12704)
+    ..add(12705)
+    ..add(12706)
+    ..add(12707)
+    ..add(12708)
+    ..add(12709)
+    ..add(12710)
+    ..add(12711)
+    ..add(12712)
+    ..add(12713)
+    ..add(12714)
+    ..add(12715)
+    ..add(12716)
+    ..add(12717)
+    ..add(12718)
+    ..add(12719)
+    ..add(12720)
+    ..add(12721)
+    ..add(12722)
+    ..add(12723)
+    ..add(12724)
+    ..add(12725)
+    ..add(12726)
+    ..add(12727)
+    ..add(12728)
+    ..add(12729)
+    ..add(12730)
+    ..add(12731)
+    ..add(12732)
+    ..add(12733)
+    ..add(12734)
+    ..add(12735)
+    ..add(12736)
+    ..add(12737)
+    ..add(12738)
+    ..add(12739)
+    ..add(12740)
+    ..add(12741)
+    ..add(12742)
+    ..add(12743)
+    ..add(12744)
+    ..add(12745)
+    ..add(12746)
+    ..add(12747)
+    ..add(12748)
+    ..add(12749)
+    ..add(12750)
+    ..add(12751)
+    ..add(12752)
+    ..add(12753)
+    ..add(12754)
+    ..add(12755)
+    ..add(12756)
+    ..add(12757)
+    ..add(12758)
+    ..add(12759)
+    ..add(12760)
+    ..add(12761)
+    ..add(12762)
+    ..add(12763)
+    ..add(12764)
+    ..add(12765)
+    ..add(12766)
+    ..add(12767)
+    ..add(12768)
+    ..add(12769)
+    ..add(12770)
+    ..add(12771)
+    ..add(12772)
+    ..add(12773)
+    ..add(12774)
+    ..add(12775)
+    ..add(12776)
+    ..add(12777)
+    ..add(12778)
+    ..add(12779)
+    ..add(12780)
+    ..add(12781)
+    ..add(12782)
+    ..add(12783)
+    ..add(12784)
+    ..add(12785)
+    ..add(12786)
+    ..add(12787)
+    ..add(12788)
+    ..add(12789)
+    ..add(12790)
+    ..add(12791)
+    ..add(12792)
+    ..add(12793)
+    ..add(12794)
+    ..add(12795)
+    ..add(12796)
+    ..add(12797)
+    ..add(12798)
+    ..add(12799)
+    ..add(12800)
+    ..add(12801)
+    ..add(12802)
+    ..add(12803)
+    ..add(12804)
+    ..add(12805)
+    ..add(12806)
+    ..add(12807)
+    ..add(12808)
+    ..add(12809)
+    ..add(12810)
+    ..add(12811)
+    ..add(12812)
+    ..add(12813)
+    ..add(12814)
+    ..add(12815)
+    ..add(12816)
+    ..add(12817)
+    ..add(12818)
+    ..add(12819)
+    ..add(12820)
+    ..add(12821)
+    ..add(12822)
+    ..add(12823)
+    ..add(12824)
+    ..add(12825)
+    ..add(12826)
+    ..add(12827)
+    ..add(12828)
+    ..add(12829)
+    ..add(12830)
+    ..add(12831)
+    ..add(12832)
+    ..add(12833)
+    ..add(12834)
+    ..add(12835)
+    ..add(12836)
+    ..add(12837)
+    ..add(12838)
+    ..add(12839)
+    ..add(12840)
+    ..add(12841)
+    ..add(12842)
+    ..add(12843)
+    ..add(12844)
+    ..add(12845)
+    ..add(12846)
+    ..add(12847)
+    ..add(12848)
+    ..add(12849)
+    ..add(12850)
+    ..add(12851)
+    ..add(12852)
+    ..add(12853)
+    ..add(12854)
+    ..add(12855)
+    ..add(12856)
+    ..add(12857)
+    ..add(12858)
+    ..add(12859)
+    ..add(12860)
+    ..add(12861)
+    ..add(12862)
+    ..add(12863)
+    ..add(12864)
+    ..add(12865)
+    ..add(12866)
+    ..add(12867)
+    ..add(12868)
+    ..add(12869)
+    ..add(12870)
+    ..add(12871)
+    ..add(12872)
+    ..add(12873)
+    ..add(12874)
+    ..add(12875)
+    ..add(12876)
+    ..add(12877)
+    ..add(12878)
+    ..add(12879)
+    ..add(12880)
+    ..add(12881)
+    ..add(12882)
+    ..add(12883)
+    ..add(12884)
+    ..add(12885)
+    ..add(12886)
+    ..add(12887)
+    ..add(12888)
+    ..add(12889)
+    ..add(12890)
+    ..add(12891)
+    ..add(12892)
+    ..add(12893)
+    ..add(12894)
+    ..add(12895)
+    ..add(12896)
+    ..add(12897)
+    ..add(12898)
+    ..add(12899)
+    ..add(12900)
+    ..add(12901)
+    ..add(12902)
+    ..add(12903)
+    ..add(12904)
+    ..add(12905)
+    ..add(12906)
+    ..add(12907)
+    ..add(12908)
+    ..add(12909)
+    ..add(12910)
+    ..add(12911)
+    ..add(12912)
+    ..add(12913)
+    ..add(12914)
+    ..add(12915)
+    ..add(12916)
+    ..add(12917)
+    ..add(12918)
+    ..add(12919)
+    ..add(12920)
+    ..add(12921)
+    ..add(12922)
+    ..add(12923)
+    ..add(12924)
+    ..add(12925)
+    ..add(12926)
+    ..add(12927)
+    ..add(12928)
+    ..add(12929)
+    ..add(12930)
+    ..add(12931)
+    ..add(12932)
+    ..add(12933)
+    ..add(12934)
+    ..add(12935)
+    ..add(12936)
+    ..add(12937)
+    ..add(12938)
+    ..add(12939)
+    ..add(12940)
+    ..add(12941)
+    ..add(12942)
+    ..add(12943)
+    ..add(12944)
+    ..add(12945)
+    ..add(12946)
+    ..add(12947)
+    ..add(12948)
+    ..add(12949)
+    ..add(12950)
+    ..add(12951)
+    ..add(12952)
+    ..add(12953)
+    ..add(12954)
+    ..add(12955)
+    ..add(12956)
+    ..add(12957)
+    ..add(12958)
+    ..add(12959)
+    ..add(12960)
+    ..add(12961)
+    ..add(12962)
+    ..add(12963)
+    ..add(12964)
+    ..add(12965)
+    ..add(12966)
+    ..add(12967)
+    ..add(12968)
+    ..add(12969)
+    ..add(12970)
+    ..add(12971)
+    ..add(12972)
+    ..add(12973)
+    ..add(12974)
+    ..add(12975)
+    ..add(12976)
+    ..add(12977)
+    ..add(12978)
+    ..add(12979)
+    ..add(12980)
+    ..add(12981)
+    ..add(12982)
+    ..add(12983)
+    ..add(12984)
+    ..add(12985)
+    ..add(12986)
+    ..add(12987)
+    ..add(12988)
+    ..add(12989)
+    ..add(12990)
+    ..add(12991)
+    ..add(12992)
+    ..add(12993)
+    ..add(12994)
+    ..add(12995)
+    ..add(12996)
+    ..add(12997)
+    ..add(12998)
+    ..add(12999)
+    ..add(13000)
+    ..add(13001)
+    ..add(13002)
+    ..add(13003)
+    ..add(13004)
+    ..add(13005)
+    ..add(13006)
+    ..add(13007)
+    ..add(13008)
+    ..add(13009)
+    ..add(13010)
+    ..add(13011)
+    ..add(13012)
+    ..add(13013)
+    ..add(13014)
+    ..add(13015)
+    ..add(13016)
+    ..add(13017)
+    ..add(13018)
+    ..add(13019)
+    ..add(13020)
+    ..add(13021)
+    ..add(13022)
+    ..add(13023)
+    ..add(13024)
+    ..add(13025)
+    ..add(13026)
+    ..add(13027)
+    ..add(13028)
+    ..add(13029)
+    ..add(13030)
+    ..add(13031)
+    ..add(13032)
+    ..add(13033)
+    ..add(13034)
+    ..add(13035)
+    ..add(13036)
+    ..add(13037)
+    ..add(13038)
+    ..add(13039)
+    ..add(13040)
+    ..add(13041)
+    ..add(13042)
+    ..add(13043)
+    ..add(13044)
+    ..add(13045)
+    ..add(13046)
+    ..add(13047)
+    ..add(13048)
+    ..add(13049)
+    ..add(13050)
+    ..add(13051)
+    ..add(13052)
+    ..add(13053)
+    ..add(13054)
+    ..add(13055)
+    ..add(13056)
+    ..add(13057)
+    ..add(13058)
+    ..add(13059)
+    ..add(13060)
+    ..add(13061)
+    ..add(13062)
+    ..add(13063)
+    ..add(13064)
+    ..add(13065)
+    ..add(13066)
+    ..add(13067)
+    ..add(13068)
+    ..add(13069)
+    ..add(13070)
+    ..add(13071)
+    ..add(13072)
+    ..add(13073)
+    ..add(13074)
+    ..add(13075)
+    ..add(13076)
+    ..add(13077)
+    ..add(13078)
+    ..add(13079)
+    ..add(13080)
+    ..add(13081)
+    ..add(13082)
+    ..add(13083)
+    ..add(13084)
+    ..add(13085)
+    ..add(13086)
+    ..add(13087)
+    ..add(13088)
+    ..add(13089)
+    ..add(13090)
+    ..add(13091)
+    ..add(13092)
+    ..add(13093)
+    ..add(13094)
+    ..add(13095)
+    ..add(13096)
+    ..add(13097)
+    ..add(13098)
+    ..add(13099)
+    ..add(13100)
+    ..add(13101)
+    ..add(13102)
+    ..add(13103)
+    ..add(13104)
+    ..add(13105)
+    ..add(13106)
+    ..add(13107)
+    ..add(13108)
+    ..add(13109)
+    ..add(13110)
+    ..add(13111)
+    ..add(13112)
+    ..add(13113)
+    ..add(13114)
+    ..add(13115)
+    ..add(13116)
+    ..add(13117)
+    ..add(13118)
+    ..add(13119)
+    ..add(13120)
+    ..add(13121)
+    ..add(13122)
+    ..add(13123)
+    ..add(13124)
+    ..add(13125)
+    ..add(13126)
+    ..add(13127)
+    ..add(13128)
+    ..add(13129)
+    ..add(13130)
+    ..add(13131)
+    ..add(13132)
+    ..add(13133)
+    ..add(13134)
+    ..add(13135)
+    ..add(13136)
+    ..add(13137)
+    ..add(13138)
+    ..add(13139)
+    ..add(13140)
+    ..add(13141)
+    ..add(13142)
+    ..add(13143)
+    ..add(13144)
+    ..add(13145)
+    ..add(13146)
+    ..add(13147)
+    ..add(13148)
+    ..add(13149)
+    ..add(13150)
+    ..add(13151)
+    ..add(13152)
+    ..add(13153)
+    ..add(13154)
+    ..add(13155)
+    ..add(13156)
+    ..add(13157)
+    ..add(13158)
+    ..add(13159)
+    ..add(13160)
+    ..add(13161)
+    ..add(13162)
+    ..add(13163)
+    ..add(13164)
+    ..add(13165)
+    ..add(13166)
+    ..add(13167)
+    ..add(13168)
+    ..add(13169)
+    ..add(13170)
+    ..add(13171)
+    ..add(13172)
+    ..add(13173)
+    ..add(13174)
+    ..add(13175)
+    ..add(13176)
+    ..add(13177)
+    ..add(13178)
+    ..add(13179)
+    ..add(13180)
+    ..add(13181)
+    ..add(13182)
+    ..add(13183)
+    ..add(13184)
+    ..add(13185)
+    ..add(13186)
+    ..add(13187)
+    ..add(13188)
+    ..add(13189)
+    ..add(13190)
+    ..add(13191)
+    ..add(13192)
+    ..add(13193)
+    ..add(13194)
+    ..add(13195)
+    ..add(13196)
+    ..add(13197)
+    ..add(13198)
+    ..add(13199)
+    ..add(13200)
+    ..add(13201)
+    ..add(13202)
+    ..add(13203)
+    ..add(13204)
+    ..add(13205)
+    ..add(13206)
+    ..add(13207)
+    ..add(13208)
+    ..add(13209)
+    ..add(13210)
+    ..add(13211)
+    ..add(13212)
+    ..add(13213)
+    ..add(13214)
+    ..add(13215)
+    ..add(13216)
+    ..add(13217)
+    ..add(13218)
+    ..add(13219)
+    ..add(13220)
+    ..add(13221)
+    ..add(13222)
+    ..add(13223)
+    ..add(13224)
+    ..add(13225)
+    ..add(13226)
+    ..add(13227)
+    ..add(13228)
+    ..add(13229)
+    ..add(13230)
+    ..add(13231)
+    ..add(13232)
+    ..add(13233)
+    ..add(13234)
+    ..add(13235)
+    ..add(13236)
+    ..add(13237)
+    ..add(13238)
+    ..add(13239)
+    ..add(13240)
+    ..add(13241)
+    ..add(13242)
+    ..add(13243)
+    ..add(13244)
+    ..add(13245)
+    ..add(13246)
+    ..add(13247)
+    ..add(13248)
+    ..add(13249)
+    ..add(13250)
+    ..add(13251)
+    ..add(13252)
+    ..add(13253)
+    ..add(13254)
+    ..add(13255)
+    ..add(13256)
+    ..add(13257)
+    ..add(13258)
+    ..add(13259)
+    ..add(13260)
+    ..add(13261)
+    ..add(13262)
+    ..add(13263)
+    ..add(13264)
+    ..add(13265)
+    ..add(13266)
+    ..add(13267)
+    ..add(13268)
+    ..add(13269)
+    ..add(13270)
+    ..add(13271)
+    ..add(13272)
+    ..add(13273)
+    ..add(13274)
+    ..add(13275)
+    ..add(13276)
+    ..add(13277)
+    ..add(13278)
+    ..add(13279)
+    ..add(13280)
+    ..add(13281)
+    ..add(13282)
+    ..add(13283)
+    ..add(13284)
+    ..add(13285)
+    ..add(13286)
+    ..add(13287)
+    ..add(13288)
+    ..add(13289)
+    ..add(13290)
+    ..add(13291)
+    ..add(13292)
+    ..add(13293)
+    ..add(13294)
+    ..add(13295)
+    ..add(13296)
+    ..add(13297)
+    ..add(13298)
+    ..add(13299)
+    ..add(13300)
+    ..add(13301)
+    ..add(13302)
+    ..add(13303)
+    ..add(13304)
+    ..add(13305)
+    ..add(13306)
+    ..add(13307)
+    ..add(13308)
+    ..add(13309)
+    ..add(13310)
+    ..add(13311)
+    ..add(13312)
+    ..add(13313)
+    ..add(13314)
+    ..add(13315)
+    ..add(13316)
+    ..add(13317)
+    ..add(13318)
+    ..add(13319)
+    ..add(13320)
+    ..add(13321)
+    ..add(13322)
+    ..add(13323)
+    ..add(13324)
+    ..add(13325)
+    ..add(13326)
+    ..add(13327)
+    ..add(13328)
+    ..add(13329)
+    ..add(13330)
+    ..add(13331)
+    ..add(13332)
+    ..add(13333)
+    ..add(13334)
+    ..add(13335)
+    ..add(13336)
+    ..add(13337)
+    ..add(13338)
+    ..add(13339)
+    ..add(13340)
+    ..add(13341)
+    ..add(13342)
+    ..add(13343)
+    ..add(13344)
+    ..add(13345)
+    ..add(13346)
+    ..add(13347)
+    ..add(13348)
+    ..add(13349)
+    ..add(13350)
+    ..add(13351)
+    ..add(13352)
+    ..add(13353)
+    ..add(13354)
+    ..add(13355)
+    ..add(13356)
+    ..add(13357)
+    ..add(13358)
+    ..add(13359)
+    ..add(13360)
+    ..add(13361)
+    ..add(13362)
+    ..add(13363)
+    ..add(13364)
+    ..add(13365)
+    ..add(13366)
+    ..add(13367)
+    ..add(13368)
+    ..add(13369)
+    ..add(13370)
+    ..add(13371)
+    ..add(13372)
+    ..add(13373)
+    ..add(13374)
+    ..add(13375)
+    ..add(13376)
+    ..add(13377)
+    ..add(13378)
+    ..add(13379)
+    ..add(13380)
+    ..add(13381)
+    ..add(13382)
+    ..add(13383)
+    ..add(13384)
+    ..add(13385)
+    ..add(13386)
+    ..add(13387)
+    ..add(13388)
+    ..add(13389)
+    ..add(13390)
+    ..add(13391)
+    ..add(13392)
+    ..add(13393)
+    ..add(13394)
+    ..add(13395)
+    ..add(13396)
+    ..add(13397)
+    ..add(13398)
+    ..add(13399)
+    ..add(13400)
+    ..add(13401)
+    ..add(13402)
+    ..add(13403)
+    ..add(13404)
+    ..add(13405)
+    ..add(13406)
+    ..add(13407)
+    ..add(13408)
+    ..add(13409)
+    ..add(13410)
+    ..add(13411)
+    ..add(13412)
+    ..add(13413)
+    ..add(13414)
+    ..add(13415)
+    ..add(13416)
+    ..add(13417)
+    ..add(13418)
+    ..add(13419)
+    ..add(13420)
+    ..add(13421)
+    ..add(13422)
+    ..add(13423)
+    ..add(13424)
+    ..add(13425)
+    ..add(13426)
+    ..add(13427)
+    ..add(13428)
+    ..add(13429)
+    ..add(13430)
+    ..add(13431)
+    ..add(13432)
+    ..add(13433)
+    ..add(13434)
+    ..add(13435)
+    ..add(13436)
+    ..add(13437)
+    ..add(13438)
+    ..add(13439)
+    ..add(13440)
+    ..add(13441)
+    ..add(13442)
+    ..add(13443)
+    ..add(13444)
+    ..add(13445)
+    ..add(13446)
+    ..add(13447)
+    ..add(13448)
+    ..add(13449)
+    ..add(13450)
+    ..add(13451)
+    ..add(13452)
+    ..add(13453)
+    ..add(13454)
+    ..add(13455)
+    ..add(13456)
+    ..add(13457)
+    ..add(13458)
+    ..add(13459)
+    ..add(13460)
+    ..add(13461)
+    ..add(13462)
+    ..add(13463)
+    ..add(13464)
+    ..add(13465)
+    ..add(13466)
+    ..add(13467)
+    ..add(13468)
+    ..add(13469)
+    ..add(13470)
+    ..add(13471)
+    ..add(13472)
+    ..add(13473)
+    ..add(13474)
+    ..add(13475)
+    ..add(13476)
+    ..add(13477)
+    ..add(13478)
+    ..add(13479)
+    ..add(13480)
+    ..add(13481)
+    ..add(13482)
+    ..add(13483)
+    ..add(13484)
+    ..add(13485)
+    ..add(13486)
+    ..add(13487)
+    ..add(13488)
+    ..add(13489)
+    ..add(13490)
+    ..add(13491)
+    ..add(13492)
+    ..add(13493)
+    ..add(13494)
+    ..add(13495)
+    ..add(13496)
+    ..add(13497)
+    ..add(13498)
+    ..add(13499)
+    ..add(13500)
+    ..add(13501)
+    ..add(13502)
+    ..add(13503)
+    ..add(13504)
+    ..add(13505)
+    ..add(13506)
+    ..add(13507)
+    ..add(13508)
+    ..add(13509)
+    ..add(13510)
+    ..add(13511)
+    ..add(13512)
+    ..add(13513)
+    ..add(13514)
+    ..add(13515)
+    ..add(13516)
+    ..add(13517)
+    ..add(13518)
+    ..add(13519)
+    ..add(13520)
+    ..add(13521)
+    ..add(13522)
+    ..add(13523)
+    ..add(13524)
+    ..add(13525)
+    ..add(13526)
+    ..add(13527)
+    ..add(13528)
+    ..add(13529)
+    ..add(13530)
+    ..add(13531)
+    ..add(13532)
+    ..add(13533)
+    ..add(13534)
+    ..add(13535)
+    ..add(13536)
+    ..add(13537)
+    ..add(13538)
+    ..add(13539)
+    ..add(13540)
+    ..add(13541)
+    ..add(13542)
+    ..add(13543)
+    ..add(13544)
+    ..add(13545)
+    ..add(13546)
+    ..add(13547)
+    ..add(13548)
+    ..add(13549)
+    ..add(13550)
+    ..add(13551)
+    ..add(13552)
+    ..add(13553)
+    ..add(13554)
+    ..add(13555)
+    ..add(13556)
+    ..add(13557)
+    ..add(13558)
+    ..add(13559)
+    ..add(13560)
+    ..add(13561)
+    ..add(13562)
+    ..add(13563)
+    ..add(13564)
+    ..add(13565)
+    ..add(13566)
+    ..add(13567)
+    ..add(13568)
+    ..add(13569)
+    ..add(13570)
+    ..add(13571)
+    ..add(13572)
+    ..add(13573)
+    ..add(13574)
+    ..add(13575)
+    ..add(13576)
+    ..add(13577)
+    ..add(13578)
+    ..add(13579)
+    ..add(13580)
+    ..add(13581)
+    ..add(13582)
+    ..add(13583)
+    ..add(13584)
+    ..add(13585)
+    ..add(13586)
+    ..add(13587)
+    ..add(13588)
+    ..add(13589)
+    ..add(13590)
+    ..add(13591)
+    ..add(13592)
+    ..add(13593)
+    ..add(13594)
+    ..add(13595)
+    ..add(13596)
+    ..add(13597)
+    ..add(13598)
+    ..add(13599)
+    ..add(13600)
+    ..add(13601)
+    ..add(13602)
+    ..add(13603)
+    ..add(13604)
+    ..add(13605)
+    ..add(13606)
+    ..add(13607)
+    ..add(13608)
+    ..add(13609)
+    ..add(13610)
+    ..add(13611)
+    ..add(13612)
+    ..add(13613)
+    ..add(13614)
+    ..add(13615)
+    ..add(13616)
+    ..add(13617)
+    ..add(13618)
+    ..add(13619)
+    ..add(13620)
+    ..add(13621)
+    ..add(13622)
+    ..add(13623)
+    ..add(13624)
+    ..add(13625)
+    ..add(13626)
+    ..add(13627)
+    ..add(13628)
+    ..add(13629)
+    ..add(13630)
+    ..add(13631)
+    ..add(13632)
+    ..add(13633)
+    ..add(13634)
+    ..add(13635)
+    ..add(13636)
+    ..add(13637)
+    ..add(13638)
+    ..add(13639)
+    ..add(13640)
+    ..add(13641)
+    ..add(13642)
+    ..add(13643)
+    ..add(13644)
+    ..add(13645)
+    ..add(13646)
+    ..add(13647)
+    ..add(13648)
+    ..add(13649)
+    ..add(13650)
+    ..add(13651)
+    ..add(13652)
+    ..add(13653)
+    ..add(13654)
+    ..add(13655)
+    ..add(13656)
+    ..add(13657)
+    ..add(13658)
+    ..add(13659)
+    ..add(13660)
+    ..add(13661)
+    ..add(13662)
+    ..add(13663)
+    ..add(13664)
+    ..add(13665)
+    ..add(13666)
+    ..add(13667)
+    ..add(13668)
+    ..add(13669)
+    ..add(13670)
+    ..add(13671)
+    ..add(13672)
+    ..add(13673)
+    ..add(13674)
+    ..add(13675)
+    ..add(13676)
+    ..add(13677)
+    ..add(13678)
+    ..add(13679)
+    ..add(13680)
+    ..add(13681)
+    ..add(13682)
+    ..add(13683)
+    ..add(13684)
+    ..add(13685)
+    ..add(13686)
+    ..add(13687)
+    ..add(13688)
+    ..add(13689)
+    ..add(13690)
+    ..add(13691)
+    ..add(13692)
+    ..add(13693)
+    ..add(13694)
+    ..add(13695)
+    ..add(13696)
+    ..add(13697)
+    ..add(13698)
+    ..add(13699)
+    ..add(13700)
+    ..add(13701)
+    ..add(13702)
+    ..add(13703)
+    ..add(13704)
+    ..add(13705)
+    ..add(13706)
+    ..add(13707)
+    ..add(13708)
+    ..add(13709)
+    ..add(13710)
+    ..add(13711)
+    ..add(13712)
+    ..add(13713)
+    ..add(13714)
+    ..add(13715)
+    ..add(13716)
+    ..add(13717)
+    ..add(13718)
+    ..add(13719)
+    ..add(13720)
+    ..add(13721)
+    ..add(13722)
+    ..add(13723)
+    ..add(13724)
+    ..add(13725)
+    ..add(13726)
+    ..add(13727)
+    ..add(13728)
+    ..add(13729)
+    ..add(13730)
+    ..add(13731)
+    ..add(13732)
+    ..add(13733)
+    ..add(13734)
+    ..add(13735)
+    ..add(13736)
+    ..add(13737)
+    ..add(13738)
+    ..add(13739)
+    ..add(13740)
+    ..add(13741)
+    ..add(13742)
+    ..add(13743)
+    ..add(13744)
+    ..add(13745)
+    ..add(13746)
+    ..add(13747)
+    ..add(13748)
+    ..add(13749)
+    ..add(13750)
+    ..add(13751)
+    ..add(13752)
+    ..add(13753)
+    ..add(13754)
+    ..add(13755)
+    ..add(13756)
+    ..add(13757)
+    ..add(13758)
+    ..add(13759)
+    ..add(13760)
+    ..add(13761)
+    ..add(13762)
+    ..add(13763)
+    ..add(13764)
+    ..add(13765)
+    ..add(13766)
+    ..add(13767)
+    ..add(13768)
+    ..add(13769)
+    ..add(13770)
+    ..add(13771)
+    ..add(13772)
+    ..add(13773)
+    ..add(13774)
+    ..add(13775)
+    ..add(13776)
+    ..add(13777)
+    ..add(13778)
+    ..add(13779)
+    ..add(13780)
+    ..add(13781)
+    ..add(13782)
+    ..add(13783)
+    ..add(13784)
+    ..add(13785)
+    ..add(13786)
+    ..add(13787)
+    ..add(13788)
+    ..add(13789)
+    ..add(13790)
+    ..add(13791)
+    ..add(13792)
+    ..add(13793)
+    ..add(13794)
+    ..add(13795)
+    ..add(13796)
+    ..add(13797)
+    ..add(13798)
+    ..add(13799)
+    ..add(13800)
+    ..add(13801)
+    ..add(13802)
+    ..add(13803)
+    ..add(13804)
+    ..add(13805)
+    ..add(13806)
+    ..add(13807)
+    ..add(13808)
+    ..add(13809)
+    ..add(13810)
+    ..add(13811)
+    ..add(13812)
+    ..add(13813)
+    ..add(13814)
+    ..add(13815)
+    ..add(13816)
+    ..add(13817)
+    ..add(13818)
+    ..add(13819)
+    ..add(13820)
+    ..add(13821)
+    ..add(13822)
+    ..add(13823)
+    ..add(13824)
+    ..add(13825)
+    ..add(13826)
+    ..add(13827)
+    ..add(13828)
+    ..add(13829)
+    ..add(13830)
+    ..add(13831)
+    ..add(13832)
+    ..add(13833)
+    ..add(13834)
+    ..add(13835)
+    ..add(13836)
+    ..add(13837)
+    ..add(13838)
+    ..add(13839)
+    ..add(13840)
+    ..add(13841)
+    ..add(13842)
+    ..add(13843)
+    ..add(13844)
+    ..add(13845)
+    ..add(13846)
+    ..add(13847)
+    ..add(13848)
+    ..add(13849)
+    ..add(13850)
+    ..add(13851)
+    ..add(13852)
+    ..add(13853)
+    ..add(13854)
+    ..add(13855)
+    ..add(13856)
+    ..add(13857)
+    ..add(13858)
+    ..add(13859)
+    ..add(13860)
+    ..add(13861)
+    ..add(13862)
+    ..add(13863)
+    ..add(13864)
+    ..add(13865)
+    ..add(13866)
+    ..add(13867)
+    ..add(13868)
+    ..add(13869)
+    ..add(13870)
+    ..add(13871)
+    ..add(13872)
+    ..add(13873)
+    ..add(13874)
+    ..add(13875)
+    ..add(13876)
+    ..add(13877)
+    ..add(13878)
+    ..add(13879)
+    ..add(13880)
+    ..add(13881)
+    ..add(13882)
+    ..add(13883)
+    ..add(13884)
+    ..add(13885)
+    ..add(13886)
+    ..add(13887)
+    ..add(13888)
+    ..add(13889)
+    ..add(13890)
+    ..add(13891)
+    ..add(13892)
+    ..add(13893)
+    ..add(13894)
+    ..add(13895)
+    ..add(13896)
+    ..add(13897)
+    ..add(13898)
+    ..add(13899)
+    ..add(13900)
+    ..add(13901)
+    ..add(13902)
+    ..add(13903)
+    ..add(13904)
+    ..add(13905)
+    ..add(13906)
+    ..add(13907)
+    ..add(13908)
+    ..add(13909)
+    ..add(13910)
+    ..add(13911)
+    ..add(13912)
+    ..add(13913)
+    ..add(13914)
+    ..add(13915)
+    ..add(13916)
+    ..add(13917)
+    ..add(13918)
+    ..add(13919)
+    ..add(13920)
+    ..add(13921)
+    ..add(13922)
+    ..add(13923)
+    ..add(13924)
+    ..add(13925)
+    ..add(13926)
+    ..add(13927)
+    ..add(13928)
+    ..add(13929)
+    ..add(13930)
+    ..add(13931)
+    ..add(13932)
+    ..add(13933)
+    ..add(13934)
+    ..add(13935)
+    ..add(13936)
+    ..add(13937)
+    ..add(13938)
+    ..add(13939)
+    ..add(13940)
+    ..add(13941)
+    ..add(13942)
+    ..add(13943)
+    ..add(13944)
+    ..add(13945)
+    ..add(13946)
+    ..add(13947)
+    ..add(13948)
+    ..add(13949)
+    ..add(13950)
+    ..add(13951)
+    ..add(13952)
+    ..add(13953)
+    ..add(13954)
+    ..add(13955)
+    ..add(13956)
+    ..add(13957)
+    ..add(13958)
+    ..add(13959)
+    ..add(13960)
+    ..add(13961)
+    ..add(13962)
+    ..add(13963)
+    ..add(13964)
+    ..add(13965)
+    ..add(13966)
+    ..add(13967)
+    ..add(13968)
+    ..add(13969)
+    ..add(13970)
+    ..add(13971)
+    ..add(13972)
+    ..add(13973)
+    ..add(13974)
+    ..add(13975)
+    ..add(13976)
+    ..add(13977)
+    ..add(13978)
+    ..add(13979)
+    ..add(13980)
+    ..add(13981)
+    ..add(13982)
+    ..add(13983)
+    ..add(13984)
+    ..add(13985)
+    ..add(13986)
+    ..add(13987)
+    ..add(13988)
+    ..add(13989)
+    ..add(13990)
+    ..add(13991)
+    ..add(13992)
+    ..add(13993)
+    ..add(13994)
+    ..add(13995)
+    ..add(13996)
+    ..add(13997)
+    ..add(13998)
+    ..add(13999)
+    ..add(14000)
+    ..add(14001)
+    ..add(14002)
+    ..add(14003)
+    ..add(14004)
+    ..add(14005)
+    ..add(14006)
+    ..add(14007)
+    ..add(14008)
+    ..add(14009)
+    ..add(14010)
+    ..add(14011)
+    ..add(14012)
+    ..add(14013)
+    ..add(14014)
+    ..add(14015)
+    ..add(14016)
+    ..add(14017)
+    ..add(14018)
+    ..add(14019)
+    ..add(14020)
+    ..add(14021)
+    ..add(14022)
+    ..add(14023)
+    ..add(14024)
+    ..add(14025)
+    ..add(14026)
+    ..add(14027)
+    ..add(14028)
+    ..add(14029)
+    ..add(14030)
+    ..add(14031)
+    ..add(14032)
+    ..add(14033)
+    ..add(14034)
+    ..add(14035)
+    ..add(14036)
+    ..add(14037)
+    ..add(14038)
+    ..add(14039)
+    ..add(14040)
+    ..add(14041)
+    ..add(14042)
+    ..add(14043)
+    ..add(14044)
+    ..add(14045)
+    ..add(14046)
+    ..add(14047)
+    ..add(14048)
+    ..add(14049)
+    ..add(14050)
+    ..add(14051)
+    ..add(14052)
+    ..add(14053)
+    ..add(14054)
+    ..add(14055)
+    ..add(14056)
+    ..add(14057)
+    ..add(14058)
+    ..add(14059)
+    ..add(14060)
+    ..add(14061)
+    ..add(14062)
+    ..add(14063)
+    ..add(14064)
+    ..add(14065)
+    ..add(14066)
+    ..add(14067)
+    ..add(14068)
+    ..add(14069)
+    ..add(14070)
+    ..add(14071)
+    ..add(14072)
+    ..add(14073)
+    ..add(14074)
+    ..add(14075)
+    ..add(14076)
+    ..add(14077)
+    ..add(14078)
+    ..add(14079)
+    ..add(14080)
+    ..add(14081)
+    ..add(14082)
+    ..add(14083)
+    ..add(14084)
+    ..add(14085)
+    ..add(14086)
+    ..add(14087)
+    ..add(14088)
+    ..add(14089)
+    ..add(14090)
+    ..add(14091)
+    ..add(14092)
+    ..add(14093)
+    ..add(14094)
+    ..add(14095)
+    ..add(14096)
+    ..add(14097)
+    ..add(14098)
+    ..add(14099)
+    ..add(14100)
+    ..add(14101)
+    ..add(14102)
+    ..add(14103)
+    ..add(14104)
+    ..add(14105)
+    ..add(14106)
+    ..add(14107)
+    ..add(14108)
+    ..add(14109)
+    ..add(14110)
+    ..add(14111)
+    ..add(14112)
+    ..add(14113)
+    ..add(14114)
+    ..add(14115)
+    ..add(14116)
+    ..add(14117)
+    ..add(14118)
+    ..add(14119)
+    ..add(14120)
+    ..add(14121)
+    ..add(14122)
+    ..add(14123)
+    ..add(14124)
+    ..add(14125)
+    ..add(14126)
+    ..add(14127)
+    ..add(14128)
+    ..add(14129)
+    ..add(14130)
+    ..add(14131)
+    ..add(14132)
+    ..add(14133)
+    ..add(14134)
+    ..add(14135)
+    ..add(14136)
+    ..add(14137)
+    ..add(14138)
+    ..add(14139)
+    ..add(14140)
+    ..add(14141)
+    ..add(14142)
+    ..add(14143)
+    ..add(14144)
+    ..add(14145)
+    ..add(14146)
+    ..add(14147)
+    ..add(14148)
+    ..add(14149)
+    ..add(14150)
+    ..add(14151)
+    ..add(14152)
+    ..add(14153)
+    ..add(14154)
+    ..add(14155)
+    ..add(14156)
+    ..add(14157)
+    ..add(14158)
+    ..add(14159)
+    ..add(14160)
+    ..add(14161)
+    ..add(14162)
+    ..add(14163)
+    ..add(14164)
+    ..add(14165)
+    ..add(14166)
+    ..add(14167)
+    ..add(14168)
+    ..add(14169)
+    ..add(14170)
+    ..add(14171)
+    ..add(14172)
+    ..add(14173)
+    ..add(14174)
+    ..add(14175)
+    ..add(14176)
+    ..add(14177)
+    ..add(14178)
+    ..add(14179)
+    ..add(14180)
+    ..add(14181)
+    ..add(14182)
+    ..add(14183)
+    ..add(14184)
+    ..add(14185)
+    ..add(14186)
+    ..add(14187)
+    ..add(14188)
+    ..add(14189)
+    ..add(14190)
+    ..add(14191)
+    ..add(14192)
+    ..add(14193)
+    ..add(14194)
+    ..add(14195)
+    ..add(14196)
+    ..add(14197)
+    ..add(14198)
+    ..add(14199)
+    ..add(14200)
+    ..add(14201)
+    ..add(14202)
+    ..add(14203)
+    ..add(14204)
+    ..add(14205)
+    ..add(14206)
+    ..add(14207)
+    ..add(14208)
+    ..add(14209)
+    ..add(14210)
+    ..add(14211)
+    ..add(14212)
+    ..add(14213)
+    ..add(14214)
+    ..add(14215)
+    ..add(14216)
+    ..add(14217)
+    ..add(14218)
+    ..add(14219)
+    ..add(14220)
+    ..add(14221)
+    ..add(14222)
+    ..add(14223)
+    ..add(14224)
+    ..add(14225)
+    ..add(14226)
+    ..add(14227)
+    ..add(14228)
+    ..add(14229)
+    ..add(14230)
+    ..add(14231)
+    ..add(14232)
+    ..add(14233)
+    ..add(14234)
+    ..add(14235)
+    ..add(14236)
+    ..add(14237)
+    ..add(14238)
+    ..add(14239)
+    ..add(14240)
+    ..add(14241)
+    ..add(14242)
+    ..add(14243)
+    ..add(14244)
+    ..add(14245)
+    ..add(14246)
+    ..add(14247)
+    ..add(14248)
+    ..add(14249)
+    ..add(14250)
+    ..add(14251)
+    ..add(14252)
+    ..add(14253)
+    ..add(14254)
+    ..add(14255)
+    ..add(14256)
+    ..add(14257)
+    ..add(14258)
+    ..add(14259)
+    ..add(14260)
+    ..add(14261)
+    ..add(14262)
+    ..add(14263)
+    ..add(14264)
+    ..add(14265)
+    ..add(14266)
+    ..add(14267)
+    ..add(14268)
+    ..add(14269)
+    ..add(14270)
+    ..add(14271)
+    ..add(14272)
+    ..add(14273)
+    ..add(14274)
+    ..add(14275)
+    ..add(14276)
+    ..add(14277)
+    ..add(14278)
+    ..add(14279)
+    ..add(14280)
+    ..add(14281)
+    ..add(14282)
+    ..add(14283)
+    ..add(14284)
+    ..add(14285)
+    ..add(14286)
+    ..add(14287)
+    ..add(14288)
+    ..add(14289)
+    ..add(14290)
+    ..add(14291)
+    ..add(14292)
+    ..add(14293)
+    ..add(14294)
+    ..add(14295)
+    ..add(14296)
+    ..add(14297)
+    ..add(14298)
+    ..add(14299)
+    ..add(14300)
+    ..add(14301)
+    ..add(14302)
+    ..add(14303)
+    ..add(14304)
+    ..add(14305)
+    ..add(14306)
+    ..add(14307)
+    ..add(14308)
+    ..add(14309)
+    ..add(14310)
+    ..add(14311)
+    ..add(14312)
+    ..add(14313)
+    ..add(14314)
+    ..add(14315)
+    ..add(14316)
+    ..add(14317)
+    ..add(14318)
+    ..add(14319)
+    ..add(14320)
+    ..add(14321)
+    ..add(14322)
+    ..add(14323)
+    ..add(14324)
+    ..add(14325)
+    ..add(14326)
+    ..add(14327)
+    ..add(14328)
+    ..add(14329)
+    ..add(14330)
+    ..add(14331)
+    ..add(14332)
+    ..add(14333)
+    ..add(14334)
+    ..add(14335)
+    ..add(14336)
+    ..add(14337)
+    ..add(14338)
+    ..add(14339)
+    ..add(14340)
+    ..add(14341)
+    ..add(14342)
+    ..add(14343)
+    ..add(14344)
+    ..add(14345)
+    ..add(14346)
+    ..add(14347)
+    ..add(14348)
+    ..add(14349)
+    ..add(14350)
+    ..add(14351)
+    ..add(14352)
+    ..add(14353)
+    ..add(14354)
+    ..add(14355)
+    ..add(14356)
+    ..add(14357)
+    ..add(14358)
+    ..add(14359)
+    ..add(14360)
+    ..add(14361)
+    ..add(14362)
+    ..add(14363)
+    ..add(14364)
+    ..add(14365)
+    ..add(14366)
+    ..add(14367)
+    ..add(14368)
+    ..add(14369)
+    ..add(14370)
+    ..add(14371)
+    ..add(14372)
+    ..add(14373)
+    ..add(14374)
+    ..add(14375)
+    ..add(14376)
+    ..add(14377)
+    ..add(14378)
+    ..add(14379)
+    ..add(14380)
+    ..add(14381)
+    ..add(14382)
+    ..add(14383)
+    ..add(14384)
+    ..add(14385)
+    ..add(14386)
+    ..add(14387)
+    ..add(14388)
+    ..add(14389)
+    ..add(14390)
+    ..add(14391)
+    ..add(14392)
+    ..add(14393)
+    ..add(14394)
+    ..add(14395)
+    ..add(14396)
+    ..add(14397)
+    ..add(14398)
+    ..add(14399)
+    ..add(14400)
+    ..add(14401)
+    ..add(14402)
+    ..add(14403)
+    ..add(14404)
+    ..add(14405)
+    ..add(14406)
+    ..add(14407)
+    ..add(14408)
+    ..add(14409)
+    ..add(14410)
+    ..add(14411)
+    ..add(14412)
+    ..add(14413)
+    ..add(14414)
+    ..add(14415)
+    ..add(14416)
+    ..add(14417)
+    ..add(14418)
+    ..add(14419)
+    ..add(14420)
+    ..add(14421)
+    ..add(14422)
+    ..add(14423)
+    ..add(14424)
+    ..add(14425)
+    ..add(14426)
+    ..add(14427)
+    ..add(14428)
+    ..add(14429)
+    ..add(14430)
+    ..add(14431)
+    ..add(14432)
+    ..add(14433)
+    ..add(14434)
+    ..add(14435)
+    ..add(14436)
+    ..add(14437)
+    ..add(14438)
+    ..add(14439)
+    ..add(14440)
+    ..add(14441)
+    ..add(14442)
+    ..add(14443)
+    ..add(14444)
+    ..add(14445)
+    ..add(14446)
+    ..add(14447)
+    ..add(14448)
+    ..add(14449)
+    ..add(14450)
+    ..add(14451)
+    ..add(14452)
+    ..add(14453)
+    ..add(14454)
+    ..add(14455)
+    ..add(14456)
+    ..add(14457)
+    ..add(14458)
+    ..add(14459)
+    ..add(14460)
+    ..add(14461)
+    ..add(14462)
+    ..add(14463)
+    ..add(14464)
+    ..add(14465)
+    ..add(14466)
+    ..add(14467)
+    ..add(14468)
+    ..add(14469)
+    ..add(14470)
+    ..add(14471)
+    ..add(14472)
+    ..add(14473)
+    ..add(14474)
+    ..add(14475)
+    ..add(14476)
+    ..add(14477)
+    ..add(14478)
+    ..add(14479)
+    ..add(14480)
+    ..add(14481)
+    ..add(14482)
+    ..add(14483)
+    ..add(14484)
+    ..add(14485)
+    ..add(14486)
+    ..add(14487)
+    ..add(14488)
+    ..add(14489)
+    ..add(14490)
+    ..add(14491)
+    ..add(14492)
+    ..add(14493)
+    ..add(14494)
+    ..add(14495)
+    ..add(14496)
+    ..add(14497)
+    ..add(14498)
+    ..add(14499)
+    ..add(14500)
+    ..add(14501)
+    ..add(14502)
+    ..add(14503)
+    ..add(14504)
+    ..add(14505)
+    ..add(14506)
+    ..add(14507)
+    ..add(14508)
+    ..add(14509)
+    ..add(14510)
+    ..add(14511)
+    ..add(14512)
+    ..add(14513)
+    ..add(14514)
+    ..add(14515)
+    ..add(14516)
+    ..add(14517)
+    ..add(14518)
+    ..add(14519)
+    ..add(14520)
+    ..add(14521)
+    ..add(14522)
+    ..add(14523)
+    ..add(14524)
+    ..add(14525)
+    ..add(14526)
+    ..add(14527)
+    ..add(14528)
+    ..add(14529)
+    ..add(14530)
+    ..add(14531)
+    ..add(14532)
+    ..add(14533)
+    ..add(14534)
+    ..add(14535)
+    ..add(14536)
+    ..add(14537)
+    ..add(14538)
+    ..add(14539)
+    ..add(14540)
+    ..add(14541)
+    ..add(14542)
+    ..add(14543)
+    ..add(14544)
+    ..add(14545)
+    ..add(14546)
+    ..add(14547)
+    ..add(14548)
+    ..add(14549)
+    ..add(14550)
+    ..add(14551)
+    ..add(14552)
+    ..add(14553)
+    ..add(14554)
+    ..add(14555)
+    ..add(14556)
+    ..add(14557)
+    ..add(14558)
+    ..add(14559)
+    ..add(14560)
+    ..add(14561)
+    ..add(14562)
+    ..add(14563)
+    ..add(14564)
+    ..add(14565)
+    ..add(14566)
+    ..add(14567)
+    ..add(14568)
+    ..add(14569)
+    ..add(14570)
+    ..add(14571)
+    ..add(14572)
+    ..add(14573)
+    ..add(14574)
+    ..add(14575)
+    ..add(14576)
+    ..add(14577)
+    ..add(14578)
+    ..add(14579)
+    ..add(14580)
+    ..add(14581)
+    ..add(14582)
+    ..add(14583)
+    ..add(14584)
+    ..add(14585)
+    ..add(14586)
+    ..add(14587)
+    ..add(14588)
+    ..add(14589)
+    ..add(14590)
+    ..add(14591)
+    ..add(14592)
+    ..add(14593)
+    ..add(14594)
+    ..add(14595)
+    ..add(14596)
+    ..add(14597)
+    ..add(14598)
+    ..add(14599)
+    ..add(14600)
+    ..add(14601)
+    ..add(14602)
+    ..add(14603)
+    ..add(14604)
+    ..add(14605)
+    ..add(14606)
+    ..add(14607)
+    ..add(14608)
+    ..add(14609)
+    ..add(14610)
+    ..add(14611)
+    ..add(14612)
+    ..add(14613)
+    ..add(14614)
+    ..add(14615)
+    ..add(14616)
+    ..add(14617)
+    ..add(14618)
+    ..add(14619)
+    ..add(14620)
+    ..add(14621)
+    ..add(14622)
+    ..add(14623)
+    ..add(14624)
+    ..add(14625)
+    ..add(14626)
+    ..add(14627)
+    ..add(14628)
+    ..add(14629)
+    ..add(14630)
+    ..add(14631)
+    ..add(14632)
+    ..add(14633)
+    ..add(14634)
+    ..add(14635)
+    ..add(14636)
+    ..add(14637)
+    ..add(14638)
+    ..add(14639)
+    ..add(14640)
+    ..add(14641)
+    ..add(14642)
+    ..add(14643)
+    ..add(14644)
+    ..add(14645)
+    ..add(14646)
+    ..add(14647)
+    ..add(14648)
+    ..add(14649)
+    ..add(14650)
+    ..add(14651)
+    ..add(14652)
+    ..add(14653)
+    ..add(14654)
+    ..add(14655)
+    ..add(14656)
+    ..add(14657)
+    ..add(14658)
+    ..add(14659)
+    ..add(14660)
+    ..add(14661)
+    ..add(14662)
+    ..add(14663)
+    ..add(14664)
+    ..add(14665)
+    ..add(14666)
+    ..add(14667)
+    ..add(14668)
+    ..add(14669)
+    ..add(14670)
+    ..add(14671)
+    ..add(14672)
+    ..add(14673)
+    ..add(14674)
+    ..add(14675)
+    ..add(14676)
+    ..add(14677)
+    ..add(14678)
+    ..add(14679)
+    ..add(14680)
+    ..add(14681)
+    ..add(14682)
+    ..add(14683)
+    ..add(14684)
+    ..add(14685)
+    ..add(14686)
+    ..add(14687)
+    ..add(14688)
+    ..add(14689)
+    ..add(14690)
+    ..add(14691)
+    ..add(14692)
+    ..add(14693)
+    ..add(14694)
+    ..add(14695)
+    ..add(14696)
+    ..add(14697)
+    ..add(14698)
+    ..add(14699)
+    ..add(14700)
+    ..add(14701)
+    ..add(14702)
+    ..add(14703)
+    ..add(14704)
+    ..add(14705)
+    ..add(14706)
+    ..add(14707)
+    ..add(14708)
+    ..add(14709)
+    ..add(14710)
+    ..add(14711)
+    ..add(14712)
+    ..add(14713)
+    ..add(14714)
+    ..add(14715)
+    ..add(14716)
+    ..add(14717)
+    ..add(14718)
+    ..add(14719)
+    ..add(14720)
+    ..add(14721)
+    ..add(14722)
+    ..add(14723)
+    ..add(14724)
+    ..add(14725)
+    ..add(14726)
+    ..add(14727)
+    ..add(14728)
+    ..add(14729)
+    ..add(14730)
+    ..add(14731)
+    ..add(14732)
+    ..add(14733)
+    ..add(14734)
+    ..add(14735)
+    ..add(14736)
+    ..add(14737)
+    ..add(14738)
+    ..add(14739)
+    ..add(14740)
+    ..add(14741)
+    ..add(14742)
+    ..add(14743)
+    ..add(14744)
+    ..add(14745)
+    ..add(14746)
+    ..add(14747)
+    ..add(14748)
+    ..add(14749)
+    ..add(14750)
+    ..add(14751)
+    ..add(14752)
+    ..add(14753)
+    ..add(14754)
+    ..add(14755)
+    ..add(14756)
+    ..add(14757)
+    ..add(14758)
+    ..add(14759)
+    ..add(14760)
+    ..add(14761)
+    ..add(14762)
+    ..add(14763)
+    ..add(14764)
+    ..add(14765)
+    ..add(14766)
+    ..add(14767)
+    ..add(14768)
+    ..add(14769)
+    ..add(14770)
+    ..add(14771)
+    ..add(14772)
+    ..add(14773)
+    ..add(14774)
+    ..add(14775)
+    ..add(14776)
+    ..add(14777)
+    ..add(14778)
+    ..add(14779)
+    ..add(14780)
+    ..add(14781)
+    ..add(14782)
+    ..add(14783)
+    ..add(14784)
+    ..add(14785)
+    ..add(14786)
+    ..add(14787)
+    ..add(14788)
+    ..add(14789)
+    ..add(14790)
+    ..add(14791)
+    ..add(14792)
+    ..add(14793)
+    ..add(14794)
+    ..add(14795)
+    ..add(14796)
+    ..add(14797)
+    ..add(14798)
+    ..add(14799)
+    ..add(14800)
+    ..add(14801)
+    ..add(14802)
+    ..add(14803)
+    ..add(14804)
+    ..add(14805)
+    ..add(14806)
+    ..add(14807)
+    ..add(14808)
+    ..add(14809)
+    ..add(14810)
+    ..add(14811)
+    ..add(14812)
+    ..add(14813)
+    ..add(14814)
+    ..add(14815)
+    ..add(14816)
+    ..add(14817)
+    ..add(14818)
+    ..add(14819)
+    ..add(14820)
+    ..add(14821)
+    ..add(14822)
+    ..add(14823)
+    ..add(14824)
+    ..add(14825)
+    ..add(14826)
+    ..add(14827)
+    ..add(14828)
+    ..add(14829)
+    ..add(14830)
+    ..add(14831)
+    ..add(14832)
+    ..add(14833)
+    ..add(14834)
+    ..add(14835)
+    ..add(14836)
+    ..add(14837)
+    ..add(14838)
+    ..add(14839)
+    ..add(14840)
+    ..add(14841)
+    ..add(14842)
+    ..add(14843)
+    ..add(14844)
+    ..add(14845)
+    ..add(14846)
+    ..add(14847)
+    ..add(14848)
+    ..add(14849)
+    ..add(14850)
+    ..add(14851)
+    ..add(14852)
+    ..add(14853)
+    ..add(14854)
+    ..add(14855)
+    ..add(14856)
+    ..add(14857)
+    ..add(14858)
+    ..add(14859)
+    ..add(14860)
+    ..add(14861)
+    ..add(14862)
+    ..add(14863)
+    ..add(14864)
+    ..add(14865)
+    ..add(14866)
+    ..add(14867)
+    ..add(14868)
+    ..add(14869)
+    ..add(14870)
+    ..add(14871)
+    ..add(14872)
+    ..add(14873)
+    ..add(14874)
+    ..add(14875)
+    ..add(14876)
+    ..add(14877)
+    ..add(14878)
+    ..add(14879)
+    ..add(14880)
+    ..add(14881)
+    ..add(14882)
+    ..add(14883)
+    ..add(14884)
+    ..add(14885)
+    ..add(14886)
+    ..add(14887)
+    ..add(14888)
+    ..add(14889)
+    ..add(14890)
+    ..add(14891)
+    ..add(14892)
+    ..add(14893)
+    ..add(14894)
+    ..add(14895)
+    ..add(14896)
+    ..add(14897)
+    ..add(14898)
+    ..add(14899)
+    ..add(14900)
+    ..add(14901)
+    ..add(14902)
+    ..add(14903)
+    ..add(14904)
+    ..add(14905)
+    ..add(14906)
+    ..add(14907)
+    ..add(14908)
+    ..add(14909)
+    ..add(14910)
+    ..add(14911)
+    ..add(14912)
+    ..add(14913)
+    ..add(14914)
+    ..add(14915)
+    ..add(14916)
+    ..add(14917)
+    ..add(14918)
+    ..add(14919)
+    ..add(14920)
+    ..add(14921)
+    ..add(14922)
+    ..add(14923)
+    ..add(14924)
+    ..add(14925)
+    ..add(14926)
+    ..add(14927)
+    ..add(14928)
+    ..add(14929)
+    ..add(14930)
+    ..add(14931)
+    ..add(14932)
+    ..add(14933)
+    ..add(14934)
+    ..add(14935)
+    ..add(14936)
+    ..add(14937)
+    ..add(14938)
+    ..add(14939)
+    ..add(14940)
+    ..add(14941)
+    ..add(14942)
+    ..add(14943)
+    ..add(14944)
+    ..add(14945)
+    ..add(14946)
+    ..add(14947)
+    ..add(14948)
+    ..add(14949)
+    ..add(14950)
+    ..add(14951)
+    ..add(14952)
+    ..add(14953)
+    ..add(14954)
+    ..add(14955)
+    ..add(14956)
+    ..add(14957)
+    ..add(14958)
+    ..add(14959)
+    ..add(14960)
+    ..add(14961)
+    ..add(14962)
+    ..add(14963)
+    ..add(14964)
+    ..add(14965)
+    ..add(14966)
+    ..add(14967)
+    ..add(14968)
+    ..add(14969)
+    ..add(14970)
+    ..add(14971)
+    ..add(14972)
+    ..add(14973)
+    ..add(14974)
+    ..add(14975)
+    ..add(14976)
+    ..add(14977)
+    ..add(14978)
+    ..add(14979)
+    ..add(14980)
+    ..add(14981)
+    ..add(14982)
+    ..add(14983)
+    ..add(14984)
+    ..add(14985)
+    ..add(14986)
+    ..add(14987)
+    ..add(14988)
+    ..add(14989)
+    ..add(14990)
+    ..add(14991)
+    ..add(14992)
+    ..add(14993)
+    ..add(14994)
+    ..add(14995)
+    ..add(14996)
+    ..add(14997)
+    ..add(14998)
+    ..add(14999)
+    ..add(15000)
+    ..add(15001)
+    ..add(15002)
+    ..add(15003)
+    ..add(15004)
+    ..add(15005)
+    ..add(15006)
+    ..add(15007)
+    ..add(15008)
+    ..add(15009)
+    ..add(15010)
+    ..add(15011)
+    ..add(15012)
+    ..add(15013)
+    ..add(15014)
+    ..add(15015)
+    ..add(15016)
+    ..add(15017)
+    ..add(15018)
+    ..add(15019)
+    ..add(15020)
+    ..add(15021)
+    ..add(15022)
+    ..add(15023)
+    ..add(15024)
+    ..add(15025)
+    ..add(15026)
+    ..add(15027)
+    ..add(15028)
+    ..add(15029)
+    ..add(15030)
+    ..add(15031)
+    ..add(15032)
+    ..add(15033)
+    ..add(15034)
+    ..add(15035)
+    ..add(15036)
+    ..add(15037)
+    ..add(15038)
+    ..add(15039)
+    ..add(15040)
+    ..add(15041)
+    ..add(15042)
+    ..add(15043)
+    ..add(15044)
+    ..add(15045)
+    ..add(15046)
+    ..add(15047)
+    ..add(15048)
+    ..add(15049)
+    ..add(15050)
+    ..add(15051)
+    ..add(15052)
+    ..add(15053)
+    ..add(15054)
+    ..add(15055)
+    ..add(15056)
+    ..add(15057)
+    ..add(15058)
+    ..add(15059)
+    ..add(15060)
+    ..add(15061)
+    ..add(15062)
+    ..add(15063)
+    ..add(15064)
+    ..add(15065)
+    ..add(15066)
+    ..add(15067)
+    ..add(15068)
+    ..add(15069)
+    ..add(15070)
+    ..add(15071)
+    ..add(15072)
+    ..add(15073)
+    ..add(15074)
+    ..add(15075)
+    ..add(15076)
+    ..add(15077)
+    ..add(15078)
+    ..add(15079)
+    ..add(15080)
+    ..add(15081)
+    ..add(15082)
+    ..add(15083)
+    ..add(15084)
+    ..add(15085)
+    ..add(15086)
+    ..add(15087)
+    ..add(15088)
+    ..add(15089)
+    ..add(15090)
+    ..add(15091)
+    ..add(15092)
+    ..add(15093)
+    ..add(15094)
+    ..add(15095)
+    ..add(15096)
+    ..add(15097)
+    ..add(15098)
+    ..add(15099)
+    ..add(15100)
+    ..add(15101)
+    ..add(15102)
+    ..add(15103)
+    ..add(15104)
+    ..add(15105)
+    ..add(15106)
+    ..add(15107)
+    ..add(15108)
+    ..add(15109)
+    ..add(15110)
+    ..add(15111)
+    ..add(15112)
+    ..add(15113)
+    ..add(15114)
+    ..add(15115)
+    ..add(15116)
+    ..add(15117)
+    ..add(15118)
+    ..add(15119)
+    ..add(15120)
+    ..add(15121)
+    ..add(15122)
+    ..add(15123)
+    ..add(15124)
+    ..add(15125)
+    ..add(15126)
+    ..add(15127)
+    ..add(15128)
+    ..add(15129)
+    ..add(15130)
+    ..add(15131)
+    ..add(15132)
+    ..add(15133)
+    ..add(15134)
+    ..add(15135)
+    ..add(15136)
+    ..add(15137)
+    ..add(15138)
+    ..add(15139)
+    ..add(15140)
+    ..add(15141)
+    ..add(15142)
+    ..add(15143)
+    ..add(15144)
+    ..add(15145)
+    ..add(15146)
+    ..add(15147)
+    ..add(15148)
+    ..add(15149)
+    ..add(15150)
+    ..add(15151)
+    ..add(15152)
+    ..add(15153)
+    ..add(15154)
+    ..add(15155)
+    ..add(15156)
+    ..add(15157)
+    ..add(15158)
+    ..add(15159)
+    ..add(15160)
+    ..add(15161)
+    ..add(15162)
+    ..add(15163)
+    ..add(15164)
+    ..add(15165)
+    ..add(15166)
+    ..add(15167)
+    ..add(15168)
+    ..add(15169)
+    ..add(15170)
+    ..add(15171)
+    ..add(15172)
+    ..add(15173)
+    ..add(15174)
+    ..add(15175)
+    ..add(15176)
+    ..add(15177)
+    ..add(15178)
+    ..add(15179)
+    ..add(15180)
+    ..add(15181)
+    ..add(15182)
+    ..add(15183)
+    ..add(15184)
+    ..add(15185)
+    ..add(15186)
+    ..add(15187)
+    ..add(15188)
+    ..add(15189)
+    ..add(15190)
+    ..add(15191)
+    ..add(15192)
+    ..add(15193)
+    ..add(15194)
+    ..add(15195)
+    ..add(15196)
+    ..add(15197)
+    ..add(15198)
+    ..add(15199)
+    ..add(15200)
+    ..add(15201)
+    ..add(15202)
+    ..add(15203)
+    ..add(15204)
+    ..add(15205)
+    ..add(15206)
+    ..add(15207)
+    ..add(15208)
+    ..add(15209)
+    ..add(15210)
+    ..add(15211)
+    ..add(15212)
+    ..add(15213)
+    ..add(15214)
+    ..add(15215)
+    ..add(15216)
+    ..add(15217)
+    ..add(15218)
+    ..add(15219)
+    ..add(15220)
+    ..add(15221)
+    ..add(15222)
+    ..add(15223)
+    ..add(15224)
+    ..add(15225)
+    ..add(15226)
+    ..add(15227)
+    ..add(15228)
+    ..add(15229)
+    ..add(15230)
+    ..add(15231)
+    ..add(15232)
+    ..add(15233)
+    ..add(15234)
+    ..add(15235)
+    ..add(15236)
+    ..add(15237)
+    ..add(15238)
+    ..add(15239)
+    ..add(15240)
+    ..add(15241)
+    ..add(15242)
+    ..add(15243)
+    ..add(15244)
+    ..add(15245)
+    ..add(15246)
+    ..add(15247)
+    ..add(15248)
+    ..add(15249)
+    ..add(15250)
+    ..add(15251)
+    ..add(15252)
+    ..add(15253)
+    ..add(15254)
+    ..add(15255)
+    ..add(15256)
+    ..add(15257)
+    ..add(15258)
+    ..add(15259)
+    ..add(15260)
+    ..add(15261)
+    ..add(15262)
+    ..add(15263)
+    ..add(15264)
+    ..add(15265)
+    ..add(15266)
+    ..add(15267)
+    ..add(15268)
+    ..add(15269)
+    ..add(15270)
+    ..add(15271)
+    ..add(15272)
+    ..add(15273)
+    ..add(15274)
+    ..add(15275)
+    ..add(15276)
+    ..add(15277)
+    ..add(15278)
+    ..add(15279)
+    ..add(15280)
+    ..add(15281)
+    ..add(15282)
+    ..add(15283)
+    ..add(15284)
+    ..add(15285)
+    ..add(15286)
+    ..add(15287)
+    ..add(15288)
+    ..add(15289)
+    ..add(15290)
+    ..add(15291)
+    ..add(15292)
+    ..add(15293)
+    ..add(15294)
+    ..add(15295)
+    ..add(15296)
+    ..add(15297)
+    ..add(15298)
+    ..add(15299)
+    ..add(15300)
+    ..add(15301)
+    ..add(15302)
+    ..add(15303)
+    ..add(15304)
+    ..add(15305)
+    ..add(15306)
+    ..add(15307)
+    ..add(15308)
+    ..add(15309)
+    ..add(15310)
+    ..add(15311)
+    ..add(15312)
+    ..add(15313)
+    ..add(15314)
+    ..add(15315)
+    ..add(15316)
+    ..add(15317)
+    ..add(15318)
+    ..add(15319)
+    ..add(15320)
+    ..add(15321)
+    ..add(15322)
+    ..add(15323)
+    ..add(15324)
+    ..add(15325)
+    ..add(15326)
+    ..add(15327)
+    ..add(15328)
+    ..add(15329)
+    ..add(15330)
+    ..add(15331)
+    ..add(15332)
+    ..add(15333)
+    ..add(15334)
+    ..add(15335)
+    ..add(15336)
+    ..add(15337)
+    ..add(15338)
+    ..add(15339)
+    ..add(15340)
+    ..add(15341)
+    ..add(15342)
+    ..add(15343)
+    ..add(15344)
+    ..add(15345)
+    ..add(15346)
+    ..add(15347)
+    ..add(15348)
+    ..add(15349)
+    ..add(15350)
+    ..add(15351)
+    ..add(15352)
+    ..add(15353)
+    ..add(15354)
+    ..add(15355)
+    ..add(15356)
+    ..add(15357)
+    ..add(15358)
+    ..add(15359)
+    ..add(15360)
+    ..add(15361)
+    ..add(15362)
+    ..add(15363)
+    ..add(15364)
+    ..add(15365)
+    ..add(15366)
+    ..add(15367)
+    ..add(15368)
+    ..add(15369)
+    ..add(15370)
+    ..add(15371)
+    ..add(15372)
+    ..add(15373)
+    ..add(15374)
+    ..add(15375)
+    ..add(15376)
+    ..add(15377)
+    ..add(15378)
+    ..add(15379)
+    ..add(15380)
+    ..add(15381)
+    ..add(15382)
+    ..add(15383)
+    ..add(15384)
+    ..add(15385)
+    ..add(15386)
+    ..add(15387)
+    ..add(15388)
+    ..add(15389)
+    ..add(15390)
+    ..add(15391)
+    ..add(15392)
+    ..add(15393)
+    ..add(15394)
+    ..add(15395)
+    ..add(15396)
+    ..add(15397)
+    ..add(15398)
+    ..add(15399)
+    ..add(15400)
+    ..add(15401)
+    ..add(15402)
+    ..add(15403)
+    ..add(15404)
+    ..add(15405)
+    ..add(15406)
+    ..add(15407)
+    ..add(15408)
+    ..add(15409)
+    ..add(15410)
+    ..add(15411)
+    ..add(15412)
+    ..add(15413)
+    ..add(15414)
+    ..add(15415)
+    ..add(15416)
+    ..add(15417)
+    ..add(15418)
+    ..add(15419)
+    ..add(15420)
+    ..add(15421)
+    ..add(15422)
+    ..add(15423)
+    ..add(15424)
+    ..add(15425)
+    ..add(15426)
+    ..add(15427)
+    ..add(15428)
+    ..add(15429)
+    ..add(15430)
+    ..add(15431)
+    ..add(15432)
+    ..add(15433)
+    ..add(15434)
+    ..add(15435)
+    ..add(15436)
+    ..add(15437)
+    ..add(15438)
+    ..add(15439)
+    ..add(15440)
+    ..add(15441)
+    ..add(15442)
+    ..add(15443)
+    ..add(15444)
+    ..add(15445)
+    ..add(15446)
+    ..add(15447)
+    ..add(15448)
+    ..add(15449)
+    ..add(15450)
+    ..add(15451)
+    ..add(15452)
+    ..add(15453)
+    ..add(15454)
+    ..add(15455)
+    ..add(15456)
+    ..add(15457)
+    ..add(15458)
+    ..add(15459)
+    ..add(15460)
+    ..add(15461)
+    ..add(15462)
+    ..add(15463)
+    ..add(15464)
+    ..add(15465)
+    ..add(15466)
+    ..add(15467)
+    ..add(15468)
+    ..add(15469)
+    ..add(15470)
+    ..add(15471)
+    ..add(15472)
+    ..add(15473)
+    ..add(15474)
+    ..add(15475)
+    ..add(15476)
+    ..add(15477)
+    ..add(15478)
+    ..add(15479)
+    ..add(15480)
+    ..add(15481)
+    ..add(15482)
+    ..add(15483)
+    ..add(15484)
+    ..add(15485)
+    ..add(15486)
+    ..add(15487)
+    ..add(15488)
+    ..add(15489)
+    ..add(15490)
+    ..add(15491)
+    ..add(15492)
+    ..add(15493)
+    ..add(15494)
+    ..add(15495)
+    ..add(15496)
+    ..add(15497)
+    ..add(15498)
+    ..add(15499)
+    ..add(15500)
+    ..add(15501)
+    ..add(15502)
+    ..add(15503)
+    ..add(15504)
+    ..add(15505)
+    ..add(15506)
+    ..add(15507)
+    ..add(15508)
+    ..add(15509)
+    ..add(15510)
+    ..add(15511)
+    ..add(15512)
+    ..add(15513)
+    ..add(15514)
+    ..add(15515)
+    ..add(15516)
+    ..add(15517)
+    ..add(15518)
+    ..add(15519)
+    ..add(15520)
+    ..add(15521)
+    ..add(15522)
+    ..add(15523)
+    ..add(15524)
+    ..add(15525)
+    ..add(15526)
+    ..add(15527)
+    ..add(15528)
+    ..add(15529)
+    ..add(15530)
+    ..add(15531)
+    ..add(15532)
+    ..add(15533)
+    ..add(15534)
+    ..add(15535)
+    ..add(15536)
+    ..add(15537)
+    ..add(15538)
+    ..add(15539)
+    ..add(15540)
+    ..add(15541)
+    ..add(15542)
+    ..add(15543)
+    ..add(15544)
+    ..add(15545)
+    ..add(15546)
+    ..add(15547)
+    ..add(15548)
+    ..add(15549)
+    ..add(15550)
+    ..add(15551)
+    ..add(15552)
+    ..add(15553)
+    ..add(15554)
+    ..add(15555)
+    ..add(15556)
+    ..add(15557)
+    ..add(15558)
+    ..add(15559)
+    ..add(15560)
+    ..add(15561)
+    ..add(15562)
+    ..add(15563)
+    ..add(15564)
+    ..add(15565)
+    ..add(15566)
+    ..add(15567)
+    ..add(15568)
+    ..add(15569)
+    ..add(15570)
+    ..add(15571)
+    ..add(15572)
+    ..add(15573)
+    ..add(15574)
+    ..add(15575)
+    ..add(15576)
+    ..add(15577)
+    ..add(15578)
+    ..add(15579)
+    ..add(15580)
+    ..add(15581)
+    ..add(15582)
+    ..add(15583)
+    ..add(15584)
+    ..add(15585)
+    ..add(15586)
+    ..add(15587)
+    ..add(15588)
+    ..add(15589)
+    ..add(15590)
+    ..add(15591)
+    ..add(15592)
+    ..add(15593)
+    ..add(15594)
+    ..add(15595)
+    ..add(15596)
+    ..add(15597)
+    ..add(15598)
+    ..add(15599)
+    ..add(15600)
+    ..add(15601)
+    ..add(15602)
+    ..add(15603)
+    ..add(15604)
+    ..add(15605)
+    ..add(15606)
+    ..add(15607)
+    ..add(15608)
+    ..add(15609)
+    ..add(15610)
+    ..add(15611)
+    ..add(15612)
+    ..add(15613)
+    ..add(15614)
+    ..add(15615)
+    ..add(15616)
+    ..add(15617)
+    ..add(15618)
+    ..add(15619)
+    ..add(15620)
+    ..add(15621)
+    ..add(15622)
+    ..add(15623)
+    ..add(15624)
+    ..add(15625)
+    ..add(15626)
+    ..add(15627)
+    ..add(15628)
+    ..add(15629)
+    ..add(15630)
+    ..add(15631)
+    ..add(15632)
+    ..add(15633)
+    ..add(15634)
+    ..add(15635)
+    ..add(15636)
+    ..add(15637)
+    ..add(15638)
+    ..add(15639)
+    ..add(15640)
+    ..add(15641)
+    ..add(15642)
+    ..add(15643)
+    ..add(15644)
+    ..add(15645)
+    ..add(15646)
+    ..add(15647)
+    ..add(15648)
+    ..add(15649)
+    ..add(15650)
+    ..add(15651)
+    ..add(15652)
+    ..add(15653)
+    ..add(15654)
+    ..add(15655)
+    ..add(15656)
+    ..add(15657)
+    ..add(15658)
+    ..add(15659)
+    ..add(15660)
+    ..add(15661)
+    ..add(15662)
+    ..add(15663)
+    ..add(15664)
+    ..add(15665)
+    ..add(15666)
+    ..add(15667)
+    ..add(15668)
+    ..add(15669)
+    ..add(15670)
+    ..add(15671)
+    ..add(15672)
+    ..add(15673)
+    ..add(15674)
+    ..add(15675)
+    ..add(15676)
+    ..add(15677)
+    ..add(15678)
+    ..add(15679)
+    ..add(15680)
+    ..add(15681)
+    ..add(15682)
+    ..add(15683)
+    ..add(15684)
+    ..add(15685)
+    ..add(15686)
+    ..add(15687)
+    ..add(15688)
+    ..add(15689)
+    ..add(15690)
+    ..add(15691)
+    ..add(15692)
+    ..add(15693)
+    ..add(15694)
+    ..add(15695)
+    ..add(15696)
+    ..add(15697)
+    ..add(15698)
+    ..add(15699)
+    ..add(15700)
+    ..add(15701)
+    ..add(15702)
+    ..add(15703)
+    ..add(15704)
+    ..add(15705)
+    ..add(15706)
+    ..add(15707)
+    ..add(15708)
+    ..add(15709)
+    ..add(15710)
+    ..add(15711)
+    ..add(15712)
+    ..add(15713)
+    ..add(15714)
+    ..add(15715)
+    ..add(15716)
+    ..add(15717)
+    ..add(15718)
+    ..add(15719)
+    ..add(15720)
+    ..add(15721)
+    ..add(15722)
+    ..add(15723)
+    ..add(15724)
+    ..add(15725)
+    ..add(15726)
+    ..add(15727)
+    ..add(15728)
+    ..add(15729)
+    ..add(15730)
+    ..add(15731)
+    ..add(15732)
+    ..add(15733)
+    ..add(15734)
+    ..add(15735)
+    ..add(15736)
+    ..add(15737)
+    ..add(15738)
+    ..add(15739)
+    ..add(15740)
+    ..add(15741)
+    ..add(15742)
+    ..add(15743)
+    ..add(15744)
+    ..add(15745)
+    ..add(15746)
+    ..add(15747)
+    ..add(15748)
+    ..add(15749)
+    ..add(15750)
+    ..add(15751)
+    ..add(15752)
+    ..add(15753)
+    ..add(15754)
+    ..add(15755)
+    ..add(15756)
+    ..add(15757)
+    ..add(15758)
+    ..add(15759)
+    ..add(15760)
+    ..add(15761)
+    ..add(15762)
+    ..add(15763)
+    ..add(15764)
+    ..add(15765)
+    ..add(15766)
+    ..add(15767)
+    ..add(15768)
+    ..add(15769)
+    ..add(15770)
+    ..add(15771)
+    ..add(15772)
+    ..add(15773)
+    ..add(15774)
+    ..add(15775)
+    ..add(15776)
+    ..add(15777)
+    ..add(15778)
+    ..add(15779)
+    ..add(15780)
+    ..add(15781)
+    ..add(15782)
+    ..add(15783)
+    ..add(15784)
+    ..add(15785)
+    ..add(15786)
+    ..add(15787)
+    ..add(15788)
+    ..add(15789)
+    ..add(15790)
+    ..add(15791)
+    ..add(15792)
+    ..add(15793)
+    ..add(15794)
+    ..add(15795)
+    ..add(15796)
+    ..add(15797)
+    ..add(15798)
+    ..add(15799)
+    ..add(15800)
+    ..add(15801)
+    ..add(15802)
+    ..add(15803)
+    ..add(15804)
+    ..add(15805)
+    ..add(15806)
+    ..add(15807)
+    ..add(15808)
+    ..add(15809)
+    ..add(15810)
+    ..add(15811)
+    ..add(15812)
+    ..add(15813)
+    ..add(15814)
+    ..add(15815)
+    ..add(15816)
+    ..add(15817)
+    ..add(15818)
+    ..add(15819)
+    ..add(15820)
+    ..add(15821)
+    ..add(15822)
+    ..add(15823)
+    ..add(15824)
+    ..add(15825)
+    ..add(15826)
+    ..add(15827)
+    ..add(15828)
+    ..add(15829)
+    ..add(15830)
+    ..add(15831)
+    ..add(15832)
+    ..add(15833)
+    ..add(15834)
+    ..add(15835)
+    ..add(15836)
+    ..add(15837)
+    ..add(15838)
+    ..add(15839)
+    ..add(15840)
+    ..add(15841)
+    ..add(15842)
+    ..add(15843)
+    ..add(15844)
+    ..add(15845)
+    ..add(15846)
+    ..add(15847)
+    ..add(15848)
+    ..add(15849)
+    ..add(15850)
+    ..add(15851)
+    ..add(15852)
+    ..add(15853)
+    ..add(15854)
+    ..add(15855)
+    ..add(15856)
+    ..add(15857)
+    ..add(15858)
+    ..add(15859)
+    ..add(15860)
+    ..add(15861)
+    ..add(15862)
+    ..add(15863)
+    ..add(15864)
+    ..add(15865)
+    ..add(15866)
+    ..add(15867)
+    ..add(15868)
+    ..add(15869)
+    ..add(15870)
+    ..add(15871)
+    ..add(15872)
+    ..add(15873)
+    ..add(15874)
+    ..add(15875)
+    ..add(15876)
+    ..add(15877)
+    ..add(15878)
+    ..add(15879)
+    ..add(15880)
+    ..add(15881)
+    ..add(15882)
+    ..add(15883)
+    ..add(15884)
+    ..add(15885)
+    ..add(15886)
+    ..add(15887)
+    ..add(15888)
+    ..add(15889)
+    ..add(15890)
+    ..add(15891)
+    ..add(15892)
+    ..add(15893)
+    ..add(15894)
+    ..add(15895)
+    ..add(15896)
+    ..add(15897)
+    ..add(15898)
+    ..add(15899)
+    ..add(15900)
+    ..add(15901)
+    ..add(15902)
+    ..add(15903)
+    ..add(15904)
+    ..add(15905)
+    ..add(15906)
+    ..add(15907)
+    ..add(15908)
+    ..add(15909)
+    ..add(15910)
+    ..add(15911)
+    ..add(15912)
+    ..add(15913)
+    ..add(15914)
+    ..add(15915)
+    ..add(15916)
+    ..add(15917)
+    ..add(15918)
+    ..add(15919)
+    ..add(15920)
+    ..add(15921)
+    ..add(15922)
+    ..add(15923)
+    ..add(15924)
+    ..add(15925)
+    ..add(15926)
+    ..add(15927)
+    ..add(15928)
+    ..add(15929)
+    ..add(15930)
+    ..add(15931)
+    ..add(15932)
+    ..add(15933)
+    ..add(15934)
+    ..add(15935)
+    ..add(15936)
+    ..add(15937)
+    ..add(15938)
+    ..add(15939)
+    ..add(15940)
+    ..add(15941)
+    ..add(15942)
+    ..add(15943)
+    ..add(15944)
+    ..add(15945)
+    ..add(15946)
+    ..add(15947)
+    ..add(15948)
+    ..add(15949)
+    ..add(15950)
+    ..add(15951)
+    ..add(15952)
+    ..add(15953)
+    ..add(15954)
+    ..add(15955)
+    ..add(15956)
+    ..add(15957)
+    ..add(15958)
+    ..add(15959)
+    ..add(15960)
+    ..add(15961)
+    ..add(15962)
+    ..add(15963)
+    ..add(15964)
+    ..add(15965)
+    ..add(15966)
+    ..add(15967)
+    ..add(15968)
+    ..add(15969)
+    ..add(15970)
+    ..add(15971)
+    ..add(15972)
+    ..add(15973)
+    ..add(15974)
+    ..add(15975)
+    ..add(15976)
+    ..add(15977)
+    ..add(15978)
+    ..add(15979)
+    ..add(15980)
+    ..add(15981)
+    ..add(15982)
+    ..add(15983)
+    ..add(15984)
+    ..add(15985)
+    ..add(15986)
+    ..add(15987)
+    ..add(15988)
+    ..add(15989)
+    ..add(15990)
+    ..add(15991)
+    ..add(15992)
+    ..add(15993)
+    ..add(15994)
+    ..add(15995)
+    ..add(15996)
+    ..add(15997)
+    ..add(15998)
+    ..add(15999)
+    ..add(16000)
+    ..add(16001)
+    ..add(16002)
+    ..add(16003)
+    ..add(16004)
+    ..add(16005)
+    ..add(16006)
+    ..add(16007)
+    ..add(16008)
+    ..add(16009)
+    ..add(16010)
+    ..add(16011)
+    ..add(16012)
+    ..add(16013)
+    ..add(16014)
+    ..add(16015)
+    ..add(16016)
+    ..add(16017)
+    ..add(16018)
+    ..add(16019)
+    ..add(16020)
+    ..add(16021)
+    ..add(16022)
+    ..add(16023)
+    ..add(16024)
+    ..add(16025)
+    ..add(16026)
+    ..add(16027)
+    ..add(16028)
+    ..add(16029)
+    ..add(16030)
+    ..add(16031)
+    ..add(16032)
+    ..add(16033)
+    ..add(16034)
+    ..add(16035)
+    ..add(16036)
+    ..add(16037)
+    ..add(16038)
+    ..add(16039)
+    ..add(16040)
+    ..add(16041)
+    ..add(16042)
+    ..add(16043)
+    ..add(16044)
+    ..add(16045)
+    ..add(16046)
+    ..add(16047)
+    ..add(16048)
+    ..add(16049)
+    ..add(16050)
+    ..add(16051)
+    ..add(16052)
+    ..add(16053)
+    ..add(16054)
+    ..add(16055)
+    ..add(16056)
+    ..add(16057)
+    ..add(16058)
+    ..add(16059)
+    ..add(16060)
+    ..add(16061)
+    ..add(16062)
+    ..add(16063)
+    ..add(16064)
+    ..add(16065)
+    ..add(16066)
+    ..add(16067)
+    ..add(16068)
+    ..add(16069)
+    ..add(16070)
+    ..add(16071)
+    ..add(16072)
+    ..add(16073)
+    ..add(16074)
+    ..add(16075)
+    ..add(16076)
+    ..add(16077)
+    ..add(16078)
+    ..add(16079)
+    ..add(16080)
+    ..add(16081)
+    ..add(16082)
+    ..add(16083)
+    ..add(16084)
+    ..add(16085)
+    ..add(16086)
+    ..add(16087)
+    ..add(16088)
+    ..add(16089)
+    ..add(16090)
+    ..add(16091)
+    ..add(16092)
+    ..add(16093)
+    ..add(16094)
+    ..add(16095)
+    ..add(16096)
+    ..add(16097)
+    ..add(16098)
+    ..add(16099)
+    ..add(16100)
+    ..add(16101)
+    ..add(16102)
+    ..add(16103)
+    ..add(16104)
+    ..add(16105)
+    ..add(16106)
+    ..add(16107)
+    ..add(16108)
+    ..add(16109)
+    ..add(16110)
+    ..add(16111)
+    ..add(16112)
+    ..add(16113)
+    ..add(16114)
+    ..add(16115)
+    ..add(16116)
+    ..add(16117)
+    ..add(16118)
+    ..add(16119)
+    ..add(16120)
+    ..add(16121)
+    ..add(16122)
+    ..add(16123)
+    ..add(16124)
+    ..add(16125)
+    ..add(16126)
+    ..add(16127)
+    ..add(16128)
+    ..add(16129)
+    ..add(16130)
+    ..add(16131)
+    ..add(16132)
+    ..add(16133)
+    ..add(16134)
+    ..add(16135)
+    ..add(16136)
+    ..add(16137)
+    ..add(16138)
+    ..add(16139)
+    ..add(16140)
+    ..add(16141)
+    ..add(16142)
+    ..add(16143)
+    ..add(16144)
+    ..add(16145)
+    ..add(16146)
+    ..add(16147)
+    ..add(16148)
+    ..add(16149)
+    ..add(16150)
+    ..add(16151)
+    ..add(16152)
+    ..add(16153)
+    ..add(16154)
+    ..add(16155)
+    ..add(16156)
+    ..add(16157)
+    ..add(16158)
+    ..add(16159)
+    ..add(16160)
+    ..add(16161)
+    ..add(16162)
+    ..add(16163)
+    ..add(16164)
+    ..add(16165)
+    ..add(16166)
+    ..add(16167)
+    ..add(16168)
+    ..add(16169)
+    ..add(16170)
+    ..add(16171)
+    ..add(16172)
+    ..add(16173)
+    ..add(16174)
+    ..add(16175)
+    ..add(16176)
+    ..add(16177)
+    ..add(16178)
+    ..add(16179)
+    ..add(16180)
+    ..add(16181)
+    ..add(16182)
+    ..add(16183)
+    ..add(16184)
+    ..add(16185)
+    ..add(16186)
+    ..add(16187)
+    ..add(16188)
+    ..add(16189)
+    ..add(16190)
+    ..add(16191)
+    ..add(16192)
+    ..add(16193)
+    ..add(16194)
+    ..add(16195)
+    ..add(16196)
+    ..add(16197)
+    ..add(16198)
+    ..add(16199)
+    ..add(16200)
+    ..add(16201)
+    ..add(16202)
+    ..add(16203)
+    ..add(16204)
+    ..add(16205)
+    ..add(16206)
+    ..add(16207)
+    ..add(16208)
+    ..add(16209)
+    ..add(16210)
+    ..add(16211)
+    ..add(16212)
+    ..add(16213)
+    ..add(16214)
+    ..add(16215)
+    ..add(16216)
+    ..add(16217)
+    ..add(16218)
+    ..add(16219)
+    ..add(16220)
+    ..add(16221)
+    ..add(16222)
+    ..add(16223)
+    ..add(16224)
+    ..add(16225)
+    ..add(16226)
+    ..add(16227)
+    ..add(16228)
+    ..add(16229)
+    ..add(16230)
+    ..add(16231)
+    ..add(16232)
+    ..add(16233)
+    ..add(16234)
+    ..add(16235)
+    ..add(16236)
+    ..add(16237)
+    ..add(16238)
+    ..add(16239)
+    ..add(16240)
+    ..add(16241)
+    ..add(16242)
+    ..add(16243)
+    ..add(16244)
+    ..add(16245)
+    ..add(16246)
+    ..add(16247)
+    ..add(16248)
+    ..add(16249)
+    ..add(16250)
+    ..add(16251)
+    ..add(16252)
+    ..add(16253)
+    ..add(16254)
+    ..add(16255)
+    ..add(16256)
+    ..add(16257)
+    ..add(16258)
+    ..add(16259)
+    ..add(16260)
+    ..add(16261)
+    ..add(16262)
+    ..add(16263)
+    ..add(16264)
+    ..add(16265)
+    ..add(16266)
+    ..add(16267)
+    ..add(16268)
+    ..add(16269)
+    ..add(16270)
+    ..add(16271)
+    ..add(16272)
+    ..add(16273)
+    ..add(16274)
+    ..add(16275)
+    ..add(16276)
+    ..add(16277)
+    ..add(16278)
+    ..add(16279)
+    ..add(16280)
+    ..add(16281)
+    ..add(16282)
+    ..add(16283)
+    ..add(16284)
+    ..add(16285)
+    ..add(16286)
+    ..add(16287)
+    ..add(16288)
+    ..add(16289)
+    ..add(16290)
+    ..add(16291)
+    ..add(16292)
+    ..add(16293)
+    ..add(16294)
+    ..add(16295)
+    ..add(16296)
+    ..add(16297)
+    ..add(16298)
+    ..add(16299)
+    ..add(16300)
+    ..add(16301)
+    ..add(16302)
+    ..add(16303)
+    ..add(16304)
+    ..add(16305)
+    ..add(16306)
+    ..add(16307)
+    ..add(16308)
+    ..add(16309)
+    ..add(16310)
+    ..add(16311)
+    ..add(16312)
+    ..add(16313)
+    ..add(16314)
+    ..add(16315)
+    ..add(16316)
+    ..add(16317)
+    ..add(16318)
+    ..add(16319)
+    ..add(16320)
+    ..add(16321)
+    ..add(16322)
+    ..add(16323)
+    ..add(16324)
+    ..add(16325)
+    ..add(16326)
+    ..add(16327)
+    ..add(16328)
+    ..add(16329)
+    ..add(16330)
+    ..add(16331)
+    ..add(16332)
+    ..add(16333)
+    ..add(16334)
+    ..add(16335)
+    ..add(16336)
+    ..add(16337)
+    ..add(16338)
+    ..add(16339)
+    ..add(16340)
+    ..add(16341)
+    ..add(16342)
+    ..add(16343)
+    ..add(16344)
+    ..add(16345)
+    ..add(16346)
+    ..add(16347)
+    ..add(16348)
+    ..add(16349)
+    ..add(16350)
+    ..add(16351)
+    ..add(16352)
+    ..add(16353)
+    ..add(16354)
+    ..add(16355)
+    ..add(16356)
+    ..add(16357)
+    ..add(16358)
+    ..add(16359)
+    ..add(16360)
+    ..add(16361)
+    ..add(16362)
+    ..add(16363)
+    ..add(16364)
+    ..add(16365)
+    ..add(16366)
+    ..add(16367)
+    ..add(16368)
+    ..add(16369)
+    ..add(16370)
+    ..add(16371)
+    ..add(16372)
+    ..add(16373)
+    ..add(16374)
+    ..add(16375)
+    ..add(16376)
+    ..add(16377)
+    ..add(16378)
+    ..add(16379)
+    ..add(16380)
+    ..add(16381)
+    ..add(16382)
+    ..add(16383)
+    ..add(16384)
+    ..add(16385)
+    ..add(16386)
+    ..add(16387)
+    ..add(16388)
+    ..add(16389)
+    ..add(16390)
+    ..add(16391)
+    ..add(16392)
+    ..add(16393)
+    ..add(16394)
+    ..add(16395)
+    ..add(16396)
+    ..add(16397)
+    ..add(16398)
+    ..add(16399)
+    ..add(16400)
+    ..add(16401)
+    ..add(16402)
+    ..add(16403)
+    ..add(16404)
+    ..add(16405)
+    ..add(16406)
+    ..add(16407)
+    ..add(16408)
+    ..add(16409)
+    ..add(16410)
+    ..add(16411)
+    ..add(16412)
+    ..add(16413)
+    ..add(16414)
+    ..add(16415)
+    ..add(16416)
+    ..add(16417)
+    ..add(16418)
+    ..add(16419)
+    ..add(16420)
+    ..add(16421)
+    ..add(16422)
+    ..add(16423)
+    ..add(16424)
+    ..add(16425)
+    ..add(16426)
+    ..add(16427)
+    ..add(16428)
+    ..add(16429)
+    ..add(16430)
+    ..add(16431)
+    ..add(16432)
+    ..add(16433)
+    ..add(16434)
+    ..add(16435)
+    ..add(16436)
+    ..add(16437)
+    ..add(16438)
+    ..add(16439)
+    ..add(16440)
+    ..add(16441)
+    ..add(16442)
+    ..add(16443)
+    ..add(16444)
+    ..add(16445)
+    ..add(16446)
+    ..add(16447)
+    ..add(16448)
+    ..add(16449)
+    ..add(16450)
+    ..add(16451)
+    ..add(16452)
+    ..add(16453)
+    ..add(16454)
+    ..add(16455)
+    ..add(16456)
+    ..add(16457)
+    ..add(16458)
+    ..add(16459)
+    ..add(16460)
+    ..add(16461)
+    ..add(16462)
+    ..add(16463)
+    ..add(16464)
+    ..add(16465)
+    ..add(16466)
+    ..add(16467)
+    ..add(16468)
+    ..add(16469)
+    ..add(16470)
+    ..add(16471)
+    ..add(16472)
+    ..add(16473)
+    ..add(16474)
+    ..add(16475)
+    ..add(16476)
+    ..add(16477)
+    ..add(16478)
+    ..add(16479)
+    ..add(16480)
+    ..add(16481)
+    ..add(16482)
+    ..add(16483)
+    ..add(16484)
+    ..add(16485)
+    ..add(16486)
+    ..add(16487)
+    ..add(16488)
+    ..add(16489)
+    ..add(16490)
+    ..add(16491)
+    ..add(16492)
+    ..add(16493)
+    ..add(16494)
+    ..add(16495)
+    ..add(16496)
+    ..add(16497)
+    ..add(16498)
+    ..add(16499)
+    ..add(16500)
+    ..add(16501)
+    ..add(16502)
+    ..add(16503)
+    ..add(16504)
+    ..add(16505)
+    ..add(16506)
+    ..add(16507)
+    ..add(16508)
+    ..add(16509)
+    ..add(16510)
+    ..add(16511)
+    ..add(16512)
+    ..add(16513)
+    ..add(16514)
+    ..add(16515)
+    ..add(16516)
+    ..add(16517)
+    ..add(16518)
+    ..add(16519)
+    ..add(16520)
+    ..add(16521)
+    ..add(16522)
+    ..add(16523)
+    ..add(16524)
+    ..add(16525)
+    ..add(16526)
+    ..add(16527)
+    ..add(16528)
+    ..add(16529)
+    ..add(16530)
+    ..add(16531)
+    ..add(16532)
+    ..add(16533)
+    ..add(16534)
+    ..add(16535)
+    ..add(16536)
+    ..add(16537)
+    ..add(16538)
+    ..add(16539)
+    ..add(16540)
+    ..add(16541)
+    ..add(16542)
+    ..add(16543)
+    ..add(16544)
+    ..add(16545)
+    ..add(16546)
+    ..add(16547)
+    ..add(16548)
+    ..add(16549)
+    ..add(16550)
+    ..add(16551)
+    ..add(16552)
+    ..add(16553)
+    ..add(16554)
+    ..add(16555)
+    ..add(16556)
+    ..add(16557)
+    ..add(16558)
+    ..add(16559)
+    ..add(16560)
+    ..add(16561)
+    ..add(16562)
+    ..add(16563)
+    ..add(16564)
+    ..add(16565)
+    ..add(16566)
+    ..add(16567)
+    ..add(16568)
+    ..add(16569)
+    ..add(16570)
+    ..add(16571)
+    ..add(16572)
+    ..add(16573)
+    ..add(16574)
+    ..add(16575)
+    ..add(16576)
+    ..add(16577)
+    ..add(16578)
+    ..add(16579)
+    ..add(16580)
+    ..add(16581)
+    ..add(16582)
+    ..add(16583)
+    ..add(16584)
+    ..add(16585)
+    ..add(16586)
+    ..add(16587)
+    ..add(16588)
+    ..add(16589)
+    ..add(16590)
+    ..add(16591)
+    ..add(16592)
+    ..add(16593)
+    ..add(16594)
+    ..add(16595)
+    ..add(16596)
+    ..add(16597)
+    ..add(16598)
+    ..add(16599)
+    ..add(16600)
+    ..add(16601)
+    ..add(16602)
+    ..add(16603)
+    ..add(16604)
+    ..add(16605)
+    ..add(16606)
+    ..add(16607)
+    ..add(16608)
+    ..add(16609)
+    ..add(16610)
+    ..add(16611)
+    ..add(16612)
+    ..add(16613)
+    ..add(16614)
+    ..add(16615)
+    ..add(16616)
+    ..add(16617)
+    ..add(16618)
+    ..add(16619)
+    ..add(16620)
+    ..add(16621)
+    ..add(16622)
+    ..add(16623)
+    ..add(16624)
+    ..add(16625)
+    ..add(16626)
+    ..add(16627)
+    ..add(16628)
+    ..add(16629)
+    ..add(16630)
+    ..add(16631)
+    ..add(16632)
+    ..add(16633)
+    ..add(16634)
+    ..add(16635)
+    ..add(16636)
+    ..add(16637)
+    ..add(16638)
+    ..add(16639)
+    ..add(16640)
+    ..add(16641)
+    ..add(16642)
+    ..add(16643)
+    ..add(16644)
+    ..add(16645)
+    ..add(16646)
+    ..add(16647)
+    ..add(16648)
+    ..add(16649)
+    ..add(16650)
+    ..add(16651)
+    ..add(16652)
+    ..add(16653)
+    ..add(16654)
+    ..add(16655)
+    ..add(16656)
+    ..add(16657)
+    ..add(16658)
+    ..add(16659)
+    ..add(16660)
+    ..add(16661)
+    ..add(16662)
+    ..add(16663)
+    ..add(16664)
+    ..add(16665)
+    ..add(16666)
+    ..add(16667)
+    ..add(16668)
+    ..add(16669)
+    ..add(16670)
+    ..add(16671)
+    ..add(16672)
+    ..add(16673)
+    ..add(16674)
+    ..add(16675)
+    ..add(16676)
+    ..add(16677)
+    ..add(16678)
+    ..add(16679)
+    ..add(16680)
+    ..add(16681)
+    ..add(16682)
+    ..add(16683)
+    ..add(16684)
+    ..add(16685)
+    ..add(16686)
+    ..add(16687)
+    ..add(16688)
+    ..add(16689)
+    ..add(16690)
+    ..add(16691)
+    ..add(16692)
+    ..add(16693)
+    ..add(16694)
+    ..add(16695)
+    ..add(16696)
+    ..add(16697)
+    ..add(16698)
+    ..add(16699)
+    ..add(16700)
+    ..add(16701)
+    ..add(16702)
+    ..add(16703)
+    ..add(16704)
+    ..add(16705)
+    ..add(16706)
+    ..add(16707)
+    ..add(16708)
+    ..add(16709)
+    ..add(16710)
+    ..add(16711)
+    ..add(16712)
+    ..add(16713)
+    ..add(16714)
+    ..add(16715)
+    ..add(16716)
+    ..add(16717)
+    ..add(16718)
+    ..add(16719)
+    ..add(16720)
+    ..add(16721)
+    ..add(16722)
+    ..add(16723)
+    ..add(16724)
+    ..add(16725)
+    ..add(16726)
+    ..add(16727)
+    ..add(16728)
+    ..add(16729)
+    ..add(16730)
+    ..add(16731)
+    ..add(16732)
+    ..add(16733)
+    ..add(16734)
+    ..add(16735)
+    ..add(16736)
+    ..add(16737)
+    ..add(16738)
+    ..add(16739)
+    ..add(16740)
+    ..add(16741)
+    ..add(16742)
+    ..add(16743)
+    ..add(16744)
+    ..add(16745)
+    ..add(16746)
+    ..add(16747)
+    ..add(16748)
+    ..add(16749)
+    ..add(16750)
+    ..add(16751)
+    ..add(16752)
+    ..add(16753)
+    ..add(16754)
+    ..add(16755)
+    ..add(16756)
+    ..add(16757)
+    ..add(16758)
+    ..add(16759)
+    ..add(16760)
+    ..add(16761)
+    ..add(16762)
+    ..add(16763)
+    ..add(16764)
+    ..add(16765)
+    ..add(16766)
+    ..add(16767)
+    ..add(16768)
+    ..add(16769)
+    ..add(16770)
+    ..add(16771)
+    ..add(16772)
+    ..add(16773)
+    ..add(16774)
+    ..add(16775)
+    ..add(16776)
+    ..add(16777)
+    ..add(16778)
+    ..add(16779)
+    ..add(16780)
+    ..add(16781)
+    ..add(16782)
+    ..add(16783)
+    ..add(16784)
+    ..add(16785)
+    ..add(16786)
+    ..add(16787)
+    ..add(16788)
+    ..add(16789)
+    ..add(16790)
+    ..add(16791)
+    ..add(16792)
+    ..add(16793)
+    ..add(16794)
+    ..add(16795)
+    ..add(16796)
+    ..add(16797)
+    ..add(16798)
+    ..add(16799)
+    ..add(16800)
+    ..add(16801)
+    ..add(16802)
+    ..add(16803)
+    ..add(16804)
+    ..add(16805)
+    ..add(16806)
+    ..add(16807)
+    ..add(16808)
+    ..add(16809)
+    ..add(16810)
+    ..add(16811)
+    ..add(16812)
+    ..add(16813)
+    ..add(16814)
+    ..add(16815)
+    ..add(16816)
+    ..add(16817)
+    ..add(16818)
+    ..add(16819)
+    ..add(16820)
+    ..add(16821)
+    ..add(16822)
+    ..add(16823)
+    ..add(16824)
+    ..add(16825)
+    ..add(16826)
+    ..add(16827)
+    ..add(16828)
+    ..add(16829)
+    ..add(16830)
+    ..add(16831)
+    ..add(16832)
+    ..add(16833)
+    ..add(16834)
+    ..add(16835)
+    ..add(16836)
+    ..add(16837)
+    ..add(16838)
+    ..add(16839)
+    ..add(16840)
+    ..add(16841)
+    ..add(16842)
+    ..add(16843)
+    ..add(16844)
+    ..add(16845)
+    ..add(16846)
+    ..add(16847)
+    ..add(16848)
+    ..add(16849)
+    ..add(16850)
+    ..add(16851)
+    ..add(16852)
+    ..add(16853)
+    ..add(16854)
+    ..add(16855)
+    ..add(16856)
+    ..add(16857)
+    ..add(16858)
+    ..add(16859)
+    ..add(16860)
+    ..add(16861)
+    ..add(16862)
+    ..add(16863)
+    ..add(16864)
+    ..add(16865)
+    ..add(16866)
+    ..add(16867)
+    ..add(16868)
+    ..add(16869)
+    ..add(16870)
+    ..add(16871)
+    ..add(16872)
+    ..add(16873)
+    ..add(16874)
+    ..add(16875)
+    ..add(16876)
+    ..add(16877)
+    ..add(16878)
+    ..add(16879)
+    ..add(16880)
+    ..add(16881)
+    ..add(16882)
+    ..add(16883)
+    ..add(16884)
+    ..add(16885)
+    ..add(16886)
+    ..add(16887)
+    ..add(16888)
+    ..add(16889)
+    ..add(16890)
+    ..add(16891)
+    ..add(16892)
+    ..add(16893)
+    ..add(16894)
+    ..add(16895)
+    ..add(16896)
+    ..add(16897)
+    ..add(16898)
+    ..add(16899)
+    ..add(16900)
+    ..add(16901)
+    ..add(16902)
+    ..add(16903)
+    ..add(16904)
+    ..add(16905)
+    ..add(16906)
+    ..add(16907)
+    ..add(16908)
+    ..add(16909)
+    ..add(16910)
+    ..add(16911)
+    ..add(16912)
+    ..add(16913)
+    ..add(16914)
+    ..add(16915)
+    ..add(16916)
+    ..add(16917)
+    ..add(16918)
+    ..add(16919)
+    ..add(16920)
+    ..add(16921)
+    ..add(16922)
+    ..add(16923)
+    ..add(16924)
+    ..add(16925)
+    ..add(16926)
+    ..add(16927)
+    ..add(16928)
+    ..add(16929)
+    ..add(16930)
+    ..add(16931)
+    ..add(16932)
+    ..add(16933)
+    ..add(16934)
+    ..add(16935)
+    ..add(16936)
+    ..add(16937)
+    ..add(16938)
+    ..add(16939)
+    ..add(16940)
+    ..add(16941)
+    ..add(16942)
+    ..add(16943)
+    ..add(16944)
+    ..add(16945)
+    ..add(16946)
+    ..add(16947)
+    ..add(16948)
+    ..add(16949)
+    ..add(16950)
+    ..add(16951)
+    ..add(16952)
+    ..add(16953)
+    ..add(16954)
+    ..add(16955)
+    ..add(16956)
+    ..add(16957)
+    ..add(16958)
+    ..add(16959)
+    ..add(16960)
+    ..add(16961)
+    ..add(16962)
+    ..add(16963)
+    ..add(16964)
+    ..add(16965)
+    ..add(16966)
+    ..add(16967)
+    ..add(16968)
+    ..add(16969)
+    ..add(16970)
+    ..add(16971)
+    ..add(16972)
+    ..add(16973)
+    ..add(16974)
+    ..add(16975)
+    ..add(16976)
+    ..add(16977)
+    ..add(16978)
+    ..add(16979)
+    ..add(16980)
+    ..add(16981)
+    ..add(16982)
+    ..add(16983)
+    ..add(16984)
+    ..add(16985)
+    ..add(16986)
+    ..add(16987)
+    ..add(16988)
+    ..add(16989)
+    ..add(16990)
+    ..add(16991)
+    ..add(16992)
+    ..add(16993)
+    ..add(16994)
+    ..add(16995)
+    ..add(16996)
+    ..add(16997)
+    ..add(16998)
+    ..add(16999)
+    ..add(17000)
+    ..add(17001)
+    ..add(17002)
+    ..add(17003)
+    ..add(17004)
+    ..add(17005)
+    ..add(17006)
+    ..add(17007)
+    ..add(17008)
+    ..add(17009)
+    ..add(17010)
+    ..add(17011)
+    ..add(17012)
+    ..add(17013)
+    ..add(17014)
+    ..add(17015)
+    ..add(17016)
+    ..add(17017)
+    ..add(17018)
+    ..add(17019)
+    ..add(17020)
+    ..add(17021)
+    ..add(17022)
+    ..add(17023)
+    ..add(17024)
+    ..add(17025)
+    ..add(17026)
+    ..add(17027)
+    ..add(17028)
+    ..add(17029)
+    ..add(17030)
+    ..add(17031)
+    ..add(17032)
+    ..add(17033)
+    ..add(17034)
+    ..add(17035)
+    ..add(17036)
+    ..add(17037)
+    ..add(17038)
+    ..add(17039)
+    ..add(17040)
+    ..add(17041)
+    ..add(17042)
+    ..add(17043)
+    ..add(17044)
+    ..add(17045)
+    ..add(17046)
+    ..add(17047)
+    ..add(17048)
+    ..add(17049)
+    ..add(17050)
+    ..add(17051)
+    ..add(17052)
+    ..add(17053)
+    ..add(17054)
+    ..add(17055)
+    ..add(17056)
+    ..add(17057)
+    ..add(17058)
+    ..add(17059)
+    ..add(17060)
+    ..add(17061)
+    ..add(17062)
+    ..add(17063)
+    ..add(17064)
+    ..add(17065)
+    ..add(17066)
+    ..add(17067)
+    ..add(17068)
+    ..add(17069)
+    ..add(17070)
+    ..add(17071)
+    ..add(17072)
+    ..add(17073)
+    ..add(17074)
+    ..add(17075)
+    ..add(17076)
+    ..add(17077)
+    ..add(17078)
+    ..add(17079)
+    ..add(17080)
+    ..add(17081)
+    ..add(17082)
+    ..add(17083)
+    ..add(17084)
+    ..add(17085)
+    ..add(17086)
+    ..add(17087)
+    ..add(17088)
+    ..add(17089)
+    ..add(17090)
+    ..add(17091)
+    ..add(17092)
+    ..add(17093)
+    ..add(17094)
+    ..add(17095)
+    ..add(17096)
+    ..add(17097)
+    ..add(17098)
+    ..add(17099)
+    ..add(17100)
+    ..add(17101)
+    ..add(17102)
+    ..add(17103)
+    ..add(17104)
+    ..add(17105)
+    ..add(17106)
+    ..add(17107)
+    ..add(17108)
+    ..add(17109)
+    ..add(17110)
+    ..add(17111)
+    ..add(17112)
+    ..add(17113)
+    ..add(17114)
+    ..add(17115)
+    ..add(17116)
+    ..add(17117)
+    ..add(17118)
+    ..add(17119)
+    ..add(17120)
+    ..add(17121)
+    ..add(17122)
+    ..add(17123)
+    ..add(17124)
+    ..add(17125)
+    ..add(17126)
+    ..add(17127)
+    ..add(17128)
+    ..add(17129)
+    ..add(17130)
+    ..add(17131)
+    ..add(17132)
+    ..add(17133)
+    ..add(17134)
+    ..add(17135)
+    ..add(17136)
+    ..add(17137)
+    ..add(17138)
+    ..add(17139)
+    ..add(17140)
+    ..add(17141)
+    ..add(17142)
+    ..add(17143)
+    ..add(17144)
+    ..add(17145)
+    ..add(17146)
+    ..add(17147)
+    ..add(17148)
+    ..add(17149)
+    ..add(17150)
+    ..add(17151)
+    ..add(17152)
+    ..add(17153)
+    ..add(17154)
+    ..add(17155)
+    ..add(17156)
+    ..add(17157)
+    ..add(17158)
+    ..add(17159)
+    ..add(17160)
+    ..add(17161)
+    ..add(17162)
+    ..add(17163)
+    ..add(17164)
+    ..add(17165)
+    ..add(17166)
+    ..add(17167)
+    ..add(17168)
+    ..add(17169)
+    ..add(17170)
+    ..add(17171)
+    ..add(17172)
+    ..add(17173)
+    ..add(17174)
+    ..add(17175)
+    ..add(17176)
+    ..add(17177)
+    ..add(17178)
+    ..add(17179)
+    ..add(17180)
+    ..add(17181)
+    ..add(17182)
+    ..add(17183)
+    ..add(17184)
+    ..add(17185)
+    ..add(17186)
+    ..add(17187)
+    ..add(17188)
+    ..add(17189)
+    ..add(17190)
+    ..add(17191)
+    ..add(17192)
+    ..add(17193)
+    ..add(17194)
+    ..add(17195)
+    ..add(17196)
+    ..add(17197)
+    ..add(17198)
+    ..add(17199)
+    ..add(17200)
+    ..add(17201)
+    ..add(17202)
+    ..add(17203)
+    ..add(17204)
+    ..add(17205)
+    ..add(17206)
+    ..add(17207)
+    ..add(17208)
+    ..add(17209)
+    ..add(17210)
+    ..add(17211)
+    ..add(17212)
+    ..add(17213)
+    ..add(17214)
+    ..add(17215)
+    ..add(17216)
+    ..add(17217)
+    ..add(17218)
+    ..add(17219)
+    ..add(17220)
+    ..add(17221)
+    ..add(17222)
+    ..add(17223)
+    ..add(17224)
+    ..add(17225)
+    ..add(17226)
+    ..add(17227)
+    ..add(17228)
+    ..add(17229)
+    ..add(17230)
+    ..add(17231)
+    ..add(17232)
+    ..add(17233)
+    ..add(17234)
+    ..add(17235)
+    ..add(17236)
+    ..add(17237)
+    ..add(17238)
+    ..add(17239)
+    ..add(17240)
+    ..add(17241)
+    ..add(17242)
+    ..add(17243)
+    ..add(17244)
+    ..add(17245)
+    ..add(17246)
+    ..add(17247)
+    ..add(17248)
+    ..add(17249)
+    ..add(17250)
+    ..add(17251)
+    ..add(17252)
+    ..add(17253)
+    ..add(17254)
+    ..add(17255)
+    ..add(17256)
+    ..add(17257)
+    ..add(17258)
+    ..add(17259)
+    ..add(17260)
+    ..add(17261)
+    ..add(17262)
+    ..add(17263)
+    ..add(17264)
+    ..add(17265)
+    ..add(17266)
+    ..add(17267)
+    ..add(17268)
+    ..add(17269)
+    ..add(17270)
+    ..add(17271)
+    ..add(17272)
+    ..add(17273)
+    ..add(17274)
+    ..add(17275)
+    ..add(17276)
+    ..add(17277)
+    ..add(17278)
+    ..add(17279)
+    ..add(17280)
+    ..add(17281)
+    ..add(17282)
+    ..add(17283)
+    ..add(17284)
+    ..add(17285)
+    ..add(17286)
+    ..add(17287)
+    ..add(17288)
+    ..add(17289)
+    ..add(17290)
+    ..add(17291)
+    ..add(17292)
+    ..add(17293)
+    ..add(17294)
+    ..add(17295)
+    ..add(17296)
+    ..add(17297)
+    ..add(17298)
+    ..add(17299)
+    ..add(17300)
+    ..add(17301)
+    ..add(17302)
+    ..add(17303)
+    ..add(17304)
+    ..add(17305)
+    ..add(17306)
+    ..add(17307)
+    ..add(17308)
+    ..add(17309)
+    ..add(17310)
+    ..add(17311)
+    ..add(17312)
+    ..add(17313)
+    ..add(17314)
+    ..add(17315)
+    ..add(17316)
+    ..add(17317)
+    ..add(17318)
+    ..add(17319)
+    ..add(17320)
+    ..add(17321)
+    ..add(17322)
+    ..add(17323)
+    ..add(17324)
+    ..add(17325)
+    ..add(17326)
+    ..add(17327)
+    ..add(17328)
+    ..add(17329)
+    ..add(17330)
+    ..add(17331)
+    ..add(17332)
+    ..add(17333)
+    ..add(17334)
+    ..add(17335)
+    ..add(17336)
+    ..add(17337)
+    ..add(17338)
+    ..add(17339)
+    ..add(17340)
+    ..add(17341)
+    ..add(17342)
+    ..add(17343)
+    ..add(17344)
+    ..add(17345)
+    ..add(17346)
+    ..add(17347)
+    ..add(17348)
+    ..add(17349)
+    ..add(17350)
+    ..add(17351)
+    ..add(17352)
+    ..add(17353)
+    ..add(17354)
+    ..add(17355)
+    ..add(17356)
+    ..add(17357)
+    ..add(17358)
+    ..add(17359)
+    ..add(17360)
+    ..add(17361)
+    ..add(17362)
+    ..add(17363)
+    ..add(17364)
+    ..add(17365)
+    ..add(17366)
+    ..add(17367)
+    ..add(17368)
+    ..add(17369)
+    ..add(17370)
+    ..add(17371)
+    ..add(17372)
+    ..add(17373)
+    ..add(17374)
+    ..add(17375)
+    ..add(17376)
+    ..add(17377)
+    ..add(17378)
+    ..add(17379)
+    ..add(17380)
+    ..add(17381)
+    ..add(17382)
+    ..add(17383)
+    ..add(17384)
+    ..add(17385)
+    ..add(17386)
+    ..add(17387)
+    ..add(17388)
+    ..add(17389)
+    ..add(17390)
+    ..add(17391)
+    ..add(17392)
+    ..add(17393)
+    ..add(17394)
+    ..add(17395)
+    ..add(17396)
+    ..add(17397)
+    ..add(17398)
+    ..add(17399)
+    ..add(17400)
+    ..add(17401)
+    ..add(17402)
+    ..add(17403)
+    ..add(17404)
+    ..add(17405)
+    ..add(17406)
+    ..add(17407)
+    ..add(17408)
+    ..add(17409)
+    ..add(17410)
+    ..add(17411)
+    ..add(17412)
+    ..add(17413)
+    ..add(17414)
+    ..add(17415)
+    ..add(17416)
+    ..add(17417)
+    ..add(17418)
+    ..add(17419)
+    ..add(17420)
+    ..add(17421)
+    ..add(17422)
+    ..add(17423)
+    ..add(17424)
+    ..add(17425)
+    ..add(17426)
+    ..add(17427)
+    ..add(17428)
+    ..add(17429)
+    ..add(17430)
+    ..add(17431)
+    ..add(17432)
+    ..add(17433)
+    ..add(17434)
+    ..add(17435)
+    ..add(17436)
+    ..add(17437)
+    ..add(17438)
+    ..add(17439)
+    ..add(17440)
+    ..add(17441)
+    ..add(17442)
+    ..add(17443)
+    ..add(17444)
+    ..add(17445)
+    ..add(17446)
+    ..add(17447)
+    ..add(17448)
+    ..add(17449)
+    ..add(17450)
+    ..add(17451)
+    ..add(17452)
+    ..add(17453)
+    ..add(17454)
+    ..add(17455)
+    ..add(17456)
+    ..add(17457)
+    ..add(17458)
+    ..add(17459)
+    ..add(17460)
+    ..add(17461)
+    ..add(17462)
+    ..add(17463)
+    ..add(17464)
+    ..add(17465)
+    ..add(17466)
+    ..add(17467)
+    ..add(17468)
+    ..add(17469)
+    ..add(17470)
+    ..add(17471)
+    ..add(17472)
+    ..add(17473)
+    ..add(17474)
+    ..add(17475)
+    ..add(17476)
+    ..add(17477)
+    ..add(17478)
+    ..add(17479)
+    ..add(17480)
+    ..add(17481)
+    ..add(17482)
+    ..add(17483)
+    ..add(17484)
+    ..add(17485)
+    ..add(17486)
+    ..add(17487)
+    ..add(17488)
+    ..add(17489)
+    ..add(17490)
+    ..add(17491)
+    ..add(17492)
+    ..add(17493)
+    ..add(17494)
+    ..add(17495)
+    ..add(17496)
+    ..add(17497)
+    ..add(17498)
+    ..add(17499)
+    ..add(17500)
+    ..add(17501)
+    ..add(17502)
+    ..add(17503)
+    ..add(17504)
+    ..add(17505)
+    ..add(17506)
+    ..add(17507)
+    ..add(17508)
+    ..add(17509)
+    ..add(17510)
+    ..add(17511)
+    ..add(17512)
+    ..add(17513)
+    ..add(17514)
+    ..add(17515)
+    ..add(17516)
+    ..add(17517)
+    ..add(17518)
+    ..add(17519)
+    ..add(17520)
+    ..add(17521)
+    ..add(17522)
+    ..add(17523)
+    ..add(17524)
+    ..add(17525)
+    ..add(17526)
+    ..add(17527)
+    ..add(17528)
+    ..add(17529)
+    ..add(17530)
+    ..add(17531)
+    ..add(17532)
+    ..add(17533)
+    ..add(17534)
+    ..add(17535)
+    ..add(17536)
+    ..add(17537)
+    ..add(17538)
+    ..add(17539)
+    ..add(17540)
+    ..add(17541)
+    ..add(17542)
+    ..add(17543)
+    ..add(17544)
+    ..add(17545)
+    ..add(17546)
+    ..add(17547)
+    ..add(17548)
+    ..add(17549)
+    ..add(17550)
+    ..add(17551)
+    ..add(17552)
+    ..add(17553)
+    ..add(17554)
+    ..add(17555)
+    ..add(17556)
+    ..add(17557)
+    ..add(17558)
+    ..add(17559)
+    ..add(17560)
+    ..add(17561)
+    ..add(17562)
+    ..add(17563)
+    ..add(17564)
+    ..add(17565)
+    ..add(17566)
+    ..add(17567)
+    ..add(17568)
+    ..add(17569)
+    ..add(17570)
+    ..add(17571)
+    ..add(17572)
+    ..add(17573)
+    ..add(17574)
+    ..add(17575)
+    ..add(17576)
+    ..add(17577)
+    ..add(17578)
+    ..add(17579)
+    ..add(17580)
+    ..add(17581)
+    ..add(17582)
+    ..add(17583)
+    ..add(17584)
+    ..add(17585)
+    ..add(17586)
+    ..add(17587)
+    ..add(17588)
+    ..add(17589)
+    ..add(17590)
+    ..add(17591)
+    ..add(17592)
+    ..add(17593)
+    ..add(17594)
+    ..add(17595)
+    ..add(17596)
+    ..add(17597)
+    ..add(17598)
+    ..add(17599)
+    ..add(17600)
+    ..add(17601)
+    ..add(17602)
+    ..add(17603)
+    ..add(17604)
+    ..add(17605)
+    ..add(17606)
+    ..add(17607)
+    ..add(17608)
+    ..add(17609)
+    ..add(17610)
+    ..add(17611)
+    ..add(17612)
+    ..add(17613)
+    ..add(17614)
+    ..add(17615)
+    ..add(17616)
+    ..add(17617)
+    ..add(17618)
+    ..add(17619)
+    ..add(17620)
+    ..add(17621)
+    ..add(17622)
+    ..add(17623)
+    ..add(17624)
+    ..add(17625)
+    ..add(17626)
+    ..add(17627)
+    ..add(17628)
+    ..add(17629)
+    ..add(17630)
+    ..add(17631)
+    ..add(17632)
+    ..add(17633)
+    ..add(17634)
+    ..add(17635)
+    ..add(17636)
+    ..add(17637)
+    ..add(17638)
+    ..add(17639)
+    ..add(17640)
+    ..add(17641)
+    ..add(17642)
+    ..add(17643)
+    ..add(17644)
+    ..add(17645)
+    ..add(17646)
+    ..add(17647)
+    ..add(17648)
+    ..add(17649)
+    ..add(17650)
+    ..add(17651)
+    ..add(17652)
+    ..add(17653)
+    ..add(17654)
+    ..add(17655)
+    ..add(17656)
+    ..add(17657)
+    ..add(17658)
+    ..add(17659)
+    ..add(17660)
+    ..add(17661)
+    ..add(17662)
+    ..add(17663)
+    ..add(17664)
+    ..add(17665)
+    ..add(17666)
+    ..add(17667)
+    ..add(17668)
+    ..add(17669)
+    ..add(17670)
+    ..add(17671)
+    ..add(17672)
+    ..add(17673)
+    ..add(17674)
+    ..add(17675)
+    ..add(17676)
+    ..add(17677)
+    ..add(17678)
+    ..add(17679)
+    ..add(17680)
+    ..add(17681)
+    ..add(17682)
+    ..add(17683)
+    ..add(17684)
+    ..add(17685)
+    ..add(17686)
+    ..add(17687)
+    ..add(17688)
+    ..add(17689)
+    ..add(17690)
+    ..add(17691)
+    ..add(17692)
+    ..add(17693)
+    ..add(17694)
+    ..add(17695)
+    ..add(17696)
+    ..add(17697)
+    ..add(17698)
+    ..add(17699)
+    ..add(17700)
+    ..add(17701)
+    ..add(17702)
+    ..add(17703)
+    ..add(17704)
+    ..add(17705)
+    ..add(17706)
+    ..add(17707)
+    ..add(17708)
+    ..add(17709)
+    ..add(17710)
+    ..add(17711)
+    ..add(17712)
+    ..add(17713)
+    ..add(17714)
+    ..add(17715)
+    ..add(17716)
+    ..add(17717)
+    ..add(17718)
+    ..add(17719)
+    ..add(17720)
+    ..add(17721)
+    ..add(17722)
+    ..add(17723)
+    ..add(17724)
+    ..add(17725)
+    ..add(17726)
+    ..add(17727)
+    ..add(17728)
+    ..add(17729)
+    ..add(17730)
+    ..add(17731)
+    ..add(17732)
+    ..add(17733)
+    ..add(17734)
+    ..add(17735)
+    ..add(17736)
+    ..add(17737)
+    ..add(17738)
+    ..add(17739)
+    ..add(17740)
+    ..add(17741)
+    ..add(17742)
+    ..add(17743)
+    ..add(17744)
+    ..add(17745)
+    ..add(17746)
+    ..add(17747)
+    ..add(17748)
+    ..add(17749)
+    ..add(17750)
+    ..add(17751)
+    ..add(17752)
+    ..add(17753)
+    ..add(17754)
+    ..add(17755)
+    ..add(17756)
+    ..add(17757)
+    ..add(17758)
+    ..add(17759)
+    ..add(17760)
+    ..add(17761)
+    ..add(17762)
+    ..add(17763)
+    ..add(17764)
+    ..add(17765)
+    ..add(17766)
+    ..add(17767)
+    ..add(17768)
+    ..add(17769)
+    ..add(17770)
+    ..add(17771)
+    ..add(17772)
+    ..add(17773)
+    ..add(17774)
+    ..add(17775)
+    ..add(17776)
+    ..add(17777)
+    ..add(17778)
+    ..add(17779)
+    ..add(17780)
+    ..add(17781)
+    ..add(17782)
+    ..add(17783)
+    ..add(17784)
+    ..add(17785)
+    ..add(17786)
+    ..add(17787)
+    ..add(17788)
+    ..add(17789)
+    ..add(17790)
+    ..add(17791)
+    ..add(17792)
+    ..add(17793)
+    ..add(17794)
+    ..add(17795)
+    ..add(17796)
+    ..add(17797)
+    ..add(17798)
+    ..add(17799)
+    ..add(17800)
+    ..add(17801)
+    ..add(17802)
+    ..add(17803)
+    ..add(17804)
+    ..add(17805)
+    ..add(17806)
+    ..add(17807)
+    ..add(17808)
+    ..add(17809)
+    ..add(17810)
+    ..add(17811)
+    ..add(17812)
+    ..add(17813)
+    ..add(17814)
+    ..add(17815)
+    ..add(17816)
+    ..add(17817)
+    ..add(17818)
+    ..add(17819)
+    ..add(17820)
+    ..add(17821)
+    ..add(17822)
+    ..add(17823)
+    ..add(17824)
+    ..add(17825)
+    ..add(17826)
+    ..add(17827)
+    ..add(17828)
+    ..add(17829)
+    ..add(17830)
+    ..add(17831)
+    ..add(17832)
+    ..add(17833)
+    ..add(17834)
+    ..add(17835)
+    ..add(17836)
+    ..add(17837)
+    ..add(17838)
+    ..add(17839)
+    ..add(17840)
+    ..add(17841)
+    ..add(17842)
+    ..add(17843)
+    ..add(17844)
+    ..add(17845)
+    ..add(17846)
+    ..add(17847)
+    ..add(17848)
+    ..add(17849)
+    ..add(17850)
+    ..add(17851)
+    ..add(17852)
+    ..add(17853)
+    ..add(17854)
+    ..add(17855)
+    ..add(17856)
+    ..add(17857)
+    ..add(17858)
+    ..add(17859)
+    ..add(17860)
+    ..add(17861)
+    ..add(17862)
+    ..add(17863)
+    ..add(17864)
+    ..add(17865)
+    ..add(17866)
+    ..add(17867)
+    ..add(17868)
+    ..add(17869)
+    ..add(17870)
+    ..add(17871)
+    ..add(17872)
+    ..add(17873)
+    ..add(17874)
+    ..add(17875)
+    ..add(17876)
+    ..add(17877)
+    ..add(17878)
+    ..add(17879)
+    ..add(17880)
+    ..add(17881)
+    ..add(17882)
+    ..add(17883)
+    ..add(17884)
+    ..add(17885)
+    ..add(17886)
+    ..add(17887)
+    ..add(17888)
+    ..add(17889)
+    ..add(17890)
+    ..add(17891)
+    ..add(17892)
+    ..add(17893)
+    ..add(17894)
+    ..add(17895)
+    ..add(17896)
+    ..add(17897)
+    ..add(17898)
+    ..add(17899)
+    ..add(17900)
+    ..add(17901)
+    ..add(17902)
+    ..add(17903)
+    ..add(17904)
+    ..add(17905)
+    ..add(17906)
+    ..add(17907)
+    ..add(17908)
+    ..add(17909)
+    ..add(17910)
+    ..add(17911)
+    ..add(17912)
+    ..add(17913)
+    ..add(17914)
+    ..add(17915)
+    ..add(17916)
+    ..add(17917)
+    ..add(17918)
+    ..add(17919)
+    ..add(17920)
+    ..add(17921)
+    ..add(17922)
+    ..add(17923)
+    ..add(17924)
+    ..add(17925)
+    ..add(17926)
+    ..add(17927)
+    ..add(17928)
+    ..add(17929)
+    ..add(17930)
+    ..add(17931)
+    ..add(17932)
+    ..add(17933)
+    ..add(17934)
+    ..add(17935)
+    ..add(17936)
+    ..add(17937)
+    ..add(17938)
+    ..add(17939)
+    ..add(17940)
+    ..add(17941)
+    ..add(17942)
+    ..add(17943)
+    ..add(17944)
+    ..add(17945)
+    ..add(17946)
+    ..add(17947)
+    ..add(17948)
+    ..add(17949)
+    ..add(17950)
+    ..add(17951)
+    ..add(17952)
+    ..add(17953)
+    ..add(17954)
+    ..add(17955)
+    ..add(17956)
+    ..add(17957)
+    ..add(17958)
+    ..add(17959)
+    ..add(17960)
+    ..add(17961)
+    ..add(17962)
+    ..add(17963)
+    ..add(17964)
+    ..add(17965)
+    ..add(17966)
+    ..add(17967)
+    ..add(17968)
+    ..add(17969)
+    ..add(17970)
+    ..add(17971)
+    ..add(17972)
+    ..add(17973)
+    ..add(17974)
+    ..add(17975)
+    ..add(17976)
+    ..add(17977)
+    ..add(17978)
+    ..add(17979)
+    ..add(17980)
+    ..add(17981)
+    ..add(17982)
+    ..add(17983)
+    ..add(17984)
+    ..add(17985)
+    ..add(17986)
+    ..add(17987)
+    ..add(17988)
+    ..add(17989)
+    ..add(17990)
+    ..add(17991)
+    ..add(17992)
+    ..add(17993)
+    ..add(17994)
+    ..add(17995)
+    ..add(17996)
+    ..add(17997)
+    ..add(17998)
+    ..add(17999)
+    ..add(18000)
+    ..add(18001)
+    ..add(18002)
+    ..add(18003)
+    ..add(18004)
+    ..add(18005)
+    ..add(18006)
+    ..add(18007)
+    ..add(18008)
+    ..add(18009)
+    ..add(18010)
+    ..add(18011)
+    ..add(18012)
+    ..add(18013)
+    ..add(18014)
+    ..add(18015)
+    ..add(18016)
+    ..add(18017)
+    ..add(18018)
+    ..add(18019)
+    ..add(18020)
+    ..add(18021)
+    ..add(18022)
+    ..add(18023)
+    ..add(18024)
+    ..add(18025)
+    ..add(18026)
+    ..add(18027)
+    ..add(18028)
+    ..add(18029)
+    ..add(18030)
+    ..add(18031)
+    ..add(18032)
+    ..add(18033)
+    ..add(18034)
+    ..add(18035)
+    ..add(18036)
+    ..add(18037)
+    ..add(18038)
+    ..add(18039)
+    ..add(18040)
+    ..add(18041)
+    ..add(18042)
+    ..add(18043)
+    ..add(18044)
+    ..add(18045)
+    ..add(18046)
+    ..add(18047)
+    ..add(18048)
+    ..add(18049)
+    ..add(18050)
+    ..add(18051)
+    ..add(18052)
+    ..add(18053)
+    ..add(18054)
+    ..add(18055)
+    ..add(18056)
+    ..add(18057)
+    ..add(18058)
+    ..add(18059)
+    ..add(18060)
+    ..add(18061)
+    ..add(18062)
+    ..add(18063)
+    ..add(18064)
+    ..add(18065)
+    ..add(18066)
+    ..add(18067)
+    ..add(18068)
+    ..add(18069)
+    ..add(18070)
+    ..add(18071)
+    ..add(18072)
+    ..add(18073)
+    ..add(18074)
+    ..add(18075)
+    ..add(18076)
+    ..add(18077)
+    ..add(18078)
+    ..add(18079)
+    ..add(18080)
+    ..add(18081)
+    ..add(18082)
+    ..add(18083)
+    ..add(18084)
+    ..add(18085)
+    ..add(18086)
+    ..add(18087)
+    ..add(18088)
+    ..add(18089)
+    ..add(18090)
+    ..add(18091)
+    ..add(18092)
+    ..add(18093)
+    ..add(18094)
+    ..add(18095)
+    ..add(18096)
+    ..add(18097)
+    ..add(18098)
+    ..add(18099)
+    ..add(18100)
+    ..add(18101)
+    ..add(18102)
+    ..add(18103)
+    ..add(18104)
+    ..add(18105)
+    ..add(18106)
+    ..add(18107)
+    ..add(18108)
+    ..add(18109)
+    ..add(18110)
+    ..add(18111)
+    ..add(18112)
+    ..add(18113)
+    ..add(18114)
+    ..add(18115)
+    ..add(18116)
+    ..add(18117)
+    ..add(18118)
+    ..add(18119)
+    ..add(18120)
+    ..add(18121)
+    ..add(18122)
+    ..add(18123)
+    ..add(18124)
+    ..add(18125)
+    ..add(18126)
+    ..add(18127)
+    ..add(18128)
+    ..add(18129)
+    ..add(18130)
+    ..add(18131)
+    ..add(18132)
+    ..add(18133)
+    ..add(18134)
+    ..add(18135)
+    ..add(18136)
+    ..add(18137)
+    ..add(18138)
+    ..add(18139)
+    ..add(18140)
+    ..add(18141)
+    ..add(18142)
+    ..add(18143)
+    ..add(18144)
+    ..add(18145)
+    ..add(18146)
+    ..add(18147)
+    ..add(18148)
+    ..add(18149)
+    ..add(18150)
+    ..add(18151)
+    ..add(18152)
+    ..add(18153)
+    ..add(18154)
+    ..add(18155)
+    ..add(18156)
+    ..add(18157)
+    ..add(18158)
+    ..add(18159)
+    ..add(18160)
+    ..add(18161)
+    ..add(18162)
+    ..add(18163)
+    ..add(18164)
+    ..add(18165)
+    ..add(18166)
+    ..add(18167)
+    ..add(18168)
+    ..add(18169)
+    ..add(18170)
+    ..add(18171)
+    ..add(18172)
+    ..add(18173)
+    ..add(18174)
+    ..add(18175)
+    ..add(18176)
+    ..add(18177)
+    ..add(18178)
+    ..add(18179)
+    ..add(18180)
+    ..add(18181)
+    ..add(18182)
+    ..add(18183)
+    ..add(18184)
+    ..add(18185)
+    ..add(18186)
+    ..add(18187)
+    ..add(18188)
+    ..add(18189)
+    ..add(18190)
+    ..add(18191)
+    ..add(18192)
+    ..add(18193)
+    ..add(18194)
+    ..add(18195)
+    ..add(18196)
+    ..add(18197)
+    ..add(18198)
+    ..add(18199)
+    ..add(18200)
+    ..add(18201)
+    ..add(18202)
+    ..add(18203)
+    ..add(18204)
+    ..add(18205)
+    ..add(18206)
+    ..add(18207)
+    ..add(18208)
+    ..add(18209)
+    ..add(18210)
+    ..add(18211)
+    ..add(18212)
+    ..add(18213)
+    ..add(18214)
+    ..add(18215)
+    ..add(18216)
+    ..add(18217)
+    ..add(18218)
+    ..add(18219)
+    ..add(18220)
+    ..add(18221)
+    ..add(18222)
+    ..add(18223)
+    ..add(18224)
+    ..add(18225)
+    ..add(18226)
+    ..add(18227)
+    ..add(18228)
+    ..add(18229)
+    ..add(18230)
+    ..add(18231)
+    ..add(18232)
+    ..add(18233)
+    ..add(18234)
+    ..add(18235)
+    ..add(18236)
+    ..add(18237)
+    ..add(18238)
+    ..add(18239)
+    ..add(18240)
+    ..add(18241)
+    ..add(18242)
+    ..add(18243)
+    ..add(18244)
+    ..add(18245)
+    ..add(18246)
+    ..add(18247)
+    ..add(18248)
+    ..add(18249)
+    ..add(18250)
+    ..add(18251)
+    ..add(18252)
+    ..add(18253)
+    ..add(18254)
+    ..add(18255)
+    ..add(18256)
+    ..add(18257)
+    ..add(18258)
+    ..add(18259)
+    ..add(18260)
+    ..add(18261)
+    ..add(18262)
+    ..add(18263)
+    ..add(18264)
+    ..add(18265)
+    ..add(18266)
+    ..add(18267)
+    ..add(18268)
+    ..add(18269)
+    ..add(18270)
+    ..add(18271)
+    ..add(18272)
+    ..add(18273)
+    ..add(18274)
+    ..add(18275)
+    ..add(18276)
+    ..add(18277)
+    ..add(18278)
+    ..add(18279)
+    ..add(18280)
+    ..add(18281)
+    ..add(18282)
+    ..add(18283)
+    ..add(18284)
+    ..add(18285)
+    ..add(18286)
+    ..add(18287)
+    ..add(18288)
+    ..add(18289)
+    ..add(18290)
+    ..add(18291)
+    ..add(18292)
+    ..add(18293)
+    ..add(18294)
+    ..add(18295)
+    ..add(18296)
+    ..add(18297)
+    ..add(18298)
+    ..add(18299)
+    ..add(18300)
+    ..add(18301)
+    ..add(18302)
+    ..add(18303)
+    ..add(18304)
+    ..add(18305)
+    ..add(18306)
+    ..add(18307)
+    ..add(18308)
+    ..add(18309)
+    ..add(18310)
+    ..add(18311)
+    ..add(18312)
+    ..add(18313)
+    ..add(18314)
+    ..add(18315)
+    ..add(18316)
+    ..add(18317)
+    ..add(18318)
+    ..add(18319)
+    ..add(18320)
+    ..add(18321)
+    ..add(18322)
+    ..add(18323)
+    ..add(18324)
+    ..add(18325)
+    ..add(18326)
+    ..add(18327)
+    ..add(18328)
+    ..add(18329)
+    ..add(18330)
+    ..add(18331)
+    ..add(18332)
+    ..add(18333)
+    ..add(18334)
+    ..add(18335)
+    ..add(18336)
+    ..add(18337)
+    ..add(18338)
+    ..add(18339)
+    ..add(18340)
+    ..add(18341)
+    ..add(18342)
+    ..add(18343)
+    ..add(18344)
+    ..add(18345)
+    ..add(18346)
+    ..add(18347)
+    ..add(18348)
+    ..add(18349)
+    ..add(18350)
+    ..add(18351)
+    ..add(18352)
+    ..add(18353)
+    ..add(18354)
+    ..add(18355)
+    ..add(18356)
+    ..add(18357)
+    ..add(18358)
+    ..add(18359)
+    ..add(18360)
+    ..add(18361)
+    ..add(18362)
+    ..add(18363)
+    ..add(18364)
+    ..add(18365)
+    ..add(18366)
+    ..add(18367)
+    ..add(18368)
+    ..add(18369)
+    ..add(18370)
+    ..add(18371)
+    ..add(18372)
+    ..add(18373)
+    ..add(18374)
+    ..add(18375)
+    ..add(18376)
+    ..add(18377)
+    ..add(18378)
+    ..add(18379)
+    ..add(18380)
+    ..add(18381)
+    ..add(18382)
+    ..add(18383)
+    ..add(18384)
+    ..add(18385)
+    ..add(18386)
+    ..add(18387)
+    ..add(18388)
+    ..add(18389)
+    ..add(18390)
+    ..add(18391)
+    ..add(18392)
+    ..add(18393)
+    ..add(18394)
+    ..add(18395)
+    ..add(18396)
+    ..add(18397)
+    ..add(18398)
+    ..add(18399)
+    ..add(18400)
+    ..add(18401)
+    ..add(18402)
+    ..add(18403)
+    ..add(18404)
+    ..add(18405)
+    ..add(18406)
+    ..add(18407)
+    ..add(18408)
+    ..add(18409)
+    ..add(18410)
+    ..add(18411)
+    ..add(18412)
+    ..add(18413)
+    ..add(18414)
+    ..add(18415)
+    ..add(18416)
+    ..add(18417)
+    ..add(18418)
+    ..add(18419)
+    ..add(18420)
+    ..add(18421)
+    ..add(18422)
+    ..add(18423)
+    ..add(18424)
+    ..add(18425)
+    ..add(18426)
+    ..add(18427)
+    ..add(18428)
+    ..add(18429)
+    ..add(18430)
+    ..add(18431)
+    ..add(18432)
+    ..add(18433)
+    ..add(18434)
+    ..add(18435)
+    ..add(18436)
+    ..add(18437)
+    ..add(18438)
+    ..add(18439)
+    ..add(18440)
+    ..add(18441)
+    ..add(18442)
+    ..add(18443)
+    ..add(18444)
+    ..add(18445)
+    ..add(18446)
+    ..add(18447)
+    ..add(18448)
+    ..add(18449)
+    ..add(18450)
+    ..add(18451)
+    ..add(18452)
+    ..add(18453)
+    ..add(18454)
+    ..add(18455)
+    ..add(18456)
+    ..add(18457)
+    ..add(18458)
+    ..add(18459)
+    ..add(18460)
+    ..add(18461)
+    ..add(18462)
+    ..add(18463)
+    ..add(18464)
+    ..add(18465)
+    ..add(18466)
+    ..add(18467)
+    ..add(18468)
+    ..add(18469)
+    ..add(18470)
+    ..add(18471)
+    ..add(18472)
+    ..add(18473)
+    ..add(18474)
+    ..add(18475)
+    ..add(18476)
+    ..add(18477)
+    ..add(18478)
+    ..add(18479)
+    ..add(18480)
+    ..add(18481)
+    ..add(18482)
+    ..add(18483)
+    ..add(18484)
+    ..add(18485)
+    ..add(18486)
+    ..add(18487)
+    ..add(18488)
+    ..add(18489)
+    ..add(18490)
+    ..add(18491)
+    ..add(18492)
+    ..add(18493)
+    ..add(18494)
+    ..add(18495)
+    ..add(18496)
+    ..add(18497)
+    ..add(18498)
+    ..add(18499)
+    ..add(18500)
+    ..add(18501)
+    ..add(18502)
+    ..add(18503)
+    ..add(18504)
+    ..add(18505)
+    ..add(18506)
+    ..add(18507)
+    ..add(18508)
+    ..add(18509)
+    ..add(18510)
+    ..add(18511)
+    ..add(18512)
+    ..add(18513)
+    ..add(18514)
+    ..add(18515)
+    ..add(18516)
+    ..add(18517)
+    ..add(18518)
+    ..add(18519)
+    ..add(18520)
+    ..add(18521)
+    ..add(18522)
+    ..add(18523)
+    ..add(18524)
+    ..add(18525)
+    ..add(18526)
+    ..add(18527)
+    ..add(18528)
+    ..add(18529)
+    ..add(18530)
+    ..add(18531)
+    ..add(18532)
+    ..add(18533)
+    ..add(18534)
+    ..add(18535)
+    ..add(18536)
+    ..add(18537)
+    ..add(18538)
+    ..add(18539)
+    ..add(18540)
+    ..add(18541)
+    ..add(18542)
+    ..add(18543)
+    ..add(18544)
+    ..add(18545)
+    ..add(18546)
+    ..add(18547)
+    ..add(18548)
+    ..add(18549)
+    ..add(18550)
+    ..add(18551)
+    ..add(18552)
+    ..add(18553)
+    ..add(18554)
+    ..add(18555)
+    ..add(18556)
+    ..add(18557)
+    ..add(18558)
+    ..add(18559)
+    ..add(18560)
+    ..add(18561)
+    ..add(18562)
+    ..add(18563)
+    ..add(18564)
+    ..add(18565)
+    ..add(18566)
+    ..add(18567)
+    ..add(18568)
+    ..add(18569)
+    ..add(18570)
+    ..add(18571)
+    ..add(18572)
+    ..add(18573)
+    ..add(18574)
+    ..add(18575)
+    ..add(18576)
+    ..add(18577)
+    ..add(18578)
+    ..add(18579)
+    ..add(18580)
+    ..add(18581)
+    ..add(18582)
+    ..add(18583)
+    ..add(18584)
+    ..add(18585)
+    ..add(18586)
+    ..add(18587)
+    ..add(18588)
+    ..add(18589)
+    ..add(18590)
+    ..add(18591)
+    ..add(18592)
+    ..add(18593)
+    ..add(18594)
+    ..add(18595)
+    ..add(18596)
+    ..add(18597)
+    ..add(18598)
+    ..add(18599)
+    ..add(18600)
+    ..add(18601)
+    ..add(18602)
+    ..add(18603)
+    ..add(18604)
+    ..add(18605)
+    ..add(18606)
+    ..add(18607)
+    ..add(18608)
+    ..add(18609)
+    ..add(18610)
+    ..add(18611)
+    ..add(18612)
+    ..add(18613)
+    ..add(18614)
+    ..add(18615)
+    ..add(18616)
+    ..add(18617)
+    ..add(18618)
+    ..add(18619)
+    ..add(18620)
+    ..add(18621)
+    ..add(18622)
+    ..add(18623)
+    ..add(18624)
+    ..add(18625)
+    ..add(18626)
+    ..add(18627)
+    ..add(18628)
+    ..add(18629)
+    ..add(18630)
+    ..add(18631)
+    ..add(18632)
+    ..add(18633)
+    ..add(18634)
+    ..add(18635)
+    ..add(18636)
+    ..add(18637)
+    ..add(18638)
+    ..add(18639)
+    ..add(18640)
+    ..add(18641)
+    ..add(18642)
+    ..add(18643)
+    ..add(18644)
+    ..add(18645)
+    ..add(18646)
+    ..add(18647)
+    ..add(18648)
+    ..add(18649)
+    ..add(18650)
+    ..add(18651)
+    ..add(18652)
+    ..add(18653)
+    ..add(18654)
+    ..add(18655)
+    ..add(18656)
+    ..add(18657)
+    ..add(18658)
+    ..add(18659)
+    ..add(18660)
+    ..add(18661)
+    ..add(18662)
+    ..add(18663)
+    ..add(18664)
+    ..add(18665)
+    ..add(18666)
+    ..add(18667)
+    ..add(18668)
+    ..add(18669)
+    ..add(18670)
+    ..add(18671)
+    ..add(18672)
+    ..add(18673)
+    ..add(18674)
+    ..add(18675)
+    ..add(18676)
+    ..add(18677)
+    ..add(18678)
+    ..add(18679)
+    ..add(18680)
+    ..add(18681)
+    ..add(18682)
+    ..add(18683)
+    ..add(18684)
+    ..add(18685)
+    ..add(18686)
+    ..add(18687)
+    ..add(18688)
+    ..add(18689)
+    ..add(18690)
+    ..add(18691)
+    ..add(18692)
+    ..add(18693)
+    ..add(18694)
+    ..add(18695)
+    ..add(18696)
+    ..add(18697)
+    ..add(18698)
+    ..add(18699)
+    ..add(18700)
+    ..add(18701)
+    ..add(18702)
+    ..add(18703)
+    ..add(18704)
+    ..add(18705)
+    ..add(18706)
+    ..add(18707)
+    ..add(18708)
+    ..add(18709)
+    ..add(18710)
+    ..add(18711)
+    ..add(18712)
+    ..add(18713)
+    ..add(18714)
+    ..add(18715)
+    ..add(18716)
+    ..add(18717)
+    ..add(18718)
+    ..add(18719)
+    ..add(18720)
+    ..add(18721)
+    ..add(18722)
+    ..add(18723)
+    ..add(18724)
+    ..add(18725)
+    ..add(18726)
+    ..add(18727)
+    ..add(18728)
+    ..add(18729)
+    ..add(18730)
+    ..add(18731)
+    ..add(18732)
+    ..add(18733)
+    ..add(18734)
+    ..add(18735)
+    ..add(18736)
+    ..add(18737)
+    ..add(18738)
+    ..add(18739)
+    ..add(18740)
+    ..add(18741)
+    ..add(18742)
+    ..add(18743)
+    ..add(18744)
+    ..add(18745)
+    ..add(18746)
+    ..add(18747)
+    ..add(18748)
+    ..add(18749)
+    ..add(18750)
+    ..add(18751)
+    ..add(18752)
+    ..add(18753)
+    ..add(18754)
+    ..add(18755)
+    ..add(18756)
+    ..add(18757)
+    ..add(18758)
+    ..add(18759)
+    ..add(18760)
+    ..add(18761)
+    ..add(18762)
+    ..add(18763)
+    ..add(18764)
+    ..add(18765)
+    ..add(18766)
+    ..add(18767)
+    ..add(18768)
+    ..add(18769)
+    ..add(18770)
+    ..add(18771)
+    ..add(18772)
+    ..add(18773)
+    ..add(18774)
+    ..add(18775)
+    ..add(18776)
+    ..add(18777)
+    ..add(18778)
+    ..add(18779)
+    ..add(18780)
+    ..add(18781)
+    ..add(18782)
+    ..add(18783)
+    ..add(18784)
+    ..add(18785)
+    ..add(18786)
+    ..add(18787)
+    ..add(18788)
+    ..add(18789)
+    ..add(18790)
+    ..add(18791)
+    ..add(18792)
+    ..add(18793)
+    ..add(18794)
+    ..add(18795)
+    ..add(18796)
+    ..add(18797)
+    ..add(18798)
+    ..add(18799)
+    ..add(18800)
+    ..add(18801)
+    ..add(18802)
+    ..add(18803)
+    ..add(18804)
+    ..add(18805)
+    ..add(18806)
+    ..add(18807)
+    ..add(18808)
+    ..add(18809)
+    ..add(18810)
+    ..add(18811)
+    ..add(18812)
+    ..add(18813)
+    ..add(18814)
+    ..add(18815)
+    ..add(18816)
+    ..add(18817)
+    ..add(18818)
+    ..add(18819)
+    ..add(18820)
+    ..add(18821)
+    ..add(18822)
+    ..add(18823)
+    ..add(18824)
+    ..add(18825)
+    ..add(18826)
+    ..add(18827)
+    ..add(18828)
+    ..add(18829)
+    ..add(18830)
+    ..add(18831)
+    ..add(18832)
+    ..add(18833)
+    ..add(18834)
+    ..add(18835)
+    ..add(18836)
+    ..add(18837)
+    ..add(18838)
+    ..add(18839)
+    ..add(18840)
+    ..add(18841)
+    ..add(18842)
+    ..add(18843)
+    ..add(18844)
+    ..add(18845)
+    ..add(18846)
+    ..add(18847)
+    ..add(18848)
+    ..add(18849)
+    ..add(18850)
+    ..add(18851)
+    ..add(18852)
+    ..add(18853)
+    ..add(18854)
+    ..add(18855)
+    ..add(18856)
+    ..add(18857)
+    ..add(18858)
+    ..add(18859)
+    ..add(18860)
+    ..add(18861)
+    ..add(18862)
+    ..add(18863)
+    ..add(18864)
+    ..add(18865)
+    ..add(18866)
+    ..add(18867)
+    ..add(18868)
+    ..add(18869)
+    ..add(18870)
+    ..add(18871)
+    ..add(18872)
+    ..add(18873)
+    ..add(18874)
+    ..add(18875)
+    ..add(18876)
+    ..add(18877)
+    ..add(18878)
+    ..add(18879)
+    ..add(18880)
+    ..add(18881)
+    ..add(18882)
+    ..add(18883)
+    ..add(18884)
+    ..add(18885)
+    ..add(18886)
+    ..add(18887)
+    ..add(18888)
+    ..add(18889)
+    ..add(18890)
+    ..add(18891)
+    ..add(18892)
+    ..add(18893)
+    ..add(18894)
+    ..add(18895)
+    ..add(18896)
+    ..add(18897)
+    ..add(18898)
+    ..add(18899)
+    ..add(18900)
+    ..add(18901)
+    ..add(18902)
+    ..add(18903)
+    ..add(18904)
+    ..add(18905)
+    ..add(18906)
+    ..add(18907)
+    ..add(18908)
+    ..add(18909)
+    ..add(18910)
+    ..add(18911)
+    ..add(18912)
+    ..add(18913)
+    ..add(18914)
+    ..add(18915)
+    ..add(18916)
+    ..add(18917)
+    ..add(18918)
+    ..add(18919)
+    ..add(18920)
+    ..add(18921)
+    ..add(18922)
+    ..add(18923)
+    ..add(18924)
+    ..add(18925)
+    ..add(18926)
+    ..add(18927)
+    ..add(18928)
+    ..add(18929)
+    ..add(18930)
+    ..add(18931)
+    ..add(18932)
+    ..add(18933)
+    ..add(18934)
+    ..add(18935)
+    ..add(18936)
+    ..add(18937)
+    ..add(18938)
+    ..add(18939)
+    ..add(18940)
+    ..add(18941)
+    ..add(18942)
+    ..add(18943)
+    ..add(18944)
+    ..add(18945)
+    ..add(18946)
+    ..add(18947)
+    ..add(18948)
+    ..add(18949)
+    ..add(18950)
+    ..add(18951)
+    ..add(18952)
+    ..add(18953)
+    ..add(18954)
+    ..add(18955)
+    ..add(18956)
+    ..add(18957)
+    ..add(18958)
+    ..add(18959)
+    ..add(18960)
+    ..add(18961)
+    ..add(18962)
+    ..add(18963)
+    ..add(18964)
+    ..add(18965)
+    ..add(18966)
+    ..add(18967)
+    ..add(18968)
+    ..add(18969)
+    ..add(18970)
+    ..add(18971)
+    ..add(18972)
+    ..add(18973)
+    ..add(18974)
+    ..add(18975)
+    ..add(18976)
+    ..add(18977)
+    ..add(18978)
+    ..add(18979)
+    ..add(18980)
+    ..add(18981)
+    ..add(18982)
+    ..add(18983)
+    ..add(18984)
+    ..add(18985)
+    ..add(18986)
+    ..add(18987)
+    ..add(18988)
+    ..add(18989)
+    ..add(18990)
+    ..add(18991)
+    ..add(18992)
+    ..add(18993)
+    ..add(18994)
+    ..add(18995)
+    ..add(18996)
+    ..add(18997)
+    ..add(18998)
+    ..add(18999)
+    ..add(19000)
+    ..add(19001)
+    ..add(19002)
+    ..add(19003)
+    ..add(19004)
+    ..add(19005)
+    ..add(19006)
+    ..add(19007)
+    ..add(19008)
+    ..add(19009)
+    ..add(19010)
+    ..add(19011)
+    ..add(19012)
+    ..add(19013)
+    ..add(19014)
+    ..add(19015)
+    ..add(19016)
+    ..add(19017)
+    ..add(19018)
+    ..add(19019)
+    ..add(19020)
+    ..add(19021)
+    ..add(19022)
+    ..add(19023)
+    ..add(19024)
+    ..add(19025)
+    ..add(19026)
+    ..add(19027)
+    ..add(19028)
+    ..add(19029)
+    ..add(19030)
+    ..add(19031)
+    ..add(19032)
+    ..add(19033)
+    ..add(19034)
+    ..add(19035)
+    ..add(19036)
+    ..add(19037)
+    ..add(19038)
+    ..add(19039)
+    ..add(19040)
+    ..add(19041)
+    ..add(19042)
+    ..add(19043)
+    ..add(19044)
+    ..add(19045)
+    ..add(19046)
+    ..add(19047)
+    ..add(19048)
+    ..add(19049)
+    ..add(19050)
+    ..add(19051)
+    ..add(19052)
+    ..add(19053)
+    ..add(19054)
+    ..add(19055)
+    ..add(19056)
+    ..add(19057)
+    ..add(19058)
+    ..add(19059)
+    ..add(19060)
+    ..add(19061)
+    ..add(19062)
+    ..add(19063)
+    ..add(19064)
+    ..add(19065)
+    ..add(19066)
+    ..add(19067)
+    ..add(19068)
+    ..add(19069)
+    ..add(19070)
+    ..add(19071)
+    ..add(19072)
+    ..add(19073)
+    ..add(19074)
+    ..add(19075)
+    ..add(19076)
+    ..add(19077)
+    ..add(19078)
+    ..add(19079)
+    ..add(19080)
+    ..add(19081)
+    ..add(19082)
+    ..add(19083)
+    ..add(19084)
+    ..add(19085)
+    ..add(19086)
+    ..add(19087)
+    ..add(19088)
+    ..add(19089)
+    ..add(19090)
+    ..add(19091)
+    ..add(19092)
+    ..add(19093)
+    ..add(19094)
+    ..add(19095)
+    ..add(19096)
+    ..add(19097)
+    ..add(19098)
+    ..add(19099)
+    ..add(19100)
+    ..add(19101)
+    ..add(19102)
+    ..add(19103)
+    ..add(19104)
+    ..add(19105)
+    ..add(19106)
+    ..add(19107)
+    ..add(19108)
+    ..add(19109)
+    ..add(19110)
+    ..add(19111)
+    ..add(19112)
+    ..add(19113)
+    ..add(19114)
+    ..add(19115)
+    ..add(19116)
+    ..add(19117)
+    ..add(19118)
+    ..add(19119)
+    ..add(19120)
+    ..add(19121)
+    ..add(19122)
+    ..add(19123)
+    ..add(19124)
+    ..add(19125)
+    ..add(19126)
+    ..add(19127)
+    ..add(19128)
+    ..add(19129)
+    ..add(19130)
+    ..add(19131)
+    ..add(19132)
+    ..add(19133)
+    ..add(19134)
+    ..add(19135)
+    ..add(19136)
+    ..add(19137)
+    ..add(19138)
+    ..add(19139)
+    ..add(19140)
+    ..add(19141)
+    ..add(19142)
+    ..add(19143)
+    ..add(19144)
+    ..add(19145)
+    ..add(19146)
+    ..add(19147)
+    ..add(19148)
+    ..add(19149)
+    ..add(19150)
+    ..add(19151)
+    ..add(19152)
+    ..add(19153)
+    ..add(19154)
+    ..add(19155)
+    ..add(19156)
+    ..add(19157)
+    ..add(19158)
+    ..add(19159)
+    ..add(19160)
+    ..add(19161)
+    ..add(19162)
+    ..add(19163)
+    ..add(19164)
+    ..add(19165)
+    ..add(19166)
+    ..add(19167)
+    ..add(19168)
+    ..add(19169)
+    ..add(19170)
+    ..add(19171)
+    ..add(19172)
+    ..add(19173)
+    ..add(19174)
+    ..add(19175)
+    ..add(19176)
+    ..add(19177)
+    ..add(19178)
+    ..add(19179)
+    ..add(19180)
+    ..add(19181)
+    ..add(19182)
+    ..add(19183)
+    ..add(19184)
+    ..add(19185)
+    ..add(19186)
+    ..add(19187)
+    ..add(19188)
+    ..add(19189)
+    ..add(19190)
+    ..add(19191)
+    ..add(19192)
+    ..add(19193)
+    ..add(19194)
+    ..add(19195)
+    ..add(19196)
+    ..add(19197)
+    ..add(19198)
+    ..add(19199)
+    ..add(19200)
+    ..add(19201)
+    ..add(19202)
+    ..add(19203)
+    ..add(19204)
+    ..add(19205)
+    ..add(19206)
+    ..add(19207)
+    ..add(19208)
+    ..add(19209)
+    ..add(19210)
+    ..add(19211)
+    ..add(19212)
+    ..add(19213)
+    ..add(19214)
+    ..add(19215)
+    ..add(19216)
+    ..add(19217)
+    ..add(19218)
+    ..add(19219)
+    ..add(19220)
+    ..add(19221)
+    ..add(19222)
+    ..add(19223)
+    ..add(19224)
+    ..add(19225)
+    ..add(19226)
+    ..add(19227)
+    ..add(19228)
+    ..add(19229)
+    ..add(19230)
+    ..add(19231)
+    ..add(19232)
+    ..add(19233)
+    ..add(19234)
+    ..add(19235)
+    ..add(19236)
+    ..add(19237)
+    ..add(19238)
+    ..add(19239)
+    ..add(19240)
+    ..add(19241)
+    ..add(19242)
+    ..add(19243)
+    ..add(19244)
+    ..add(19245)
+    ..add(19246)
+    ..add(19247)
+    ..add(19248)
+    ..add(19249)
+    ..add(19250)
+    ..add(19251)
+    ..add(19252)
+    ..add(19253)
+    ..add(19254)
+    ..add(19255)
+    ..add(19256)
+    ..add(19257)
+    ..add(19258)
+    ..add(19259)
+    ..add(19260)
+    ..add(19261)
+    ..add(19262)
+    ..add(19263)
+    ..add(19264)
+    ..add(19265)
+    ..add(19266)
+    ..add(19267)
+    ..add(19268)
+    ..add(19269)
+    ..add(19270)
+    ..add(19271)
+    ..add(19272)
+    ..add(19273)
+    ..add(19274)
+    ..add(19275)
+    ..add(19276)
+    ..add(19277)
+    ..add(19278)
+    ..add(19279)
+    ..add(19280)
+    ..add(19281)
+    ..add(19282)
+    ..add(19283)
+    ..add(19284)
+    ..add(19285)
+    ..add(19286)
+    ..add(19287)
+    ..add(19288)
+    ..add(19289)
+    ..add(19290)
+    ..add(19291)
+    ..add(19292)
+    ..add(19293)
+    ..add(19294)
+    ..add(19295)
+    ..add(19296)
+    ..add(19297)
+    ..add(19298)
+    ..add(19299)
+    ..add(19300)
+    ..add(19301)
+    ..add(19302)
+    ..add(19303)
+    ..add(19304)
+    ..add(19305)
+    ..add(19306)
+    ..add(19307)
+    ..add(19308)
+    ..add(19309)
+    ..add(19310)
+    ..add(19311)
+    ..add(19312)
+    ..add(19313)
+    ..add(19314)
+    ..add(19315)
+    ..add(19316)
+    ..add(19317)
+    ..add(19318)
+    ..add(19319)
+    ..add(19320)
+    ..add(19321)
+    ..add(19322)
+    ..add(19323)
+    ..add(19324)
+    ..add(19325)
+    ..add(19326)
+    ..add(19327)
+    ..add(19328)
+    ..add(19329)
+    ..add(19330)
+    ..add(19331)
+    ..add(19332)
+    ..add(19333)
+    ..add(19334)
+    ..add(19335)
+    ..add(19336)
+    ..add(19337)
+    ..add(19338)
+    ..add(19339)
+    ..add(19340)
+    ..add(19341)
+    ..add(19342)
+    ..add(19343)
+    ..add(19344)
+    ..add(19345)
+    ..add(19346)
+    ..add(19347)
+    ..add(19348)
+    ..add(19349)
+    ..add(19350)
+    ..add(19351)
+    ..add(19352)
+    ..add(19353)
+    ..add(19354)
+    ..add(19355)
+    ..add(19356)
+    ..add(19357)
+    ..add(19358)
+    ..add(19359)
+    ..add(19360)
+    ..add(19361)
+    ..add(19362)
+    ..add(19363)
+    ..add(19364)
+    ..add(19365)
+    ..add(19366)
+    ..add(19367)
+    ..add(19368)
+    ..add(19369)
+    ..add(19370)
+    ..add(19371)
+    ..add(19372)
+    ..add(19373)
+    ..add(19374)
+    ..add(19375)
+    ..add(19376)
+    ..add(19377)
+    ..add(19378)
+    ..add(19379)
+    ..add(19380)
+    ..add(19381)
+    ..add(19382)
+    ..add(19383)
+    ..add(19384)
+    ..add(19385)
+    ..add(19386)
+    ..add(19387)
+    ..add(19388)
+    ..add(19389)
+    ..add(19390)
+    ..add(19391)
+    ..add(19392)
+    ..add(19393)
+    ..add(19394)
+    ..add(19395)
+    ..add(19396)
+    ..add(19397)
+    ..add(19398)
+    ..add(19399)
+    ..add(19400)
+    ..add(19401)
+    ..add(19402)
+    ..add(19403)
+    ..add(19404)
+    ..add(19405)
+    ..add(19406)
+    ..add(19407)
+    ..add(19408)
+    ..add(19409)
+    ..add(19410)
+    ..add(19411)
+    ..add(19412)
+    ..add(19413)
+    ..add(19414)
+    ..add(19415)
+    ..add(19416)
+    ..add(19417)
+    ..add(19418)
+    ..add(19419)
+    ..add(19420)
+    ..add(19421)
+    ..add(19422)
+    ..add(19423)
+    ..add(19424)
+    ..add(19425)
+    ..add(19426)
+    ..add(19427)
+    ..add(19428)
+    ..add(19429)
+    ..add(19430)
+    ..add(19431)
+    ..add(19432)
+    ..add(19433)
+    ..add(19434)
+    ..add(19435)
+    ..add(19436)
+    ..add(19437)
+    ..add(19438)
+    ..add(19439)
+    ..add(19440)
+    ..add(19441)
+    ..add(19442)
+    ..add(19443)
+    ..add(19444)
+    ..add(19445)
+    ..add(19446)
+    ..add(19447)
+    ..add(19448)
+    ..add(19449)
+    ..add(19450)
+    ..add(19451)
+    ..add(19452)
+    ..add(19453)
+    ..add(19454)
+    ..add(19455)
+    ..add(19456)
+    ..add(19457)
+    ..add(19458)
+    ..add(19459)
+    ..add(19460)
+    ..add(19461)
+    ..add(19462)
+    ..add(19463)
+    ..add(19464)
+    ..add(19465)
+    ..add(19466)
+    ..add(19467)
+    ..add(19468)
+    ..add(19469)
+    ..add(19470)
+    ..add(19471)
+    ..add(19472)
+    ..add(19473)
+    ..add(19474)
+    ..add(19475)
+    ..add(19476)
+    ..add(19477)
+    ..add(19478)
+    ..add(19479)
+    ..add(19480)
+    ..add(19481)
+    ..add(19482)
+    ..add(19483)
+    ..add(19484)
+    ..add(19485)
+    ..add(19486)
+    ..add(19487)
+    ..add(19488)
+    ..add(19489)
+    ..add(19490)
+    ..add(19491)
+    ..add(19492)
+    ..add(19493)
+    ..add(19494)
+    ..add(19495)
+    ..add(19496)
+    ..add(19497)
+    ..add(19498)
+    ..add(19499)
+    ..add(19500)
+    ..add(19501)
+    ..add(19502)
+    ..add(19503)
+    ..add(19504)
+    ..add(19505)
+    ..add(19506)
+    ..add(19507)
+    ..add(19508)
+    ..add(19509)
+    ..add(19510)
+    ..add(19511)
+    ..add(19512)
+    ..add(19513)
+    ..add(19514)
+    ..add(19515)
+    ..add(19516)
+    ..add(19517)
+    ..add(19518)
+    ..add(19519)
+    ..add(19520)
+    ..add(19521)
+    ..add(19522)
+    ..add(19523)
+    ..add(19524)
+    ..add(19525)
+    ..add(19526)
+    ..add(19527)
+    ..add(19528)
+    ..add(19529)
+    ..add(19530)
+    ..add(19531)
+    ..add(19532)
+    ..add(19533)
+    ..add(19534)
+    ..add(19535)
+    ..add(19536)
+    ..add(19537)
+    ..add(19538)
+    ..add(19539)
+    ..add(19540)
+    ..add(19541)
+    ..add(19542)
+    ..add(19543)
+    ..add(19544)
+    ..add(19545)
+    ..add(19546)
+    ..add(19547)
+    ..add(19548)
+    ..add(19549)
+    ..add(19550)
+    ..add(19551)
+    ..add(19552)
+    ..add(19553)
+    ..add(19554)
+    ..add(19555)
+    ..add(19556)
+    ..add(19557)
+    ..add(19558)
+    ..add(19559)
+    ..add(19560)
+    ..add(19561)
+    ..add(19562)
+    ..add(19563)
+    ..add(19564)
+    ..add(19565)
+    ..add(19566)
+    ..add(19567)
+    ..add(19568)
+    ..add(19569)
+    ..add(19570)
+    ..add(19571)
+    ..add(19572)
+    ..add(19573)
+    ..add(19574)
+    ..add(19575)
+    ..add(19576)
+    ..add(19577)
+    ..add(19578)
+    ..add(19579)
+    ..add(19580)
+    ..add(19581)
+    ..add(19582)
+    ..add(19583)
+    ..add(19584)
+    ..add(19585)
+    ..add(19586)
+    ..add(19587)
+    ..add(19588)
+    ..add(19589)
+    ..add(19590)
+    ..add(19591)
+    ..add(19592)
+    ..add(19593)
+    ..add(19594)
+    ..add(19595)
+    ..add(19596)
+    ..add(19597)
+    ..add(19598)
+    ..add(19599)
+    ..add(19600)
+    ..add(19601)
+    ..add(19602)
+    ..add(19603)
+    ..add(19604)
+    ..add(19605)
+    ..add(19606)
+    ..add(19607)
+    ..add(19608)
+    ..add(19609)
+    ..add(19610)
+    ..add(19611)
+    ..add(19612)
+    ..add(19613)
+    ..add(19614)
+    ..add(19615)
+    ..add(19616)
+    ..add(19617)
+    ..add(19618)
+    ..add(19619)
+    ..add(19620)
+    ..add(19621)
+    ..add(19622)
+    ..add(19623)
+    ..add(19624)
+    ..add(19625)
+    ..add(19626)
+    ..add(19627)
+    ..add(19628)
+    ..add(19629)
+    ..add(19630)
+    ..add(19631)
+    ..add(19632)
+    ..add(19633)
+    ..add(19634)
+    ..add(19635)
+    ..add(19636)
+    ..add(19637)
+    ..add(19638)
+    ..add(19639)
+    ..add(19640)
+    ..add(19641)
+    ..add(19642)
+    ..add(19643)
+    ..add(19644)
+    ..add(19645)
+    ..add(19646)
+    ..add(19647)
+    ..add(19648)
+    ..add(19649)
+    ..add(19650)
+    ..add(19651)
+    ..add(19652)
+    ..add(19653)
+    ..add(19654)
+    ..add(19655)
+    ..add(19656)
+    ..add(19657)
+    ..add(19658)
+    ..add(19659)
+    ..add(19660)
+    ..add(19661)
+    ..add(19662)
+    ..add(19663)
+    ..add(19664)
+    ..add(19665)
+    ..add(19666)
+    ..add(19667)
+    ..add(19668)
+    ..add(19669)
+    ..add(19670)
+    ..add(19671)
+    ..add(19672)
+    ..add(19673)
+    ..add(19674)
+    ..add(19675)
+    ..add(19676)
+    ..add(19677)
+    ..add(19678)
+    ..add(19679)
+    ..add(19680)
+    ..add(19681)
+    ..add(19682)
+    ..add(19683)
+    ..add(19684)
+    ..add(19685)
+    ..add(19686)
+    ..add(19687)
+    ..add(19688)
+    ..add(19689)
+    ..add(19690)
+    ..add(19691)
+    ..add(19692)
+    ..add(19693)
+    ..add(19694)
+    ..add(19695)
+    ..add(19696)
+    ..add(19697)
+    ..add(19698)
+    ..add(19699)
+    ..add(19700)
+    ..add(19701)
+    ..add(19702)
+    ..add(19703)
+    ..add(19704)
+    ..add(19705)
+    ..add(19706)
+    ..add(19707)
+    ..add(19708)
+    ..add(19709)
+    ..add(19710)
+    ..add(19711)
+    ..add(19712)
+    ..add(19713)
+    ..add(19714)
+    ..add(19715)
+    ..add(19716)
+    ..add(19717)
+    ..add(19718)
+    ..add(19719)
+    ..add(19720)
+    ..add(19721)
+    ..add(19722)
+    ..add(19723)
+    ..add(19724)
+    ..add(19725)
+    ..add(19726)
+    ..add(19727)
+    ..add(19728)
+    ..add(19729)
+    ..add(19730)
+    ..add(19731)
+    ..add(19732)
+    ..add(19733)
+    ..add(19734)
+    ..add(19735)
+    ..add(19736)
+    ..add(19737)
+    ..add(19738)
+    ..add(19739)
+    ..add(19740)
+    ..add(19741)
+    ..add(19742)
+    ..add(19743)
+    ..add(19744)
+    ..add(19745)
+    ..add(19746)
+    ..add(19747)
+    ..add(19748)
+    ..add(19749)
+    ..add(19750)
+    ..add(19751)
+    ..add(19752)
+    ..add(19753)
+    ..add(19754)
+    ..add(19755)
+    ..add(19756)
+    ..add(19757)
+    ..add(19758)
+    ..add(19759)
+    ..add(19760)
+    ..add(19761)
+    ..add(19762)
+    ..add(19763)
+    ..add(19764)
+    ..add(19765)
+    ..add(19766)
+    ..add(19767)
+    ..add(19768)
+    ..add(19769)
+    ..add(19770)
+    ..add(19771)
+    ..add(19772)
+    ..add(19773)
+    ..add(19774)
+    ..add(19775)
+    ..add(19776)
+    ..add(19777)
+    ..add(19778)
+    ..add(19779)
+    ..add(19780)
+    ..add(19781)
+    ..add(19782)
+    ..add(19783)
+    ..add(19784)
+    ..add(19785)
+    ..add(19786)
+    ..add(19787)
+    ..add(19788)
+    ..add(19789)
+    ..add(19790)
+    ..add(19791)
+    ..add(19792)
+    ..add(19793)
+    ..add(19794)
+    ..add(19795)
+    ..add(19796)
+    ..add(19797)
+    ..add(19798)
+    ..add(19799)
+    ..add(19800)
+    ..add(19801)
+    ..add(19802)
+    ..add(19803)
+    ..add(19804)
+    ..add(19805)
+    ..add(19806)
+    ..add(19807)
+    ..add(19808)
+    ..add(19809)
+    ..add(19810)
+    ..add(19811)
+    ..add(19812)
+    ..add(19813)
+    ..add(19814)
+    ..add(19815)
+    ..add(19816)
+    ..add(19817)
+    ..add(19818)
+    ..add(19819)
+    ..add(19820)
+    ..add(19821)
+    ..add(19822)
+    ..add(19823)
+    ..add(19824)
+    ..add(19825)
+    ..add(19826)
+    ..add(19827)
+    ..add(19828)
+    ..add(19829)
+    ..add(19830)
+    ..add(19831)
+    ..add(19832)
+    ..add(19833)
+    ..add(19834)
+    ..add(19835)
+    ..add(19836)
+    ..add(19837)
+    ..add(19838)
+    ..add(19839)
+    ..add(19840)
+    ..add(19841)
+    ..add(19842)
+    ..add(19843)
+    ..add(19844)
+    ..add(19845)
+    ..add(19846)
+    ..add(19847)
+    ..add(19848)
+    ..add(19849)
+    ..add(19850)
+    ..add(19851)
+    ..add(19852)
+    ..add(19853)
+    ..add(19854)
+    ..add(19855)
+    ..add(19856)
+    ..add(19857)
+    ..add(19858)
+    ..add(19859)
+    ..add(19860)
+    ..add(19861)
+    ..add(19862)
+    ..add(19863)
+    ..add(19864)
+    ..add(19865)
+    ..add(19866)
+    ..add(19867)
+    ..add(19868)
+    ..add(19869)
+    ..add(19870)
+    ..add(19871)
+    ..add(19872)
+    ..add(19873)
+    ..add(19874)
+    ..add(19875)
+    ..add(19876)
+    ..add(19877)
+    ..add(19878)
+    ..add(19879)
+    ..add(19880)
+    ..add(19881)
+    ..add(19882)
+    ..add(19883)
+    ..add(19884)
+    ..add(19885)
+    ..add(19886)
+    ..add(19887)
+    ..add(19888)
+    ..add(19889)
+    ..add(19890)
+    ..add(19891)
+    ..add(19892)
+    ..add(19893)
+    ..add(19894)
+    ..add(19895)
+    ..add(19896)
+    ..add(19897)
+    ..add(19898)
+    ..add(19899)
+    ..add(19900)
+    ..add(19901)
+    ..add(19902)
+    ..add(19903)
+    ..add(19904)
+    ..add(19905)
+    ..add(19906)
+    ..add(19907)
+    ..add(19908)
+    ..add(19909)
+    ..add(19910)
+    ..add(19911)
+    ..add(19912)
+    ..add(19913)
+    ..add(19914)
+    ..add(19915)
+    ..add(19916)
+    ..add(19917)
+    ..add(19918)
+    ..add(19919)
+    ..add(19920)
+    ..add(19921)
+    ..add(19922)
+    ..add(19923)
+    ..add(19924)
+    ..add(19925)
+    ..add(19926)
+    ..add(19927)
+    ..add(19928)
+    ..add(19929)
+    ..add(19930)
+    ..add(19931)
+    ..add(19932)
+    ..add(19933)
+    ..add(19934)
+    ..add(19935)
+    ..add(19936)
+    ..add(19937)
+    ..add(19938)
+    ..add(19939)
+    ..add(19940)
+    ..add(19941)
+    ..add(19942)
+    ..add(19943)
+    ..add(19944)
+    ..add(19945)
+    ..add(19946)
+    ..add(19947)
+    ..add(19948)
+    ..add(19949)
+    ..add(19950)
+    ..add(19951)
+    ..add(19952)
+    ..add(19953)
+    ..add(19954)
+    ..add(19955)
+    ..add(19956)
+    ..add(19957)
+    ..add(19958)
+    ..add(19959)
+    ..add(19960)
+    ..add(19961)
+    ..add(19962)
+    ..add(19963)
+    ..add(19964)
+    ..add(19965)
+    ..add(19966)
+    ..add(19967)
+    ..add(19968)
+    ..add(19969)
+    ..add(19970)
+    ..add(19971)
+    ..add(19972)
+    ..add(19973)
+    ..add(19974)
+    ..add(19975)
+    ..add(19976)
+    ..add(19977)
+    ..add(19978)
+    ..add(19979)
+    ..add(19980)
+    ..add(19981)
+    ..add(19982)
+    ..add(19983)
+    ..add(19984)
+    ..add(19985)
+    ..add(19986)
+    ..add(19987)
+    ..add(19988)
+    ..add(19989)
+    ..add(19990)
+    ..add(19991)
+    ..add(19992)
+    ..add(19993)
+    ..add(19994)
+    ..add(19995)
+    ..add(19996)
+    ..add(19997)
+    ..add(19998)
+    ..add(19999);
+
+  Expect.equals(ints.length, 20000);
+  for (int i = 0; i < ints.length; i++) {
+    Expect.equals(ints[i], i);
+  }
+}
diff --git a/tests/language_2/unsorted/disassemble_test.dart b/tests/language_2/unsorted/disassemble_test.dart
index 7bbc32c..bc3b032 100644
--- a/tests/language_2/unsorted/disassemble_test.dart
+++ b/tests/language_2/unsorted/disassemble_test.dart
@@ -1,9 +1,9 @@
 // Copyright (c) 2014, 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 test program for testing isolate communication with
-// typed objects.
+
 // VMOptions=--disassemble
+// VMOptions=--disassemble --always_generate_trampolines_for_testing
 
 // Tests proper object recognition in disassembler.
 
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index cd733a9..e005a49 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -41,8 +41,11 @@
 
 [ $runtime == chrome && $system == macos ]
 convert/streamed_conversion_utf8_encode_test: SkipSlow # Times out. Issue 22050
-html/canvasrenderingcontext2d_test/drawImage_video_element: Skip # Times out. Please triage this failure.
-html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Times out. Please triage this failure.
+html/canvasrendering/arc_test: Skip # Issue 42048
+html/canvasrendering/draw_image_canvas_element_test: Skip # Issue 42048
+html/canvasrendering/fill_text_test: Skip # Issue 42048
+html/canvasrendering/image_element_test: Skip # Issue 42048
+html/canvasrendering/pixel_manipulation_test: Skip # Issue 42048
 html/request_animation_frame_test: Skip # Times out. Issue 22167
 html/transition_event_test: Skip # Times out. Issue 22167
 
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 3365351..c21cc4c 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -41,8 +41,11 @@
 
 [ $runtime == chrome && $system == macos ]
 convert/streamed_conversion_utf8_encode_test: SkipSlow # Times out. Issue 22050
-html/canvasrenderingcontext2d_test/drawImage_video_element: Skip # Times out. Please triage this failure.
-html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Times out. Please triage this failure.
+html/canvasrendering/arc_test: Skip # Issue 42048
+html/canvasrendering/draw_image_canvas_element_test: Skip # Issue 42048
+html/canvasrendering/fill_text_test: Skip # Issue 42048
+html/canvasrendering/image_element_test: Skip # Issue 42048
+html/canvasrendering/pixel_manipulation_test: Skip # Issue 42048
 html/request_animation_frame_test: Skip # Times out. Issue 22167
 html/transition_event_test: Skip # Times out. Issue 22167
 
diff --git a/tests/standalone_2/dwarf_stack_trace_test.dart b/tests/standalone_2/dwarf_stack_trace_test.dart
index bed8cfa..8af577b 100644
--- a/tests/standalone_2/dwarf_stack_trace_test.dart
+++ b/tests/standalone_2/dwarf_stack_trace_test.dart
@@ -66,6 +66,17 @@
   final virtualAddresses =
       pcOffsets.map((o) => dwarf.virtualAddressOf(o)).toList();
 
+  // Some double-checks using other information in the non-symbolic stack trace.
+  final dsoBase = dsoBaseAddresses(rawLines).single;
+  final absolutes = absoluteAddresses(rawLines);
+  final relocatedAddresses = absolutes.map((a) => a - dsoBase);
+  final explicits = explicitVirtualAddresses(rawLines);
+  Expect.deepEquals(relocatedAddresses, virtualAddresses);
+  // Explicits will be empty if not generating ELF snapshots directly.
+  if (explicits.isNotEmpty) {
+    Expect.deepEquals(explicits, virtualAddresses);
+  }
+
   final externalFramesInfo = <List<CallInfo>>[];
   final allFramesInfo = <List<CallInfo>>[];
 
@@ -247,3 +258,27 @@
   }
   return ret;
 }
+
+Iterable<int> parseUsingAddressRegExp(RegExp re, Iterable<String> lines) sync* {
+  for (final line in lines) {
+    final match = re.firstMatch(line);
+    if (match != null) {
+      yield int.parse(match.group(1), radix: 16);
+    }
+  }
+}
+
+final _absRE = RegExp(r'abs ([a-f\d]+)');
+
+Iterable<int> absoluteAddresses(Iterable<String> lines) =>
+    parseUsingAddressRegExp(_absRE, lines);
+
+final _virtRE = RegExp(r'virt ([a-f\d]+)');
+
+Iterable<int> explicitVirtualAddresses(Iterable<String> lines) =>
+    parseUsingAddressRegExp(_virtRE, lines);
+
+final _dsoBaseRE = RegExp(r'isolate_dso_base: ([a-f\d]+)');
+
+Iterable<int> dsoBaseAddresses(Iterable<String> lines) =>
+    parseUsingAddressRegExp(_dsoBaseRE, lines);
diff --git a/tests/standalone_2/regress_41329_absolute_test.dart b/tests/standalone_2/regress_41329_absolute_test.dart
index 5673b99..cc2a402 100644
--- a/tests/standalone_2/regress_41329_absolute_test.dart
+++ b/tests/standalone_2/regress_41329_absolute_test.dart
@@ -29,9 +29,6 @@
   final link2 = Link('dart')..createSync(linkLocation, recursive: true);
   final path = Uri.parse(link2.absolute.path).path;
   Directory.current = origDir;
-  final result = await Process.run('${path}',
-      [p.relative(Platform.script.resolve('regress_41329_helper.dart').path)]);
-  Expect.equals(result.stdout, '');
-  Expect.equals(result.stderr, '');
-  Expect.equals(result.exitCode, 42);
+  final result = await Process.run('${path}', ['help']);
+  Expect.equals(result.exitCode, 0);
 }
diff --git a/tests/standalone_2/regress_41329_helper.dart b/tests/standalone_2/regress_41329_helper.dart
deleted file mode 100644
index f6f82dd..0000000
--- a/tests/standalone_2/regress_41329_helper.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2020, 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 'dart:io';
-
-main() {
-  exitCode = 42;
-}
diff --git a/tests/standalone_2/regress_41329_relative_test.dart b/tests/standalone_2/regress_41329_relative_test.dart
index 5673b99..cc2a402 100644
--- a/tests/standalone_2/regress_41329_relative_test.dart
+++ b/tests/standalone_2/regress_41329_relative_test.dart
@@ -29,9 +29,6 @@
   final link2 = Link('dart')..createSync(linkLocation, recursive: true);
   final path = Uri.parse(link2.absolute.path).path;
   Directory.current = origDir;
-  final result = await Process.run('${path}',
-      [p.relative(Platform.script.resolve('regress_41329_helper.dart').path)]);
-  Expect.equals(result.stdout, '');
-  Expect.equals(result.stderr, '');
-  Expect.equals(result.exitCode, 42);
+  final result = await Process.run('${path}', ['help']);
+  Expect.equals(result.exitCode, 0);
 }
diff --git a/tools/VERSION b/tools/VERSION
index 4756f9a..996e1e0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 9
 PATCH 0
-PRERELEASE 11
+PRERELEASE 12
 PRERELEASE_PATCH 0
 ABI_VERSION 34
 OLDEST_SUPPORTED_ABI_VERSION 34
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 18c86c5..6b762c2 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1,6 +1,6 @@
 {
   "global": {
-    "chrome": "76",
+    "chrome": "81",
     "firefox": "67"
   },
   "branches": [
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 6c50302..219c48e 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -182,13 +182,9 @@
 group("dartdevc_test_kernel_pkg") {
   deps = [
     ":async_helper_js",
-    ":collection_js",
     ":expect_js",
     ":js_js",
-    ":matcher_js",
     ":meta_js",
-    ":path_js",
-    ":stack_trace_js",
   ]
 }
 
@@ -266,10 +262,6 @@
   package = "async_helper"
 }
 
-dartdevc_kernel_compile("collection_js") {
-  package = "collection"
-}
-
 dartdevc_kernel_compile("expect_js") {
   package = "expect"
   extra_libraries = [ "minitest" ]
@@ -280,24 +272,10 @@
   extra_libraries = [ "js_util" ]
 }
 
-dartdevc_kernel_compile("matcher_js") {
-  package = "matcher"
-  package_dependencies = [ "stack_trace" ]
-}
-
 dartdevc_kernel_compile("meta_js") {
   package = "meta"
 }
 
-dartdevc_kernel_compile("path_js") {
-  package = "path"
-}
-
-dartdevc_kernel_compile("stack_trace_js") {
-  package = "stack_trace"
-  package_dependencies = [ "path" ]
-}
-
 compile_platform("dartdevc_platform") {
   single_root_scheme = "org-dartlang-sdk"
   single_root_base = rebase_path("../../")