Version 2.8.0-dev.13.0

Merge commit '30a12a349e0aa03a760016703d80fc89d12f3ec7' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fcdcd5..9146f83 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -104,6 +104,9 @@
   `package:js` interop specification must now be wrapped with a call to
   `allowInterop`. This behavior was always enforced by `dart2js`, but was not
   enforced consistently in `ddc`. It will now be enforced in both.
+* **Breaking Change**: Constructors in `@JS()` classes must be marked with
+  `external`. Previously the external could be omitted in some cases with DDC
+  but doing so would cause incorrect behavior with `dart2js`.
 * JS interop classes with an index operator are now static errors.
 * Removed the `dart:mirrors` library from the SDK. Use of this library on the
   web has been unsupported and prevented by the Dart build systems since Dart
@@ -127,6 +130,10 @@
 * **Breaking Change**: Types are now normalized. See [normalization] for the
   full specification. Types will now be printed in their normal form, and
   mutual subtypes with the same normal form will now be considered equal.
+* **Breaking Change**: Constructors in `@JS()` classes must be marked with
+  `external`. Previously the external could be omitted for unused constructors.
+  Omitting `external` for a constructor which is used would cause incorrect
+  behavior at runtime, now omitting it on any constructor is a static error.
 
  [normalization]: https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 
@@ -140,6 +147,10 @@
 * new lint: `unnecessary_string_escapes`
 * incompatible rule documentation improvements
 
+#### Analyzer
+
+ * Removed support for the deprecated analysis options file name `.analysis_options`.
+
 #### Pub
 
 * `pub get` and `pub upgrade` now fetches version information about hosted
diff --git a/DEPS b/DEPS
index b0780a6..141a264 100644
--- a/DEPS
+++ b/DEPS
@@ -39,7 +39,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "def1183bacc28f008db4fdd3d0442ed05f1889f8",
+  "co19_rev": "34a1386e6e7d3e27f5f2b4461aeb6f8794ab55c7",
   "co19_2_rev": "368bfa9e877a2df003547f64bb17e30596af10c7",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
@@ -47,7 +47,7 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/buildtools/+/master/fuchsia.ensure
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "b25fc4123c77097c05ea221e023fa5c6a16e0f41",
+  "clang_revision": "7e9747b50bcb1be28d4a3236571e8050835497a6",
   "gn_revision": "239533d2d91a04b3317ca9101cf7189f4e651e4d",
 
   # Scripts that make 'git cl format' work.
@@ -86,7 +86,7 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.3.2",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.30.1",
+  "dartdoc_tag" : "v0.30.2",
   "ffi_tag": "ea88d71b043ee14b268c3aedff14e9eb32e20959",
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
@@ -126,10 +126,10 @@
   "root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
   "rust_revision": "60960a260f7b5c695fd0717311d72ce62dd4eb43",
   "shelf_static_rev": "v0.2.8",
-  "shelf_packages_handler_tag": "1.0.4",
+  "shelf_packages_handler_tag": "2.0.0",
   "shelf_tag": "0.7.3+3",
   "shelf_web_socket_tag": "0.2.2+3",
-  "source_map_stack_trace_tag": "1.1.5",
+  "source_map_stack_trace_tag": "2.0.0",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_tag": "8af7cc1a1c3a193c1fba5993ce22a546a319c40e",
   "source_span_tag": "1.5.5",
@@ -141,12 +141,12 @@
   "test_process_tag": "1.0.3",
   "term_glyph_tag": "1.0.1",
   "test_reflective_loader_tag": "0.1.9",
-  "test_tag": "test-v1.6.4",
+  "test_tag": "test_core-v0.3.2",
   "tflite_native_rev": "3c777c40608a2a9f1427bfe0028ab48e7116b4c1",
   "typed_data_tag": "1.1.6",
   "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
-  "watcher_rev": "0.9.7+13",
+  "watcher_rev": "0.9.7+14",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_tag": "1.0.9",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
@@ -286,8 +286,6 @@
       Var("dart_git") + "dart_style.git" + "@" + Var("dart_style_tag"),
   Var("dart_root") + "/third_party/pkg/dart2js_info":
       Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
-  Var("dart_root") + "/third_party/pkg/args":
-      Var("dart_git") + "args.git" + "@" + Var("args_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
       Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
   Var("dart_root") + "/third_party/pkg/ffi":
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 673f2ed..60eb94d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -229,16 +229,16 @@
 
 /// Information tracked by [AssignedVariables] for a single node.
 class AssignedVariablesNodeInfo<Variable> {
+  /// The set of local variables that are potentially written in the node.
   final Set<Variable> _written = new Set<Variable>.identity();
 
-  // The set of local variables that are potentially written in the node.
+  /// The set of local variables for which a potential write is captured by a
+  /// local function or closure inside the node.
   final Set<Variable> _captured = new Set<Variable>.identity();
 
-  // The set of local variables for which a potential write is captured by a
-  // local function or closure inside the node.
+  /// The set of local variables that are declared in the node.
   final Set<Variable> _declared = new Set<Variable>.identity();
 
-  // The set of local variables that are declared in the node.
   String toString() =>
       'AssignedVariablesNodeInfo(_written=$_written, _captured=$_captured, '
       '_declared=$_declared)';
@@ -341,6 +341,13 @@
   /// ("?:").  [condition] should be the expression preceding the "?".
   void conditional_thenBegin(Expression condition);
 
+  /// Register a declaration of the [variable] in the current state.
+  /// Should also be called for function parameters.
+  ///
+  /// A local variable is [initialized] if its declaration has an initializer.
+  /// A function parameter is always initialized, so [initialized] is `true`.
+  void declare(Variable variable, bool initialized);
+
   /// Call this method before visiting the body of a "do-while" statement.
   /// [doStatement] should be the same node that was passed to
   /// [AssignedVariables.endNode] for the do-while statement.
@@ -494,10 +501,6 @@
   /// - Call [ifStatement_end], passing `true` for `hasElse`.
   void ifStatement_thenBegin(Expression condition);
 
-  /// Register an initialized declaration of the given [variable] in the current
-  /// state.  Should also be called for function parameters.
-  void initialize(Variable variable);
-
   /// Return whether the [variable] is definitely assigned in the current state.
   bool isAssigned(Variable variable);
 
@@ -775,6 +778,12 @@
   }
 
   @override
+  void declare(Variable variable, bool initialized) {
+    _wrap('declare($variable, $initialized)',
+        () => _wrapped.declare(variable, initialized));
+  }
+
+  @override
   void doStatement_bodyBegin(Statement doStatement) {
     return _wrap('doStatement_bodyBegin($doStatement)',
         () => _wrapped.doStatement_bodyBegin(doStatement));
@@ -904,11 +913,6 @@
   }
 
   @override
-  void initialize(Variable variable) {
-    _wrap('initialize($variable)', () => _wrapped.initialize(variable));
-  }
-
-  @override
   bool isAssigned(Variable variable) {
     return _wrap('isAssigned($variable)', () => _wrapped.isAssigned(variable),
         isQuery: true);
@@ -1152,20 +1156,24 @@
     }());
   }
 
+  /// Register a declaration of the [variable].
+  /// Should also be called for function parameters.
+  ///
+  /// A local variable is [initialized] if its declaration has an initializer.
+  /// A function parameter is always initialized, so [initialized] is `true`.
+  FlowModel<Variable, Type> declare(Variable variable, bool initialized) {
+    VariableModel<Type> newInfoForVar = _freshVariableInfo;
+    if (initialized) {
+      newInfoForVar = newInfoForVar.initialize();
+    }
+
+    return _updateVariableInfo(variable, newInfoForVar);
+  }
+
   /// Gets the info for the given [variable], creating it if it doesn't exist.
   VariableModel<Type> infoFor(Variable variable) =>
       variableInfo[variable] ?? _freshVariableInfo;
 
-  /// Updates the state to indicate that the given [variable] was initialized.
-  /// The variable is marked as definitely assigned, and any previous type
-  /// promotion is removed.
-  FlowModel<Variable, Type> initialize(Variable variable) {
-    VariableModel<Type> infoForVar = infoFor(variable);
-    VariableModel<Type> newInfoForVar = infoForVar.initialize();
-    if (identical(newInfoForVar, infoForVar)) return this;
-    return _updateVariableInfo(variable, newInfoForVar);
-  }
-
   /// Updates the state to indicate that the given [writtenVariables] are no
   /// longer promoted; they are presumed to have their declared types.
   ///
@@ -1245,28 +1253,24 @@
         in variableInfo.entries) {
       Variable variable = entry.key;
       VariableModel<Type> thisModel = entry.value;
-      VariableModel<Type> otherModel = other.infoFor(variable);
+      VariableModel<Type> otherModel = other.variableInfo[variable];
+      if (otherModel == null) {
+        variableInfoMatchesThis = false;
+        continue;
+      }
       VariableModel<Type> restricted = thisModel.restrict(
           typeOperations, otherModel, unsafe.contains(variable));
-      if (!identical(restricted, _freshVariableInfo)) {
-        newVariableInfo[variable] = restricted;
-      }
+      newVariableInfo[variable] = restricted;
       if (!identical(restricted, thisModel)) variableInfoMatchesThis = false;
       if (!identical(restricted, otherModel)) variableInfoMatchesOther = false;
     }
-    for (MapEntry<Variable, VariableModel<Type>> entry
-        in other.variableInfo.entries) {
-      Variable variable = entry.key;
-      if (variableInfo.containsKey(variable)) continue;
-      VariableModel<Type> thisModel = _freshVariableInfo;
-      VariableModel<Type> otherModel = entry.value;
-      VariableModel<Type> restricted = thisModel.restrict(
-          typeOperations, otherModel, unsafe.contains(variable));
-      if (!identical(restricted, _freshVariableInfo)) {
-        newVariableInfo[variable] = restricted;
+    if (variableInfoMatchesOther) {
+      for (Variable variable in other.variableInfo.keys) {
+        if (!variableInfo.containsKey(variable)) {
+          variableInfoMatchesOther = false;
+          break;
+        }
       }
-      if (!identical(restricted, thisModel)) variableInfoMatchesThis = false;
-      if (!identical(restricted, otherModel)) variableInfoMatchesOther = false;
     }
     assert(variableInfoMatchesThis ==
         _variableInfosEqual(newVariableInfo, variableInfo));
@@ -1347,10 +1351,13 @@
   /// previous type promotion is removed.
   FlowModel<Variable, Type> write(Variable variable, Type writtenType,
       TypeOperations<Variable, Type> typeOperations) {
-    VariableModel<Type> infoForVar = infoFor(variable);
+    VariableModel<Type> infoForVar = variableInfo[variable];
+    if (infoForVar == null) return this;
+
     VariableModel<Type> newInfoForVar =
         infoForVar.write(writtenType, typeOperations);
     if (identical(newInfoForVar, infoForVar)) return this;
+
     return _updateVariableInfo(variable, newInfoForVar);
   }
 
@@ -2054,6 +2061,11 @@
   }
 
   @override
+  void declare(Variable variable, bool initialized) {
+    _current = _current.declare(variable, initialized);
+  }
+
+  @override
   void doStatement_bodyBegin(Statement doStatement) {
     AssignedVariablesNodeInfo<Variable> info =
         _assignedVariables._getInfoForNode(doStatement);
@@ -2268,11 +2280,6 @@
   }
 
   @override
-  void initialize(Variable variable) {
-    _current = _current.initialize(variable);
-  }
-
-  @override
   bool isAssigned(Variable variable) {
     return _current.infoFor(variable).assigned;
   }
@@ -2441,10 +2448,10 @@
         _stack.last as _TryContext<Variable, Type>;
     _current = context._beforeCatch;
     if (exceptionVariable != null) {
-      _current = _current.initialize(exceptionVariable);
+      _current = _current.declare(exceptionVariable, true);
     }
     if (stackTraceVariable != null) {
-      _current = _current.initialize(stackTraceVariable);
+      _current = _current.declare(stackTraceVariable, true);
     }
   }
 
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 ae3f371..18cf339 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -5304,6 +5304,17 @@
     tip: r"""Try replacing with a normal method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropNonExternalConstructor =
+    messageJsInteropNonExternalConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropNonExternalConstructor = const MessageCode(
+    "JsInteropNonExternalConstructor",
+    message:
+        r"""JS interop classes do not support non-external constructors.""",
+    tip: r"""Try annotating with `external`.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(String name)> templateLabelNotFound = const Template<
         Message Function(String name)>(
@@ -6208,7 +6219,7 @@
     "NonNullableOptOut",
     message: r"""Null safety features are disabled for this library.""",
     tip:
-        r"""Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.""");
+        r"""Try removing the `@dart=` annotation or setting the language version higher.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonNullableOptOutComment = messageNonNullableOptOutComment;
@@ -8682,6 +8693,16 @@
     message: r"""This expression has type 'void' and can't be used.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeVoidWithTypeArguments = messageVoidWithTypeArguments;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageVoidWithTypeArguments = const MessageCode(
+    "VoidWithTypeArguments",
+    index: 100,
+    message: r"""Type 'void' can't have type arguments.""",
+    tip: r"""Try removing the type arguments.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 305c634..253b762 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -1570,6 +1570,11 @@
   }
 
   @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    listener?.handleVoidKeywordWithTypeArguments(token);
+  }
+
+  @override
   void logEvent(String name) {
     listener?.logEvent(name);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index aaa33b3..112bfe6 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -1551,6 +1551,12 @@
     logEvent("VoidKeyword");
   }
 
+  /// The parser saw a void with type arguments (e.g. void<int>).
+  /// This is not valid - an error has already been emitted.
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    logEvent("handleVoidKeywordWithTypeArguments");
+  }
+
   void beginYieldStatement(Token token) {}
 
   void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index 465402a..84964e7 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -355,14 +355,39 @@
 
   @override
   Token parseType(Token token, Parser parser) {
-    token = token.next;
-    parser.listener.handleVoidKeyword(token);
+    Token voidKeyword = token = token.next;
+    bool hasTypeArguments = false;
+
+    // Recovery: Skip past, but issue problem, if followed by type arguments.
+    if (optional('<', token.next)) {
+      TypeParamOrArgInfo typeParam = computeTypeParamOrArg(token);
+      if (typeParam != noTypeParamOrArg) {
+        hasTypeArguments = true;
+        parser.reportRecoverableError(
+            token.next, codes.messageVoidWithTypeArguments);
+        token = typeParam.parseArguments(token, parser);
+      }
+    }
+    if (hasTypeArguments) {
+      parser.listener.handleVoidKeywordWithTypeArguments(voidKeyword);
+    } else {
+      // Normal case.
+      parser.listener.handleVoidKeyword(voidKeyword);
+    }
     return token;
   }
 
   @override
   Token skipType(Token token) {
-    return token.next;
+    token = token.next;
+    // Recovery: Skip past if followed by type arguments.
+    if (optional('<', token.next)) {
+      TypeParamOrArgInfo typeParam = computeTypeParamOrArg(token);
+      if (typeParam != noTypeParamOrArg) {
+        token = typeParam.skip(token);
+      }
+    }
+    return token;
   }
 }
 
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index be78085..b66c3d4 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -403,7 +403,7 @@
         h.declare(y, initialized: true);
         h.promote(y, 'int');
         flow.for_conditionBegin(forStatement);
-        flow.initialize(x);
+        flow.declare(x, true);
         flow.for_bodyBegin(_Statement(), _Expression());
         flow.for_updaterBegin();
         flow.for_end();
@@ -697,18 +697,17 @@
     test('functionExpression_begin() handles not-yet-seen variables', () {
       var h = _Harness();
       var x = h.addVar('x', 'int?');
-      var y = h.addVar('y', 'int?');
       var functionNode = _Node();
       h.assignedVariables(
           (vars) => vars.function(functionNode, () => vars.write(x)));
       h.run((flow) {
-        h.declare(y, initialized: true);
-        h.promote(y, 'int');
         flow.functionExpression_begin(functionNode);
         flow.functionExpression_end();
+        // x is declared after the local function, so the local function
+        // cannot possibly write to x.
         h.declare(x, initialized: true);
         h.promote(x, 'int');
-        expect(flow.promotedType(x), isNull);
+        expect(flow.promotedType(x).type, 'int');
       });
     });
 
@@ -1569,7 +1568,7 @@
         h.declare(y, initialized: true);
         h.promote(y, 'int');
         flow.whileStatement_conditionBegin(whileStatement);
-        flow.initialize(x);
+        flow.declare(x, true);
         flow.whileStatement_bodyBegin(_Statement(), _Expression());
         flow.whileStatement_end();
       });
@@ -1789,17 +1788,27 @@
 
     group('write', () {
       var objectQVar = _Var('x', _Type('Object?'));
+
+      test('without declaration', () {
+        // This should not happen in valid code, but test that we don't crash.
+        var h = _Harness();
+        var s =
+            FlowModel<_Var, _Type>(true).write(objectQVar, _Type('Object?'), h);
+        expect(s.variableInfo[objectQVar], isNull);
+      });
+
       test('unchanged', () {
         var h = _Harness();
-        var s1 =
-            FlowModel<_Var, _Type>(true).write(objectQVar, _Type('Object?'), h);
+        var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
+            .write(objectQVar, _Type('Object?'), h);
         var s2 = s1.write(objectQVar, _Type('Object?'), h);
         expect(s2, same(s1));
       });
 
       test('marks as assigned', () {
         var h = _Harness();
-        var s1 = FlowModel<_Var, _Type>(true);
+        var s1 = FlowModel<_Var, _Type>(true).declare(objectQVar, false);
         var s2 = s1.write(objectQVar, _Type('int?'), h);
         expect(s2.reachable, true);
         expect(
@@ -1811,6 +1820,7 @@
       test('un-promotes fully', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('int'))
             .ifTrue;
@@ -1826,6 +1836,7 @@
       test('un-promotes partially, when no exact match', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifTrue
@@ -1848,6 +1859,7 @@
       test('un-promotes partially, when exact match', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifTrue
@@ -1874,6 +1886,7 @@
       test('leaves promoted, when exact match', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifTrue
@@ -1893,6 +1906,7 @@
       test('leaves promoted, when writing a subtype', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifTrue
@@ -1912,6 +1926,7 @@
       test('Promotes to type of interest when not previously promoted', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifFalse;
@@ -1927,6 +1942,7 @@
       test('Promotes to type of interest when previously promoted', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifTrue
@@ -1947,6 +1963,7 @@
           () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('int?'))
             .ifFalse
@@ -1968,6 +1985,7 @@
           () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifFalse
@@ -1987,6 +2005,7 @@
       test('Multiple candidate types of interest; ambiguous', () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifFalse
@@ -2006,6 +2025,7 @@
           () {
         var h = _Harness();
         var s1 = FlowModel<_Var, _Type>(true)
+            .declare(objectQVar, false)
             .write(objectQVar, _Type('Object?'), h)
             .tryPromote(h, objectQVar, _Type('num?'))
             .ifFalse
@@ -2025,36 +2045,20 @@
       });
     });
 
-    group('initialize', () {
+    group('declare', () {
       var objectQVar = _Var('x', _Type('Object?'));
-      test('unchanged', () {
-        var s1 = FlowModel<_Var, _Type>(true).initialize(objectQVar);
-        var s2 = s1.initialize(objectQVar);
-        expect(s2, same(s1));
+
+      test('initialized', () {
+        var s = FlowModel<_Var, _Type>(true).declare(objectQVar, true);
+        expect(s.variableInfo, {
+          objectQVar: _matchVariableModel(assigned: true),
+        });
       });
 
-      test('marks as assigned', () {
-        var s1 = FlowModel<_Var, _Type>(true);
-        var s2 = s1.initialize(objectQVar);
-        expect(s2.reachable, true);
-        expect(
-            s2.infoFor(objectQVar),
-            _matchVariableModel(
-                chain: null, ofInterest: isEmpty, assigned: true));
-      });
-
-      test('un-promotes fully', () {
-        var h = _Harness();
-        var s1 = FlowModel<_Var, _Type>(true)
-            .initialize(objectQVar)
-            .tryPromote(h, objectQVar, _Type('int'))
-            .ifTrue;
-        expect(s1.variableInfo, contains(objectQVar));
-        var s2 = s1.initialize(objectQVar);
-        expect(s2.reachable, true);
-        expect(s2.variableInfo, {
-          objectQVar: _matchVariableModel(
-              chain: null, ofInterest: isEmpty, assigned: true)
+      test('not initialized', () {
+        var s = FlowModel<_Var, _Type>(true).declare(objectQVar, false);
+        expect(s.variableInfo, {
+          objectQVar: _matchVariableModel(assigned: false),
         });
       });
     });
@@ -2157,7 +2161,11 @@
         var b = _Var('b', _Type('int'));
         var c = _Var('c', _Type('int'));
         var d = _Var('d', _Type('int'));
-        var s0 = FlowModel<_Var, _Type>(true);
+        var s0 = FlowModel<_Var, _Type>(true)
+            .declare(a, false)
+            .declare(b, false)
+            .declare(c, false)
+            .declare(d, false);
         var s1 = s0.write(a, _Type('int'), h).write(b, _Type('int'), h);
         var s2 = s0.write(a, _Type('int'), h).write(c, _Type('int'), h);
         var result = s1.restrict(h, s2, Set());
@@ -2173,7 +2181,11 @@
         var b = _Var('b', _Type('int'));
         var c = _Var('c', _Type('int'));
         var d = _Var('d', _Type('int'));
-        var s0 = FlowModel<_Var, _Type>(true);
+        var s0 = FlowModel<_Var, _Type>(true)
+            .declare(a, false)
+            .declare(b, false)
+            .declare(c, false)
+            .declare(d, false);
         // In s1, a and b are write captured.  In s2, a and c are.
         var s1 = s0.removePromotedAll([a, b], [a, b]);
         var s2 = s0.removePromotedAll([a, c], [a, c]);
@@ -2189,7 +2201,9 @@
             List<String> expectedChain) {
           var h = _Harness();
           var x = _Var('x', _Type('Object?'));
-          var s0 = FlowModel<_Var, _Type>(true).write(x, _Type('Object?'), h);
+          var s0 = FlowModel<_Var, _Type>(true)
+              .declare(x, false)
+              .write(x, _Type('Object?'), h);
           var s1 = thisType == null
               ? s0
               : s0.tryPromote(h, x, _Type(thisType)).ifTrue;
@@ -2241,8 +2255,9 @@
             List<String> inFinally, List<String> expectedResult) {
           var h = _Harness();
           var x = _Var('x', _Type('Object?'));
-          var initialModel =
-              FlowModel<_Var, _Type>(true).write(x, _Type('Object?'), h);
+          var initialModel = FlowModel<_Var, _Type>(true)
+              .declare(x, false)
+              .write(x, _Type('Object?'), h);
           for (var t in before) {
             initialModel = initialModel.tryPromote(h, x, _Type(t)).ifTrue;
           }
@@ -2294,11 +2309,11 @@
         var h = _Harness();
         var x = _Var('x', _Type('Object?'));
         var s0 = FlowModel<_Var, _Type>(true);
-        var s1 = s0.write(x, _Type('Object?'), h);
-        expect(s0.restrict(h, s1, {}), same(s1));
-        expect(s0.restrict(h, s1, {x}), same(s1));
-        expect(s1.restrict(h, s0, {}), same(s1));
-        expect(s1.restrict(h, s0, {x}), same(s1));
+        var s1 = s0.declare(x, false).write(x, _Type('Object?'), h);
+        expect(s0.restrict(h, s1, {}), same(s0));
+        expect(s0.restrict(h, s1, {x}), same(s0));
+        expect(s1.restrict(h, s0, {}), same(s0));
+        expect(s1.restrict(h, s0, {x}), same(s0));
       });
     });
   });
@@ -2850,9 +2865,7 @@
           this, _assignedVariables);
 
   void declare(_Var v, {@required bool initialized}) {
-    if (initialized) {
-      _flow.initialize(v);
-    }
+    _flow.declare(v, initialized);
   }
 
   /// Creates a [LazyExpression] representing an `== null` check performed on
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
index 6b7f51d..e44c4a7 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
@@ -22,12 +22,16 @@
 void isType_mutatedInclosure2() {
   void g(Object x) {
     if (x is String) {
-      x;
+      /*String*/ x;
     }
 
     void h() {
       x = 42;
     }
+
+    if (x is String) {
+      x;
+    }
   }
 }
 
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/inside_closure.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/inside_closure.dart
index 27821bd..56c1c1c 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/inside_closure.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/inside_closure.dart
@@ -6,9 +6,7 @@
   void inner(Object x) {
     if (x is String) {
       f();
-      // TODO(paulberry): x should be promoted here.
-      // See https://github.com/dart-lang/sdk/issues/38791
-      x;
+      /*String*/ x;
     }
     f(() {
       if (x is String) {
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 045c0d5..ef93efe 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -5,7 +5,11 @@
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
-    show Message, LocatedMessage, messageJsInteropIndexNotSupported;
+    show
+        Message,
+        LocatedMessage,
+        messageJsInteropIndexNotSupported,
+        messageJsInteropNonExternalConstructor;
 
 import 'src/js_interop.dart';
 
@@ -31,4 +35,15 @@
           procedure.location.file);
     }
   }
+
+  @override
+  void visitConstructor(Constructor constructor) {
+    if (!constructor.isExternal && !constructor.isSynthetic) {
+      _diagnosticsReporter.report(
+          messageJsInteropNonExternalConstructor,
+          constructor.fileOffset,
+          constructor.name.name.length,
+          constructor.location.file);
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 5c60bc7..a86a695 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -39,6 +39,7 @@
 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:analysis_server/src/search/search_domain.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/server/error_notifier.dart';
@@ -167,11 +168,13 @@
     ResourceProvider baseResourceProvider,
     AnalysisServerOptions options,
     this.sdkManager,
+    CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder,
     this.instrumentationService, {
     this.requestStatistics,
     DiagnosticServer diagnosticServer,
     this.detachableFileSystemManager,
-  }) : super(options, diagnosticServer, baseResourceProvider) {
+  }) : super(options, diagnosticServer, crashReportingAttachmentsBuilder,
+            baseResourceProvider) {
     notificationManager = NotificationManager(channel, resourceProvider);
 
     pluginManager = PluginManager(
@@ -866,15 +869,7 @@
         // TODO(scheglov) Implement notifications for AnalysisService.IMPLEMENTED.
       }
     });
-    analysisDriver.exceptions.listen((nd.ExceptionResult result) {
-      String message = 'Analysis failed: ${result.path}';
-      if (result.contextKey != null) {
-        message += ' context: ${result.contextKey}';
-      }
-      // TODO(39284): should this exception be silent?
-      AnalysisEngine.instance.instrumentationService.logException(
-          SilentException.wrapInMessage(message, result.exception));
-    });
+    analysisDriver.exceptions.listen(analysisServer.logExceptionResult);
     analysisServer.driverMap[folder] = analysisDriver;
     return analysisDriver;
   }
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 18ab156..f77f312 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/context_manager.dart';
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/search/element_visitors.dart';
@@ -39,6 +40,9 @@
   /// The options of this server instance.
   AnalysisServerOptions options;
 
+  /// The builder for attachments that should be included into crash reports.
+  final CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder;
+
   /// The [ContextManager] that handles the mapping from analysis roots to
   /// context directories.
   ContextManager contextManager;
@@ -78,7 +82,6 @@
     '**/*.${AnalysisEngine.SUFFIX_DART}',
     '**/*.${AnalysisEngine.SUFFIX_HTML}',
     '**/*.${AnalysisEngine.SUFFIX_HTM}',
-    '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
     '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
     '**/${AnalysisEngine.PUBSPEC_YAML_FILE}',
     '**/${AnalysisEngine.ANDROID_MANIFEST_FILE}'
@@ -94,7 +97,10 @@
   /// list is lazily created and should be accessed using [analyzedFilesGlobs].
   List<Glob> _analyzedFilesGlobs;
 
-  AbstractAnalysisServer(this.options, this.diagnosticServer,
+  AbstractAnalysisServer(
+      this.options,
+      this.diagnosticServer,
+      this.crashReportingAttachmentsBuilder,
       ResourceProvider baseResourceProvider)
       : resourceProvider = OverlayResourceProvider(baseResourceProvider) {
     performance = performanceDuringStartup;
@@ -288,6 +294,23 @@
     });
   }
 
+  void logExceptionResult(nd.ExceptionResult result) {
+    String message = 'Analysis failed: ${result.filePath}';
+    if (result.contextKey != null) {
+      message += ' context: ${result.contextKey}';
+    }
+
+    var attachments =
+        crashReportingAttachmentsBuilder.forExceptionResult(result);
+
+    // TODO(39284): should this exception be silent?
+    AnalysisEngine.instance.instrumentationService.logException(
+      SilentException.wrapInMessage(message, result.exception),
+      null,
+      attachments,
+    );
+  }
+
   /// Notify the declarations tracker that the file with the given [path] was
   /// changed - added, updated, or removed.  Schedule processing of the file.
   void notifyDeclarationsTracker(String path) {
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md b/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
index 57ad179..be03e90 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
@@ -38,7 +38,7 @@
 Then, run the migration tool from the top-level of the package directory:
 
 ```
-<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart <sdk-repo>/pkg/dartdev/bin/dartdev.dart migrate .
+<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
 ```
 
 The migration tool will run, print the proposed changes to the console, and
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index c800eab..6c2468b 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -173,16 +173,6 @@
       return 'The value of the expression is nullable';
     }
 
-    // Text indicating the type of nullable value found.
-    String nullableValue;
-    if (node is NullLiteral) {
-      nullableValue = "an explicit 'null'";
-    } else if (origin.kind == EdgeOriginKind.dynamicAssignment) {
-      nullableValue = 'a dynamic value, which is nullable';
-    } else {
-      nullableValue = 'a nullable value';
-    }
-
     if (origin.kind == EdgeOriginKind.listLengthConstructor) {
       return 'A length is specified in the "List()" constructor and the list '
           'items are initialized to null';
@@ -205,6 +195,16 @@
           '$lineNumber, which implicitly returns null.';
     }
 
+    // Text indicating the type of nullable value found.
+    String nullableValue;
+    if (node is NullLiteral) {
+      nullableValue = "an explicit 'null'";
+    } else if (origin.kind == EdgeOriginKind.dynamicAssignment) {
+      nullableValue = 'a dynamic value, which is nullable';
+    } else {
+      nullableValue = 'a nullable value';
+    }
+
     /// If the [node] is inside the return expression for a function body,
     /// return the function body. Otherwise return `null`.
     FunctionBody findFunctionBody() {
@@ -263,16 +263,19 @@
         return 'This field is initialized to $nullableValue';
       }
       return 'This variable is initialized to $nullableValue';
-    } else if (node is ConstructorDeclaration &&
-        origin.kind == EdgeOriginKind.fieldNotInitialized) {
-      String constructorName =
-          node.declaredElement.enclosingElement.displayName;
-      if (node.declaredElement.displayName.isNotEmpty) {
-        constructorName =
-            '$constructorName.${node.declaredElement.displayName}';
+    } else if (origin.kind == EdgeOriginKind.fieldNotInitialized) {
+      if (node is ConstructorDeclaration) {
+        String constructorName =
+            node.declaredElement.enclosingElement.displayName;
+        if (node.declaredElement.displayName.isNotEmpty) {
+          constructorName =
+              '$constructorName.${node.declaredElement.displayName}';
+        }
+        return "The constructor '$constructorName' does not initialize this "
+            'field in its initializer list';
+      } else {
+        return 'This field is not initialized';
       }
-      return "The constructor '$constructorName' does not initialize this "
-          'field in its initializer list';
     }
 
     String enclosingMemberDescription = buildEnclosingMemberDescription(node);
@@ -511,6 +514,48 @@
     }).toList();
   }
 
+  TraceEntryInfo _computeTraceEntry(PropagationStepInfo step) {
+    var codeReference = step.codeReference;
+    var length = 1; // TODO(paulberry): figure out the correct value.
+    var description = step.toString(); // TODO(paulberry): improve this message.
+    return TraceEntryInfo(
+        description,
+        codeReference?.function,
+        codeReference == null
+            ? null
+            : NavigationTarget(codeReference.path, codeReference.column,
+                codeReference.line, length));
+  }
+
+  TraceInfo _computeTraceInfo(NullabilityNodeInfo node) {
+    List<TraceEntryInfo> entries = [];
+    var step = node.whyNullable;
+    while (step != null) {
+      entries.add(_computeTraceEntry(step));
+      step = step.principalCause;
+    }
+    var description = node.toString(); // TODO(paulberry): improve this message.
+    return TraceInfo(description, entries);
+  }
+
+  List<TraceInfo> _computeTraces(List<FixReasonInfo> fixReasons) {
+    var nodes = <NullabilityNodeInfo>[];
+    for (var reason in fixReasons) {
+      if (reason is NullabilityNodeInfo) {
+        if (reason.isNullable) {
+          nodes.add(reason);
+        }
+      } else if (reason is EdgeInfo) {
+        assert(reason.sourceNode.isNullable);
+        assert(!reason.destinationNode.isNullable);
+        nodes.add(reason.sourceNode);
+      } else {
+        assert(false, 'Unrecognized reason type: ${reason.runtimeType}');
+      }
+    }
+    return [for (var node in nodes) _computeTraceInfo(node)];
+  }
+
   /// Compute details about [edgeInfos] which are upstream triggered.
   List<RegionDetail> _computeUpstreamTriggeredDetails(
       Iterable<EdgeInfo> edgeInfos) {
@@ -636,15 +681,16 @@
           }
         }
         var lineNumber = lineInfo.getLocation(sourceOffset).lineNumber;
+        var traces = info == null ? const [] : _computeTraces(info.fixReasons);
         if (explanation != null) {
           if (length > 0) {
             regions.add(RegionInfo(RegionType.remove, offset, length,
                 lineNumber, explanation, details,
-                edits: edits));
+                edits: edits, traces: traces));
           } else {
             regions.add(RegionInfo(RegionType.add, offset, replacement.length,
                 lineNumber, explanation, details,
-                edits: edits));
+                edits: edits, traces: traces));
           }
         }
         offset += replacement.length;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
index 1e20583..af22d6b 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
@@ -17,12 +17,16 @@
   /// other.
   final MigrationInfo migrationInfo;
 
+  /// Whether the migration has been applied already or not.
+  final bool hasBeenApplied;
+
   /// An object used to map the file paths of analyzed files to the file paths
   /// of the HTML files used to view the content of those files.
   final PathMapper pathMapper;
 
   /// Creates an output object for the given library info.
-  InstrumentationRenderer(this.migrationInfo, this.pathMapper);
+  InstrumentationRenderer(
+      this.migrationInfo, this.pathMapper, this.hasBeenApplied);
 
   /// Returns the path context used to manipulate paths.
   path.Context get pathContext => migrationInfo.pathContext;
@@ -36,6 +40,7 @@
       'highlightJsPath': migrationInfo.highlightJsPath,
       'highlightStylePath': migrationInfo.highlightStylePath,
       'sdkVersion': _dartSdkVersion,
+      'migrationAppliedStyle': hasBeenApplied ? 'applied' : 'proposed',
     };
 
     return substituteVariables(resources.index_html, variables);
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
index ec86d89..7a86ab0 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
@@ -163,10 +163,14 @@
   /// A list of the edits that are related to this range.
   List<EditDetail> edits;
 
+  /// A list of the nullability propagation traces that are related to this
+  /// range.
+  List<TraceInfo> traces;
+
   /// Initialize a newly created region.
   RegionInfo(this.regionType, this.offset, this.length, this.lineNumber,
       this.explanation, this.details,
-      {this.edits = const []});
+      {this.edits = const [], this.traces = const []});
 }
 
 /// Different types of regions that are called out.
@@ -182,6 +186,32 @@
   unchanged,
 }
 
+/// Information about a single entry in a nullability trace.
+class TraceEntryInfo {
+  /// Text description of the entry.
+  final String description;
+
+  /// Name of the enclosing function, or `null` if not known.
+  String function;
+
+  /// Source code location associated with the entry, or `null` if no source
+  /// code location is known.
+  final NavigationTarget target;
+
+  TraceEntryInfo(this.description, this.function, this.target);
+}
+
+/// Information about a nullability trace.
+class TraceInfo {
+  /// Text description of the trace.
+  final String description;
+
+  /// List of trace entries.
+  final List<TraceEntryInfo> entries;
+
+  TraceInfo(this.description, this.entries);
+}
+
 /// The migration information associated with a single compilation unit.
 class UnitInfo {
   /// The absolute and normalized path of the unit.
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart
index cb75e9f..fc06728 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_state.dart
@@ -13,6 +13,11 @@
 
 /// The state of an NNBD migration.
 class MigrationState {
+  bool _hasBeenApplied = false;
+
+  /// If the migration has been applied to disk.
+  bool get hasBeenApplied => _hasBeenApplied;
+
   /// The migration associated with the state.
   final NullabilityMigration migration;
 
@@ -40,6 +45,7 @@
 
   /// Refresh the state of the migration after the migration has been updated.
   void refresh() async {
+    assert(!hasBeenApplied);
     OverlayResourceProvider provider = listener.server.resourceProvider;
     InfoBuilder infoBuilder = InfoBuilder(provider, includedRoot,
         instrumentationListener.data, listener, adapter, migration);
@@ -49,4 +55,10 @@
         unitInfos, infoBuilder.unitMap, pathContext, includedRoot);
     pathMapper = PathMapper(provider);
   }
+
+  /// Mark that the migration has been applied to disk.
+  void markApplied() {
+    assert(!hasBeenApplied);
+    _hasBeenApplied = true;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart
index 15aef10..f2de90d 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/region_renderer.dart
@@ -72,6 +72,17 @@
               for (var edit in region.edits) linkForEdit(edit),
             ]
           : null,
+      traces: [
+        for (var trace in region.traces)
+          Trace(description: trace.description, entries: [
+            for (var entry in trace.entries)
+              TraceEntry(
+                  description: entry.description,
+                  function: entry.function,
+                  link:
+                      entry.target == null ? null : linkForTarget(entry.target))
+          ])
+      ],
     );
     return response;
   }
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
index 268790b..816c805 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
@@ -7,11 +7,14 @@
     <link rel="stylesheet" href="{{ highlightStylePath }}">
     <style>{{ dartPageStyle }}</style>
 </head>
-<body>
+<body class="{{ migrationAppliedStyle }}">
 <p class="root">{{ root }}</p>
 <header class="elevation-z4">
-    <h1>Proposed null safety changes</h1>
+    <h1 class="before-apply">Proposed null safety changes</h1>
+    <h1 class="after-apply">&#10003; Null safety migration applied</h1>
     <h2 id="unit-name">&nbsp;</h2>
+    <button class="apply-migration before-apply">&#9998; Apply Migration</button>
+    <button class="apply-migration after-apply" disabled>&#9998; Apply Migration</button>
 </header>
 <div class="panels horizontal">
     <div class="nav-panel">
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
index 1731668..f31c153 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
@@ -19,6 +19,14 @@
   overflow: hidden;
 }
 
+.proposed .after-apply {
+  display: none;
+}
+
+.applied .before-apply {
+  display: none;
+}
+
 header {
   background-color: #1c2834;
   height: 48px;
@@ -43,6 +51,12 @@
   font-size: 1.2em;
 }
 
+header .apply-migration {
+  right: 0px;
+  float: right;
+  margin: 10px;
+}
+
 footer {
   color: #ccc;
   background-color: #27323a;
@@ -343,7 +357,9 @@
 }
 
 .elevation-z4 {
-  box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, .12);
+  box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2),
+      0px 4px 5px 0px rgba(0, 0, 0, 0.14),
+      0px 1px 10px 0px rgba(0, 0, 0, .12);
 }
 
 a {
@@ -357,8 +373,40 @@
   fill: #fff;
 }
 
+button {
+  background-color: #33ccff;
+  border: 2px solid #37aedc;
+  border-radius: 3px;
+  padding: 6px 10px;
+  font-weight: bold;
+  color: #282828;
+}
+
+button:hover {
+  background-color: #80dfff;
+  border: 2px solid #52b8e0;
+  cursor: pointer;
+}
+
+button[disabled] {
+  background-color: #7aa8b8;
+  color: #507177;
+  border: 2px solid #507177;
+  cursor: not-allowed;
+}
+
 .placeholder {
   color: #777;
   text-align: center;
   margin-top: 3em !important;
 }
+
+/**
+ * HLJS Overrides
+ */
+.hljs {
+  /**
+   * This allows the per-line highlights to show.
+   */
+  background: none;
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
index b23d392..9f81bbc 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
@@ -270,7 +270,7 @@
 ''';
 
 String _index_html;
-// index_html md5 is '4b7dce061ab7cce3c431e0ad8f642b6c'
+// index_html md5 is '4ba111f269b722a6918f949e993b1238'
 String _index_html_base64 = '''
 PGh0bWw+CjxoZWFkPgogICAgPHRpdGxlPk51bGwgU2FmZXR5IFByZXZpZXc8L3RpdGxlPgogICAgPHNj
 cmlwdCBzcmM9Int7IGhpZ2hsaWdodEpzUGF0aCB9fSI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pnt7IGRh
@@ -278,39 +278,44 @@
 dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcGVuK1NhbnM6NDAwLDYwMCZkaXNw
 bGF5PXN3YXAiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7eyBoaWdobGlnaHRTdHls
 ZVBhdGggfX0iPgogICAgPHN0eWxlPnt7IGRhcnRQYWdlU3R5bGUgfX08L3N0eWxlPgo8L2hlYWQ+Cjxi
-b2R5Pgo8cCBjbGFzcz0icm9vdCI+e3sgcm9vdCB9fTwvcD4KPGhlYWRlciBjbGFzcz0iZWxldmF0aW9u
-LXo0Ij4KICAgIDxoMT5Qcm9wb3NlZCBudWxsIHNhZmV0eSBjaGFuZ2VzPC9oMT4KICAgIDxoMiBpZD0i
-dW5pdC1uYW1lIj4mbmJzcDs8L2gyPgo8L2hlYWRlcj4KPGRpdiBjbGFzcz0icGFuZWxzIGhvcml6b250
-YWwiPgogICAgPGRpdiBjbGFzcz0ibmF2LXBhbmVsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtaW5u
-ZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj5Qcm9qZWN0IEZpbGVzPC9k
-aXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi10cmVlIj48L2Rpdj4KICAgICAgICA8L2Rpdj48
-IS0tIC9uYXYtaW5uZXIgLS0+CiAgICA8L2Rpdj48IS0tIC9uYXYgLS0+CiAgICA8ZGl2IGNsYXNzPSJj
-b250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJyZWdpb25zIj4KICAgICAgICAgICAgPCEtLSBUaGUg
-cmVnaW9ucyBvdmVybGF5IGNvZGUgY29weSBvZiB0aGUgY29udGVudCB0byBwcm92aWRlIC0tPgogICAg
-ICAgICAgICA8IS0tIHRvb2x0aXBzIGZvciBtb2RpZmllZCByZWdpb25zLiAtLT4KICAgICAgICA8L2Rp
-dj48IS0tIC9yZWdpb25zIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUiPgogICAgICAgICAgICA8
-IS0tIENvbXBpbGF0aW9uIHVuaXQgY29udGVudCBpcyB3cml0dGVuIGhlcmUuIC0tPgogICAgICAgICAg
-ICA8cCBjbGFzcz0id2VsY29tZSI+CiAgICAgICAgICAgICAgICBTZWxlY3QgYSBzb3VyY2UgZmlsZSBv
-biB0aGUgbGVmdCB0byBwcmV2aWV3IHRoZSBwcm9wb3NlZCBlZGl0cy4KICAgICAgICAgICAgPC9wPgog
-ICAgICAgIDwvZGl2PgogICAgPC9kaXY+PCEtLSAvY29udGVudCAtLT4KICAgIDxkaXYgY2xhc3M9Imlu
-Zm8tcGFuZWwiPgogICAgICAgIDxkaXYgY2xhc3M9ImVkaXQtbGlzdCI+CiAgICAgICAgICAgIDxkaXYg
-Y2xhc3M9InBhbmVsLWhlYWRpbmciPlByb3Bvc2VkIEVkaXRzPC9kaXY+CiAgICAgICAgICAgIDxkaXYg
-Y2xhc3M9InBhbmVsLWNvbnRlbnQiPjwvZGl2PgogICAgICAgIDwvZGl2PjwhLS0gL2VkaXQtbGlzdCAt
-LT4KICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0LXBhbmVsIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0i
-cGFuZWwtaGVhZGluZyI+RWRpdCBEZXRhaWxzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBh
-bmVsLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9InBsYWNlaG9sZGVyIj5TZWUgZGV0
-YWlscyBhYm91dCBhIHByb3Bvc2VkIGVkaXQuPC9wPgogICAgICAgICAgICA8L2Rpdj48IS0tIC9wYW5l
-bC1jb250ZW50IC0tPgogICAgICAgIDwvZGl2PjwhLS0gL2VkaXQtcGFuZWwgLS0+CiAgICA8L2Rpdj48
-IS0tIC9pbmZvLXBhbmVsIC0tPgo8L2Rpdj48IS0tIC9wYW5lbHMgLS0+Cjxmb290ZXI+CiAgICA8YSB0
-YXJnZXQ9Il9ibGFuayIKICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2Rr
-L2Jsb2IvbWFzdGVyL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9lZGl0L25uYmRfbWlncmF0aW9u
-L1JFQURNRS5tZCI+TnVsbAogICAgICAgIHNhZmV0eSBtaWdyYXRpb24gaGVscDwvYT4KICAgIDxzcGFu
-IGNsYXNzPSJ3aWRlIj4gPC9zcGFuPgogICAgPGRpdj5CYXNlZCBvbiB7eyBzZGtWZXJzaW9uIH19PC9k
-aXY+CjwvZm9vdGVyPgo8L2JvZHk+CjwvaHRtbD4K
+b2R5IGNsYXNzPSJ7eyBtaWdyYXRpb25BcHBsaWVkU3R5bGUgfX0iPgo8cCBjbGFzcz0icm9vdCI+e3sg
+cm9vdCB9fTwvcD4KPGhlYWRlciBjbGFzcz0iZWxldmF0aW9uLXo0Ij4KICAgIDxoMSBjbGFzcz0iYmVm
+b3JlLWFwcGx5Ij5Qcm9wb3NlZCBudWxsIHNhZmV0eSBjaGFuZ2VzPC9oMT4KICAgIDxoMSBjbGFzcz0i
+YWZ0ZXItYXBwbHkiPiYjMTAwMDM7IE51bGwgc2FmZXR5IG1pZ3JhdGlvbiBhcHBsaWVkPC9oMT4KICAg
+IDxoMiBpZD0idW5pdC1uYW1lIj4mbmJzcDs8L2gyPgogICAgPGJ1dHRvbiBjbGFzcz0iYXBwbHktbWln
+cmF0aW9uIGJlZm9yZS1hcHBseSI+JiM5OTk4OyBBcHBseSBNaWdyYXRpb248L2J1dHRvbj4KICAgIDxi
+dXR0b24gY2xhc3M9ImFwcGx5LW1pZ3JhdGlvbiBhZnRlci1hcHBseSIgZGlzYWJsZWQ+JiM5OTk4OyBB
+cHBseSBNaWdyYXRpb248L2J1dHRvbj4KPC9oZWFkZXI+CjxkaXYgY2xhc3M9InBhbmVscyBob3Jpem9u
+dGFsIj4KICAgIDxkaXYgY2xhc3M9Im5hdi1wYW5lbCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmF2LWlu
+bmVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+UHJvamVjdCBGaWxlczwv
+ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtdHJlZSI+PC9kaXY+CiAgICAgICAgPC9kaXY+
+PCEtLSAvbmF2LWlubmVyIC0tPgogICAgPC9kaXY+PCEtLSAvbmF2IC0tPgogICAgPGRpdiBjbGFzcz0i
+Y29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0icmVnaW9ucyI+CiAgICAgICAgICAgIDwhLS0gVGhl
+IHJlZ2lvbnMgb3ZlcmxheSBjb2RlIGNvcHkgb2YgdGhlIGNvbnRlbnQgdG8gcHJvdmlkZSAtLT4KICAg
+ICAgICAgICAgPCEtLSB0b29sdGlwcyBmb3IgbW9kaWZpZWQgcmVnaW9ucy4gLS0+CiAgICAgICAgPC9k
+aXY+PCEtLSAvcmVnaW9ucyAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlIj4KICAgICAgICAgICAg
+PCEtLSBDb21waWxhdGlvbiB1bml0IGNvbnRlbnQgaXMgd3JpdHRlbiBoZXJlLiAtLT4KICAgICAgICAg
+ICAgPHAgY2xhc3M9IndlbGNvbWUiPgogICAgICAgICAgICAgICAgU2VsZWN0IGEgc291cmNlIGZpbGUg
+b24gdGhlIGxlZnQgdG8gcHJldmlldyB0aGUgcHJvcG9zZWQgZWRpdHMuCiAgICAgICAgICAgIDwvcD4K
+ICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PjwhLS0gL2NvbnRlbnQgLS0+CiAgICA8ZGl2IGNsYXNzPSJp
+bmZvLXBhbmVsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0LWxpc3QiPgogICAgICAgICAgICA8ZGl2
+IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj5Qcm9wb3NlZCBFZGl0czwvZGl2PgogICAgICAgICAgICA8ZGl2
+IGNsYXNzPSJwYW5lbC1jb250ZW50Ij48L2Rpdj4KICAgICAgICA8L2Rpdj48IS0tIC9lZGl0LWxpc3Qg
+LS0+CiAgICAgICAgPGRpdiBjbGFzcz0iZWRpdC1wYW5lbCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9
+InBhbmVsLWhlYWRpbmciPkVkaXQgRGV0YWlsczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJw
+YW5lbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJwbGFjZWhvbGRlciI+U2VlIGRl
+dGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LjwvcD4KICAgICAgICAgICAgPC9kaXY+PCEtLSAvcGFu
+ZWwtY29udGVudCAtLT4KICAgICAgICA8L2Rpdj48IS0tIC9lZGl0LXBhbmVsIC0tPgogICAgPC9kaXY+
+PCEtLSAvaW5mby1wYW5lbCAtLT4KPC9kaXY+PCEtLSAvcGFuZWxzIC0tPgo8Zm9vdGVyPgogICAgPGEg
+dGFyZ2V0PSJfYmxhbmsiCiAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nk
+ay9ibG9iL21hc3Rlci9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZWRpdC9ubmJkX21pZ3JhdGlv
+bi9SRUFETUUubWQiPk51bGwKICAgICAgICBzYWZldHkgbWlncmF0aW9uIGhlbHA8L2E+CiAgICA8c3Bh
+biBjbGFzcz0id2lkZSI+IDwvc3Bhbj4KICAgIDxkaXY+QmFzZWQgb24ge3sgc2RrVmVyc2lvbiB9fTwv
+ZGl2Pgo8L2Zvb3Rlcj4KPC9ib2R5Pgo8L2h0bWw+Cg==
 ''';
 
 String _migration_css;
-// migration_css md5 is '3dd01166e0d763c78218c1a36155bbfb'
+// migration_css md5 is '72c8740ee7c14a4d5de701dad4ed2f13'
 String _migration_css_base64 = '''
 LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
 dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -320,94 +325,105 @@
 dC1mYW1pbHk6ICJSb2JvdG8iLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTRweDsKICBkaXNwbGF5
 OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRv
 cDogMDsKICByaWdodDogMDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICBtYXJnaW46IDA7CiAgcGFk
-ZGluZzogMDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgpoZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6
-ICMxYzI4MzQ7CiAgaGVpZ2h0OiA0OHB4OwogIHBhZGRpbmctbGVmdDogMjRweDsKICBhbGlnbi1pdGVt
-czogY2VudGVyOwogIHotaW5kZXg6IDQ7Cn0KCmhlYWRlciBoMSwKaGVhZGVyIGgyIHsKICBkaXNwbGF5
-OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1mYW1pbHk6ICJHb29nbGUgU2FucyIsIlJvYm90byIsc2Fucy1z
-ZXJpZjsKICBmb250LXdlaWdodDogNDAwOwogIG1hcmdpbi1yaWdodDogMjRweDsKfQoKaDEgewogIGZv
-bnQtc2l6ZTogMS41ZW07Cn0KCmhlYWRlciBoMiB7CiAgZm9udC1zaXplOiAxLjJlbTsKfQoKZm9vdGVy
-IHsKICBjb2xvcjogI2NjYzsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjczMjNhOwogIGRpc3BsYXk6IGZs
-ZXg7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6
-IDhweCAyNHB4Owp9Cgpmb290ZXIgLndpZGUgewogIGZsZXg6IDE7Cn0KCi5ob3Jpem9udGFsIHsKICBk
-aXNwbGF5OiBmbGV4Owp9CgoucGFuZWxzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIxYTI1OwogIGZs
-ZXg6IDE7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBhbmVsLWhlYWRpbmcgewogIGNvbG9yOiBncmF5
-OwogIG1hcmdpbjogOHB4Owp9CgoubmF2LWxpbmssCi5yZWdpb24gewogIGN1cnNvcjogcG9pbnRlcjsK
-fQoKLm5hdi1wYW5lbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI4MmIyZTsKICBmbGV4OiAxIDIwMHB4
-OwogIG1hcmdpbjogMDsKICBvdmVyZmxvdzogc2Nyb2xsOwp9CgoubmF2LWlubmVyIHsKICBwYWRkaW5n
-OiAwIDAgN3B4IDdweDsKfQoKLmZpeGVkIHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAwOwp9Cgou
-cm9vdCB7CiAgbWFyZ2luOiAwOwogIGRpc3BsYXk6IG5vbmU7Cn0KCi5uYXYtdHJlZSA+IHVsIHsKICBw
-YWRkaW5nLWxlZnQ6IDZweDsKfQoKLm5hdi1pbm5lciB1bCB7CiAgcGFkZGluZy1sZWZ0OiAxMnB4Owog
-IG1hcmdpbjogMDsKfQoKLm5hdi1pbm5lciBsaSB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwp9Cgou
-bmF2LWlubmVyIGxpOm5vdCguZGlyKSB7CiAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgbWFyZ2luLWJvdHRv
-bTogM3B4Owp9CgoubmF2LWlubmVyIGxpLmRpciAuYXJyb3cgewogIGN1cnNvcjogcG9pbnRlcjsKICBk
-aXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMHB4OwogIG1hcmdpbi1yaWdodDogNHB4
-OwogIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjVzIGVhc2Utb3V0Owp9CgoubmF2LWlubmVyIGxpLmRp
-ciAuYXJyb3cuY29sbGFwc2VkIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwp9CgoubmF2LWlu
-bmVyIHVsIHsKICBtYXgtaGVpZ2h0OiAyMDAwcHg7CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVz
-IGVhc2Utb3V0Owp9CgoubmF2LWlubmVyIHVsLmNvbGxhcHNlZCB7CiAgbWF4LWhlaWdodDogMCAhaW1w
-b3J0YW50OwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5uYXYtaW5uZXIgLnNlbGVjdGVkLWZpbGUgewog
-IGNvbG9yOiB3aGl0ZTsKICBjdXJzb3I6IGluaGVyaXQ7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB0ZXh0
-LWRlY29yYXRpb246IG5vbmU7Cn0KCi5lZGl0LWNvdW50IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzdh
-ZWRjOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgY29sb3I6ICMwMDAwMDA7CiAgZGlzcGxheTogaW5s
-aW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTFweDsKICBmb250LXdlaWdodDogNjAwOwogIG1hcmdpbi1s
-ZWZ0OiA1cHg7CiAgbWluLXdpZHRoOiAyNXB4OwogIHBhZGRpbmc6IDRweCAwIDJweCAwOwogIHRleHQt
-YWxpZ246IGNlbnRlcjsKICBsaW5lLWhlaWdodDogMWVtOwp9CgouY29udGVudCB7CiAgZmxleDogNCAz
-MDBweDsKICBiYWNrZ3JvdW5kOiAjMjgyYjJlOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgbWFy
-Z2luOiAwIDZweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBvdmVy
-Zmxvdzogc2Nyb2xsOwp9CgouY29kZSB7CiAgcGFkZGluZzogMC41ZW07CiAgcG9zaXRpb246IGFic29s
-dXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwogIG1hcmdpbi1sZWZ0OiA1NnB4Owp9CgouaGxqcyB7CiAg
-YmFja2dyb3VuZC1jb2xvcjogIzI4MmIyZTsKICBkaXNwbGF5OiBibG9jazsKICBvdmVyZmxvdy14OiBh
-dXRvOwogIHBhZGRpbmc6IDAuNWVtOwp9CgouY29kZSAud2VsY29tZSB7CiAgZm9udC1mYW1pbHk6ICJH
-b29nbGUgU2FucyIsIlJvYm90byIsc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE4cHg7CiAgbWFyZ2lu
-LXJpZ2h0OiA2MnB4OwogIGNvbG9yOiAjNzc3Owp9CgouY29kZSAubmF2LWxpbmsgewogIGNvbG9yOiBp
-bmhlcml0OwogIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lOwp9CgouY29kZSAubmF2LWxpbms6dmlz
-aXRlZCB7CiAgY29sb3I6IGluaGVyaXQ7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7Cn0KCi5j
-b2RlIC5uYXYtbGluazpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTsKICBm
-b250LXdlaWdodDogNjAwOwp9CgoucmVnaW9ucyB7CiAgcGFkZGluZzogMC41ZW07CiAgcG9zaXRpb246
-IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwp9CgoucmVnaW9ucyB0YWJsZSB7CiAgYm9yZGVy
-LXNwYWNpbmc6IDA7CiAgZm9udC1zaXplOiBpbmhlcml0Owp9CgoucmVnaW9ucyB0ZCB7CiAgYm9yZGVy
-OiBub25lOwogIC8qIFRoZSBjb250ZW50IG9mIHRoZSByZWdpb25zIGlzIG5vdCB2aXNpYmxlOyB0aGUg
-dXNlciBpbnN0ZWFkIHdpbGwgc2VlIHRoZQogICAqIGhpZ2hsaWdodGVkIGNvcHkgb2YgdGhlIGNvbnRl
-bnQuICovCiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMCk7CiAgcGFkZGluZzogMDsKICB3aGl0
-ZS1zcGFjZTogcHJlOwp9CgoucmVnaW9ucyB0ZDplbXB0eTphZnRlciB7CiAgY29udGVudDogIlwwMGEw
-IjsKfQoKLnJlZ2lvbnMgdHIuaGlnaGxpZ2h0IHRkOmxhc3QtY2hpbGQgewogIGJhY2tncm91bmQtY29s
-b3I6ICM0NDQ0NDQ7CiAgY29sb3I6IHdoaXRlOwp9CgoucmVnaW9ucyB0ZC5saW5lLW5vIHsKICBib3Jk
-ZXItcmlnaHQ6IHNvbGlkICMyODJiMmUgMnB4OwogIGNvbG9yOiAjOTk5OTk5OwogIHBhZGRpbmctcmln
-aHQ6IDRweDsKICB0ZXh0LWFsaWduOiByaWdodDsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIHdpZHRo
-OiA1MHB4OwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnJlZ2lvbnMgdHIuaGlnaGxpZ2h0IHRk
-LmxpbmUtbm8gewogIGJvcmRlci1yaWdodDogc29saWQgI2NjYyAycHg7Cn0KCi5yZWdpb24gewogIGRp
-c3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlz
-aWJsZTsKICB6LWluZGV4OiAyMDA7Cn0KCi5yZWdpb24uYWRkZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5k
-LWNvbG9yOiAjY2NmZmNjOwogIGNvbG9yOiAjMDAzMzAwOwp9CgoucmVnaW9uLnJlbW92ZWQtcmVnaW9u
-IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9u
-LnVuY2hhbmdlZC1yZWdpb24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsK
-ICBib3JkZXItYm90dG9tOiBzb2xpZCAycHggI2NjYzsKICAvKiBJbnZpc2libGUgdGV4dDsgdXNlIHVu
-ZGVybHlpbmcgaGlnaGxpZ2h0aW5nLiAqLwogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogIC8qIFJl
-ZHVjZSBsaW5lIGhlaWdodCB0byBtYWtlIHJvb20gZm9yIGJvcmRlci4gKi8KICBsaW5lLWhlaWdodDog
-MTsKfQoKLnRhcmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRp
-dmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5l
-bCB7CiAgZmxleDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6
-IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwg
-ewogIGJhY2tncm91bmQtY29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBh
-bmVsIC5wYW5lbC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1j
-b250ZW50PiA6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dy
-YXAgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBv
-bCB7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAg
-NXB4IDA7Cn0KCi5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAu
-ZWRpdC1saXN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9
-CgouZWRpdC1wYW5lbCB7CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0
-LWxpc3QgewogIGZsZXg6IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4
-IDA7Cn0KCi5lZGl0LWxpc3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgouZWxldmF0
-aW9uLXo0IHsKICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwg
-MHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggMTBweCAwcHggcmdiYSgw
-LCAwLCAwLCAuMTIpOwp9CgphIHsKICBjb2xvcjogI2NjYzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVj
-b3JhdGlvbjogbm9uZTsKfQoKYTpob3ZlciB7CiAgY29sb3I6ICNmZmY7CiAgZmlsbDogI2ZmZjsKfQoK
-LnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2lu
-LXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0K
+ZGluZzogMDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucHJvcG9zZWQgLmFmdGVyLWFwcGx5IHsKICBk
+aXNwbGF5OiBub25lOwp9CgouYXBwbGllZCAuYmVmb3JlLWFwcGx5IHsKICBkaXNwbGF5OiBub25lOwp9
+CgpoZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6ICMxYzI4MzQ7CiAgaGVpZ2h0OiA0OHB4OwogIHBh
+ZGRpbmctbGVmdDogMjRweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHotaW5kZXg6IDQ7Cn0KCmhl
+YWRlciBoMSwKaGVhZGVyIGgyIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1mYW1pbHk6
+ICJHb29nbGUgU2FucyIsIlJvYm90byIsc2Fucy1zZXJpZjsKICBmb250LXdlaWdodDogNDAwOwogIG1h
+cmdpbi1yaWdodDogMjRweDsKfQoKaDEgewogIGZvbnQtc2l6ZTogMS41ZW07Cn0KCmhlYWRlciBoMiB7
+CiAgZm9udC1zaXplOiAxLjJlbTsKfQoKaGVhZGVyIC5hcHBseS1taWdyYXRpb24gewogIHJpZ2h0OiAw
+cHg7CiAgZmxvYXQ6IHJpZ2h0OwogIG1hcmdpbjogMTBweDsKfQoKZm9vdGVyIHsKICBjb2xvcjogI2Nj
+YzsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjczMjNhOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJl
+Y3Rpb246IHJvdzsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IDhweCAyNHB4Owp9Cgpm
+b290ZXIgLndpZGUgewogIGZsZXg6IDE7Cn0KCi5ob3Jpem9udGFsIHsKICBkaXNwbGF5OiBmbGV4Owp9
+CgoucGFuZWxzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIxYTI1OwogIGZsZXg6IDE7CiAgb3ZlcmZs
+b3c6IGhpZGRlbjsKfQoKLnBhbmVsLWhlYWRpbmcgewogIGNvbG9yOiBncmF5OwogIG1hcmdpbjogOHB4
+Owp9CgoubmF2LWxpbmssCi5yZWdpb24gewogIGN1cnNvcjogcG9pbnRlcjsKfQoKLm5hdi1wYW5lbCB7
+CiAgYmFja2dyb3VuZC1jb2xvcjogIzI4MmIyZTsKICBmbGV4OiAxIDIwMHB4OwogIG1hcmdpbjogMDsK
+ICBvdmVyZmxvdzogc2Nyb2xsOwp9CgoubmF2LWlubmVyIHsKICBwYWRkaW5nOiAwIDAgN3B4IDdweDsK
+fQoKLmZpeGVkIHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAwOwp9Cgoucm9vdCB7CiAgbWFyZ2lu
+OiAwOwogIGRpc3BsYXk6IG5vbmU7Cn0KCi5uYXYtdHJlZSA+IHVsIHsKICBwYWRkaW5nLWxlZnQ6IDZw
+eDsKfQoKLm5hdi1pbm5lciB1bCB7CiAgcGFkZGluZy1sZWZ0OiAxMnB4OwogIG1hcmdpbjogMDsKfQoK
+Lm5hdi1pbm5lciBsaSB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwp9CgoubmF2LWlubmVyIGxpOm5v
+dCguZGlyKSB7CiAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubmF2
+LWlubmVyIGxpLmRpciAuYXJyb3cgewogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUt
+YmxvY2s7CiAgZm9udC1zaXplOiAxMHB4OwogIG1hcmdpbi1yaWdodDogNHB4OwogIHRyYW5zaXRpb246
+IHRyYW5zZm9ybSAwLjVzIGVhc2Utb3V0Owp9CgoubmF2LWlubmVyIGxpLmRpciAuYXJyb3cuY29sbGFw
+c2VkIHsKICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwp9CgoubmF2LWlubmVyIHVsIHsKICBtYXgt
+aGVpZ2h0OiAyMDAwcHg7CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2Utb3V0Owp9Cgou
+bmF2LWlubmVyIHVsLmNvbGxhcHNlZCB7CiAgbWF4LWhlaWdodDogMCAhaW1wb3J0YW50OwogIG92ZXJm
+bG93OiBoaWRkZW47Cn0KCi5uYXYtaW5uZXIgLnNlbGVjdGVkLWZpbGUgewogIGNvbG9yOiB3aGl0ZTsK
+ICBjdXJzb3I6IGluaGVyaXQ7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB0ZXh0LWRlY29yYXRpb246IG5v
+bmU7Cn0KCi5lZGl0LWNvdW50IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzdhZWRjOwogIGJvcmRlci1y
+YWRpdXM6IDEwcHg7CiAgY29sb3I6ICMwMDAwMDA7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZv
+bnQtc2l6ZTogMTFweDsKICBmb250LXdlaWdodDogNjAwOwogIG1hcmdpbi1sZWZ0OiA1cHg7CiAgbWlu
+LXdpZHRoOiAyNXB4OwogIHBhZGRpbmc6IDRweCAwIDJweCAwOwogIHRleHQtYWxpZ246IGNlbnRlcjsK
+ICBsaW5lLWhlaWdodDogMWVtOwp9CgouY29udGVudCB7CiAgZmxleDogNCAzMDBweDsKICBiYWNrZ3Jv
+dW5kOiAjMjgyYjJlOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgbWFyZ2luOiAwIDZweDsKICBw
+b3NpdGlvbjogcmVsYXRpdmU7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBvdmVyZmxvdzogc2Nyb2xsOwp9
+CgouY29kZSB7CiAgcGFkZGluZzogMC41ZW07CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7
+CiAgdG9wOiAwOwogIG1hcmdpbi1sZWZ0OiA1NnB4Owp9CgouaGxqcyB7CiAgYmFja2dyb3VuZC1jb2xv
+cjogIzI4MmIyZTsKICBkaXNwbGF5OiBibG9jazsKICBvdmVyZmxvdy14OiBhdXRvOwogIHBhZGRpbmc6
+IDAuNWVtOwp9CgouY29kZSAud2VsY29tZSB7CiAgZm9udC1mYW1pbHk6ICJHb29nbGUgU2FucyIsIlJv
+Ym90byIsc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE4cHg7CiAgbWFyZ2luLXJpZ2h0OiA2MnB4Owog
+IGNvbG9yOiAjNzc3Owp9CgouY29kZSAubmF2LWxpbmsgewogIGNvbG9yOiBpbmhlcml0OwogIHRleHQt
+ZGVjb3JhdGlvbi1saW5lOiBub25lOwp9CgouY29kZSAubmF2LWxpbms6dmlzaXRlZCB7CiAgY29sb3I6
+IGluaGVyaXQ7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7Cn0KCi5jb2RlIC5uYXYtbGluazpo
+b3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTsKICBmb250LXdlaWdodDogNjAw
+Owp9CgoucmVnaW9ucyB7CiAgcGFkZGluZzogMC41ZW07CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxl
+ZnQ6IDA7CiAgdG9wOiAwOwp9CgoucmVnaW9ucyB0YWJsZSB7CiAgYm9yZGVyLXNwYWNpbmc6IDA7CiAg
+Zm9udC1zaXplOiBpbmhlcml0Owp9CgoucmVnaW9ucyB0ZCB7CiAgYm9yZGVyOiBub25lOwogIC8qIFRo
+ZSBjb250ZW50IG9mIHRoZSByZWdpb25zIGlzIG5vdCB2aXNpYmxlOyB0aGUgdXNlciBpbnN0ZWFkIHdp
+bGwgc2VlIHRoZQogICAqIGhpZ2hsaWdodGVkIGNvcHkgb2YgdGhlIGNvbnRlbnQuICovCiAgY29sb3I6
+IHJnYmEoMjU1LCAyNTUsIDI1NSwgMCk7CiAgcGFkZGluZzogMDsKICB3aGl0ZS1zcGFjZTogcHJlOwp9
+CgoucmVnaW9ucyB0ZDplbXB0eTphZnRlciB7CiAgY29udGVudDogIlwwMGEwIjsKfQoKLnJlZ2lvbnMg
+dHIuaGlnaGxpZ2h0IHRkOmxhc3QtY2hpbGQgewogIGJhY2tncm91bmQtY29sb3I6ICM0NDQ0NDQ7CiAg
+Y29sb3I6IHdoaXRlOwp9CgoucmVnaW9ucyB0ZC5saW5lLW5vIHsKICBib3JkZXItcmlnaHQ6IHNvbGlk
+ICMyODJiMmUgMnB4OwogIGNvbG9yOiAjOTk5OTk5OwogIHBhZGRpbmctcmlnaHQ6IDRweDsKICB0ZXh0
+LWFsaWduOiByaWdodDsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIHdpZHRoOiA1MHB4OwogIGRpc3Bs
+YXk6IGlubGluZS1ibG9jazsKfQoKLnJlZ2lvbnMgdHIuaGlnaGxpZ2h0IHRkLmxpbmUtbm8gewogIGJv
+cmRlci1yaWdodDogc29saWQgI2NjYyAycHg7Cn0KCi5yZWdpb24gewogIGRpc3BsYXk6IGlubGluZS1i
+bG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB6LWluZGV4
+OiAyMDA7Cn0KCi5yZWdpb24uYWRkZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NmZmNj
+OwogIGNvbG9yOiAjMDAzMzAwOwp9CgoucmVnaW9uLnJlbW92ZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5k
+LWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLnVuY2hhbmdlZC1yZWdp
+b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICBib3JkZXItYm90dG9t
+OiBzb2xpZCAycHggI2NjYzsKICAvKiBJbnZpc2libGUgdGV4dDsgdXNlIHVuZGVybHlpbmcgaGlnaGxp
+Z2h0aW5nLiAqLwogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogIC8qIFJlZHVjZSBsaW5lIGhlaWdo
+dCB0byBtYWtlIHJvb20gZm9yIGJvcmRlci4gKi8KICBsaW5lLWhlaWdodDogMTsKfQoKLnRhcmdldCB7
+CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0
+eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAy
+MDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1k
+aXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQt
+Y29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250
+ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3Qt
+Y2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNw
+YWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1s
+ZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZv
+LXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBi
+YWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7
+CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6
+IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxp
+c3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgouZWxldmF0aW9uLXo0IHsKICBib3gt
+c2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwKICAgICAgMHB4IDRweCA1
+cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAw
+LCAwLCAuMTIpOwp9CgphIHsKICBjb2xvcjogI2NjYzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVjb3Jh
+dGlvbjogbm9uZTsKfQoKYTpob3ZlciB7CiAgY29sb3I6ICNmZmY7CiAgZmlsbDogI2ZmZjsKfQoKYnV0
+dG9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzNjY2ZmOwogIGJvcmRlcjogMnB4IHNvbGlkICMzN2Fl
+ZGM7CiAgYm9yZGVyLXJhZGl1czogM3B4OwogIHBhZGRpbmc6IDZweCAxMHB4OwogIGZvbnQtd2VpZ2h0
+OiBib2xkOwogIGNvbG9yOiAjMjgyODI4Owp9CgpidXR0b246aG92ZXIgewogIGJhY2tncm91bmQtY29s
+b3I6ICM4MGRmZmY7CiAgYm9yZGVyOiAycHggc29saWQgIzUyYjhlMDsKICBjdXJzb3I6IHBvaW50ZXI7
+Cn0KCmJ1dHRvbltkaXNhYmxlZF0gewogIGJhY2tncm91bmQtY29sb3I6ICM3YWE4Yjg7CiAgY29sb3I6
+ICM1MDcxNzc7CiAgYm9yZGVyOiAycHggc29saWQgIzUwNzE3NzsKICBjdXJzb3I6IG5vdC1hbGxvd2Vk
+Owp9CgoucGxhY2Vob2xkZXIgewogIGNvbG9yOiAjNzc3OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBt
+YXJnaW4tdG9wOiAzZW0gIWltcG9ydGFudDsKfQoKLyoqCiAqIEhMSlMgT3ZlcnJpZGVzCiAqLwouaGxq
+cyB7CiAgLyoqCiAgICogVGhpcyBhbGxvd3MgdGhlIHBlci1saW5lIGhpZ2hsaWdodHMgdG8gc2hvdy4K
+ICAgKi8KICBiYWNrZ3JvdW5kOiBub25lOwp9
 ''';
 
 String _migration_js;
-// migration_dart md5 is '92e41b045d06e490bbc16aff5920468f'
+// migration_dart md5 is 'fc62e2786d8e19ca0ecf5d3110278b11'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgdD1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXQpiW3JdPWFb
@@ -1135,7 +1151,7 @@
 PWMuYwpkLmE9Ywpjb250aW51ZX1lbHNlIFAuQTkoYyxrKQpyZXR1cm59fWY9Yi5iCmc9cy5iKGYuYykK
 Zi5jPW51bGwKYj1mLk44KGcpCmM9cS5hCmw9cS5iCmlmKCFjKXtmLiR0aS5kLmIobCkKZi5hPTQKZi5j
 PWx9ZWxzZXt0LmIobCkKZi5hPTgKZi5jPWx9ZC5hPWYKYz1mfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFy
-IHQ9dS53CmlmKHQuYyhhKSlyZXR1cm4gdC5iKGEpCnQ9dS55CmlmKHQuYyhhKSlyZXR1cm4gdC5iKGEp
+IHQ9dS5XCmlmKHQuYyhhKSlyZXR1cm4gdC5iKGEpCnQ9dS55CmlmKHQuYyhhKSlyZXR1cm4gdC5iKGEp
 CnRocm93IEguYihQLkwzKGEsIm9uRXJyb3IiLCJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBP
 YmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVy
 biBhIGEgdmFsaWQgcmVzdWx0IikpfSwKcHU6ZnVuY3Rpb24oKXt2YXIgdCxzCmZvcig7dD0kLlM2LHQh
@@ -1593,7 +1609,8 @@
 dW5jdGlvbiBpSigpe30sCmxSOmZ1bmN0aW9uIGxSKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApqZzpm
 dW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlz
 LmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5h
-PWF9LApoRjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscgpILnhk
+PWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEo
+KXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscgpILnhk
 KGIpCnUuai5iKGQpCmlmKEgub1QoYikpe3Q9W2NdCkMuTm0uRlYodCxkKQpkPXR9cz11LnoKcj1QLkNI
 KEouTTEoZCxQLncwKCkscyksITAscykKdS5aLmIoYSkKcmV0dXJuIFAud1koSC5FayhhLHIsbnVsbCkp
 fSwKRG06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYh
@@ -1602,14 +1619,14 @@
 OmZ1bmN0aW9uKGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikp
 cmV0dXJuIGFbYl0KcmV0dXJufSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlwZW9mIGE9PSJz
 dHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2Yg
-UC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodS51LmMoYSkpcmV0dXJuIGEKaWYo
+UC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodS52LmMoYSkpcmV0dXJuIGEKaWYo
 YSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodS5aLmMoYSkpcmV0dXJuIFAuaEUoYSwi
 JGRhcnRfanNGdW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0X2pzT2JqZWN0
 IixuZXcgUC5ZbSgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1QLk9tKGEsYikKaWYo
 dD09bnVsbCl7dD1jLiQxKGEpClAuRG0oYSxiLHQpfXJldHVybiB0fSwKTDc6ZnVuY3Rpb24oYSl7dmFy
 IHQscwppZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8dHlw
 ZW9mIGE9PSJib29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJkguUjko
-YSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ1LnUuYyhhKSlyZXR1cm4gYQpl
+YSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ1LnYuYyhhKSlyZXR1cm4gYQpl
 bHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRlKXt0PUguU2MoYS5nZXRUaW1lKCkpCmlmKE1hdGguYWJzKHQp
 PD04NjRlMTMpcz0hMQplbHNlIHM9ITAKaWYocylILnZoKFAueFkoIkRhdGVUaW1lIGlzIG91dHNpZGUg
 dmFsaWQgcmFuZ2U6ICIrdCkpCnJldHVybiBuZXcgUC5pUCh0LCExKX1lbHNlIGlmKGEuY29uc3RydWN0
@@ -1637,2177 +1654,2217 @@
 NyZhKTw8MTApCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9Vy5DMChX
 LkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHM9NTM2ODcwOTExJnQrKCg2NzEwODg2MyZ0KTw8MykK
 c149cz4+PjExCnJldHVybiA1MzY4NzA5MTEmcysoKDE2MzgzJnMpPDwxNSl9LApUTjpmdW5jdGlvbihh
-LGIpe3ZhciB0LHM9YS5jbGFzc0xpc3QKZm9yKHQ9MDt0PDE7Kyt0KXMuYWRkKGJbdF0pfSwKSkU6ZnVu
-Y3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1XLmFGKG5ldyBXLnZOKGMpLHUuQikKaWYodCE9bnVsbCYmITAp
-Si5kWihhLGIsdCwhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYix0LCExLGUuQygieEM8MD4iKSl9LApUdzpm
-dW5jdGlvbihhKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikscz1uZXcgVy5tayh0LHdp
-bmRvdy5sb2NhdGlvbikKcz1uZXcgVy5KUShzKQpzLkNZKGEpCnJldHVybiBzfSwKeVc6ZnVuY3Rpb24o
-YSxiLGMsZCl7dS5oLmIoYSkKSC55KGIpCkgueShjKQp1Lk8uYihkKQpyZXR1cm4hMH0sClFXOmZ1bmN0
-aW9uKGEsYixjLGQpe3ZhciB0LHMscgp1LmguYihhKQpILnkoYikKSC55KGMpCnQ9dS5PLmIoZCkuYQpz
-PXQuYQpzLmhyZWY9YwpyPXMuaG9zdG5hbWUKdD10LmIKaWYoIShyPT10Lmhvc3RuYW1lJiZzLnBvcnQ9
-PXQucG9ydCYmcy5wcm90b2NvbD09dC5wcm90b2NvbCkpaWYocj09PSIiKWlmKHMucG9ydD09PSIiKXt0
-PXMucHJvdG9jb2wKdD10PT09IjoifHx0PT09IiJ9ZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITAK
-cmV0dXJuIHR9LApCbDpmdW5jdGlvbigpe3ZhciB0PXUuTixzPVAudE0oQy5ReCx0KSxyPXUuZEcuYihu
-ZXcgVy5JQSgpKSxxPUguVk0oWyJURU1QTEFURSJdLHUucykKdD1uZXcgVy5jdChzLFAuTHModCksUC5M
-cyh0KSxQLkxzKHQpLG51bGwpCnQuQ1kobnVsbCxuZXcgSC5BOChDLlF4LHIsdS5kdikscSxudWxsKQpy
-ZXR1cm4gdH0sCnFjOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuCmlmKCJwb3N0TWVz
-c2FnZSIgaW4gYSl7dD1XLlAxKGEpCnJldHVybiB0fWVsc2UgcmV0dXJuIHUuYVMuYihhKX0sClAxOmZ1
-bmN0aW9uKGEpe2lmKGE9PT13aW5kb3cpcmV0dXJuIHUuY2kuYihhKQplbHNlIHJldHVybiBuZXcgVy5k
-VygpfSwKYUY6ZnVuY3Rpb24oYSxiKXt2YXIgdD0kLlgzCmlmKHQ9PT1DLk5VKXJldHVybiBhCnJldHVy
-biB0LlB5KGEsYil9LApxRTpmdW5jdGlvbiBxRSgpe30sCkdoOmZ1bmN0aW9uIEdoKCl7fSwKZlk6ZnVu
-Y3Rpb24gZlkoKXt9LApuQjpmdW5jdGlvbiBuQigpe30sCkF6OmZ1bmN0aW9uIEF6KCl7fSwKUVA6ZnVu
-Y3Rpb24gUVAoKXt9LApueDpmdW5jdGlvbiBueCgpe30sCm9KOmZ1bmN0aW9uIG9KKCl7fSwKaWQ6ZnVu
-Y3Rpb24gaWQoKXt9LApRRjpmdW5jdGlvbiBRRigpe30sCk5oOmZ1bmN0aW9uIE5oKCl7fSwKSUI6ZnVu
-Y3Rpb24gSUIoKXt9LApuNzpmdW5jdGlvbiBuNygpe30sCnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2KCl7fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LAplYTpm
-dW5jdGlvbiBlYSgpe30sCkQwOmZ1bmN0aW9uIEQwKCl7fSwKVDU6ZnVuY3Rpb24gVDUoKXt9LApoNDpm
-dW5jdGlvbiBoNCgpe30sCmJyOmZ1bmN0aW9uIGJyKCl7fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApPNzpm
-dW5jdGlvbiBPNygpe30sCmJVOmZ1bmN0aW9uIGJVKGEpe3RoaXMuYT1hfSwKaEg6ZnVuY3Rpb24gaEgo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndhOmZ1bmN0aW9uIHdhKCl7fSwKU2c6ZnVuY3Rpb24gU2co
-KXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkFqOmZ1bmN0aW9uIEFqKCl7fSwKZTc6ZnVuY3Rpb24gZTco
-YSl7dGhpcy5hPWF9LAp1SDpmdW5jdGlvbiB1SCgpe30sCkJIOmZ1bmN0aW9uIEJIKCl7fSwKU046ZnVu
-Y3Rpb24gU04oKXt9LApldzpmdW5jdGlvbiBldygpe30sCmxwOmZ1bmN0aW9uIGxwKCl7fSwKVGI6ZnVu
-Y3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJdigpe30sCkJUOmZ1bmN0aW9uIEJUKCl7fSwKeVk6ZnVu
-Y3Rpb24geVkoKXt9LAp3NjpmdW5jdGlvbiB3Nigpe30sCks1OmZ1bmN0aW9uIEs1KCl7fSwKQ206ZnVu
-Y3Rpb24gQ20oKXt9LApDUTpmdW5jdGlvbiBDUSgpe30sCnc0OmZ1bmN0aW9uIHc0KCl7fSwKcmg6ZnVu
-Y3Rpb24gcmgoKXt9LApEOTpmdW5jdGlvbiBEOSgpe30sCmk3OmZ1bmN0aW9uIGk3KGEpe3RoaXMuYT1h
-fSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5hPWF9LApLUzpmdW5jdGlvbiBLUyhhLGIpe3RoaXMuYT1h
-CnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkk0OmZ1bmN0
-aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVuY3Rpb24gRmsoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1i
-fSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0
-aT1kfSwKQ3E6ZnVuY3Rpb24gQ3EoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
-LiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYj1hCl8uYz1iCl8u
-ZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5jdGlvbiB2TihhKXt0aGlzLmE9YX0sCkpROmZ1bmN0aW9u
-IEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rpb24gR20oKXt9LAp2RDpmdW5jdGlvbiB2RChhKXt0aGlz
-LmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3RoaXMuYT1hfSwKRWc6ZnVuY3Rpb24gRWcoYSxiLGMpe3Ro
-aXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKbTY6ZnVuY3Rpb24gbTYoKXt9LApFbzpmdW5jdGlvbiBF
-bygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwKY3Q6ZnVuY3Rpb24gY3QoYSxiLGMsZCxlKXt2YXIgXz10
-aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKSUE6ZnVuY3Rpb24gSUEoKXt9LApPdzpm
-dW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9uIFc5KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
-Cl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwKZFc6ZnVuY3Rpb24gZFcoKXt9LAprRjpmdW5jdGlvbiBr
-Rigpe30sCm1rOmZ1bmN0aW9uIG1rKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLbzpmdW5jdGlvbiBL
-byhhKXt0aGlzLmE9YX0sCmZtOmZ1bmN0aW9uIGZtKGEpe3RoaXMuYT1hfSwKTGU6ZnVuY3Rpb24gTGUo
-KXt9LApLNzpmdW5jdGlvbiBLNygpe30sCnJCOmZ1bmN0aW9uIHJCKCl7fSwKWFc6ZnVuY3Rpb24gWFco
-KXt9LApvYTpmdW5jdGlvbiBvYSgpe319LFU9ewp5dTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8s
-bj1ILlZNKFtdLHUuYlApCmZvcih0PUouVTYoYSkscz1KLklUKHUuUi5iKHQucShhLCJkZXRhaWxzIikp
-KTtzLkYoKTspe3I9cy5nbCgpCnE9Si5VNihyKQpwPUgueShxLnEociwiZGVzY3JpcHRpb24iKSkKcT1x
-LnEociwibGluayIpCmlmKHE9PW51bGwpcT1udWxsCmVsc2V7bz1KLlU2KHEpCnE9bmV3IFUuTWwoSC55
-KG8ucShxLCJocmVmIikpLEguU2Moby5xKHEsImxpbmUiKSksSC55KG8ucShxLCJwYXRoIikpKX1DLk5t
-LmkobixuZXcgVS51RihwLHEpKX1yZXR1cm4gbmV3IFUuZDIobixVLmpmKHQucShhLCJlZGl0cyIpKSxI
-LnkodC5xKGEsImV4cGxhbmF0aW9uIikpLEguU2ModC5xKGEsImxpbmUiKSksSC55KHQucShhLCJwYXRo
-IikpKX0sCmpmOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxCmlmKGE9PW51bGwpdD1udWxsCmVsc2V7dD1I
-LlZNKFtdLHUuZkEpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOyl7cj1zLmdsKCkKcT1KLlU2KHIp
-CkMuTm0uaSh0LG5ldyBVLlNlKEgueShxLnEociwiZGVzY3JpcHRpb24iKSksSC55KHEucShyLCJocmVm
-IikpKSl9fXJldHVybiB0fSwKZDI6ZnVuY3Rpb24gZDIoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYT1h
-Cl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lfSwKU2U6ZnVuY3Rpb24gU2UoYSxiKXt0aGlzLmE9YQp0aGlz
-LmI9Yn0sCnVGOmZ1bmN0aW9uIHVGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5jdGlvbiBN
-bChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9fSxUPXtHVjpmdW5jdGlvbiBHVigpe319
-LEw9ewpJcTpmdW5jdGlvbigpe0MuQlouQihkb2N1bWVudCwiRE9NQ29udGVudExvYWRlZCIsbmV3IEwu
-ZSgpKQpDLm9sLkIod2luZG93LCJwb3BzdGF0ZSIsbmV3IEwuTCgpKX0sCmhPOmZ1bmN0aW9uKGEpe2lm
-KDA+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsMCkKaWYoYVswXSE9PSIvIilyZXR1cm4gSi5UMChkb2N1
-bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSsiLyIrSC5kKGEpCmVsc2UgcmV0
-dXJuIGF9LAprejpmdW5jdGlvbihhKXt2YXIgdCxzPXUuaC5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxl
-Y3RvcigiOnNjb3BlID4gdWwiKSxyPXMuc3R5bGUscT0iIitDLkNELnpRKHMub2Zmc2V0SGVpZ2h0KSoy
-KyJweCIKci5tYXhIZWlnaHQ9cQpyPUoucUYoYSkKcT1yLiR0aQp0PXEuQygifigxKSIpLmIobmV3IEwu
-V3gocyxhKSkKdS5NLmIobnVsbCkKVy5KRShyLmEsci5iLHQsITEscS5kKX0sCnlYOmZ1bmN0aW9uKGEp
-e3ZhciB0LHMscixxLHAsbz0icXVlcnlTZWxlY3RvckFsbCIsbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9y
-KGEpLG09dS5oCm4udG9TdHJpbmcKSC5EaChtLG0sIlQiLG8pCnQ9dS5TCnM9bmV3IFcud3oobi5xdWVy
-eVNlbGVjdG9yQWxsKCIubmF2LWxpbmsiKSx0KQpzLksocyxuZXcgTC5BTygpKQpILkRoKG0sbSwiVCIs
-bykKcj1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSx0KQppZihyLmdBKHIpIT09
-MCl7cT1uLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQpxLnRvU3RyaW5nCnIuSyhyLG5l
-dyBMLkhvKHEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcocSkpLk8oInBhdGgi
-KSkpKX1ILkRoKG0sbSwiVCIsbykKcD1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb3N0LWxp
-bmsiKSx0KQpwLksocCxuZXcgTC5JQygpKX0sCmFLOmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZ
-KCkucSgwLCJsaW5lIikKcmV0dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LApHNjpmdW5jdGlv
-bihhKXt2YXIgdD1QLmhLKGEpLmdoWSgpLnEoMCwib2Zmc2V0IikKcmV0dXJuIHQ9PW51bGw/bnVsbDpI
-LkhwKHQsbnVsbCl9LAp0MjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuPXt9CnUuVi5iKGEp
-CnQ9bi5hPXUuaC5iKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaWYo
-Si56bCh0LCI/Iikpe3M9Qy54Qi5Oaih0LDAsQy54Qi5PWSh0LCI/IikpCm4uYT1zCnI9c31lbHNlIHI9
-dAppZihiIT1udWxsKXtxPSQublUoKQpyPW4uYT1xLm81KEQubnIocS50TShiKSxyKSl9cD1MLkc2KHQp
-Cm89TC5hSyh0KQppZihwIT1udWxsKUwuYWYocixwLG8sbmV3IEwublQobixwLG8pKQplbHNlIEwuYWYo
-cixudWxsLG51bGwsbmV3IEwuQloobikpCmEucHJldmVudERlZmF1bHQoKX0sCnVtOmZ1bmN0aW9uKGEp
-e3ZhciB0LHM9e30scj11LmguYShXLnFjKHUuVi5iKGEpLmN1cnJlbnRUYXJnZXQpKS5nZXRBdHRyaWJ1
-dGUoImhyZWYiKQpzLmE9cgpyPUwuaE8ocikKcy5hPXIKdD11Lk4KVy5xRChyLCJQT1NUIixQLkVGKFsi
-Q29udGVudC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5l
-dyBMLkZRKCksdS5QKS5PQShuZXcgTC50WShzKSl9LAp2VTpmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50
-LHM9dS5oCkguRGgocyxzLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnQ9bmV3IFcud3oodC5xdWVyeVNl
-bGVjdG9yQWxsKCIuY29kZSIpLHUuUykKdC5LKHQsbmV3IEwuR0goKSl9LApoWDpmdW5jdGlvbihhLGIp
-e3ZhciB0PXUuTgpXLnFEKEguZChhKSsiP3JlZ2lvbj1yZWdpb24mb2Zmc2V0PSIrSC5kKGIpLG51bGws
-UC5FRihbIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiXSx0LHQp
-KS5XNyhuZXcgTC5EVCgpLHUuUCkuT0EobmV3IEwuZUgoYSkpfSwKRzc6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHQscwppZighSi5yWShhKS5UYyhhLCIuZGFydCIpKXtMLkJFKGEsUC5FRihbInJlZ2lvbnMiLCIi
-LCJuYXZpZ2F0aW9uQ29udGVudCIsIiIsImVkaXRzIixbXV0sdS5OLHUueikpCkwuQlgoYSxudWxsKQpp
-ZihkIT1udWxsKWQuJDAoKQpyZXR1cm59dD1DLnhCLnRnKGEsIj8iKT9hKyImaW5saW5lPXRydWUiOmEr
-Ij9pbmxpbmU9dHJ1ZSIKcz11Lk4KVy5xRCh0LG51bGwsUC5FRihbIkNvbnRlbnQtVHlwZSIsImFwcGxp
-Y2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiXSxzLHMpKS5XNyhuZXcgTC56RChhLGIsYyxkKSx1LlAp
-Lk9BKG5ldyBMLk9FKGEpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIHQ9Ii9fcHJldmlldy9uYXZpZ2F0aW9u
-VHJlZS5qc29uIixzPXUuTgpXLnFEKHQsbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGljYXRp
-b24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHMscykpLlc3KG5ldyBMLlRXKCksdS5QKS5PQShuZXcgTC54
-cih0KSl9LApxSjpmdW5jdGlvbihhLGIpe3ZhciB0CndpbmRvdwppZih0eXBlb2YgY29uc29sZSE9InVu
-ZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IoYSkKd2luZG93CnQ9SC5kKGIpCmlmKHR5cGVvZiBj
-b25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS5lcnJvcih0KX0sCnFPOmZ1bmN0aW9uKGEp
-e3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz10LmJvdHRvbSxyPXdpbmRvdy5pbm5lckhl
-aWdodAppZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiBILnBZKHIpCmlmKHM+cilKLmRoKGEpCmVs
-c2UgaWYodC50b3A8MClKLmRoKGEpfSwKZkc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIKaWYoYSE9bnVs
-bCl7dD1kb2N1bWVudApzPXQuZ2V0RWxlbWVudEJ5SWQoIm8iK0guZChhKSkKcj10LnF1ZXJ5U2VsZWN0
-b3IoIi5saW5lLSIrSC5kKGIpKQppZihzIT1udWxsKXtMLnFPKHMpCkouZFIocykuaSgwLCJ0YXJnZXQi
-KX1lbHNlIGlmKHIhPW51bGwpTC5xTyhyLnBhcmVudEVsZW1lbnQpCmlmKHIhPW51bGwpSi5kUih1Lmgu
-YShyLnBhcmVudE5vZGUpKS5pKDAsImhpZ2hsaWdodCIpfWVsc2UgTC5xTyhkb2N1bWVudC5nZXRFbGVt
-ZW50QnlJZCgidW5pdC1uYW1lIikpfSwKYWY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyPUwuRzYo
-d2luZG93LmxvY2F0aW9uLmhyZWYpLHE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYociE9bnVs
-bCl7dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibyIrSC5kKHIpKQppZih0IT1udWxsKUouZFIodCku
-UigwLCJ0YXJnZXQiKX1pZihxIT1udWxsKXtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIr
-SC5kKHEpKQppZihzIT1udWxsKUouZFIocy5wYXJlbnRFbGVtZW50KS5SKDAsImhpZ2hsaWdodCIpfWlm
-KGE9PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSl7TC5mRyhiLGMpCmQuJDAoKX1lbHNlIEwuRzcoYSxi
-LGMsZCl9LApMeDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PT0xKXQ9YgplbHNlIHQ9YisicyIKcmV0
-dXJuIHR9LApUMTpmdW5jdGlvbihhNCl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUs
-ZCxjLGIsYSxhMCxhMT1udWxsLGEyPWRvY3VtZW50LGEzPWEyLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0LXBh
-bmVsIC5wYW5lbC1jb250ZW50IikKSi5sNShhMywiIikKaWYoYTQ9PW51bGwpe2EyPWEyLmNyZWF0ZUVs
-ZW1lbnQoInAiKQphMi50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0
-LiIKdD11LlguYihILlZNKFsicGxhY2Vob2xkZXIiXSx1LnMpKQpzPUMuTHQuZ0QoYTIpCnMuVjEoMCkK
-cy5GVigwLHQpCmEzLmFwcGVuZENoaWxkKGEyKQpyZXR1cm59cj1hNC5lCnQ9JC5uVSgpCnE9dC50TShy
-KQpwPWE0LmMKbz10LkhQKHIsSi5UMChhMi5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50
-KSkKbj1hNC5kCnQ9YTIuY3JlYXRlRWxlbWVudCgicCIpCm09dS5oCm0uYihhMy5hcHBlbmRDaGlsZCh0
-KSkuYXBwZW5kQ2hpbGQoYTIuY3JlYXRlVGV4dE5vZGUoSC5kKHApKyIgYXQgIitILmQobykrIjoiK0gu
-ZChuKSsiLiIpKQp0PWE0LmEKaWYodC5sZW5ndGghPT0wKXtsPWEyLmNyZWF0ZUVsZW1lbnQoInAiKQps
-LnRleHRDb250ZW50PSJFZGl0IHJhdGlvbmFsZToiCmEzLmFwcGVuZENoaWxkKGwpCmw9YTIuY3JlYXRl
-RWxlbWVudCgidWwiKQprPW0uYihhMy5hcHBlbmRDaGlsZChsKSkKZm9yKGw9dC5sZW5ndGgsaj11Lmss
-aT0wO2k8dC5sZW5ndGg7dC5sZW5ndGg9PT1sfHwoMCxILmxrKSh0KSwrK2kpe2g9dFtpXQpnPWEyLmNy
-ZWF0ZUVsZW1lbnQoImxpIikKZj1rLmFwcGVuZENoaWxkKGcpCmYuYXBwZW5kQ2hpbGQoYTIuY3JlYXRl
-VGV4dE5vZGUoaC5hKSkKZz1oLmIKaWYoZyE9bnVsbCl7ZT1nLmIKZi5hcHBlbmRDaGlsZChhMi5jcmVh
-dGVUZXh0Tm9kZSgiICgiKSkKZD1hMi5jcmVhdGVFbGVtZW50KCJhIikKYz1qLmIoZi5hcHBlbmRDaGls
-ZChkKSkKYy5hcHBlbmRDaGlsZChhMi5jcmVhdGVUZXh0Tm9kZShILmQoZy5jKSsiOiIrSC5kKGUpKSkK
-Yj1nLmEKZz0kLm5VKCkKYy5zZXRBdHRyaWJ1dGUoImhyZWYiLGcubzUoZy5xNygwLHEsYixhMSxhMSxh
-MSxhMSxhMSxhMSkpKQpjLmNsYXNzTGlzdC5hZGQoIm5hdi1saW5rIikKZi5hcHBlbmRDaGlsZChhMi5j
-cmVhdGVUZXh0Tm9kZSgiKSIpKX19fXQ9YTQuYgppZih0IT1udWxsKWZvcihsPXQubGVuZ3RoLGk9MDtp
-PHQubGVuZ3RoO3QubGVuZ3RoPT09bHx8KDAsSC5saykodCksKytpKXthPXRbaV0Kaj1hMi5jcmVhdGVF
-bGVtZW50KCJwIikKYTA9bS5iKGEzLmFwcGVuZENoaWxkKGopKQpqPWEyLmNyZWF0ZUVsZW1lbnQoImEi
-KQpjPW0uYihhMC5hcHBlbmRDaGlsZChqKSkKYy5hcHBlbmRDaGlsZChhMi5jcmVhdGVUZXh0Tm9kZShh
-LmEpKQpjLnNldEF0dHJpYnV0ZSgiaHJlZiIsYS5iKQpKLmRSKGMpLmkoMCwicG9zdC1saW5rIil9fSwK
-TEg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPWRvY3Vt
-ZW50LGM9ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50IikKSi5sNShjLCIi
-KQp0PWQuY3JlYXRlRWxlbWVudCgicCIpCnM9dS5oCnI9cy5iKGMuYXBwZW5kQ2hpbGQodCkpCnQ9Si5V
-NihiKQpxPXQuZ0EoYikKaWYocT09PTApci5hcHBlbmRDaGlsZChkLmNyZWF0ZVRleHROb2RlKCJObyBw
-cm9wb3NlZCBlZGl0cyIpKQplbHNlIHIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVUZXh0Tm9kZSgiIitxKyIg
-cHJvcG9zZWQgIitMLkx4KHEsImVkaXQiKSsiOiIpKQpwPWQuY3JlYXRlRWxlbWVudCgidWwiKQpvPXMu
-YihjLmFwcGVuZENoaWxkKHApKQpmb3IodD10LmdreihiKSxwPXUuayxuPXUuQyxtPW4uQygifigxKSIp
-LGw9dS5NLG49bi5kLGs9dS5hO3QuRigpOyl7aj1rLmIodC5nbCgpKQppPWQuY3JlYXRlRWxlbWVudCgi
-bGkiKQpoPXMuYihvLmFwcGVuZENoaWxkKGkpKQpKLmRSKGgpLmkoMCwiZWRpdCIpCmk9ZC5jcmVhdGVF
-bGVtZW50KCJhIikKZz1wLmIoaC5hcHBlbmRDaGlsZChpKSkKZy5jbGFzc0xpc3QuYWRkKCJlZGl0LWxp
-bmsiKQpmPUguU2Moai5xKDAsIm9mZnNldCIpKQppPUguZChmKQpnLnNldEF0dHJpYnV0ZSgiZGF0YS0i
-K25ldyBXLlN5KG5ldyBXLmk3KGcpKS5PKCJvZmZzZXQiKSxpKQplPUguU2Moai5xKDAsImxpbmUiKSkK
-aT1ILmQoZSkKZy5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhnKSkuTygibGlu
-ZSIpLGkpCmcuYXBwZW5kQ2hpbGQoZC5jcmVhdGVUZXh0Tm9kZSgibGluZSAiK0guZChlKSkpCmk9bS5i
-KG5ldyBMLkVFKGYsZSxhKSkKbC5iKG51bGwpClcuSkUoZywiY2xpY2siLGksITEsbikKaC5hcHBlbmRD
-aGlsZChkLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5kKGoucSgwLCJleHBsYW5hdGlvbiIpKSkpfUwuVDEo
-bnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9d2luZG93LmxvY2F0aW9uLHA9UC5o
-SygocSYmQy5FeCkuZ0RyKHEpK0guZChhKSkKcT11LnoKdD1QLkZsKHUuTixxKQppZihiIT1udWxsKXQu
-WSgwLCJvZmZzZXQiLEguZChiKSkKaWYoYyE9bnVsbCl0LlkoMCwibGluZSIsSC5kKGMpKQpwPXAubm0o
-MCx0LmE9PT0wP251bGw6dCkKcz13aW5kb3cuaGlzdG9yeQpyPXAudygwKQpzLnRvU3RyaW5nCnMucHVz
-aFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHEscSkpLCIiLHIpfSwKRW46ZnVuY3Rpb24oYSl7
-dmFyIHQ9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50LCIvIikK
-aWYoQy54Qi5uKGEsdCkpcmV0dXJuIEMueEIuRyhhLHQubGVuZ3RoKQplbHNlIHJldHVybiBhfSwKQlg6
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9e30Kci5hPWEKYT1MLkVuKGEpCnIuYT1hCnQ9ZG9jdW1lbnQK
-dC5xdWVyeVNlbGVjdG9yKCIjdW5pdC1uYW1lIikudGV4dENvbnRlbnQ9YQpzPXUuaApILkRoKHMscywi
-VCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQp0PW5ldyBXLnd6KHQucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1w
-YW5lbCAubmF2LWxpbmsiKSx1LlMpCnQuSyh0LG5ldyBMLlZTKHIpKX0sCkJFOmZ1bmN0aW9uKGEsYil7
-dmFyIHQ9Ii5yZWdpb25zIixzPWRvY3VtZW50LHI9cy5xdWVyeVNlbGVjdG9yKHQpLHE9cy5xdWVyeVNl
-bGVjdG9yKCIuY29kZSIpCkoudEgocixILnkoYi5xKDAsInJlZ2lvbnMiKSksJC5LRygpKQpKLnRIKHEs
-SC55KGIucSgwLCJuYXZpZ2F0aW9uQ29udGVudCIpKSwkLktHKCkpCkwuTEgoYSx1LmouYihiLnEoMCwi
-ZWRpdHMiKSkpCkwudlUoKQpMLnlYKCIuY29kZSIpCkwueVgodCl9LAp0WDpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMscixxLHAsbyxuLG0sbCxrLGo9Im5hbWUiLGk9ZG9jdW1lbnQsaD1pLmNyZWF0ZUVsZW1lbnQo
-InVsIiksZz11LmgsZj1nLmIoYS5hcHBlbmRDaGlsZChoKSkKZm9yKGg9Si5JVCh1LlIuYihiKSksdD11
-Lk07aC5GKCk7KXtzPWguZ2woKQpyPWkuY3JlYXRlRWxlbWVudCgibGkiKQpxPWcuYihmLmFwcGVuZENo
-aWxkKHIpKQpyPUouVTYocykKcD1KLlJFKHEpCmlmKEouUk0oci5xKHMsInR5cGUiKSwiZGlyZWN0b3J5
-Iikpe3AuZ0QocSkuaSgwLCJkaXIiKQpwPWkuY3JlYXRlRWxlbWVudCgic3BhbiIpCm89Zy5iKHEuYXBw
-ZW5kQ2hpbGQocCkpCnA9Si5SRShvKQpwLmdEKG8pLmkoMCwiYXJyb3ciKQpwLnNoZihvLCImI3gyNUJD
-OyIpCnA9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKSi5sNShnLmIocS5hcHBlbmRDaGlsZChwKSksIiYj
-eDFGNEMxOyIpCnEuYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZShILnkoci5xKHMsaikpKSkKTC50
-WChxLHIucShzLCJzdWJ0cmVlIikpCkwua3oobyl9ZWxzZXtwLnNoZihxLCImI3gxRjRDNDsiKQpwPWku
-Y3JlYXRlRWxlbWVudCgiYSIpCm49Zy5iKHEuYXBwZW5kQ2hpbGQocCkpCnA9Si5SRShuKQpwLmdEKG4p
-LmkoMCwibmF2LWxpbmsiKQptPUgueShyLnEocywicGF0aCIpKQpuLnNldEF0dHJpYnV0ZSgiZGF0YS0i
-K25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PKGopLG0pCm4uc2V0QXR0cmlidXRlKCJocmVmIixILnkoci5x
-KHMsImhyZWYiKSkpCm4uYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZShILnkoci5xKHMsaikpKSkK
-cD1wLmdWbChuKQptPXAuJHRpCm0uQygifigxKSIpLmIoTC5YTigpKQp0LmIobnVsbCkKVy5KRShwLmEs
-cC5iLEwuWE4oKSwhMSxtLmQpCmw9SC5TYyhyLnEocywiZWRpdENvdW50IikpCmlmKHR5cGVvZiBsIT09
-Im51bWJlciIpcmV0dXJuIGwub3MoKQppZihsPjApe3I9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKaz1n
-LmIocS5hcHBlbmRDaGlsZChyKSkKSi5kUihrKS5pKDAsImVkaXQtY291bnQiKQpyPSIiK2wrIiAiCmlm
-KGw9PT0xKXA9ImVkaXQiCmVsc2UgcD0iZWRpdHMiCmsuc2V0QXR0cmlidXRlKCJ0aXRsZSIscitwKQpr
-LmFwcGVuZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9fX19LAplOmZ1bmN0aW9uIGUo
-KXt9LApWVzpmdW5jdGlvbiBWVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApMOmZ1
-bmN0aW9uIEwoKXt9LApXeDpmdW5jdGlvbiBXeChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQU86ZnVu
-Y3Rpb24gQU8oKXt9LApkTjpmdW5jdGlvbiBkTigpe30sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMuYT1h
-fSwKeHo6ZnVuY3Rpb24geHooYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklDOmZ1bmN0aW9uIElDKCl7
-fSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKQlo6ZnVu
-Y3Rpb24gQlooYSl7dGhpcy5hPWF9LApGUTpmdW5jdGlvbiBGUSgpe30sCnRZOmZ1bmN0aW9uIHRZKGEp
-e3RoaXMuYT1hfSwKR0g6ZnVuY3Rpb24gR0goKXt9LApEVDpmdW5jdGlvbiBEVCgpe30sCmVIOmZ1bmN0
-aW9uIGVIKGEpe3RoaXMuYT1hfSwKekQ6ZnVuY3Rpb24gekQoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCk9FOmZ1bmN0aW9uIE9FKGEpe3RoaXMuYT1hfSwKVFc6ZnVuY3Rp
-b24gVFcoKXt9LAp4cjpmdW5jdGlvbiB4cihhKXt0aGlzLmE9YX0sCkVFOmZ1bmN0aW9uIEVFKGEsYixj
-KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClhBOmZ1bmN0aW9uIFhBKCl7fSwK
-SVY6ZnVuY3Rpb24gSVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19
-LE09ewpZRjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuCmZvcih0PWIubGVuZ3RoLHM9MTtz
-PHQ7KytzKXtpZihiW3NdPT1udWxsfHxiW3MtMV0hPW51bGwpY29udGludWUKZm9yKDt0Pj0xO3Q9cil7
-cj10LTEKaWYoYltyXSE9bnVsbClicmVha31xPW5ldyBQLlJuKCIiKQpwPWErIigiCnEuYT1wCm89SC5x
-QyhiLDAsdCxILnQ2KGIpLmQpCm49by4kdGkKbj1wK25ldyBILkE4KG8sbi5DKCJxVShhTC5FKSIpLmIo
-bmV3IE0uTm8oKSksbi5DKCJBODxhTC5FLHFVPiIpKS5IKDAsIiwgIikKcS5hPW4KcS5hPW4rKCIpOiBw
-YXJ0ICIrKHMtMSkrIiB3YXMgbnVsbCwgYnV0IHBhcnQgIitzKyIgd2FzIG5vdC4iKQp0aHJvdyBILmIo
-UC54WShxLncoMCkpKX19LApsSTpmdW5jdGlvbiBsSShhKXt0aGlzLmE9YX0sCk1pOmZ1bmN0aW9uIE1p
-KCl7fSwKcTc6ZnVuY3Rpb24gcTcoKXt9LApObzpmdW5jdGlvbiBObygpe319LEI9e0x1OmZ1bmN0aW9u
-IEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoIShhPj02NSYmYTw9OTApKXQ9YT49OTcmJmE8
-PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9LApZdTpmdW5jdGlvbihhLGIpe3ZhciB0PWEubGVuZ3RoLHM9
-YisyCmlmKHQ8cylyZXR1cm4hMQppZighQi5PUyhDLnhCLm0oYSxiKSkpcmV0dXJuITEKaWYoQy54Qi5t
-KGEsYisxKSE9PTU4KXJldHVybiExCmlmKHQ9PT1zKXJldHVybiEwCnJldHVybiBDLnhCLm0oYSxzKT09
-PTQ3fX0sWD17CkNMOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWIueFooYSkKYi5oSyhhKQpp
-ZihvIT1udWxsKWE9Si5LVihhLG8ubGVuZ3RoKQp0PXUucwpzPUguVk0oW10sdCkKcj1ILlZNKFtdLHQp
-CnQ9YS5sZW5ndGgKaWYodCE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtpZigwPj10KXJldHVybiBILk9I
-KGEsMCkKQy5ObS5pKHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5pKHIsIiIpCnE9MH1mb3IocD1xO3A8dDsr
-K3ApaWYoYi5yNChDLnhCLlcoYSxwKSkpe0MuTm0uaShzLEMueEIuTmooYSxxLHApKQpDLk5tLmkocixh
-W3BdKQpxPXArMX1pZihxPHQpe0MuTm0uaShzLEMueEIuRyhhLHEpKQpDLk5tLmkociwiIil9cmV0dXJu
-IG5ldyBYLldEKGIsbyxzLHIpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCnFSOmZ1bmN0aW9uIHFSKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rp
-b24oYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsK
-Umg6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9bnVsbAppZihQLnVvKCkuZ0Zp
-KCkhPT0iZmlsZSIpcmV0dXJuICQuRWIoKQp0PVAudW8oKQppZighQy54Qi5UYyh0LmdJaSh0KSwiLyIp
-KXJldHVybiAkLkViKCkKcz1QLlBpKGksMCwwKQpyPVAuelIoaSwwLDApCnE9UC5PZShpLDAsMCwhMSkK
-cD1QLmxlKGksMCwwLGkpCm89UC50RyhpLDAsMCkKbj1QLndCKGkscykKbT1zPT09ImZpbGUiCmlmKHE9
-PW51bGwpdD1yLmxlbmd0aCE9PTB8fG4hPW51bGx8fG0KZWxzZSB0PSExCmlmKHQpcT0iIgp0PXE9PW51
-bGwKbD0hdAprPVAua2EoImEvYiIsMCwzLGkscyxsKQpqPXMubGVuZ3RoPT09MAppZihqJiZ0JiYhQy54
-Qi5uKGssIi8iKSlrPVAud0Yoaywhanx8bCkKZWxzZSBrPVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQm
-JkMueEIubihrLCIvLyIpPyIiOnEsbixrLHAsbykudDQoKT09PSJhXFxiIilyZXR1cm4gJC5LaygpCnJl
-dHVybiAkLmJEKCl9LAp6TDpmdW5jdGlvbiB6TCgpe319LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0
-aGlzLmQ9YQp0aGlzLmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBf
-PXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxEPXsKUlg6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
-UC51bygpCmlmKEouUk0ociwkLkk2KSlyZXR1cm4gJC5GZgokLkk2PXIKaWYoJC5IaygpPT0kLkViKCkp
-cmV0dXJuICQuRmY9ci5aSSgiLiIpLncoMCkKZWxzZXt0PXIudDQoKQpzPXQubGVuZ3RoLTEKcmV0dXJu
-ICQuRmY9cz09PTA/dDpDLnhCLk5qKHQsMCxzKX19LApucjpmdW5jdGlvbihhLGIpe3ZhciB0PW51bGwK
-cmV0dXJuICQublUoKS5xNygwLGEsYix0LHQsdCx0LHQsdCl9fQp2YXIgdz1bQyxILEosUCxXLFUsVCxM
-LE0sQixYLE8sRSxGLERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2
-YXIgJD17fQpILmVvLnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIGE9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1
-Lm8uYihiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5jdGlvbihhKXty
-ZXR1cm4gYT81MTkwMTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlwZT17CkROOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCmdpTzpmdW5j
-dGlvbihhKXtyZXR1cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2ooYSx1Lm8uYihi
-KSl9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKdzpm
-dW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtk
-LnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9YVskLncoKV0K
-aWYodD09bnVsbClyZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAi
-K0guZChKLmoodCkpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCws
-LCwsLF19fSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17Cmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQu
-YihiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1
-bmN0aW9uKGEsYil7dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInJlbW92ZUF0Iikp
-CnQ9YS5sZW5ndGgKaWYoYj49dCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShi
-LDEpWzBdfSwKVUc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2KGEpLkMoImNYPDE+IikuYihj
-KQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53
-QShiLDAsdCwiaW5kZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3MpCnI9YitzCnRoaXMuWVcoYSxy
-LGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhl
-ZCRsZW5ndGgpSC52aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVuZ3RoPT09MCl0aHJvdyBILmIo
-SC5IWShhLC0xKSkKcmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0CkgudDYoYSku
-QygiY1g8MT4iKS5iKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGRBbGwiKSkKZm9y
-KHQ9Si5JVChiKTt0LkYoKTspYS5wdXNoKHQuZ2woKSl9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpI
-LnQ2KGEpLkMoIn4oMSkiKS5iKGIpCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKXtiLiQxKGFbc10p
-CmlmKGEubGVuZ3RoIT09dCl0aHJvdyBILmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0PUgudDYoYSkKcmV0dXJuIG5ldyBILkE4KGEsdC5LcShjKS5DKCIxKDIpIikuYihiKSx0LkMoIkA8
-MT4iKS5LcShjKS5DKCJBODwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9bmV3IEFycmF5
-KGEubGVuZ3RoKQpzLmZpeGVkJGxlbmd0aD1BcnJheQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMu
-WShzLHQsSC5kKGFbdF0pKQpyZXR1cm4gcy5qb2luKGIpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscyxyCmQuYihiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmIoYykKdD1hLmxlbmd0aApmb3Io
-cz1iLHI9MDtyPHQ7KytyKXtzPWMuJDIocyxhW3JdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAu
-YTQoYSkpfXJldHVybiBzfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJu
-IEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCmFNOmZ1bmN0aW9uKGEsYixjKXtpZihiPDB8fGI+YS5sZW5n
-dGgpdGhyb3cgSC5iKFAuVEUoYiwwLGEubGVuZ3RoLCJzdGFydCIsbnVsbCkpCmlmKGM8Ynx8Yz5hLmxl
-bmd0aCl0aHJvdyBILmIoUC5URShjLGIsYS5sZW5ndGgsImVuZCIsbnVsbCkpCmlmKGI9PT1jKXJldHVy
-biBILlZNKFtdLEgudDYoYSkpCnJldHVybiBILlZNKGEuc2xpY2UoYixjKSxILnQ2KGEpKX0sCmdyWjpm
-dW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5X
-cCgpKX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUgudDYoYSkKci5DKCJjWDwxPiIp
-LmIoZCkKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgudmgoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMs
-YS5sZW5ndGgpCnQ9Yy1iCmlmKHQ9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCnIuQygiek08
-MT4iKS5iKGQpCnI9Si5VNihkKQppZihlK3Q+ci5nQShkKSl0aHJvdyBILmIoSC5hcigpKQppZihlPGIp
-Zm9yKHM9dC0xO3M+PTA7LS1zKWFbYitzXT1yLnEoZCxlK3MpCmVsc2UgZm9yKHM9MDtzPHQ7KytzKWFb
-YitzXT1yLnEoZCxlK3MpfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMs
-ZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYihiKQp0PWEu
-bGVuZ3RoCmZvcihzPTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxl
-bmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIg
-dApmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1
-cm4gbmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEp
-e3JldHVybiBILmVRKGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rp
-b24oYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDAp
-dGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1
-bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5kLmIoYykKaWYoISFhLmltbXV0
-YWJsZSRsaXN0KUgudmgoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJv
-dyBILmIoSC5IWShhLGIpKQphW2JdPWN9LAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30K
-Si5tMS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7
-dmFyIHQscz10aGlzLHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJvdyBILmIoSC5sayhyKSkK
-dD1zLmMKaWYodD49cSl7cy5zTShudWxsKQpyZXR1cm4hMX1zLnNNKHJbdF0pOysrcy5jCnJldHVybiEw
-fSwKc006ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSi5xSS5wcm90
-b3R5cGU9ewp5dTpmdW5jdGlvbihhKXt2YXIgdAppZihhPj0tMjE0NzQ4MzY0OCYmYTw9MjE0NzQ4MzY0
-NylyZXR1cm4gYXwwCmlmKGlzRmluaXRlKGEpKXt0PWE8MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihh
-KQpyZXR1cm4gdCswfXRocm93IEguYihQLkw0KCIiK2ErIi50b0ludCgpIikpfSwKelE6ZnVuY3Rpb24o
-YSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJl
-dHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sClda
-OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKaWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwz
-NiwicmFkaXgiLG51bGwpKQp0PWEudG9TdHJpbmcoYikKaWYoQy54Qi5tKHQsdC5sZW5ndGgtMSkhPT00
-MSlyZXR1cm4gdApzPS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChlXCsoXGQrKVwpJC8uZXhl
-Yyh0KQppZihzPT1udWxsKUgudmgoUC5MNCgiVW5leHBlY3RlZCB0b1N0cmluZyByZXN1bHQ6ICIrdCkp
-CnI9cy5sZW5ndGgKaWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQppZigzPj1yKXJldHVybiBI
-Lk9IKHMsMykKcT0rc1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4g
-dCtDLnhCLkl4KCIwIixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4w
-IgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09
-PXApcmV0dXJuIDUzNjg3MDkxMSZwCnQ9TWF0aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4
-MDU1OTk0NTN8MApyPU1hdGgucG93KDIscykKcT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigo
-cSo5MDA3MTk5MjU0NzQwOTkyfDApKyhxKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9
-LAp6WTpmdW5jdGlvbihhLGIpe3ZhciB0PWElYgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJu
-IHQKaWYoYjwwKXJldHVybiB0LWIKZWxzZSByZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIg
-dAppZihhPjApdD10aGlzLnAzKGEsYikKZWxzZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0
-fSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAz
-KGEsYil9LApwMzpmdW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpRks6
-MX0KSi51ci5wcm90b3R5cGU9eyRpS046MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9
-ewptOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3Ro
-KUgudmgoSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lm
-KGI+PWEubGVuZ3RoKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApk
-ZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC51bihiLGEsMCl9LApoOmZ1bmN0aW9uKGEsYil7aWYo
-dHlwZW9mIGIhPSJzdHJpbmciKXRocm93IEguYihQLkwzKGIsbnVsbCxudWxsKSkKcmV0dXJuIGErYn0s
-ClRjOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5sZW5ndGgscz1hLmxlbmd0aAppZih0PnMpcmV0dXJuITEK
-cmV0dXJuIGI9PT10aGlzLkcoYSxzLXQpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwpjPVAu
-akIoYixjLGEubGVuZ3RoKQp0PWEuc3Vic3RyaW5nKDAsYikKcz1hLnN1YnN0cmluZyhjKQpyZXR1cm4g
-dCtkK3N9LApRaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIUgub2soYykpSC52aChILnRMKGMpKQpp
-Zih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBjLkooKQppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cg
-SC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnQ9YytiLmxlbmd0aAppZih0PmEubGVuZ3Ro
-KXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyx0KX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gdGhpcy5RaShhLGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoIUgub2soYikpSC52aChILnRM
-KGIpKQppZihjPT1udWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gYi5K
-KCkKaWYoYjwwKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRocm93IEguYihQLngoYixudWxs
-KSkKaWYoYz5hLmxlbmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhi
-LGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRy
-aW0oKSxwPXEubGVuZ3RoCmlmKHA9PT0wKXJldHVybiBxCmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUou
-bW0ocSwxKQppZih0PT09cClyZXR1cm4iIn1lbHNlIHQ9MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMz
-P0ouYzEocSxzKTpwCmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxy
-KX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxl
-bmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7
-ITA7KXtpZigoYiYxKT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09MClicmVhawp0Kz10fXJldHVybiBz
-fSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5U
-RShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQ
-LlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMp
-Yz1zLXQKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0
-aHJvdyBILmIoUC5URShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5j
-dGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApn
-aU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01
-MzY4NzA5MTEmcythLmNoYXJDb2RlQXQocikKcz01MzY4NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNe
-PXM+PjZ9cz01MzY4NzA5MTEmcysoKDY3MTA4ODYzJnMpPDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcw
-OTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpm
-dW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkgucWoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMueEIubSh0aGlz
-LmEsSC5TYyhiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdrejpmdW5jdGlv
-bihhKXt2YXIgdD10aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ0EodCksSC5MaCh0KS5DKCJhNzxhTC5F
-PiIpKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0
-aCE9PTApe2lmKHA9PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJv
-dyBILmIoUC5hNChxKSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihw
-IT09cS5nQShxKSl0aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9
-ZWxzZXtmb3Iocj0wLHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0
-aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5iKGIpKX19Ckgu
-bkgucHJvdG90eXBlPXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5jCmlm
-KHM9PW51bGx8fHM+dClyZXR1cm4gdApyZXR1cm4gc30sCmdBczpmdW5jdGlvbigpe3ZhciB0PUouSG0o
-dGhpcy5hKSxzPXRoaXMuYgppZihzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXt2
-YXIgdCxzPUouSG0odGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9
-PW51bGx8fHQ+PXMpcmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkK
-cmV0dXJuIHQtcn0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1zLmdBcygpK2IKaWYoYj49
-MCl7dD1zLmdVRCgpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKdD1yPj10fWVs
-c2UgdD0hMAppZih0KXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBK
-LkFNKHMuYSxyKX19CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwK
-RjpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYocikscD1xLmdBKHIpCmlmKHMuYiE9
-PXApdGhyb3cgSC5iKFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Muc0kobnVsbCkKcmV0dXJuITF9cy5z
-SShxLkUocix0KSk7KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGku
-ZC5iKGEpfSwKJGlBbjoxfQpILkE4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkht
-KHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkFNKHRoaXMuYSxiKSl9
-fQpILlU1LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlz
-LmEpLHRoaXMuYix0aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlv
-bigpe3ZhciB0LHMKZm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgp
-KSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19Ckgu
-U1UucHJvdG90eXBlPXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlz
-KS5DKCJSZS5FIikuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFi
-bGUgbGlzdCIpKX19CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0
-NTk3KkouaGYodGhpcy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4nU3ltYm9sKCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51
-bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0K
-SC5QRC5wcm90b3R5cGU9e30KSC5XVS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
-KHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFd
-LmIoYykKcmV0dXJuIEguZGMoKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVy
-biExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blByb3BlcnR5
-KGEpfSwKcTpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybgpyZXR1cm4gdGhpcy5xUChi
-KX0sCnFQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC55KGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzLHIscSxwPUguTGgodGhpcykKcC5DKCJ+KDEsMikiKS5iKGIpCnQ9dGhpcy5jCmZvcihzPXQu
-bGVuZ3RoLHA9cC5jaFsxXSxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxwLmIodGhpcy5xUChxKSkp
-fX19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hCnJldHVybiB0fSwK
-Z25kOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzCmlmKHAuYz09PTEpcmV0dXJuIEMuZG4KdD1w
-LmQKcz10Lmxlbmd0aC1wLmUubGVuZ3RoLXAuZgppZihzPT09MClyZXR1cm4gQy5kbgpyPVtdCmZvcihx
-PTA7cTxzOysrcSl7aWYocT49dC5sZW5ndGgpcmV0dXJuIEguT0godCxxKQpyLnB1c2godFtxXSl9cmV0
-dXJuIEouekMocil9LApnVm06ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwppZihs
-LmMhPT0wKXJldHVybiBDLkNNCnQ9bC5lCnM9dC5sZW5ndGgKcj1sLmQKcT1yLmxlbmd0aC1zLWwuZgpp
-ZihzPT09MClyZXR1cm4gQy5DTQpwPW5ldyBILk41KHUuZW8pCmZvcihvPTA7bzxzOysrbyl7aWYobz49
-dC5sZW5ndGgpcmV0dXJuIEguT0godCxvKQpuPXRbb10KbT1xK28KaWYobTwwfHxtPj1yLmxlbmd0aCly
-ZXR1cm4gSC5PSChyLG0pCnAuWSgwLG5ldyBILnd2KG4pLHJbbV0pfXJldHVybiBuZXcgSC5QRChwLHUu
-Z0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQKSC55KGEp
-CnQ9dGhpcy5hCnQuYj10LmIrIiQiK0guZChhKQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlzLmMs
-Yik7Kyt0LmF9LAokUzoxNX0KSC5aci5wcm90b3R5cGU9ewpxUzpmdW5jdGlvbihhKXt2YXIgdCxzLHI9
-dGhpcyxxPW5ldyBSZWdFeHAoci5hKS5leGVjKGEpCmlmKHE9PW51bGwpcmV0dXJuCnQ9T2JqZWN0LmNy
-ZWF0ZShudWxsKQpzPXIuYgppZihzIT09LTEpdC5hcmd1bWVudHM9cVtzKzFdCnM9ci5jCmlmKHMhPT0t
-MSl0LmFyZ3VtZW50c0V4cHI9cVtzKzFdCnM9ci5kCmlmKHMhPT0tMSl0LmV4cHI9cVtzKzFdCnM9ci5l
-CmlmKHMhPT0tMSl0Lm1ldGhvZD1xW3MrMV0Kcz1yLmYKaWYocyE9PS0xKXQucmVjZWl2ZXI9cVtzKzFd
-CnJldHVybiB0fX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYgppZih0
-PT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILmQodGhpcy5hKQpyZXR1cm4iTm9TdWNo
-TWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK3QrIicgb24gbnVsbCJ9fQpILmF6LnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRo
-b2Qgbm90IGZvdW5kOiAnIixxPXMuYgppZihxPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjog
-IitILmQocy5hKQp0PXMuYwppZih0PT1udWxsKXJldHVybiByK3ErIicgKCIrSC5kKHMuYSkrIikiCnJl
-dHVybiByK3ErIicgb24gJyIrdCsiJyAoIitILmQocy5hKSsiKSJ9fQpILnZWLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0Lmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6
-ICIrdH19CkguQW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7aWYodS5iVS5jKGEpKWlmKGEuJHRo
-cm93bkpzRXJyb3I9PW51bGwpYS4kdGhyb3duSnNFcnJvcj10aGlzLmEKcmV0dXJuIGF9LAokUzo0fQpI
-LlhPLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmIKaWYocyE9bnVsbClyZXR1
-cm4gcwpzPXRoaXMuYQp0PXMhPT1udWxsJiZ0eXBlb2Ygcz09PSJvYmplY3QiP3Muc3RhY2s6bnVsbApy
-ZXR1cm4gdGhpcy5iPXQ9PW51bGw/IiI6dH0sCiRpR3o6MX0KSC5UcC5wcm90b3R5cGU9ewp3OmZ1bmN0
-aW9uKGEpe3ZhciB0PXRoaXMuY29uc3RydWN0b3Iscz10PT1udWxsP251bGw6dC5uYW1lCnJldHVybiJD
-bG9zdXJlICciK0guTlEocz09bnVsbD8idW5rbm93biI6cykrIicifSwKJGlFSDoxLApnUWw6ZnVuY3Rp
-b24oKXtyZXR1cm4gdGhpc30sCiRDOiIkMSIsCiRSOjEsCiREOm51bGx9CkgubGMucHJvdG90eXBlPXt9
-CkguengucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLiRzdGF0aWNfbmFtZQppZih0
-PT1udWxsKXJldHVybiJDbG9zdXJlIG9mIHVua25vd24gc3RhdGljIG1ldGhvZCIKcmV0dXJuIkNsb3N1
-cmUgJyIrSC5OUSh0KSsiJyJ9fQpILnJULnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
-dGhpcwppZihiPT1udWxsKXJldHVybiExCmlmKHQ9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0YW5jZW9m
-IEguclQpKXJldHVybiExCnJldHVybiB0LmE9PT1iLmEmJnQuYj09PWIuYiYmdC5jPT09Yi5jfSwKZ2lP
-OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5jCmlmKHM9PW51bGwpdD1ILmVRKHRoaXMuYSkKZWxzZSB0
-PXR5cGVvZiBzIT09Im9iamVjdCI/Si5oZihzKTpILmVRKHMpCnJldHVybih0XkguZVEodGhpcy5iKSk+
-Pj4wfSwKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKaWYodD09bnVsbCl0PXRoaXMuYQpyZXR1cm4i
-Q2xvc3VyZSAnIitILmQodGhpcy5kKSsiJyBvZiAiKygiSW5zdGFuY2Ugb2YgJyIrSC5kKEguTSh0KSkr
-IiciKX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAi
-K0guZCh0aGlzLmEpfX0KSC5rWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJBc3NlcnRp
-b24gZmFpbGVkOiAiK1AucCh0aGlzLmEpfX0KSC5ONS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXty
-ZXR1cm4gdGhpcy5hfSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguaTUodGhpcyxILkxoKHRoaXMp
-LkMoImk1PDE+IikpfSwKeDQ6ZnVuY3Rpb24oYSl7dmFyIHQscwppZih0eXBlb2YgYT09InN0cmluZyIp
-e3Q9dGhpcy5iCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuWHUodCxhKX1lbHNle3M9dGhp
-cy5DWChhKQpyZXR1cm4gc319LApDWDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQKaWYodD09bnVsbCly
-ZXR1cm4hMQpyZXR1cm4gdGhpcy5GaCh0aGlzLkJ0KHQsSi5oZihhKSYweDNmZmZmZmYpLGEpPj0wfSwK
-cTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9
-cC5iCmlmKHQ9PW51bGwpcmV0dXJuCnM9cC5qMih0LGIpCnI9cz09bnVsbD9udWxsOnMuYgpyZXR1cm4g
-cn1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3E9cC5jCmlmKHE9
-PW51bGwpcmV0dXJuCnM9cC5qMihxLGIpCnI9cz09bnVsbD9udWxsOnMuYgpyZXR1cm4gcn1lbHNlIHJl
-dHVybiBwLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMuZAppZihyPT1udWxsKXJl
-dHVybgp0PXRoaXMuQnQocixKLmhmKGEpJjB4M2ZmZmZmZikKcz10aGlzLkZoKHQsYSkKaWYoczwwKXJl
-dHVybgpyZXR1cm4gdFtzXS5ifSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG49dGhp
-cyxtPUguTGgobikKbS5kLmIoYikKbS5jaFsxXS5iKGMpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7dD1u
-LmIKbi5FSCh0PT1udWxsP24uYj1uLnpLKCk6dCxiLGMpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIi
-JiYoYiYweDNmZmZmZmYpPT09Yil7cz1uLmMKbi5FSChzPT1udWxsP24uYz1uLnpLKCk6cyxiLGMpfWVs
-c2V7cj1uLmQKaWYocj09bnVsbClyPW4uZD1uLnpLKCkKcT1KLmhmKGIpJjB4M2ZmZmZmZgpwPW4uQnQo
-cixxKQppZihwPT1udWxsKW4uRUkocixxLFtuLkhuKGIsYyldKQplbHNle289bi5GaChwLGIpCmlmKG8+
-PTApcFtvXS5iPWMKZWxzZSBwLnB1c2gobi5IbihiLGMpKX19fSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0
-LHMscj10aGlzCkguTGgocikuQygifigxLDIpIikuYihiKQp0PXIuZQpzPXIucgpmb3IoO3QhPW51bGw7
-KXtiLiQyKHQuYSx0LmIpCmlmKHMhPT1yLnIpdGhyb3cgSC5iKFAuYTQocikpCnQ9dC5jfX0sCkVIOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpCnIuZC5iKGIpCnIuY2hbMV0uYihjKQp0
-PXMuajIoYSxiKQppZih0PT1udWxsKXMuRUkoYSxiLHMuSG4oYixjKSkKZWxzZSB0LmI9Y30sCmtzOmZ1
-bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG46ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
-PXRoaXMscj1ILkxoKHMpLHE9bmV3IEguZGIoci5kLmIoYSksci5jaFsxXS5iKGIpKQppZihzLmU9PW51
-bGwpcy5lPXMuZj1xCmVsc2V7dD1zLmYKcS5kPXQKcy5mPXQuYz1xfSsrcy5hCnMua3MoKQpyZXR1cm4g
-cX0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxsKXJldHVybi0xCnQ9YS5sZW5ndGgK
-Zm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVybiBzCnJldHVybi0xfSwKdzpmdW5j
-dGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbYl19LApC
-dDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24oYSxiLGMpe2FbYl09Y30sCnJu
-OmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmoy
-KGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciB0PSI8bm9uLWlkZW50aWZpZXIta2V5PiIscz1P
-YmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocyx0LHMpCnRoaXMucm4ocyx0KQpyZXR1cm4gc30sCiRp
-Rm86MX0KSC5kYi5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1
-cm4gdGhpcy5hLmF9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hLHM9bmV3IEguTjYodCx0LnIs
-dGhpcy4kdGkuQygiTjY8MT4iKSkKcy5jPXQuZQpyZXR1cm4gc319CkguTjYucHJvdG90eXBlPXsKZ2w6
-ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz10LmEKaWYo
-dC5iIT09cy5yKXRocm93IEguYihQLmE0KHMpKQplbHNle3M9dC5jCmlmKHM9PW51bGwpe3Quc3FZKG51
-bGwpCnJldHVybiExfWVsc2V7dC5zcVkocy5hKQp0LmM9dC5jLmMKcmV0dXJuITB9fX0sCnNxWTpmdW5j
-dGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6Mzh9CkguVlgucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILnkoYSkpfSwKJFM6Mjd9CkguVlIucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6
-ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jCmlmKHMhPW51bGwpcmV0dXJuIHMKcz10LmIKcmV0dXJu
-IHQuYz1ILnY0KHQuYSxzLm11bHRpbGluZSwhcy5pZ25vcmVDYXNlLHMudW5pY29kZSxzLmRvdEFsbCwh
-MCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWjpmdW5jdGlv
-bihhLGIpe3ZhciB0LHM9dGhpcy5nSGMoKQpzLmxhc3RJbmRleD1iCnQ9cy5leGVjKGEpCmlmKHQ9PW51
-bGwpcmV0dXJuCnJldHVybiBuZXcgSC5FSyh0KX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlw
-ZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5iCmlmKGI+PXQubGVuZ3RoKXJl
-dHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9
-ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlBiKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19Ckgu
-UGIucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3Zh
-ciB0LHMscixxLHA9dGhpcyxvPXAuYgppZihvPT1udWxsKXJldHVybiExCnQ9cC5jCmlmKHQ8PW8ubGVu
-Z3RoKXtzPXAuYQpyPXMuVVoobyx0KQppZihyIT1udWxsKXtwLmQ9cgpvPXIuYgp0PW8uaW5kZXgKcT10
-K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtpZihzLmIudW5pY29kZSl7bz1wLmMKdD1vKzEKcz1wLmIKaWYo
-dDxzLmxlbmd0aCl7bz1KLnJZKHMpLm0ocyxvKQppZihvPj01NTI5NiYmbzw9NTYzMTkpe289Qy54Qi5t
-KHMsdCkKbz1vPj01NjMyMCYmbzw9NTczNDN9ZWxzZSBvPSExfWVsc2Ugbz0hMX1lbHNlIG89ITEKcT0o
-bz9xKzE6cSkrMX1wLmM9cQpyZXR1cm4hMH19cC5iPXAuZD1udWxsCnJldHVybiExfSwKJGlBbjoxfQpI
-LnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGIhPT0wKUgudmgoUC54KGIs
-bnVsbCkpCnJldHVybiB0aGlzLmN9LAokaU9kOjF9CkgudW4ucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17
-CkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYyxwPXIuYixvPXAubGVuZ3RoLG49ci5hLG09
-bi5sZW5ndGgKaWYocStvPm0pe3IuZD1udWxsCnJldHVybiExfXQ9bi5pbmRleE9mKHAscSkKaWYodDww
-KXtyLmM9bSsxCnIuZD1udWxsCnJldHVybiExfXM9dCtvCnIuZD1uZXcgSC50USh0LHApCnIuYz1zPT09
-ci5jP3MrMTpzCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKJGlBbjoxfQpI
-LkVULnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0KSC5iMC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9CkguRGcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIp
-e0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7
-SC5JZyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJv
-dG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1j
-fSwKJGljWDoxLAokaXpNOjF9CkgueGoucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikK
-SC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kRS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlpBLnByb3RvdHlw
-ZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19
-Ckgud2YucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgp
-CnJldHVybiBhW2JdfX0KSC5QcS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmVFLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEp
-e3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3Ro
-KQpyZXR1cm4gYVtiXX19CkguVjYucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVu
-Z3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2Jd
-fSwKJGlWNjoxLAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAucHJvdG90eXBlPXt9CkguV0Iu
-cHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90eXBlPXsKQzpmdW5jdGlvbihh
-KXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3E6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5cGU9e30KSC51OS5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9fQpILmh6LnByb3RvdHlwZT17fQpILmlNLnBy
-b3RvdHlwZT17fQpQLnRoLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQu
-YQp0LmE9bnVsbApzLiQwKCl9LAokUzoxMn0KUC5oYS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgdCxzCnRoaXMuYS5hPXUuTS5iKGEpCnQ9dGhpcy5iCnM9dGhpcy5jCnQuZmlyc3RDaGlsZD90LnJl
-bW92ZUNoaWxkKHMpOnQuYXBwZW5kQ2hpbGQocyl9LAokUzozOX0KUC5Wcy5wcm90b3R5cGU9ewokMDpm
-dW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5GdC5wcm90b3R5cGU9
-ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5XMy5wcm90
-b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIpe2lmKHNlbGYuc2V0VGltZW91dCE9bnVsbClzZWxmLnNldFRp
-bWVvdXQoSC50UihuZXcgUC55SCh0aGlzLGIpLDApLGEpCmVsc2UgdGhyb3cgSC5iKFAuTDQoImBzZXRU
-aW1lb3V0KClgIG5vdCBmb3VuZC4iKSl9fQpQLnlILnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhp
-cy5iLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzoyfQpQLlBmLnByb3RvdHlwZT17CncwOmZ1bmN0aW9u
-KGEsYil7dmFyIHQKaWYoYT09bnVsbClhPW5ldyBQLm4oKQp0PXRoaXMuYQppZih0LmEhPT0wKXRocm93
-IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKdC5OayhhLGIpfSwKcG06ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19ClAuWmYucHJvdG90eXBlPXt9ClAuRmUucHJvdG90
-eXBlPXsKSFI6ZnVuY3Rpb24oYSl7aWYoKHRoaXMuYyYxNSkhPT02KXJldHVybiEwCnJldHVybiB0aGlz
-LmIuYi5idih1LmFsLmIodGhpcy5kKSxhLmEsdS5jSix1LkspfSwKS3c6ZnVuY3Rpb24oYSl7dmFyIHQ9
-dGhpcy5lLHM9dS56LHI9dS5LLHE9dGhpcy4kdGkuQygiMi8iKSxwPXRoaXMuYi5iCmlmKHUudy5jKHQp
-KXJldHVybiBxLmIocC5ycCh0LGEuYSxhLmIscyxyLHUubCkpCmVsc2UgcmV0dXJuIHEuYihwLmJ2KHUu
-eS5iKHQpLGEuYSxzLHIpKX19ClAudnMucHJvdG90eXBlPXsKU3E6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMscixxPXRoaXMuJHRpCnEuS3EoYykuQygiMS8oMikiKS5iKGEpCnQ9JC5YMwppZih0IT09Qy5OVSl7
-Yy5DKCJAPDAvPiIpLktxKHEuZCkuQygiMSgyKSIpLmIoYSkKaWYoYiE9bnVsbCliPVAuVkgoYix0KX1z
-PW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQpyPWI9PW51bGw/MTozCnRoaXMueGYobmV3IFAuRmUo
-cyxyLGEsYixxLkMoIkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gc30sClc3OmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIHRoaXMuU3EoYSxudWxsLGIpfSwKT0E6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-CnUuYmYuYihudWxsKQp0PXRoaXMuJHRpCnM9JC5YMwpyPW5ldyBQLnZzKHMsdCkKaWYocyE9PUMuTlUp
-YT1QLlZIKGEscykKdGhpcy54ZihuZXcgUC5GZShyLDIsbnVsbCxhLHQuQygiQDwxPiIpLktxKHQuZCku
-QygiRmU8MSwyPiIpKSkKcmV0dXJuIHJ9LAp4ZjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMscj1zLmEK
-aWYocjw9MSl7YS5hPXUueC5iKHMuYykKcy5jPWF9ZWxzZXtpZihyPT09Mil7dD11Ll8uYihzLmMpCnI9
-dC5hCmlmKHI8NCl7dC54ZihhKQpyZXR1cm59cy5hPXIKcy5jPXQuY31QLlRrKG51bGwsbnVsbCxzLmIs
-dS5NLmIobmV3IFAuZGEocyxhKSkpfX0sCmpROmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbz10aGlz
-LG49e30Kbi5hPWEKaWYoYT09bnVsbClyZXR1cm4KdD1vLmEKaWYodDw9MSl7cz11LnguYihvLmMpCnI9
-by5jPWEKaWYocyE9bnVsbCl7Zm9yKDtxPXIuYSxxIT1udWxsO3I9cSk7ci5hPXN9fWVsc2V7aWYodD09
-PTIpe3A9dS5fLmIoby5jKQp0PXAuYQppZih0PDQpe3AualEoYSkKcmV0dXJufW8uYT10Cm8uYz1wLmN9
-bi5hPW8uTjgoYSkKUC5UayhudWxsLG51bGwsby5iLHUuTS5iKG5ldyBQLm9RKG4sbykpKX19LAphaDpm
-dW5jdGlvbigpe3ZhciB0PXUueC5iKHRoaXMuYykKdGhpcy5jPW51bGwKcmV0dXJuIHRoaXMuTjgodCl9
-LApOODpmdW5jdGlvbihhKXt2YXIgdCxzLHIKZm9yKHQ9YSxzPW51bGw7dCE9bnVsbDtzPXQsdD1yKXty
-PXQuYQp0LmE9c31yZXR1cm4gc30sCkhIOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPXMuJHRpCnIu
-QygiMS8iKS5iKGEpCmlmKHIuQygiYjg8MT4iKS5jKGEpKWlmKHIuYyhhKSlQLkE5KGEscykKZWxzZSBQ
-LmszKGEscykKZWxzZXt0PXMuYWgoKQpyLmQuYihhKQpzLmE9NApzLmM9YQpQLkhaKHMsdCl9fSwKWkw6
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMKdS5sLmIoYikKdD1zLmFoKCkKcy5hPTgKcy5jPW5ldyBQ
-LkN3KGEsYikKUC5IWihzLHQpfSwKWGY6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPXQuJHRpCnMuQygi
-MS8iKS5iKGEpCmlmKHMuQygiYjg8MT4iKS5jKGEpKXt0LmNVKGEpCnJldHVybn10LmE9MQpQLlRrKG51
-bGwsbnVsbCx0LmIsdS5NLmIobmV3IFAuckgodCxhKSkpfSwKY1U6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
-cyxzPXQuJHRpCnMuQygiYjg8MT4iKS5iKGEpCmlmKHMuYyhhKSl7aWYoYS5nQVQoKSl7dC5hPTEKUC5U
-ayhudWxsLG51bGwsdC5iLHUuTS5iKG5ldyBQLktGKHQsYSkpKX1lbHNlIFAuQTkoYSx0KQpyZXR1cm59
-UC5rMyhhLHQpfSwKTms6ZnVuY3Rpb24oYSxiKXt0aGlzLmE9MQpQLlRrKG51bGwsbnVsbCx0aGlzLmIs
-dS5NLmIobmV3IFAuWkwodGhpcyxhLGIpKSl9LAokaWI4OjF9ClAuZGEucHJvdG90eXBlPXsKJDA6ZnVu
-Y3Rpb24oKXtQLkhaKHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5cGU9ewokMDpmdW5j
-dGlvbigpe1AuSFoodGhpcy5iLHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnQuYT0wCnQuSEgoYSl9LAokUzoxMn0KUC5VNy5wcm90b3R5cGU9
-ewokMjpmdW5jdGlvbihhLGIpe3UubC5iKGIpCnRoaXMuYS5aTChhLGIpfSwKJDE6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuJDIoYSxudWxsKX0sCiRDOiIkMiIsCiREOmZ1bmN0aW9uKCl7cmV0dXJuW251bGxd
-fSwKJFM6MzR9ClAudnIucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5iLHRo
-aXMuYyl9LAokUzowfQpQLnJILnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hLHM9
-dC4kdGkuZC5iKHRoaXMuYikscj10LmFoKCkKdC5hPTQKdC5jPXMKUC5IWih0LHIpfSwKJFM6MH0KUC5L
-Ri5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuQTkodGhpcy5iLHRoaXMuYSl9LAokUzowfQpQLlpM
-LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0K
-UC5SVC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuPXRoaXMsbT1udWxs
-CnRyeXtyPW4uYwptPXIuYi5iLnp6KHUuZk8uYihyLmQpLHUueil9Y2F0Y2gocSl7dD1ILlJ1KHEpCnM9
-SC50cyhxKQppZihuLmQpe3I9dS5uLmIobi5hLmEuYykuYQpwPXQKcD1yPT1udWxsP3A9PW51bGw6cj09
-PXAKcj1wfWVsc2Ugcj0hMQpwPW4uYgppZihyKXAuYj11Lm4uYihuLmEuYS5jKQplbHNlIHAuYj1uZXcg
-UC5Ddyh0LHMpCnAuYT0hMApyZXR1cm59aWYodS5jLmMobSkpe2lmKG0gaW5zdGFuY2VvZiBQLnZzJiZt
-LmE+PTQpe2lmKG0uYT09PTgpe3I9bi5iCnIuYj11Lm4uYihtLmMpCnIuYT0hMH1yZXR1cm59bz1uLmEu
-YQpyPW4uYgpyLmI9bS5XNyhuZXcgUC5qWihvKSx1LnopCnIuYT0hMX19LAokUzoyfQpQLmpaLnByb3Rv
-dHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokUzozM30KUC5ycS5wcm90b3R5cGU9
-ewokMDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuLG09dGhpcwp0cnl7cj1tLmIKcT1yLiR0aQpw
-PXEuZApvPXAuYihtLmMpCm0uYS5iPXIuYi5iLmJ2KHEuQygiMi8oMSkiKS5iKHIuZCksbyxxLkMoIjIv
-IikscCl9Y2F0Y2gobil7dD1ILlJ1KG4pCnM9SC50cyhuKQpyPW0uYQpyLmI9bmV3IFAuQ3codCxzKQpy
-LmE9ITB9fSwKJFM6Mn0KUC5SVy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAs
-byxuLG0sbD10aGlzCnRyeXt0PXUubi5iKGwuYS5hLmMpCnE9bC5jCmlmKEgub1QocS5IUih0KSkmJnEu
-ZSE9bnVsbCl7cD1sLmIKcC5iPXEuS3codCkKcC5hPSExfX1jYXRjaChvKXtzPUguUnUobykKcj1ILnRz
-KG8pCnE9dS5uLmIobC5hLmEuYykKcD1xLmEKbj1zCm09bC5iCmlmKHA9PW51bGw/bj09bnVsbDpwPT09
-biltLmI9cQplbHNlIG0uYj1uZXcgUC5DdyhzLHIpCm0uYT0hMH19LAokUzoyfQpQLk9NLnByb3RvdHlw
-ZT17fQpQLnFoLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9e30scD1u
-ZXcgUC52cygkLlgzLHUuZkopCnEuYT0wCnQ9SC5MaChyKQpzPXQuQygifigxKSIpLmIobmV3IFAuQjUo
-cSxyKSkKdS5NLmIobmV3IFAuUEkocSxwKSkKVy5KRShyLmEsci5iLHMsITEsdC5kKQpyZXR1cm4gcH19
-ClAuQjUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7SC5MaCh0aGlzLmIpLmQuYihhKTsrK3RoaXMu
-YS5hfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gSC5MaCh0aGlzLmIpLkMoImM4KDEpIil9fQpQLlBJLnBy
-b3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLkhIKHRoaXMuYS5hKX0sCiRTOjB9ClAuTU8ucHJv
-dG90eXBlPXt9ClAua1QucHJvdG90eXBlPXt9ClAuQ3cucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
-ZXR1cm4gSC5kKHRoaXMuYSl9LAokaVhTOjF9ClAubTAucHJvdG90eXBlPXskaUpCOjF9ClAucEsucHJv
-dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMuYSxyPXMuYQpzPXI9PW51bGw/cy5hPW5l
-dyBQLm4oKTpyCnI9dGhpcy5iCmlmKHI9PW51bGwpdGhyb3cgSC5iKHMpCnQ9SC5iKHMpCnQuc3RhY2s9
-ci53KDApCnRocm93IHR9LAokUzowfQpQLkppLnByb3RvdHlwZT17CmJIOmZ1bmN0aW9uKGEpe3ZhciB0
-LHMscixxPW51bGwKdS5NLmIoYSkKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQwKCkKcmV0dXJufVAuVDgo
-cSxxLHRoaXMsYSx1LkgpfWNhdGNoKHIpe3Q9SC5SdShyKQpzPUgudHMocikKUC5MMihxLHEsdGhpcyx0
-LHUubC5iKHMpKX19LApEbDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9bnVsbApjLkMoIn4oMCki
-KS5iKGEpCmMuYihiKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDEoYikKcmV0dXJufVAueXYocSxxLHRo
-aXMsYSxiLHUuSCxjKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRzKHIpClAuTDIocSxxLHRoaXMsdCx1
-LmwuYihzKSl9fSwKUlQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuaGoodGhpcyxiLkMoIjAoKSIp
-LmIoYSksYil9LApHWTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVnAodGhpcyx1Lk0uYihhKSl9LApQ
-eTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5PUih0aGlzLGIuQygifigwKSIpLmIoYSksYil9LApx
-OmZ1bmN0aW9uKGEsYil7cmV0dXJufSwKeno6ZnVuY3Rpb24oYSxiKXtiLkMoIjAoKSIpLmIoYSkKaWYo
-JC5YMz09PUMuTlUpcmV0dXJuIGEuJDAoKQpyZXR1cm4gUC5UOChudWxsLG51bGwsdGhpcyxhLGIpfSwK
-YnY6ZnVuY3Rpb24oYSxiLGMsZCl7Yy5DKCJAPDA+IikuS3EoZCkuQygiMSgyKSIpLmIoYSkKZC5iKGIp
-CmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQxKGIpCnJldHVybiBQLnl2KG51bGwsbnVsbCx0aGlzLGEs
-YixjLGQpfSwKcnA6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2QuQygiQDwwPiIpLktxKGUpLktxKGYpLkMo
-IjEoMiwzKSIpLmIoYSkKZS5iKGIpCmYuYihjKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMihiLGMp
-CnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxmKX19ClAuaGoucHJvdG90eXBlPXsK
-JDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnp6KHRoaXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24o
-KXtyZXR1cm4gdGhpcy5jLkMoIjAoKSIpfX0KUC5WcC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjJ9ClAuT1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
-YSl7dmFyIHQ9dGhpcy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5iLHQuYihhKSx0KX0sCiRTOmZ1bmN0
-aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlwZT17CmdrejpmdW5jdGlv
-bihhKXt2YXIgdD10aGlzLHM9bmV3IFAubG0odCx0LnIsSC5MaCh0KS5DKCJsbTwxPiIpKQpzLmM9dC5l
-CnJldHVybiBzfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCnRnOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7dD10aGlzLmIKaWYo
-dD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5KLmIodFtiXSkhPW51bGx9ZWxzZXtzPXRoaXMuUFIoYikK
-cmV0dXJuIHN9fSwKUFI6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuITEK
-cmV0dXJuIHRoaXMuREYodFt0aGlzLk4oYSldLGEpPj0wfSwKaTpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
-cj10aGlzCkguTGgocikuZC5iKGIpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18i
-KXt0PXIuYgpyZXR1cm4gci5iUSh0PT1udWxsP3IuYj1QLlQyKCk6dCxiKX1lbHNlIGlmKHR5cGVvZiBi
-PT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1iKXtzPXIuYwpyZXR1cm4gci5iUShzPT1udWxsP3Iu
-Yz1QLlQyKCk6cyxiKX1lbHNlIHJldHVybiByLkI3KGIpfSwKQjc6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHE9dGhpcwpILkxoKHEpLmQuYihhKQp0PXEuZAppZih0PT1udWxsKXQ9cS5kPVAuVDIoKQpzPXEuTihh
-KQpyPXRbc10KaWYocj09bnVsbCl0W3NdPVtxLnlvKGEpXQplbHNle2lmKHEuREYocixhKT49MClyZXR1
-cm4hMQpyLnB1c2gocS55byhhKSl9cmV0dXJuITB9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwpp
-Zih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIilyZXR1cm4gdC5MKHQuYixiKQplbHNl
-IGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1iKXJldHVybiB0LkwodC5jLGIp
-CmVsc2UgcmV0dXJuIHQucWcoYil9LApxZzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1w
-LmQKaWYobz09bnVsbClyZXR1cm4hMQp0PXAuTihhKQpzPW9bdF0Kcj1wLkRGKHMsYSkKaWYocjwwKXJl
-dHVybiExCnE9cy5zcGxpY2UociwxKVswXQppZigwPT09cy5sZW5ndGgpZGVsZXRlIG9bdF0KcC5HUyhx
-KQpyZXR1cm4hMH0sCmJROmZ1bmN0aW9uKGEsYil7SC5MaCh0aGlzKS5kLmIoYikKaWYodS5KLmIoYVti
-XSkhPW51bGwpcmV0dXJuITEKYVtiXT10aGlzLnlvKGIpCnJldHVybiEwfSwKTDpmdW5jdGlvbihhLGIp
-e3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuITEKdD11LkouYihhW2JdKQppZih0PT1udWxsKXJldHVybiEx
-CnRoaXMuR1ModCkKZGVsZXRlIGFbYl0KcmV0dXJuITB9LApTOmZ1bmN0aW9uKCl7dGhpcy5yPTEwNzM3
-NDE4MjMmdGhpcy5yKzF9LAp5bzpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMscj1uZXcgUC5ibihILkxo
-KHMpLmQuYihhKSkKaWYocy5lPT1udWxsKXMuZT1zLmY9cgplbHNle3Q9cy5mCnIuYz10CnMuZj10LmI9
-cn0rK3MuYQpzLlMoKQpyZXR1cm4gcn0sCkdTOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1hLmMscj1h
-LmIKaWYocz09bnVsbCl0LmU9cgplbHNlIHMuYj1yCmlmKHI9PW51bGwpdC5mPXMKZWxzZSByLmM9czst
-LXQuYQp0LlMoKX0sCk46ZnVuY3Rpb24oYSl7cmV0dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGOmZ1
-bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxsKXJldHVybi0xCnQ9YS5sZW5ndGgKZm9yKHM9MDtz
-PHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVybiBzCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9
-e30KUC5sbS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9u
-KCl7dmFyIHQ9dGhpcyxzPXQuYQppZih0LmIhPT1zLnIpdGhyb3cgSC5iKFAuYTQocykpCmVsc2V7cz10
-LmMKaWYocz09bnVsbCl7dC5zaihudWxsKQpyZXR1cm4hMX1lbHNle3Quc2oodC4kdGkuZC5iKHMuYSkp
-CnQuYz10LmMuYgpyZXR1cm4hMH19fSwKc2o6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihh
-KX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30KUC5MVS5wcm90b3R5cGU9eyRpY1g6MSwkaXpNOjF9
-ClAubEQucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5hNyhhLHRoaXMuZ0Eo
-YSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEs
-Yil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnpLKGEpLkMoIn4obEQuRSkiKS5iKGIpCnQ9dGhp
-cy5nQShhKQpmb3Iocz0wO3M8dDsrK3Mpe2IuJDEodGhpcy5xKGEscykpCmlmKHQhPT10aGlzLmdBKGEp
-KXRocm93IEguYihQLmE0KGEpKX19LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC56SyhhKQpyZXR1
-cm4gbmV3IEguQTgoYSx0LktxKGMpLkMoIjEobEQuRSkiKS5iKGIpLHQuQygiQDxsRC5FPiIpLktxKGMp
-LkMoIkE4PDEsMj4iKSl9LApkdTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdApILnpLKGEpLkMoImxELkUi
-KS5iKGQpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZvcih0PWI7dDxjOysrdCl0aGlzLlkoYSx0LGQpfSwK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5H
-QS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5hCmlmKCFzLmEpdGhpcy5i
-LmErPSIsICIKcy5hPSExCnM9dGhpcy5iCnQ9cy5hKz1ILmQoYSkKcy5hPXQrIjogIgpzLmErPUguZChi
-KX0sCiRTOjF9ClAuWWsucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC5MaCh0aGlz
-KS5DKCJ+KFlrLkssWWsuVikiKS5iKGIpCmZvcih0PUouSVQodGhpcy5nVigpKTt0LkYoKTspe3M9dC5n
-bCgpCmIuJDIocyx0aGlzLnEoMCxzKSl9fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5n
-VigpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LAokaVowOjF9ClAuS1AucHJvdG90
-eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFdLmIo
-YykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19ClAuUG4u
-cHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIpfSwKWTpmdW5jdGlv
-bihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0aGlzLmEuWSgwLHQuZC5iKGIpLHQuY2hbMV0uYihjKSl9
-LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxILkxoKHRoaXMpLkMoIn4oMSwyKSIpLmIoYikpfSwK
-Z0E6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0LmdBKHQpfSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4gSi5qKHRoaXMuYSl9LAokaVowOjF9ClAuR2oucHJvdG90eXBlPXt9ClAubGYucHJvdG90eXBl
-PXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfX0KUC5Wai5wcm90b3R5cGU9
-eyRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXsKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3Io
-dD1KLklUKEguTGgodGhpcykuQygiY1g8MT4iKS5iKGIpKTt0LkYoKTspdGhpcy5pKDAsdC5nbCgpKX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sCkg6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzPVAucmoodGhpcyx0aGlzLnIsSC5MaCh0aGlzKS5kKQppZighcy5GKCkpcmV0dXJuIiIKaWYo
-Yj09PSIiKXt0PSIiCmRvIHQrPUguZChzLmQpCndoaWxlKHMuRigpKX1lbHNle3Q9SC5kKHMuZCkKZm9y
-KDtzLkYoKTspdD10K2IrSC5kKHMuZCl9cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaWNY
-OjEsCiRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5
-cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmIKaWYocz09
-bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4K
-ZWxzZXt0PXNbYl0KcmV0dXJuIHR5cGVvZiB0PT0idW5kZWZpbmVkIj90aGlzLmZiKGIpOnR9fSwKZ0E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYj09bnVsbD90aGlzLmMuYTp0aGlzLkNmKCkubGVuZ3RofSwK
-Z1Y6ZnVuY3Rpb24oKXtpZih0aGlzLmI9PW51bGwpe3ZhciB0PXRoaXMuYwpyZXR1cm4gbmV3IEguaTUo
-dCxILkxoKHQpLkMoImk1PDE+IikpfXJldHVybiBuZXcgUC5pOCh0aGlzKX0sClk6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciB0LHMscj10aGlzCmlmKHIuYj09bnVsbClyLmMuWSgwLGIsYykKZWxzZSBpZihyLng0KGIp
-KXt0PXIuYgp0W2JdPWMKcz1yLmEKaWYocz09bnVsbD90IT1udWxsOnMhPT10KXNbYl09bnVsbH1lbHNl
-IHIuWEsoKS5ZKDAsYixjKX0sCng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhp
-cy5jLng0KGEpCnJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5h
-LGEpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcwp1LmNBLmIoYikKaWYocC5iPT1u
-dWxsKXJldHVybiBwLmMuSygwLGIpCnQ9cC5DZigpCmZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtz
-XQpxPXAuYltyXQppZih0eXBlb2YgcT09InVuZGVmaW5lZCIpe3E9UC5RZShwLmFbcl0pCnAuYltyXT1x
-fWIuJDIocixxKQppZih0IT09cC5jKXRocm93IEguYihQLmE0KHApKX19LApDZjpmdW5jdGlvbigpe3Zh
-ciB0PXUuai5iKHRoaXMuYykKaWYodD09bnVsbCl0PXRoaXMuYz1ILlZNKE9iamVjdC5rZXlzKHRoaXMu
-YSksdS5zKQpyZXR1cm4gdH0sClhLOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvPXRoaXMKaWYoby5i
-PT1udWxsKXJldHVybiBvLmMKdD1QLkZsKHUuTix1LnopCnM9by5DZigpCmZvcihyPTA7cT1zLmxlbmd0
-aCxyPHE7KytyKXtwPXNbcl0KdC5ZKDAscCxvLnEoMCxwKSl9aWYocT09PTApQy5ObS5pKHMsbnVsbCkK
-ZWxzZSBDLk5tLnNBKHMsMCkKby5hPW8uYj1udWxsCnJldHVybiBvLmM9dH0sCmZiOmZ1bmN0aW9uKGEp
-e3ZhciB0CmlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpKXJl
-dHVybgp0PVAuUWUodGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlwZT17
-CmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5nQSh0KX0sCkU6ZnVuY3Rpb24oYSxi
-KXt2YXIgdD10aGlzLmEKaWYodC5iPT1udWxsKXQ9dC5nVigpLkUoMCxiKQplbHNle3Q9dC5DZigpCmlm
-KGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQp0PXRbYl19cmV0dXJuIHR9LApna3o6ZnVu
-Y3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQuYj09bnVsbCl7dD10LmdWKCkKdD10Lmdreih0KX1lbHNl
-e3Q9dC5DZigpCnQ9bmV3IEoubTEodCx0Lmxlbmd0aCxILnQ2KHQpLkMoIm0xPDE+IikpfXJldHVybiB0
-fX0KUC5DVi5wcm90b3R5cGU9ewp5cjpmdW5jdGlvbihhLGEwLGExKXt2YXIgdCxzLHIscSxwLG8sbixt
-LGwsayxqLGksaCxnLGYsZSxkLGMsYj0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTE9
-UC5qQihhMCxhMSxhLmxlbmd0aCkKdD0kLlY3KCkKZm9yKHM9YTAscj1zLHE9bnVsbCxwPS0xLG89LTEs
-bj0wO3M8YTE7cz1tKXttPXMrMQpsPUMueEIuVyhhLHMpCmlmKGw9PT0zNyl7az1tKzIKaWYoazw9YTEp
-e2o9SC5vbyhDLnhCLlcoYSxtKSkKaT1ILm9vKEMueEIuVyhhLG0rMSkpCmg9aioxNitpLShpJjI1NikK
-aWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1lbHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lmKGg8
-MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxoKQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLm0oIkFC
-Q0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5
-Ky8iLGcpCmlmKGg9PT1sKWNvbnRpbnVlCmw9aH1lbHNle2lmKGc9PT0tMSl7aWYocDwwKXtmPXE9PW51
-bGw/bnVsbDpxLmEubGVuZ3RoCmlmKGY9PW51bGwpZj0wCnA9Zisocy1yKQpvPXN9KytuCmlmKGw9PT02
-MSljb250aW51ZX1sPWh9aWYoZyE9PS0yKXtpZihxPT1udWxsKXE9bmV3IFAuUm4oIiIpCnEuYSs9Qy54
-Qi5OaihhLHIscykKcS5hKz1ILkx3KGwpCnI9bQpjb250aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFs
-aWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkKZT1m
-Lmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAsbixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkrMQpp
-ZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEpKQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9ZjsrK2R9
-fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEsZi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1hMS1h
-MAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQplbHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0xKXRo
-cm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlhPUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0iOiI9
-Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3Rv
-dHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpmdW5j
-dGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpnWkU6
-ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFy
-IHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxxPXItMAppZihxPT09MClyZXR1cm4gbmV3IFVpbnQ4
-QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMpCnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAscikh
-PT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJuIG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXkoMCxI
-LnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxvPXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2MzIw
-KXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpzLmI9cAppZihxPj1vKXJldHVybiBILk9IKHIs
-cSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0x
-Mjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0xMjh8dD4+
-PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8dCY2MwpyZXR1cm4h
-MH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIyNHxhPj4+MTIKcT1zLmI9
-cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlmKHE+
-PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxhJjYzCnJldHVybiExfX0sCkd4OmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKaWYoYiE9PWMmJihDLnhCLm0oYSxjLTEpJjY0NTEy
-KT09PTU1Mjk2KS0tYwpmb3IodD1tLmMscz10Lmxlbmd0aCxyPWI7cjxjOysrcil7cT1DLnhCLlcoYSxy
-KQppZihxPD0xMjcpe3A9bS5iCmlmKHA+PXMpYnJlYWsKbS5iPXArMQp0W3BdPXF9ZWxzZSBpZigocSY2
-NDUxMik9PT01NTI5Nil7aWYobS5iKzM+PXMpYnJlYWsKbz1yKzEKaWYobS5PNihxLEMueEIuVyhhLG8p
-KSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpuPXArMQppZihuPj1zKWJyZWFrCm0uYj1uCmlmKHA+
-PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5MnxxPj4+NgptLmI9bisxCnRbbl09MTI4fHEmNjN9ZWxz
-ZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0
-W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+PXMpcmV0dXJuIEguT0godCxuKQp0W25dPTEyOHxx
-Pj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTEyOHxxJjYzfX1yZXR1
-cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxs
-CnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkKaWYodCE9bnVsbClyZXR1cm4gdApzPVAuakIoMCxu
-dWxsLEouSG0oYSkpCnI9UC53RyhhLDAscykKaWYocj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1zKXJl
-dHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9ZWxzZXtvPTAKcD1udWxsCm49ITB9aWYocD09bnVs
-bClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCExLHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0uZT4w
-KXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9SC5M
-dyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpyZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6bH19
-ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxr
-LGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29kaW5nIDB4Igp1LkwuYihhKQp0PWguZApzPWguZQpy
-PWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpmb3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtvPWop
-eyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1jKWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8pCmlm
-KHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4uek0oKQppZigobiYxOTIpIT09MTI4KXttPVAucnIo
-ZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5iKG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7LS1z
-Oysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8fG0+PTQpcmV0dXJuIEguT0goQy5HYixtKQppZih0
-PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVuY29kaW5nIG9mIDB4IitDLmpuLldaKHQsMTYpLGEs
-by1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQxMTEpe209UC5ycigiQ2hhcmFjdGVyIG91dHNpZGUg
-dmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4uV1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5iKG0p
-fWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHcodCkKaC5jPSExfWZvcihtPW88YzttOyl7bD1QLndH
-KGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApwLmErPVAuSE0oYSxvLGspCmlmKGs9PT1jKWJyZWFr
-fWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYodHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4gbi5K
-KCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVURi04IGNvZGUgdW5pdDogLTB4IitDLmpuLldaKC1u
-LDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7aWYoKG4mMjI0KT09PTE5Mil7dD1uJjMxCnM9MQpy
-PTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0MCk9PT0yMjQpe3Q9biYxNQpzPTIKcj0yCmNvbnRp
-bnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQwJiZuPDI0NSl7dD1uJjcKcz0zCnI9Mwpjb250aW51
-ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5XWihuLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfX1icmVh
-ayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9cwpoLmY9cn19fQpQLldGLnByb3RvdHlwZT17CiQy
-OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8uYihhKQp0PXRoaXMuYgpzPXRoaXMuYQp0LmErPXMu
-YQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0LmErPVAucChiKQpzLmE9IiwgIn0sCiRTOjI2fQpQ
-LmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVs
-bClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApnaU86
-ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4MjN9
-LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1QLkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQpKSxx
-PVAuaDAoSC5qQSh0KSkscD1QLmgwKEguS0wodCkpLG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5KZCh0
-KSksbT1QLlZ4KEgubzEodCkpLGw9cysiLSIrcisiLSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIrbQpy
-ZXR1cm4gbH19ClAuQ1AucHJvdG90eXBlPXt9ClAuWFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90eXBl
-PXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKaWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZh
-aWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5j
-dGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5j
-dGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMsbj1v
-IT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQKdD1vPT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5nWigp
-K24rdAppZighcC5hKXJldHVybiBzCnI9cC5ndSgpCnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAiK3F9
-fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVu
-Y3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlmKHI9PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8iOiBO
-b3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5kKHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09bnVs
-bCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIpdD0i
-OiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4uIitILmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9czxy
-PyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5k
-KHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5nZUVy
-cm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz1ILlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVt
-YmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZl
-Igp0PXRoaXMuZgppZih0PT09MClyZXR1cm4iOiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjog
-aW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0guZCh0KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxs
-PXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQprLmE9IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0wLHE9
-IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10W3JdCmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9Iiwg
-In1sLmQuSygwLG5ldyBQLldGKGssaikpCm49UC5wKGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0aG9k
-RXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0guZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24rIlxu
-QXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4gdH19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
-KXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJv
-cjogIit0OiJVbmltcGxlbWVudGVkRXJyb3IifX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJp
-bmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRp
-b246ICIrUC5wKHQpKyIuIn19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0
-IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
-U3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQLmMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIg
-dD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMg
-aW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBpdHMg
-aW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJFeGNl
-cHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixx
-LHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWghPW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0aW9u
-OiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixmPXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2YgZT09
-InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8fGY+ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1udWxs
-CmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/Qy54Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJuIGcr
-IlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0wO3A8ZjsrK3Ape289Qy54Qi5XKGUscCkKaWYobz09PTEw
-KXtpZihyIT09cHx8IXEpKytzCnI9cCsxCnE9ITF9ZWxzZSBpZihvPT09MTMpeysrcwpyPXArMQpxPSEw
-fX1nPXM+MT9nKygiIChhdCBsaW5lICIrcysiLCBjaGFyYWN0ZXIgIisoZi1yKzEpKyIpXG4iKTpnKygi
-IChhdCBjaGFyYWN0ZXIgIisoZisxKSsiKVxuIikKbj1lLmxlbmd0aApmb3IocD1mO3A8bjsrK3Ape289
-Qy54Qi5tKGUscCkKaWYobz09PTEwfHxvPT09MTMpe249cApicmVha319aWYobi1yPjc4KWlmKGYtcjw3
-NSl7bT1yKzc1Cmw9cgprPSIiCmo9Ii4uLiJ9ZWxzZXtpZihuLWY8NzUpe2w9bi03NQptPW4Kaj0iIn1l
-bHNle2w9Zi0zNgptPWYrMzYKaj0iLi4uIn1rPSIuLi4ifWVsc2V7bT1uCmw9cgprPSIiCmo9IiJ9aT1D
-LnhCLk5qKGUsbCxtKQpyZXR1cm4gZytrK2kraisiXG4iK0MueEIuSXgoIiAiLGYtbCtrLmxlbmd0aCkr
-Il5cbiJ9ZWxzZSByZXR1cm4gZiE9bnVsbD9nKygiIChhdCBvZmZzZXQgIitILmQoZikrIikiKTpnfX0K
-UC5FSC5wcm90b3R5cGU9e30KUC5LTi5wcm90b3R5cGU9e30KUC5jWC5wcm90b3R5cGU9ewpldjpmdW5j
-dGlvbihhLGIpe3ZhciB0PUguTGgodGhpcykKcmV0dXJuIG5ldyBILlU1KHRoaXMsdC5DKCJhMihjWC5F
-KSIpLmIoYiksdC5DKCJVNTxjWC5FPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5na3oo
-dGhpcykKZm9yKHQ9MDtzLkYoKTspKyt0CnJldHVybiB0fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiF0
-aGlzLmdreih0aGlzKS5GKCl9LApncjg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmdreih0aGlzKQpp
-Zighcy5GKCkpdGhyb3cgSC5iKEguV3AoKSkKdD1zLmdsKCkKaWYocy5GKCkpdGhyb3cgSC5iKEguZFUo
-KSkKcmV0dXJuIHR9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyClAuazEoYiwiaW5kZXgiKQpmb3Io
-dD10aGlzLmdreih0aGlzKSxzPTA7dC5GKCk7KXtyPXQuZ2woKQppZihiPT09cylyZXR1cm4gcjsrK3N9
-dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxzKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVy
-biBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17JGlj
-WDoxfQpQLlowLnByb3RvdHlwZT17fQpQLmM4LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1
-cm4gUC5rLnByb3RvdHlwZS5naU8uY2FsbCh0aGlzLHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4i
-bnVsbCJ9fQpQLkZLLnByb3RvdHlwZT17fQpQLmsucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmssJGlr
-OjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
-biBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTSh0
-aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJvdyBILmIoUC5scih0aGlzLGIu
-Z1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnco
-dGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmliLnByb3RvdHlwZT17JGlPZDoxfQpQLnh1LnByb3Rv
-dHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLnFVLnByb3RvdHlwZT17JGl2WDoxfQpQLlJuLnByb3Rv
-dHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihhKXt2
-YXIgdD10aGlzLmEKcmV0dXJuIHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaUJMOjF9ClAuR0QucHJv
-dG90eXBlPXt9ClAubjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmYu
-YihhKQpILnkoYikKdD1KLnJZKGIpLk9ZKGIsIj0iKQppZih0PT09LTEpe2lmKGIhPT0iIilhLlkoMCxQ
-Lmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmooYiww
-LHQpCnI9Qy54Qi5HKGIsdCsxKQpxPXRoaXMuYQphLlkoMCxQLmt1KHMsMCxzLmxlbmd0aCxxLCEwKSxQ
-Lmt1KHIsMCxyLmxlbmd0aCxxLCEwKSl9cmV0dXJuIGF9LAokUzoyM30KUC5jUy5wcm90b3R5cGU9ewok
-MjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIithLHRo
-aXMuYSxiKSl9LAokUzoyMX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEgu
-YihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6MTh9ClAudHAucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
-b24oYSxiKXt2YXIgdAppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFydCBjYW4gb25seSBjb250
-YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMiLGEpCnQ9UC5RQShDLnhCLk5qKHRoaXMuYixhLGIp
-LG51bGwsMTYpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCmlmKHQ8MHx8dD42NTUz
-NSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZg
-IixhKQpyZXR1cm4gdH0sCiRTOjE3fQpQLkRuLnByb3RvdHlwZT17CmdrdTpmdW5jdGlvbigpe3JldHVy
-biB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwpcmV0dXJuIiIK
-aWYoQy54Qi5uKHQsIlsiKSlyZXR1cm4gQy54Qi5Oaih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9LApn
-dHA6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5hKQpy
-ZXR1cm4gdH0sCmd0UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0fSwK
-Z0thOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yCnJldHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5jdGlv
-bihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCnUuWC5iKG51bGwpCnUuYS5iKGIpCnQ9bC5h
-CnM9dD09PSJmaWxlIgpyPWwuYgpxPWwuZApwPWwuYwppZighKHAhPW51bGwpKXA9ci5sZW5ndGghPT0w
-fHxxIT1udWxsfHxzPyIiOm51bGwKbz1sLmUKaWYoIXMpbj1wIT1udWxsJiZvLmxlbmd0aCE9PTAKZWxz
-ZSBuPSEwCmlmKG4mJiFDLnhCLm4obywiLyIpKW89Ii8iK28KaWYoYiE9bnVsbCltPVAubGUobnVsbCww
-LDAsYikKZWxzZSBtPWwuZgpyZXR1cm4gbmV3IFAuRG4odCxyLHAscSxvLG0sbC5yKX0sCmdGajpmdW5j
-dGlvbigpe3ZhciB0LHM9dGhpcy54CmlmKHMhPW51bGwpcmV0dXJuIHMKdD10aGlzLmUKaWYodC5sZW5n
-dGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9Qy54Qi5HKHQsMSkKcz10PT09IiI/Qy54RDpQLkFGKG5l
-dyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyksdS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0aGlz
-LnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51bGwp
-e3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09bnVsbD8iIjp0KSx1LlcpKX1yZXR1cm4gcy5RfSwK
-Smg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIuLi8i
-LHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkpYnJl
-YWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTwwKWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98fHA9
-PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFvfHxDLnhCLm0oYSxxKzIpPT09NDYKZWxzZSBvPSEx
-CmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9cmV0dXJuIEMueEIuaTcoYSxyKzEsbnVsbCxDLnhC
-LkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpm
-dW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgpLmxl
-bmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEuZ3hB
-KCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0iIn1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQoKT9h
-Lmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPVAud0Io
-YS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShhLmdJaShhKSkKbz1hLmdRRCgpP2EuZ3RQKCk6an1l
-bHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lpKGEpPT09IiIpe3A9ay5lCm89YS5nUUQoKT9hLmd0
-UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhlKGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4ubGVu
-Z3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVs
-c2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXttPWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0aD09
-PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIvIikpcD1QLnhlKG0pCmVsc2UgcD1QLndGKG0sIWx8
-fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpqfX19cmV0dXJuIG5ldyBQLkRuKHQscyxyLHEscCxv
-LGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9LApn
-eEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
-aXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rp
-b24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhp
-cyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
-IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChxKSsiIFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8iIjpx
-KSE9PSIiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJ
-IHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKcT1yLnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJv
-dyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJh
-Z21lbnQgY29tcG9uZW50IikpCnQ9JC53USgpCmlmKEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYoci5j
-IT1udWxsJiZyLmdKZihyKSE9PSIiKUgudmgoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93
-cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmooKQpQ
-LmtFKHMsITEpCnE9UC52ZyhDLnhCLm4oci5lLCIvIik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNvZGVB
-dCgwKT09MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD1xLnkK
-aWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxsCmlm
-KCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEuYgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAiCmlm
-KCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXArIjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUKdD1x
-LmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIKaWYodCE9bnVsbClwPXArIiMiK3QKcD1xLnk9cC5j
-aGFyQ29kZUF0KDApPT0wP3A6cH1yZXR1cm4gcH0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRo
-aXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihyPT09YilyZXR1cm4hMAppZih1LnYuYyhiKSlpZihyLmE9
-PWIuZ0ZpKCkpaWYoci5jIT1udWxsPT09Yi5nY2ooKSlpZihyLmI9PWIuZ2t1KCkpaWYoci5nSmYocik9
-PWIuZ0pmKGIpKWlmKHIuZ3RwKHIpPT1iLmd0cChiKSlpZihyLmU9PT1iLmdJaShiKSl7dD1yLmYKcz10
-PT1udWxsCmlmKCFzPT09Yi5nUUQoKSl7aWYocyl0PSIiCmlmKHQ9PT1iLmd0UCgpKXt0PXIucgpzPXQ9
-PW51bGwKaWYoIXM9PT1iLmdaOCgpKXtpZihzKXQ9IiIKdD10PT09Yi5nS2EoKX1lbHNlIHQ9ITF9ZWxz
-ZSB0PSExfWVsc2UgdD0hMX1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKZWxz
-ZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKcmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9
-dGhpcy56CnJldHVybiB0PT1udWxsP3RoaXMuej1DLnhCLmdpTyh0aGlzLncoMCkpOnR9LApzbzY6ZnVu
-Y3Rpb24oYSl7dGhpcy54PXUuaS5iKGEpfSwKc1JIOmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihhKX0s
-CiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXtyZXR1
-cm4gdGhpcy5lfX0KUC5lMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5ycigi
-SW52YWxpZCBwb3J0Iix0aGlzLmEsdGhpcy5iKzEpKX0sCiRTOjE2fQpQLk5ZLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3ZhciB0PSJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEouemwo
-YSwiLyIpKWlmKHRoaXMuYSl0aHJvdyBILmIoUC54WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0KHQr
-YSkpfSwKJFM6MTZ9ClAuUloucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5a
-SixhLEMueE0sITEpfSwKJFM6OH0KUC5NRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0
-PXRoaXMuYixzPXRoaXMuYQp0LmErPXMuYQpzLmE9IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEsQy54
-TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAoQy5G
-MyxiLEMueE0sITApKX19LAokUzoxOX0KUC55NS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMKSC55KGEpCmlmKGI9PW51bGx8fHR5cGVvZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxILnko
-YikpCmVsc2UgZm9yKHQ9Si5JVCh1LlIuYihiKSkscz10aGlzLmE7dC5GKCk7KXMuJDIoYSxILnkodC5n
-bCgpKSl9LAokUzoxNX0KUC5QRS5wcm90b3R5cGU9ewpnbFI6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxw
-PXRoaXMsbz1udWxsLG49cC5jCmlmKG4hPW51bGwpcmV0dXJuIG4Kbj1wLmIKaWYoMD49bi5sZW5ndGgp
-cmV0dXJuIEguT0gobiwwKQp0PXAuYQpuPW5bMF0rMQpzPUMueEIuWFUodCwiPyIsbikKcj10Lmxlbmd0
-aAppZihzPj0wKXtxPVAudU8odCxzKzEscixDLlZDLCExKQpyPXN9ZWxzZSBxPW8KcmV0dXJuIHAuYz1u
-ZXcgUC5xZSgiZGF0YSIsbyxvLG8sUC51Tyh0LG4scixDLldkLCExKSxxLG8pfSwKdzpmdW5jdGlvbihh
-KXt2YXIgdCxzPXRoaXMuYgppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCnQ9dGhpcy5hCnJl
-dHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQLnEzLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAokUzoyMH0KUC55SS5wcm90b3R5cGU9ewokMjpmdW5j
-dGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGEpCnQ9dFth
-XQpKLkNNKHQsMCw5NixiKQpyZXR1cm4gdH0sCiRTOjQyfQpQLmM2LnByb3RvdHlwZT17CiQzOmZ1bmN0
-aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1iLmxlbmd0aCxzPWEubGVuZ3RoLHI9MDtyPHQ7Kyty
-KXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PXMpcmV0dXJuIEguT0goYSxxKQphW3FdPWN9fX0KUC5xZC5w
-cm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKZm9yKHQ9Qy54Qi5XKGIsMCks
-cz1DLnhCLlcoYiwxKSxyPWEubGVuZ3RoO3Q8PXM7Kyt0KXtxPSh0Xjk2KT4+PjAKaWYocT49cilyZXR1
-cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLlVmLnByb3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVy
-biB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3ZhciB0LHMKaWYodGhpcy5jPjApe3Q9dGhpcy5kCmlm
-KHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuaCgpCnM9dGhpcy5lCmlmKHR5cGVvZiBzIT09Im51
-bWJlciIpcmV0dXJuIEgucFkocykKcz10KzE8cwp0PXN9ZWxzZSB0PSExCnJldHVybiB0fSwKZ1FEOmZ1
-bmN0aW9uKCl7dmFyIHQ9dGhpcy5mCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCnJl
-dHVybiB0PHRoaXMucn0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0aH0s
-CmdOdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9PT00JiZDLnhCLm4odGhpcy5hLCJmaWxlIil9LApn
-dmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiaHR0cCIpfSwKZ3FC
-OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTUmJkMueEIubih0aGlzLmEsImh0dHBzIil9LApndFQ6
-ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rpb24o
-KXt2YXIgdCxzPXRoaXMscj0icGFja2FnZSIscT1zLmIKaWYocTw9MClyZXR1cm4iIgp0PXMueAppZih0
-IT1udWxsKXJldHVybiB0CmlmKHMuZ3ZoKCkpcT1zLng9Imh0dHAiCmVsc2UgaWYocy5ncUIoKSl7cy54
-PSJodHRwcyIKcT0iaHR0cHMifWVsc2UgaWYocy5nTncoKSl7cy54PSJmaWxlIgpxPSJmaWxlIn1lbHNl
-IGlmKHE9PT03JiZDLnhCLm4ocy5hLHIpKXtzLng9cgpxPXJ9ZWxzZXtxPUMueEIuTmoocy5hLDAscSkK
-cy54PXF9cmV0dXJuIHF9LApna3U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmMscz10aGlzLmIrMwpyZXR1
-cm4gdD5zP0MueEIuTmoodGhpcy5hLHMsdC0xKToiIn0sCmdKZjpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LmMKcmV0dXJuIHQ+MD9DLnhCLk5qKHRoaXMuYSx0LHRoaXMuZCk6IiJ9LApndHA6ZnVuY3Rpb24oYSl7
-dmFyIHQscz10aGlzCmlmKHMuZ3hBKCkpe3Q9cy5kCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJu
-IHQuaCgpCnJldHVybiBQLlFBKEMueEIuTmoocy5hLHQrMSxzLmUpLG51bGwsbnVsbCl9aWYocy5ndmgo
-KSlyZXR1cm4gODAKaWYocy5ncUIoKSlyZXR1cm4gNDQzCnJldHVybiAwfSwKZ0lpOmZ1bmN0aW9uKGEp
-e3JldHVybiBDLnhCLk5qKHRoaXMuYSx0aGlzLmUsdGhpcy5mKX0sCmd0UDpmdW5jdGlvbigpe3ZhciB0
-PXRoaXMuZixzPXRoaXMucgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4g
-dDxzP0MueEIuTmoodGhpcy5hLHQrMSxzKToiIn0sCmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucixz
-PXRoaXMuYQpyZXR1cm4gdDxzLmxlbmd0aD9DLnhCLkcocyx0KzEpOiIifSwKZ0ZqOmZ1bmN0aW9uKCl7
-dmFyIHQscyxyPXRoaXMuZSxxPXRoaXMuZixwPXRoaXMuYQppZihDLnhCLlFpKHAsIi8iLHIpKXtpZih0
-eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLmgoKTsrK3J9aWYocj09cSlyZXR1cm4gQy54RAp0PUgu
-Vk0oW10sdS5zKQpzPXIKd2hpbGUoITApe2lmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSigp
-CmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIEgucFkocSkKaWYoIShzPHEpKWJyZWFrCmlmKEMu
-eEIubShwLHMpPT09NDcpe0MuTm0uaSh0LEMueEIuTmoocCxyLHMpKQpyPXMrMX0rK3N9Qy5ObS5pKHQs
-Qy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQsdS5OKX0sCmdoWTpmdW5jdGlvbigpe3ZhciB0PXRo
-aXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQppZih0Pj10aGlzLnIpcmV0dXJu
-IEMuV08KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhpcy5ndFAoKSksdS5XKX0sCmtYOmZ1bmN0aW9uKGEp
-e3ZhciB0LHM9dGhpcy5kCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuaCgpCnQ9cysxCnJl
-dHVybiB0K2EubGVuZ3RoPT09dGhpcy5lJiZDLnhCLlFpKHRoaXMuYSxhLHQpfSwKTjk6ZnVuY3Rpb24o
-KXt2YXIgdD10aGlzLHM9dC5yLHI9dC5hCmlmKHM+PXIubGVuZ3RoKXJldHVybiB0CnJldHVybiBuZXcg
-UC5VZihDLnhCLk5qKHIsMCxzKSx0LmIsdC5jLHQuZCx0LmUsdC5mLHMsdC54KX0sCm5tOmZ1bmN0aW9u
-KGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnUuWC5iKG51bGwpCnUu
-YS5iKGIpCnQ9aS5nRmkoKQpzPXQ9PT0iZmlsZSIKcj1pLmMKcT1yPjA/Qy54Qi5OaihpLmEsaS5iKzMs
-cik6IiIKcD1pLmd4QSgpP2kuZ3RwKGkpOmgKcj1pLmMKaWYocj4wKW89Qy54Qi5OaihpLmEscixpLmQp
-CmVsc2Ugbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHM/IiI6aApyPWkuYQpuPWkuZgptPUMueEIuTmoo
-cixpLmUsbikKaWYoIXMpbD1vIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhC
-Lm4obSwiLyIpKW09Ii8iK20KaWYoYiE9bnVsbClrPVAubGUoaCwwLDAsYikKZWxzZXtsPWkucgppZih0
-eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkooKQprPW48bD9DLnhCLk5qKHIsbisxLGwpOmh9bj1p
-LnIKaj1uPHIubGVuZ3RoP0MueEIuRyhyLG4rMSk6aApyZXR1cm4gbmV3IFAuRG4odCxxLG8scCxtLGss
-ail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9uKGEp
-e2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMuUmUo
-KS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxm
-LGU9Yi5iCmlmKGU+MClyZXR1cm4gYgp0PWIuYwppZih0PjApe3M9YS5iCmlmKHM8PTApcmV0dXJuIGIK
-aWYoYS5nTncoKSlyPWIuZSE9Yi5mCmVsc2UgaWYoYS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVsc2Ugcj0h
-YS5ncUIoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9cysxCnA9Qy54Qi5OaihhLmEsMCxxKStDLnhCLkco
-Yi5hLGUrMSkKZT1iLmQKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKbz1iLmUKaWYo
-dHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5oKCkKbj1iLmYKaWYodHlwZW9mIG4hPT0ibnVtYmVy
-IilyZXR1cm4gbi5oKCkKcmV0dXJuIG5ldyBQLlVmKHAscyx0K3EsZStxLG8rcSxuK3EsYi5yK3EsYS54
-KX1lbHNlIHJldHVybiB0aGlzLlJlKCkubVMoYil9bT1iLmUKZT1iLmYKaWYobT09ZSl7dD1iLnIKaWYo
-dHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5KKCkKaWYoZTx0KXtzPWEuZgppZih0eXBlb2YgcyE9
-PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcT1zLWUKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAs
-cykrQy54Qi5HKGIuYSxlKSxhLmIsYS5jLGEuZCxhLmUsZStxLHQrcSxhLngpfWU9Yi5hCmlmKHQ8ZS5s
-ZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHMpK0MueEIuRyhlLHQpLGEu
-YixhLmMsYS5kLGEuZSxhLmYsdCsocy10KSxhLngpfXJldHVybiBhLk45KCl9dD1iLmEKaWYoQy54Qi5R
-aSh0LCIvIixtKSl7cz1hLmUKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCmlmKHR5
-cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKcT1zLW0KcD1DLnhCLk5qKGEuYSwwLHMpK0Mu
-eEIuRyh0LG0pCmlmKHR5cGVvZiBlIT09Im51bWJlciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcgUC5V
-ZihwLGEuYixhLmMsYS5kLHMsZStxLGIucitxLGEueCl9bD1hLmUKaz1hLmYKaWYobD09ayYmYS5jPjAp
-e2Zvcig7Qy54Qi5RaSh0LCIuLi8iLG0pOyl7aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5o
-KCkKbSs9M31pZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkhOKCkKaWYodHlwZW9mIG0hPT0i
-bnVtYmVyIilyZXR1cm4gSC5wWShtKQpxPWwtbSsxCnA9Qy54Qi5OaihhLmEsMCxsKSsiLyIrQy54Qi5H
-KHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKcmV0dXJuIG5ldyBQLlVmKHAs
-YS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1qPWEuYQpmb3IoaT1sO0MueEIuUWkoaiwiLi4vIixp
-KTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0dXJuIGkuaCgpCmkrPTN9aD0wCndoaWxlKCEwKXtp
-Zih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLmgoKQpnPW0rMwppZih0eXBlb2YgZSE9PSJudW1i
-ZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYmQy54Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsrK2gK
-bT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBrIT09Im51bWJlciIpcmV0dXJuIGsub3MoKQppZih0
-eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZKGkpCmlmKCEoaz5pKSlicmVhazstLWsKaWYoQy54
-Qi5tKGosayk9PT00Nyl7aWYoaD09PTApe2Y9Ii8iCmJyZWFrfS0taApmPSIvIn19aWYoaz09PWkmJmEu
-Yjw9MCYmIUMueEIuUWkoaiwiLyIsbCkpe20tPWgqMwpmPSIifXE9ay1tK2YubGVuZ3RoCnJldHVybiBu
-ZXcgUC5VZihDLnhCLk5qKGosMCxrKStmK0MueEIuRyh0LG0pLGEuYixhLmMsYS5kLGwsZStxLGIucitx
-LGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcwppZihwLmI+PTAmJiFwLmdOdygp
-KXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIitILmQocC5n
-RmkoKSkrIiBVUkkiKSkKdD1wLmYKcz1wLmEKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5K
-KCkKaWYodDxzLmxlbmd0aCl7aWYodDxwLnIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEg
-ZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIpKQp0aHJvdyBILmIoUC5M
-NCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29t
-cG9uZW50IikpfXI9JC53USgpCmlmKEgub1QocikpdD1QLm1uKHApCmVsc2V7cT1wLmQKaWYodHlwZW9m
-IHEhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShxKQppZihwLmM8cSlILnZoKFAuTDQoIkNhbm5vdCBleHRy
-YWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhvcml0
-eSIpKQp0PUMueEIuTmoocyxwLmUsdCl9cmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
-cy55CnJldHVybiB0PT1udWxsP3RoaXMueT1DLnhCLmdpTyh0aGlzLmEpOnR9LApETjpmdW5jdGlvbihh
-LGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09PWIpcmV0dXJuITAKcmV0dXJuIHUudi5jKGIp
-JiZ0aGlzLmE9PT1iLncoMCl9LApSZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz1udWxsLHI9dC5nRmko
-KSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpzLG89dC5neEEoKT90Lmd0cCh0KTpzLG49dC5hLG09
-dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBt
-LkooKQptPW08az90Lmd0UCgpOnMKcmV0dXJuIG5ldyBQLkRuKHIscSxwLG8sbCxtLGs8bi5sZW5ndGg/
-dC5nS2EoKTpzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90
-b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
-cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9eyRpbkI6MX0KVy5Bei5wcm90b3R5cGU9eyRpQXo6
-MX0KVy5RUC5wcm90b3R5cGU9eyRpUVA6MX0KVy5ueC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXty
-ZXR1cm4gYS5sZW5ndGh9fQpXLm9KLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
-bmd0aH19ClcuaWQucHJvdG90eXBlPXt9ClcuUUYucHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3JldHVybiJSZWN0YW5nbGUgKCIrSC5kKGEubGVmdCkrIiwgIitILmQoYS50b3ApKyIpICIrSC5k
-KGEud2lkdGgpKyIgeCAiK0guZChhLmhlaWdodCl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwp
-cmV0dXJuITEKcmV0dXJuIHUucS5jKGIpJiZhLmxlZnQ9PT1iLmxlZnQmJmEudG9wPT09Yi50b3AmJmEu
-d2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIuaGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
-biBXLnJFKEMuQ0QuZ2lPKGEubGVmdCksQy5DRC5naU8oYS50b3ApLEMuQ0QuZ2lPKGEud2lkdGgpLEMu
-Q0QuZ2lPKGEuaGVpZ2h0KSl9LAokaXRuOjF9ClcubjcucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
-cmV0dXJuIGEubGVuZ3RofX0KVy53ei5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5hCmlmKGI8MHx8
-Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRbYl0pfSwKWTpm
-dW5jdGlvbihhLGIsYyl7dGhpcy4kdGkuZC5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5
-IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdRZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuaTco
-YSl9LApnRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVy
-biBhLmxvY2FsTmFtZX0sCnRuOmZ1bmN0aW9uKGEpe3ZhciB0PSEhYS5zY3JvbGxJbnRvVmlld0lmTmVl
-ZGVkCmlmKHQpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxzZSBhLnNjcm9sbEludG9WaWV3KCl9
-LApyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscQppZihjPT1udWxsKXtpZihkPT1udWxsKXt0
-PSQubHQKaWYodD09bnVsbCl7dD1ILlZNKFtdLHUuUSkKcz1uZXcgVy52RCh0KQpDLk5tLmkodCxXLlR3
-KG51bGwpKQpDLk5tLmkodCxXLkJsKCkpCiQubHQ9cwpkPXN9ZWxzZSBkPXR9dD0kLkVVCmlmKHQ9PW51
-bGwpe3Q9bmV3IFcuS28oZCkKJC5FVT10CmM9dH1lbHNle3QuYT1kCmM9dH19ZWxzZSBpZihkIT1udWxs
-KXRocm93IEguYihQLnhZKCJ2YWxpZGF0b3IgY2FuIG9ubHkgYmUgcGFzc2VkIGlmIHRyZWVTYW5pdGl6
-ZXIgaXMgbnVsbCIpKQppZigkLnhvPT1udWxsKXt0PWRvY3VtZW50CnM9dC5pbXBsZW1lbnRhdGlvbi5j
-cmVhdGVIVE1MRG9jdW1lbnQoIiIpCiQueG89cwokLkJPPXMuY3JlYXRlUmFuZ2UoKQpzPSQueG8uY3Jl
-YXRlRWxlbWVudCgiYmFzZSIpCnUuRi5iKHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5oZWFkLmFwcGVu
-ZENoaWxkKHMpfXQ9JC54bwppZih0LmJvZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50KCJib2R5IikK
-dC5ib2R5PXUuWS5iKHMpfXQ9JC54bwppZih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9dC5jcmVhdGVF
-bGVtZW50KGEudGFnTmFtZSkKJC54by5ib2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVhdGVDb250ZXh0
-dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMuU3EsYS50YWdO
-YW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29udGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRleHR1YWxGcmFn
-bWVudChiKX1lbHNle3IuaW5uZXJIVE1MPWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpm
-b3IoO3Q9ci5maXJzdENoaWxkLHQhPW51bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhvLmJvZHkKaWYo
-cj09bnVsbD90IT1udWxsOnIhPT10KUouTHQocikKYy5QbihxKQpkb2N1bWVudC5hZG9wdE5vZGUocSkK
-cmV0dXJuIHF9LApBSDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApz
-aGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7YS50ZXh0Q29u
-dGVudD1udWxsCmEuYXBwZW5kQ2hpbGQodGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcu
-Q3EoYSwiY2xpY2siLCExLHUuQyl9LAokaWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdO
-YW1lfX0KVy5Ddi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmModS5BLmIoYSkp
-fSwKJFM6MjJ9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rp
-b24oYSxiLGMsZCl7dS5VLmIoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApCOmZ1bmN0aW9u
-KGEsYixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0
-dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodS5VLmIoYyksMSksZCl9LAokaUQwOjF9ClcuVDUu
-cHJvdG90eXBlPXskaVQ1OjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
-bGVuZ3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpX
-LlZiLnByb3RvdHlwZT17fQpXLk83LnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVy
-biBhLm9wZW4oYixjLCEwKX0sCiRpTzc6MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKEgueShhKSxILnkoYikpfSwKJFM6MTB9ClcuaEgucHJvdG90
-eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscAp1LnAuYihhKQp0PXRoaXMuYQpzPXQuc3Rh
-dHVzCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMudEIoKQpyPXM+PTIwMCYmczwzMDAKcT1z
-PjMwNyYmczw0MDAKcz1yfHxzPT09MHx8cz09PTMwNHx8cQpwPXRoaXMuYgppZihzKXtwLiR0aS5DKCIx
-LyIpLmIodCkKcz1wLmEKaWYocy5hIT09MClILnZoKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRl
-ZCIpKQpzLlhmKHQpfWVsc2UgcC5wbShhKX0sCiRTOjI0fQpXLndhLnByb3RvdHlwZT17fQpXLlNnLnBy
-b3RvdHlwZT17JGlTZzoxfQpXLnU4LnByb3RvdHlwZT17CmdEcjpmdW5jdGlvbihhKXtpZigib3JpZ2lu
-IiBpbiBhKXJldHVybiBhLm9yaWdpbgpyZXR1cm4gSC5kKGEucHJvdG9jb2wpKyIvLyIrSC5kKGEuaG9z
-dCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90eXBl
-PXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQu
-Y2hpbGROb2Rlcy5sZW5ndGgKaWYocz09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlm
-KHM+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnJldHVybiB0LmZpcnN0
-Q2hpbGR9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuZWguYihiKQp0PWIuYQpzPXRoaXMu
-YQppZih0IT09cylmb3Iocj10LmNoaWxkTm9kZXMubGVuZ3RoLHE9MDtxPHI7KytxKXMuYXBwZW5kQ2hp
-bGQodC5maXJzdENoaWxkKQpyZXR1cm59LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCnUuQS5iKGMp
-CnQ9dGhpcy5hCnM9dC5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxi
-KQp0LnJlcGxhY2VDaGlsZChjLHNbYl0pfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5jaGls
-ZE5vZGVzCnJldHVybiBuZXcgVy5XOSh0LHQubGVuZ3RoLEgueksodCkuQygiVzk8R20uRT4iKSl9LApn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3RofSwKcTpmdW5jdGlvbihh
-LGIpe3ZhciB0CkguU2MoYikKdD10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8fGI+PXQubGVuZ3RoKXJl
-dHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEp
-e3ZhciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlv
-bihhKXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7KWEucmVtb3ZlQ2hpbGQodCl9LAp3
-OmZ1bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0PT1udWxsP3RoaXMuVShhKTp0fSwK
-JGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6
-ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAu
-Q2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9uKGEsYixjKXt1LkEu
-YihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0
-LiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikK
-cmV0dXJuIGFbYl19LAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLlNOLnByb3RvdHlwZT17fQpXLmV3
-LnByb3RvdHlwZT17JGlldzoxfQpXLmxwLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
-Lmxlbmd0aH19ClcuVGIucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwppZigi
-Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0
-aGlzLkRXKGEsYixjLGQpCnQ9Vy5VOSgiPHRhYmxlPiIrSC5kKGIpKyI8L3RhYmxlPiIsYyxkKQpzPWRv
-Y3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzLnRvU3RyaW5nCnQudG9TdHJpbmcKbmV3IFcu
-ZTcocykuRlYoMCxuZXcgVy5lNyh0KSkKcmV0dXJuIHN9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1bmN0
-aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdp
-bmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVudApzPXQu
-Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRhYmxlIiks
-YixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnIudG9TdHJpbmcKdD1uZXcg
-Vy5lNyhyKQpxPXQuZ3I4KHQpCnMudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhzKS5GVigwLG5l
-dyBXLmU3KHEpKQpyZXR1cm4gc319ClcuQlQucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHQscyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90
-b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVudApzPXQuY3JlYXRlRG9jdW1lbnRG
-cmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnQudG9TdHJp
-bmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnMudG9TdHJpbmcKci50b1N0cmluZwpuZXcgVy5lNyhz
-KS5GVigwLG5ldyBXLmU3KHIpKQpyZXR1cm4gc319ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciB0LHMKYS50ZXh0Q29udGVudD1udWxsCnQ9YS5jb250ZW50CnQudG9TdHJpbmcKSi5i
-VCh0KQpzPXRoaXMucjYoYSxiLG51bGwsYykKYS5jb250ZW50LmFwcGVuZENoaWxkKHMpfSwKWUM6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIsbnVsbCl9LAokaXlZOjF9ClcudzYucHJvdG90eXBl
-PXt9ClcuSzUucHJvdG90eXBlPXskaUs1OjEsJGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpX
-LkNRLnByb3RvdHlwZT17JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJu
-IlJlY3RhbmdsZSAoIitILmQoYS5sZWZ0KSsiLCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkr
-IiB4ICIrSC5kKGEuaGVpZ2h0KX0sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpy
-ZXR1cm4gdS5xLmMoYikmJmEubGVmdD09PWIubGVmdCYmYS50b3A9PT1iLnRvcCYmYS53aWR0aD09PWIu
-d2lkdGgmJmEuaGVpZ2h0PT09Yi5oZWlnaHR9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFcuckUoQy5D
-RC5naU8oYS5sZWZ0KSxDLkNELmdpTyhhLnRvcCksQy5DRC5naU8oYS53aWR0aCksQy5DRC5naU8oYS5o
-ZWlnaHQpKX19ClcucmgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwK
-cTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIo
-UC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe3Uu
-QS5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExp
-c3QuIikpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxi
-KQpyZXR1cm4gYVtiXX0sCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuRDkucHJvdG90eXBlPXsKSzpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAKdS5ELmIoYikKZm9yKHQ9dGhpcy5nVigpLHM9dC5sZW5n
-dGgscj10aGlzLmEscT0wO3E8dC5sZW5ndGg7dC5sZW5ndGg9PT1zfHwoMCxILmxrKSh0KSwrK3Epe3A9
-dFtxXQpiLiQyKHAsci5nZXRBdHRyaWJ1dGUocCkpfX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEs
-cD10aGlzLmEuYXR0cmlidXRlcyxvPUguVk0oW10sdS5zKQpmb3IodD1wLmxlbmd0aCxzPXUuaDkscj0w
-O3I8dDsrK3Ipe2lmKHI+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscikKcT1zLmIocFtyXSkKaWYocS5u
-YW1lc3BhY2VVUkk9PW51bGwpQy5ObS5pKG8scS5uYW1lKX1yZXR1cm4gb319ClcuaTcucHJvdG90eXBl
-PXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuZ2V0QXR0cmlidXRlKEgueShiKSl9LApZOmZ1
-bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1
-cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3kucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVy
-biB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8oSC55KGIpKSl9LApZOmZ1bmN0aW9u
-KGEsYixjKXt0aGlzLmEuYS5zZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8oYiksYyl9LApLOmZ1bmN0
-aW9uKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlzLHUuRC5iKGIpKSl9LApnVjpmdW5jdGlvbigp
-e3ZhciB0PUguVk0oW10sdS5zKQp0aGlzLmEuSygwLG5ldyBXLkEzKHRoaXMsdCkpCnJldHVybiB0fSwK
-Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1YoKS5sZW5ndGh9LAprOmZ1bmN0aW9uKGEpe3ZhciB0
-LHMscj1ILlZNKGEuc3BsaXQoIi0iKSx1LnMpCmZvcih0PTE7dDxyLmxlbmd0aDsrK3Qpe3M9clt0XQpp
-ZihzLmxlbmd0aD4wKUMuTm0uWShyLHQsc1swXS50b1VwcGVyQ2FzZSgpK0ouS1YocywxKSl9cmV0dXJu
-IEMuTm0uSChyLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscApmb3IodD1hLmxlbmd0aCxz
-PTAscj0iIjtzPHQ7KytzKXtxPWFbc10KcD1xLnRvTG93ZXJDYXNlKCkKcj0ocSE9PXAmJnM+MD9yKyIt
-IjpyKStwfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0KVy5LUy5wcm90b3R5cGU9ewokMjpm
-dW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKXRoaXMuYi4kMih0aGlzLmEuayhDLnhC
-LkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEou
-clkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRT
-OjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpm
-b3IodD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1K
-LlQwKHRbcl0pCmlmKHEubGVuZ3RoIT09MClwLmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7
-dGhpcy5hLmNsYXNzTmFtZT11LlQuYihhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYxOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9
-LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJu
-IHR9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikK
-dC5hZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxz
-PXQuY29udGFpbnMoYikKdC5yZW1vdmUoYikKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4o
-dGhpcy5hLHUuWC5iKGIpKX19ClcuRmsucHJvdG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3Eu
-cHJvdG90eXBlPXt9ClcueEMucHJvdG90eXBlPXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihhKSl9LAokUzoyNX0KVy5KUS5wcm90b3R5cGU9ewpDWTpm
-dW5jdGlvbihhKXt2YXIgdAppZigkLm9yLmE9PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxD
-LmNtW3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEyOysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwK
-aTA6ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4oKS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciB0PSQub3IucSgwLEguZChXLnJTKGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEo
-MCwiKjo6IitiKQppZih0PT1udWxsKXJldHVybiExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykp
-fSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzko
-YSx0aGlzLmdBKGEpLEgueksoYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1
-bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYu
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzox
-NH0KVy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5h
-LHRoaXMuYix0aGlzLmMpfSwKJFM6MTR9ClcubTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMs
-ZCl7dmFyIHQscyxyCnRoaXMuYS5GVigwLGMpCnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5l
-dyBXLldrKCkpCnRoaXMuYi5GVigwLHQpCnI9dGhpcy5jCnIuRlYoMCxDLnhEKQpyLkZWKDAscyl9LApp
-MDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVy
-biB0LmQuRHQoYykKZWxzZSBpZihyLnRnKDAsIio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9
-dC5iCmlmKHIudGcoMCxILmQocykrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6Iiti
-KSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCxILmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50
-ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5CSSxILnkoYSkpfSwKJFM6N30KVy5Xay5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo3fQpXLmN0
-LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMApp
-ZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0
-ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6OiIrSC5kKEgueShhKSl9LAokUzo4fQpXLk93LnBy
-b3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcu
-YyhhKQppZih0JiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAK
-cmV0dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJl
-dHVybiExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rp
-b24oKXt2YXIgdD10aGlzLHM9dC5jKzEscj10LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9
-cwpyZXR1cm4hMH10LnNwKG51bGwpCnQuYz1yCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4g
-dGhpcy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5k
-Vy5wcm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9Clcua0YucHJvdG90eXBlPXt9ClcubWsucHJvdG90eXBl
-PXskaXkwOjF9ClcuS28ucHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7bmV3IFcuZm0odGhpcykuJDIo
-YSxudWxsKX0sCkVQOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClKLkx0KGEpCmVsc2UgYi5yZW1vdmVD
-aGlsZChhKX0sCkk0OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPSEwLG49bnVsbCxtPW51bGwK
-dHJ5e249Si5pZyhhKQptPW4uYS5nZXRBdHRyaWJ1dGUoImlzIikKdS5oLmIoYSkKdD1mdW5jdGlvbihj
-KXtpZighKGMuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkpcmV0dXJuIHRydWUKdmFy
-IGw9Yy5jaGlsZE5vZGVzCmlmKGMubGFzdENoaWxkJiZjLmxhc3RDaGlsZCE9PWxbbC5sZW5ndGgtMV0p
-cmV0dXJuIHRydWUKaWYoYy5jaGlsZHJlbilpZighKGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBIVE1MQ29s
-bGVjdGlvbnx8Yy5jaGlsZHJlbiBpbnN0YW5jZW9mIE5vZGVMaXN0KSlyZXR1cm4gdHJ1ZQp2YXIgaz0w
-CmlmKGMuY2hpbGRyZW4paz1jLmNoaWxkcmVuLmxlbmd0aApmb3IodmFyIGo9MDtqPGs7aisrKXt2YXIg
-aT1jLmNoaWxkcmVuW2pdCmlmKGkuaWQ9PSdhdHRyaWJ1dGVzJ3x8aS5uYW1lPT0nYXR0cmlidXRlcyd8
-fGkuaWQ9PSdsYXN0Q2hpbGQnfHxpLm5hbWU9PSdsYXN0Q2hpbGQnfHxpLmlkPT0nY2hpbGRyZW4nfHxp
-Lm5hbWU9PSdjaGlsZHJlbicpcmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpvPUgub1QodCk/ITA6
-IShhLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHEpe0guUnUocSl9cz0i
-ZWxlbWVudCB1bnByaW50YWJsZSIKdHJ5e3M9Si5qKGEpfWNhdGNoKHEpe0guUnUocSl9dHJ5e3I9Vy5y
-UyhhKQp0aGlzLmtSKHUuaC5iKGEpLGIsbyxzLHIsdS5HLmIobiksSC55KG0pKX1jYXRjaChxKXtpZihI
-LlJ1KHEpIGluc3RhbmNlb2YgUC51KXRocm93IHEKZWxzZXt0aGlzLkVQKGEsYikKd2luZG93CnA9IlJl
-bW92aW5nIGNvcnJ1cHRlZCBlbGVtZW50ICIrSC5kKHMpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZp
-bmVkIil3aW5kb3cuY29uc29sZS53YXJuKHApfX19LAprUjpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2
-YXIgdCxzLHIscSxwLG8sbj10aGlzCmlmKGMpe24uRVAoYSxiKQp3aW5kb3cKdD0iUmVtb3ZpbmcgZWxl
-bWVudCBkdWUgdG8gY29ycnVwdGVkIGF0dHJpYnV0ZXMgb24gPCIrZCsiPiIKaWYodHlwZW9mIGNvbnNv
-bGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4odCkKcmV0dXJufWlmKCFuLmEuaTAoYSkp
-e24uRVAoYSxiKQp3aW5kb3cKdD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBlbGVtZW50IDwiK0guZChlKSsi
-PiBmcm9tICIrSC5kKGIpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29s
-ZS53YXJuKHQpCnJldHVybn1pZihnIT1udWxsKWlmKCFuLmEuRWIoYSwiaXMiLGcpKXtuLkVQKGEsYikK
-d2luZG93CnQ9IlJlbW92aW5nIGRpc2FsbG93ZWQgdHlwZSBleHRlbnNpb24gPCIrSC5kKGUpKycgaXM9
-IicrZysnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJu
-KHQpCnJldHVybn10PWYuZ1YoKQpzPUguVk0odC5zbGljZSgwKSxILnQ2KHQpLkMoImpkPDE+IikpCmZv
-cihyPWYuZ1YoKS5sZW5ndGgtMSx0PWYuYTtyPj0wOy0tcil7aWYocj49cy5sZW5ndGgpcmV0dXJuIEgu
-T0gocyxyKQpxPXNbcl0KcD1uLmEKbz1KLmNIKHEpCkgueShxKQppZighcC5FYihhLG8sdC5nZXRBdHRy
-aWJ1dGUocSkpKXt3aW5kb3cKcD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1dGUgPCIrSC5kKGUp
-KyIgIitxKyc9IicrSC5kKHQuZ2V0QXR0cmlidXRlKHEpKSsnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0i
-dW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHApCnQucmVtb3ZlQXR0cmlidXRlKHEpfX1pZih1
-LmFXLmMoYSkpbi5QbihhLmNvbnRlbnQpfSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQyOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscyxyLHEscD10aGlzLmEKc3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTpwLkk0
-KGEsYikKYnJlYWsKY2FzZSA4OmNhc2UgMTE6Y2FzZSAzOmNhc2UgNDpicmVhawpkZWZhdWx0OnAuRVAo
-YSxiKX10PWEubGFzdENoaWxkCmZvcihwPXUuQTtudWxsIT10Oyl7cz1udWxsCnRyeXtzPXQucHJldmlv
-dXNTaWJsaW5nfWNhdGNoKHIpe0guUnUocikKcT1wLmIodCkKYS5yZW1vdmVDaGlsZChxKQp0PW51bGwK
-cz1hLmxhc3RDaGlsZH1pZih0IT1udWxsKXRoaXMuJDIodCxhKQp0PXAuYihzKX19LAokUzozNX0KVy5M
-ZS5wcm90b3R5cGU9e30KVy5LNy5wcm90b3R5cGU9e30KVy5yQi5wcm90b3R5cGU9e30KVy5YVy5wcm90
-b3R5cGU9e30KVy5vYS5wcm90b3R5cGU9e30KUC5pSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2
-YXIgdCxzPXRoaXMuYSxyPXMubGVuZ3RoCmZvcih0PTA7dDxyOysrdClpZihzW3RdPT09YSlyZXR1cm4g
-dApDLk5tLmkocyxhKQpDLk5tLmkodGhpcy5iLG51bGwpCnJldHVybiByfSwKUHY6ZnVuY3Rpb24oYSl7
-dmFyIHQscyxyLHE9dGhpcyxwPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVybiBh
-CmlmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
-IGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodS5mdi5jKGEpKXRo
-cm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIFJlZ0V4cCIpKQppZih1LmM4LmMoYSkpcmV0
-dXJuIGEKaWYodS5kLmMoYSkpcmV0dXJuIGEKaWYodS5JLmMoYSkpcmV0dXJuIGEKdD11LmRELmMoYSl8
-fCExCmlmKHQpcmV0dXJuIGEKaWYodS5HLmMoYSkpe3M9cS5WSChhKQp0PXEuYgppZihzPj10Lmxlbmd0
-aClyZXR1cm4gSC5PSCh0LHMpCnI9cC5hPXRbc10KaWYociE9bnVsbClyZXR1cm4gcgpyPXt9CnAuYT1y
-CkMuTm0uWSh0LHMscikKYS5LKDAsbmV3IFAubFIocCxxKSkKcmV0dXJuIHAuYX1pZih1LmouYyhhKSl7
-cz1xLlZIKGEpCnA9cS5iCmlmKHM+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscykKcj1wW3NdCmlmKHIh
-PW51bGwpcmV0dXJuIHIKcmV0dXJuIHEuZWsoYSxzKX1pZih1LmVILmMoYSkpe3M9cS5WSChhKQp0PXEu
-YgppZihzPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LHMpCnI9cC5iPXRbc10KaWYociE9bnVsbClyZXR1
-cm4gcgpyPXt9CnAuYj1yCkMuTm0uWSh0LHMscikKcS5pbShhLG5ldyBQLmpnKHAscSkpCnJldHVybiBw
-LmJ9dGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2Ygb3RoZXIgdHlwZSIpKX0sCmVrOmZ1
-bmN0aW9uKGEsYil7dmFyIHQscz1KLlU2KGEpLHI9cy5nQShhKSxxPW5ldyBBcnJheShyKQpDLk5tLlko
-dGhpcy5iLGIscSkKZm9yKHQ9MDt0PHI7Kyt0KUMuTm0uWShxLHQsdGhpcy5QdihzLnEoYSx0KSkpCnJl
-dHVybiBxfX0KUC5sUi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5hW2FdPXRoaXMu
-Yi5QdihiKX0sCiRTOjF9ClAuamcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYlth
-XT10aGlzLmIuUHYoYil9LAokUzoxfQpQLkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7dmFy
-IHQscyxyLHEKdS5iOC5iKGIpCmZvcih0PU9iamVjdC5rZXlzKGEpLHM9dC5sZW5ndGgscj0wO3I8czsr
-K3Ipe3E9dFtyXQpiLiQyKHEsYVtxXSl9fX0KUC5Bcy5wcm90b3R5cGU9ewpUOmZ1bmN0aW9uKGEpe3Zh
-ciB0CkgueShhKQp0PSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnZoKEgudEwoYSkpCmlm
-KHQudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhhLCJ2YWx1ZSIsIk5vdCBhIHZhbGlkIGNs
-YXNzIHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuSCgwLCIgIil9LApna3o6
-ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5QKCkKcmV0dXJuIFAucmoodCx0LnIsSC5MaCh0KS5kKX0sCmdB
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLlQoYikK
-cmV0dXJuIHRoaXMuUCgpLnRnKDAsYil9LAppOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiBI
-LnhkKHRoaXMuT1MobmV3IFAuR0UoYikpKX0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCnRoaXMuVChi
-KQp0PXRoaXMuUCgpCnM9dC5SKDAsYikKdGhpcy5YKHQpCnJldHVybiBzfSwKT1M6ZnVuY3Rpb24oYSl7
-dmFyIHQscwp1LmNoLmIoYSkKdD10aGlzLlAoKQpzPWEuJDEodCkKdGhpcy5YKHQpCnJldHVybiBzfX0K
-UC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5ULmIoYSkuaSgwLHRoaXMuYSl9
-LAokUzoyOX0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5QQy5wcm90b3R5cGU9ewokMTpmdW5jdGlv
-bihhKXt2YXIgdAp1LlouYihhKQp0PWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1
-cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0
-LGEsITEpClAuRG0odCwkLncoKSxhKQpyZXR1cm4gdH0sCiRTOjR9ClAuWW0ucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLk56LnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhhKX0sCiRTOjMwfQpQLlFTLnByb3RvdHlwZT17CiQx
-OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5UeihhLHUuYW0pfSwKJFM6MzF9ClAubnAucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkU0KGEpfSwKJFM6MzJ9ClAuRTQucHJvdG90eXBl
-PXsKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIi
-KXRocm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIikpCnJldHVybiBQ
-Lkw3KHRoaXMuYVtiXSl9LApZOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5
-cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9y
-IG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1
-cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuRTQmJnRoaXMuYT09PWIuYX0sCnc6ZnVuY3Rpb24oYSl7
-dmFyIHQscwp0cnl7dD1TdHJpbmcodGhpcy5hKQpyZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpCnQ9dGhp
-cy54YigwKQpyZXR1cm4gdH19LApWNzpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5hCmlmKGI9PW51
-bGwpdD1udWxsCmVsc2V7dD1ILnQ2KGIpCnQ9UC5DSChuZXcgSC5BOChiLHQuQygiQCgxKSIpLmIoUC5p
-RygpKSx0LkMoIkE4PDEsQD4iKSksITAsdS56KX1yZXR1cm4gUC5MNyhzW2FdLmFwcGx5KHMsdCkpfSwK
-Z2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0KUC5yNy5wcm90b3R5cGU9e30KUC5Uei5wcm90b3R5cGU9
-ewpjUDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9YTwwfHxhPj10LmdBKHQpCmlmKHMpdGhyb3cgSC5i
-KFAuVEUoYSwwLHQuZ0EodCksbnVsbCxudWxsKSl9LApxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9
-PSJudW1iZXIiJiZiPT09Qy5qbi55dShiKSl0aGlzLmNQKEguU2MoYikpCnJldHVybiB0aGlzLiR0aS5k
-LmIodGhpcy5VcigwLGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CnRoaXMuJHRpLmQuYihjKQp0
-PUMuam4ueXUoYikKaWYoYj09PXQpdGhpcy5jUChiKQp0aGlzLmU0KDAsYixjKX0sCmdBOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYS5sZW5ndGgKaWYodHlwZW9mIHQ9PT0ibnVtYmVyIiYmdD4+PjA9PT10KXJl
-dHVybiB0CnRocm93IEguYihQLlBWKCJCYWQgSnNBcnJheSBsZW5ndGgiKSl9LAokaWNYOjEsCiRpek06
-MX0KUC5jby5wcm90b3R5cGU9e30KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9
-ewpQOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG89
-UC5Mcyh1Lk4pCmlmKHA9PW51bGwpcmV0dXJuIG8KZm9yKHQ9cC5zcGxpdCgiICIpLHM9dC5sZW5ndGgs
-cj0wO3I8czsrK3Ipe3E9Si5UMCh0W3JdKQppZihxLmxlbmd0aCE9PTApby5pKDAscSl9cmV0dXJuIG99
-LApYOmZ1bmN0aW9uKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLkgoMCwiICIpKX19ClAu
-ZDUucHJvdG90eXBlPXsKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLktlKGEpfSwKc2hmOmZ1bmN0
-aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscCxv
-CmlmKGQ9PW51bGwpe3Q9SC5WTShbXSx1LlEpCmQ9bmV3IFcudkQodCkKQy5ObS5pKHQsVy5UdyhudWxs
-KSkKQy5ObS5pKHQsVy5CbCgpKQpDLk5tLmkodCxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQpCnM9Jzxz
-dmcgdmVyc2lvbj0iMS4xIj4nK0guZChiKSsiPC9zdmc+Igp0PWRvY3VtZW50CnI9dC5ib2R5CnE9KHIm
-JkMuUlkpLkFIKHIscyxjKQpwPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnEudG9TdHJpbmcKdD1u
-ZXcgVy5lNyhxKQpvPXQuZ3I4KHQpCmZvcig7dD1vLmZpcnN0Q2hpbGQsdCE9bnVsbDspcC5hcHBlbmRD
-aGlsZCh0KQpyZXR1cm4gcH0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2si
-LCExLHUuQyl9LAokaWQ1OjF9ClAubjYucHJvdG90eXBlPXskaWNYOjEsJGl6TToxLCRpQVM6MX0KVS5k
-Mi5wcm90b3R5cGU9e30KVS5TZS5wcm90b3R5cGU9e30KVS51Ri5wcm90b3R5cGU9e30KVS5NbC5wcm90
-b3R5cGU9e30KVC5HVi5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
-ciB0LHMscgp1LkIuYihhKQp0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93Lmxv
-Y2F0aW9uLmhyZWYpCnI9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHQhPT0iLyIm
-JnQhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwuRzco
-dCxzLHIsbmV3IEwuVlcodCxzLHIpKX0sCiRTOjEzfQpMLlZXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
-KCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzowfQpMLkwucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyCnUuQi5iKGEpCnQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCnM9TC5H
-Nih3aW5kb3cubG9jYXRpb24uaHJlZikKcj1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZih0Lmxl
-bmd0aD4xKUwuRzcodCxzLHIsbnVsbCkKZWxzZXtMLkJFKHQsUC5FRihbInJlZ2lvbnMiLCIiLCJuYXZp
-Z2F0aW9uQ29udGVudCIsIiIsImVkaXRzIixbXV0sdS5OLHUueikpCkwuQlgoIiZuYnNwOyIsbnVsbCl9
-fSwKJFM6MTN9CkwuV3gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9ImNvbGxh
-cHNlZCIKdS5WLmIoYSkKdD10aGlzLmEKcz1KLlJFKHQpCnI9dGhpcy5iCmlmKCFzLmdEKHQpLnRnKDAs
-cSkpe3MuZ0QodCkuaSgwLHEpCkouZFIocikuaSgwLHEpfWVsc2V7cy5nRCh0KS5SKDAscSkKSi5kUihy
-KS5SKDAscSl9fSwKJFM6Nn0KTC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD1KLnFG
-KHUuaC5iKGEpKSxzPXQuJHRpLHI9cy5DKCJ+KDEpIikuYihuZXcgTC5kTigpKQp1Lk0uYihudWxsKQpX
-LkpFKHQuYSx0LmIsciwhMSxzLmQpfSwKJFM6M30KTC5kTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXt2YXIgdAp1LlYuYihhKQp0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0i
-KQp0LnRvU3RyaW5nCkwudDIoYSx0LmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3
-KHQpKS5PKCJwYXRoIikpKX0sCiRTOjZ9CkwuSG8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
-IHQscyxyCnUuaC5iKGEpCnQ9Si5xRihhKQpzPXQuJHRpCnI9cy5DKCJ+KDEpIikuYihuZXcgTC54eihh
-LHRoaXMuYSkpCnUuTS5iKG51bGwpClcuSkUodC5hLHQuYixyLCExLHMuZCl9LAokUzozfQpMLnh6LnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0CnUuVi5iKGEpCnQ9dGhpcy5hCkwuaFgodGhpcy5i
-LFAuUUEodC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSkuTygib2Zmc2V0
-IikpLG51bGwsbnVsbCkpfSwKJFM6Nn0KTC5JQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
-dD1KLnFGKHUuaC5iKGEpKSxzPXQuJHRpCnMuQygifigxKSIpLmIoTC5IMCgpKQp1Lk0uYihudWxsKQpX
-LkpFKHQuYSx0LmIsTC5IMCgpLCExLHMuZCl9LAokUzozfQpMLm5ULnByb3RvdHlwZT17CiQwOmZ1bmN0
-aW9uKCl7TC5Gcih0aGlzLmEuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9CkwuQloucHJvdG90eXBlPXsK
-JDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYS5hLG51bGwsbnVsbCl9LAokUzowfQpMLkZRLnByb3RvdHlw
-ZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXUuci5iKGEpLnN0YXR1cwppZih0IT09MjAwKXdpbmRvdy5h
-bGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo1fQpMLnRZLnByb3Rv
-dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5xSigiaGFuZGxlUG9zdExpbmtDbGljazogIitILmQoYSks
-YikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK0guZCh0aGlzLmEuYSkrIiAoIitILmQoYSkr
-IikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkdILnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3UuaC5iKGEpCiQuekIoKS50b1N0cmluZwp1Lm0uYigkLm93KCkucSgwLCJobGpzIikpLlY3KCJoaWdo
-bGlnaHRCbG9jayIsW2FdKX0sCiRTOjN9CkwuRFQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
-IHQKdS5yLmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtMLlQxKFUueXUoQy5DdC5wVygwLGEucmVz
-cG9uc2VUZXh0LG51bGwpKSkKTC55WCgiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiKX1lbHNlIHdp
-bmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo1fQpMLmVI
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5xSigibG9hZFJlZ2lvbkV4cGxhbmF0aW9uOiAi
-K0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrSC5kKHRoaXMuYSkrIiAoIitI
-LmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLnpELnByb3RvdHlwZT17CiQxOmZ1bmN0
-aW9uKGEpe3ZhciB0LHMscj10aGlzCnUuci5iKGEpCnQ9YS5zdGF0dXMKaWYodD09PTIwMCl7cz1yLmEK
-TC5CRShzLHUuYS5iKEMuQ3QucFcoMCxhLnJlc3BvbnNlVGV4dCxudWxsKSkpCnQ9ci5iCkwuZkcodCxy
-LmMpCkwuQlgoQy54Qi50ZyhzLCI/Iik/Qy54Qi5OaihzLDAsQy54Qi5PWShzLCI/IikpOnMsdCkKdD1y
-LmQKaWYodCE9bnVsbCl0LiQwKCl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0
-dXMgb2YgIitILmQodCkpfSwKJFM6NX0KTC5PRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wu
-cUooImxvYWRGaWxlOiAiK0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrdGhp
-cy5hKyIgKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MX0KTC5UVy5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKdS5yLmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtz
-PUMuQ3QucFcoMCxhLnJlc3BvbnNlVGV4dCxudWxsKQpyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5u
-YXYtdHJlZSIpCkoubDUociwiIikKTC50WChyLHMpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZh
-aWxlZDsgc3RhdHVzIG9mICIrSC5kKHQpKX0sCiRTOjV9CkwueHIucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
-b24oYSxiKXtMLnFKKCJsb2FkTmF2aWdhdGlvblRyZWU6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgi
-Q291bGQgbm90IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAok
-UzoxfQpMLkVFLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMKdS5WLmIoYSkKdD10aGlz
-LmEKcz10aGlzLmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdCxzLG5ldyBMLlFMKHQscykp
-CkwuaFgodGhpcy5jLHQpfSwKJFM6Nn0KTC5RTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIo
-d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KTC5WUy5wcm90b3R5
-cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzPSJzZWxlY3RlZC1maWxlIgp1LmguYihhKQphLnRvU3Ry
-aW5nCnQ9Si5SRShhKQppZihhLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGEp
-KS5PKCJuYW1lIikpPT09dGhpcy5hLmEpdC5nRChhKS5pKDAscykKZWxzZSB0LmdEKGEpLlIoMCxzKX0s
-CiRTOjN9CkwuWEEucHJvdG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEwfSwKaTA6ZnVu
-Y3Rpb24oYSl7cmV0dXJuITB9LAokaWtGOjF9Ck0ubEkucHJvdG90eXBlPXsKV086ZnVuY3Rpb24oYSxi
-KXt2YXIgdCxzPW51bGwKTS5ZRigiYWJzb2x1dGUiLEguVk0oW2IsbnVsbCxudWxsLG51bGwsbnVsbCxu
-dWxsLG51bGxdLHUucykpCnQ9dGhpcy5hCnQ9dC5ZcihiKT4wJiYhdC5oSyhiKQppZih0KXJldHVybiBi
-CnQ9RC5SWCgpCnJldHVybiB0aGlzLnE3KDAsdCxiLHMscyxzLHMscyxzKX0sCnRNOmZ1bmN0aW9uKGEp
-e3ZhciB0LHMscj1YLkNMKGEsdGhpcy5hKQpyLklWKCkKdD1yLmQKcz10Lmxlbmd0aAppZihzPT09MCl7
-dD1yLmIKcmV0dXJuIHQ9PW51bGw/Ii4iOnR9aWYocz09PTEpe3Q9ci5iCnJldHVybiB0PT1udWxsPyIu
-Ijp0fWlmKDA+PXMpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQpDLk5tLm12KHIuZSkKci5JVigpCnJl
-dHVybiByLncoMCl9LApxNzpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQ9SC5WTShbYixj
-LGQsZSxmLGcsaCxpXSx1LnMpCk0uWUYoImpvaW4iLHQpCnJldHVybiB0aGlzLklQKG5ldyBILlU1KHQs
-dS5iQi5iKG5ldyBNLk1pKCkpLHUuY2MpKX0sCklQOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxu
-LG0sbAp1LlguYihhKQpmb3IodD1hLiR0aSxzPXQuQygiYTIoY1guRSkiKS5iKG5ldyBNLnE3KCkpLHI9
-YS5na3ooYSksdD1uZXcgSC5TTyhyLHMsdC5DKCJTTzxjWC5FPiIpKSxzPXRoaXMuYSxxPSExLHA9ITEs
-bz0iIjt0LkYoKTspe249ci5nbCgpCmlmKHMuaEsobikmJnApe209WC5DTChuLHMpCmw9by5jaGFyQ29k
-ZUF0KDApPT0wP286bwpvPUMueEIuTmoobCwwLHMuU3AobCwhMCkpCm0uYj1vCmlmKHMuZHMobykpQy5O
-bS5ZKG0uZSwwLHMuZ21JKCkpCm89bS53KDApfWVsc2UgaWYocy5ZcihuKT4wKXtwPSFzLmhLKG4pCm89
-SC5kKG4pfWVsc2V7aWYoIShuLmxlbmd0aD4wJiZzLlVkKG5bMF0pKSlpZihxKW8rPXMuZ21JKCkKbys9
-SC5kKG4pfXE9cy5kcyhuKX1yZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286b30sCm81OmZ1bmN0aW9u
-KGEpe3ZhciB0CmlmKCF0aGlzLnkzKGEpKXJldHVybiBhCnQ9WC5DTChhLHRoaXMuYSkKdC5yUigpCnJl
-dHVybiB0LncoMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsawphLnRvU3Ry
-aW5nCnQ9dGhpcy5hCnM9dC5ZcihhKQppZihzIT09MCl7aWYodD09PSQuS2soKSlmb3Iocj0wO3I8czsr
-K3IpaWYoQy54Qi5XKGEscik9PT00NylyZXR1cm4hMApxPXMKcD00N31lbHNle3E9MApwPW51bGx9Zm9y
-KG89bmV3IEgucWooYSkuYSxuPW8ubGVuZ3RoLHI9cSxtPW51bGw7cjxuOysrcixtPXAscD1sKXtsPUMu
-eEIubShvLHIpCmlmKHQucjQobCkpe2lmKHQ9PT0kLktrKCkmJmw9PT00NylyZXR1cm4hMAppZihwIT1u
-dWxsJiZ0LnI0KHApKXJldHVybiEwCmlmKHA9PT00NilrPW09PW51bGx8fG09PT00Nnx8dC5yNChtKQpl
-bHNlIGs9ITEKaWYoaylyZXR1cm4hMH19aWYocD09bnVsbClyZXR1cm4hMAppZih0LnI0KHApKXJldHVy
-biEwCmlmKHA9PT00Nil0PW09PW51bGx8fHQucjQobSl8fG09PT00NgplbHNlIHQ9ITEKaWYodClyZXR1
-cm4hMApyZXR1cm4hMX0sCkhQOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPXRoaXMsbj0nVW5h
-YmxlIHRvIGZpbmQgYSBwYXRoIHRvICInCmI9by5XTygwLGIpCnQ9by5hCmlmKHQuWXIoYik8PTAmJnQu
-WXIoYSk+MClyZXR1cm4gby5vNShhKQppZih0LllyKGEpPD0wfHx0LmhLKGEpKWE9by5XTygwLGEpCmlm
-KHQuWXIoYSk8PTAmJnQuWXIoYik+MCl0aHJvdyBILmIoWC5KVChuK0guZChhKSsnIiBmcm9tICInK0gu
-ZChiKSsnIi4nKSkKcz1YLkNMKGIsdCkKcy5yUigpCnI9WC5DTChhLHQpCnIuclIoKQpxPXMuZAppZihx
-Lmxlbmd0aD4wJiZKLlJNKHFbMF0sIi4iKSlyZXR1cm4gci53KDApCnE9cy5iCnA9ci5iCmlmKHEhPXAp
-cT1xPT1udWxsfHxwPT1udWxsfHwhdC5OYyhxLHApCmVsc2UgcT0hMQppZihxKXJldHVybiByLncoMCkK
-d2hpbGUoITApe3E9cy5kCmlmKHEubGVuZ3RoPjApe3A9ci5kCnE9cC5sZW5ndGg+MCYmdC5OYyhxWzBd
-LHBbMF0pfWVsc2UgcT0hMQppZighcSlicmVhawpDLk5tLlc0KHMuZCwwKQpDLk5tLlc0KHMuZSwxKQpD
-Lk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKX1xPXMuZAppZihxLmxlbmd0aD4wJiZKLlJNKHFbMF0s
-Ii4uIikpdGhyb3cgSC5iKFguSlQobitILmQoYSkrJyIgZnJvbSAiJytILmQoYikrJyIuJykpCnE9dS5O
-CkMuTm0uVUcoci5kLDAsUC5POChzLmQubGVuZ3RoLCIuLiIscSkpCkMuTm0uWShyLmUsMCwiIikKQy5O
-bS5VRyhyLmUsMSxQLk84KHMuZC5sZW5ndGgsdC5nbUkoKSxxKSkKdD1yLmQKcT10Lmxlbmd0aAppZihx
-PT09MClyZXR1cm4iLiIKaWYocT4xJiZKLlJNKEMuTm0uZ3JaKHQpLCIuIikpe3Q9ci5kCmlmKDA+PXQu
-bGVuZ3RoKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKdD1yLmUKQy5ObS5tdih0KQpDLk5tLm12KHQp
-CkMuTm0uaSh0LCIiKX1yLmI9IiIKci5JVigpCnJldHVybiByLncoMCl9fQpNLk1pLnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBILnkoYSkhPW51bGx9LAokUzo3fQpNLnE3LnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBILnkoYSkhPT0iIn0sCiRTOjd9Ck0uTm8ucHJvdG90eXBlPXsK
-JDE6ZnVuY3Rpb24oYSl7SC55KGEpCnJldHVybiBhPT1udWxsPyJudWxsIjonIicrYSsnIid9LAokUzo4
-fQpCLkx1LnByb3RvdHlwZT17CnhaOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5ZcihhKQppZihzPjAp
-cmV0dXJuIEoubGQoYSwwLHMpCmlmKHRoaXMuaEsoYSkpe2lmKDA+PWEubGVuZ3RoKXJldHVybiBILk9I
-KGEsMCkKdD1hWzBdfWVsc2UgdD1udWxsCnJldHVybiB0fSwKTmM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-YT09Yn19ClguV0QucHJvdG90eXBlPXsKSVY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcwp3aGlsZSgh
-MCl7dD1yLmQKaWYoISh0Lmxlbmd0aCE9PTAmJkouUk0oQy5ObS5ncloodCksIiIpKSlicmVhawp0PXIu
-ZAppZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCkMuTm0ubXYoci5lKX10PXIu
-ZQpzPXQubGVuZ3RoCmlmKHM+MClDLk5tLlkodCxzLTEsIiIpfSwKclI6ZnVuY3Rpb24oKXt2YXIgdCxz
-LHIscSxwLG8sbixtPXRoaXMsbD1ILlZNKFtdLHUucykKZm9yKHQ9bS5kLHM9dC5sZW5ndGgscj0wLHE9
-MDtxPHQubGVuZ3RoO3QubGVuZ3RoPT09c3x8KDAsSC5saykodCksKytxKXtwPXRbcV0Kbz1KLmlhKHAp
-CmlmKCEoby5ETihwLCIuIil8fG8uRE4ocCwiIikpKWlmKG8uRE4ocCwiLi4iKSlpZihsLmxlbmd0aD4w
-KWwucG9wKCkKZWxzZSArK3IKZWxzZSBDLk5tLmkobCxwKX1pZihtLmI9PW51bGwpQy5ObS5VRyhsLDAs
-UC5POChyLCIuLiIsdS5OKSkKaWYobC5sZW5ndGg9PT0wJiZtLmI9PW51bGwpQy5ObS5pKGwsIi4iKQpu
-PVAuZEgobC5sZW5ndGgsbmV3IFgucVIobSksITAsdS5OKQp0PW0uYgp0PXQhPW51bGwmJmwubGVuZ3Ro
-PjAmJm0uYS5kcyh0KT9tLmEuZ21JKCk6IiIKSC50NihuKS5kLmIodCkKaWYoISFuLmZpeGVkJGxlbmd0
-aClILnZoKFAuTDQoImluc2VydCIpKQpuLnNwbGljZSgwLDAsdCkKbS5zbkoobCkKbS5zUGgobikKdD1t
-LmIKaWYodCE9bnVsbCYmbS5hPT09JC5LaygpKXt0LnRvU3RyaW5nCm0uYj1ILnlzKHQsIi8iLCJcXCIp
-fW0uSVYoKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMscT1yLmIKcT1xIT1udWxsP3E6IiIK
-Zm9yKHQ9MDt0PHIuZC5sZW5ndGg7Kyt0KXtzPXIuZQppZih0Pj1zLmxlbmd0aClyZXR1cm4gSC5PSChz
-LHQpCnM9cStILmQoc1t0XSkKcT1yLmQKaWYodD49cS5sZW5ndGgpcmV0dXJuIEguT0gocSx0KQpxPXMr
-SC5kKHFbdF0pfXErPUguZChDLk5tLmdyWihyLmUpKQpyZXR1cm4gcS5jaGFyQ29kZUF0KDApPT0wP3E6
-cX0sCnNuSjpmdW5jdGlvbihhKXt0aGlzLmQ9dS5pLmIoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhpcy5l
-PXUuaS5iKGEpfX0KWC5xUi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmEu
-Z21JKCl9LAokUzozN30KWC5kdi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhj
-ZXB0aW9uOiAiK3RoaXMuYX19Ck8uekwucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRn
-KGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09NDd9LApkczpmdW5jdGlvbihhKXt2YXIg
-dD1hLmxlbmd0aApyZXR1cm4gdCE9PTAmJkMueEIubShhLHQtMSkhPT00N30sClNwOmZ1bmN0aW9uKGEs
-Yil7aWYoYS5sZW5ndGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXI6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4hMX0s
-CmdvYzpmdW5jdGlvbigpe3JldHVybiJwb3NpeCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpG
-LnJ1LnByb3RvdHlwZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1
-bmN0aW9uKGEpe3JldHVybiBhPT09NDd9LApkczpmdW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0
-PT09MClyZXR1cm4hMQppZihDLnhCLm0oYSx0LTEpIT09NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMo
-YSwiOi8vIikmJnRoaXMuWXIoYSk9PT10fSwKU3A6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPWEu
-bGVuZ3RoCmlmKHA9PT0wKXJldHVybiAwCmlmKEMueEIuVyhhLDApPT09NDcpcmV0dXJuIDEKZm9yKHQ9
-MDt0PHA7Kyt0KXtzPUMueEIuVyhhLHQpCmlmKHM9PT00NylyZXR1cm4gMAppZihzPT09NTgpe2lmKHQ9
-PT0wKXJldHVybiAwCnI9Qy54Qi5YVShhLCIvIixDLnhCLlFpKGEsIi8vIix0KzEpP3QrMzp0KQppZihy
-PD0wKXJldHVybiBwCmlmKCFifHxwPHIrMylyZXR1cm4gcgppZighQy54Qi5uKGEsImZpbGU6Ly8iKSly
-ZXR1cm4gcgppZighQi5ZdShhLHIrMSkpcmV0dXJuIHIKcT1yKzMKcmV0dXJuIHA9PT1xP3E6cis0fX1y
-ZXR1cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24o
-YSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00N30sCmdvYzpmdW5jdGlvbigpe3Jl
-dHVybiJ1cmwifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpVZDpm
-dW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09
-PTQ3fHxhPT09OTJ9LApkczpmdW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0PT09MClyZXR1cm4h
-MQp0PUMueEIubShhLHQtMSkKcmV0dXJuISh0PT09NDd8fHQ9PT05Mil9LApTcDpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMscj1hLmxlbmd0aAppZihyPT09MClyZXR1cm4gMAp0PUMueEIuVyhhLDApCmlmKHQ9PT00
-NylyZXR1cm4gMQppZih0PT09OTIpe2lmKHI8Mnx8Qy54Qi5XKGEsMSkhPT05MilyZXR1cm4gMQpzPUMu
-eEIuWFUoYSwiXFwiLDIpCmlmKHM+MCl7cz1DLnhCLlhVKGEsIlxcIixzKzEpCmlmKHM+MClyZXR1cm4g
-c31yZXR1cm4gcn1pZihyPDMpcmV0dXJuIDAKaWYoIUIuT1ModCkpcmV0dXJuIDAKaWYoQy54Qi5XKGEs
-MSkhPT01OClyZXR1cm4gMApyPUMueEIuVyhhLDIpCmlmKCEocj09PTQ3fHxyPT09OTIpKXJldHVybiAw
-CnJldHVybiAzfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlv
-bihhKXtyZXR1cm4gdGhpcy5ZcihhKT09PTF9LApPdDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PT1i
-KXJldHVybiEwCmlmKGE9PT00NylyZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3Cmlm
-KChhXmIpIT09MzIpcmV0dXJuITEKdD1hfDMyCnJldHVybiB0Pj05NyYmdDw9MTIyfSwKTmM6ZnVuY3Rp
-b24oYSxiKXt2YXIgdCxzLHIKaWYoYT09YilyZXR1cm4hMAp0PWEubGVuZ3RoCmlmKHQhPT1iLmxlbmd0
-aClyZXR1cm4hMQpmb3Iocz1KLnJZKGIpLHI9MDtyPHQ7KytyKWlmKCF0aGlzLk90KEMueEIuVyhhLHIp
-LHMuVyhiLHIpKSlyZXR1cm4hMQpyZXR1cm4hMH0sCmdvYzpmdW5jdGlvbigpe3JldHVybiJ3aW5kb3dz
-In0sCmdtSTpmdW5jdGlvbigpe3JldHVybiJcXCJ9fTsoZnVuY3Rpb24gYWxpYXNlcygpe3ZhciB0PUou
-dkIucHJvdG90eXBlCnQuVT10LncKdC5Taj10LmU3CnQ9Si5NRi5wcm90b3R5cGUKdC50PXQudwp0PVAu
-Y1gucHJvdG90eXBlCnQuR0c9dC5ldgp0PVAuay5wcm90b3R5cGUKdC54Yj10LncKdD1XLmN2LnByb3Rv
-dHlwZQp0LkRXPXQucjYKdD1XLm02LnByb3RvdHlwZQp0LmpGPXQuRWIKdD1QLkU0LnByb3RvdHlwZQp0
-LlVyPXQucQp0LmU0PXQuWX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3ZhciB0PWh1bmtI
-ZWxwZXJzLl9zdGF0aWNfMSxzPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxyPWh1bmtIZWxwZXJzLmluc3Rh
-bGxJbnN0YW5jZVRlYXJPZmYscT1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9mZgp0KFAsIkVY
-IiwiWlYiLDkpCnQoUCwieXQiLCJvQSIsOSkKdChQLCJxVyIsIkJ6Iiw5KQpzKFAsIlVJIiwiZU4iLDIp
-CnIoUC5QZi5wcm90b3R5cGUsImdZSiIsMCwxLG51bGwsWyIkMiIsIiQxIl0sWyJ3MCIsInBtIl0sMzYs
-MCkKdChQLCJQSCIsIk10Iiw4KQpxKFcsInBTIiw0LG51bGwsWyIkNCJdLFsieVciXSwxMSwwKQpxKFcs
-IlY0Iiw0LG51bGwsWyIkNCJdLFsiUVciXSwxMSwwKQp0KFAsImlHIiwid1kiLDQpCnQoUCwidzAiLCJM
-NyIsNDApCnEoTCwiWE4iLDEsbnVsbCxbIiQyJHJlbGF0aXZlVG8iLCIkMSJdLFsidDIiLGZ1bmN0aW9u
-KGEpe3JldHVybiBMLnQyKGEsbnVsbCl9XSw0MSwwKQp0KEwsIkgwIiwidW0iLDI4KX0pKCk7KGZ1bmN0
-aW9uIGluaGVyaXRhbmNlKCl7dmFyIHQ9aHVua0hlbHBlcnMubWl4aW4scz1odW5rSGVscGVycy5pbmhl
-cml0LHI9aHVua0hlbHBlcnMuaW5oZXJpdE1hbnkKcyhQLmssbnVsbCkKcihQLmssW0guZW8sSi52QixK
-Lm0xLFAublksUC5jWCxILmE3LFAuQW4sSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxI
-LlpyLFAuWFMsSC5YTyxQLllrLEguZGIsSC5ONixILlZSLEguRUssSC5QYixILnRRLEguU2QsSC5KYyxI
-LkcsUC5XMyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgsUC5NTyxQLmtULFAuQ3csUC5tMCxQLlh2LFAu
-Ym4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5SdyxQLmJ6LFAuYTIsUC5pUCxQLkZLLFAu
-azUsUC5LWSxQLkNELFAuYUUsUC5FSCxQLnpNLFAuWjAsUC5jOCxQLk9kLFAuaWIsUC5HeixQLnFVLFAu
-Um4sUC5HRCxQLkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcu
-VzksVy5kVyxXLmtGLFcubWssVy5LbyxQLmlKLFAuRTQsUC5uNixVLmQyLFUuU2UsVS51RixVLk1sLFQu
-R1YsTC5YQSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcihKLnZCLFtKLnlFLEouWUUsSi5NRixKLmpkLEou
-cUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5JQixXLm43LFcuZWEsVy5icixXLlNnLFcu
-dTgsVy5LNyxXLlhXLFAuaEZdKQpyKEouTUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBvLEouamQpCnIo
-Si5xSSxbSi51cixKLlZBXSkKcyhQLkxVLFAublkpCnIoUC5MVSxbSC5YQyxXLnd6LFcuZTddKQpzKEgu
-cWosSC5YQykKcihQLmNYLFtILmJRLEguVTUsUC5tVyxILnVuXSkKcihILmJRLFtILmFMLEguaTUsUC54
-dV0pCnIoSC5hTCxbSC5uSCxILkE4LFAuaThdKQpzKEguU08sUC5BbikKcyhQLlJVLFAuUG4pCnMoUC5H
-aixQLlJVKQpzKEguUEQsUC5HaikKcyhILkxQLEguV1UpCnIoSC5UcCxbSC5DaixILkFtLEgubGMsSC5k
-QyxILndOLEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52
-cixQLnJILFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC5QSSxQLnBLLFAuaGosUC5W
-cCxQLk9SLFAuR0EsUC5XRixQLm4xLFAuY1MsUC5WQyxQLnRwLFAuZTEsUC5OWSxQLlJaLFAuTUUsUC55
-NSxQLnEzLFAueUksUC5jNixQLnFkLFcuQ3YsVy5iVSxXLmhILFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5F
-ZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAubFIsUC5qZyxQLkdFLFAuUEMsUC5ZbSxQLk56LFAuUVMsUC5u
-cCxMLmUsTC5WVyxMLkwsTC5XeCxMLkFPLEwuZE4sTC5IbyxMLnh6LEwuSUMsTC5uVCxMLkJaLEwuRlEs
-TC50WSxMLkdILEwuRFQsTC5lSCxMLnpELEwuT0UsTC5UVyxMLnhyLEwuRUUsTC5RTCxMLlZTLE0uTWks
-TS5xNyxNLk5vLFgucVJdKQpyKFAuWFMsW0guVzAsSC5heixILnZWLEguRXEsUC5DNixILnU5LFAubixQ
-LnUsUC5tcCxQLnViLFAuZHMsUC5saixQLlVWLFAuY10pCnIoSC5sYyxbSC56eCxILnJUXSkKcyhILmtZ
-LFAuQzYpCnMoUC5pbCxQLllrKQpyKFAuaWwsW0guTjUsUC51dyxXLkQ5LFcuU3ldKQpzKEguS1csUC5t
-VykKcyhILmIwLEguRVQpCnIoSC5iMCxbSC5SRyxILldCXSkKcyhILlZQLEguUkcpCnMoSC5EZyxILlZQ
-KQpzKEguWkcsSC5XQikKcyhILlBnLEguWkcpCnIoSC5QZyxbSC54aixILmRFLEguWkEsSC53ZixILlBx
-LEguZUUsSC5WNl0pCnIoSC51OSxbSC5oeixILmlNXSkKcyhQLlpmLFAuUGYpCnMoUC5KaSxQLm0wKQpz
-KFAuYjYsUC5YdikKcyhQLlZqLFAuV1kpCnIoUC5VayxbUC5DVixQLlppLFAuYnldKQpzKFAud0ksUC5r
-VCkKcihQLndJLFtQLlU4LFAuTXgsUC5FMyxQLkdZXSkKcyhQLnU1LFAuWmkpCnIoUC5GSyxbUC5DUCxQ
-LktOXSkKcihQLnUsW1AuYkosUC5lWV0pCnMoUC5xZSxQLkRuKQpyKFcuRDAsW1cudUgsVy53YSxXLks1
-LFcuQ21dKQpyKFcudUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpyKFcuY3YsW1cucUUsUC5kNV0pCnIo
-Vy5xRSxbVy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5CVCxXLnlZ
-XSkKcyhXLm9KLFcuTGUpCnMoVy5UNSxXLkF6KQpzKFcuVmIsVy5RRikKcyhXLk83LFcud2EpCnIoVy5l
-YSxbVy53NixXLmV3XSkKcyhXLkFqLFcudzYpCnMoVy5yQixXLks3KQpzKFcuQkgsVy5yQikKcyhXLnc0
-LFcuSUIpCnMoVy5vYSxXLlhXKQpzKFcucmgsVy5vYSkKcyhXLmk3LFcuRDkpCnMoUC5BcyxQLlZqKQpy
-KFAuQXMsW1cuSTQsUC5LZV0pCnMoVy5STyxQLnFoKQpzKFcuQ3EsVy5STykKcyhXLnhDLFAuTU8pCnMo
-Vy5jdCxXLm02KQpzKFAuQmYsUC5pSikKcihQLkU0LFtQLnI3LFAuY29dKQpzKFAuVHosUC5jbykKcyhQ
-Lm5kLFAuZDUpCnMoQi5MdSxPLnpMKQpyKEIuTHUsW0UuT0YsRi5ydSxMLklWXSkKdChILlhDLEguUmUp
-CnQoSC5SRyxQLmxEKQp0KEguVlAsSC5TVSkKdChILldCLFAubEQpCnQoSC5aRyxILlNVKQp0KFAublks
-UC5sRCkKdChQLldZLFAubGYpCnQoUC5SVSxQLktQKQp0KFcuTGUsVy5pZCkKdChXLks3LFAubEQpCnQo
-Vy5yQixXLkdtKQp0KFcuWFcsUC5sRCkKdChXLm9hLFcuR20pCnQoUC5jbyxQLmxEKX0pKCkKdmFyIHY9
-e3R5cGVVbml2ZXJzZTp7ZUM6bmV3IE1hcCgpLHRSOnt9LGVUOnt9LHRQVjp7fSxzRUE6W119LG1hbmds
-ZWRHbG9iYWxOYW1lczp7S046ImludCIsQ1A6ImRvdWJsZSIsRks6Im51bSIscVU6IlN0cmluZyIsYTI6
-ImJvb2wiLGM4OiJOdWxsIix6TToiTGlzdCJ9LG1hbmdsZWROYW1lczp7fSxnZXRUeXBlRnJvbU5hbWU6
-Z2V0R2xvYmFsRnJvbU5hbWUsbWV0YWRhdGE6W10sdHlwZXM6WyJjOCgpIiwiYzgoQCxAKSIsIn4oKSIs
-ImM4KGN2KSIsIkAoQCkiLCJjOChPNykiLCJjOChBaikiLCJhMihxVSkiLCJxVShxVSkiLCJ+KH4oKSki
-LCJjOChxVSxxVSkiLCJhMihjdixxVSxxVSxKUSkiLCJjOChAKSIsImM4KGVhKSIsImEyKGtGKSIsImM4
-KHFVLEApIiwiYzgocVUpIiwiS04oS04sS04pIiwifihxVVtAXSkiLCJ+KHFVLHFVKSIsIm42KEtOKSIs
-In4ocVUsS04pIiwiYTIodUgpIiwiWjA8cVUscVU+KFowPHFVLHFVPixxVSkiLCJjOChldykiLCJAKGVh
-KSIsImM4KEdELEApIiwiQChxVSkiLCJ+KEFqKSIsImEyKHh1PHFVPikiLCJyNyhAKSIsIlR6PEA+KEAp
-IiwiRTQoQCkiLCJ2czxAPihAKSIsImM4KEBbR3pdKSIsIn4odUgsdUgpIiwifihrW0d6XSkiLCJxVShL
-TikiLCJAKEAscVUpIiwiYzgofigpKSIsImsoQCkiLCJ+KEFqe3JlbGF0aXZlVG86cVV9KSIsIm42KEAs
-QCkiXSxpbnRlcmNlcHRvcnNCeVRhZzpudWxsLGxlYWZUYWdzOm51bGx9CkgueGIodi50eXBlVW5pdmVy
-c2UsSlNPTi5wYXJzZSgneyJyeCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiZDUiLCJXdCI6ImQ1IiwidjAi
-OiJldyIsIk1yIjoicUUiLCJlTCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6IlFGIiwieWMi
-OiJBaiIsInk0IjoidzYiLCJhUCI6IkNtIiwianIiOiJueCIsImtKIjoibngiLCJ6VSI6IkRnIiwiZGYi
-OiJFVCIsInlFIjp7ImEyIjpbXX0sIllFIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXX0sImlDIjp7InZt
-IjpbXX0sImtkIjp7InZtIjpbXX0sImM1Ijp7IkVIIjpbXSwidm0iOltdfSwiamQiOnsiek0iOlsiMSJd
-LCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIxIl0sInpNIjpbIjEiXSwiY1giOlsiMSJdfSwibTEiOnsi
-QW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJGSyI6W119LCJ1ciI6eyJLTiI6W10sIkNQIjpbXSwiRksi
-OltdfSwiVkEiOnsiQ1AiOltdLCJGSyI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sInFqIjp7IlJl
-IjpbIktOIl0sImxEIjpbIktOIl0sInpNIjpbIktOIl0sImNYIjpbIktOIl0sImxELkUiOiJLTiIsIlJl
-LkUiOiJLTiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6eyJjWCI6WyIxIl19LCJuSCI6eyJhTCI6WyIx
-Il0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9LCJhNyI6eyJBbiI6WyIxIl19LCJBOCI6
-eyJhTCI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIx
-Il0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIlhDIjp7IlJlIjpbIjEiXSwibEQiOlsiMSJd
-LCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sInd2Ijp7IkdEIjpbXX0sIlBEIjp7IkdqIjpbIjEiLCIyIl0s
-IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19
-LCJXVSI6eyJaMCI6WyIxIiwiMiJdfSwiTFAiOnsiV1UiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0s
-IkxJIjp7InZRIjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0s
-IlhPIjp7Ikd6IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7IkVIIjpbXX0sInp4Ijp7IkVIIjpbXX0s
-InJUIjp7IkVIIjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7IlhTIjpbXX0sIk41Ijp7IkZvIjpbIjEi
-LCIyIl0sIllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0sIllrLksiOiIxIiwiWWsuViI6IjIifSwi
-aTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJBbiI6WyIxIl19LCJWUiI6eyJ3TCI6W10s
-InZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ciOnsiY1giOlsiaWIiXSwiY1guRSI6Imli
-In0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119LCJ1biI6eyJjWCI6WyJPZCJdLCJjWC5F
-IjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFTIjpbXX0sImIwIjp7IlhqIjpbIkAiXSwi
-RVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJYaiI6WyJAIl0sInpNIjpbIkNQIl0sIkVU
-IjpbXSwiU1UiOlsiQ1AiXSwiQVMiOltdLCJjWCI6WyJDUCJdLCJsRC5FIjoiQ1AifSwiUGciOnsibEQi
-OlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwi
-Y1giOlsiS04iXX0sInhqIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltd
-LCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJkRSI6eyJsRCI6WyJL
-TiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMiOltdLCJjWCI6
-WyJLTiJdLCJsRC5FIjoiS04ifSwiWkEiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJd
-LCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sIndmIjp7
-ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6
-W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJQcSI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJY
-aiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04i
-fSwiZUUiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktO
-Il0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sIlY2Ijp7Im42IjpbXSwibEQiOlsiS04i
-XSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsi
-S04iXSwibEQuRSI6IktOIn0sInU5Ijp7IlhTIjpbXX0sImh6Ijp7IlhTIjpbXX0sImlNIjp7IlhTIjpb
-XX0sIlpmIjp7IlBmIjpbIjEiXX0sInZzIjp7ImI4IjpbIjEiXX0sIkN3Ijp7IlhTIjpbXX0sIm0wIjp7
-IkpCIjpbXX0sIkppIjp7IkpCIjpbXX0sImI2Ijp7Ilh2IjpbIjEiXSwieHUiOlsiMSJdLCJjWCI6WyIx
-Il19LCJsbSI6eyJBbiI6WyIxIl19LCJtVyI6eyJjWCI6WyIxIl19LCJMVSI6eyJsRCI6WyIxIl0sInpN
-IjpbIjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIllr
-Ijp7IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6WyIxIiwiMiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIi
-XSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIlZqIjp7ImxmIjpb
-IjEiXSwieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJ4dSI6WyIxIl0sImNYIjpbIjEiXX0sInV3
-Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwiWWsuSyI6InFVIiwiWWsuViI6IkAifSwi
-aTgiOnsiYUwiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6InFVIiwiY1guRSI6InFVIn0sIkNWIjp7
-IlVrIjpbInpNPEtOPiIsInFVIl0sIlVrLlMiOiJ6TTxLTj4ifSwiVTgiOnsid0kiOlsiek08S04+Iiwi
-cVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08S04+Il19LCJieSI6eyJVayI6WyJrIiwicVUiXSwiVWsu
-UyI6ImsifSwiTXgiOnsid0kiOlsicVUiLCJrIl19LCJ1NSI6eyJVayI6WyJxVSIsInpNPEtOPiJdLCJV
-ay5TIjoicVUifSwiRTMiOnsid0kiOlsicVUiLCJ6TTxLTj4iXX0sIkdZIjp7IndJIjpbInpNPEtOPiIs
-InFVIl19LCJDUCI6eyJGSyI6W119LCJDNiI6eyJYUyI6W119LCJuIjp7IlhTIjpbXX0sInUiOnsiWFMi
-OltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwibXAiOnsiWFMiOltdfSwidWIiOnsiWFMi
-OltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwiVVYiOnsiWFMiOltdfSwiazUiOnsiWFMi
-OltdfSwiS1kiOnsiWFMiOltdfSwiYyI6eyJYUyI6W119LCJLTiI6eyJGSyI6W119LCJ6TSI6eyJjWCI6
-WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJjWCI6WyIxIl19LCJxVSI6eyJ2WCI6W119LCJSbiI6
-eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6W119LCJxZSI6eyJpRCI6W119LCJxRSI6
-eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiR2giOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sImZZ
-Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuQiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwi
-UVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm54Ijp7InVIIjpbXSwiRDAiOltdfSwiUUYiOnsi
-dUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6WyJGSyJdfSwid3oiOnsibEQiOlsiMSJdLCJ6TSI6WyIx
-Il0sImNYIjpbIjEiXSwibEQuRSI6IjEifSwiY3YiOnsidUgiOltdLCJEMCI6W119LCJUNSI6eyJBeiI6
-W119LCJoNCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiVmIiOnsidUgiOltdLCJEMCI6W119LCJP
-NyI6eyJEMCI6W119LCJ3YSI6eyJEMCI6W119LCJBaiI6eyJlYSI6W119LCJlNyI6eyJsRCI6WyJ1SCJd
-LCJ6TSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgifSwidUgiOnsiRDAiOltdfSwiQkgiOnsi
-R20iOlsidUgiXSwibEQiOlsidUgiXSwiek0iOlsidUgiXSwiWGoiOlsidUgiXSwiY1giOlsidUgiXSwi
-bEQuRSI6InVIIiwiR20uRSI6InVIIn0sIlNOIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJldyI6
-eyJlYSI6W119LCJscCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiVGIiOnsiY3YiOltdLCJ1SCI6
-W10sIkQwIjpbXX0sIkl2Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJCVCI6eyJjdiI6W10sInVI
-IjpbXSwiRDAiOltdfSwieVkiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sInc2Ijp7ImVhIjpbXX0s
-Iks1Ijp7InY2IjpbXSwiRDAiOltdfSwiQ20iOnsiRDAiOltdfSwiQ1EiOnsidUgiOltdLCJEMCI6W119
-LCJ3NCI6eyJ0biI6WyJGSyJdfSwicmgiOnsiR20iOlsidUgiXSwibEQiOlsidUgiXSwiek0iOlsidUgi
-XSwiWGoiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIiwiR20uRSI6InVIIn0sIkQ5Ijp7Illr
-IjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdfSwiaTciOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6
-WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJTeSI6eyJZayI6WyJxVSIsInFVIl0s
-IlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIkk0Ijp7ImxmIjpbInFVIl0s
-Inh1IjpbInFVIl0sImNYIjpbInFVIl19LCJSTyI6eyJxaCI6WyIxIl19LCJDcSI6eyJSTyI6WyIxIl0s
-InFoIjpbIjEiXX0sIkpRIjp7ImtGIjpbXX0sInZEIjp7ImtGIjpbXX0sIm02Ijp7ImtGIjpbXX0sImN0
-Ijp7ImtGIjpbXX0sIk93Ijp7ImtGIjpbXX0sIlc5Ijp7IkFuIjpbIjEiXX0sImRXIjp7InY2IjpbXSwi
-RDAiOltdfSwibWsiOnsieTAiOltdfSwiS28iOnsib24iOltdfSwiQXMiOnsibGYiOlsicVUiXSwieHUi
-OlsicVUiXSwiY1giOlsicVUiXX0sInI3Ijp7IkU0IjpbXX0sIlR6Ijp7ImxEIjpbIjEiXSwiek0iOlsi
-MSJdLCJFNCI6W10sImNYIjpbIjEiXSwibEQuRSI6IjEifSwibmQiOnsiZDUiOltdLCJjdiI6W10sInVI
-IjpbXSwiRDAiOltdfSwiS2UiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiY1giOlsicVUiXX0sImQ1
-Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuNiI6eyJ6TSI6WyJLTiJdLCJBUyI6W10sImNYIjpb
-IktOIl19LCJYQSI6eyJrRiI6W119LCJPRiI6eyJMdSI6W119LCJydSI6eyJMdSI6W119LCJJViI6eyJM
-dSI6W119fScpKQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYlEiOjEsIlhDIjoxLCJN
-TyI6MSwia1QiOjIsIm1XIjoxLCJMVSI6MSwiaWwiOjIsIlZqIjoxLCJuWSI6MSwiV1kiOjEsImNvIjox
-fScpKQp2YXIgdT0oZnVuY3Rpb24gcnRpaSgpe3ZhciB0PUguTjAKcmV0dXJue2s6dCgiR2giKSxuOnQo
-IkN3IiksRjp0KCJuQiIpLGQ6dCgiQXoiKSxZOnQoIlFQIiksZ0Y6dCgiUEQ8R0QsQD4iKSxoOnQoImN2
-IiksYlU6dCgiWFMiKSxCOnQoImVhIiksYVM6dCgiRDAiKSxjODp0KCJUNSIpLFo6dCgiRUgiKSxjOnQo
-ImI4PEA+Iikscjp0KCJPNyIpLEk6dCgiU2ciKSxvOnQoInZRIiksZWg6dCgiY1g8dUg+IiksWDp0KCJj
-WDxxVT4iKSxSOnQoImNYPEA+IiksZkE6dCgiamQ8U2U+IiksYlA6dCgiamQ8dUY+IiksUTp0KCJqZDxr
-Rj4iKSxzOnQoImpkPHFVPiIpLGI6dCgiamQ8QD4iKSx0OnQoImpkPEtOPiIpLGVIOnQoInZtIiksZzp0
-KCJjNSIpLGFVOnQoIlhqPEA+IiksYW06dCgiVHo8QD4iKSxlbzp0KCJONTxHRCxAPiIpLG06dCgiRTQi
-KSxkejp0KCJoRiIpLGk6dCgiek08cVU+Iiksajp0KCJ6TTxAPiIpLEw6dCgiek08S04+IiksZjp0KCJa
-MDxxVSxxVT4iKSxhOnQoIlowPHFVLEA+IiksRzp0KCJaMDxALEA+IiksZHY6dCgiQTg8cVUscVU+Iiks
-ZG86dCgiQTg8cVUsQD4iKSxWOnQoIkFqIiksZEQ6dCgiRVQiKSxibTp0KCJWNiIpLEE6dCgidUgiKSxl
-OnQoImtGIiksUDp0KCJjOCIpLEs6dCgiayIpLHA6dCgiZXciKSxxOnQoInRuPEZLPiIpLGZ2OnQoIndM
-IiksZXc6dCgibmQiKSxUOnQoInh1PHFVPiIpLGw6dCgiR3oiKSxOOnQoInFVIiksZEc6dCgicVUocVUp
-IiksZzc6dCgiZDUiKSxmbzp0KCJHRCIpLGFXOnQoInlZIiksdTp0KCJBUyIpLGdjOnQoIm42IiksYWs6
-dCgia2QiKSxXOnQoIkdqPHFVLHFVPiIpLHY6dCgiaUQiKSxjYzp0KCJVNTxxVT4iKSxnNDp0KCJLNSIp
-LGNpOnQoInY2IiksZzI6dCgiQ20iKSxFOnQoIlpmPE83PiIpLGg5OnQoIkNRIiksYWM6dCgiZTciKSxD
-OnQoIkNxPEFqPiIpLFM6dCgid3o8Y3Y+IikseDp0KCJGZTxALEA+IiksYW86dCgidnM8Tzc+IiksXzp0
-KCJ2czxAPiIpLGZKOnQoInZzPEtOPiIpLE86dCgiSlEiKSxKOnQoImJuIiksY0o6dCgiYTIiKSxhbDp0
-KCJhMihrKSIpLGJCOnQoImEyKHFVKSIpLGJmOnQoImEyKEApIiksejp0KCJAIiksZk86dCgiQCgpIiks
-VTp0KCJAKGVhKSIpLHk6dCgiQChrKSIpLGVwOnQoIkAoayxrKSIpLHc6dCgiQChrLEd6KSIpLGNoOnQo
-IkAoeHU8cVU+KSIpLGRPOnQoIkAocVUpIiksYjg6dCgiQChALEApIiksSDp0KCJ+IiksTTp0KCJ+KCki
-KSxhbjp0KCJ+KGV3KSIpLEQ6dCgifihxVSxxVSkiKSxjQTp0KCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rp
-b24gY29uc3RhbnRzKCl7dmFyIHQ9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLlJZPVcuUVAucHJv
-dG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLk83LnByb3RvdHlwZQpDLk9rPUoudkIucHJv
-dG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLnVyLnByb3RvdHlwZQpDLmpOPUouWUUucHJv
-dG90eXBlCkMuQ0Q9Si5xSS5wcm90b3R5cGUKQy54Qj1KLkRyLnByb3RvdHlwZQpDLkRHPUouYzUucHJv
-dG90eXBlCkMuRXg9Vy51OC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlwZQpDLlpRPUouaUMucHJv
-dG90eXBlCkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlwZQpDLm9sPVcuSzUucHJv
-dG90eXBlCkMueTg9bmV3IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5PND1mdW5jdGlvbiBnZXRUYWdG
-YWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7CiAg
-cmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1mdW5jdGlvbigpIHsKICB2
-YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgZnVuY3Rpb24g
-Z2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG8pOwogICAgcmV0dXJu
-IHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWco
-b2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4qRWxlbWVudCQvLnRlc3QodGFnKSkgewog
-ICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvYmplY3QpOwogICAgICBpZiAobmFt
-ZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiAiSFRNTEVsZW1l
-bnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnR2VuZXJpY0Jyb3dzZXIob2JqZWN0
-LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYmIG9iamVjdCBpbnN0YW5jZW9mIEhUTUxF
-bGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJldHVybiBnZXRVbmtub3duVGFnKG9iamVj
-dCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnKHRhZykgewogICAgaWYgKHR5cGVv
-ZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiB3aW5kb3db
-dGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5k
-b3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT0gImZ1bmN0aW9uIikgcmV0dXJuIG51
-bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBmdW5jdGlvbiBkaXNjcmlt
-aW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBpc0Jyb3dzZXIgPSB0eXBlb2YgbmF2aWdh
-dG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRUYWc6IGdldFRhZywKICAgIGdldFVua25v
-d25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlciA6IGdldFVua25vd25U
-YWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZvclRhZywKICAgIGRpc2NyaW1pbmF0b3I6
-IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxiYWNrKSB7CiAgcmV0dXJu
-IGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAib2JqZWN0IikgcmV0
-dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgIGlmICh1YS5pbmRl
-eE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBob29rczsKICAgIGlmICh1YS5pbmRleE9m
-KCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkgewogICAgICAgIHJldHVy
-biB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvd1twXSAmJiB3aW5kb3dbcF0ubmFtZSA9
-PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5kb3ciKSAmJiBjb25maXJtKCJIVE1MRWxl
-bWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29rcy5nZXRUYWcgPSBnZXRUYWdGYWxsYmFj
-azsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBpZiAodHlwZW9mIGRhcnRFeHBlcmltZW50
-YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4gaG9va3M7CiAgaG9va3MuZ2V0VGFnID0g
-ZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0KQy5mUT1mdW5jdGlvbiho
-b29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHByb3RvdHlwZUZvclRhZyA9
-IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhlZChvKSB7CiAgICB2YXIg
-dGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7CiAgICAgIGlmICghIW8u
-eG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAgICByZXR1cm4gIiFIVE1MRG9jdW1lbnQi
-OwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnRml4ZWQo
-dGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHBy
-b3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXhlZDsKICBob29r
-cy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKfQpDLmRrPWZ1bmN0aW9uKGhv
-b2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZp
-Z2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IikgPT0g
-LTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBxdWlja01h
-cCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0YVRyYW5zZmVyIjog
-IkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAiR2VvbG9jYXRpb24iLAogICAgIkxvY2F0
-aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2FnZUV2ZW50IjogIk1lc3NhZ2VFdmVudCIs
-CiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAgZnVuY3Rpb24gZ2V0VGFnRmlyZWZveChv
-KSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0dXJuIHF1aWNrTWFwW3RhZ10gfHwgdGFn
-OwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94Owp9CkMueGk9ZnVuY3Rpb24oaG9va3Mp
-IHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRv
-ci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIlRyaWRlbnQvIikgPT0gLTEp
-IHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBxdWlja01hcCA9
-IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0YVRyYW5zZmVyIjogIkNs
-aXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTERURWxl
-bWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFzZUVsZW1lbnQiOiAiSFRNTEVsZW1lbnQi
-LAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rpb24gZ2V0VGFnSUUobykg
-ewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBuZXdUYWcgPSBxdWlja01hcFt0YWddOwog
-ICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlmICh0YWcgPT0gIk9iamVjdCIpIHsKICAg
-ICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5jZW9mIHdpbmRvdy5EYXRhVmlldykpIHJl
-dHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90
-eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlm
-IChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5w
-cm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0lFOwogIGhvb2tzLnByb3RvdHlwZUZv
-clRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9va3MpIHsgcmV0dXJuIGhv
-b2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09bmV3IFAudTUoKQpDLlFr
-PW5ldyBQLkUzKCkKQy5OVT1uZXcgUC5KaSgpCkMuQTM9bmV3IFAuTXgobnVsbCkKQy5HYj1ILlZNKHQo
-WzEyNywyMDQ3LDY1NTM1LDExMTQxMTFdKSx1LnQpCkMuYWs9SC5WTSh0KFswLDAsMzI3NzYsMzM3OTIs
-MSwxMDI0MCwwLDBdKSx1LnQpCkMuY209SC5WTSh0KFsiKjo6Y2xhc3MiLCIqOjpkaXIiLCIqOjpkcmFn
-Z2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0IiwiKjo6aXRlbXByb3AiLCIqOjppdGVt
-cmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxsY2hlY2siLCIqOjp0aXRsZSIsIio6
-OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIsIkE6OmhyZWZsYW5nIiwiQTo6bmFt
-ZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQiLCJBOjp0eXBlIiwiQVJFQTo6YWNj
-ZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJFQTo6bm9ocmVmIiwiQVJFQTo6c2hh
-cGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFVRElPOjpjb250cm9scyIsIkFVRElP
-Ojpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0ZWQiLCJBVURJTzo6cHJlbG9hZCIs
-IkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9yIiwiQk9EWTo6bGluayIsIkJPRFk6
-OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRPTjo6YWNjZXNza2V5IiwiQlVUVE9O
-OjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFiaW5kZXgiLCJCVVRUT046OnR5cGUi
-LCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5WQVM6OndpZHRoIiwiQ0FQVElPTjo6
-YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpjaGFyb2ZmIiwiQ09MOjpzcGFuIiwi
-Q09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFsaWduIiwiQ09MR1JPVVA6OmNoYXIi
-LCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwiQ09MR1JPVVA6OnZhbGlnbiIsIkNP
-TEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01NQU5EOjpjb21tYW5kIiwiQ09NTUFO
-RDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6OnJhZGlvZ3JvdXAiLCJDT01NQU5E
-Ojp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwiREVUQUlMUzo6b3BlbiIsIkRJUjo6
-Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJRUxEU0VUOjpkaXNhYmxlZCIsIkZP
-TlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJGT1JNOjphY2NlcHQiLCJGT1JNOjph
-dXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0aG9kIiwiRk9STTo6bmFtZSIsIkZP
-Uk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6bmFtZSIsIkgxOjphbGlnbiIsIkgy
-OjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1OjphbGlnbiIsIkg2OjphbGlnbiIsIkhS
-OjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6d2lkdGgiLCJIVE1MOjp2ZXJzaW9u
-IiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIiLCJJRlJBTUU6OmhlaWdodCIsIklG
-UkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0aCIsIklGUkFNRTo6d2lkdGgiLCJJ
-TUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklNRzo6aGVpZ2h0IiwiSU1HOjpoc3Bh
-Y2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2VtYXAiLCJJTUc6OnZzcGFjZSIsIklN
-Rzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vzc2tleSIsIklOUFVUOjphbGlnbiIs
-IklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5QVVQ6OmF1dG9mb2N1cyIsIklOUFVU
-OjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6OmlucHV0bW9kZSIsIklOUFVUOjppc21h
-cCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjptYXhsZW5ndGgiLCJJTlBVVDo6bWlu
-IiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBVVDo6cGxhY2Vob2xkZXIiLCJJTlBV
-VDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6c2l6ZSIsIklOUFVUOjpzdGVwIiwi
-SU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6dXNlbWFwIiwiSU5QVVQ6OnZhbHVl
-IiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJLRVlHRU46OmtleXR5cGUiLCJLRVlH
-RU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZvciIsIkxFR0VORDo6YWNjZXNza2V5
-IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVlIiwiTElOSzo6c2l6ZXMiLCJNQVA6
-Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJNRU5VOjp0eXBlIiwiTUVURVI6Omhp
-Z2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjptaW4iLCJNRVRFUjo6dmFsdWUiLCJP
-QkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9MOjpyZXZlcnNlZCIsIk9MOjpzdGFy
-dCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BUR1JPVVA6OmxhYmVsIiwiT1BUSU9O
-OjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNlbGVjdGVkIiwiT1BUSU9OOjp2YWx1
-ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxpZ24iLCJQUkU6OndpZHRoIiwiUFJP
-R1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6dmFsdWUiLCJTRUxFQ1Q6OmF1dG9j
-b21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11bHRpcGxlIiwiU0VMRUNUOjpuYW1l
-IiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNFTEVDVDo6dGFiaW5kZXgiLCJTT1VS
-Q0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xvciIsIlRBQkxFOjpib3JkZXIiLCJU
-QUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmciLCJUQUJMRTo6ZnJhbWUiLCJUQUJM
-RTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0aCIsIlRCT0RZOjphbGlnbiIsIlRC
-T0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFsaWduIiwiVEQ6OmFiYnIiLCJURDo6
-YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNoYXIiLCJURDo6Y2hhcm9mZiIsIlRE
-Ojpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0IiwiVEQ6Om5vd3JhcCIsIlREOjpyb3dz
-cGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0aCIsIlRFWFRBUkVBOjphY2Nlc3Nr
-ZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6OmNvbHMiLCJURVhUQVJFQTo6ZGlz
-YWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6Om5hbWUiLCJURVhUQVJFQTo6cGxh
-Y2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJFQTo6cmVxdWlyZWQiLCJURVhUQVJF
-QTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVBOjp3cmFwIiwiVEZPT1Q6OmFsaWdu
-IiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09UOjp2YWxpZ24iLCJUSDo6YWJiciIs
-IlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJUSDo6Y2hhciIsIlRIOjpjaGFyb2Zm
-IiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWlnaHQiLCJUSDo6bm93cmFwIiwiVEg6
-OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6OndpZHRoIiwiVEhFQUQ6OmFsaWdu
-IiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFEOjp2YWxpZ24iLCJUUjo6YWxpZ24i
-LCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYiLCJUUjo6dmFsaWduIiwiVFJBQ0s6
-OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIsIlRSQUNLOjpzcmNsYW5nIiwiVUw6
-OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIsIlZJREVPOjpoZWlnaHQiLCJWSURF
-Tzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11dGVkIiwiVklERU86OnByZWxvYWQi
-LCJWSURFTzo6d2lkdGgiXSksdS5zKQpDLlZDPUguVk0odChbMCwwLDY1NDkwLDQ1MDU1LDY1NTM1LDM0
-ODE1LDY1NTM0LDE4NDMxXSksdS50KQpDLm1LPUguVk0odChbMCwwLDI2NjI0LDEwMjMsNjU1MzQsMjA0
-Nyw2NTUzNCwyMDQ3XSksdS50KQpDLlNxPUguVk0odChbIkhFQUQiLCJBUkVBIiwiQkFTRSIsIkJBU0VG
-T05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJBTUUiLCJGUkFNRVNFVCIsIkhSIiwi
-SU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwiTUVUQSIsIlBBUkFNIiwiU09VUkNF
-IiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx1LnMpCkMueEQ9SC5WTSh0KFtdKSx1LnMpCkMuZG49SC5W
-TSh0KFtdKSx1LmIpCkMudG89SC5WTSh0KFswLDAsMzI3MjIsMTIyODcsNjU1MzQsMzQ4MTUsNjU1MzQs
-MTg0MzFdKSx1LnQpCkMuRjM9SC5WTSh0KFswLDAsMjQ1NzYsMTAyMyw2NTUzNCwzNDgxNSw2NTUzNCwx
-ODQzMV0pLHUudCkKQy5lYT1ILlZNKHQoWzAsMCwzMjc1NCwxMTI2Myw2NTUzNCwzNDgxNSw2NTUzNCwx
-ODQzMV0pLHUudCkKQy5aSj1ILlZNKHQoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwx
-ODQzMV0pLHUudCkKQy5XZD1ILlZNKHQoWzAsMCw2NTQ5MCwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwx
-ODQzMV0pLHUudCkKQy5ReD1ILlZNKHQoWyJiaW5kIiwiaWYiLCJyZWYiLCJyZXBlYXQiLCJzeW50YXgi
-XSksdS5zKQpDLkJJPUguVk0odChbIkE6OmhyZWYiLCJBUkVBOjpocmVmIiwiQkxPQ0tRVU9URTo6Y2l0
-ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJDT01NQU5EOjppY29uIiwiREVMOjpjaXRlIiwiRk9STTo6YWN0
-aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6c3JjIiwiSU5TOjpjaXRlIiwiUTo6Y2l0ZSIsIlZJREVPOjpw
-b3N0ZXIiXSksdS5zKQpDLldPPW5ldyBILkxQKDAse30sQy54RCxILk4wKCJMUDxxVSxxVT4iKSkKQy5o
-VT1ILlZNKHQoW10pLEguTjAoImpkPEdEPiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy5oVSxILk4wKCJM
-UDxHRCxAPiIpKQpDLlRlPW5ldyBILnd2KCJjYWxsIil9KSgpOyhmdW5jdGlvbiBzdGF0aWNGaWVsZHMo
-KXskLnlqPTAKJC5tSj1udWxsCiQuUDQ9bnVsbAokLk5GPW51bGwKJC5UWD1udWxsCiQueDc9bnVsbAok
-Lm53PW51bGwKJC52dj1udWxsCiQuQnY9bnVsbAokLlM2PW51bGwKJC5rOD1udWxsCiQubWc9bnVsbAok
-LlVEPSExCiQuWDM9Qy5OVQokLnhnPVtdCiQueG89bnVsbAokLkJPPW51bGwKJC5sdD1udWxsCiQuRVU9
-bnVsbAokLm9yPVAuRmwodS5OLHUuWikKJC5JNj1udWxsCiQuRmY9bnVsbH0pKCk7KGZ1bmN0aW9uIGxh
-enlJbml0aWFsaXplcnMoKXt2YXIgdD1odW5rSGVscGVycy5sYXp5CnQoJCwiZmEiLCJ3IixmdW5jdGlv
-bigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnQoJCwiWWYiLCJVTiIsZnVuY3Rp
-b24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2pzIil9KQp0KCQsIlUyIiwiU24iLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oSC5TNyh7CnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0p
-CnQoJCwieHEiLCJscSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHskbWV0aG9kJDpudWxsLAp0
-b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQp0KCQsIlIxIiwiTjkiLGZ1
-bmN0aW9uKCl7cmV0dXJuIEguY00oSC5TNyhudWxsKSl9KQp0KCQsImZOIiwiaUkiLGZ1bmN0aW9uKCl7
-cmV0dXJuIEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5
-e251bGwuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0o
-KSl9KQp0KCQsInFpIiwiS2YiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5TNyh2b2lkIDApKX0pCnQo
-JCwicloiLCJaaCIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRz
-RXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7KHZvaWQgMCkuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1j
-YXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0oKSl9KQp0KCQsImtxIiwiY1AiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oSC5NaihudWxsKSl9KQp0KCQsInR0IiwiYzMiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00o
-ZnVuY3Rpb24oKXt0cnl7bnVsbC4kbWV0aG9kJH1jYXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0oKSl9
-KQp0KCQsImR0IiwiSEsiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5Naih2b2lkIDApKX0pCnQoJCwi
-QTciLCJyMSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXsodm9pZCAwKS4kbWV0
-aG9kJH1jYXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0oKSl9KQp0KCQsIldjIiwidXQiLGZ1bmN0aW9u
-KCl7cmV0dXJuIFAuT2ooKX0pCnQoJCwia2giLCJyZiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5XSSgpfSkK
-dCgkLCJidCIsIlY3IixmdW5jdGlvbigpe3JldHVybiBILkRRKEguWEYoSC5WTShbLTIsLTIsLTIsLTIs
-LTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
-LTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTEsLTIsLTIsLTIsLTIsLTIsNjIs
-LTIsNjIsLTIsNjMsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTIsLTIsLTIsLTEsLTIsLTIs
-LTIsMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwy
-MiwyMywyNCwyNSwtMiwtMiwtMiwtMiw2MywtMiwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwz
-NiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMiwtMiwtMiwtMiwt
-Ml0sdS50KSkpfSkKdCgkLCJNNSIsIndRIixmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgcHJvY2VzcyE9
-InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09IltvYmpl
-Y3QgcHJvY2Vzc10iJiZwcm9jZXNzLnBsYXRmb3JtPT0id2luMzIifSkKdCgkLCJtZiIsIno0IixmdW5j
-dGlvbigpe3JldHVybiBQLm51KCJeW1xcLVxcLjAtOUEtWl9hLXp+XSokIil9KQp0KCQsIkpHIiwidloi
-LGZ1bmN0aW9uKCl7cmV0dXJuIFAudXgoKX0pCnQoJCwiU0MiLCJBTiIsZnVuY3Rpb24oKXtyZXR1cm4g
-UC50TShbIkEiLCJBQkJSIiwiQUNST05ZTSIsIkFERFJFU1MiLCJBUkVBIiwiQVJUSUNMRSIsIkFTSURF
-IiwiQVVESU8iLCJCIiwiQkRJIiwiQkRPIiwiQklHIiwiQkxPQ0tRVU9URSIsIkJSIiwiQlVUVE9OIiwi
-Q0FOVkFTIiwiQ0FQVElPTiIsIkNFTlRFUiIsIkNJVEUiLCJDT0RFIiwiQ09MIiwiQ09MR1JPVVAiLCJD
-T01NQU5EIiwiREFUQSIsIkRBVEFMSVNUIiwiREQiLCJERUwiLCJERVRBSUxTIiwiREZOIiwiRElSIiwi
-RElWIiwiREwiLCJEVCIsIkVNIiwiRklFTERTRVQiLCJGSUdDQVBUSU9OIiwiRklHVVJFIiwiRk9OVCIs
-IkZPT1RFUiIsIkZPUk0iLCJIMSIsIkgyIiwiSDMiLCJINCIsIkg1IiwiSDYiLCJIRUFERVIiLCJIR1JP
-VVAiLCJIUiIsIkkiLCJJRlJBTUUiLCJJTUciLCJJTlBVVCIsIklOUyIsIktCRCIsIkxBQkVMIiwiTEVH
-RU5EIiwiTEkiLCJNQVAiLCJNQVJLIiwiTUVOVSIsIk1FVEVSIiwiTkFWIiwiTk9CUiIsIk9MIiwiT1BU
-R1JPVVAiLCJPUFRJT04iLCJPVVRQVVQiLCJQIiwiUFJFIiwiUFJPR1JFU1MiLCJRIiwiUyIsIlNBTVAi
-LCJTRUNUSU9OIiwiU0VMRUNUIiwiU01BTEwiLCJTT1VSQ0UiLCJTUEFOIiwiU1RSSUtFIiwiU1RST05H
-IiwiU1VCIiwiU1VNTUFSWSIsIlNVUCIsIlRBQkxFIiwiVEJPRFkiLCJURCIsIlRFWFRBUkVBIiwiVEZP
-T1QiLCJUSCIsIlRIRUFEIiwiVElNRSIsIlRSIiwiVFJBQ0siLCJUVCIsIlUiLCJVTCIsIlZBUiIsIlZJ
-REVPIiwiV0JSIl0sdS5OKX0pCnQoJCwiWDQiLCJoRyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXlxc
-UyskIil9KQp0KCQsIndPIiwib3ciLGZ1bmN0aW9uKCl7cmV0dXJuIHUubS5iKFAuTkQoc2VsZikpfSkK
-dCgkLCJrdCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkK
-dCgkLCJKZSIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMu
-bz1hfX0pCnQoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQuR1YoKX0pCnQoJCwiZmUi
-LCJLRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEoKX0pCnQoJCwibU0iLCJuVSIsZnVuY3Rpb24o
-KXtyZXR1cm4gbmV3IE0ubEkoJC5IaygpKX0pCnQoJCwieXIiLCJiRCIsZnVuY3Rpb24oKXtyZXR1cm4g
-bmV3IEUuT0YoUC5udSgiLyIpLFAubnUoIlteL10kIiksUC5udSgiXi8iKSl9KQp0KCQsIk1rIiwiS2si
-LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLklWKFAubnUoIlsvXFxcXF0iKSxQLm51KCJbXi9cXFxcXSQi
-KSxQLm51KCJeKFxcXFxcXFxcW15cXFxcXStcXFxcW15cXFxcL10rfFthLXpBLVpdOlsvXFxcXF0pIiks
-UC5udSgiXlsvXFxcXF0oPyFbL1xcXFxdKSIpKX0pCnQoJCwiYWsiLCJFYiIsZnVuY3Rpb24oKXtyZXR1
-cm4gbmV3IEYucnUoUC5udSgiLyIpLFAubnUoIiheW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly98W14v
-XSkkIiksUC5udSgiW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly9bXi9dKiIpLFAubnUoIl4vIikpfSkK
-dCgkLCJscyIsIkhrIixmdW5jdGlvbigpe3JldHVybiBPLlJoKCl9KX0pKCk7KGZ1bmN0aW9uIG5hdGl2
-ZVN1cHBvcnQoKXshZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbihhKXt2YXIgbj17fQpuW2FdPTEKcmV0
-dXJuIE9iamVjdC5rZXlzKGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobikpWzBdfQp2Lmdl
-dElzb2xhdGVUYWc9ZnVuY3Rpb24oYSl7cmV0dXJuIHQoIl9fX2RhcnRfIithK3YuaXNvbGF0ZVRhZyl9
-CnZhciBzPSJfX19kYXJ0X2lzb2xhdGVfdGFnc18iCnZhciByPU9iamVjdFtzXXx8KE9iamVjdFtzXT1P
-YmplY3QuY3JlYXRlKG51bGwpKQp2YXIgcT0iX1p4WXhYIgpmb3IodmFyIHA9MDs7cCsrKXt2YXIgbz10
-KHErIl8iK3ArIl8iKQppZighKG8gaW4gcikpe3Jbb109MQp2Lmlzb2xhdGVUYWc9bwpicmVha319di5k
-aXNwYXRjaFByb3BlcnR5TmFtZT12LmdldElzb2xhdGVUYWcoImRpc3BhdGNoX3JlY29yZCIpfSgpCmh1
-bmtIZWxwZXJzLnNldE9yVXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcoe0RPTUVycm9yOkoudkIsRE9NSW1w
-bGVtZW50YXRpb246Si52QixNZWRpYUVycm9yOkoudkIsTmF2aWdhdG9yOkoudkIsTmF2aWdhdG9yQ29u
-Y3VycmVudEhhcmR3YXJlOkoudkIsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6Si52QixPdmVyY29uc3Ry
-YWluZWRFcnJvcjpKLnZCLFBvc2l0aW9uRXJyb3I6Si52QixSYW5nZTpKLnZCLFNRTEVycm9yOkoudkIs
-RGF0YVZpZXc6SC5FVCxBcnJheUJ1ZmZlclZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0
-QXJyYXk6SC5EZyxJbnQxNkFycmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVp
-bnQxNkFycmF5Okgud2YsVWludDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZh
-c1BpeGVsQXJyYXk6SC5lRSxVaW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxC
-UkVsZW1lbnQ6Vy5xRSxIVE1MQnV0dG9uRWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUs
-SFRNTENvbnRlbnRFbGVtZW50OlcucUUsSFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVu
-dDpXLnFFLEhUTUxEYXRhTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1M
-RGlhbG9nRWxlbWVudDpXLnFFLEhUTUxEaXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFF
-LEhUTUxGaWVsZFNldEVsZW1lbnQ6Vy5xRSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50
-OlcucUUsSFRNTEhlYWRpbmdFbGVtZW50OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFt
-ZUVsZW1lbnQ6Vy5xRSxIVE1MSW1hZ2VFbGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhU
-TUxMSUVsZW1lbnQ6Vy5xRSxIVE1MTGFiZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5x
-RSxIVE1MTGlua0VsZW1lbnQ6Vy5xRSxIVE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6
-Vy5xRSxIVE1MTWVudUVsZW1lbnQ6Vy5xRSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVt
-ZW50OlcucUUsSFRNTE1vZEVsZW1lbnQ6Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVj
-dEVsZW1lbnQ6Vy5xRSxIVE1MT3B0R3JvdXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5x
-RSxIVE1MT3V0cHV0RWxlbWVudDpXLnFFLEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVs
-ZW1lbnQ6Vy5xRSxIVE1MUHJlRWxlbWVudDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1M
-UXVvdGVFbGVtZW50OlcucUUsSFRNTFNjcmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpX
-LnFFLEhUTUxTbG90RWxlbWVudDpXLnFFLEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVt
-ZW50OlcucUUsSFRNTFN0eWxlRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUs
-SFRNTFRhYmxlQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1M
-VGFibGVIZWFkZXJDZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4
-dEFyZWFFbGVtZW50OlcucUUsSFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFF
-LEhUTUxUcmFja0VsZW1lbnQ6Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVt
-ZW50OlcucUUsSFRNTFZpZGVvRWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRN
-TEZvbnRFbGVtZW50OlcucUUsSFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6
-Vy5xRSxIVE1MTWFycXVlZUVsZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVt
-ZW50OlcuR2gsSFRNTEFyZWFFbGVtZW50OlcuZlksSFRNTEJhc2VFbGVtZW50OlcubkIsQmxvYjpXLkF6
-LEhUTUxCb2R5RWxlbWVudDpXLlFQLENEQVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxD
-b21tZW50OlcubngsUHJvY2Vzc2luZ0luc3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVj
-bGFyYXRpb246Vy5vSixNU1N0eWxlQ1NTUHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0os
-WE1MRG9jdW1lbnQ6Vy5RRixEb2N1bWVudDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTVJlY3RSZWFk
-T25seTpXLklCLERPTVRva2VuTGlzdDpXLm43LEVsZW1lbnQ6Vy5jdixBYm9ydFBheW1lbnRFdmVudDpX
-LmVhLEFuaW1hdGlvbkV2ZW50OlcuZWEsQW5pbWF0aW9uUGxheWJhY2tFdmVudDpXLmVhLEFwcGxpY2F0
-aW9uQ2FjaGVFcnJvckV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDpXLmVhLEJhY2tn
-cm91bmRGZXRjaEV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OlcuZWEsQmFja2dyb3Vu
-ZEZldGNoZWRFdmVudDpXLmVhLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDpXLmVhLEJlZm9yZVVubG9h
-ZEV2ZW50OlcuZWEsQmxvYkV2ZW50OlcuZWEsQ2FuTWFrZVBheW1lbnRFdmVudDpXLmVhLENsaXBib2Fy
-ZEV2ZW50OlcuZWEsQ2xvc2VFdmVudDpXLmVhLEN1c3RvbUV2ZW50OlcuZWEsRGV2aWNlTW90aW9uRXZl
-bnQ6Vy5lYSxEZXZpY2VPcmllbnRhdGlvbkV2ZW50OlcuZWEsRXJyb3JFdmVudDpXLmVhLEV4dGVuZGFi
-bGVFdmVudDpXLmVhLEV4dGVuZGFibGVNZXNzYWdlRXZlbnQ6Vy5lYSxGZXRjaEV2ZW50OlcuZWEsRm9u
-dEZhY2VTZXRMb2FkRXZlbnQ6Vy5lYSxGb3JlaWduRmV0Y2hFdmVudDpXLmVhLEdhbWVwYWRFdmVudDpX
-LmVhLEhhc2hDaGFuZ2VFdmVudDpXLmVhLEluc3RhbGxFdmVudDpXLmVhLE1lZGlhRW5jcnlwdGVkRXZl
-bnQ6Vy5lYSxNZWRpYUtleU1lc3NhZ2VFdmVudDpXLmVhLE1lZGlhUXVlcnlMaXN0RXZlbnQ6Vy5lYSxN
-ZWRpYVN0cmVhbUV2ZW50OlcuZWEsTWVkaWFTdHJlYW1UcmFja0V2ZW50OlcuZWEsTWVzc2FnZUV2ZW50
-OlcuZWEsTUlESUNvbm5lY3Rpb25FdmVudDpXLmVhLE1JRElNZXNzYWdlRXZlbnQ6Vy5lYSxNdXRhdGlv
-bkV2ZW50OlcuZWEsTm90aWZpY2F0aW9uRXZlbnQ6Vy5lYSxQYWdlVHJhbnNpdGlvbkV2ZW50OlcuZWEs
-UGF5bWVudFJlcXVlc3RFdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6Vy5lYSxQb3BT
-dGF0ZUV2ZW50OlcuZWEsUHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OlcuZWEsUHJl
-c2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlRXZlbnQ6Vy5lYSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6Vy5l
-YSxQdXNoRXZlbnQ6Vy5lYSxSVENEYXRhQ2hhbm5lbEV2ZW50OlcuZWEsUlRDRFRNRlRvbmVDaGFuZ2VF
-dmVudDpXLmVhLFJUQ1BlZXJDb25uZWN0aW9uSWNlRXZlbnQ6Vy5lYSxSVENUcmFja0V2ZW50OlcuZWEs
-U2VjdXJpdHlQb2xpY3lWaW9sYXRpb25FdmVudDpXLmVhLFNlbnNvckVycm9yRXZlbnQ6Vy5lYSxTcGVl
-Y2hSZWNvZ25pdGlvbkVycm9yOlcuZWEsU3BlZWNoUmVjb2duaXRpb25FdmVudDpXLmVhLFNwZWVjaFN5
-bnRoZXNpc0V2ZW50OlcuZWEsU3RvcmFnZUV2ZW50OlcuZWEsU3luY0V2ZW50OlcuZWEsVHJhY2tFdmVu
-dDpXLmVhLFRyYW5zaXRpb25FdmVudDpXLmVhLFdlYktpdFRyYW5zaXRpb25FdmVudDpXLmVhLFZSRGV2
-aWNlRXZlbnQ6Vy5lYSxWUkRpc3BsYXlFdmVudDpXLmVhLFZSU2Vzc2lvbkV2ZW50OlcuZWEsTW9qb0lu
-dGVyZmFjZVJlcXVlc3RFdmVudDpXLmVhLFVTQkNvbm5lY3Rpb25FdmVudDpXLmVhLElEQlZlcnNpb25D
-aGFuZ2VFdmVudDpXLmVhLEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OlcuZWEsT2ZmbGluZUF1ZGlvQ29tcGxl
-dGlvbkV2ZW50OlcuZWEsV2ViR0xDb250ZXh0RXZlbnQ6Vy5lYSxFdmVudDpXLmVhLElucHV0RXZlbnQ6
-Vy5lYSxFdmVudFRhcmdldDpXLkQwLEZpbGU6Vy5UNSxIVE1MRm9ybUVsZW1lbnQ6Vy5oNCxIaXN0b3J5
-OlcuYnIsSFRNTERvY3VtZW50OlcuVmIsWE1MSHR0cFJlcXVlc3Q6Vy5PNyxYTUxIdHRwUmVxdWVzdEV2
-ZW50VGFyZ2V0Olcud2EsSW1hZ2VEYXRhOlcuU2csTG9jYXRpb246Vy51OCxNb3VzZUV2ZW50OlcuQWos
-RHJhZ0V2ZW50OlcuQWosUG9pbnRlckV2ZW50OlcuQWosV2hlZWxFdmVudDpXLkFqLERvY3VtZW50RnJh
-Z21lbnQ6Vy51SCxTaGFkb3dSb290OlcudUgsRG9jdW1lbnRUeXBlOlcudUgsTm9kZTpXLnVILE5vZGVM
-aXN0OlcuQkgsUmFkaW9Ob2RlTGlzdDpXLkJILEhUTUxQYXJhZ3JhcGhFbGVtZW50OlcuU04sUHJvZ3Jl
-c3NFdmVudDpXLmV3LFJlc291cmNlUHJvZ3Jlc3NFdmVudDpXLmV3LEhUTUxTZWxlY3RFbGVtZW50Olcu
-bHAsSFRNTFRhYmxlRWxlbWVudDpXLlRiLEhUTUxUYWJsZVJvd0VsZW1lbnQ6Vy5JdixIVE1MVGFibGVT
-ZWN0aW9uRWxlbWVudDpXLkJULEhUTUxUZW1wbGF0ZUVsZW1lbnQ6Vy55WSxDb21wb3NpdGlvbkV2ZW50
-OlcudzYsRm9jdXNFdmVudDpXLnc2LEtleWJvYXJkRXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3Vj
-aEV2ZW50OlcudzYsVUlFdmVudDpXLnc2LFdpbmRvdzpXLks1LERPTVdpbmRvdzpXLks1LERlZGljYXRl
-ZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2hhcmVk
-V29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxXb3JrZXJHbG9iYWxTY29wZTpXLkNtLEF0dHI6Vy5DUSxDbGll
-bnRSZWN0OlcudzQsRE9NUmVjdDpXLnc0LE5hbWVkTm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpX
-LnJoLElEQktleVJhbmdlOlAuaEYsU1ZHU2NyaXB0RWxlbWVudDpQLm5kLFNWR0FFbGVtZW50OlAuZDUs
-U1ZHQW5pbWF0ZUVsZW1lbnQ6UC5kNSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDpQLmQ1LFNWR0FuaW1h
-dGVUcmFuc2Zvcm1FbGVtZW50OlAuZDUsU1ZHQW5pbWF0aW9uRWxlbWVudDpQLmQ1LFNWR0NpcmNsZUVs
-ZW1lbnQ6UC5kNSxTVkdDbGlwUGF0aEVsZW1lbnQ6UC5kNSxTVkdEZWZzRWxlbWVudDpQLmQ1LFNWR0Rl
-c2NFbGVtZW50OlAuZDUsU1ZHRGlzY2FyZEVsZW1lbnQ6UC5kNSxTVkdFbGxpcHNlRWxlbWVudDpQLmQ1
-LFNWR0ZFQmxlbmRFbGVtZW50OlAuZDUsU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6UC5kNSxTVkdGRUNv
-bXBvbmVudFRyYW5zZmVyRWxlbWVudDpQLmQ1LFNWR0ZFQ29tcG9zaXRlRWxlbWVudDpQLmQ1LFNWR0ZF
-Q29udm9sdmVNYXRyaXhFbGVtZW50OlAuZDUsU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuZDUs
-U1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OlAuZDUsU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAu
-ZDUsU1ZHRkVGbG9vZEVsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNBRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0JF
-bGVtZW50OlAuZDUsU1ZHRkVGdW5jR0VsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNSRWxlbWVudDpQLmQ1LFNW
-R0ZFR2F1c3NpYW5CbHVyRWxlbWVudDpQLmQ1LFNWR0ZFSW1hZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJn
-ZUVsZW1lbnQ6UC5kNSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6UC5kNSxTVkdGRU1vcnBob2xvZ3lFbGVt
-ZW50OlAuZDUsU1ZHRkVPZmZzZXRFbGVtZW50OlAuZDUsU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmQ1
-LFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6UC5kNSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5k
-NSxTVkdGRVRpbGVFbGVtZW50OlAuZDUsU1ZHRkVUdXJidWxlbmNlRWxlbWVudDpQLmQ1LFNWR0ZpbHRl
-ckVsZW1lbnQ6UC5kNSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDpQLmQ1LFNWR0dFbGVtZW50OlAuZDUs
-U1ZHR2VvbWV0cnlFbGVtZW50OlAuZDUsU1ZHR3JhcGhpY3NFbGVtZW50OlAuZDUsU1ZHSW1hZ2VFbGVt
-ZW50OlAuZDUsU1ZHTGluZUVsZW1lbnQ6UC5kNSxTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5kNSxT
-VkdNYXJrZXJFbGVtZW50OlAuZDUsU1ZHTWFza0VsZW1lbnQ6UC5kNSxTVkdNZXRhZGF0YUVsZW1lbnQ6
-UC5kNSxTVkdQYXRoRWxlbWVudDpQLmQ1LFNWR1BhdHRlcm5FbGVtZW50OlAuZDUsU1ZHUG9seWdvbkVs
-ZW1lbnQ6UC5kNSxTVkdQb2x5bGluZUVsZW1lbnQ6UC5kNSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6
-UC5kNSxTVkdSZWN0RWxlbWVudDpQLmQ1LFNWR1NldEVsZW1lbnQ6UC5kNSxTVkdTdG9wRWxlbWVudDpQ
-LmQ1LFNWR1N0eWxlRWxlbWVudDpQLmQ1LFNWR1NWR0VsZW1lbnQ6UC5kNSxTVkdTd2l0Y2hFbGVtZW50
-OlAuZDUsU1ZHU3ltYm9sRWxlbWVudDpQLmQ1LFNWR1RTcGFuRWxlbWVudDpQLmQ1LFNWR1RleHRDb250
-ZW50RWxlbWVudDpQLmQ1LFNWR1RleHRFbGVtZW50OlAuZDUsU1ZHVGV4dFBhdGhFbGVtZW50OlAuZDUs
-U1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDpQLmQ1LFNWR1RpdGxlRWxlbWVudDpQLmQ1LFNWR1VzZUVs
-ZW1lbnQ6UC5kNSxTVkdWaWV3RWxlbWVudDpQLmQ1LFNWR0dyYWRpZW50RWxlbWVudDpQLmQ1LFNWR0Nv
-bXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OlAuZDUsU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQ
-LmQ1LFNWR01QYXRoRWxlbWVudDpQLmQ1LFNWR0VsZW1lbnQ6UC5kNX0pCmh1bmtIZWxwZXJzLnNldE9y
-VXBkYXRlTGVhZlRhZ3Moe0RPTUVycm9yOnRydWUsRE9NSW1wbGVtZW50YXRpb246dHJ1ZSxNZWRpYUVy
-cm9yOnRydWUsTmF2aWdhdG9yOnRydWUsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOnRydWUsTmF2
-aWdhdG9yVXNlck1lZGlhRXJyb3I6dHJ1ZSxPdmVyY29uc3RyYWluZWRFcnJvcjp0cnVlLFBvc2l0aW9u
-RXJyb3I6dHJ1ZSxSYW5nZTp0cnVlLFNRTEVycm9yOnRydWUsRGF0YVZpZXc6dHJ1ZSxBcnJheUJ1ZmZl
-clZpZXc6ZmFsc2UsRmxvYXQzMkFycmF5OnRydWUsRmxvYXQ2NEFycmF5OnRydWUsSW50MTZBcnJheTp0
-cnVlLEludDMyQXJyYXk6dHJ1ZSxJbnQ4QXJyYXk6dHJ1ZSxVaW50MTZBcnJheTp0cnVlLFVpbnQzMkFy
-cmF5OnRydWUsVWludDhDbGFtcGVkQXJyYXk6dHJ1ZSxDYW52YXNQaXhlbEFycmF5OnRydWUsVWludDhB
-cnJheTpmYWxzZSxIVE1MQXVkaW9FbGVtZW50OnRydWUsSFRNTEJSRWxlbWVudDp0cnVlLEhUTUxCdXR0
-b25FbGVtZW50OnRydWUsSFRNTENhbnZhc0VsZW1lbnQ6dHJ1ZSxIVE1MQ29udGVudEVsZW1lbnQ6dHJ1
-ZSxIVE1MRExpc3RFbGVtZW50OnRydWUsSFRNTERhdGFFbGVtZW50OnRydWUsSFRNTERhdGFMaXN0RWxl
-bWVudDp0cnVlLEhUTUxEZXRhaWxzRWxlbWVudDp0cnVlLEhUTUxEaWFsb2dFbGVtZW50OnRydWUsSFRN
-TERpdkVsZW1lbnQ6dHJ1ZSxIVE1MRW1iZWRFbGVtZW50OnRydWUsSFRNTEZpZWxkU2V0RWxlbWVudDp0
-cnVlLEhUTUxIUkVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZEVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZGluZ0VsZW1l
-bnQ6dHJ1ZSxIVE1MSHRtbEVsZW1lbnQ6dHJ1ZSxIVE1MSUZyYW1lRWxlbWVudDp0cnVlLEhUTUxJbWFn
-ZUVsZW1lbnQ6dHJ1ZSxIVE1MSW5wdXRFbGVtZW50OnRydWUsSFRNTExJRWxlbWVudDp0cnVlLEhUTUxM
-YWJlbEVsZW1lbnQ6dHJ1ZSxIVE1MTGVnZW5kRWxlbWVudDp0cnVlLEhUTUxMaW5rRWxlbWVudDp0cnVl
-LEhUTUxNYXBFbGVtZW50OnRydWUsSFRNTE1lZGlhRWxlbWVudDp0cnVlLEhUTUxNZW51RWxlbWVudDp0
-cnVlLEhUTUxNZXRhRWxlbWVudDp0cnVlLEhUTUxNZXRlckVsZW1lbnQ6dHJ1ZSxIVE1MTW9kRWxlbWVu
-dDp0cnVlLEhUTUxPTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MT2JqZWN0RWxlbWVudDp0cnVlLEhUTUxPcHRH
-cm91cEVsZW1lbnQ6dHJ1ZSxIVE1MT3B0aW9uRWxlbWVudDp0cnVlLEhUTUxPdXRwdXRFbGVtZW50OnRy
-dWUsSFRNTFBhcmFtRWxlbWVudDp0cnVlLEhUTUxQaWN0dXJlRWxlbWVudDp0cnVlLEhUTUxQcmVFbGVt
-ZW50OnRydWUsSFRNTFByb2dyZXNzRWxlbWVudDp0cnVlLEhUTUxRdW90ZUVsZW1lbnQ6dHJ1ZSxIVE1M
-U2NyaXB0RWxlbWVudDp0cnVlLEhUTUxTaGFkb3dFbGVtZW50OnRydWUsSFRNTFNsb3RFbGVtZW50OnRy
-dWUsSFRNTFNvdXJjZUVsZW1lbnQ6dHJ1ZSxIVE1MU3BhbkVsZW1lbnQ6dHJ1ZSxIVE1MU3R5bGVFbGVt
-ZW50OnRydWUsSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDZWxsRWxlbWVudDp0
-cnVlLEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50
-OnRydWUsSFRNTFRhYmxlQ29sRWxlbWVudDp0cnVlLEhUTUxUZXh0QXJlYUVsZW1lbnQ6dHJ1ZSxIVE1M
-VGltZUVsZW1lbnQ6dHJ1ZSxIVE1MVGl0bGVFbGVtZW50OnRydWUsSFRNTFRyYWNrRWxlbWVudDp0cnVl
-LEhUTUxVTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MVW5rbm93bkVsZW1lbnQ6dHJ1ZSxIVE1MVmlkZW9FbGVt
-ZW50OnRydWUsSFRNTERpcmVjdG9yeUVsZW1lbnQ6dHJ1ZSxIVE1MRm9udEVsZW1lbnQ6dHJ1ZSxIVE1M
-RnJhbWVFbGVtZW50OnRydWUsSFRNTEZyYW1lU2V0RWxlbWVudDp0cnVlLEhUTUxNYXJxdWVlRWxlbWVu
-dDp0cnVlLEhUTUxFbGVtZW50OmZhbHNlLEhUTUxBbmNob3JFbGVtZW50OnRydWUsSFRNTEFyZWFFbGVt
-ZW50OnRydWUsSFRNTEJhc2VFbGVtZW50OnRydWUsQmxvYjpmYWxzZSxIVE1MQm9keUVsZW1lbnQ6dHJ1
-ZSxDREFUQVNlY3Rpb246dHJ1ZSxDaGFyYWN0ZXJEYXRhOnRydWUsQ29tbWVudDp0cnVlLFByb2Nlc3Np
-bmdJbnN0cnVjdGlvbjp0cnVlLFRleHQ6dHJ1ZSxDU1NTdHlsZURlY2xhcmF0aW9uOnRydWUsTVNTdHls
-ZUNTU1Byb3BlcnRpZXM6dHJ1ZSxDU1MyUHJvcGVydGllczp0cnVlLFhNTERvY3VtZW50OnRydWUsRG9j
-dW1lbnQ6ZmFsc2UsRE9NRXhjZXB0aW9uOnRydWUsRE9NUmVjdFJlYWRPbmx5OmZhbHNlLERPTVRva2Vu
-TGlzdDp0cnVlLEVsZW1lbnQ6ZmFsc2UsQWJvcnRQYXltZW50RXZlbnQ6dHJ1ZSxBbmltYXRpb25FdmVu
-dDp0cnVlLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6dHJ1ZSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVu
-dDp0cnVlLEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDp0
-cnVlLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6dHJ1
-ZSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6dHJ1ZSxCZWZvcmVVbmxvYWRFdmVudDp0cnVlLEJsb2JF
-dmVudDp0cnVlLENhbk1ha2VQYXltZW50RXZlbnQ6dHJ1ZSxDbGlwYm9hcmRFdmVudDp0cnVlLENsb3Nl
-RXZlbnQ6dHJ1ZSxDdXN0b21FdmVudDp0cnVlLERldmljZU1vdGlvbkV2ZW50OnRydWUsRGV2aWNlT3Jp
-ZW50YXRpb25FdmVudDp0cnVlLEVycm9yRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6dHJ1ZSxFeHRl
-bmRhYmxlTWVzc2FnZUV2ZW50OnRydWUsRmV0Y2hFdmVudDp0cnVlLEZvbnRGYWNlU2V0TG9hZEV2ZW50
-OnRydWUsRm9yZWlnbkZldGNoRXZlbnQ6dHJ1ZSxHYW1lcGFkRXZlbnQ6dHJ1ZSxIYXNoQ2hhbmdlRXZl
-bnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6dHJ1ZSxNZWRpYUVuY3J5cHRlZEV2ZW50OnRydWUsTWVkaWFLZXlN
-ZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OnRydWUsTWVkaWFTdHJlYW1FdmVudDp0
-cnVlLE1lZGlhU3RyZWFtVHJhY2tFdmVudDp0cnVlLE1lc3NhZ2VFdmVudDp0cnVlLE1JRElDb25uZWN0
-aW9uRXZlbnQ6dHJ1ZSxNSURJTWVzc2FnZUV2ZW50OnRydWUsTXV0YXRpb25FdmVudDp0cnVlLE5vdGlm
-aWNhdGlvbkV2ZW50OnRydWUsUGFnZVRyYW5zaXRpb25FdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0RXZl
-bnQ6dHJ1ZSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OnRydWUsUG9wU3RhdGVFdmVudDp0cnVlLFBy
-ZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rp
-b25DbG9zZUV2ZW50OnRydWUsUHJvbWlzZVJlamVjdGlvbkV2ZW50OnRydWUsUHVzaEV2ZW50OnRydWUs
-UlRDRGF0YUNoYW5uZWxFdmVudDp0cnVlLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6dHJ1ZSxSVENQZWVy
-Q29ubmVjdGlvbkljZUV2ZW50OnRydWUsUlRDVHJhY2tFdmVudDp0cnVlLFNlY3VyaXR5UG9saWN5Vmlv
-bGF0aW9uRXZlbnQ6dHJ1ZSxTZW5zb3JFcnJvckV2ZW50OnRydWUsU3BlZWNoUmVjb2duaXRpb25FcnJv
-cjp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6dHJ1ZSxTcGVlY2hTeW50aGVzaXNFdmVudDp0cnVl
-LFN0b3JhZ2VFdmVudDp0cnVlLFN5bmNFdmVudDp0cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9u
-RXZlbnQ6dHJ1ZSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJE
-aXNwbGF5RXZlbnQ6dHJ1ZSxWUlNlc3Npb25FdmVudDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZl
-bnQ6dHJ1ZSxVU0JDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxB
-dWRpb1Byb2Nlc3NpbmdFdmVudDp0cnVlLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdl
-YkdMQ29udGV4dEV2ZW50OnRydWUsRXZlbnQ6ZmFsc2UsSW5wdXRFdmVudDpmYWxzZSxFdmVudFRhcmdl
-dDpmYWxzZSxGaWxlOnRydWUsSFRNTEZvcm1FbGVtZW50OnRydWUsSGlzdG9yeTp0cnVlLEhUTUxEb2N1
-bWVudDp0cnVlLFhNTEh0dHBSZXF1ZXN0OnRydWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxz
-ZSxJbWFnZURhdGE6dHJ1ZSxMb2NhdGlvbjp0cnVlLE1vdXNlRXZlbnQ6dHJ1ZSxEcmFnRXZlbnQ6dHJ1
-ZSxQb2ludGVyRXZlbnQ6dHJ1ZSxXaGVlbEV2ZW50OnRydWUsRG9jdW1lbnRGcmFnbWVudDp0cnVlLFNo
-YWRvd1Jvb3Q6dHJ1ZSxEb2N1bWVudFR5cGU6dHJ1ZSxOb2RlOmZhbHNlLE5vZGVMaXN0OnRydWUsUmFk
-aW9Ob2RlTGlzdDp0cnVlLEhUTUxQYXJhZ3JhcGhFbGVtZW50OnRydWUsUHJvZ3Jlc3NFdmVudDp0cnVl
-LFJlc291cmNlUHJvZ3Jlc3NFdmVudDp0cnVlLEhUTUxTZWxlY3RFbGVtZW50OnRydWUsSFRNTFRhYmxl
-RWxlbWVudDp0cnVlLEhUTUxUYWJsZVJvd0VsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVTZWN0aW9uRWxlbWVu
-dDp0cnVlLEhUTUxUZW1wbGF0ZUVsZW1lbnQ6dHJ1ZSxDb21wb3NpdGlvbkV2ZW50OnRydWUsRm9jdXNF
-dmVudDp0cnVlLEtleWJvYXJkRXZlbnQ6dHJ1ZSxUZXh0RXZlbnQ6dHJ1ZSxUb3VjaEV2ZW50OnRydWUs
-VUlFdmVudDpmYWxzZSxXaW5kb3c6dHJ1ZSxET01XaW5kb3c6dHJ1ZSxEZWRpY2F0ZWRXb3JrZXJHbG9i
-YWxTY29wZTp0cnVlLFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFNoYXJlZFdvcmtlckdsb2Jh
-bFNjb3BlOnRydWUsV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxBdHRyOnRydWUsQ2xpZW50UmVjdDp0cnVl
-LERPTVJlY3Q6dHJ1ZSxOYW1lZE5vZGVNYXA6dHJ1ZSxNb3pOYW1lZEF0dHJNYXA6dHJ1ZSxJREJLZXlS
-YW5nZTp0cnVlLFNWR1NjcmlwdEVsZW1lbnQ6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVF
-bGVtZW50OnRydWUsU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3Jt
-RWxlbWVudDp0cnVlLFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUs
-U1ZHQ2xpcFBhdGhFbGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0
-cnVlLFNWR0Rpc2NhcmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5k
-RWxlbWVudDp0cnVlLFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFu
-c2ZlckVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0
-cml4RWxlbWVudDp0cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxh
-Y2VtZW50TWFwRWxlbWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxv
-b2RFbGVtZW50OnRydWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVl
-LFNWR0ZFRnVuY0dFbGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFu
-Qmx1ckVsZW1lbnQ6dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRy
-dWUsU1ZHRkVNZXJnZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNW
-R0ZFT2Zmc2V0RWxlbWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1
-bGFyTGlnaHRpbmdFbGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxl
-RWxlbWVudDp0cnVlLFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRy
-dWUsU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5
-RWxlbWVudDp0cnVlLFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNW
-R0xpbmVFbGVtZW50OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxl
-bWVudDp0cnVlLFNWR01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0
-aEVsZW1lbnQ6dHJ1ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUs
-U1ZHUG9seWxpbmVFbGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVj
-dEVsZW1lbnQ6dHJ1ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHls
-ZUVsZW1lbnQ6dHJ1ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5
-bWJvbEVsZW1lbnQ6dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6
-dHJ1ZSxTVkdUZXh0RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3Np
-dGlvbmluZ0VsZW1lbnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUs
-U1ZHVmlld0VsZW1lbnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFu
-c2ZlckZ1bmN0aW9uRWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0
-aEVsZW1lbnQ6dHJ1ZSxTVkdFbGVtZW50OmZhbHNlfSkKSC5iMC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
-QXJyYXlCdWZmZXJWaWV3IgpILlJHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
-CkguVlAuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5EZy4kbmF0aXZlU3Vw
-ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILldCLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJh
-eUJ1ZmZlclZpZXciCkguWkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5Q
-Zy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3In0pKCkKY29udmVydEFsbFRvRmFz
-dE9iamVjdCh3KQpjb252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhmdW5jdGlvbihhKXtpZih0eXBlb2YgZG9j
-dW1lbnQ9PT0idW5kZWZpbmVkIil7YShudWxsKQpyZXR1cm59aWYodHlwZW9mIGRvY3VtZW50LmN1cnJl
-bnRTY3JpcHQhPSd1bmRlZmluZWQnKXthKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpCnJldHVybn12YXIg
-dD1kb2N1bWVudC5zY3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHI9MDtyPHQubGVuZ3Ro
-Oysrcil0W3JdLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSkKYShiLnRhcmdl
-dCl9Zm9yKHZhciBzPTA7czx0Lmxlbmd0aDsrK3MpdFtzXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixv
-bkxvYWQsZmFsc2UpfSkoZnVuY3Rpb24oYSl7di5jdXJyZW50U2NyaXB0PWEKaWYodHlwZW9mIGRhcnRN
-YWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihMLklxLFtdKQplbHNlIEwuSXEoW10p
-fSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+LGIpe3ZhciB0LHMscj1hLmNsYXNzTGlzdApmb3IodD1iLmxlbmd0aCxzPTA7czxiLmxlbmd0aDtiLmxl
+bmd0aD09PXR8fCgwLEgubGspKGIpLCsrcylyLmFkZChiW3NdKX0sCkpFOmZ1bmN0aW9uKGEsYixjLGQs
+ZSl7dmFyIHQ9Vy5hRihuZXcgVy52TihjKSx1LkIpCmlmKHQhPW51bGwmJiEwKUouZFooYSxiLHQsITEp
+CnJldHVybiBuZXcgVy54QyhhLGIsdCwhMSxlLkMoInhDPDA+IikpfSwKVHc6ZnVuY3Rpb24oYSl7dmFy
+IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLHM9bmV3IFcubWsodCx3aW5kb3cubG9jYXRpb24p
+CnM9bmV3IFcuSlEocykKcy5DWShhKQpyZXR1cm4gc30sCnlXOmZ1bmN0aW9uKGEsYixjLGQpe3UuaC5i
+KGEpCkgueShiKQpILnkoYykKdS5PLmIoZCkKcmV0dXJuITB9LApRVzpmdW5jdGlvbihhLGIsYyxkKXt2
+YXIgdCxzLHIKdS5oLmIoYSkKSC55KGIpCkgueShjKQp0PXUuTy5iKGQpLmEKcz10LmEKcy5ocmVmPWMK
+cj1zLmhvc3RuYW1lCnQ9dC5iCmlmKCEocj09dC5ob3N0bmFtZSYmcy5wb3J0PT10LnBvcnQmJnMucHJv
+dG9jb2w9PXQucHJvdG9jb2wpKWlmKHI9PT0iIilpZihzLnBvcnQ9PT0iIil7dD1zLnByb3RvY29sCnQ9
+dD09PSI6Inx8dD09PSIifWVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSEwCnJldHVybiB0fSwKQmw6
+ZnVuY3Rpb24oKXt2YXIgdD11Lk4scz1QLnRNKEMuUXgsdCkscj11LmRHLmIobmV3IFcuSUEoKSkscT1I
+LlZNKFsiVEVNUExBVEUiXSx1LnMpCnQ9bmV3IFcuY3QocyxQLkxzKHQpLFAuTHModCksUC5Mcyh0KSxu
+dWxsKQp0LkNZKG51bGwsbmV3IEguQTgoQy5ReCxyLHUuZHYpLHEsbnVsbCkKcmV0dXJuIHR9LApxYzpm
+dW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybgppZigicG9zdE1lc3NhZ2UiIGluIGEpe3Q9
+Vy5QMShhKQpyZXR1cm4gdH1lbHNlIHJldHVybiB1LmFTLmIoYSl9LApQMTpmdW5jdGlvbihhKXtpZihh
+PT09d2luZG93KXJldHVybiB1LmNpLmIoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoKX0sCmFGOmZ1bmN0
+aW9uKGEsYil7dmFyIHQ9JC5YMwppZih0PT09Qy5OVSlyZXR1cm4gYQpyZXR1cm4gdC5QeShhLGIpfSwK
+cUU6ZnVuY3Rpb24gcUUoKXt9LApHaDpmdW5jdGlvbiBHaCgpe30sCmZZOmZ1bmN0aW9uIGZZKCl7fSwK
+bkI6ZnVuY3Rpb24gbkIoKXt9LApBejpmdW5jdGlvbiBBeigpe30sClFQOmZ1bmN0aW9uIFFQKCl7fSwK
+bng6ZnVuY3Rpb24gbngoKXt9LApvSjpmdW5jdGlvbiBvSigpe30sCmlkOmZ1bmN0aW9uIGlkKCl7fSwK
+UUY6ZnVuY3Rpb24gUUYoKXt9LApOaDpmdW5jdGlvbiBOaCgpe30sCklCOmZ1bmN0aW9uIElCKCl7fSwK
+bjc6ZnVuY3Rpb24gbjcoKXt9LAp3ejpmdW5jdGlvbiB3eihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
+LApjdjpmdW5jdGlvbiBjdigpe30sCkN2OmZ1bmN0aW9uIEN2KCl7fSwKZWE6ZnVuY3Rpb24gZWEoKXt9
+LApEMDpmdW5jdGlvbiBEMCgpe30sClQ1OmZ1bmN0aW9uIFQ1KCl7fSwKaDQ6ZnVuY3Rpb24gaDQoKXt9
+LApicjpmdW5jdGlvbiBicigpe30sClZiOmZ1bmN0aW9uIFZiKCl7fSwKTzc6ZnVuY3Rpb24gTzcoKXt9
+LApiVTpmdW5jdGlvbiBiVShhKXt0aGlzLmE9YX0sCmhIOmZ1bmN0aW9uIGhIKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LAp3YTpmdW5jdGlvbiB3YSgpe30sClNnOmZ1bmN0aW9uIFNnKCl7fSwKdTg6ZnVuY3Rp
+b24gdTgoKXt9LApBajpmdW5jdGlvbiBBaigpe30sCmU3OmZ1bmN0aW9uIGU3KGEpe3RoaXMuYT1hfSwK
+dUg6ZnVuY3Rpb24gdUgoKXt9LApCSDpmdW5jdGlvbiBCSCgpe30sClNOOmZ1bmN0aW9uIFNOKCl7fSwK
+ZXc6ZnVuY3Rpb24gZXcoKXt9LApscDpmdW5jdGlvbiBscCgpe30sClRiOmZ1bmN0aW9uIFRiKCl7fSwK
+SXY6ZnVuY3Rpb24gSXYoKXt9LApCVDpmdW5jdGlvbiBCVCgpe30sCnlZOmZ1bmN0aW9uIHlZKCl7fSwK
+dzY6ZnVuY3Rpb24gdzYoKXt9LApLNTpmdW5jdGlvbiBLNSgpe30sCkNtOmZ1bmN0aW9uIENtKCl7fSwK
+Q1E6ZnVuY3Rpb24gQ1EoKXt9LAp3NDpmdW5jdGlvbiB3NCgpe30sCnJoOmZ1bmN0aW9uIHJoKCl7fSwK
+RDk6ZnVuY3Rpb24gRDkoKXt9LAppNzpmdW5jdGlvbiBpNyhhKXt0aGlzLmE9YX0sClN5OmZ1bmN0aW9u
+IFN5KGEpe3RoaXMuYT1hfSwKS1M6ZnVuY3Rpb24gS1MoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkEz
+OmZ1bmN0aW9uIEEzKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJNDpmdW5jdGlvbiBJNChhKXt0aGlz
+LmE9YX0sCkZrOmZ1bmN0aW9uIEZrKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClJPOmZ1bmN0aW9u
+IFJPKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCkNxOmZ1bmN0
+aW9uIENxKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCnhDOmZ1
+bmN0aW9uIHhDKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0
+aT1lfSwKdk46ZnVuY3Rpb24gdk4oYSl7dGhpcy5hPWF9LApKUTpmdW5jdGlvbiBKUShhKXt0aGlzLmE9
+YX0sCkdtOmZ1bmN0aW9uIEdtKCl7fSwKdkQ6ZnVuY3Rpb24gdkQoYSl7dGhpcy5hPWF9LApVdjpmdW5j
+dGlvbiBVdihhKXt0aGlzLmE9YX0sCkVnOmZ1bmN0aW9uIEVnKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
+Ygp0aGlzLmM9Y30sCm02OmZ1bmN0aW9uIG02KCl7fSwKRW86ZnVuY3Rpb24gRW8oKXt9LApXazpmdW5j
+dGlvbiBXaygpe30sCmN0OmZ1bmN0aW9uIGN0KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmU9YQpfLmE9
+YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCklBOmZ1bmN0aW9uIElBKCl7fSwKT3c6ZnVuY3Rpb24gT3coKXt9
+LApXOTpmdW5jdGlvbiBXOShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9LTEKXy5kPW51
+bGwKXy4kdGk9Y30sCmRXOmZ1bmN0aW9uIGRXKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5j
+dGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWF9
+LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rp
+b24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rp
+b24gb2EoKXt9fSxVPXsKeXU6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmJQ
+KQpmb3IodD1KLlU2KGEpLHM9Si5JVCh1LlIuYih0LnEoYSwiZGV0YWlscyIpKSk7cy5GKCk7KXtyPXMu
+Z2woKQpxPUouVTYocikKcD1ILnkocS5xKHIsImRlc2NyaXB0aW9uIikpCnE9cS5xKHIsImxpbmsiKQpp
+ZihxPT1udWxsKXE9bnVsbAplbHNle289Si5VNihxKQpxPW5ldyBVLk1sKEgueShvLnEocSwiaHJlZiIp
+KSxILlNjKG8ucShxLCJsaW5lIikpLEgueShvLnEocSwicGF0aCIpKSl9Qy5ObS5pKG4sbmV3IFUudUYo
+cCxxKSl9cmV0dXJuIG5ldyBVLmQyKG4sVS5qZih0LnEoYSwiZWRpdHMiKSksSC55KHQucShhLCJleHBs
+YW5hdGlvbiIpKSxILlNjKHQucShhLCJsaW5lIikpLEgueSh0LnEoYSwicGF0aCIpKSxVLk5kKHQucShh
+LCJ0cmFjZXMiKSkpfSwKamY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwK
+ZWxzZXt0PUguVk0oW10sdS5mQSkKZm9yKHM9Si5JVCh1LlIuYihhKSk7cy5GKCk7KXtyPXMuZ2woKQpx
+PUouVTYocikKQy5ObS5pKHQsbmV3IFUuU2UoSC55KHEucShyLCJkZXNjcmlwdGlvbiIpKSxILnkocS5x
+KHIsImhyZWYiKSkpKX19cmV0dXJuIHR9LApOZDpmdW5jdGlvbihhKXt2YXIgdCxzCmlmKGE9PW51bGwp
+dD1udWxsCmVsc2V7dD1ILlZNKFtdLHUuaGgpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOylDLk5t
+LmkodCxVLk5mKHMuZ2woKSkpfXJldHVybiB0fSwKTmY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxv
+PSJkZXNjcmlwdGlvbiIsbj1KLlU2KGEpLG09SC55KG4ucShhLG8pKSxsPUguVk0oW10sdS5hSikKZm9y
+KG49Si5JVCh1LlIuYihuLnEoYSwiZW50cmllcyIpKSk7bi5GKCk7KXt0PW4uZ2woKQpzPUouVTYodCkK
+cj1ILnkocy5xKHQsbykpCnE9SC55KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYo
+cz09bnVsbClzPW51bGwKZWxzZXtwPUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSks
+SC5TYyhwLnEocywibGluZSIpKSxILnkocC5xKHMsInBhdGgiKSkpfUMuTm0uaShsLG5ldyBVLndiKHIs
+cSxzKSl9cmV0dXJuIG5ldyBVLnlEKG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFy
+IF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNl
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp1RjpmdW5jdGlvbiB1RihhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKTWw6ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6
+ZnVuY3Rpb24geUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0
+aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y319LFQ9e0dWOmZ1bmN0aW9uIEdWKCl7fX0sTD17CklxOmZ1
+bmN0aW9uKCl7Qy5CWi5CKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixuZXcgTC5lKCkpCkMub2wu
+Qih3aW5kb3csInBvcHN0YXRlIixuZXcgTC5MKCkpfSwKa3o6ZnVuY3Rpb24oYSl7dmFyIHQscz11Lmgu
+YShhLnBhcmVudE5vZGUpLnF1ZXJ5U2VsZWN0b3IoIjpzY29wZSA+IHVsIikscj1zLnN0eWxlLHE9IiIr
+Qy5DRC56UShzLm9mZnNldEhlaWdodCkqMisicHgiCnIubWF4SGVpZ2h0PXEKcj1KLnFGKGEpCnE9ci4k
+dGkKdD1xLkMoIn4oMSkiKS5iKG5ldyBMLld4KHMsYSkpCnUuTS5iKG51bGwpClcuSkUoci5hLHIuYix0
+LCExLHEuZCl9LAp5WDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG89InF1ZXJ5U2VsZWN0b3JBbGwi
+LG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKSxtPXUuaApuLnRvU3RyaW5nCkguRGgobSxtLCJUIixv
+KQp0PXUuUwpzPW5ldyBXLnd6KG4ucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIiksdCkKcy5LKHMs
+bmV3IEwuQU8oKSkKSC5EaChtLG0sIlQiLG8pCnI9bmV3IFcud3oobi5xdWVyeVNlbGVjdG9yQWxsKCIu
+cmVnaW9uIiksdCkKaWYoci5nQShyKSE9PTApe3E9bi5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBh
+dGhdIikKcS50b1N0cmluZwpyLksocixuZXcgTC5IbyhxLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
+LlN5KG5ldyBXLmk3KHEpKS5PKCJwYXRoIikpKSl9SC5EaChtLG0sIlQiLG8pCnA9bmV3IFcud3oobi5x
+dWVyeVNlbGVjdG9yQWxsKCIucG9zdC1saW5rIiksdCkKcC5LKHAsbmV3IEwuSUMoKSl9LAp0eTpmdW5j
+dGlvbihhKXt2YXIgdD11Lk4KcmV0dXJuIFcucUQoYSwiUE9TVCIsUC5FRihbIkNvbnRlbnQtVHlwZSIs
+ImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiXSx0LHQpKS5XNyhuZXcgTC5MMSgpLHUucil9
+LAphSzpmdW5jdGlvbihhKXt2YXIgdD1QLmhLKGEpLmdoWSgpLnEoMCwibGluZSIpCnJldHVybiB0PT1u
+dWxsP251bGw6SC5IcCh0LG51bGwpfSwKRzY6ZnVuY3Rpb24oYSl7dmFyIHQ9UC5oSyhhKS5naFkoKS5x
+KDAsIm9mZnNldCIpCnJldHVybiB0PT1udWxsP251bGw6SC5IcCh0LG51bGwpfSwKdDI6ZnVuY3Rpb24o
+YSxiKXt2YXIgdCxzLHIscSxwLG8sbj17fQp1LlYuYihhKQp0PW4uYT11LmguYihXLnFjKGEuY3VycmVu
+dFRhcmdldCkpLmdldEF0dHJpYnV0ZSgiaHJlZiIpCmlmKEouemwodCwiPyIpKXtzPUMueEIuTmoodCww
+LEMueEIuT1kodCwiPyIpKQpuLmE9cwpyPXN9ZWxzZSByPXQKaWYoYiE9bnVsbCl7cT0kLm5VKCkKcj1u
+LmE9cS5vNShELm5yKHEudE0oYikscikpfXA9TC5HNih0KQpvPUwuYUsodCkKaWYocCE9bnVsbClMLmFm
+KHIscCxvLG5ldyBMLm5UKG4scCxvKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLG5ldyBMLkJaKG4pKQph
+LnByZXZlbnREZWZhdWx0KCl9LAp1bTpmdW5jdGlvbihhKXt2YXIgdAp1LlYuYihhKQp0PXUuaC5hKFcu
+cWMoYS5jdXJyZW50VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKTC50eSh0KS5PQShuZXcgTC5G
+USh0KSkKYS5wcmV2ZW50RGVmYXVsdCgpfSwKdlU6ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudCxzPXUu
+aApILkRoKHMscywiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQp0PW5ldyBXLnd6KHQucXVlcnlTZWxlY3Rv
+ckFsbCgiLmNvZGUiKSx1LlMpCnQuSyh0LG5ldyBMLkdIKCkpfSwKaFg6ZnVuY3Rpb24oYSxiKXt2YXIg
+dD11Lk4KVy5xRChILmQoYSkrIj9yZWdpb249cmVnaW9uJm9mZnNldD0iK0guZChiKSxudWxsLFAuRUYo
+WyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04Il0sdCx0KSkuVzco
+bmV3IEwuRFQoKSx1LlApLk9BKG5ldyBMLmVIKGEpKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
+LHMKaWYoIUouclkoYSkuVGMoYSwiLmRhcnQiKSl7TC5CRShhLFAuRUYoWyJyZWdpb25zIiwiIiwibmF2
+aWdhdGlvbkNvbnRlbnQiLCIiLCJlZGl0cyIsW11dLHUuTix1LnopKQpMLkJYKGEsbnVsbCkKaWYoZCE9
+bnVsbClkLiQwKCkKcmV0dXJufXQ9Qy54Qi50ZyhhLCI/Iik/YSsiJmlubGluZT10cnVlIjphKyI/aW5s
+aW5lPXRydWUiCnM9dS5OClcucUQodCxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlv
+bi9qc29uOyBjaGFyc2V0PVVURi04Il0scyxzKSkuVzcobmV3IEwuekQoYSxiLGMsZCksdS5QKS5PQShu
+ZXcgTC5PRShhKSl9LApHZTpmdW5jdGlvbigpe3ZhciB0PSIvX3ByZXZpZXcvbmF2aWdhdGlvblRyZWUu
+anNvbiIscz11Lk4KVy5xRCh0LG51bGwsUC5FRihbIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL2pz
+b247IGNoYXJzZXQ9VVRGLTgiXSxzLHMpKS5XNyhuZXcgTC5UVygpLHUuUCkuT0EobmV3IEwueHIodCkp
+fSwKcUo6ZnVuY3Rpb24oYSxiKXt2YXIgdAp3aW5kb3cKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
+ZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKGEpCndpbmRvdwp0PUguZChiKQppZih0eXBlb2YgY29uc29s
+ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IodCl9LApxTzpmdW5jdGlvbihhKXt2YXIg
+dD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9dC5ib3R0b20scj13aW5kb3cuaW5uZXJIZWlnaHQK
+aWYodHlwZW9mIHIhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShyKQppZihzPnIpSi5kaChhKQplbHNlIGlm
+KHQudG9wPDApSi5kaChhKX0sCmZHOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmlmKGEhPW51bGwpe3Q9
+ZG9jdW1lbnQKcz10LmdldEVsZW1lbnRCeUlkKCJvIitILmQoYSkpCnI9dC5xdWVyeVNlbGVjdG9yKCIu
+bGluZS0iK0guZChiKSkKaWYocyE9bnVsbCl7TC5xTyhzKQpKLmRSKHMpLmkoMCwidGFyZ2V0Iil9ZWxz
+ZSBpZihyIT1udWxsKUwucU8oci5wYXJlbnRFbGVtZW50KQppZihyIT1udWxsKUouZFIodS5oLmEoci5w
+YXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNlIEwucU8oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
+SWQoInVuaXQtbmFtZSIpKX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj1MLkc2KHdpbmRv
+dy5sb2NhdGlvbi5ocmVmKSxxPUwuYUsod2luZG93LmxvY2F0aW9uLmhyZWYpCmlmKHIhPW51bGwpe3Q9
+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm8iK0guZChyKSkKaWYodCE9bnVsbClKLmRSKHQpLlIoMCwi
+dGFyZ2V0Iil9aWYocSE9bnVsbCl7cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guZChx
+KSkKaWYocyE9bnVsbClKLmRSKHMucGFyZW50RWxlbWVudCkuUigwLCJoaWdobGlnaHQiKX1pZihhPT13
+aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpe0wuZkcoYixjKQpkLiQwKCl9ZWxzZSBMLkc3KGEsYixjLGQp
+fSwKTHg6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPT09MSl0PWIKZWxzZSB0PWIrInMiCnJldHVybiB0
+fSwKVDE6ZnVuY3Rpb24oYTgpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxi
+LGEsYTAsYTEsYTIsYTMsYTQsYTUsYTY9ZG9jdW1lbnQsYTc9YTYucXVlcnlTZWxlY3RvcigiLmVkaXQt
+cGFuZWwgLnBhbmVsLWNvbnRlbnQiKQpKLmw1KGE3LCIiKQppZihhOD09bnVsbCl7YTY9YTYuY3JlYXRl
+RWxlbWVudCgicCIpCmE2LnRleHRDb250ZW50PSJTZWUgZGV0YWlscyBhYm91dCBhIHByb3Bvc2VkIGVk
+aXQuIgpDLkx0LnNEKGE2LEguVk0oWyJwbGFjZWhvbGRlciJdLHUucykpCmE3LmFwcGVuZENoaWxkKGE2
+KQpyZXR1cm59dD1hOC5lCnM9JC5uVSgpCnI9cy50TSh0KQpxPWE4LmMKcD1zLkhQKHQsSi5UMChhNi5x
+dWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbz1hOC5kCnM9YTYuY3JlYXRlRWxlbWVu
+dCgicCIpCm49dS5oCm4uYihhNy5hcHBlbmRDaGlsZChzKSkuYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4
+dE5vZGUoSC5kKHEpKyIgYXQgIitILmQocCkrIjoiK0guZChvKSsiLiIpKQpzPWE4LmEKaWYocy5sZW5n
+dGghPT0wKXttPWE2LmNyZWF0ZUVsZW1lbnQoInAiKQptLnRleHRDb250ZW50PSJFZGl0IHJhdGlvbmFs
+ZToiCmE3LmFwcGVuZENoaWxkKG0pCm09YTYuY3JlYXRlRWxlbWVudCgidWwiKQpsPW4uYihhNy5hcHBl
+bmRDaGlsZChtKSkKZm9yKG09cy5sZW5ndGgsaz0wO2s8cy5sZW5ndGg7cy5sZW5ndGg9PT1tfHwoMCxI
+LmxrKShzKSwrK2spe2o9c1trXQppPWE2LmNyZWF0ZUVsZW1lbnQoImxpIikKaD1sLmFwcGVuZENoaWxk
+KGkpCmguYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4dE5vZGUoai5hKSkKZz1qLmIKaWYoZyE9bnVsbCl7
+aC5hcHBlbmRDaGlsZChhNi5jcmVhdGVUZXh0Tm9kZSgiICgiKSkKaC5hcHBlbmRDaGlsZChMLmM0KGcs
+cikpCmguYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4dE5vZGUoIikiKSl9fX1zPWE4LmIKaWYocyE9bnVs
+bClmb3IobT1zLmxlbmd0aCxpPXUucyxmPXUuWCxrPTA7azxzLmxlbmd0aDtzLmxlbmd0aD09PW18fCgw
+LEgubGspKHMpLCsrayl7ZT1zW2tdCmQ9YTYuY3JlYXRlRWxlbWVudCgicCIpCmM9bi5iKGE3LmFwcGVu
+ZENoaWxkKGQpKQpkPWE2LmNyZWF0ZUVsZW1lbnQoImEiKQpiPW4uYihjLmFwcGVuZENoaWxkKGQpKQpi
+LmFwcGVuZENoaWxkKGE2LmNyZWF0ZVRleHROb2RlKGUuYSkpCmIuc2V0QXR0cmlidXRlKCJocmVmIixl
+LmIpCmQ9Zi5iKEguVk0oWyJwb3N0LWxpbmsiLCJiZWZvcmUtYXBwbHkiXSxpKSkKYT1KLmRSKGIpCmEu
+VjEoMCkKYS5GVigwLGQpfWZvcihzPWE4LmYsbj1zLmxlbmd0aCxrPTA7azxzLmxlbmd0aDtzLmxlbmd0
+aD09PW58fCgwLEgubGspKHMpLCsrayl7YTA9c1trXQptPWE2LmNyZWF0ZUVsZW1lbnQoInAiKQphMT1h
+Ny5hcHBlbmRDaGlsZChtKQphMS5hcHBlbmRDaGlsZChhNi5jcmVhdGVUZXh0Tm9kZShhMC5hKSkKbT1h
+Ni5jcmVhdGVFbGVtZW50KCJ1bCIpCmEyPWExLmFwcGVuZENoaWxkKG0pCmZvcihtPWEwLmIsaT1tLmxl
+bmd0aCxhMz0wO2EzPG0ubGVuZ3RoO20ubGVuZ3RoPT09aXx8KDAsSC5saykobSksKythMyl7YTQ9bVth
+M10KZj1hNi5jcmVhdGVFbGVtZW50KCJsaSIpCmE1PWEyLmFwcGVuZENoaWxkKGYpCmY9YTQuYgppZihm
+PT1udWxsKWY9InVua25vd24iCmE1LmFwcGVuZENoaWxkKGE2LmNyZWF0ZVRleHROb2RlKGYpKQpnPWE0
+LmMKaWYoZyE9bnVsbCl7YTUuYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4dE5vZGUoIiAoIikpCmE1LmFw
+cGVuZENoaWxkKEwuYzQoZyxyKSkKYTUuYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4dE5vZGUoIikiKSl9
+YTUuYXBwZW5kQ2hpbGQoYTYuY3JlYXRlVGV4dE5vZGUoIjogIikpCmE1LmFwcGVuZENoaWxkKGE2LmNy
+ZWF0ZVRleHROb2RlKGE0LmEpKX19fSwKTEg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixt
+LGwsayxqLGksaCxnLGYsZSxkPWRvY3VtZW50LGM9ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5w
+YW5lbC1jb250ZW50IikKSi5sNShjLCIiKQp0PWQuY3JlYXRlRWxlbWVudCgicCIpCnM9dS5oCnI9cy5i
+KGMuYXBwZW5kQ2hpbGQodCkpCnQ9Si5VNihiKQpxPXQuZ0EoYikKaWYocT09PTApci5hcHBlbmRDaGls
+ZChkLmNyZWF0ZVRleHROb2RlKCJObyBwcm9wb3NlZCBlZGl0cyIpKQplbHNlIHIuYXBwZW5kQ2hpbGQo
+ZC5jcmVhdGVUZXh0Tm9kZSgiIitxKyIgcHJvcG9zZWQgIitMLkx4KHEsImVkaXQiKSsiOiIpKQpwPWQu
+Y3JlYXRlRWxlbWVudCgidWwiKQpvPXMuYihjLmFwcGVuZENoaWxkKHApKQpmb3IodD10LmdreihiKSxw
+PXUuayxuPXUuUSxtPW4uQygifigxKSIpLGw9dS5NLG49bi5kLGs9dS5hO3QuRigpOyl7aj1rLmIodC5n
+bCgpKQppPWQuY3JlYXRlRWxlbWVudCgibGkiKQpoPXMuYihvLmFwcGVuZENoaWxkKGkpKQpKLmRSKGgp
+LmkoMCwiZWRpdCIpCmk9ZC5jcmVhdGVFbGVtZW50KCJhIikKZz1wLmIoaC5hcHBlbmRDaGlsZChpKSkK
+Zy5jbGFzc0xpc3QuYWRkKCJlZGl0LWxpbmsiKQpmPUguU2Moai5xKDAsIm9mZnNldCIpKQppPUguZChm
+KQpnLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGcpKS5PKCJvZmZzZXQiKSxp
+KQplPUguU2Moai5xKDAsImxpbmUiKSkKaT1ILmQoZSkKZy5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcg
+Vy5TeShuZXcgVy5pNyhnKSkuTygibGluZSIpLGkpCmcuYXBwZW5kQ2hpbGQoZC5jcmVhdGVUZXh0Tm9k
+ZSgibGluZSAiK0guZChlKSkpCmk9bS5iKG5ldyBMLkVFKGYsZSxhKSkKbC5iKG51bGwpClcuSkUoZywi
+Y2xpY2siLGksITEsbikKaC5hcHBlbmRDaGlsZChkLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5kKGoucSgw
+LCJleHBsYW5hdGlvbiIpKSkpfUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxy
+LHE9d2luZG93LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCkuZ0RyKHEpK0guZChhKSkKcT11LnoKdD1Q
+LkZsKHUuTixxKQppZihiIT1udWxsKXQuWSgwLCJvZmZzZXQiLEguZChiKSkKaWYoYyE9bnVsbCl0Llko
+MCwibGluZSIsSC5kKGMpKQpwPXAubm0oMCx0LmE9PT0wP251bGw6dCkKcz13aW5kb3cuaGlzdG9yeQpy
+PXAudygwKQpzLnRvU3RyaW5nCnMucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHEscSkp
+LCIiLHIpfSwKRW46ZnVuY3Rpb24oYSl7dmFyIHQ9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIu
+cm9vdCIpLnRleHRDb250ZW50LCIvIikKaWYoQy54Qi5uKGEsdCkpcmV0dXJuIEMueEIuRyhhLHQubGVu
+Z3RoKQplbHNlIHJldHVybiBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9e30Kci5hPWEKYT1M
+LkVuKGEpCnIuYT1hCnQ9ZG9jdW1lbnQKdC5xdWVyeVNlbGVjdG9yKCIjdW5pdC1uYW1lIikudGV4dENv
+bnRlbnQ9YQpzPXUuaApILkRoKHMscywiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQp0PW5ldyBXLnd6KHQu
+cXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx1LlMpCnQuSyh0LG5ldyBMLlZT
+KHIpKX0sCkJFOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Ii5yZWdpb25zIixzPWRvY3VtZW50LHI9cy5xdWVy
+eVNlbGVjdG9yKHQpLHE9cy5xdWVyeVNlbGVjdG9yKCIuY29kZSIpCkoudEgocixILnkoYi5xKDAsInJl
+Z2lvbnMiKSksJC5LRygpKQpKLnRIKHEsSC55KGIucSgwLCJuYXZpZ2F0aW9uQ29udGVudCIpKSwkLktH
+KCkpCkwuTEgoYSx1LmouYihiLnEoMCwiZWRpdHMiKSkpCkwudlUoKQpMLnlYKCIuY29kZSIpCkwueVgo
+dCl9LAp0WDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGo9Im5hbWUiLGk9ZG9j
+dW1lbnQsaD1pLmNyZWF0ZUVsZW1lbnQoInVsIiksZz11LmgsZj1nLmIoYS5hcHBlbmRDaGlsZChoKSkK
+Zm9yKGg9Si5JVCh1LlIuYihiKSksdD11Lk07aC5GKCk7KXtzPWguZ2woKQpyPWkuY3JlYXRlRWxlbWVu
+dCgibGkiKQpxPWcuYihmLmFwcGVuZENoaWxkKHIpKQpyPUouVTYocykKcD1KLlJFKHEpCmlmKEouUk0o
+ci5xKHMsInR5cGUiKSwiZGlyZWN0b3J5Iikpe3AuZ0QocSkuaSgwLCJkaXIiKQpwPWkuY3JlYXRlRWxl
+bWVudCgic3BhbiIpCm89Zy5iKHEuYXBwZW5kQ2hpbGQocCkpCnA9Si5SRShvKQpwLmdEKG8pLmkoMCwi
+YXJyb3ciKQpwLnNoZihvLCImI3gyNUJDOyIpCnA9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKSi5sNShn
+LmIocS5hcHBlbmRDaGlsZChwKSksIiYjeDFGNEMxOyIpCnEuYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0
+Tm9kZShILnkoci5xKHMsaikpKSkKTC50WChxLHIucShzLCJzdWJ0cmVlIikpCkwua3oobyl9ZWxzZXtw
+LnNoZihxLCImI3gxRjRDNDsiKQpwPWkuY3JlYXRlRWxlbWVudCgiYSIpCm49Zy5iKHEuYXBwZW5kQ2hp
+bGQocCkpCnA9Si5SRShuKQpwLmdEKG4pLmkoMCwibmF2LWxpbmsiKQptPUgueShyLnEocywicGF0aCIp
+KQpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PKGopLG0pCm4uc2V0
+QXR0cmlidXRlKCJocmVmIixILnkoci5xKHMsImhyZWYiKSkpCm4uYXBwZW5kQ2hpbGQoaS5jcmVhdGVU
+ZXh0Tm9kZShILnkoci5xKHMsaikpKSkKcD1wLmdWbChuKQptPXAuJHRpCm0uQygifigxKSIpLmIoTC5Y
+TigpKQp0LmIobnVsbCkKVy5KRShwLmEscC5iLEwuWE4oKSwhMSxtLmQpCmw9SC5TYyhyLnEocywiZWRp
+dENvdW50IikpCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwub3MoKQppZihsPjApe3I9aS5j
+cmVhdGVFbGVtZW50KCJzcGFuIikKaz1nLmIocS5hcHBlbmRDaGlsZChyKSkKSi5kUihrKS5pKDAsImVk
+aXQtY291bnQiKQpyPSIiK2wrIiAiCmlmKGw9PT0xKXA9ImVkaXQiCmVsc2UgcD0iZWRpdHMiCmsuc2V0
+QXR0cmlidXRlKCJ0aXRsZSIscitwKQprLmFwcGVuZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUoQy5qbi53
+KGwpKSl9fX19LApjNDpmdW5jdGlvbihhLGIpe3ZhciB0PWRvY3VtZW50LHM9dC5jcmVhdGVFbGVtZW50
+KCJhIikKdS5rLmIocykKcy5hcHBlbmRDaGlsZCh0LmNyZWF0ZVRleHROb2RlKEguZChhLmMpKyI6IitI
+LmQoYS5iKSkpCnQ9RC5ucihiLGEuYSkKcy5zZXRBdHRyaWJ1dGUoImhyZWYiLCQublUoKS5vNSh0KSkK
+cy5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIpCnJldHVybiBzfSwKZTpmdW5jdGlvbiBlKCl7fSwKVlc6
+ZnVuY3Rpb24gVlcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKb1o6ZnVuY3Rpb24g
+b1ooKXt9LApqcjpmdW5jdGlvbiBqcigpe30sCnFsOmZ1bmN0aW9uIHFsKCl7fSwKTDpmdW5jdGlvbiBM
+KCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFPOmZ1bmN0aW9uIEFP
+KCl7fSwKZE46ZnVuY3Rpb24gZE4oKXt9LApIbzpmdW5jdGlvbiBIbyhhKXt0aGlzLmE9YX0sCnh6OmZ1
+bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJQzpmdW5jdGlvbiBJQygpe30sCkwxOmZ1
+bmN0aW9uIEwxKCl7fSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMu
+Yz1jfSwKQlo6ZnVuY3Rpb24gQlooYSl7dGhpcy5hPWF9LApGUTpmdW5jdGlvbiBGUShhKXt0aGlzLmE9
+YX0sCkdIOmZ1bmN0aW9uIEdIKCl7fSwKRFQ6ZnVuY3Rpb24gRFQoKXt9LAplSDpmdW5jdGlvbiBlSChh
+KXt0aGlzLmE9YX0sCnpEOmZ1bmN0aW9uIHpEKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
+Xy5jPWMKXy5kPWR9LApPRTpmdW5jdGlvbiBPRShhKXt0aGlzLmE9YX0sClRXOmZ1bmN0aW9uIFRXKCl7
+fSwKeHI6ZnVuY3Rpb24geHIoYSl7dGhpcy5hPWF9LApFRTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5h
+PWEKdGhpcy5iPWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
+fSwKVlM6ZnVuY3Rpb24gVlMoYSl7dGhpcy5hPWF9LApYQTpmdW5jdGlvbiBYQSgpe30sCklWOmZ1bmN0
+aW9uIElWKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxNPXsKWUY6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbgpmb3IodD1iLmxlbmd0aCxzPTE7czx0Oysrcyl7
+aWYoYltzXT09bnVsbHx8YltzLTFdIT1udWxsKWNvbnRpbnVlCmZvcig7dD49MTt0PXIpe3I9dC0xCmlm
+KGJbcl0hPW51bGwpYnJlYWt9cT1uZXcgUC5SbigiIikKcD1hKyIoIgpxLmE9cApvPUgucUMoYiwwLHQs
+SC50NihiKS5kKQpuPW8uJHRpCm49cCtuZXcgSC5BOChvLG4uQygicVUoYUwuRSkiKS5iKG5ldyBNLk5v
+KCkpLG4uQygiQTg8YUwuRSxxVT4iKSkuSCgwLCIsICIpCnEuYT1uCnEuYT1uKygiKTogcGFydCAiKyhz
+LTEpKyIgd2FzIG51bGwsIGJ1dCBwYXJ0ICIrcysiIHdhcyBub3QuIikKdGhyb3cgSC5iKFAueFkocS53
+KDApKSl9fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApNaTpmdW5jdGlvbiBNaSgpe30sCnE3
+OmZ1bmN0aW9uIHE3KCl7fSwKTm86ZnVuY3Rpb24gTm8oKXt9fSxCPXtMdTpmdW5jdGlvbiBMdSgpe30s
+Ck9TOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKCEoYT49NjUmJmE8PTkwKSl0PWE+PTk3JiZhPD0xMjIKZWxz
+ZSB0PSEwCnJldHVybiB0fSwKWXU6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hLmxlbmd0aCxzPWIrMgppZih0
+PHMpcmV0dXJuITEKaWYoIUIuT1MoQy54Qi5tKGEsYikpKXJldHVybiExCmlmKEMueEIubShhLGIrMSkh
+PT01OClyZXR1cm4hMQppZih0PT09cylyZXR1cm4hMApyZXR1cm4gQy54Qi5tKGEscyk9PT00N319LFg9
+ewpDTDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz1iLnhaKGEpCmIuaEsoYSkKaWYobyE9bnVs
+bClhPUouS1YoYSxvLmxlbmd0aCkKdD11LnMKcz1ILlZNKFtdLHQpCnI9SC5WTShbXSx0KQp0PWEubGVu
+Z3RoCmlmKHQhPT0wJiZiLnI0KEMueEIuVyhhLDApKSl7aWYoMD49dClyZXR1cm4gSC5PSChhLDApCkMu
+Tm0uaShyLGFbMF0pCnE9MX1lbHNle0MuTm0uaShyLCIiKQpxPTB9Zm9yKHA9cTtwPHQ7KytwKWlmKGIu
+cjQoQy54Qi5XKGEscCkpKXtDLk5tLmkocyxDLnhCLk5qKGEscSxwKSkKQy5ObS5pKHIsYVtwXSkKcT1w
+KzF9aWYocTx0KXtDLk5tLmkocyxDLnhCLkcoYSxxKSkKQy5ObS5pKHIsIiIpfXJldHVybiBuZXcgWC5X
+RChiLG8scyxyKX0sCldEOmZ1bmN0aW9uIFdEKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
+Xy5kPWMKXy5lPWR9LApxUjpmdW5jdGlvbiBxUihhKXt0aGlzLmE9YX0sCkpUOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBuZXcgWC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0sTz17ClJoOmZ1bmN0
+aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPW51bGwKaWYoUC51bygpLmdGaSgpIT09ImZp
+bGUiKXJldHVybiAkLkViKCkKdD1QLnVvKCkKaWYoIUMueEIuVGModC5nSWkodCksIi8iKSlyZXR1cm4g
+JC5FYigpCnM9UC5QaShpLDAsMCkKcj1QLnpSKGksMCwwKQpxPVAuT2UoaSwwLDAsITEpCnA9UC5sZShp
+LDAsMCxpKQpvPVAudEcoaSwwLDApCm49UC53QihpLHMpCm09cz09PSJmaWxlIgppZihxPT1udWxsKXQ9
+ci5sZW5ndGghPT0wfHxuIT1udWxsfHxtCmVsc2UgdD0hMQppZih0KXE9IiIKdD1xPT1udWxsCmw9IXQK
+az1QLmthKCJhL2IiLDAsMyxpLHMsbCkKaj1zLmxlbmd0aD09PTAKaWYoaiYmdCYmIUMueEIubihrLCIv
+Iikpaz1QLndGKGssIWp8fGwpCmVsc2Ugaz1QLnhlKGspCmlmKG5ldyBQLkRuKHMscix0JiZDLnhCLm4o
+aywiLy8iKT8iIjpxLG4sayxwLG8pLnQ0KCk9PT0iYVxcYiIpcmV0dXJuICQuS2soKQpyZXR1cm4gJC5i
+RCgpfSwKekw6ZnVuY3Rpb24gekwoKXt9fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIsYyl7dGhpcy5kPWEK
+dGhpcy5lPWIKdGhpcy5mPWN9fSxGPXtydTpmdW5jdGlvbiBydShhLGIsYyxkKXt2YXIgXz10aGlzCl8u
+ZD1hCl8uZT1iCl8uZj1jCl8ucj1kfX0sRD17ClJYOmZ1bmN0aW9uKCl7dmFyIHQscyxyPVAudW8oKQpp
+ZihKLlJNKHIsJC5JNikpcmV0dXJuICQuRmYKJC5JNj1yCmlmKCQuSGsoKT09JC5FYigpKXJldHVybiAk
+LkZmPXIuWkkoIi4iKS53KDApCmVsc2V7dD1yLnQ0KCkKcz10Lmxlbmd0aC0xCnJldHVybiAkLkZmPXM9
+PT0wP3Q6Qy54Qi5Oaih0LDAscyl9fSwKbnI6ZnVuY3Rpb24oYSxiKXt2YXIgdD1udWxsCnJldHVybiAk
+Lm5VKCkucTcoMCxhLGIsdCx0LHQsdCx0LHQpfX0KdmFyIHc9W0MsSCxKLFAsVyxVLFQsTCxNLEIsWCxP
+LEUsRixEXQpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9e30K
+SC5lby5wcm90b3R5cGU9e30KSi52Qi5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVybiBh
+PT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJu
+Ikluc3RhbmNlIG9mICciK0guZChILk0oYSkpKyInIn0sCmU3OmZ1bmN0aW9uKGEsYil7dS5vLmIoYikK
+dGhyb3cgSC5iKFAubHIoYSxiLmdXYSgpLGIuZ25kKCksYi5nVm0oKSkpfX0KSi55RS5wcm90b3R5cGU9
+ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIGE/
+NTE5MDE4OjIxODE1OX0sCiRpYTI6MX0KSi5ZRS5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3Jl
+dHVybiBudWxsPT1ifSwKdzpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9LApnaU86ZnVuY3Rpb24oYSl7
+cmV0dXJuIDB9LAplNzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlNqKGEsdS5vLmIoYikpfSwKJGlj
+ODoxfQpKLk1GLnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCnc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpdm06MX0KSi5pQy5wcm90b3R5cGU9e30KSi5rZC5wcm90b3R5
+cGU9e30KSi5jNS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PWFbJC53KCldCmlmKHQ9PW51
+bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4iSmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILmQoSi5q
+KHQpKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJue2Z1bmM6MSxvcHQ6WywsLCwsLCwsLCwsLCwsLCxdfX0s
+CiRpRUg6MX0KSi5qZC5wcm90b3R5cGU9ewppOmZ1bmN0aW9uKGEsYil7SC50NihhKS5kLmIoYikKaWYo
+ISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoImFkZCIpKQphLnB1c2goYil9LApXNDpmdW5jdGlvbihh
+LGIpe3ZhciB0CmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJyZW1vdmVBdCIpKQp0PWEubGVu
+Z3RoCmlmKGI+PXQpdGhyb3cgSC5iKFAueChiLG51bGwpKQpyZXR1cm4gYS5zcGxpY2UoYiwxKVswXX0s
+ClVHOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIKSC50NihhKS5DKCJjWDwxPiIpLmIoYykKaWYoISFh
+LmZpeGVkJGxlbmd0aClILnZoKFAuTDQoImluc2VydEFsbCIpKQp0PWEubGVuZ3RoClAud0EoYiwwLHQs
+ImluZGV4IikKcz1jLmxlbmd0aAp0aGlzLnNBKGEsdCtzKQpyPWIrcwp0aGlzLllXKGEscixhLmxlbmd0
+aCxhLGIpCnRoaXMudmcoYSxiLHIsYyl9LAptdjpmdW5jdGlvbihhKXtpZighIWEuZml4ZWQkbGVuZ3Ro
+KUgudmgoUC5MNCgicmVtb3ZlTGFzdCIpKQppZihhLmxlbmd0aD09PTApdGhyb3cgSC5iKEguSFkoYSwt
+MSkpCnJldHVybiBhLnBvcCgpfSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdApILnQ2KGEpLkMoImNYPDE+
+IikuYihiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkQWxsIikpCmZvcih0PUouSVQo
+Yik7dC5GKCk7KWEucHVzaCh0LmdsKCkpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC50NihhKS5D
+KCJ+KDEpIikuYihiKQp0PWEubGVuZ3RoCmZvcihzPTA7czx0Oysrcyl7Yi4kMShhW3NdKQppZihhLmxl
+bmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILnQ2
+KGEpCnJldHVybiBuZXcgSC5BOChhLHQuS3EoYykuQygiMSgyKSIpLmIoYiksdC5DKCJAPDE+IikuS3Eo
+YykuQygiQTg8MSwyPiIpKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPW5ldyBBcnJheShhLmxlbmd0
+aCkKcy5maXhlZCRsZW5ndGg9QXJyYXkKZm9yKHQ9MDt0PGEubGVuZ3RoOysrdCl0aGlzLlkocyx0LEgu
+ZChhW3RdKSkKcmV0dXJuIHMuam9pbihiKX0sCk4wOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscgpk
+LmIoYikKSC50NihhKS5LcShkKS5DKCIxKDEsMikiKS5iKGMpCnQ9YS5sZW5ndGgKZm9yKHM9YixyPTA7
+cjx0Oysrcil7cz1jLiQyKHMsYVtyXSkKaWYoYS5sZW5ndGghPT10KXRocm93IEguYihQLmE0KGEpKX1y
+ZXR1cm4gc30sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEs
+YikKcmV0dXJuIGFbYl19LAphTTpmdW5jdGlvbihhLGIsYyl7aWYoYjwwfHxiPmEubGVuZ3RoKXRocm93
+IEguYihQLlRFKGIsMCxhLmxlbmd0aCwic3RhcnQiLG51bGwpKQppZihjPGJ8fGM+YS5sZW5ndGgpdGhy
+b3cgSC5iKFAuVEUoYyxiLGEubGVuZ3RoLCJlbmQiLG51bGwpKQppZihiPT09YylyZXR1cm4gSC5WTShb
+XSxILnQ2KGEpKQpyZXR1cm4gSC5WTShhLnNsaWNlKGIsYyksSC50NihhKSl9LApnclo6ZnVuY3Rpb24o
+YSl7dmFyIHQ9YS5sZW5ndGgKaWYodD4wKXJldHVybiBhW3QtMV0KdGhyb3cgSC5iKEguV3AoKSl9LApZ
+VzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscj1ILnQ2KGEpCnIuQygiY1g8MT4iKS5iKGQpCmlm
+KCEhYS5pbW11dGFibGUkbGlzdClILnZoKFAuTDQoInNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3Ro
+KQp0PWMtYgppZih0PT09MClyZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQpyLkMoInpNPDE+IikuYihk
+KQpyPUouVTYoZCkKaWYoZSt0PnIuZ0EoZCkpdGhyb3cgSC5iKEguYXIoKSkKaWYoZTxiKWZvcihzPXQt
+MTtzPj0wOy0tcylhW2Irc109ci5xKGQsZStzKQplbHNlIGZvcihzPTA7czx0OysrcylhW2Irc109ci5x
+KGQsZStzKX0sCnZnOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQsMCl9LApW
+cjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC50NihhKS5DKCJhMigxKSIpLmIoYikKdD1hLmxlbmd0aApm
+b3Iocz0wO3M8dDsrK3Mpe2lmKEgub1QoYi4kMShhW3NdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT10
+KXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4hMX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQKZm9yKHQ9
+MDt0PGEubGVuZ3RoOysrdClpZihKLlJNKGFbdF0sYikpcmV0dXJuITAKcmV0dXJuITF9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9LApna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBK
+Lm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7
+aWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInNldCBsZW5ndGgiKSkKaWYoYjwwKXRocm93IEgu
+YihQLlRFKGIsMCxudWxsLCJuZXdMZW5ndGgiLG51bGwpKQphLmxlbmd0aD1ifSwKcTpmdW5jdGlvbihh
+LGIpe0guU2MoYikKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4g
+YVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0gudDYoYSkuZC5iKGMpCmlmKCEhYS5pbW11dGFibGUkbGlz
+dClILnZoKFAuTDQoImluZGV4ZWQgc2V0IikpCmlmKGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgu
+SFkoYSxiKSkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkouUG8ucHJvdG90eXBlPXt9CkoubTEucHJv
+dG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0LHM9
+dGhpcyxyPXMuYSxxPXIubGVuZ3RoCmlmKHMuYiE9PXEpdGhyb3cgSC5iKEgubGsocikpCnQ9cy5jCmlm
+KHQ+PXEpe3Muc00obnVsbCkKcmV0dXJuITF9cy5zTShyW3RdKTsrK3MuYwpyZXR1cm4hMH0sCnNNOmZ1
+bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5kLmIoYSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsK
+eXU6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoYT49LTIxNDc0ODM2NDgmJmE8PTIxNDc0ODM2NDcpcmV0dXJu
+IGF8MAppZihpc0Zpbml0ZShhKSl7dD1hPDA/TWF0aC5jZWlsKGEpOk1hdGguZmxvb3IoYSkKcmV0dXJu
+IHQrMH10aHJvdyBILmIoUC5MNCgiIithKyIudG9JbnQoKSIpKX0sCnpROmZ1bmN0aW9uKGEpe2lmKGE+
+MCl7aWYoYSE9PTEvMClyZXR1cm4gTWF0aC5yb3VuZChhKX1lbHNlIGlmKGE+LTEvMClyZXR1cm4gMC1N
+YXRoLnJvdW5kKDAtYSkKdGhyb3cgSC5iKFAuTDQoIiIrYSsiLnJvdW5kKCkiKSl9LApXWjpmdW5jdGlv
+bihhLGIpe3ZhciB0LHMscixxCmlmKGI8Mnx8Yj4zNil0aHJvdyBILmIoUC5URShiLDIsMzYsInJhZGl4
+IixudWxsKSkKdD1hLnRvU3RyaW5nKGIpCmlmKEMueEIubSh0LHQubGVuZ3RoLTEpIT09NDEpcmV0dXJu
+IHQKcz0vXihbXGRhLXpdKykoPzpcLihbXGRhLXpdKykpP1woZVwrKFxkKylcKSQvLmV4ZWModCkKaWYo
+cz09bnVsbClILnZoKFAuTDQoIlVuZXhwZWN0ZWQgdG9TdHJpbmcgcmVzdWx0OiAiK3QpKQpyPXMubGVu
+Z3RoCmlmKDE+PXIpcmV0dXJuIEguT0gocywxKQp0PXNbMV0KaWYoMz49cilyZXR1cm4gSC5PSChzLDMp
+CnE9K3NbM10Kcj1zWzJdCmlmKHIhPW51bGwpe3QrPXIKcS09ci5sZW5ndGh9cmV0dXJuIHQrQy54Qi5J
+eCgiMCIscSl9LAp3OmZ1bmN0aW9uKGEpe2lmKGE9PT0wJiYxL2E8MClyZXR1cm4iLTAuMCIKZWxzZSBy
+ZXR1cm4iIithfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9YXwwCmlmKGE9PT1wKXJldHVy
+biA1MzY4NzA5MTEmcAp0PU1hdGguYWJzKGEpCnM9TWF0aC5sb2codCkvMC42OTMxNDcxODA1NTk5NDUz
+fDAKcj1NYXRoLnBvdygyLHMpCnE9dDwxP3QvcjpyL3QKcmV0dXJuIDUzNjg3MDkxMSYoKHEqOTAwNzE5
+OTI1NDc0MDk5MnwwKSsocSozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcyoxMjU5fSwKelk6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdD1hJWIKaWYodD09PTApcmV0dXJuIDAKaWYodD4wKXJldHVybiB0CmlmKGI8
+MClyZXR1cm4gdC1iCmVsc2UgcmV0dXJuIHQrYn0sCndHOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT4w
+KXQ9dGhpcy5wMyhhLGIpCmVsc2V7dD1iPjMxPzMxOmIKdD1hPj50Pj4+MH1yZXR1cm4gdH0sCmJmOmZ1
+bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILnRMKGIpKQpyZXR1cm4gdGhpcy5wMyhhLGIpfSwK
+cDM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj4zMT8wOmE+Pj5ifSwKJGlDUDoxLAokaUZLOjF9CkoudXIu
+cHJvdG90eXBlPXskaUtOOjF9CkouVkEucHJvdG90eXBlPXt9CkouRHIucHJvdG90eXBlPXsKbTpmdW5j
+dGlvbihhLGIpe2lmKGI8MCl0aHJvdyBILmIoSC5IWShhLGIpKQppZihiPj1hLmxlbmd0aClILnZoKEgu
+SFkoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sClc6ZnVuY3Rpb24oYSxiKXtpZihiPj1hLmxl
+bmd0aCl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKZGQ6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gbmV3IEgudW4oYixhLDApfSwKaDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBi
+IT0ic3RyaW5nIil0aHJvdyBILmIoUC5MMyhiLG51bGwsbnVsbCkpCnJldHVybiBhK2J9LApUYzpmdW5j
+dGlvbihhLGIpe3ZhciB0PWIubGVuZ3RoLHM9YS5sZW5ndGgKaWYodD5zKXJldHVybiExCnJldHVybiBi
+PT09dGhpcy5HKGEscy10KX0sCmk3OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMKYz1QLmpCKGIsYyxh
+Lmxlbmd0aCkKdD1hLnN1YnN0cmluZygwLGIpCnM9YS5zdWJzdHJpbmcoYykKcmV0dXJuIHQrZCtzfSwK
+UWk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKCFILm9rKGMpKUgudmgoSC50TChjKSkKaWYodHlwZW9m
+IGMhPT0ibnVtYmVyIilyZXR1cm4gYy5KKCkKaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRF
+KGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWMrYi5sZW5ndGgKaWYodD5hLmxlbmd0aClyZXR1cm4h
+MQpyZXR1cm4gYj09PWEuc3Vic3RyaW5nKGMsdCl9LApuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMu
+UWkoYSxiLDApfSwKTmo6ZnVuY3Rpb24oYSxiLGMpe2lmKCFILm9rKGIpKUgudmgoSC50TChiKSkKaWYo
+Yz09bnVsbCljPWEubGVuZ3RoCmlmKHR5cGVvZiBiIT09Im51bWJlciIpcmV0dXJuIGIuSigpCmlmKGI8
+MCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCmlmKGI+Yyl0aHJvdyBILmIoUC54KGIsbnVsbCkpCmlmKGM+
+YS5sZW5ndGgpdGhyb3cgSC5iKFAueChjLG51bGwpKQpyZXR1cm4gYS5zdWJzdHJpbmcoYixjKX0sCkc6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5OaihhLGIsbnVsbCl9LApoYzpmdW5jdGlvbihhKXtyZXR1
+cm4gYS50b0xvd2VyQ2FzZSgpfSwKYlM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9YS50cmltKCkscD1x
+Lmxlbmd0aAppZihwPT09MClyZXR1cm4gcQppZih0aGlzLlcocSwwKT09PTEzMyl7dD1KLm1tKHEsMSkK
+aWYodD09PXApcmV0dXJuIiJ9ZWxzZSB0PTAKcz1wLTEKcj10aGlzLm0ocSxzKT09PTEzMz9KLmMxKHEs
+cyk6cAppZih0PT09MCYmcj09PXApcmV0dXJuIHEKcmV0dXJuIHEuc3Vic3RyaW5nKHQscil9LApJeDpm
+dW5jdGlvbihhLGIpe3ZhciB0LHMKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0w
+KXJldHVybiBhCmlmKGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHQ9YSxzPSIiOyEwOyl7aWYo
+KGImMSk9PT0xKXM9dCtzCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKdCs9dH1yZXR1cm4gc30sClhVOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgdAppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEu
+bGVuZ3RoLG51bGwsbnVsbCkpCnQ9YS5pbmRleE9mKGIsYykKcmV0dXJuIHR9LApPWTpmdW5jdGlvbihh
+LGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCmlmKGM9
+PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAs
+YS5sZW5ndGgsbnVsbCxudWxsKSkKdD1iLmxlbmd0aApzPWEubGVuZ3RoCmlmKGMrdD5zKWM9cy10CnJl
+dHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlBrKGEs
+YixudWxsKX0sCklzOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1hLmxlbmd0aAppZihjPnQpdGhyb3cgSC5i
+KFAuVEUoYywwLHQsbnVsbCxudWxsKSkKcmV0dXJuIEgubTIoYSxiLGMpfSwKdGc6ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gdGhpcy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKZ2lPOmZ1bmN0
+aW9uKGEpe3ZhciB0LHMscgpmb3IodD1hLmxlbmd0aCxzPTAscj0wO3I8dDsrK3Ipe3M9NTM2ODcwOTEx
+JnMrYS5jaGFyQ29kZUF0KHIpCnM9NTM2ODcwOTExJnMrKCg1MjQyODcmcyk8PDEwKQpzXj1zPj42fXM9
+NTM2ODcwOTExJnMrKCg2NzEwODg2MyZzKTw8MykKc149cz4+MTEKcmV0dXJuIDUzNjg3MDkxMSZzKygo
+MTYzODMmcyk8PDE1KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24o
+YSxiKXtILlNjKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4g
+YVtiXX0sCiRpdlg6MSwKJGlxVToxfQpILnFqLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLmEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBDLnhCLm0odGhpcy5hLEguU2Mo
+YikpfX0KSC5iUS5wcm90b3R5cGU9e30KSC5hTC5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFy
+IHQ9dGhpcwpyZXR1cm4gbmV3IEguYTcodCx0LmdBKHQpLEguTGgodCkuQygiYTc8YUwuRT4iKSl9LApI
+OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHE9dGhpcyxwPXEuZ0EocSkKaWYoYi5sZW5ndGghPT0wKXtp
+ZihwPT09MClyZXR1cm4iIgp0PUguZChxLkUoMCwwKSkKaWYocCE9PXEuZ0EocSkpdGhyb3cgSC5iKFAu
+YTQocSkpCmZvcihzPXQscj0xO3I8cDsrK3Ipe3M9cytiK0guZChxLkUoMCxyKSkKaWYocCE9PXEuZ0Eo
+cSkpdGhyb3cgSC5iKFAuYTQocSkpfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfWVsc2V7Zm9y
+KHI9MCxzPSIiO3I8cDsrK3Ipe3MrPUguZChxLkUoMCxyKSkKaWYocCE9PXEuZ0EocSkpdGhyb3cgSC5i
+KFAuYTQocSkpfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfX0sCmV2OmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIHRoaXMuR0coMCxILkxoKHRoaXMpLkMoImEyKGFMLkUpIikuYihiKSl9fQpILm5ILnByb3Rv
+dHlwZT17CmdVRDpmdW5jdGlvbigpe3ZhciB0PUouSG0odGhpcy5hKSxzPXRoaXMuYwppZihzPT1udWxs
+fHxzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQXM6ZnVuY3Rpb24oKXt2YXIgdD1KLkhtKHRoaXMuYSks
+cz10aGlzLmIKaWYocz50KXJldHVybiB0CnJldHVybiBzfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHQscz1K
+LkhtKHRoaXMuYSkscj10aGlzLmIKaWYocj49cylyZXR1cm4gMAp0PXRoaXMuYwppZih0PT1udWxsfHx0
+Pj1zKXJldHVybiBzLXIKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5ITigpCnJldHVybiB0
+LXJ9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLHI9cy5nQXMoKStiCmlmKGI+PTApe3Q9cy5n
+VUQoKQppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiBILnBZKHQpCnQ9cj49dH1lbHNlIHQ9ITAK
+aWYodCl0aHJvdyBILmIoUC5DZihiLHMsImluZGV4IixudWxsLG51bGwpKQpyZXR1cm4gSi5BTShzLmEs
+cil9fQpILmE3LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rp
+b24oKXt2YXIgdCxzPXRoaXMscj1zLmEscT1KLlU2KHIpLHA9cS5nQShyKQppZihzLmIhPT1wKXRocm93
+IEguYihQLmE0KHIpKQp0PXMuYwppZih0Pj1wKXtzLnNJKG51bGwpCnJldHVybiExfXMuc0kocS5FKHIs
+dCkpOysrcy5jCnJldHVybiEwfSwKc0k6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0s
+CiRpQW46MX0KSC5BOC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmEp
+fSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5BTSh0aGlzLmEsYikpfX0KSC5VNS5w
+cm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlNPKEouSVQodGhpcy5hKSx0aGlz
+LmIsdGhpcy4kdGkuQygiU088MT4iKSl9fQpILlNPLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIg
+dCxzCmZvcih0PXRoaXMuYSxzPXRoaXMuYjt0LkYoKTspaWYoSC5vVChzLiQxKHQuZ2woKSkpKXJldHVy
+biEwCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmdsKCl9fQpILlNVLnByb3Rv
+dHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUu
+RSIpLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3Qi
+KSl9fQpILlhDLnByb3RvdHlwZT17fQpILnd2LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIg
+dD10aGlzLl9oYXNoQ29kZQppZih0IT1udWxsKXJldHVybiB0CnQ9NTM2ODcwOTExJjY2NDU5NypKLmhm
+KHRoaXMuYSkKdGhpcy5faGFzaENvZGU9dApyZXR1cm4gdH0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5
+bWJvbCgiJytILmQodGhpcy5hKSsnIiknfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVy
+biExCnJldHVybiBiIGluc3RhbmNlb2YgSC53diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9CkguUEQucHJv
+dG90eXBlPXt9CkguV1UucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0s
+Clk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUguTGgodGhpcykKdC5kLmIoYikKdC5jaFsxXS5iKGMpCnJl
+dHVybiBILmRjKCl9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4hMQppZigi
+X19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShhKX0sCnE6
+ZnVuY3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4KcmV0dXJuIHRoaXMucVAoYil9LApxUDpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iW0gueShhKV19LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxy
+LHEscD1ILkxoKHRoaXMpCnAuQygifigxLDIpIikuYihiKQp0PXRoaXMuYwpmb3Iocz10Lmxlbmd0aCxw
+PXAuY2hbMV0scj0wO3I8czsrK3Ipe3E9dFtyXQpiLiQyKHEscC5iKHRoaXMucVAocSkpKX19fQpILkxJ
+LnByb3RvdHlwZT17CmdXYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdH0sCmduZDpmdW5j
+dGlvbigpe3ZhciB0LHMscixxLHA9dGhpcwppZihwLmM9PT0xKXJldHVybiBDLmRuCnQ9cC5kCnM9dC5s
+ZW5ndGgtcC5lLmxlbmd0aC1wLmYKaWYocz09PTApcmV0dXJuIEMuZG4Kcj1bXQpmb3IocT0wO3E8czsr
+K3Epe2lmKHE+PXQubGVuZ3RoKXJldHVybiBILk9IKHQscSkKci5wdXNoKHRbcV0pfXJldHVybiBKLnpD
+KHIpfSwKZ1ZtOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbSxsPXRoaXMKaWYobC5jIT09MCly
+ZXR1cm4gQy5DTQp0PWwuZQpzPXQubGVuZ3RoCnI9bC5kCnE9ci5sZW5ndGgtcy1sLmYKaWYocz09PTAp
+cmV0dXJuIEMuQ00KcD1uZXcgSC5ONSh1LmVvKQpmb3Iobz0wO288czsrK28pe2lmKG8+PXQubGVuZ3Ro
+KXJldHVybiBILk9IKHQsbykKbj10W29dCm09cStvCmlmKG08MHx8bT49ci5sZW5ndGgpcmV0dXJuIEgu
+T0gocixtKQpwLlkoMCxuZXcgSC53dihuKSxyW21dKX1yZXR1cm4gbmV3IEguUEQocCx1LmdGKX0sCiRp
+dlE6MX0KSC5Dai5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0CkgueShhKQp0PXRoaXMu
+YQp0LmI9dC5iKyIkIitILmQoYSkKQy5ObS5pKHRoaXMuYixhKQpDLk5tLmkodGhpcy5jLGIpOysrdC5h
+fSwKJFM6MTZ9CkguWnIucHJvdG90eXBlPXsKcVM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMscT1u
+ZXcgUmVnRXhwKHIuYSkuZXhlYyhhKQppZihxPT1udWxsKXJldHVybgp0PU9iamVjdC5jcmVhdGUobnVs
+bCkKcz1yLmIKaWYocyE9PS0xKXQuYXJndW1lbnRzPXFbcysxXQpzPXIuYwppZihzIT09LTEpdC5hcmd1
+bWVudHNFeHByPXFbcysxXQpzPXIuZAppZihzIT09LTEpdC5leHByPXFbcysxXQpzPXIuZQppZihzIT09
+LTEpdC5tZXRob2Q9cVtzKzFdCnM9ci5mCmlmKHMhPT0tMSl0LnJlY2VpdmVyPXFbcysxXQpyZXR1cm4g
+dH19CkguVzAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIKaWYodD09bnVsbCly
+ZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHRoaXMuYSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVy
+cm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0KyInIG9uIG51bGwifX0KSC5hei5wcm90b3R5cGU9ewp3
+OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBm
+b3VuZDogJyIscT1zLmIKaWYocT09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHMu
+YSkKdD1zLmMKaWYodD09bnVsbClyZXR1cm4gcitxKyInICgiK0guZChzLmEpKyIpIgpyZXR1cm4gcitx
+KyInIG9uICciK3QrIicgKCIrSC5kKHMuYSkrIikifX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3R9fQpI
+LkFtLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe2lmKHUuYlUuYyhhKSlpZihhLiR0aHJvd25Kc0Vy
+cm9yPT1udWxsKWEuJHRocm93bkpzRXJyb3I9dGhpcy5hCnJldHVybiBhfSwKJFM6NH0KSC5YTy5wcm90
+b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5iCmlmKHMhPW51bGwpcmV0dXJuIHMKcz10
+aGlzLmEKdD1zIT09bnVsbCYmdHlwZW9mIHM9PT0ib2JqZWN0Ij9zLnN0YWNrOm51bGwKcmV0dXJuIHRo
+aXMuYj10PT1udWxsPyIiOnR9LAokaUd6OjF9CkguVHAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2
+YXIgdD10aGlzLmNvbnN0cnVjdG9yLHM9dD09bnVsbD9udWxsOnQubmFtZQpyZXR1cm4iQ2xvc3VyZSAn
+IitILk5RKHM9PW51bGw/InVua25vd24iOnMpKyInIn0sCiRpRUg6MSwKZ1FsOmZ1bmN0aW9uKCl7cmV0
+dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpILmxjLnByb3RvdHlwZT17fQpILnp4LnBy
+b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy4kc3RhdGljX25hbWUKaWYodD09bnVsbCly
+ZXR1cm4iQ2xvc3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRob2QiCnJldHVybiJDbG9zdXJlICciK0gu
+TlEodCkrIicifX0KSC5yVC5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMKaWYo
+Yj09bnVsbClyZXR1cm4hMQppZih0PT09YilyZXR1cm4hMAppZighKGIgaW5zdGFuY2VvZiBILnJUKSly
+ZXR1cm4hMQpyZXR1cm4gdC5hPT09Yi5hJiZ0LmI9PT1iLmImJnQuYz09PWIuY30sCmdpTzpmdW5jdGlv
+bihhKXt2YXIgdCxzPXRoaXMuYwppZihzPT1udWxsKXQ9SC5lUSh0aGlzLmEpCmVsc2UgdD10eXBlb2Yg
+cyE9PSJvYmplY3QiP0ouaGYocyk6SC5lUShzKQpyZXR1cm4odF5ILmVRKHRoaXMuYikpPj4+MH0sCnc6
+ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwpdD10aGlzLmEKcmV0dXJuIkNsb3N1cmUg
+JyIrSC5kKHRoaXMuZCkrIicgb2YgIisoIkluc3RhbmNlIG9mICciK0guZChILk0odCkpKyInIil9fQpI
+LkVxLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIitILmQodGhp
+cy5hKX19Ckgua1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxl
+ZDogIitQLnAodGhpcy5hKX19CkguTjUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuYX0sCmdWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILmk1KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwx
+PiIpKX0sCng0OmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYodHlwZW9mIGE9PSJzdHJpbmciKXt0PXRoaXMu
+YgppZih0PT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlh1KHQsYSl9ZWxzZXtzPXRoaXMuQ1goYSkK
+cmV0dXJuIHN9fSwKQ1g6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuITEK
+cmV0dXJuIHRoaXMuRmgodGhpcy5CdCh0LEouaGYoYSkmMHgzZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rp
+b24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMKaWYodHlwZW9mIGI9PSJzdHJpbmciKXt0PXAuYgppZih0
+PT1udWxsKXJldHVybgpzPXAuajIodCxiKQpyPXM9PW51bGw/bnVsbDpzLmIKcmV0dXJuIHJ9ZWxzZSBp
+Zih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9PT1iKXtxPXAuYwppZihxPT1udWxsKXJl
+dHVybgpzPXAuajIocSxiKQpyPXM9PW51bGw/bnVsbDpzLmIKcmV0dXJuIHJ9ZWxzZSByZXR1cm4gcC5h
+YShiKX0sCmFhOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLmQKaWYocj09bnVsbClyZXR1cm4KdD10
+aGlzLkJ0KHIsSi5oZihhKSYweDNmZmZmZmYpCnM9dGhpcy5GaCh0LGEpCmlmKHM8MClyZXR1cm4KcmV0
+dXJuIHRbc10uYn0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuPXRoaXMsbT1ILkxo
+KG4pCm0uZC5iKGIpCm0uY2hbMV0uYihjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9bi5iCm4uRUgo
+dD09bnVsbD9uLmI9bi56SygpOnQsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgz
+ZmZmZmZmKT09PWIpe3M9bi5jCm4uRUgocz09bnVsbD9uLmM9bi56SygpOnMsYixjKX1lbHNle3I9bi5k
+CmlmKHI9PW51bGwpcj1uLmQ9bi56SygpCnE9Si5oZihiKSYweDNmZmZmZmYKcD1uLkJ0KHIscSkKaWYo
+cD09bnVsbCluLkVJKHIscSxbbi5IbihiLGMpXSkKZWxzZXtvPW4uRmgocCxiKQppZihvPj0wKXBbb10u
+Yj1jCmVsc2UgcC5wdXNoKG4uSG4oYixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhp
+cwpILkxoKHIpLkMoIn4oMSwyKSIpLmIoYikKdD1yLmUKcz1yLnIKZm9yKDt0IT1udWxsOyl7Yi4kMih0
+LmEsdC5iKQppZihzIT09ci5yKXRocm93IEguYihQLmE0KHIpKQp0PXQuY319LApFSDpmdW5jdGlvbihh
+LGIsYyl7dmFyIHQscz10aGlzLHI9SC5MaChzKQpyLmQuYihiKQpyLmNoWzFdLmIoYykKdD1zLmoyKGEs
+YikKaWYodD09bnVsbClzLkVJKGEsYixzLkhuKGIsYykpCmVsc2UgdC5iPWN9LAprczpmdW5jdGlvbigp
+e3RoaXMucj10aGlzLnIrMSY2NzEwODg2M30sCkhuOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLHI9
+SC5MaChzKSxxPW5ldyBILmRiKHIuZC5iKGEpLHIuY2hbMV0uYihiKSkKaWYocy5lPT1udWxsKXMuZT1z
+LmY9cQplbHNle3Q9cy5mCnEuZD10CnMuZj10LmM9cX0rK3MuYQpzLmtzKCkKcmV0dXJuIHF9LApGaDpm
+dW5jdGlvbihhLGIpe3ZhciB0LHMKaWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7
+czx0OysrcylpZihKLlJNKGFbc10uYSxiKSlyZXR1cm4gcwpyZXR1cm4tMX0sCnc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIFAubk8odGhpcyl9LApqMjpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKQnQ6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gYVtiXX0sCkVJOmZ1bmN0aW9uKGEsYixjKXthW2JdPWN9LApybjpmdW5jdGlv
+bihhLGIpe2RlbGV0ZSBhW2JdfSwKWHU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5qMihhLGIpIT1u
+dWxsfSwKeks6ZnVuY3Rpb24oKXt2YXIgdD0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHM9T2JqZWN0LmNy
+ZWF0ZShudWxsKQp0aGlzLkVJKHMsdCxzKQp0aGlzLnJuKHMsdCkKcmV0dXJuIHN9LAokaUZvOjF9Ckgu
+ZGIucHJvdG90eXBlPXt9CkguaTUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YS5hfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPW5ldyBILk42KHQsdC5yLHRoaXMuJHRp
+LkMoIk42PDE+IikpCnMuYz10LmUKcmV0dXJuIHN9fQpILk42LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9u
+KCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5hCmlmKHQuYiE9PXMu
+cil0aHJvdyBILmIoUC5hNChzKSkKZWxzZXtzPXQuYwppZihzPT1udWxsKXt0LnNxWShudWxsKQpyZXR1
+cm4hMX1lbHNle3Quc3FZKHMuYSkKdC5jPXQuYy5jCnJldHVybiEwfX19LApzcVk6ZnVuY3Rpb24oYSl7
+dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSC5kQy5wcm90b3R5cGU9ewokMTpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy5hKGEpfSwKJFM6NH0KSC53Ti5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihh
+LGIpe3JldHVybiB0aGlzLmEoYSxiKX0sCiRTOjQwfQpILlZYLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
+KGEpe3JldHVybiB0aGlzLmEoSC55KGEpKX0sCiRTOjMwfQpILlZSLnByb3RvdHlwZT17Cnc6ZnVuY3Rp
+b24oYSl7cmV0dXJuIlJlZ0V4cC8iK3RoaXMuYSsiLyIrdGhpcy5iLmZsYWdzfSwKZ0hjOmZ1bmN0aW9u
+KCl7dmFyIHQ9dGhpcyxzPXQuYwppZihzIT1udWxsKXJldHVybiBzCnM9dC5iCnJldHVybiB0LmM9SC52
+NCh0LmEscy5tdWx0aWxpbmUsIXMuaWdub3JlQ2FzZSxzLnVuaWNvZGUscy5kb3RBbGwsITApfSwKZGQ6
+ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguS1codGhpcyxiLDApfSwKVVo6ZnVuY3Rpb24oYSxiKXt2
+YXIgdCxzPXRoaXMuZ0hjKCkKcy5sYXN0SW5kZXg9Ygp0PXMuZXhlYyhhKQppZih0PT1udWxsKXJldHVy
+bgpyZXR1cm4gbmV3IEguRUsodCl9LAokaXZYOjEsCiRpd0w6MX0KSC5FSy5wcm90b3R5cGU9ewpxOmZ1
+bmN0aW9uKGEsYil7dmFyIHQKSC5TYyhiKQp0PXRoaXMuYgppZihiPj10Lmxlbmd0aClyZXR1cm4gSC5P
+SCh0LGIpCnJldHVybiB0W2JdfSwKJGlPZDoxLAokaWliOjF9CkguS1cucHJvdG90eXBlPXsKZ2t6OmZ1
+bmN0aW9uKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlBiLnByb3Rv
+dHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwPXRoaXMsbz1wLmIKaWYobz09bnVsbClyZXR1cm4hMQp0PXAuYwppZih0PD1vLmxlbmd0aCl7cz1w
+LmEKcj1zLlVaKG8sdCkKaWYociE9bnVsbCl7cC5kPXIKbz1yLmIKdD1vLmluZGV4CnE9dCtvWzBdLmxl
+bmd0aAppZih0PT09cSl7aWYocy5iLnVuaWNvZGUpe289cC5jCnQ9bysxCnM9cC5iCmlmKHQ8cy5sZW5n
+dGgpe289Si5yWShzKS5tKHMsbykKaWYobz49NTUyOTYmJm88PTU2MzE5KXtvPUMueEIubShzLHQpCm89
+bz49NTYzMjAmJm88PTU3MzQzfWVsc2Ugbz0hMX1lbHNlIG89ITF9ZWxzZSBvPSExCnE9KG8/cSsxOnEp
+KzF9cC5jPXEKcmV0dXJuITB9fXAuYj1wLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5wcm90
+b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiIT09MClILnZoKFAueChiLG51bGwpKQpy
+ZXR1cm4gdGhpcy5jfSwKJGlPZDoxfQpILnVuLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IEguU2QodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5TZC5wcm90b3R5cGU9ewpGOmZ1bmN0
+aW9uKCl7dmFyIHQscyxyPXRoaXMscT1yLmMscD1yLmIsbz1wLmxlbmd0aCxuPXIuYSxtPW4ubGVuZ3Ro
+CmlmKHErbz5tKXtyLmQ9bnVsbApyZXR1cm4hMX10PW4uaW5kZXhPZihwLHEpCmlmKHQ8MCl7ci5jPW0r
+MQpyLmQ9bnVsbApyZXR1cm4hMX1zPXQrbwpyLmQ9bmV3IEgudFEodCxwKQpyLmM9cz09PXIuYz9zKzE6
+cwpyZXR1cm4hMH0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCiRpQW46MX0KSC5FVC5wcm90
+b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguYjAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJu
+IGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIp
+Ckgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guSWcoYykK
+SC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpY1g6MSwKJGl6TToxfQpILlBnLnByb3RvdHlwZT17
+Clk6ZnVuY3Rpb24oYSxiLGMpe0guU2MoYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpY1g6
+MSwKJGl6TToxfQpILnhqLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixh
+LGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZEUucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gu
+U2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5aQS5wcm90b3R5cGU9ewpxOmZ1
+bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILndmLnBy
+b3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4g
+YVtiXX19CkguUHEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5s
+ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5lRS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+YS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJu
+IGFbYl19fQpILlY2LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6
+ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sCiRpVjY6
+MSwKJGluNjoxfQpILlJHLnByb3RvdHlwZT17fQpILlZQLnByb3RvdHlwZT17fQpILldCLnByb3RvdHlw
+ZT17fQpILlpHLnByb3RvdHlwZT17fQpILkpjLnByb3RvdHlwZT17CkM6ZnVuY3Rpb24oYSl7cmV0dXJu
+IEguY0Uodi50eXBlVW5pdmVyc2UsdGhpcyxhKX0sCktxOmZ1bmN0aW9uKGEpe3JldHVybiBILnY1KHYu
+dHlwZVVuaXZlcnNlLHRoaXMsYSl9fQpILkcucHJvdG90eXBlPXt9CkgudTkucHJvdG90eXBlPXsKdzpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfX0KSC5oei5wcm90b3R5cGU9e30KSC5pTS5wcm90b3R5cGU9
+e30KUC50aC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEscz10LmEKdC5hPW51
+bGwKcy4kMCgpfSwKJFM6MTJ9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp0
+aGlzLmEuYT11Lk0uYihhKQp0PXRoaXMuYgpzPXRoaXMuYwp0LmZpcnN0Q2hpbGQ/dC5yZW1vdmVDaGls
+ZChzKTp0LmFwcGVuZENoaWxkKHMpfSwKJFM6NDF9ClAuVnMucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24o
+KXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjB9ClAuRnQucHJvdG90eXBlPXsKJDA6ZnVu
+Y3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjB9ClAuVzMucHJvdG90eXBlPXsK
+Q1k6ZnVuY3Rpb24oYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgu
+dFIobmV3IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgp
+YCBub3QgZm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi4kMCgp
+fSwKJEM6IiQwIiwKJFI6MCwKJFM6Mn0KUC5QZi5wcm90b3R5cGU9ewp3MDpmdW5jdGlvbihhLGIpe3Zh
+ciB0CmlmKGE9PW51bGwpYT1uZXcgUC5uKCkKdD10aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5Q
+VigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCnQuTmsoYSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3Jl
+dHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17fQpQLkZlLnByb3RvdHlwZT17CkhS
+OmZ1bmN0aW9uKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYo
+dS5hbC5iKHRoaXMuZCksYS5hLHUuY0osdS5LKX0sCkt3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZSxz
+PXUueixyPXUuSyxxPXRoaXMuJHRpLkMoIjIvIikscD10aGlzLmIuYgppZih1LlcuYyh0KSlyZXR1cm4g
+cS5iKHAucnAodCxhLmEsYS5iLHMscix1LmwpKQplbHNlIHJldHVybiBxLmIocC5idih1LnkuYih0KSxh
+LmEscyxyKSl9fQpQLnZzLnByb3RvdHlwZT17ClNxOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT10
+aGlzLiR0aQpxLktxKGMpLkMoIjEvKDIpIikuYihhKQp0PSQuWDMKaWYodCE9PUMuTlUpe2MuQygiQDww
+Lz4iKS5LcShxLmQpLkMoIjEoMikiKS5iKGEpCmlmKGIhPW51bGwpYj1QLlZIKGIsdCl9cz1uZXcgUC52
+cygkLlgzLGMuQygidnM8MD4iKSkKcj1iPT1udWxsPzE6Mwp0aGlzLnhmKG5ldyBQLkZlKHMscixhLGIs
+cS5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHN9LApXNzpmdW5jdGlvbihhLGIp
+e3JldHVybiB0aGlzLlNxKGEsbnVsbCxiKX0sCk9BOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1LmJmLmIo
+bnVsbCkKdD10aGlzLiR0aQpzPSQuWDMKcj1uZXcgUC52cyhzLHQpCmlmKHMhPT1DLk5VKWE9UC5WSChh
+LHMpCnRoaXMueGYobmV3IFAuRmUociwyLG51bGwsYSx0LkMoIkA8MT4iKS5LcSh0LmQpLkMoIkZlPDEs
+Mj4iKSkpCnJldHVybiByfSwKeGY6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9cy5hCmlmKHI8PTEp
+e2EuYT11LnguYihzLmMpCnMuYz1hfWVsc2V7aWYocj09PTIpe3Q9dS5fLmIocy5jKQpyPXQuYQppZihy
+PDQpe3QueGYoYSkKcmV0dXJufXMuYT1yCnMuYz10LmN9UC5UayhudWxsLG51bGwscy5iLHUuTS5iKG5l
+dyBQLmRhKHMsYSkpKX19LApqUTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG89dGhpcyxuPXt9Cm4u
+YT1hCmlmKGE9PW51bGwpcmV0dXJuCnQ9by5hCmlmKHQ8PTEpe3M9dS54LmIoby5jKQpyPW8uYz1hCmlm
+KHMhPW51bGwpe2Zvcig7cT1yLmEscSE9bnVsbDtyPXEpO3IuYT1zfX1lbHNle2lmKHQ9PT0yKXtwPXUu
+Xy5iKG8uYykKdD1wLmEKaWYodDw0KXtwLmpRKGEpCnJldHVybn1vLmE9dApvLmM9cC5jfW4uYT1vLk44
+KGEpClAuVGsobnVsbCxudWxsLG8uYix1Lk0uYihuZXcgUC5vUShuLG8pKSl9fSwKYWg6ZnVuY3Rpb24o
+KXt2YXIgdD11LnguYih0aGlzLmMpCnRoaXMuYz1udWxsCnJldHVybiB0aGlzLk44KHQpfSwKTjg6ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEscz1udWxsO3QhPW51bGw7cz10LHQ9cil7cj10LmEKdC5h
+PXN9cmV0dXJuIHN9LApISDpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMscj1zLiR0aQpyLkMoIjEvIiku
+YihhKQppZihyLkMoImI4PDE+IikuYyhhKSlpZihyLmMoYSkpUC5BOShhLHMpCmVsc2UgUC5rMyhhLHMp
+CmVsc2V7dD1zLmFoKCkKci5kLmIoYSkKcy5hPTQKcy5jPWEKUC5IWihzLHQpfX0sClpMOmZ1bmN0aW9u
+KGEsYil7dmFyIHQscz10aGlzCnUubC5iKGIpCnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIp
+ClAuSFoocyx0KX0sClhmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihh
+KQppZihzLkMoImI4PDE+IikuYyhhKSl7dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGws
+dC5iLHUuTS5iKG5ldyBQLnJIKHQsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0
+aQpzLkMoImI4PDE+IikuYihhKQppZihzLmMoYSkpe2lmKGEuZ0FUKCkpe3QuYT0xClAuVGsobnVsbCxu
+dWxsLHQuYix1Lk0uYihuZXcgUC5LRih0LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0
+KX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhpcy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5l
+dyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
+UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQ
+LkhaKHRoaXMuYix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
+e3ZhciB0PXRoaXMuYQp0LmE9MAp0LkhIKGEpfSwKJFM6MTJ9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVu
+Y3Rpb24oYSxiKXt1LmwuYihiKQp0aGlzLmEuWkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0
+aGlzLiQyKGEsbnVsbCl9LAokQzoiJDIiLAokRDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjM1
+fQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwK
+JFM6MH0KUC5ySC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYSxzPXQuJHRpLmQu
+Yih0aGlzLmIpLHI9dC5haCgpCnQuYT00CnQuYz1zClAuSFoodCxyKX0sCiRTOjB9ClAuS0YucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5aTC5wcm90b3R5
+cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJv
+dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbj10aGlzLG09bnVsbAp0cnl7cj1u
+LmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNhdGNoKHEpe3Q9SC5SdShxKQpzPUgudHMocSkK
+aWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9cj09bnVsbD9wPT1udWxsOnI9PT1wCnI9cH1l
+bHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5hLmEuYykKZWxzZSBwLmI9bmV3IFAuQ3codCxz
+KQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZihtIGluc3RhbmNlb2YgUC52cyYmbS5hPj00KXtp
+ZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpyLmE9ITB9cmV0dXJufW89bi5hLmEKcj1uLmIK
+ci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9fSwKJFM6Mn0KUC5qWi5wcm90b3R5cGU9ewok
+MTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6MzR9ClAucnEucHJvdG90eXBlPXsKJDA6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKdHJ5e3I9bS5iCnE9ci4kdGkKcD1xLmQKbz1w
+LmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEpIikuYihyLmQpLG8scS5DKCIyLyIpLHApfWNh
+dGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEKci5iPW5ldyBQLkN3KHQscykKci5hPSEwfX0s
+CiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9
+dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwppZihILm9UKHEuSFIodCkpJiZxLmUhPW51bGwp
+e3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2gobyl7cz1ILlJ1KG8pCnI9SC50cyhvKQpxPXUu
+bi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihwPT1udWxsP249PW51bGw6cD09PW4pbS5iPXEK
+ZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwKJFM6Mn0KUC5PTS5wcm90b3R5cGU9e30KUC5x
+aC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcyxxPXt9LHA9bmV3IFAudnMo
+JC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMoIn4oMSkiKS5iKG5ldyBQLkI1KHEscikpCnUu
+TS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixzLCExLHQuZCkKcmV0dXJuIHB9fQpQLkI1LnBy
+b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5kLmIoYSk7Kyt0aGlzLmEuYX0sCiRT
+OmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJjOCgxKSIpfX0KUC5QSS5wcm90b3R5cGU9
+ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEuYSl9LAokUzowfQpQLk1PLnByb3RvdHlwZT17
+fQpQLmtULnByb3RvdHlwZT17fQpQLkN3LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEgu
+ZCh0aGlzLmEpfSwKJGlYUzoxfQpQLm0wLnByb3RvdHlwZT17JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17
+CiQwOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLmEscj1zLmEKcz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6
+cgpyPXRoaXMuYgppZihyPT1udWxsKXRocm93IEguYihzKQp0PUguYihzKQp0LnN0YWNrPXIudygwKQp0
+aHJvdyB0fSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1u
+dWxsCnUuTS5iKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KHEscSx0aGlz
+LGEsdS5IKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRzKHIpClAuTDIocSxxLHRoaXMsdCx1LmwuYihz
+KSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxPW51bGwKYy5DKCJ+KDApIikuYihhKQpj
+LmIoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KHEscSx0aGlzLGEsYix1
+LkgsYyl9Y2F0Y2gocil7dD1ILlJ1KHIpCnM9SC50cyhyKQpQLkwyKHEscSx0aGlzLHQsdS5sLmIocykp
+fX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmhqKHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIp
+fSwKR1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlv
+bihhLGIpe3JldHVybn0sCnp6OmZ1bmN0aW9uKGEsYil7Yi5DKCIwKCkiKS5iKGEpCmlmKCQuWDM9PT1D
+Lk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVsbCxudWxsLHRoaXMsYSxiKX0sCmJ2OmZ1bmN0
+aW9uKGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5iKGEpCmQuYihiKQppZigkLlgz
+PT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51bGwsdGhpcyxhLGIsYyxkKX0s
+CnJwOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5DKCIxKDIsMyki
+KS5iKGEpCmUuYihiKQpmLmIoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixjKQpyZXR1cm4g
+UC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9fQpQLmhqLnByb3RvdHlwZT17CiQwOmZ1bmN0
+aW9uKCl7cmV0dXJuIHRoaXMuYS56eih0aGlzLmIsdGhpcy5jKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuYy5DKCIwKCkiKX19ClAuVnAucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5hLmJIKHRoaXMuYil9LAokUzoyfQpQLk9SLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0
+PXRoaXMuYwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMuYix0LmIoYSksdCl9LAokUzpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmMuQygifigwKSIpfX0KUC5iNi5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFy
+IHQ9dGhpcyxzPW5ldyBQLmxtKHQsdC5yLEguTGgodCkuQygibG08MT4iKSkKcy5jPXQuZQpyZXR1cm4g
+c30sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciB0LHMK
+aWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3Q9dGhpcy5iCmlmKHQ9PW51bGwp
+cmV0dXJuITEKcmV0dXJuIHUuSi5iKHRbYl0pIT1udWxsfWVsc2V7cz10aGlzLlBSKGIpCnJldHVybiBz
+fX0sClBSOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZAppZih0PT1udWxsKXJldHVybiExCnJldHVybiB0
+aGlzLkRGKHRbdGhpcy5OKGEpXSxhKT49MH0sCmk6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhpcwpI
+LkxoKHIpLmQuYihiKQppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7dD1yLmIK
+cmV0dXJuIHIuYlEodD09bnVsbD9yLmI9UC5UMigpOnQsYil9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJl
+ciImJihiJjEwNzM3NDE4MjMpPT09Yil7cz1yLmMKcmV0dXJuIHIuYlEocz09bnVsbD9yLmM9UC5UMigp
+OnMsYil9ZWxzZSByZXR1cm4gci5CNyhiKX0sCkI3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMK
+SC5MaChxKS5kLmIoYSkKdD1xLmQKaWYodD09bnVsbCl0PXEuZD1QLlQyKCkKcz1xLk4oYSkKcj10W3Nd
+CmlmKHI9PW51bGwpdFtzXT1bcS55byhhKV0KZWxzZXtpZihxLkRGKHIsYSk+PTApcmV0dXJuITEKci5w
+dXNoKHEueW8oYSkpfXJldHVybiEwfSwKUjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMKaWYodHlwZW9m
+IGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpcmV0dXJuIHQuTCh0LmIsYikKZWxzZSBpZih0eXBl
+b2YgYj09Im51bWJlciImJihiJjEwNzM3NDE4MjMpPT09YilyZXR1cm4gdC5MKHQuYyxiKQplbHNlIHJl
+dHVybiB0LnFnKGIpfSwKcWc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD10aGlzLG89cC5kCmlmKG89
+PW51bGwpcmV0dXJuITEKdD1wLk4oYSkKcz1vW3RdCnI9cC5ERihzLGEpCmlmKHI8MClyZXR1cm4hMQpx
+PXMuc3BsaWNlKHIsMSlbMF0KaWYoMD09PXMubGVuZ3RoKWRlbGV0ZSBvW3RdCnAuR1MocSkKcmV0dXJu
+ITB9LApiUTpmdW5jdGlvbihhLGIpe0guTGgodGhpcykuZC5iKGIpCmlmKHUuSi5iKGFbYl0pIT1udWxs
+KXJldHVybiExCmFbYl09dGhpcy55byhiKQpyZXR1cm4hMH0sCkw6ZnVuY3Rpb24oYSxiKXt2YXIgdApp
+ZihhPT1udWxsKXJldHVybiExCnQ9dS5KLmIoYVtiXSkKaWYodD09bnVsbClyZXR1cm4hMQp0aGlzLkdT
+KHQpCmRlbGV0ZSBhW2JdCnJldHVybiEwfSwKUzpmdW5jdGlvbigpe3RoaXMucj0xMDczNzQxODIzJnRo
+aXMucisxfSwKeW86ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9bmV3IFAuYm4oSC5MaChzKS5kLmIo
+YSkpCmlmKHMuZT09bnVsbClzLmU9cy5mPXIKZWxzZXt0PXMuZgpyLmM9dApzLmY9dC5iPXJ9KytzLmEK
+cy5TKCkKcmV0dXJuIHJ9LApHUzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9YS5jLHI9YS5iCmlmKHM9
+PW51bGwpdC5lPXIKZWxzZSBzLmI9cgppZihyPT1udWxsKXQuZj1zCmVsc2Ugci5jPXM7LS10LmEKdC5T
+KCl9LApOOmZ1bmN0aW9uKGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4MjN9LApERjpmdW5jdGlvbihh
+LGIpe3ZhciB0LHMKaWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0Oysrcylp
+ZihKLlJNKGFbc10uYSxiKSlyZXR1cm4gcwpyZXR1cm4tMX19ClAuYm4ucHJvdG90eXBlPXt9ClAubG0u
+cHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0
+PXRoaXMscz10LmEKaWYodC5iIT09cy5yKXRocm93IEguYihQLmE0KHMpKQplbHNle3M9dC5jCmlmKHM9
+PW51bGwpe3Quc2oobnVsbCkKcmV0dXJuITF9ZWxzZXt0LnNqKHQuJHRpLmQuYihzLmEpKQp0LmM9dC5j
+LmIKcmV0dXJuITB9fX0sCnNqOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5kLmIoYSl9LAokaUFu
+OjF9ClAubVcucHJvdG90eXBlPXt9ClAuTFUucHJvdG90eXBlPXskaWNYOjEsJGl6TToxfQpQLmxELnBy
+b3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguYTcoYSx0aGlzLmdBKGEpLEguekso
+YSkuQygiYTc8bEQuRT4iKSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucShhLGIpfSwKSzpm
+dW5jdGlvbihhLGIpe3ZhciB0LHMKSC56SyhhKS5DKCJ+KGxELkUpIikuYihiKQp0PXRoaXMuZ0EoYSkK
+Zm9yKHM9MDtzPHQ7KytzKXtiLiQxKHRoaXMucShhLHMpKQppZih0IT09dGhpcy5nQShhKSl0aHJvdyBI
+LmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUgueksoYSkKcmV0dXJuIG5ldyBI
+LkE4KGEsdC5LcShjKS5DKCIxKGxELkUpIikuYihiKSx0LkMoIkA8bEQuRT4iKS5LcShjKS5DKCJBODwx
+LDI+IikpfSwKZHU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKSC56SyhhKS5DKCJsRC5FIikuYihkKQpQ
+LmpCKGIsYyx0aGlzLmdBKGEpKQpmb3IodD1iO3Q8YzsrK3QpdGhpcy5ZKGEsdCxkKX0sCnc6ZnVuY3Rp
+b24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX19ClAuaWwucHJvdG90eXBlPXt9ClAuR0EucHJvdG90
+eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZighcy5hKXRoaXMuYi5hKz0iLCAi
+CnMuYT0hMQpzPXRoaXMuYgp0PXMuYSs9SC5kKGEpCnMuYT10KyI6ICIKcy5hKz1ILmQoYil9LAokUzox
+fQpQLllrLnByb3RvdHlwZT17Cks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCkguTGgodGhpcykuQygifihZ
+ay5LLFlrLlYpIikuYihiKQpmb3IodD1KLklUKHRoaXMuZ1YoKSk7dC5GKCk7KXtzPXQuZ2woKQpiLiQy
+KHMsdGhpcy5xKDAscykpfX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuZ1YoKSl9LAp3
+OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKJGlaMDoxfQpQLktQLnByb3RvdHlwZT17Clk6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUguTGgodGhpcykKdC5kLmIoYikKdC5jaFsxXS5iKGMpCnRocm93
+IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKSl9fQpQLlBuLnByb3RvdHlw
+ZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLnEoMCxiKX0sClk6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0PUguTGgodGhpcykKdGhpcy5hLlkoMCx0LmQuYihiKSx0LmNoWzFdLmIoYykpfSwKSzpmdW5j
+dGlvbihhLGIpe3RoaXMuYS5LKDAsSC5MaCh0aGlzKS5DKCJ+KDEsMikiKS5iKGIpKX0sCmdBOmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5nQSh0KX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
+aih0aGlzLmEpfSwKJGlaMDoxfQpQLkdqLnByb3RvdHlwZT17fQpQLmxmLnByb3RvdHlwZT17Cnc6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX19ClAuVmoucHJvdG90eXBlPXskaWNYOjEs
+JGl4dToxfQpQLlh2LnByb3RvdHlwZT17CkZWOmZ1bmN0aW9uKGEsYil7dmFyIHQKZm9yKHQ9Si5JVChI
+LkxoKHRoaXMpLkMoImNYPDE+IikuYihiKSk7dC5GKCk7KXRoaXMuaSgwLHQuZ2woKSl9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsiLCJ9Iil9LApIOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1Q
+LnJqKHRoaXMsdGhpcy5yLEguTGgodGhpcykuZCkKaWYoIXMuRigpKXJldHVybiIiCmlmKGI9PT0iIil7
+dD0iIgpkbyB0Kz1ILmQocy5kKQp3aGlsZShzLkYoKSl9ZWxzZXt0PUguZChzLmQpCmZvcig7cy5GKCk7
+KXQ9dCtiK0guZChzLmQpfXJldHVybiB0LmNoYXJDb2RlQXQoMCk9PTA/dDp0fSwKJGljWDoxLAokaXh1
+OjF9ClAublkucHJvdG90eXBlPXt9ClAuV1kucHJvdG90eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAu
+dXcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0
+dXJuIHRoaXMuYy5xKDAsYikKZWxzZSBpZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuCmVsc2V7dD1z
+W2JdCnJldHVybiB0eXBlb2YgdD09InVuZGVmaW5lZCI/dGhpcy5mYihiKTp0fX0sCmdBOmZ1bmN0aW9u
+KGEpe3JldHVybiB0aGlzLmI9PW51bGw/dGhpcy5jLmE6dGhpcy5DZigpLmxlbmd0aH0sCmdWOmZ1bmN0
+aW9uKCl7aWYodGhpcy5iPT1udWxsKXt2YXIgdD10aGlzLmMKcmV0dXJuIG5ldyBILmk1KHQsSC5MaCh0
+KS5DKCJpNTwxPiIpKX1yZXR1cm4gbmV3IFAuaTgodGhpcyl9LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dCxzLHI9dGhpcwppZihyLmI9PW51bGwpci5jLlkoMCxiLGMpCmVsc2UgaWYoci54NChiKSl7dD1yLmIK
+dFtiXT1jCnM9ci5hCmlmKHM9PW51bGw/dCE9bnVsbDpzIT09dClzW2JdPW51bGx9ZWxzZSByLlhLKCku
+WSgwLGIsYyl9LAp4NDpmdW5jdGlvbihhKXtpZih0aGlzLmI9PW51bGwpcmV0dXJuIHRoaXMuYy54NChh
+KQpyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKX0sCks6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMKdS5jQS5iKGIpCmlmKHAuYj09bnVsbClyZXR1
+cm4gcC5jLksoMCxiKQp0PXAuQ2YoKQpmb3Iocz0wO3M8dC5sZW5ndGg7KytzKXtyPXRbc10KcT1wLmJb
+cl0KaWYodHlwZW9mIHE9PSJ1bmRlZmluZWQiKXtxPVAuUWUocC5hW3JdKQpwLmJbcl09cX1iLiQyKHIs
+cSkKaWYodCE9PXAuYyl0aHJvdyBILmIoUC5hNChwKSl9fSwKQ2Y6ZnVuY3Rpb24oKXt2YXIgdD11Lmou
+Yih0aGlzLmMpCmlmKHQ9PW51bGwpdD10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEpLHUucykK
+cmV0dXJuIHR9LApYSzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbz10aGlzCmlmKG8uYj09bnVsbCly
+ZXR1cm4gby5jCnQ9UC5GbCh1Lk4sdS56KQpzPW8uQ2YoKQpmb3Iocj0wO3E9cy5sZW5ndGgscjxxOysr
+cil7cD1zW3JdCnQuWSgwLHAsby5xKDAscCkpfWlmKHE9PT0wKUMuTm0uaShzLG51bGwpCmVsc2UgQy5O
+bS5zQShzLDApCm8uYT1vLmI9bnVsbApyZXR1cm4gby5jPXR9LApmYjpmdW5jdGlvbihhKXt2YXIgdApp
+ZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKSlyZXR1cm4KdD1Q
+LlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT10fX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5j
+dGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuZ0EodCl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
+dGhpcy5hCmlmKHQuYj09bnVsbCl0PXQuZ1YoKS5FKDAsYikKZWxzZXt0PXQuQ2YoKQppZihiPDB8fGI+
+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKdD10W2JdfXJldHVybiB0fSwKZ2t6OmZ1bmN0aW9uKGEp
+e3ZhciB0PXRoaXMuYQppZih0LmI9PW51bGwpe3Q9dC5nVigpCnQ9dC5na3oodCl9ZWxzZXt0PXQuQ2Yo
+KQp0PW5ldyBKLm0xKHQsdC5sZW5ndGgsSC50Nih0KS5DKCJtMTwxPiIpKX1yZXR1cm4gdH19ClAuQ1Yu
+cHJvdG90eXBlPXsKeXI6ZnVuY3Rpb24oYSxhMCxhMSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixp
+LGgsZyxmLGUsZCxjLGI9IkludmFsaWQgYmFzZTY0IGVuY29kaW5nIGxlbmd0aCAiCmExPVAuakIoYTAs
+YTEsYS5sZW5ndGgpCnQ9JC5WNygpCmZvcihzPWEwLHI9cyxxPW51bGwscD0tMSxvPS0xLG49MDtzPGEx
+O3M9bSl7bT1zKzEKbD1DLnhCLlcoYSxzKQppZihsPT09Mzcpe2s9bSsyCmlmKGs8PWExKXtqPUgub28o
+Qy54Qi5XKGEsbSkpCmk9SC5vbyhDLnhCLlcoYSxtKzEpKQpoPWoqMTYraS0oaSYyNTYpCmlmKGg9PT0z
+NyloPS0xCm09a31lbHNlIGg9LTF9ZWxzZSBoPWwKaWYoMDw9aCYmaDw9MTI3KXtpZihoPDB8fGg+PXQu
+bGVuZ3RoKXJldHVybiBILk9IKHQsaCkKZz10W2hdCmlmKGc+PTApe2g9Qy54Qi5tKCJBQkNERUZHSElK
+S0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixnKQpp
+ZihoPT09bCljb250aW51ZQpsPWh9ZWxzZXtpZihnPT09LTEpe2lmKHA8MCl7Zj1xPT1udWxsP251bGw6
+cS5hLmxlbmd0aAppZihmPT1udWxsKWY9MApwPWYrKHMtcikKbz1zfSsrbgppZihsPT09NjEpY29udGlu
+dWV9bD1ofWlmKGchPT0tMil7aWYocT09bnVsbClxPW5ldyBQLlJuKCIiKQpxLmErPUMueEIuTmooYSxy
+LHMpCnEuYSs9SC5MdyhsKQpyPW0KY29udGludWV9fXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2
+NCBkYXRhIixhLHMpKX1pZihxIT1udWxsKXtmPXEuYSs9Qy54Qi5OaihhLHIsYTEpCmU9Zi5sZW5ndGgK
+aWYocD49MClQLnhNKGEsbyxhMSxwLG4sZSkKZWxzZXtkPUMuam4uelkoZS0xLDQpKzEKaWYoZD09PTEp
+dGhyb3cgSC5iKFAucnIoYixhLGExKSkKZm9yKDtkPDQ7KXtmKz0iPSIKcS5hPWY7KytkfX1mPXEuYQpy
+ZXR1cm4gQy54Qi5pNyhhLGEwLGExLGYuY2hhckNvZGVBdCgwKT09MD9mOmYpfWM9YTEtYTAKaWYocD49
+MClQLnhNKGEsbyxhMSxwLG4sYykKZWxzZXtkPUMuam4uelkoYyw0KQppZihkPT09MSl0aHJvdyBILmIo
+UC5ycihiLGEsYTEpKQppZihkPjEpYT1DLnhCLmk3KGEsYTEsYTEsZD09PTI/Ij09IjoiPSIpfXJldHVy
+biBhfX0KUC5VOC5wcm90b3R5cGU9e30KUC5Vay5wcm90b3R5cGU9e30KUC53SS5wcm90b3R5cGU9e30K
+UC5aaS5wcm90b3R5cGU9e30KUC5ieS5wcm90b3R5cGU9ewpwVzpmdW5jdGlvbihhLGIsYyl7dmFyIHQK
+dS5lcC5iKGMpCnQ9UC5CUyhiLHRoaXMuZ0hlKCkuYSkKcmV0dXJuIHR9LApnSGU6ZnVuY3Rpb24oKXty
+ZXR1cm4gQy5BM319ClAuTXgucHJvdG90eXBlPXt9ClAudTUucHJvdG90eXBlPXsKZ1pFOmZ1bmN0aW9u
+KCl7cmV0dXJuIEMuUWt9fQpQLkUzLnByb3RvdHlwZT17CldKOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj1Q
+LmpCKDAsbnVsbCxhLmxlbmd0aCkscT1yLTAKaWYocT09PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDAp
+CnQ9bmV3IFVpbnQ4QXJyYXkocSozKQpzPW5ldyBQLlJ3KHQpCmlmKHMuR3goYSwwLHIpIT09cilzLk82
+KEouYTYoYSxyLTEpLDApCnJldHVybiBuZXcgVWludDhBcnJheSh0LnN1YmFycmF5KDAsSC5yTSgwLHMu
+Yix0Lmxlbmd0aCkpKX19ClAuUncucHJvdG90eXBlPXsKTzY6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRo
+aXMscj1zLmMscT1zLmIscD1xKzEsbz1yLmxlbmd0aAppZigoYiY2NDUxMik9PT01NjMyMCl7dD02NTUz
+NisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcy5iPXAKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09
+MjQwfHQ+Pj4xOApxPXMuYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTI4fHQ+Pj4x
+MiY2MwpwPXMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MTI4fHQ+Pj42JjYzCnMu
+Yj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTI4fHQmNjMKcmV0dXJuITB9ZWxzZXtz
+LmI9cAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0yMjR8YT4+PjEyCnE9cy5iPXArMQppZihw
+Pj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8YT4+PjYmNjMKcy5iPXErMQppZihxPj1vKXJldHVy
+biBILk9IKHIscSkKcltxXT0xMjh8YSY2MwpyZXR1cm4hMX19LApHeDpmdW5jdGlvbihhLGIsYyl7dmFy
+IHQscyxyLHEscCxvLG4sbT10aGlzCmlmKGIhPT1jJiYoQy54Qi5tKGEsYy0xKSY2NDUxMik9PT01NTI5
+NiktLWMKZm9yKHQ9bS5jLHM9dC5sZW5ndGgscj1iO3I8YzsrK3Ipe3E9Qy54Qi5XKGEscikKaWYocTw9
+MTI3KXtwPW0uYgppZihwPj1zKWJyZWFrCm0uYj1wKzEKdFtwXT1xfWVsc2UgaWYoKHEmNjQ1MTIpPT09
+NTUyOTYpe2lmKG0uYiszPj1zKWJyZWFrCm89cisxCmlmKG0uTzYocSxDLnhCLlcoYSxvKSkpcj1vfWVs
+c2UgaWYocTw9MjA0Nyl7cD1tLmIKbj1wKzEKaWYobj49cylicmVhawptLmI9bgppZihwPj1zKXJldHVy
+biBILk9IKHQscCkKdFtwXT0xOTJ8cT4+PjYKbS5iPW4rMQp0W25dPTEyOHxxJjYzfWVsc2V7cD1tLmIK
+aWYocCsyPj1zKWJyZWFrCm49bS5iPXArMQppZihwPj1zKXJldHVybiBILk9IKHQscCkKdFtwXT0yMjR8
+cT4+PjEyCnA9bS5iPW4rMQppZihuPj1zKXJldHVybiBILk9IKHQsbikKdFtuXT0xMjh8cT4+PjYmNjMK
+bS5iPXArMQppZihwPj1zKXJldHVybiBILk9IKHQscCkKdFtwXT0xMjh8cSY2M319cmV0dXJuIHJ9fQpQ
+LkdZLnByb3RvdHlwZT17CldKOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbAp1LkwuYihh
+KQp0PVAua3koITEsYSwwLG51bGwpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1QLmpCKDAsbnVsbCxKLkht
+KGEpKQpyPVAud0coYSwwLHMpCmlmKHI+MCl7cT1QLkhNKGEsMCxyKQppZihyPT09cylyZXR1cm4gcQpw
+PW5ldyBQLlJuKHEpCm89cgpuPSExfWVsc2V7bz0wCnA9bnVsbApuPSEwfWlmKHA9PW51bGwpcD1uZXcg
+UC5SbigiIikKbT1uZXcgUC5ieighMSxwKQptLmM9bgptLk1FKGEsbyxzKQppZihtLmU+MCl7SC52aChQ
+LnJyKCJVbmZpbmlzaGVkIFVURi04IG9jdGV0IHNlcXVlbmNlIixhLHMpKQpwLmErPUguTHcoNjU1MzMp
+Cm0uZj1tLmU9bS5kPTB9bD1wLmEKcmV0dXJuIGwuY2hhckNvZGVBdCgwKT09MD9sOmx9fQpQLmJ6LnBy
+b3RvdHlwZT17Ck1FOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaD10
+aGlzLGc9IkJhZCBVVEYtOCBlbmNvZGluZyAweCIKdS5MLmIoYSkKdD1oLmQKcz1oLmUKcj1oLmYKaC5m
+PWguZT1oLmQ9MAokbGFiZWwwJDA6Zm9yKHE9Si5VNihhKSxwPWguYixvPWI7ITA7bz1qKXskbGFiZWwx
+JDE6aWYocz4wKXtkb3tpZihvPT09YylicmVhayAkbGFiZWwwJDAKbj1xLnEoYSxvKQppZih0eXBlb2Yg
+biE9PSJudW1iZXIiKXJldHVybiBuLnpNKCkKaWYoKG4mMTkyKSE9PTEyOCl7bT1QLnJyKGcrQy5qbi5X
+WihuLDE2KSxhLG8pCnRocm93IEguYihtKX1lbHNle3Q9KHQ8PDZ8biY2Myk+Pj4wOy0tczsrK299fXdo
+aWxlKHM+MCkKbT1yLTEKaWYobTwwfHxtPj00KXJldHVybiBILk9IKEMuR2IsbSkKaWYodDw9Qy5HYltt
+XSl7bT1QLnJyKCJPdmVybG9uZyBlbmNvZGluZyBvZiAweCIrQy5qbi5XWih0LDE2KSxhLG8tci0xKQp0
+aHJvdyBILmIobSl9aWYodD4xMTE0MTExKXttPVAucnIoIkNoYXJhY3RlciBvdXRzaWRlIHZhbGlkIFVu
+aWNvZGUgcmFuZ2U6IDB4IitDLmpuLldaKHQsMTYpLGEsby1yLTEpCnRocm93IEguYihtKX1pZighaC5j
+fHx0IT09NjUyNzkpcC5hKz1ILkx3KHQpCmguYz0hMX1mb3IobT1vPGM7bTspe2w9UC53RyhhLG8sYykK
+aWYobD4wKXtoLmM9ITEKaz1vK2wKcC5hKz1QLkhNKGEsbyxrKQppZihrPT09YylicmVha31lbHNlIGs9
+bwpqPWsrMQpuPXEucShhLGspCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4uSigpCmlmKG48
+MCl7aT1QLnJyKCJOZWdhdGl2ZSBVVEYtOCBjb2RlIHVuaXQ6IC0weCIrQy5qbi5XWigtbiwxNiksYSxq
+LTEpCnRocm93IEguYihpKX1lbHNle2lmKChuJjIyNCk9PT0xOTIpe3Q9biYzMQpzPTEKcj0xCmNvbnRp
+bnVlICRsYWJlbDAkMH1pZigobiYyNDApPT09MjI0KXt0PW4mMTUKcz0yCnI9Mgpjb250aW51ZSAkbGFi
+ZWwwJDB9aWYoKG4mMjQ4KT09PTI0MCYmbjwyNDUpe3Q9biY3CnM9MwpyPTMKY29udGludWUgJGxhYmVs
+MCQwfWk9UC5ycihnK0Muam4uV1oobiwxNiksYSxqLTEpCnRocm93IEguYihpKX19YnJlYWsgJGxhYmVs
+MCQwfWlmKHM+MCl7aC5kPXQKaC5lPXMKaC5mPXJ9fX0KUC5XRi5wcm90b3R5cGU9ewokMjpmdW5jdGlv
+bihhLGIpe3ZhciB0LHMscgp1LmZvLmIoYSkKdD10aGlzLmIKcz10aGlzLmEKdC5hKz1zLmEKcj10LmEr
+PUguZChhLmEpCnQuYT1yKyI6ICIKdC5hKz1QLnAoYikKcy5hPSIsICJ9LAokUzoyN30KUC5hMi5wcm90
+b3R5cGU9e30KUC5pUC5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJu
+ITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQLmlQJiZ0aGlzLmE9PT1iLmEmJiEwfSwKZ2lPOmZ1bmN0aW9u
+KGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4odF5DLmpuLndHKHQsMzApKSYxMDczNzQxODIzfSwKdzpmdW5j
+dGlvbihhKXt2YXIgdD10aGlzLHM9UC5HcShILnRKKHQpKSxyPVAuaDAoSC5OUyh0KSkscT1QLmgwKEgu
+akEodCkpLHA9UC5oMChILktMKHQpKSxvPVAuaDAoSC5jaCh0KSksbj1QLmgwKEguSmQodCkpLG09UC5W
+eChILm8xKHQpKSxsPXMrIi0iK3IrIi0iK3ErIiAiK3ArIjoiK28rIjoiK24rIi4iK20KcmV0dXJuIGx9
+fQpQLkNQLnByb3RvdHlwZT17fQpQLlhTLnByb3RvdHlwZT17fQpQLkM2LnByb3RvdHlwZT17Cnc6ZnVu
+Y3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQhPW51bGwpcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIr
+UC5wKHQpCnJldHVybiJBc3NlcnRpb24gZmFpbGVkIn19ClAubi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fQpQLnUucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXty
+ZXR1cm4iSW52YWxpZCBhcmd1bWVudCIrKCF0aGlzLmE/IihzKSI6IiIpfSwKZ3U6ZnVuY3Rpb24oKXty
+ZXR1cm4iIn0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD10aGlzLG89cC5jLG49byE9bnVsbD8i
+ICgiK28rIikiOiIiCm89cC5kCnQ9bz09bnVsbD8iIjoiOiAiK0guZChvKQpzPXAuZ1ooKStuK3QKaWYo
+IXAuYSlyZXR1cm4gcwpyPXAuZ3UoKQpxPVAucChwLmIpCnJldHVybiBzK3IrIjogIitxfX0KUC5iSi5w
+cm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7
+dmFyIHQscyxyPXRoaXMuZQppZihyPT1udWxsKXtyPXRoaXMuZgp0PXIhPW51bGw/IjogTm90IGxlc3Mg
+dGhhbiBvciBlcXVhbCB0byAiK0guZChyKToiIn1lbHNle3M9dGhpcy5mCmlmKHM9PW51bGwpdD0iOiBO
+b3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5kKHIpCmVsc2UgaWYocz5yKXQ9IjogTm90IGlu
+IHJhbmdlICIrSC5kKHIpKyIuLiIrSC5kKHMpKyIsIGluY2x1c2l2ZSIKZWxzZSB0PXM8cj8iOiBWYWxp
+ZCB2YWx1ZSByYW5nZSBpcyBlbXB0eSI6IjogT25seSB2YWxpZCB2YWx1ZSBpcyAiK0guZChyKX1yZXR1
+cm4gdH19ClAuZVkucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApn
+dTpmdW5jdGlvbigpe3ZhciB0LHM9SC5TYyh0aGlzLmIpCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0
+dXJuIHMuSigpCmlmKHM8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKdD10aGlz
+LmYKaWYodD09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVybiI6IGluZGV4IHNo
+b3VsZCBiZSBsZXNzIHRoYW4gIitILmQodCl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mfX0K
+UC5tcC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzLGs9
+e30saj1uZXcgUC5SbigiIikKay5hPSIiCmZvcih0PWwuYyxzPXQubGVuZ3RoLHI9MCxxPSIiLHA9IiI7
+cjxzOysrcixwPSIsICIpe289dFtyXQpqLmE9cStwCnE9ai5hKz1QLnAobykKay5hPSIsICJ9bC5kLkso
+MCxuZXcgUC5XRihrLGopKQpuPVAucChsLmEpCm09ai53KDApCnQ9Ik5vU3VjaE1ldGhvZEVycm9yOiBt
+ZXRob2Qgbm90IGZvdW5kOiAnIitILmQobC5iLmEpKyInXG5SZWNlaXZlcjogIituKyJcbkFyZ3VtZW50
+czogWyIrbSsiXSIKcmV0dXJuIHR9fQpQLnViLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJu
+IlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogIit0aGlzLmF9fQpQLmRzLnByb3RvdHlwZT17Cnc6ZnVuY3Rp
+b24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0IT1udWxsPyJVbmltcGxlbWVudGVkRXJyb3I6ICIrdDoi
+VW5pbXBsZW1lbnRlZEVycm9yIn19ClAubGoucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
+QmFkIHN0YXRlOiAiK3RoaXMuYX19ClAuVVYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzLmEKaWYodD09bnVsbClyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJh
+dGlvbi4iCnJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiK1Au
+cCh0KSsiLiJ9fQpQLms1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIk91dCBvZiBNZW1v
+cnkifSwKJGlYUzoxfQpQLktZLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlN0YWNrIE92
+ZXJmbG93In0sCiRpWFM6MX0KUC5jLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5h
+CnJldHVybiB0PT1udWxsPyJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxp
+emF0aW9uIjoiUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrdCsiJyBkdXJpbmcgaXRzIGluaXRpYWxp
+emF0aW9uIn19ClAuQ0QucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iRXhjZXB0aW9uOiAi
+K3RoaXMuYX19ClAuYUUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixt
+LGwsayxqLGksaD10aGlzLmEsZz1oIT1udWxsJiYiIiE9PWg/IkZvcm1hdEV4Y2VwdGlvbjogIitILmQo
+aCk6IkZvcm1hdEV4Y2VwdGlvbiIsZj10aGlzLmMsZT10aGlzLmIKaWYodHlwZW9mIGU9PSJzdHJpbmci
+KXtpZihmIT1udWxsKWg9ZjwwfHxmPmUubGVuZ3RoCmVsc2UgaD0hMQppZihoKWY9bnVsbAppZihmPT1u
+dWxsKXt0PWUubGVuZ3RoPjc4P0MueEIuTmooZSwwLDc1KSsiLi4uIjplCnJldHVybiBnKyJcbiIrdH1m
+b3Iocz0xLHI9MCxxPSExLHA9MDtwPGY7KytwKXtvPUMueEIuVyhlLHApCmlmKG89PT0xMCl7aWYociE9
+PXB8fCFxKSsrcwpyPXArMQpxPSExfWVsc2UgaWYobz09PTEzKXsrK3MKcj1wKzEKcT0hMH19Zz1zPjE/
+ZysoIiAoYXQgbGluZSAiK3MrIiwgY2hhcmFjdGVyICIrKGYtcisxKSsiKVxuIik6ZysoIiAoYXQgY2hh
+cmFjdGVyICIrKGYrMSkrIilcbiIpCm49ZS5sZW5ndGgKZm9yKHA9ZjtwPG47KytwKXtvPUMueEIubShl
+LHApCmlmKG89PT0xMHx8bz09PTEzKXtuPXAKYnJlYWt9fWlmKG4tcj43OClpZihmLXI8NzUpe209cis3
+NQpsPXIKaz0iIgpqPSIuLi4ifWVsc2V7aWYobi1mPDc1KXtsPW4tNzUKbT1uCmo9IiJ9ZWxzZXtsPWYt
+MzYKbT1mKzM2Cmo9Ii4uLiJ9az0iLi4uIn1lbHNle209bgpsPXIKaz0iIgpqPSIifWk9Qy54Qi5Oaihl
+LGwsbSkKcmV0dXJuIGcraytpK2orIlxuIitDLnhCLkl4KCIgIixmLWwray5sZW5ndGgpKyJeXG4ifWVs
+c2UgcmV0dXJuIGYhPW51bGw/ZysoIiAoYXQgb2Zmc2V0ICIrSC5kKGYpKyIpIik6Z319ClAuRUgucHJv
+dG90eXBlPXt9ClAuS04ucHJvdG90eXBlPXt9ClAuY1gucHJvdG90eXBlPXsKZXY6ZnVuY3Rpb24oYSxi
+KXt2YXIgdD1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0aGlzLHQuQygiYTIoY1guRSkiKS5iKGIp
+LHQuQygiVTU8Y1guRT4iKSl9LApnQTpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuZ2t6KHRoaXMpCmZv
+cih0PTA7cy5GKCk7KSsrdApyZXR1cm4gdH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5na3oo
+dGhpcykuRigpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5na3oodGhpcykKaWYoIXMuRigp
+KXRocm93IEguYihILldwKCkpCnQ9cy5nbCgpCmlmKHMuRigpKXRocm93IEguYihILmRVKCkpCnJldHVy
+biB0fSwKRTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpQLmsxKGIsImluZGV4IikKZm9yKHQ9dGhpcy5n
+a3oodGhpcykscz0wO3QuRigpOyl7cj10LmdsKCkKaWYoYj09PXMpcmV0dXJuIHI7KytzfXRocm93IEgu
+YihQLkNmKGIsdGhpcywiaW5kZXgiLG51bGwscykpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5FUCh0
+aGlzLCIoIiwiKSIpfX0KUC5Bbi5wcm90b3R5cGU9e30KUC56TS5wcm90b3R5cGU9eyRpY1g6MX0KUC5a
+MC5wcm90b3R5cGU9e30KUC5jOC5wcm90b3R5cGU9ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFAuay5w
+cm90b3R5cGUuZ2lPLmNhbGwodGhpcyx0aGlzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifX0K
+UC5GSy5wcm90b3R5cGU9e30KUC5rLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UC5rLCRpazoxLApETjpm
+dW5jdGlvbihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUSh0
+aGlzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0guZChILk0odGhpcykpKyIn
+In0sCmU3OmZ1bmN0aW9uKGEsYil7dS5vLmIoYikKdGhyb3cgSC5iKFAubHIodGhpcyxiLmdXYSgpLGIu
+Z25kKCksYi5nVm0oKSkpfSwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53KHRoaXMpfX0K
+UC5PZC5wcm90b3R5cGU9e30KUC5pYi5wcm90b3R5cGU9eyRpT2Q6MX0KUC54dS5wcm90b3R5cGU9e30K
+UC5Hei5wcm90b3R5cGU9e30KUC5xVS5wcm90b3R5cGU9eyRpdlg6MX0KUC5Sbi5wcm90b3R5cGU9ewpn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
+cy5hCnJldHVybiB0LmNoYXJDb2RlQXQoMCk9PTA/dDp0fSwKJGlCTDoxfQpQLkdELnByb3RvdHlwZT17
+fQpQLm4xLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKdS5mLmIoYSkKSC55
+KGIpCnQ9Si5yWShiKS5PWShiLCI9IikKaWYodD09PS0xKXtpZihiIT09IiIpYS5ZKDAsUC5rdShiLDAs
+Yi5sZW5ndGgsdGhpcy5hLCEwKSwiIil9ZWxzZSBpZih0IT09MCl7cz1DLnhCLk5qKGIsMCx0KQpyPUMu
+eEIuRyhiLHQrMSkKcT10aGlzLmEKYS5ZKDAsUC5rdShzLDAscy5sZW5ndGgscSwhMCksUC5rdShyLDAs
+ci5sZW5ndGgscSwhMCkpfXJldHVybiBhfSwKJFM6MjZ9ClAuY1MucHJvdG90eXBlPXsKJDI6ZnVuY3Rp
+b24oYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSx0aGlzLmEsYikp
+fSwKJFM6MjN9ClAuVkMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5ycigi
+SWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMuJDIoYSxudWxsKX0sCiRTOjIyfQpQLnRwLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dmFyIHQKaWYoYi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1h
+eGltdW0gb2YgNCBoZXggZGlnaXRzIixhKQp0PVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSxudWxsLDE2
+KQppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQppZih0PDB8fHQ+NjU1MzUpdGhpcy5h
+LiQyKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDB4MC4uMHhGRkZGYCIsYSkKcmV0
+dXJuIHR9LAokUzoxOH0KUC5Ebi5wcm90b3R5cGU9ewpna3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5i
+fSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYwppZih0PT1udWxsKXJldHVybiIiCmlmKEMueEIu
+bih0LCJbIikpcmV0dXJuIEMueEIuTmoodCwxLHQubGVuZ3RoLTEpCnJldHVybiB0fSwKZ3RwOmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuZAppZih0PT1udWxsKXJldHVybiBQLndLKHRoaXMuYSkKcmV0dXJuIHR9
+LApndFA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmYKcmV0dXJuIHQ9PW51bGw/IiI6dH0sCmdLYTpmdW5j
+dGlvbigpe3ZhciB0PXRoaXMucgpyZXR1cm4gdD09bnVsbD8iIjp0fSwKbm06ZnVuY3Rpb24oYSxiKXt2
+YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwp1LlguYihudWxsKQp1LmEuYihiKQp0PWwuYQpzPXQ9PT0i
+ZmlsZSIKcj1sLmIKcT1sLmQKcD1sLmMKaWYoIShwIT1udWxsKSlwPXIubGVuZ3RoIT09MHx8cSE9bnVs
+bHx8cz8iIjpudWxsCm89bC5lCmlmKCFzKW49cCE9bnVsbCYmby5sZW5ndGghPT0wCmVsc2Ugbj0hMApp
+ZihuJiYhQy54Qi5uKG8sIi8iKSlvPSIvIitvCmlmKGIhPW51bGwpbT1QLmxlKG51bGwsMCwwLGIpCmVs
+c2UgbT1sLmYKcmV0dXJuIG5ldyBQLkRuKHQscixwLHEsbyxtLGwucil9LApnRmo6ZnVuY3Rpb24oKXt2
+YXIgdCxzPXRoaXMueAppZihzIT1udWxsKXJldHVybiBzCnQ9dGhpcy5lCmlmKHQubGVuZ3RoIT09MCYm
+Qy54Qi5XKHQsMCk9PT00Nyl0PUMueEIuRyh0LDEpCnM9dD09PSIiP0MueEQ6UC5BRihuZXcgSC5BOChI
+LlZNKHQuc3BsaXQoIi8iKSx1LnMpLHUuZE8uYihQLlBIKCkpLHUuZG8pLHUuTikKdGhpcy5zbzYocykK
+cmV0dXJuIHN9LApnaFk6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMKaWYocy5RPT1udWxsKXt0PXMuZgpz
+LnNSSChuZXcgUC5HaihQLldYKHQ9PW51bGw/IiI6dCksdS5UKSl9cmV0dXJuIHMuUX0sCkpoOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscyxyLHEscCxvCmZvcih0PTAscz0wO0MueEIuUWkoYiwiLi4vIixzKTspe3Mr
+PTM7Kyt0fXI9Qy54Qi5jbihhLCIvIikKd2hpbGUoITApe2lmKCEocj4wJiZ0PjApKWJyZWFrCnE9Qy54
+Qi5QayhhLCIvIixyLTEpCmlmKHE8MClicmVhawpwPXItcQpvPXAhPT0yCmlmKCFvfHxwPT09MylpZihD
+LnhCLm0oYSxxKzEpPT09NDYpbz0hb3x8Qy54Qi5tKGEscSsyKT09PTQ2CmVsc2Ugbz0hMQplbHNlIG89
+ITEKaWYobylicmVhazstLXQKcj1xfXJldHVybiBDLnhCLmk3KGEscisxLG51bGwsQy54Qi5HKGIscy0z
+KnQpKX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPW51bGwKaWYoYS5nRmkoKS5sZW5ndGghPT0w
+KXt0PWEuZ0ZpKCkKaWYoYS5nY2ooKSl7cz1hLmdrdSgpCnI9YS5nSmYoYSkKcT1hLmd4QSgpP2EuZ3Rw
+KGEpOmp9ZWxzZXtxPWoKcj1xCnM9IiJ9cD1QLnhlKGEuZ0lpKGEpKQpvPWEuZ1FEKCk/YS5ndFAoKTpq
+fWVsc2V7dD1rLmEKaWYoYS5nY2ooKSl7cz1hLmdrdSgpCnI9YS5nSmYoYSkKcT1QLndCKGEuZ3hBKCk/
+YS5ndHAoYSk6aix0KQpwPVAueGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UCgpOmp9ZWxzZXtzPWsu
+YgpyPWsuYwpxPWsuZAppZihhLmdJaShhKT09PSIiKXtwPWsuZQpvPWEuZ1FEKCk/YS5ndFAoKTprLmZ9
+ZWxzZXtpZihhLmd0VCgpKXA9UC54ZShhLmdJaShhKSkKZWxzZXtuPWsuZQppZihuLmxlbmd0aD09PTAp
+aWYocj09bnVsbClwPXQubGVuZ3RoPT09MD9hLmdJaShhKTpQLnhlKGEuZ0lpKGEpKQplbHNlIHA9UC54
+ZSgiLyIrYS5nSWkoYSkpCmVsc2V7bT1rLkpoKG4sYS5nSWkoYSkpCmw9dC5sZW5ndGg9PT0wCmlmKCFs
+fHxyIT1udWxsfHxDLnhCLm4obiwiLyIpKXA9UC54ZShtKQplbHNlIHA9UC53RihtLCFsfHxyIT1udWxs
+KX19bz1hLmdRRCgpP2EuZ3RQKCk6an19fXJldHVybiBuZXcgUC5Ebih0LHMscixxLHAsbyxhLmdaOCgp
+P2EuZ0thKCk6ail9LApnY2o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jIT1udWxsfSwKZ3hBOmZ1bmN0
+aW9uKCl7cmV0dXJuIHRoaXMuZCE9bnVsbH0sCmdRRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmYhPW51
+bGx9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yIT1udWxsfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0
+dXJuIEMueEIubih0aGlzLmUsIi8iKX0sCnQ0OmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRoaXMscT1yLmEK
+aWYocSE9PSIiJiZxIT09ImZpbGUiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUg
+cGF0aCBmcm9tIGEgIitILmQocSkrIiBVUkkiKSkKcT1yLmYKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0
+aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEg
+cXVlcnkgY29tcG9uZW50IikpCnE9ci5yCmlmKChxPT1udWxsPyIiOnEpIT09IiIpdGhyb3cgSC5iKFAu
+TDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNv
+bXBvbmVudCIpKQp0PSQud1EoKQppZihILm9UKHQpKXE9UC5tbihyKQplbHNle2lmKHIuYyE9bnVsbCYm
+ci5nSmYocikhPT0iIilILnZoKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBw
+YXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhvcml0eSIpKQpzPXIuZ0ZqKCkKUC5rRShzLCEx
+KQpxPVAudmcoQy54Qi5uKHIuZSwiLyIpPyIvIjoiIixzLCIvIikKcT1xLmNoYXJDb2RlQXQoMCk9PTA/
+cTpxfXJldHVybiBxfSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT10aGlzLHA9cS55CmlmKHA9PW51
+bGwpe3A9cS5hCnQ9cC5sZW5ndGghPT0wP3ArIjoiOiIiCnM9cS5jCnI9cz09bnVsbAppZighcnx8cD09
+PSJmaWxlIil7cD10KyIvLyIKdD1xLmIKaWYodC5sZW5ndGghPT0wKXA9cCt0KyJAIgppZighcilwKz1z
+CnQ9cS5kCmlmKHQhPW51bGwpcD1wKyI6IitILmQodCl9ZWxzZSBwPXQKcCs9cS5lCnQ9cS5mCmlmKHQh
+PW51bGwpcD1wKyI/Iit0CnQ9cS5yCmlmKHQhPW51bGwpcD1wKyIjIit0CnA9cS55PXAuY2hhckNvZGVB
+dCgwKT09MD9wOnB9cmV0dXJuIHB9LApETjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCmlmKGI9
+PW51bGwpcmV0dXJuITEKaWYocj09PWIpcmV0dXJuITAKaWYodS53LmMoYikpaWYoci5hPT1iLmdGaSgp
+KWlmKHIuYyE9bnVsbD09PWIuZ2NqKCkpaWYoci5iPT1iLmdrdSgpKWlmKHIuZ0pmKHIpPT1iLmdKZihi
+KSlpZihyLmd0cChyKT09Yi5ndHAoYikpaWYoci5lPT09Yi5nSWkoYikpe3Q9ci5mCnM9dD09bnVsbApp
+Zighcz09PWIuZ1FEKCkpe2lmKHMpdD0iIgppZih0PT09Yi5ndFAoKSl7dD1yLnIKcz10PT1udWxsCmlm
+KCFzPT09Yi5nWjgoKSl7aWYocyl0PSIiCnQ9dD09PWIuZ0thKCl9ZWxzZSB0PSExfWVsc2UgdD0hMX1l
+bHNlIHQ9ITF9ZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQpl
+bHNlIHQ9ITEKZWxzZSB0PSExCnJldHVybiB0fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuegpy
+ZXR1cm4gdD09bnVsbD90aGlzLno9Qy54Qi5naU8odGhpcy53KDApKTp0fSwKc282OmZ1bmN0aW9uKGEp
+e3RoaXMueD11LmkuYihhKX0sCnNSSDpmdW5jdGlvbihhKXt0aGlzLlE9dS5mLmIoYSl9LAokaWlEOjEs
+CmdGaTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+ZX19ClAuZTEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAucnIoIkludmFsaWQg
+cG9ydCIsdGhpcy5hLHRoaXMuYisxKSl9LAokUzoxN30KUC5OWS5wcm90b3R5cGU9ewokMTpmdW5jdGlv
+bihhKXt2YXIgdD0iSWxsZWdhbCBwYXRoIGNoYXJhY3RlciAiCkgueShhKQppZihKLnpsKGEsIi8iKSlp
+Zih0aGlzLmEpdGhyb3cgSC5iKFAueFkodCthKSkKZWxzZSB0aHJvdyBILmIoUC5MNCh0K2EpKX0sCiRT
+OjE3fQpQLlJaLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBQLmVQKEMuWkosYSxDLnhN
+LCExKX0sCiRTOjZ9ClAuTUUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmIs
+cz10aGlzLmEKdC5hKz1zLmEKcy5hPSImIgpzPXQuYSs9SC5kKFAuZVAoQy5GMyxhLEMueE0sITApKQpp
+ZihiIT1udWxsJiZiLmxlbmd0aCE9PTApe3QuYT1zKyI9Igp0LmErPUguZChQLmVQKEMuRjMsYixDLnhN
+LCEwKSl9fSwKJFM6MTl9ClAueTUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCkgu
+eShhKQppZihiPT1udWxsfHx0eXBlb2YgYj09InN0cmluZyIpdGhpcy5hLiQyKGEsSC55KGIpKQplbHNl
+IGZvcih0PUouSVQodS5SLmIoYikpLHM9dGhpcy5hO3QuRigpOylzLiQyKGEsSC55KHQuZ2woKSkpfSwK
+JFM6MTZ9ClAuUEUucHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLG89
+bnVsbCxuPXAuYwppZihuIT1udWxsKXJldHVybiBuCm49cC5iCmlmKDA+PW4ubGVuZ3RoKXJldHVybiBI
+Lk9IKG4sMCkKdD1wLmEKbj1uWzBdKzEKcz1DLnhCLlhVKHQsIj8iLG4pCnI9dC5sZW5ndGgKaWYocz49
+MCl7cT1QLnVPKHQscysxLHIsQy5WQywhMSkKcj1zfWVsc2UgcT1vCnJldHVybiBwLmM9bmV3IFAucWUo
+ImRhdGEiLG8sbyxvLFAudU8odCxuLHIsQy5XZCwhMSkscSxvKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQs
+cz10aGlzLmIKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywwKQp0PXRoaXMuYQpyZXR1cm4gc1sw
+XT09PS0xPyJkYXRhOiIrdDp0fX0KUC5xMy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
+bmV3IFVpbnQ4QXJyYXkoOTYpfSwKJFM6MjB9ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxi
+KXt2YXIgdD10aGlzLmEKaWYoYT49dC5sZW5ndGgpcmV0dXJuIEguT0godCxhKQp0PXRbYV0KSi5DTSh0
+LDAsOTYsYikKcmV0dXJuIHR9LAokUzoyMX0KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIs
+Yyl7dmFyIHQscyxyLHEKZm9yKHQ9Yi5sZW5ndGgscz1hLmxlbmd0aCxyPTA7cjx0Oysrcil7cT1DLnhC
+LlcoYixyKV45NgppZihxPj1zKXJldHVybiBILk9IKGEscSkKYVtxXT1jfX19ClAucWQucHJvdG90eXBl
+PXsKJDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmZvcih0PUMueEIuVyhiLDApLHM9Qy54Qi5X
+KGIsMSkscj1hLmxlbmd0aDt0PD1zOysrdCl7cT0odF45Nik+Pj4wCmlmKHE+PXIpcmV0dXJuIEguT0go
+YSxxKQphW3FdPWN9fX0KUC5VZi5wcm90b3R5cGU9ewpnY2o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5j
+PjB9LApneEE6ZnVuY3Rpb24oKXt2YXIgdCxzCmlmKHRoaXMuYz4wKXt0PXRoaXMuZAppZih0eXBlb2Yg
+dCE9PSJudW1iZXIiKXJldHVybiB0LmgoKQpzPXRoaXMuZQppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJl
+dHVybiBILnBZKHMpCnM9dCsxPHMKdD1zfWVsc2UgdD0hMQpyZXR1cm4gdH0sCmdRRDpmdW5jdGlvbigp
+e3ZhciB0PXRoaXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4gdDx0
+aGlzLnJ9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6ZnVu
+Y3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ3ZoOmZ1bmN0
+aW9uKCl7cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdxQjpmdW5jdGlv
+bigpe3JldHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0aW9u
+KCl7cmV0dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFyIHQs
+cz10aGlzLHI9InBhY2thZ2UiLHE9cy5iCmlmKHE8PTApcmV0dXJuIiIKdD1zLngKaWYodCE9bnVsbCly
+ZXR1cm4gdAppZihzLmd2aCgpKXE9cy54PSJodHRwIgplbHNlIGlmKHMuZ3FCKCkpe3MueD0iaHR0cHMi
+CnE9Imh0dHBzIn1lbHNlIGlmKHMuZ053KCkpe3MueD0iZmlsZSIKcT0iZmlsZSJ9ZWxzZSBpZihxPT09
+NyYmQy54Qi5uKHMuYSxyKSl7cy54PXIKcT1yfWVsc2V7cT1DLnhCLk5qKHMuYSwwLHEpCnMueD1xfXJl
+dHVybiBxfSwKZ2t1OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jLHM9dGhpcy5iKzMKcmV0dXJuIHQ+cz9D
+LnhCLk5qKHRoaXMuYSxzLHQtMSk6IiJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCnJldHVy
+biB0PjA/Qy54Qi5Oaih0aGlzLmEsdCx0aGlzLmQpOiIifSwKZ3RwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9
+dGhpcwppZihzLmd4QSgpKXt0PXMuZAppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LmgoKQpy
+ZXR1cm4gUC5RQShDLnhCLk5qKHMuYSx0KzEscy5lKSxudWxsLG51bGwpfWlmKHMuZ3ZoKCkpcmV0dXJu
+IDgwCmlmKHMuZ3FCKCkpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCmdJaTpmdW5jdGlvbihhKXtyZXR1cm4g
+Qy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9LApndFA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmYs
+cz10aGlzLnIKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5KKCkKcmV0dXJuIHQ8cz9DLnhC
+Lk5qKHRoaXMuYSx0KzEscyk6IiJ9LApnS2E6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnIscz10aGlzLmEK
+cmV0dXJuIHQ8cy5sZW5ndGg/Qy54Qi5HKHMsdCsxKToiIn0sCmdGajpmdW5jdGlvbigpe3ZhciB0LHMs
+cj10aGlzLmUscT10aGlzLmYscD10aGlzLmEKaWYoQy54Qi5RaShwLCIvIixyKSl7aWYodHlwZW9mIHIh
+PT0ibnVtYmVyIilyZXR1cm4gci5oKCk7KytyfWlmKHI9PXEpcmV0dXJuIEMueEQKdD1ILlZNKFtdLHUu
+cykKcz1yCndoaWxlKCEwKXtpZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkooKQppZih0eXBl
+b2YgcSE9PSJudW1iZXIiKXJldHVybiBILnBZKHEpCmlmKCEoczxxKSlicmVhawppZihDLnhCLm0ocCxz
+KT09PTQ3KXtDLk5tLmkodCxDLnhCLk5qKHAscixzKSkKcj1zKzF9KytzfUMuTm0uaSh0LEMueEIuTmoo
+cCxyLHEpKQpyZXR1cm4gUC5BRih0LHUuTil9LApnaFk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmYKaWYo
+dHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5KKCkKaWYodD49dGhpcy5yKXJldHVybiBDLldPCnJl
+dHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHUuVCl9LAprWDpmdW5jdGlvbihhKXt2YXIgdCxz
+PXRoaXMuZAppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLmgoKQp0PXMrMQpyZXR1cm4gdCth
+Lmxlbmd0aD09PXRoaXMuZSYmQy54Qi5RaSh0aGlzLmEsYSx0KX0sCk45OmZ1bmN0aW9uKCl7dmFyIHQ9
+dGhpcyxzPXQucixyPXQuYQppZihzPj1yLmxlbmd0aClyZXR1cm4gdApyZXR1cm4gbmV3IFAuVWYoQy54
+Qi5OaihyLDAscyksdC5iLHQuYyx0LmQsdC5lLHQuZixzLHQueCl9LApubTpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHMscixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbAp1LlguYihudWxsKQp1LmEuYihiKQp0
+PWkuZ0ZpKCkKcz10PT09ImZpbGUiCnI9aS5jCnE9cj4wP0MueEIuTmooaS5hLGkuYiszLHIpOiIiCnA9
+aS5neEEoKT9pLmd0cChpKTpoCnI9aS5jCmlmKHI+MClvPUMueEIuTmooaS5hLHIsaS5kKQplbHNlIG89
+cS5sZW5ndGghPT0wfHxwIT1udWxsfHxzPyIiOmgKcj1pLmEKbj1pLmYKbT1DLnhCLk5qKHIsaS5lLG4p
+CmlmKCFzKWw9byE9bnVsbCYmbS5sZW5ndGghPT0wCmVsc2UgbD0hMAppZihsJiYhQy54Qi5uKG0sIi8i
+KSltPSIvIittCmlmKGIhPW51bGwpaz1QLmxlKGgsMCwwLGIpCmVsc2V7bD1pLnIKaWYodHlwZW9mIG4h
+PT0ibnVtYmVyIilyZXR1cm4gbi5KKCkKaz1uPGw/Qy54Qi5OaihyLG4rMSxsKTpofW49aS5yCmo9bjxy
+Lmxlbmd0aD9DLnhCLkcocixuKzEpOmgKcmV0dXJuIG5ldyBQLkRuKHQscSxvLHAsbSxrLGopfSwKWkk6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXtpZihhIGlu
+c3RhbmNlb2YgUC5VZilyZXR1cm4gdGhpcy51MSh0aGlzLGEpCnJldHVybiB0aGlzLlJlKCkubVMoYSl9
+LAp1MTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlPWIuYgpp
+ZihlPjApcmV0dXJuIGIKdD1iLmMKaWYodD4wKXtzPWEuYgppZihzPD0wKXJldHVybiBiCmlmKGEuZ053
+KCkpcj1iLmUhPWIuZgplbHNlIGlmKGEuZ3ZoKCkpcj0hYi5rWCgiODAiKQplbHNlIHI9IWEuZ3FCKCl8
+fCFiLmtYKCI0NDMiKQppZihyKXtxPXMrMQpwPUMueEIuTmooYS5hLDAscSkrQy54Qi5HKGIuYSxlKzEp
+CmU9Yi5kCmlmKHR5cGVvZiBlIT09Im51bWJlciIpcmV0dXJuIGUuaCgpCm89Yi5lCmlmKHR5cGVvZiBv
+IT09Im51bWJlciIpcmV0dXJuIG8uaCgpCm49Yi5mCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJu
+IG4uaCgpCnJldHVybiBuZXcgUC5VZihwLHMsdCtxLGUrcSxvK3EsbitxLGIucitxLGEueCl9ZWxzZSBy
+ZXR1cm4gdGhpcy5SZSgpLm1TKGIpfW09Yi5lCmU9Yi5mCmlmKG09PWUpe3Q9Yi5yCmlmKHR5cGVvZiBl
+IT09Im51bWJlciIpcmV0dXJuIGUuSigpCmlmKGU8dCl7cz1hLmYKaWYodHlwZW9mIHMhPT0ibnVtYmVy
+IilyZXR1cm4gcy5ITigpCnE9cy1lCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHMpK0MueEIu
+RyhiLmEsZSksYS5iLGEuYyxhLmQsYS5lLGUrcSx0K3EsYS54KX1lPWIuYQppZih0PGUubGVuZ3RoKXtz
+PWEucgpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxzKStDLnhCLkcoZSx0KSxhLmIsYS5jLGEu
+ZCxhLmUsYS5mLHQrKHMtdCksYS54KX1yZXR1cm4gYS5OOSgpfXQ9Yi5hCmlmKEMueEIuUWkodCwiLyIs
+bSkpe3M9YS5lCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQppZih0eXBlb2YgbSE9
+PSJudW1iZXIiKXJldHVybiBILnBZKG0pCnE9cy1tCnA9Qy54Qi5OaihhLmEsMCxzKStDLnhCLkcodCxt
+KQppZih0eXBlb2YgZSE9PSJudW1iZXIiKXJldHVybiBlLmgoKQpyZXR1cm4gbmV3IFAuVWYocCxhLmIs
+YS5jLGEuZCxzLGUrcSxiLnIrcSxhLngpfWw9YS5lCms9YS5mCmlmKGw9PWsmJmEuYz4wKXtmb3IoO0Mu
+eEIuUWkodCwiLi4vIixtKTspe2lmKHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIG0uaCgpCm0rPTN9
+aWYodHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gbC5ITigpCmlmKHR5cGVvZiBtIT09Im51bWJlciIp
+cmV0dXJuIEgucFkobSkKcT1sLW0rMQpwPUMueEIuTmooYS5hLDAsbCkrIi8iK0MueEIuRyh0LG0pCmlm
+KHR5cGVvZiBlIT09Im51bWJlciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcgUC5VZihwLGEuYixhLmMs
+YS5kLGwsZStxLGIucitxLGEueCl9aj1hLmEKZm9yKGk9bDtDLnhCLlFpKGosIi4uLyIsaSk7KXtpZih0
+eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBpLmgoKQppKz0zfWg9MAp3aGlsZSghMCl7aWYodHlwZW9m
+IG0hPT0ibnVtYmVyIilyZXR1cm4gbS5oKCkKZz1tKzMKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1
+cm4gSC5wWShlKQppZighKGc8PWUmJkMueEIuUWkodCwiLi4vIixtKSkpYnJlYWs7KytoCm09Z31mPSIi
+CndoaWxlKCEwKXtpZih0eXBlb2YgayE9PSJudW1iZXIiKXJldHVybiBrLm9zKCkKaWYodHlwZW9mIGkh
+PT0ibnVtYmVyIilyZXR1cm4gSC5wWShpKQppZighKGs+aSkpYnJlYWs7LS1rCmlmKEMueEIubShqLGsp
+PT09NDcpe2lmKGg9PT0wKXtmPSIvIgpicmVha30tLWgKZj0iLyJ9fWlmKGs9PT1pJiZhLmI8PTAmJiFD
+LnhCLlFpKGosIi8iLGwpKXttLT1oKjMKZj0iIn1xPWstbStmLmxlbmd0aApyZXR1cm4gbmV3IFAuVWYo
+Qy54Qi5OaihqLDAsaykrZitDLnhCLkcodCxtKSxhLmIsYS5jLGEuZCxsLGUrcSxiLnIrcSxhLngpfSwK
+dDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMKaWYocC5iPj0wJiYhcC5nTncoKSl0aHJvdyBI
+LmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIrSC5kKHAuZ0ZpKCkpKyIg
+VVJJIikpCnQ9cC5mCnM9cC5hCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCmlmKHQ8
+cy5sZW5ndGgpe2lmKHQ8cC5yKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0
+aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKdGhyb3cgSC5iKFAuTDQoIkNhbm5v
+dCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIGZyYWdtZW50IGNvbXBvbmVudCIp
+KX1yPSQud1EoKQppZihILm9UKHIpKXQ9UC5tbihwKQplbHNle3E9cC5kCmlmKHR5cGVvZiBxIT09Im51
+bWJlciIpcmV0dXJuIEgucFkocSkKaWYocC5jPHEpSC52aChQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIG5v
+bi1XaW5kb3dzIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkgd2l0aCBhbiBhdXRob3JpdHkiKSkKdD1D
+LnhCLk5qKHMscC5lLHQpfXJldHVybiB0fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMueQpyZXR1
+cm4gdD09bnVsbD90aGlzLnk9Qy54Qi5naU8odGhpcy5hKTp0fSwKRE46ZnVuY3Rpb24oYSxiKXtpZihi
+PT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJldHVybiEwCnJldHVybiB1LncuYyhiKSYmdGhpcy5h
+PT09Yi53KDApfSwKUmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9bnVsbCxyPXQuZ0ZpKCkscT10Lmdr
+dSgpLHA9dC5jPjA/dC5nSmYodCk6cyxvPXQuZ3hBKCk/dC5ndHAodCk6cyxuPXQuYSxtPXQuZixsPUMu
+eEIuTmoobix0LmUsbSksaz10LnIKaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5KKCkKbT1t
+PGs/dC5ndFAoKTpzCnJldHVybiBuZXcgUC5EbihyLHEscCxvLGwsbSxrPG4ubGVuZ3RoP3QuZ0thKCk6
+cyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokaWlEOjF9ClAucWUucHJvdG90eXBlPXt9
+ClcucUUucHJvdG90eXBlPXt9ClcuR2gucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3Ry
+aW5nKGEpfSwKJGlHaDoxfQpXLmZZLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmlu
+ZyhhKX19ClcubkIucHJvdG90eXBlPXskaW5COjF9ClcuQXoucHJvdG90eXBlPXskaUF6OjF9ClcuUVAu
+cHJvdG90eXBlPXskaVFQOjF9ClcubngucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
+bGVuZ3RofX0KVy5vSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpX
+LmlkLnByb3RvdHlwZT17fQpXLlFGLnByb3RvdHlwZT17fQpXLk5oLnByb3RvdHlwZT17Cnc6ZnVuY3Rp
+b24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcuSUIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
+cm4iUmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRo
+KSsiIHggIitILmQoYS5oZWlnaHQpfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiEx
+CnJldHVybiB1LnEuYyhiKSYmYS5sZWZ0PT09Yi5sZWZ0JiZhLnRvcD09PWIudG9wJiZhLndpZHRoPT09
+Yi53aWR0aCYmYS5oZWlnaHQ9PT1iLmhlaWdodH0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gVy5yRShD
+LkNELmdpTyhhLmxlZnQpLEMuQ0QuZ2lPKGEudG9wKSxDLkNELmdpTyhhLndpZHRoKSxDLkNELmdpTyhh
+LmhlaWdodCkpfSwKJGl0bjoxfQpXLm43LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
+Lmxlbmd0aH19Clcud3oucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5sZW5n
+dGh9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHQKSC5TYyhiKQp0PXRoaXMuYQppZihiPDB8fGI+PXQubGVu
+Z3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRoaXMuJHRpLmQuYih0W2JdKX0sClk6ZnVuY3Rpb24o
+YSxiLGMpe3RoaXMuJHRpLmQuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBsaXN0Iikp
+fX0KVy5jdi5wcm90b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLmk3KGEpfSwKZ0Q6
+ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkk0KGEpfSwKc0Q6ZnVuY3Rpb24oYSxiKXt2YXIgdAp1Llgu
+YihiKQp0PXRoaXMuZ0QoYSkKdC5WMSgwKQp0LkZWKDAsYil9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBh
+LmxvY2FsTmFtZX0sCnRuOmZ1bmN0aW9uKGEpe3ZhciB0PSEhYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVk
+CmlmKHQpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxzZSBhLnNjcm9sbEludG9WaWV3KCl9LApy
+NjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscQppZihjPT1udWxsKXtpZihkPT1udWxsKXt0PSQu
+bHQKaWYodD09bnVsbCl7dD1ILlZNKFtdLHUubSkKcz1uZXcgVy52RCh0KQpDLk5tLmkodCxXLlR3KG51
+bGwpKQpDLk5tLmkodCxXLkJsKCkpCiQubHQ9cwpkPXN9ZWxzZSBkPXR9dD0kLkVVCmlmKHQ9PW51bGwp
+e3Q9bmV3IFcuS28oZCkKJC5FVT10CmM9dH1lbHNle3QuYT1kCmM9dH19ZWxzZSBpZihkIT1udWxsKXRo
+cm93IEguYihQLnhZKCJ2YWxpZGF0b3IgY2FuIG9ubHkgYmUgcGFzc2VkIGlmIHRyZWVTYW5pdGl6ZXIg
+aXMgbnVsbCIpKQppZigkLnhvPT1udWxsKXt0PWRvY3VtZW50CnM9dC5pbXBsZW1lbnRhdGlvbi5jcmVh
+dGVIVE1MRG9jdW1lbnQoIiIpCiQueG89cwokLkJPPXMuY3JlYXRlUmFuZ2UoKQpzPSQueG8uY3JlYXRl
+RWxlbWVudCgiYmFzZSIpCnUuRi5iKHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5oZWFkLmFwcGVuZENo
+aWxkKHMpfXQ9JC54bwppZih0LmJvZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50KCJib2R5IikKdC5i
+b2R5PXUuWS5iKHMpfXQ9JC54bwppZih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9dC5jcmVhdGVFbGVt
+ZW50KGEudGFnTmFtZSkKJC54by5ib2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVhdGVDb250ZXh0dWFs
+RnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMuU3EsYS50YWdOYW1l
+KSl7JC5CTy5zZWxlY3ROb2RlQ29udGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVu
+dChiKX1lbHNle3IuaW5uZXJIVE1MPWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3Io
+O3Q9ci5maXJzdENoaWxkLHQhPW51bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhvLmJvZHkKaWYocj09
+bnVsbD90IT1udWxsOnIhPT10KUouTHQocikKYy5QbihxKQpkb2N1bWVudC5hZG9wdE5vZGUocSkKcmV0
+dXJuIHF9LApBSDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApzaGY6
+ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7YS50ZXh0Q29udGVu
+dD1udWxsCmEuYXBwZW5kQ2hpbGQodGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihhLGIp
+e3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuQ3Eo
+YSwiY2xpY2siLCExLHUuUSl9LAokaWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1l
+fX0KVy5Ddi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmModS5BLmIoYSkpfSwK
+JFM6NDR9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24o
+YSxiLGMsZCl7dS5VLmIoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApCOmZ1bmN0aW9uKGEs
+YixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJu
+IGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodS5VLmIoYyksMSksZCl9LAokaUQwOjF9ClcuVDUucHJv
+dG90eXBlPXskaVQ1OjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVu
+Z3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLlZi
+LnByb3RvdHlwZT17fQpXLk83LnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBh
+Lm9wZW4oYixjLCEwKX0sCiRpTzc6MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Ro
+aXMuYS5zZXRSZXF1ZXN0SGVhZGVyKEgueShhKSxILnkoYikpfSwKJFM6MTB9ClcuaEgucHJvdG90eXBl
+PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscAp1LnAuYihhKQp0PXRoaXMuYQpzPXQuc3RhdHVz
+CmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMudEIoKQpyPXM+PTIwMCYmczwzMDAKcT1zPjMw
+NyYmczw0MDAKcz1yfHxzPT09MHx8cz09PTMwNHx8cQpwPXRoaXMuYgppZihzKXtwLiR0aS5DKCIxLyIp
+LmIodCkKcz1wLmEKaWYocy5hIT09MClILnZoKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIp
+KQpzLlhmKHQpfWVsc2UgcC5wbShhKX0sCiRTOjI0fQpXLndhLnByb3RvdHlwZT17fQpXLlNnLnByb3Rv
+dHlwZT17JGlTZzoxfQpXLnU4LnByb3RvdHlwZT17CmdEcjpmdW5jdGlvbihhKXtpZigib3JpZ2luIiBp
+biBhKXJldHVybiBhLm9yaWdpbgpyZXR1cm4gSC5kKGEucHJvdG9jb2wpKyIvLyIrSC5kKGEuaG9zdCl9
+LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90eXBlPXsk
+aUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQuY2hp
+bGROb2Rlcy5sZW5ndGgKaWYocz09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlmKHM+
+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnJldHVybiB0LmZpcnN0Q2hp
+bGR9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuZWguYihiKQp0PWIuYQpzPXRoaXMuYQpp
+Zih0IT09cylmb3Iocj10LmNoaWxkTm9kZXMubGVuZ3RoLHE9MDtxPHI7KytxKXMuYXBwZW5kQ2hpbGQo
+dC5maXJzdENoaWxkKQpyZXR1cm59LApZOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCnUuQS5iKGMpCnQ9
+dGhpcy5hCnM9dC5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQp0
+LnJlcGxhY2VDaGlsZChjLHNbYl0pfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5jaGlsZE5v
+ZGVzCnJldHVybiBuZXcgVy5XOSh0LHQubGVuZ3RoLEgueksodCkuQygiVzk8R20uRT4iKSl9LApnQTpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIp
+e3ZhciB0CkguU2MoYikKdD10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8fGI+PXQubGVuZ3RoKXJldHVy
+biBILk9IKHQsYikKcmV0dXJuIHRbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEpe3Zh
+ciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlvbihh
+KXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7KWEucmVtb3ZlQ2hpbGQodCl9LAp3OmZ1
+bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0PT1udWxsP3RoaXMuVShhKTp0fSwKJGl1
+SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVu
+Y3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2Yo
+YixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9uKGEsYixjKXt1LkEuYihj
+KQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIp
+KX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0
+dXJuIGFbYl19LAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLlNOLnByb3RvdHlwZT17fQpXLmV3LnBy
+b3RvdHlwZT17JGlldzoxfQpXLmxwLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
+bmd0aH19ClcuVGIucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwppZigiY3Jl
+YXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlz
+LkRXKGEsYixjLGQpCnQ9Vy5VOSgiPHRhYmxlPiIrSC5kKGIpKyI8L3RhYmxlPiIsYyxkKQpzPWRvY3Vt
+ZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzLnRvU3RyaW5nCnQudG9TdHJpbmcKbmV3IFcuZTco
+cykuRlYoMCxuZXcgVy5lNyh0KSkKcmV0dXJuIHN9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9u
+KGEsYixjLGQpe3ZhciB0LHMscixxCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRv
+dy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVudApzPXQuY3Jl
+YXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixj
+LGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnIudG9TdHJpbmcKdD1uZXcgVy5l
+NyhyKQpxPXQuZ3I4KHQpCnMudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhzKS5GVigwLG5ldyBX
+LmU3KHEpKQpyZXR1cm4gc319ClcuQlQucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
+IHQscyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5
+cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVudApzPXQuY3JlYXRlRG9jdW1lbnRGcmFn
+bWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnQudG9TdHJpbmcK
+dD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnMudG9TdHJpbmcKci50b1N0cmluZwpuZXcgVy5lNyhzKS5G
+VigwLG5ldyBXLmU3KHIpKQpyZXR1cm4gc319ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxi
+LGMpe3ZhciB0LHMKYS50ZXh0Q29udGVudD1udWxsCnQ9YS5jb250ZW50CnQudG9TdHJpbmcKSi5iVCh0
+KQpzPXRoaXMucjYoYSxiLG51bGwsYykKYS5jb250ZW50LmFwcGVuZENoaWxkKHMpfSwKWUM6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIsbnVsbCl9LAokaXlZOjF9ClcudzYucHJvdG90eXBlPXt9
+ClcuSzUucHJvdG90eXBlPXskaUs1OjEsJGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNR
+LnByb3RvdHlwZT17JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJl
+Y3RhbmdsZSAoIitILmQoYS5sZWZ0KSsiLCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4
+ICIrSC5kKGEuaGVpZ2h0KX0sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1
+cm4gdS5xLmMoYikmJmEubGVmdD09PWIubGVmdCYmYS50b3A9PT1iLnRvcCYmYS53aWR0aD09PWIud2lk
+dGgmJmEuaGVpZ2h0PT09Yi5oZWlnaHR9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFcuckUoQy5DRC5n
+aU8oYS5sZWZ0KSxDLkNELmdpTyhhLnRvcCksQy5DRC5naU8oYS53aWR0aCksQy5DRC5naU8oYS5oZWln
+aHQpKX19ClcucmgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpm
+dW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5D
+ZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe3UuQS5i
+KGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3Qu
+IikpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpy
+ZXR1cm4gYVtiXX0sCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuRDkucHJvdG90eXBlPXsKSzpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAKdS5ELmIoYikKZm9yKHQ9dGhpcy5nVigpLHM9dC5sZW5ndGgs
+cj10aGlzLmEscT0wO3E8dC5sZW5ndGg7dC5sZW5ndGg9PT1zfHwoMCxILmxrKSh0KSwrK3Epe3A9dFtx
+XQpiLiQyKHAsci5nZXRBdHRyaWJ1dGUocCkpfX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10
+aGlzLmEuYXR0cmlidXRlcyxvPUguVk0oW10sdS5zKQpmb3IodD1wLmxlbmd0aCxzPXUuaDkscj0wO3I8
+dDsrK3Ipe2lmKHI+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscikKcT1zLmIocFtyXSkKaWYocS5uYW1l
+c3BhY2VVUkk9PW51bGwpQy5ObS5pKG8scS5uYW1lKX1yZXR1cm4gb319ClcuaTcucHJvdG90eXBlPXsK
+cTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuZ2V0QXR0cmlidXRlKEgueShiKSl9LApZOmZ1bmN0
+aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5nVigpLmxlbmd0aH19ClcuU3kucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0
+aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8oSC55KGIpKSl9LApZOmZ1bmN0aW9uKGEs
+YixjKXt0aGlzLmEuYS5zZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8oYiksYyl9LApLOmZ1bmN0aW9u
+KGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlzLHUuRC5iKGIpKSl9LApnVjpmdW5jdGlvbigpe3Zh
+ciB0PUguVk0oW10sdS5zKQp0aGlzLmEuSygwLG5ldyBXLkEzKHRoaXMsdCkpCnJldHVybiB0fSwKZ0E6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1YoKS5sZW5ndGh9LAprOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cj1ILlZNKGEuc3BsaXQoIi0iKSx1LnMpCmZvcih0PTE7dDxyLmxlbmd0aDsrK3Qpe3M9clt0XQppZihz
+Lmxlbmd0aD4wKUMuTm0uWShyLHQsc1swXS50b1VwcGVyQ2FzZSgpK0ouS1YocywxKSl9cmV0dXJuIEMu
+Tm0uSChyLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscApmb3IodD1hLmxlbmd0aCxzPTAs
+cj0iIjtzPHQ7KytzKXtxPWFbc10KcD1xLnRvTG93ZXJDYXNlKCkKcj0ocSE9PXAmJnM+MD9yKyItIjpy
+KStwfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5j
+dGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkco
+YSw1KSksYil9LAokUzoxMH0KVy5BMy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclko
+YSkubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjEw
+fQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpmb3Io
+dD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1KLlQw
+KHRbcl0pCmlmKHEubGVuZ3RoIT09MClwLmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7dGhp
+cy5hLmNsYXNzTmFtZT11LkMuYihhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
+LmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYxOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0
+ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHR9
+LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5h
+ZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQu
+Y29udGFpbnMoYikKdC5yZW1vdmUoYikKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhp
+cy5hLHUuWC5iKGIpKX19ClcuRmsucHJvdG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3EucHJv
+dG90eXBlPXt9ClcueEMucHJvdG90eXBlPXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihhKSl9LAokUzoyNX0KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5j
+dGlvbihhKXt2YXIgdAppZigkLm9yLmE9PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxDLmNt
+W3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEyOysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwKaTA6
+ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4oKS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0PSQub3IucSgwLEguZChXLnJTKGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEoMCwi
+Kjo6IitiKQppZih0PT1udWxsKXJldHVybiExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykpfSwK
+JGlrRjoxfQpXLkdtLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0
+aGlzLmdBKGEpLEgueksoYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0
+aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIs
+Yyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzoxNX0K
+Vy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5hLHRo
+aXMuYix0aGlzLmMpfSwKJFM6MTV9ClcubTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7
+dmFyIHQscyxyCnRoaXMuYS5GVigwLGMpCnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5ldyBX
+LldrKCkpCnRoaXMuYi5GVigwLHQpCnI9dGhpcy5jCnIuRlYoMCxDLnhEKQpyLkZWKDAscyl9LAppMDpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7
+dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiB0
+LmQuRHQoYykKZWxzZSBpZihyLnRnKDAsIio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9dC5i
+CmlmKHIudGcoMCxILmQocykrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6IitiKSly
+ZXR1cm4hMAplbHNlIGlmKHIudGcoMCxILmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50Zygw
+LCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5CSSxILnkoYSkpfSwKJFM6OH0KVy5Xay5wcm90b3R5cGU9
+ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo4fQpXLmN0LnBy
+b3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihi
+PT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIp
+PT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpm
+dW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6OiIrSC5kKEgueShhKSl9LAokUzo2fQpXLk93LnByb3Rv
+dHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcuYyhh
+KQppZih0JiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAKcmV0
+dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVy
+biExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24o
+KXt2YXIgdD10aGlzLHM9dC5jKzEscj10LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpy
+ZXR1cm4hMH10LnNwKG51bGwpCnQuYz1yCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5kVy5w
+cm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9Clcua0YucHJvdG90eXBlPXt9ClcubWsucHJvdG90eXBlPXsk
+aXkwOjF9ClcuS28ucHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7bmV3IFcuZm0odGhpcykuJDIoYSxu
+dWxsKX0sCkVQOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClKLkx0KGEpCmVsc2UgYi5yZW1vdmVDaGls
+ZChhKX0sCkk0OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPSEwLG49bnVsbCxtPW51bGwKdHJ5
+e249Si5pZyhhKQptPW4uYS5nZXRBdHRyaWJ1dGUoImlzIikKdS5oLmIoYSkKdD1mdW5jdGlvbihjKXtp
+ZighKGMuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkpcmV0dXJuIHRydWUKdmFyIGw9
+Yy5jaGlsZE5vZGVzCmlmKGMubGFzdENoaWxkJiZjLmxhc3RDaGlsZCE9PWxbbC5sZW5ndGgtMV0pcmV0
+dXJuIHRydWUKaWYoYy5jaGlsZHJlbilpZighKGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBIVE1MQ29sbGVj
+dGlvbnx8Yy5jaGlsZHJlbiBpbnN0YW5jZW9mIE5vZGVMaXN0KSlyZXR1cm4gdHJ1ZQp2YXIgaz0wCmlm
+KGMuY2hpbGRyZW4paz1jLmNoaWxkcmVuLmxlbmd0aApmb3IodmFyIGo9MDtqPGs7aisrKXt2YXIgaT1j
+LmNoaWxkcmVuW2pdCmlmKGkuaWQ9PSdhdHRyaWJ1dGVzJ3x8aS5uYW1lPT0nYXR0cmlidXRlcyd8fGku
+aWQ9PSdsYXN0Q2hpbGQnfHxpLm5hbWU9PSdsYXN0Q2hpbGQnfHxpLmlkPT0nY2hpbGRyZW4nfHxpLm5h
+bWU9PSdjaGlsZHJlbicpcmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpvPUgub1QodCk/ITA6IShh
+LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHEpe0guUnUocSl9cz0iZWxl
+bWVudCB1bnByaW50YWJsZSIKdHJ5e3M9Si5qKGEpfWNhdGNoKHEpe0guUnUocSl9dHJ5e3I9Vy5yUyhh
+KQp0aGlzLmtSKHUuaC5iKGEpLGIsbyxzLHIsdS5HLmIobiksSC55KG0pKX1jYXRjaChxKXtpZihILlJ1
+KHEpIGluc3RhbmNlb2YgUC51KXRocm93IHEKZWxzZXt0aGlzLkVQKGEsYikKd2luZG93CnA9IlJlbW92
+aW5nIGNvcnJ1cHRlZCBlbGVtZW50ICIrSC5kKHMpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVk
+Iil3aW5kb3cuY29uc29sZS53YXJuKHApfX19LAprUjpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIg
+dCxzLHIscSxwLG8sbj10aGlzCmlmKGMpe24uRVAoYSxiKQp3aW5kb3cKdD0iUmVtb3ZpbmcgZWxlbWVu
+dCBkdWUgdG8gY29ycnVwdGVkIGF0dHJpYnV0ZXMgb24gPCIrZCsiPiIKaWYodHlwZW9mIGNvbnNvbGUh
+PSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4odCkKcmV0dXJufWlmKCFuLmEuaTAoYSkpe24u
+RVAoYSxiKQp3aW5kb3cKdD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBlbGVtZW50IDwiK0guZChlKSsiPiBm
+cm9tICIrSC5kKGIpCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
+YXJuKHQpCnJldHVybn1pZihnIT1udWxsKWlmKCFuLmEuRWIoYSwiaXMiLGcpKXtuLkVQKGEsYikKd2lu
+ZG93CnQ9IlJlbW92aW5nIGRpc2FsbG93ZWQgdHlwZSBleHRlbnNpb24gPCIrSC5kKGUpKycgaXM9Iicr
+ZysnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHQp
+CnJldHVybn10PWYuZ1YoKQpzPUguVk0odC5zbGljZSgwKSxILnQ2KHQpLkMoImpkPDE+IikpCmZvcihy
+PWYuZ1YoKS5sZW5ndGgtMSx0PWYuYTtyPj0wOy0tcil7aWYocj49cy5sZW5ndGgpcmV0dXJuIEguT0go
+cyxyKQpxPXNbcl0KcD1uLmEKbz1KLmNIKHEpCkgueShxKQppZighcC5FYihhLG8sdC5nZXRBdHRyaWJ1
+dGUocSkpKXt3aW5kb3cKcD0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1dGUgPCIrSC5kKGUpKyIg
+IitxKyc9IicrSC5kKHQuZ2V0QXR0cmlidXRlKHEpKSsnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5k
+ZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHApCnQucmVtb3ZlQXR0cmlidXRlKHEpfX1pZih1LmFX
+LmMoYSkpbi5QbihhLmNvbnRlbnQpfSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9u
+KGEsYil7dmFyIHQscyxyLHEscD10aGlzLmEKc3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTpwLkk0KGEs
+YikKYnJlYWsKY2FzZSA4OmNhc2UgMTE6Y2FzZSAzOmNhc2UgNDpicmVhawpkZWZhdWx0OnAuRVAoYSxi
+KX10PWEubGFzdENoaWxkCmZvcihwPXUuQTtudWxsIT10Oyl7cz1udWxsCnRyeXtzPXQucHJldmlvdXNT
+aWJsaW5nfWNhdGNoKHIpe0guUnUocikKcT1wLmIodCkKYS5yZW1vdmVDaGlsZChxKQp0PW51bGwKcz1h
+Lmxhc3RDaGlsZH1pZih0IT1udWxsKXRoaXMuJDIodCxhKQp0PXAuYihzKX19LAokUzoyOH0KVy5MZS5w
+cm90b3R5cGU9e30KVy5LNy5wcm90b3R5cGU9e30KVy5yQi5wcm90b3R5cGU9e30KVy5YVy5wcm90b3R5
+cGU9e30KVy5vYS5wcm90b3R5cGU9e30KUC5pSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihhKXt2YXIg
+dCxzPXRoaXMuYSxyPXMubGVuZ3RoCmZvcih0PTA7dDxyOysrdClpZihzW3RdPT09YSlyZXR1cm4gdApD
+Lk5tLmkocyxhKQpDLk5tLmkodGhpcy5iLG51bGwpCnJldHVybiByfSwKUHY6ZnVuY3Rpb24oYSl7dmFy
+IHQscyxyLHE9dGhpcyxwPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVybiBhCmlm
+KHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEK
+aWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodS5mdi5jKGEpKXRocm93
+IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIFJlZ0V4cCIpKQppZih1LmM4LmMoYSkpcmV0dXJu
+IGEKaWYodS5kLmMoYSkpcmV0dXJuIGEKaWYodS5JLmMoYSkpcmV0dXJuIGEKdD11LmRELmMoYSl8fCEx
+CmlmKHQpcmV0dXJuIGEKaWYodS5HLmMoYSkpe3M9cS5WSChhKQp0PXEuYgppZihzPj10Lmxlbmd0aCly
+ZXR1cm4gSC5PSCh0LHMpCnI9cC5hPXRbc10KaWYociE9bnVsbClyZXR1cm4gcgpyPXt9CnAuYT1yCkMu
+Tm0uWSh0LHMscikKYS5LKDAsbmV3IFAubFIocCxxKSkKcmV0dXJuIHAuYX1pZih1LmouYyhhKSl7cz1x
+LlZIKGEpCnA9cS5iCmlmKHM+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscykKcj1wW3NdCmlmKHIhPW51
+bGwpcmV0dXJuIHIKcmV0dXJuIHEuZWsoYSxzKX1pZih1LmVILmMoYSkpe3M9cS5WSChhKQp0PXEuYgpp
+ZihzPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LHMpCnI9cC5iPXRbc10KaWYociE9bnVsbClyZXR1cm4g
+cgpyPXt9CnAuYj1yCkMuTm0uWSh0LHMscikKcS5pbShhLG5ldyBQLmpnKHAscSkpCnJldHVybiBwLmJ9
+dGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2Ygb3RoZXIgdHlwZSIpKX0sCmVrOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscz1KLlU2KGEpLHI9cy5nQShhKSxxPW5ldyBBcnJheShyKQpDLk5tLlkodGhp
+cy5iLGIscSkKZm9yKHQ9MDt0PHI7Kyt0KUMuTm0uWShxLHQsdGhpcy5QdihzLnEoYSx0KSkpCnJldHVy
+biBxfX0KUC5sUi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuYi5Q
+dihiKX0sCiRTOjF9ClAuamcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYlthXT10
+aGlzLmIuUHYoYil9LAokUzoxfQpQLkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7dmFyIHQs
+cyxyLHEKdS5iOC5iKGIpCmZvcih0PU9iamVjdC5rZXlzKGEpLHM9dC5sZW5ndGgscj0wO3I8czsrK3Ip
+e3E9dFtyXQpiLiQyKHEsYVtxXSl9fX0KUC5Bcy5wcm90b3R5cGU9ewpUOmZ1bmN0aW9uKGEpe3ZhciB0
+CkgueShhKQp0PSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnZoKEgudEwoYSkpCmlmKHQu
+dGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhhLCJ2YWx1ZSIsIk5vdCBhIHZhbGlkIGNsYXNz
+IHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuSCgwLCIgIil9LApna3o6ZnVu
+Y3Rpb24oYSl7dmFyIHQ9dGhpcy5QKCkKcmV0dXJuIFAucmoodCx0LnIsSC5MaCh0KS5kKX0sCmdBOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLlQoYikKcmV0
+dXJuIHRoaXMuUCgpLnRnKDAsYil9LAppOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiBILnhk
+KHRoaXMuT1MobmV3IFAuR0UoYikpKX0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCnRoaXMuVChiKQp0
+PXRoaXMuUCgpCnM9dC5SKDAsYikKdGhpcy5YKHQpCnJldHVybiBzfSwKRlY6ZnVuY3Rpb24oYSxiKXt0
+aGlzLk9TKG5ldyBQLk43KHRoaXMsdS5YLmIoYikpKX0sClYxOmZ1bmN0aW9uKGEpe3RoaXMuT1MobmV3
+IFAudVEoKSl9LApPUzpmdW5jdGlvbihhKXt2YXIgdCxzCnUuY2guYihhKQp0PXRoaXMuUCgpCnM9YS4k
+MSh0KQp0aGlzLlgodCkKcmV0dXJuIHN9fQpQLkdFLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
+dHVybiB1LkMuYihhKS5pKDAsdGhpcy5hKX0sCiRTOjM3fQpQLk43LnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciB0PXRoaXMuYixzPUgudDYodCkKcmV0dXJuIHUuQy5iKGEpLkZWKDAsbmV3IEguQTgo
+dCxzLkMoInFVKDEpIikuYih0aGlzLmEuZ3VNKCkpLHMuQygiQTg8MSxxVT4iKSkpfSwKJFM6MTR9ClAu
+dVEucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5DLmIoYSkKaWYoYS5hPjApe2EuYj1hLmM9YS5k
+PWEuZT1hLmY9bnVsbAphLmE9MAphLlMoKX1yZXR1cm59LAokUzoxNH0KUC5oRi5wcm90b3R5cGU9eyRp
+aEY6MX0KUC5QQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlouYihhKQp0PWZ1bmN0
+aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5
+cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0odCwkLncoKSxhKQpyZXR1
+cm4gdH0sCiRTOjR9ClAuWW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlz
+LmEoYSl9LAokUzo0fQpQLk56LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5y
+NyhhKX0sCiRTOjMxfQpQLlFTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5U
+eihhLHUuYW0pfSwKJFM6MzJ9ClAubnAucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLkU0KGEpfSwKJFM6MzN9ClAuRTQucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVv
+ZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0eSBp
+cyBub3QgYSBTdHJpbmcgb3IgbnVtIikpCnJldHVybiBQLkw3KHRoaXMuYVtiXSl9LApZOmZ1bmN0aW9u
+KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIo
+UC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0s
+CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAu
+RTQmJnRoaXMuYT09PWIuYX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscwp0cnl7dD1TdHJpbmcodGhpcy5h
+KQpyZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpCnQ9dGhpcy54YigwKQpyZXR1cm4gdH19LApWNzpmdW5j
+dGlvbihhLGIpe3ZhciB0LHM9dGhpcy5hCmlmKGI9PW51bGwpdD1udWxsCmVsc2V7dD1ILnQ2KGIpCnQ9
+UC5DSChuZXcgSC5BOChiLHQuQygiQCgxKSIpLmIoUC5pRygpKSx0LkMoIkE4PDEsQD4iKSksITAsdS56
+KX1yZXR1cm4gUC5MNyhzW2FdLmFwcGx5KHMsdCkpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0K
+UC5yNy5wcm90b3R5cGU9e30KUC5Uei5wcm90b3R5cGU9ewpjUDpmdW5jdGlvbihhKXt2YXIgdD10aGlz
+LHM9YTwwfHxhPj10LmdBKHQpCmlmKHMpdGhyb3cgSC5iKFAuVEUoYSwwLHQuZ0EodCksbnVsbCxudWxs
+KSl9LApxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9PSJudW1iZXIiJiZiPT09Qy5qbi55dShiKSl0
+aGlzLmNQKEguU2MoYikpCnJldHVybiB0aGlzLiR0aS5kLmIodGhpcy5VcigwLGIpKX0sClk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0CnRoaXMuJHRpLmQuYihjKQp0PUMuam4ueXUoYikKaWYoYj09PXQpdGhpcy5j
+UChiKQp0aGlzLmU0KDAsYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5sZW5ndGgKaWYo
+dHlwZW9mIHQ9PT0ibnVtYmVyIiYmdD4+PjA9PT10KXJldHVybiB0CnRocm93IEguYihQLlBWKCJCYWQg
+SnNBcnJheSBsZW5ndGgiKSl9LAokaWNYOjEsCiRpek06MX0KUC5jby5wcm90b3R5cGU9e30KUC5uZC5w
+cm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpQOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEs
+cD10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG89UC5Mcyh1Lk4pCmlmKHA9PW51bGwpcmV0dXJu
+IG8KZm9yKHQ9cC5zcGxpdCgiICIpLHM9dC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9Si5UMCh0W3JdKQpp
+ZihxLmxlbmd0aCE9PTApby5pKDAscSl9cmV0dXJuIG99LApYOmZ1bmN0aW9uKGEpe3RoaXMuYS5zZXRB
+dHRyaWJ1dGUoImNsYXNzIixhLkgoMCwiICIpKX19ClAuZDUucHJvdG90eXBlPXsKZ0Q6ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBQLktlKGEpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjY6
+ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyLHEscCxvCmlmKGQ9PW51bGwpe3Q9SC5WTShbXSx1Lm0p
+CmQ9bmV3IFcudkQodCkKQy5ObS5pKHQsVy5UdyhudWxsKSkKQy5ObS5pKHQsVy5CbCgpKQpDLk5tLmko
+dCxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQpCnM9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guZChiKSsi
+PC9zdmc+Igp0PWRvY3VtZW50CnI9dC5ib2R5CnE9KHImJkMuUlkpLkFIKHIscyxjKQpwPXQuY3JlYXRl
+RG9jdW1lbnRGcmFnbWVudCgpCnEudG9TdHJpbmcKdD1uZXcgVy5lNyhxKQpvPXQuZ3I4KHQpCmZvcig7
+dD1vLmZpcnN0Q2hpbGQsdCE9bnVsbDspcC5hcHBlbmRDaGlsZCh0KQpyZXR1cm4gcH0sCmdWbDpmdW5j
+dGlvbihhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAokaWQ1OjF9ClAubjYucHJv
+dG90eXBlPXskaWNYOjEsJGl6TToxLCRpQVM6MX0KVS5kMi5wcm90b3R5cGU9e30KVS5TZS5wcm90b3R5
+cGU9e30KVS51Ri5wcm90b3R5cGU9e30KVS5NbC5wcm90b3R5cGU9e30KVS55RC5wcm90b3R5cGU9e30K
+VS53Yi5wcm90b3R5cGU9e30KVC5HVi5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciB0LHMscixxLHAsbwp1LkIuYihhKQp0PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpz
+PUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5H
+ZSgpCmlmKHQhPT0iLyImJnQhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4
+dENvbnRlbnQpKUwuRzcodCxzLHIsbmV3IEwuVlcodCxzLHIpKQpxPUoucUYoZG9jdW1lbnQucXVlcnlT
+ZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpKQpwPXEuJHRpCm89cC5DKCJ+KDEpIikuYihuZXcgTC5v
+WigpKQp1Lk0uYihudWxsKQpXLkpFKHEuYSxxLmIsbywhMSxwLmQpfSwKJFM6MTN9CkwuVlcucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1ou
+cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5WLmIoYSkKTC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIp
+Llc3KG5ldyBMLmpyKCksdS5QKS5PQShuZXcgTC5xbCgpKX0sCiRTOjV9CkwuanIucHJvdG90eXBlPXsK
+JDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5yLmIoYSkKdD1kb2N1bWVudC5ib2R5CnQuY2xhc3NMaXN0LnJl
+bW92ZSgicHJvcG9zZWQiKQp0LmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRTOjd9CkwucWwucHJv
+dG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLnFKKCJhcHBseSBtaWdyYXRpb24gZXJyb3I6ICIrSC5k
+KGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGFwcGx5IG1pZ3JhdGlvbiAoIitILmQoYSkrIiku
+Iil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkwucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFy
+IHQscyxyCnUuQi5iKGEpCnQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCnM9TC5HNih3aW5kb3cubG9j
+YXRpb24uaHJlZikKcj1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZih0Lmxlbmd0aD4xKUwuRzco
+dCxzLHIsbnVsbCkKZWxzZXtMLkJFKHQsUC5FRihbInJlZ2lvbnMiLCIiLCJuYXZpZ2F0aW9uQ29udGVu
+dCIsIiIsImVkaXRzIixbXV0sdS5OLHUueikpCkwuQlgoIiZuYnNwOyIsbnVsbCl9fSwKJFM6MTN9Ckwu
+V3gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9ImNvbGxhcHNlZCIKdS5WLmIo
+YSkKdD10aGlzLmEKcz1KLlJFKHQpCnI9dGhpcy5iCmlmKCFzLmdEKHQpLnRnKDAscSkpe3MuZ0QodCku
+aSgwLHEpCkouZFIocikuaSgwLHEpfWVsc2V7cy5nRCh0KS5SKDAscSkKSi5kUihyKS5SKDAscSl9fSwK
+JFM6NX0KTC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD1KLnFGKHUuaC5iKGEpKSxz
+PXQuJHRpLHI9cy5DKCJ+KDEpIikuYihuZXcgTC5kTigpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIs
+ciwhMSxzLmQpfSwKJFM6M30KTC5kTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYu
+YihhKQp0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQp0LnRvU3RyaW5n
+CkwudDIoYSx0LmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHQpKS5PKCJwYXRo
+IikpKX0sCiRTOjV9CkwuSG8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCnUuaC5i
+KGEpCnQ9Si5xRihhKQpzPXQuJHRpCnI9cy5DKCJ+KDEpIikuYihuZXcgTC54eihhLHRoaXMuYSkpCnUu
+TS5iKG51bGwpClcuSkUodC5hLHQuYixyLCExLHMuZCl9LAokUzozfQpMLnh6LnByb3RvdHlwZT17CiQx
+OmZ1bmN0aW9uKGEpe3ZhciB0CnUuVi5iKGEpCnQ9dGhpcy5hCkwuaFgodGhpcy5iLFAuUUEodC5nZXRB
+dHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSkuTygib2Zmc2V0IikpLG51bGwsbnVs
+bCkpfSwKJFM6NX0KTC5JQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD1KLnFGKHUuaC5i
+KGEpKSxzPXQuJHRpCnMuQygifigxKSIpLmIoTC5IMCgpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIs
+TC5IMCgpLCExLHMuZCl9LAokUzozfQpMLkwxLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0
+CnUuci5iKGEpCnQ9YS5zdGF0dXMKaWYodD09PTIwMClyZXR1cm4gYQplbHNlIHRocm93IEguYigiUmVx
+dWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzozOH0KTC5uVC5wcm90b3R5cGU9ewok
+MDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsdGhpcy5iLHRoaXMuYyl9LAokUzowfQpMLkJaLnByb3Rv
+dHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEuYSxudWxsLG51bGwpfSwKJFM6MH0KTC5GUS5w
+cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImhhbmRsZVBvc3RMaW5rQ2xpY2s6ICIrSC5k
+KGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIitILmQodGhpcy5hKSsiICgiK0guZChh
+KSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjF9CkwuR0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24o
+YSl7dS5oLmIoYSkKJC56QigpLnRvU3RyaW5nCnUudS5iKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhp
+Z2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5EVC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
+YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApe0wuVDEoVS55dShDLkN0LnBXKDAsYS5y
+ZXNwb25zZVRleHQsbnVsbCkpKQpMLnlYKCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIpfWVsc2Ug
+d2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3RhdHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9Ckwu
+ZUgucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLnFKKCJsb2FkUmVnaW9uRXhwbGFuYXRpb246
+ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIitILmQodGhpcy5hKSsiICgi
+K0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjF9CkwuekQucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHQscyxyPXRoaXMKdS5yLmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtzPXIu
+YQpMLkJFKHMsdS5hLmIoQy5DdC5wVygwLGEucmVzcG9uc2VUZXh0LG51bGwpKSkKdD1yLmIKTC5mRyh0
+LHIuYykKTC5CWChDLnhCLnRnKHMsIj8iKT9DLnhCLk5qKHMsMCxDLnhCLk9ZKHMsIj8iKSk6cyx0KQp0
+PXIuZAppZih0IT1udWxsKXQuJDAoKX1lbHNlIHdpbmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0
+YXR1cyBvZiAiK0guZCh0KSl9LAokUzo3fQpMLk9FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+TC5xSigibG9hZEZpbGU6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIit0
+aGlzLmErIiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLlRXLnByb3RvdHlw
+ZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDAp
+e3M9Qy5DdC5wVygwLGEucmVzcG9uc2VUZXh0LG51bGwpCnI9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigi
+Lm5hdi10cmVlIikKSi5sNShyLCIiKQpMLnRYKHIscyl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3Qg
+ZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkpfSwKJFM6N30KTC54ci5wcm90b3R5cGU9ewokMjpmdW5j
+dGlvbihhLGIpe0wucUooImxvYWROYXZpZ2F0aW9uVHJlZTogIitILmQoYSksYikKd2luZG93LmFsZXJ0
+KCJDb3VsZCBub3QgbG9hZCAiK3RoaXMuYSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIs
+CiRTOjF9CkwuRUUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LlYuYihhKQp0PXRo
+aXMuYQpzPXRoaXMuYgpMLmFmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx0LHMsbmV3IEwuUUwodCxz
+KSkKTC5oWCh0aGlzLmMsdCl9LAokUzo1fQpMLlFMLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5G
+cih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdGhpcy5hLHRoaXMuYil9LAokUzowfQpMLlZTLnByb3Rv
+dHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHM9InNlbGVjdGVkLWZpbGUiCnUuaC5iKGEpCmEudG9T
+dHJpbmcKdD1KLlJFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTco
+YSkpLk8oIm5hbWUiKSk9PT10aGlzLmEuYSl0LmdEKGEpLmkoMCxzKQplbHNlIHQuZ0QoYSkuUigwLHMp
+fSwKJFM6M30KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpm
+dW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTS5sSS5wcm90b3R5cGU9ewpXTzpmdW5jdGlvbihh
+LGIpe3ZhciB0LHM9bnVsbApNLllGKCJhYnNvbHV0ZSIsSC5WTShbYixudWxsLG51bGwsbnVsbCxudWxs
+LG51bGwsbnVsbF0sdS5zKSkKdD10aGlzLmEKdD10LllyKGIpPjAmJiF0LmhLKGIpCmlmKHQpcmV0dXJu
+IGIKdD1ELlJYKCkKcmV0dXJuIHRoaXMucTcoMCx0LGIscyxzLHMscyxzLHMpfSwKdE06ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyPVguQ0woYSx0aGlzLmEpCnIuSVYoKQp0PXIuZApzPXQubGVuZ3RoCmlmKHM9PT0w
+KXt0PXIuYgpyZXR1cm4gdD09bnVsbD8iLiI6dH1pZihzPT09MSl7dD1yLmIKcmV0dXJuIHQ9PW51bGw/
+Ii4iOnR9aWYoMD49cylyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCkMuTm0ubXYoci5lKQpyLklWKCkK
+cmV0dXJuIHIudygwKX0sCnE3OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXt2YXIgdD1ILlZNKFti
+LGMsZCxlLGYsZyxoLGldLHUucykKTS5ZRigiam9pbiIsdCkKcmV0dXJuIHRoaXMuSVAobmV3IEguVTUo
+dCx1LmJCLmIobmV3IE0uTWkoKSksdS5jYykpfSwKSVA6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxv
+LG4sbSxsCnUuWC5iKGEpCmZvcih0PWEuJHRpLHM9dC5DKCJhMihjWC5FKSIpLmIobmV3IE0ucTcoKSks
+cj1hLmdreihhKSx0PW5ldyBILlNPKHIscyx0LkMoIlNPPGNYLkU+IikpLHM9dGhpcy5hLHE9ITEscD0h
+MSxvPSIiO3QuRigpOyl7bj1yLmdsKCkKaWYocy5oSyhuKSYmcCl7bT1YLkNMKG4scykKbD1vLmNoYXJD
+b2RlQXQoMCk9PTA/bzpvCm89Qy54Qi5OaihsLDAscy5TcChsLCEwKSkKbS5iPW8KaWYocy5kcyhvKSlD
+Lk5tLlkobS5lLDAscy5nbUkoKSkKbz1tLncoMCl9ZWxzZSBpZihzLllyKG4pPjApe3A9IXMuaEsobikK
+bz1ILmQobil9ZWxzZXtpZighKG4ubGVuZ3RoPjAmJnMuVWQoblswXSkpKWlmKHEpbys9cy5nbUkoKQpv
+Kz1ILmQobil9cT1zLmRzKG4pfXJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpvfSwKbzU6ZnVuY3Rp
+b24oYSl7dmFyIHQKaWYoIXRoaXMueTMoYSkpcmV0dXJuIGEKdD1YLkNMKGEsdGhpcy5hKQp0LnJSKCkK
+cmV0dXJuIHQudygwKX0sCnkzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrCmEudG9T
+dHJpbmcKdD10aGlzLmEKcz10LllyKGEpCmlmKHMhPT0wKXtpZih0PT09JC5LaygpKWZvcihyPTA7cjxz
+OysrcilpZihDLnhCLlcoYSxyKT09PTQ3KXJldHVybiEwCnE9cwpwPTQ3fWVsc2V7cT0wCnA9bnVsbH1m
+b3Iobz1uZXcgSC5xaihhKS5hLG49by5sZW5ndGgscj1xLG09bnVsbDtyPG47KytyLG09cCxwPWwpe2w9
+Qy54Qi5tKG8scikKaWYodC5yNChsKSl7aWYodD09PSQuS2soKSYmbD09PTQ3KXJldHVybiEwCmlmKHAh
+PW51bGwmJnQucjQocCkpcmV0dXJuITAKaWYocD09PTQ2KWs9bT09bnVsbHx8bT09PTQ2fHx0LnI0KG0p
+CmVsc2Ugaz0hMQppZihrKXJldHVybiEwfX1pZihwPT1udWxsKXJldHVybiEwCmlmKHQucjQocCkpcmV0
+dXJuITAKaWYocD09PTQ2KXQ9bT09bnVsbHx8dC5yNChtKXx8bT09PTQ2CmVsc2UgdD0hMQppZih0KXJl
+dHVybiEwCnJldHVybiExfSwKSFA6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG89dGhpcyxuPSdV
+bmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1vLldPKDAsYikKdD1vLmEKaWYodC5ZcihiKTw9MCYm
+dC5ZcihhKT4wKXJldHVybiBvLm81KGEpCmlmKHQuWXIoYSk8PTB8fHQuaEsoYSkpYT1vLldPKDAsYSkK
+aWYodC5ZcihhKTw9MCYmdC5ZcihiKT4wKXRocm93IEguYihYLkpUKG4rSC5kKGEpKyciIGZyb20gIicr
+SC5kKGIpKyciLicpKQpzPVguQ0woYix0KQpzLnJSKCkKcj1YLkNMKGEsdCkKci5yUigpCnE9cy5kCmlm
+KHEubGVuZ3RoPjAmJkouUk0ocVswXSwiLiIpKXJldHVybiByLncoMCkKcT1zLmIKcD1yLmIKaWYocSE9
+cClxPXE9PW51bGx8fHA9PW51bGx8fCF0Lk5jKHEscCkKZWxzZSBxPSExCmlmKHEpcmV0dXJuIHIudygw
+KQp3aGlsZSghMCl7cT1zLmQKaWYocS5sZW5ndGg+MCl7cD1yLmQKcT1wLmxlbmd0aD4wJiZ0Lk5jKHFb
+MF0scFswXSl9ZWxzZSBxPSExCmlmKCFxKWJyZWFrCkMuTm0uVzQocy5kLDApCkMuTm0uVzQocy5lLDEp
+CkMuTm0uVzQoci5kLDApCkMuTm0uVzQoci5lLDEpfXE9cy5kCmlmKHEubGVuZ3RoPjAmJkouUk0ocVsw
+XSwiLi4iKSl0aHJvdyBILmIoWC5KVChuK0guZChhKSsnIiBmcm9tICInK0guZChiKSsnIi4nKSkKcT11
+Lk4KQy5ObS5VRyhyLmQsMCxQLk84KHMuZC5sZW5ndGgsIi4uIixxKSkKQy5ObS5ZKHIuZSwwLCIiKQpD
+Lk5tLlVHKHIuZSwxLFAuTzgocy5kLmxlbmd0aCx0LmdtSSgpLHEpKQp0PXIuZApxPXQubGVuZ3RoCmlm
+KHE9PT0wKXJldHVybiIuIgppZihxPjEmJkouUk0oQy5ObS5ncloodCksIi4iKSl7dD1yLmQKaWYoMD49
+dC5sZW5ndGgpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQp0PXIuZQpDLk5tLm12KHQpCkMuTm0ubXYo
+dCkKQy5ObS5pKHQsIiIpfXIuYj0iIgpyLklWKCkKcmV0dXJuIHIudygwKX19Ck0uTWkucHJvdG90eXBl
+PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEgueShhKSE9bnVsbH0sCiRTOjh9Ck0ucTcucHJvdG90eXBl
+PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEgueShhKSE9PSIifSwKJFM6OH0KTS5Oby5wcm90b3R5cGU9
+ewokMTpmdW5jdGlvbihhKXtILnkoYSkKcmV0dXJuIGE9PW51bGw/Im51bGwiOiciJythKyciJ30sCiRT
+OjZ9CkIuTHUucHJvdG90eXBlPXsKeFo6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLllyKGEpCmlmKHM+
+MClyZXR1cm4gSi5sZChhLDAscykKaWYodGhpcy5oSyhhKSl7aWYoMD49YS5sZW5ndGgpcmV0dXJuIEgu
+T0goYSwwKQp0PWFbMF19ZWxzZSB0PW51bGwKcmV0dXJuIHR9LApOYzpmdW5jdGlvbihhLGIpe3JldHVy
+biBhPT1ifX0KWC5XRC5wcm90b3R5cGU9ewpJVjpmdW5jdGlvbigpe3ZhciB0LHMscj10aGlzCndoaWxl
+KCEwKXt0PXIuZAppZighKHQubGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWih0KSwiIikpKWJyZWFrCnQ9
+ci5kCmlmKDA+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKQy5ObS5tdihyLmUpfXQ9
+ci5lCnM9dC5sZW5ndGgKaWYocz4wKUMuTm0uWSh0LHMtMSwiIil9LApyUjpmdW5jdGlvbigpe3ZhciB0
+LHMscixxLHAsbyxuLG09dGhpcyxsPUguVk0oW10sdS5zKQpmb3IodD1tLmQscz10Lmxlbmd0aCxyPTAs
+cT0wO3E8dC5sZW5ndGg7dC5sZW5ndGg9PT1zfHwoMCxILmxrKSh0KSwrK3Epe3A9dFtxXQpvPUouaWEo
+cCkKaWYoIShvLkROKHAsIi4iKXx8by5ETihwLCIiKSkpaWYoby5ETihwLCIuLiIpKWlmKGwubGVuZ3Ro
+PjApbC5wb3AoKQplbHNlICsrcgplbHNlIEMuTm0uaShsLHApfWlmKG0uYj09bnVsbClDLk5tLlVHKGws
+MCxQLk84KHIsIi4uIix1Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIp
+Cm49UC5kSChsLmxlbmd0aCxuZXcgWC5xUihtKSwhMCx1Lk4pCnQ9bS5iCnQ9dCE9bnVsbCYmbC5sZW5n
+dGg+MCYmbS5hLmRzKHQpP20uYS5nbUkoKToiIgpILnQ2KG4pLmQuYih0KQppZighIW4uZml4ZWQkbGVu
+Z3RoKUgudmgoUC5MNCgiaW5zZXJ0IikpCm4uc3BsaWNlKDAsMCx0KQptLnNuSihsKQptLnNQaChuKQp0
+PW0uYgppZih0IT1udWxsJiZtLmE9PT0kLktrKCkpe3QudG9TdHJpbmcKbS5iPUgueXModCwiLyIsIlxc
+Iil9bS5JVigpfSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcyxxPXIuYgpxPXEhPW51bGw/cToi
+Igpmb3IodD0wO3Q8ci5kLmxlbmd0aDsrK3Qpe3M9ci5lCmlmKHQ+PXMubGVuZ3RoKXJldHVybiBILk9I
+KHMsdCkKcz1xK0guZChzW3RdKQpxPXIuZAppZih0Pj1xLmxlbmd0aClyZXR1cm4gSC5PSChxLHQpCnE9
+cytILmQocVt0XSl9cSs9SC5kKEMuTm0uZ3JaKHIuZSkpCnJldHVybiBxLmNoYXJDb2RlQXQoMCk9PTA/
+cTpxfSwKc25KOmZ1bmN0aW9uKGEpe3RoaXMuZD11LmkuYihhKX0sCnNQaDpmdW5jdGlvbihhKXt0aGlz
+LmU9dS5pLmIoYSl9fQpYLnFSLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEu
+YS5nbUkoKX0sCiRTOjM5fQpYLmR2LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlBhdGhF
+eGNlcHRpb246ICIrdGhpcy5hfX0KTy56TC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0
+aGlzLmdvYyh0aGlzKX19CkUuT0YucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIu
+dGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3Zh
+ciB0PWEubGVuZ3RoCnJldHVybiB0IT09MCYmQy54Qi5tKGEsdC0xKSE9PTQ3fSwKU3A6ZnVuY3Rpb24o
+YSxiKXtpZihhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDcpcmV0dXJuIDEKcmV0dXJuIDB9LApZ
+cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiEx
+fSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuInBvc2l4In0sCmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19
+CkYucnUucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciB0PWEubGVuZ3RoCmlm
+KHQ9PT0wKXJldHVybiExCmlmKEMueEIubShhLHQtMSkhPT00NylyZXR1cm4hMApyZXR1cm4gQy54Qi5U
+YyhhLCI6Ly8iKSYmdGhpcy5ZcihhKT09PXR9LApTcDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9
+YS5sZW5ndGgKaWYocD09PTApcmV0dXJuIDAKaWYoQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpmb3Io
+dD0wO3Q8cDsrK3Qpe3M9Qy54Qi5XKGEsdCkKaWYocz09PTQ3KXJldHVybiAwCmlmKHM9PT01OCl7aWYo
+dD09PTApcmV0dXJuIDAKcj1DLnhCLlhVKGEsIi8iLEMueEIuUWkoYSwiLy8iLHQrMSk/dCszOnQpCmlm
+KHI8PTApcmV0dXJuIHAKaWYoIWJ8fHA8ciszKXJldHVybiByCmlmKCFDLnhCLm4oYSwiZmlsZTovLyIp
+KXJldHVybiByCmlmKCFCLll1KGEscisxKSlyZXR1cm4gcgpxPXIrMwpyZXR1cm4gcD09PXE/cTpyKzR9
+fXJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlv
+bihhKXtyZXR1cm4gYS5sZW5ndGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3fSwKZ29jOmZ1bmN0aW9uKCl7
+cmV0dXJuInVybCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpMLklWLnByb3RvdHlwZT17ClVk
+OmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3JldHVybiBh
+PT09NDd8fGE9PT05Mn0sCmRzOmZ1bmN0aW9uKGEpe3ZhciB0PWEubGVuZ3RoCmlmKHQ9PT0wKXJldHVy
+biExCnQ9Qy54Qi5tKGEsdC0xKQpyZXR1cm4hKHQ9PT00N3x8dD09PTkyKX0sClNwOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscyxyPWEubGVuZ3RoCmlmKHI9PT0wKXJldHVybiAwCnQ9Qy54Qi5XKGEsMCkKaWYodD09
+PTQ3KXJldHVybiAxCmlmKHQ9PT05Mil7aWYocjwyfHxDLnhCLlcoYSwxKSE9PTkyKXJldHVybiAxCnM9
+Qy54Qi5YVShhLCJcXCIsMikKaWYocz4wKXtzPUMueEIuWFUoYSwiXFwiLHMrMSkKaWYocz4wKXJldHVy
+biBzfXJldHVybiByfWlmKHI8MylyZXR1cm4gMAppZighQi5PUyh0KSlyZXR1cm4gMAppZihDLnhCLlco
+YSwxKSE9PTU4KXJldHVybiAwCnI9Qy54Qi5XKGEsMikKaWYoIShyPT09NDd8fHI9PT05MikpcmV0dXJu
+IDAKcmV0dXJuIDN9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLllyKGEpPT09MX0sCk90OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09
+PWIpcmV0dXJuITAKaWYoYT09PTQ3KXJldHVybiBiPT09OTIKaWYoYT09PTkyKXJldHVybiBiPT09NDcK
+aWYoKGFeYikhPT0zMilyZXR1cm4hMQp0PWF8MzIKcmV0dXJuIHQ+PTk3JiZ0PD0xMjJ9LApOYzpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscgppZihhPT1iKXJldHVybiEwCnQ9YS5sZW5ndGgKaWYodCE9PWIubGVu
+Z3RoKXJldHVybiExCmZvcihzPUouclkoYikscj0wO3I8dDsrK3IpaWYoIXRoaXMuT3QoQy54Qi5XKGEs
+cikscy5XKGIscikpKXJldHVybiExCnJldHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuIndpbmRv
+d3MifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7dmFyIHQ9
+Si52Qi5wcm90b3R5cGUKdC5VPXQudwp0LlNqPXQuZTcKdD1KLk1GLnByb3RvdHlwZQp0LnQ9dC53CnQ9
+UC5jWC5wcm90b3R5cGUKdC5HRz10LmV2CnQ9UC5rLnByb3RvdHlwZQp0LnhiPXQudwp0PVcuY3YucHJv
+dG90eXBlCnQuRFc9dC5yNgp0PVcubTYucHJvdG90eXBlCnQuakY9dC5FYgp0PVAuRTQucHJvdG90eXBl
+CnQuVXI9dC5xCnQuZTQ9dC5ZfSkoKTsoZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmZzKCl7dmFyIHQ9aHVu
+a0hlbHBlcnMuX3N0YXRpY18xLHM9aHVua0hlbHBlcnMuX3N0YXRpY18wLHI9aHVua0hlbHBlcnMuaW5z
+dGFsbEluc3RhbmNlVGVhck9mZixxPWh1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2ZmLHA9aHVu
+a0hlbHBlcnMuX2luc3RhbmNlXzF1CnQoUCwiRVgiLCJaViIsOSkKdChQLCJ5dCIsIm9BIiw5KQp0KFAs
+InFXIiwiQnoiLDkpCnMoUCwiVUkiLCJlTiIsMikKcihQLlBmLnByb3RvdHlwZSwiZ1lKIiwwLDEsbnVs
+bCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSwzNiwwKQp0KFAsIlBIIiwiTXQiLDYpCnEoVywicFMiLDQs
+bnVsbCxbIiQ0Il0sWyJ5VyJdLDExLDApCnEoVywiVjQiLDQsbnVsbCxbIiQ0Il0sWyJRVyJdLDExLDAp
+CnAoUC5Bcy5wcm90b3R5cGUsImd1TSIsIlQiLDYpCnQoUCwiaUciLCJ3WSIsNCkKdChQLCJ3MCIsIkw3
+Iiw0MikKcShMLCJYTiIsMSxudWxsLFsiJDIkcmVsYXRpdmVUbyIsIiQxIl0sWyJ0MiIsZnVuY3Rpb24o
+YSl7cmV0dXJuIEwudDIoYSxudWxsKX1dLDQzLDApCnQoTCwiSDAiLCJ1bSIsMjkpfSkoKTsoZnVuY3Rp
+b24gaW5oZXJpdGFuY2UoKXt2YXIgdD1odW5rSGVscGVycy5taXhpbixzPWh1bmtIZWxwZXJzLmluaGVy
+aXQscj1odW5rSGVscGVycy5pbmhlcml0TWFueQpzKFAuayxudWxsKQpyKFAuayxbSC5lbyxKLnZCLEou
+bTEsUC5uWSxQLmNYLEguYTcsUC5BbixILlNVLEguUmUsSC53dixQLlBuLEguV1UsSC5MSSxILlRwLEgu
+WnIsUC5YUyxILlhPLFAuWWssSC5kYixILk42LEguVlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEgu
+RyxQLlczLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC5DdyxQLm0wLFAuWHYsUC5i
+bixQLmxtLFAubEQsUC5LUCxQLmxmLFAuV1ksUC5VayxQLlJ3LFAuYnosUC5hMixQLmlQLFAuRkssUC5r
+NSxQLktZLFAuQ0QsUC5hRSxQLkVILFAuek0sUC5aMCxQLmM4LFAuT2QsUC5pYixQLkd6LFAucVUsUC5S
+bixQLkdELFAuRG4sUC5QRSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20sVy52RCxXLm02LFcuT3csVy5X
+OSxXLmRXLFcua0YsVy5tayxXLktvLFAuaUosUC5FNCxQLm42LFUuZDIsVS5TZSxVLnVGLFUuTWwsVS55
+RCxVLndiLFQuR1YsTC5YQSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcihKLnZCLFtKLnlFLEouWUUsSi5N
+RixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5JQixXLm43LFcuZWEsVy5i
+cixXLlNnLFcudTgsVy5LNyxXLlhXLFAuaEZdKQpyKEouTUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBv
+LEouamQpCnIoSi5xSSxbSi51cixKLlZBXSkKcyhQLkxVLFAublkpCnIoUC5MVSxbSC5YQyxXLnd6LFcu
+ZTddKQpzKEgucWosSC5YQykKcihQLmNYLFtILmJRLEguVTUsUC5tVyxILnVuXSkKcihILmJRLFtILmFM
+LEguaTUsUC54dV0pCnIoSC5hTCxbSC5uSCxILkE4LFAuaThdKQpzKEguU08sUC5BbikKcyhQLlJVLFAu
+UG4pCnMoUC5HaixQLlJVKQpzKEguUEQsUC5HaikKcyhILkxQLEguV1UpCnIoSC5UcCxbSC5DaixILkFt
+LEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuZGEsUC5vUSxQLnBW
+LFAuVTcsUC52cixQLnJILFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC5QSSxQLnBL
+LFAuaGosUC5WcCxQLk9SLFAuR0EsUC5XRixQLm4xLFAuY1MsUC5WQyxQLnRwLFAuZTEsUC5OWSxQLlJa
+LFAuTUUsUC55NSxQLnEzLFAueUksUC5jNixQLnFkLFcuQ3YsVy5iVSxXLmhILFcuS1MsVy5BMyxXLnZO
+LFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAubFIsUC5qZyxQLkdFLFAuTjcsUC51USxQLlBD
+LFAuWW0sUC5OeixQLlFTLFAubnAsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC5MLEwuV3gsTC5BTyxM
+LmROLEwuSG8sTC54eixMLklDLEwuTDEsTC5uVCxMLkJaLEwuRlEsTC5HSCxMLkRULEwuZUgsTC56RCxM
+Lk9FLEwuVFcsTC54cixMLkVFLEwuUUwsTC5WUyxNLk1pLE0ucTcsTS5ObyxYLnFSXSkKcihQLlhTLFtI
+LlcwLEguYXosSC52VixILkVxLFAuQzYsSC51OSxQLm4sUC51LFAubXAsUC51YixQLmRzLFAubGosUC5V
+VixQLmNdKQpyKEgubGMsW0guengsSC5yVF0pCnMoSC5rWSxQLkM2KQpzKFAuaWwsUC5ZaykKcihQLmls
+LFtILk41LFAudXcsVy5EOSxXLlN5XSkKcyhILktXLFAubVcpCnMoSC5iMCxILkVUKQpyKEguYjAsW0gu
+UkcsSC5XQl0pCnMoSC5WUCxILlJHKQpzKEguRGcsSC5WUCkKcyhILlpHLEguV0IpCnMoSC5QZyxILlpH
+KQpyKEguUGcsW0gueGosSC5kRSxILlpBLEgud2YsSC5QcSxILmVFLEguVjZdKQpyKEgudTksW0guaHos
+SC5pTV0pCnMoUC5aZixQLlBmKQpzKFAuSmksUC5tMCkKcyhQLmI2LFAuWHYpCnMoUC5WaixQLldZKQpy
+KFAuVWssW1AuQ1YsUC5aaSxQLmJ5XSkKcyhQLndJLFAua1QpCnIoUC53SSxbUC5VOCxQLk14LFAuRTMs
+UC5HWV0pCnMoUC51NSxQLlppKQpyKFAuRkssW1AuQ1AsUC5LTl0pCnIoUC51LFtQLmJKLFAuZVldKQpz
+KFAucWUsUC5EbikKcihXLkQwLFtXLnVILFcud2EsVy5LNSxXLkNtXSkKcihXLnVILFtXLmN2LFcubngs
+Vy5RRixXLkNRXSkKcihXLmN2LFtXLnFFLFAuZDVdKQpyKFcucUUsW1cuR2gsVy5mWSxXLm5CLFcuUVAs
+Vy5oNCxXLlNOLFcubHAsVy5UYixXLkl2LFcuQlQsVy55WV0pCnMoVy5vSixXLkxlKQpzKFcuVDUsVy5B
+eikKcyhXLlZiLFcuUUYpCnMoVy5PNyxXLndhKQpyKFcuZWEsW1cudzYsVy5ld10pCnMoVy5BaixXLnc2
+KQpzKFcuckIsVy5LNykKcyhXLkJILFcuckIpCnMoVy53NCxXLklCKQpzKFcub2EsVy5YVykKcyhXLnJo
+LFcub2EpCnMoVy5pNyxXLkQ5KQpzKFAuQXMsUC5WaikKcihQLkFzLFtXLkk0LFAuS2VdKQpzKFcuUk8s
+UC5xaCkKcyhXLkNxLFcuUk8pCnMoVy54QyxQLk1PKQpzKFcuY3QsVy5tNikKcyhQLkJmLFAuaUopCnIo
+UC5FNCxbUC5yNyxQLmNvXSkKcyhQLlR6LFAuY28pCnMoUC5uZCxQLmQ1KQpzKEIuTHUsTy56TCkKcihC
+Lkx1LFtFLk9GLEYucnUsTC5JVl0pCnQoSC5YQyxILlJlKQp0KEguUkcsUC5sRCkKdChILlZQLEguU1Up
+CnQoSC5XQixQLmxEKQp0KEguWkcsSC5TVSkKdChQLm5ZLFAubEQpCnQoUC5XWSxQLmxmKQp0KFAuUlUs
+UC5LUCkKdChXLkxlLFcuaWQpCnQoVy5LNyxQLmxEKQp0KFcuckIsVy5HbSkKdChXLlhXLFAubEQpCnQo
+Vy5vYSxXLkdtKQp0KFAuY28sUC5sRCl9KSgpCnZhciB2PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAo
+KSx0Ujp7fSxlVDp7fSx0UFY6e30sc0VBOltdfSxtYW5nbGVkR2xvYmFsTmFtZXM6e0tOOiJpbnQiLENQ
+OiJkb3VibGUiLEZLOiJudW0iLHFVOiJTdHJpbmciLGEyOiJib29sIixjODoiTnVsbCIsek06Ikxpc3Qi
+fSxtYW5nbGVkTmFtZXM6e30sZ2V0VHlwZUZyb21OYW1lOmdldEdsb2JhbEZyb21OYW1lLG1ldGFkYXRh
+OltdLHR5cGVzOlsiYzgoKSIsImM4KEAsQCkiLCJ+KCkiLCJjOChjdikiLCJAKEApIiwiYzgoQWopIiwi
+cVUocVUpIiwiYzgoTzcpIiwiYTIocVUpIiwifih+KCkpIiwiYzgocVUscVUpIiwiYTIoY3YscVUscVUs
+SlEpIiwiYzgoQCkiLCJjOChlYSkiLCJ+KHh1PHFVPikiLCJhMihrRikiLCJjOChxVSxAKSIsImM4KHFV
+KSIsIktOKEtOLEtOKSIsIn4ocVUscVUpIiwibjYoS04pIiwibjYoQCxAKSIsIn4ocVVbQF0pIiwifihx
+VSxLTikiLCJjOChldykiLCJAKGVhKSIsIlowPHFVLHFVPihaMDxxVSxxVT4scVUpIiwiYzgoR0QsQCki
+LCJ+KHVILHVIKSIsIn4oQWopIiwiQChxVSkiLCJyNyhAKSIsIlR6PEA+KEApIiwiRTQoQCkiLCJ2czxA
+PihAKSIsImM4KEBbR3pdKSIsIn4oa1tHel0pIiwiYTIoeHU8cVU+KSIsIk83KE83KSIsInFVKEtOKSIs
+IkAoQCxxVSkiLCJjOCh+KCkpIiwiayhAKSIsIn4oQWp7cmVsYXRpdmVUbzpxVX0pIiwiYTIodUgpIl0s
+aW50ZXJjZXB0b3JzQnlUYWc6bnVsbCxsZWFmVGFnczpudWxsfQpILnhiKHYudHlwZVVuaXZlcnNlLEpT
+T04ucGFyc2UoJ3sicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImQ1IiwiV3QiOiJkNSIsInYwIjoiZXci
+LCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoidUgiLCJocyI6InVIIiwiWGciOiJRRiIsInljIjoiQWoi
+LCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoiRVQi
+LCJ5RSI6eyJhMiI6W119LCJZRSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W119LCJpQyI6eyJ2bSI6W119
+LCJrZCI6eyJ2bSI6W119LCJjNSI6eyJFSCI6W10sInZtIjpbXX0sImpkIjp7InpNIjpbIjEiXSwiY1gi
+OlsiMSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sIm0xIjp7IkFuIjpb
+IjEiXX0sInFJIjp7IkNQIjpbXSwiRksiOltdfSwidXIiOnsiS04iOltdLCJDUCI6W10sIkZLIjpbXX0s
+IlZBIjp7IkNQIjpbXSwiRksiOltdfSwiRHIiOnsicVUiOltdLCJ2WCI6W119LCJxaiI6eyJSZSI6WyJL
+TiJdLCJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04iLCJSZS5FIjoi
+S04ifSwiYlEiOnsiY1giOlsiMSJdfSwiYUwiOnsiY1giOlsiMSJdfSwibkgiOnsiYUwiOlsiMSJdLCJj
+WCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiQTgiOnsiYUwi
+OlsiMiJdLCJjWCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsiMSJdLCJj
+WC5FIjoiMSJ9LCJTTyI6eyJBbiI6WyIxIl19LCJYQyI6eyJSZSI6WyIxIl0sImxEIjpbIjEiXSwiek0i
+OlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6
+WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1Ui
+OnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJMSSI6
+eyJ2USI6W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119LCJYTyI6
+eyJHeiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6W119LCJyVCI6
+eyJFSCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJGbyI6WyIxIiwiMiJd
+LCJZayI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIyIn0sImk1Ijp7
+ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltdLCJ2WCI6
+W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJpYiJ9LCJQ
+YiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1guRSI6Ik9k
+In0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJiMCI6eyJYaiI6WyJAIl0sIkVUIjpb
+XSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQCJdLCJ6TSI6WyJDUCJdLCJFVCI6W10s
+IlNVIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxEIjpbIktO
+Il0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpb
+IktOIl19LCJ4aiI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1Ui
+OlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiZEUiOnsibEQiOlsiS04iXSwi
+ek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04i
+XSwibEQuRSI6IktOIn0sIlpBIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQi
+OltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJ3ZiI6eyJsRCI6
+WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMiOltdLCJj
+WCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiUHEiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsi
+QCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sImVF
+Ijp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJB
+UyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJWNiI6eyJuNiI6W10sImxEIjpbIktOIl0sInpN
+IjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0s
+ImxELkUiOiJLTiJ9LCJ1OSI6eyJYUyI6W119LCJoeiI6eyJYUyI6W119LCJpTSI6eyJYUyI6W119LCJa
+ZiI6eyJQZiI6WyIxIl19LCJ2cyI6eyJiOCI6WyIxIl19LCJDdyI6eyJYUyI6W119LCJtMCI6eyJKQiI6
+W119LCJKaSI6eyJKQiI6W119LCJiNiI6eyJYdiI6WyIxIl0sInh1IjpbIjEiXSwiY1giOlsiMSJdfSwi
+bG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwiTFUiOnsibEQiOlsiMSJdLCJ6TSI6WyIx
+Il0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJZayI6eyJa
+MCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIyIl0sIlBu
+IjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6WyIxIl0s
+Inh1IjpbIjEiXSwiY1giOlsiMSJdfSwiWHYiOnsieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZ
+ayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7
+ImFMIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJVayI6
+WyJ6TTxLTj4iLCJxVSJdLCJVay5TIjoiek08S04+In0sIlU4Ijp7IndJIjpbInpNPEtOPiIsInFVIl19
+LCJaaSI6eyJVayI6WyJxVSIsInpNPEtOPiJdfSwiYnkiOnsiVWsiOlsiayIsInFVIl0sIlVrLlMiOiJr
+In0sIk14Ijp7IndJIjpbInFVIiwiayJdfSwidTUiOnsiVWsiOlsicVUiLCJ6TTxLTj4iXSwiVWsuUyI6
+InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08S04+Il19LCJHWSI6eyJ3SSI6WyJ6TTxLTj4iLCJxVSJd
+fSwiQ1AiOnsiRksiOltdfSwiQzYiOnsiWFMiOltdfSwibiI6eyJYUyI6W119LCJ1Ijp7IlhTIjpbXX0s
+ImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhTIjpbXX0s
+ImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhTIjpbXX0s
+IktZIjp7IlhTIjpbXX0sImMiOnsiWFMiOltdfSwiS04iOnsiRksiOltdfSwiek0iOnsiY1giOlsiMSJd
+fSwiaWIiOnsiT2QiOltdfSwieHUiOnsiY1giOlsiMSJdfSwicVUiOnsidlgiOltdfSwiUm4iOnsiQkwi
+OltdfSwiRG4iOnsiaUQiOltdfSwiVWYiOnsiaUQiOltdfSwicWUiOnsiaUQiOltdfSwicUUiOnsiY3Yi
+OltdLCJ1SCI6W10sIkQwIjpbXX0sIkdoIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJmWSI6eyJj
+diI6W10sInVIIjpbXSwiRDAiOltdfSwibkIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlFQIjp7
+ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJueCI6eyJ1SCI6W10sIkQwIjpbXX0sIlFGIjp7InVIIjpb
+XSwiRDAiOltdfSwiSUIiOnsidG4iOlsiRksiXX0sInd6Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJj
+WCI6WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiVDUiOnsiQXoiOltdfSwi
+aDQiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlZiIjp7InVIIjpbXSwiRDAiOltdfSwiTzciOnsi
+RDAiOltdfSwid2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiZTciOnsibEQiOlsidUgiXSwiek0i
+OlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0sIkJIIjp7IkdtIjpb
+InVIIl0sImxEIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImNYIjpbInVIIl0sImxELkUi
+OiJ1SCIsIkdtLkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZXciOnsiZWEi
+OltdfSwibHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlRiIjp7ImN2IjpbXSwidUgiOltdLCJE
+MCI6W119LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiQlQiOnsiY3YiOltdLCJ1SCI6W10s
+IkQwIjpbXX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ3NiI6eyJlYSI6W119LCJLNSI6
+eyJ2NiI6W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNRIjp7InVIIjpbXSwiRDAiOltdfSwidzQi
+OnsidG4iOlsiRksiXX0sInJoIjp7IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVIIl0sIlhq
+IjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJEOSI6eyJZayI6WyJx
+VSIsInFVIl0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUi
+LCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6
+WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJdLCJ4dSI6
+WyJxVSJdLCJjWCI6WyJxVSJdfSwiUk8iOnsicWgiOlsiMSJdfSwiQ3EiOnsiUk8iOlsiMSJdLCJxaCI6
+WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119LCJtNiI6eyJrRiI6W119LCJjdCI6eyJr
+RiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIxIl19LCJkVyI6eyJ2NiI6W10sIkQwIjpb
+XX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFzIjp7ImxmIjpbInFVIl0sInh1IjpbInFV
+Il0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119LCJUeiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwi
+RTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7ImQ1IjpbXSwiY3YiOltdLCJ1SCI6W10s
+IkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImNYIjpbInFVIl19LCJkNSI6eyJj
+diI6W10sInVIIjpbXSwiRDAiOltdfSwibjYiOnsiek0iOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJd
+fSwiWEEiOnsia0YiOltdfSwiT0YiOnsiTHUiOltdfSwicnUiOnsiTHUiOltdfSwiSVYiOnsiTHUiOltd
+fX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNlKCd7ImJRIjoxLCJYQyI6MSwiTU8iOjEs
+ImtUIjoyLCJtVyI6MSwiTFUiOjEsImlsIjoyLCJWaiI6MSwiblkiOjEsIldZIjoxLCJjbyI6MX0nKSkK
+dmFyIHU9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgdD1ILk4wCnJldHVybntrOnQoIkdoIiksbjp0KCJDdyIp
+LEY6dCgibkIiKSxkOnQoIkF6IiksWTp0KCJRUCIpLGdGOnQoIlBEPEdELEA+IiksaDp0KCJjdiIpLGJV
+OnQoIlhTIiksQjp0KCJlYSIpLGFTOnQoIkQwIiksYzg6dCgiVDUiKSxaOnQoIkVIIiksYzp0KCJiODxA
+PiIpLHI6dCgiTzciKSxJOnQoIlNnIiksbzp0KCJ2USIpLGVoOnQoImNYPHVIPiIpLFg6dCgiY1g8cVU+
+IiksUjp0KCJjWDxAPiIpLGZBOnQoImpkPFNlPiIpLGJQOnQoImpkPHVGPiIpLG06dCgiamQ8a0Y+Iiks
+czp0KCJqZDxxVT4iKSxoaDp0KCJqZDx5RD4iKSxhSjp0KCJqZDx3Yj4iKSxiOnQoImpkPEA+IiksdDp0
+KCJqZDxLTj4iKSxlSDp0KCJ2bSIpLGc6dCgiYzUiKSxhVTp0KCJYajxAPiIpLGFtOnQoIlR6PEA+Iiks
+ZW86dCgiTjU8R0QsQD4iKSx1OnQoIkU0IiksZHo6dCgiaEYiKSxpOnQoInpNPHFVPiIpLGo6dCgiek08
+QD4iKSxMOnQoInpNPEtOPiIpLGY6dCgiWjA8cVUscVU+IiksYTp0KCJaMDxxVSxAPiIpLEc6dCgiWjA8
+QCxAPiIpLGR2OnQoIkE4PHFVLHFVPiIpLGRvOnQoIkE4PHFVLEA+IiksVjp0KCJBaiIpLGREOnQoIkVU
+IiksYm06dCgiVjYiKSxBOnQoInVIIiksZTp0KCJrRiIpLFA6dCgiYzgiKSxLOnQoImsiKSxwOnQoImV3
+IikscTp0KCJ0bjxGSz4iKSxmdjp0KCJ3TCIpLGV3OnQoIm5kIiksQzp0KCJ4dTxxVT4iKSxsOnQoIkd6
+IiksTjp0KCJxVSIpLGRHOnQoInFVKHFVKSIpLGc3OnQoImQ1IiksZm86dCgiR0QiKSxhVzp0KCJ5WSIp
+LHY6dCgiQVMiKSxnYzp0KCJuNiIpLGFrOnQoImtkIiksVDp0KCJHajxxVSxxVT4iKSx3OnQoImlEIiks
+Y2M6dCgiVTU8cVU+IiksZzQ6dCgiSzUiKSxjaTp0KCJ2NiIpLGcyOnQoIkNtIiksRTp0KCJaZjxPNz4i
+KSxoOTp0KCJDUSIpLGFjOnQoImU3IiksUTp0KCJDcTxBaj4iKSxTOnQoInd6PGN2PiIpLHg6dCgiRmU8
+QCxAPiIpLGFvOnQoInZzPE83PiIpLF86dCgidnM8QD4iKSxmSjp0KCJ2czxLTj4iKSxPOnQoIkpRIiks
+Sjp0KCJibiIpLGNKOnQoImEyIiksYWw6dCgiYTIoaykiKSxiQjp0KCJhMihxVSkiKSxiZjp0KCJhMihA
+KSIpLHo6dCgiQCIpLGZPOnQoIkAoKSIpLFU6dCgiQChlYSkiKSx5OnQoIkAoaykiKSxlcDp0KCJAKGss
+aykiKSxXOnQoIkAoayxHeikiKSxjaDp0KCJAKHh1PHFVPikiKSxkTzp0KCJAKHFVKSIpLGI4OnQoIkAo
+QCxAKSIpLEg6dCgifiIpLE06dCgifigpIiksYW46dCgifihldykiKSxEOnQoIn4ocVUscVUpIiksY0E6
+dCgifihxVSxAKSIpfX0pKCk7KGZ1bmN0aW9uIGNvbnN0YW50cygpe3ZhciB0PWh1bmtIZWxwZXJzLm1h
+a2VDb25zdExpc3QKQy5SWT1XLlFQLnByb3RvdHlwZQpDLkJaPVcuVmIucHJvdG90eXBlCkMuRHQ9Vy5P
+Ny5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpDLk5tPUouamQucHJvdG90eXBlCkMuam49Si51
+ci5wcm90b3R5cGUKQy5qTj1KLllFLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5E
+ci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMuTHQ9Vy5T
+Ti5wcm90b3R5cGUKQy5aUT1KLmlDLnByb3RvdHlwZQpDLkllPVcuVGIucHJvdG90eXBlCkMudkI9Si5r
+ZC5wcm90b3R5cGUKQy5vbD1XLks1LnByb3RvdHlwZQpDLnk4PW5ldyBQLlU4KCkKQy5oOT1uZXcgUC5D
+VigpCkMuTzQ9ZnVuY3Rpb24gZ2V0VGFnRmFsbGJhY2sobykgewogIHZhciBzID0gT2JqZWN0LnByb3Rv
+dHlwZS50b1N0cmluZy5jYWxsKG8pOwogIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEp
+Owp9CkMuWXE9ZnVuY3Rpb24oKSB7CiAgdmFyIHRvU3RyaW5nRnVuY3Rpb24gPSBPYmplY3QucHJvdG90
+eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIGdldFRhZyhvKSB7CiAgICB2YXIgcyA9IHRvU3RyaW5nRnVu
+Y3Rpb24uY2FsbChvKTsKICAgIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEpOwogIH0K
+ICBmdW5jdGlvbiBnZXRVbmtub3duVGFnKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoL15IVE1MW0EtWl0u
+KkVsZW1lbnQkLy50ZXN0KHRhZykpIHsKICAgICAgdmFyIG5hbWUgPSB0b1N0cmluZ0Z1bmN0aW9uLmNh
+bGwob2JqZWN0KTsKICAgICAgaWYgKG5hbWUgPT0gIltvYmplY3QgT2JqZWN0XSIpIHJldHVybiBudWxs
+OwogICAgICByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93
+blRhZ0dlbmVyaWNCcm93c2VyKG9iamVjdCwgdGFnKSB7CiAgICBpZiAoc2VsZi5IVE1MRWxlbWVudCAm
+JiBvYmplY3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICBy
+ZXR1cm4gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZyk7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZv
+clRhZyh0YWcpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVs
+bDsKICAgIGlmICh0eXBlb2Ygd2luZG93W3RhZ10gPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwog
+ICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9y
+ICE9ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlw
+ZTsKICB9CiAgZnVuY3Rpb24gZGlzY3JpbWluYXRvcih0YWcpIHsgcmV0dXJuIG51bGw7IH0KICB2YXIg
+aXNCcm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IjsKICByZXR1cm4gewogICAgZ2V0
+VGFnOiBnZXRUYWcsCiAgICBnZXRVbmtub3duVGFnOiBpc0Jyb3dzZXIgPyBnZXRVbmtub3duVGFnR2Vu
+ZXJpY0Jyb3dzZXIgOiBnZXRVbmtub3duVGFnLAogICAgcHJvdG90eXBlRm9yVGFnOiBwcm90b3R5cGVG
+b3JUYWcsCiAgICBkaXNjcmltaW5hdG9yOiBkaXNjcmltaW5hdG9yIH07Cn0KQy53Yj1mdW5jdGlvbihn
+ZXRUYWdGYWxsYmFjaykgewogIHJldHVybiBmdW5jdGlvbihob29rcykgewogICAgaWYgKHR5cGVvZiBu
+YXZpZ2F0b3IgIT0gIm9iamVjdCIpIHJldHVybiBob29rczsKICAgIHZhciB1YSA9IG5hdmlnYXRvci51
+c2VyQWdlbnQ7CiAgICBpZiAodWEuaW5kZXhPZigiRHVtcFJlbmRlclRyZWUiKSA+PSAwKSByZXR1cm4g
+aG9va3M7CiAgICBpZiAodWEuaW5kZXhPZigiQ2hyb21lIikgPj0gMCkgewogICAgICBmdW5jdGlvbiBj
+b25maXJtKHApIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PSAib2JqZWN0IiAmJiB3aW5k
+b3dbcF0gJiYgd2luZG93W3BdLm5hbWUgPT0gcDsKICAgICAgfQogICAgICBpZiAoY29uZmlybSgiV2lu
+ZG93IikgJiYgY29uZmlybSgiSFRNTEVsZW1lbnQiKSkgcmV0dXJuIGhvb2tzOwogICAgfQogICAgaG9v
+a3MuZ2V0VGFnID0gZ2V0VGFnRmFsbGJhY2s7CiAgfTsKfQpDLktVPWZ1bmN0aW9uKGhvb2tzKSB7CiAg
+aWYgKHR5cGVvZiBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcgIT0gImZ1bmN0aW9uIikgcmV0dXJu
+IGhvb2tzOwogIGhvb2tzLmdldFRhZyA9IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyhob29rcy5n
+ZXRUYWcpOwp9CkMuZlE9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFn
+OwogIHZhciBwcm90b3R5cGVGb3JUYWcgPSBob29rcy5wcm90b3R5cGVGb3JUYWc7CiAgZnVuY3Rpb24g
+Z2V0VGFnRml4ZWQobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIGlmICh0YWcgPT0gIkRv
+Y3VtZW50IikgewogICAgICBpZiAoISFvLnhtbFZlcnNpb24pIHJldHVybiAiIURvY3VtZW50IjsKICAg
+ICAgcmV0dXJuICIhSFRNTERvY3VtZW50IjsKICAgIH0KICAgIHJldHVybiB0YWc7CiAgfQogIGZ1bmN0
+aW9uIHByb3RvdHlwZUZvclRhZ0ZpeGVkKHRhZykgewogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSBy
+ZXR1cm4gbnVsbDsKICAgIHJldHVybiBwcm90b3R5cGVGb3JUYWcodGFnKTsKICB9CiAgaG9va3MuZ2V0
+VGFnID0gZ2V0VGFnRml4ZWQ7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFn
+Rml4ZWQ7Cn0KQy5kaz1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2
+aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdl
+bnQuaW5kZXhPZigiRmlyZWZveCIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdldFRhZyA9IGhv
+b2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZl
+bnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkdlb0dlb2xvY2F0aW9uIjog
+Ikdlb2xvY2F0aW9uIiwKICAgICJMb2NhdGlvbiI6ICIhTG9jYXRpb24iLAogICAgIldvcmtlck1lc3Nh
+Z2VFdmVudCI6ICJNZXNzYWdlRXZlbnQiLAogICAgIlhNTERvY3VtZW50IjogIiFEb2N1bWVudCJ9Owog
+IGZ1bmN0aW9uIGdldFRhZ0ZpcmVmb3gobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHJl
+dHVybiBxdWlja01hcFt0YWddIHx8IHRhZzsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRmlyZWZv
+eDsKfQpDLnhpPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0
+b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5p
+bmRleE9mKCJUcmlkZW50LyIpID09IC0xKSByZXR1cm4gaG9va3M7CiAgdmFyIGdldFRhZyA9IGhvb2tz
+LmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAiQmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZlbnQi
+LAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQiLAogICAgIkhUTUxEREVsZW1lbnQiOiAiSFRN
+TEVsZW1lbnQiLAogICAgIkhUTUxEVEVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIkhUTUxQaHJh
+c2VFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJQb3NpdGlvbiI6ICJHZW9wb3NpdGlvbiIKICB9
+OwogIGZ1bmN0aW9uIGdldFRhZ0lFKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICB2YXIg
+bmV3VGFnID0gcXVpY2tNYXBbdGFnXTsKICAgIGlmIChuZXdUYWcpIHJldHVybiBuZXdUYWc7CiAgICBp
+ZiAodGFnID09ICJPYmplY3QiKSB7CiAgICAgIGlmICh3aW5kb3cuRGF0YVZpZXcgJiYgKG8gaW5zdGFu
+Y2VvZiB3aW5kb3cuRGF0YVZpZXcpKSByZXR1cm4gIkRhdGFWaWV3IjsKICAgIH0KICAgIHJldHVybiB0
+YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0lFKHRhZykgewogICAgdmFyIGNvbnN0cnVj
+dG9yID0gd2luZG93W3RhZ107CiAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7
+CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRU
+YWdJRTsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdJRTsKfQpDLmk3PWZ1
+bmN0aW9uKGhvb2tzKSB7IHJldHVybiBob29rczsgfQoKQy5DdD1uZXcgUC5ieSgpCkMuRXE9bmV3IFAu
+azUoKQpDLnhNPW5ldyBQLnU1KCkKQy5Raz1uZXcgUC5FMygpCkMuTlU9bmV3IFAuSmkoKQpDLkEzPW5l
+dyBQLk14KG51bGwpCkMuR2I9SC5WTSh0KFsxMjcsMjA0Nyw2NTUzNSwxMTE0MTExXSksdS50KQpDLmFr
+PUguVk0odChbMCwwLDMyNzc2LDMzNzkyLDEsMTAyNDAsMCwwXSksdS50KQpDLmNtPUguVk0odChbIio6
+OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dhYmxlIiwiKjo6aGlkZGVuIiwiKjo6aWQiLCIqOjppbmVy
+dCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJlZiIsIio6Oml0ZW1zY29wZSIsIio6OmxhbmciLCIqOjpz
+cGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0cmFuc2xhdGUiLCJBOjphY2Nlc3NrZXkiLCJBOjpjb29y
+ZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUiLCJBOjpzaGFwZSIsIkE6OnRhYmluZGV4IiwiQTo6dGFy
+Z2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vzc2tleSIsIkFSRUE6OmFsdCIsIkFSRUE6OmNvb3JkcyIs
+IkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBlIiwiQVJFQTo6dGFiaW5kZXgiLCJBUkVBOjp0YXJnZXQi
+LCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6bG9vcCIsIkFVRElPOjptZWRpYWdyb3VwIiwiQVVESU86
+Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJCRE86OmRpciIsIkJPRFk6OmFsaW5rIiwiQk9EWTo6Ymdj
+b2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0ZXh0IiwiQk9EWTo6dmxpbmsiLCJCUjo6Y2xlYXIiLCJC
+VVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6ZGlzYWJsZWQiLCJCVVRUT046Om5hbWUiLCJCVVRUT046
+OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwiQlVUVE9OOjp2YWx1ZSIsIkNBTlZBUzo6aGVpZ2h0Iiwi
+Q0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFsaWduIiwiQ09MOjphbGlnbiIsIkNPTDo6Y2hhciIsIkNP
+TDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNPTDo6dmFsaWduIiwiQ09MOjp3aWR0aCIsIkNPTEdST1VQ
+OjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwiQ09MR1JPVVA6OmNoYXJvZmYiLCJDT0xHUk9VUDo6c3Bh
+biIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xHUk9VUDo6d2lkdGgiLCJDT01NQU5EOjpjaGVja2VkIiwi
+Q09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6OmRpc2FibGVkIiwiQ09NTUFORDo6bGFiZWwiLCJDT01N
+QU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6dHlwZSIsIkRBVEE6OnZhbHVlIiwiREVMOjpkYXRldGlt
+ZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNvbXBhY3QiLCJESVY6OmFsaWduIiwiREw6OmNvbXBhY3Qi
+LCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05UOjpjb2xvciIsIkZPTlQ6OmZhY2UiLCJGT05UOjpzaXpl
+IiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0b2NvbXBsZXRlIiwiRk9STTo6ZW5jdHlwZSIsIkZPUk06
+Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JNOjpub3ZhbGlkYXRlIiwiRk9STTo6dGFyZ2V0IiwiRlJB
+TUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6YWxpZ24iLCJIMzo6YWxpZ24iLCJINDo6YWxpZ24iLCJI
+NTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6YWxpZ24iLCJIUjo6bm9zaGFkZSIsIkhSOjpzaXplIiwi
+SFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIsIklGUkFNRTo6YWxpZ24iLCJJRlJBTUU6OmZyYW1lYm9y
+ZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJBTUU6Om1hcmdpbmhlaWdodCIsIklGUkFNRTo6bWFyZ2lu
+d2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1HOjphbGlnbiIsIklNRzo6YWx0IiwiSU1HOjpib3JkZXIi
+LCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNlIiwiSU1HOjppc21hcCIsIklNRzo6bmFtZSIsIklNRzo6
+dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6OndpZHRoIiwiSU5QVVQ6OmFjY2VwdCIsIklOUFVUOjph
+Y2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJTlBVVDo6YWx0IiwiSU5QVVQ6OmF1dG9jb21wbGV0ZSIs
+IklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6Y2hlY2tlZCIsIklOUFVUOjpkaXNhYmxlZCIsIklOUFVU
+OjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAiLCJJTlBVVDo6bGlzdCIsIklOUFVUOjptYXgiLCJJTlBV
+VDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIsIklOUFVUOjptdWx0aXBsZSIsIklOUFVUOjpuYW1lIiwi
+SU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6OnJlYWRvbmx5IiwiSU5QVVQ6OnJlcXVpcmVkIiwiSU5Q
+VVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklOUFVUOjp0YWJpbmRleCIsIklOUFVUOjp0eXBlIiwiSU5Q
+VVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIsIklOUzo6ZGF0ZXRpbWUiLCJLRVlHRU46OmRpc2FibGVk
+IiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VOOjpuYW1lIiwiTEFCRUw6OmFjY2Vzc2tleSIsIkxBQkVM
+Ojpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIsIkxFR0VORDo6YWxpZ24iLCJMSTo6dHlwZSIsIkxJOjp2
+YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpuYW1lIiwiTUVOVTo6Y29tcGFjdCIsIk1FTlU6OmxhYmVs
+IiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdoIiwiTUVURVI6OmxvdyIsIk1FVEVSOjptYXgiLCJNRVRF
+Ujo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JKRUNUOjp0eXBlbXVzdG1hdGNoIiwiT0w6OmNvbXBhY3Qi
+LCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQiLCJPTDo6dHlwZSIsIk9QVEdST1VQOjpkaXNhYmxlZCIs
+Ik9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6ZGlzYWJsZWQiLCJPUFRJT046OmxhYmVsIiwiT1BUSU9O
+OjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUiLCJPVVRQVVQ6OmZvciIsIk9VVFBVVDo6bmFtZSIsIlA6
+OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dSRVNTOjptYXgiLCJQUk9HUkVTUzo6bWluIiwiUFJPR1JF
+U1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29tcGxldGUiLCJTRUxFQ1Q6OmRpc2FibGVkIiwiU0VMRUNU
+OjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIsIlNFTEVDVDo6cmVxdWlyZWQiLCJTRUxFQ1Q6OnNpemUi
+LCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNFOjp0eXBlIiwiVEFCTEU6OmFsaWduIiwiVEFCTEU6OmJn
+Y29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFCTEU6OmNlbGxwYWRkaW5nIiwiVEFCTEU6OmNlbGxzcGFj
+aW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6OnJ1bGVzIiwiVEFCTEU6OnN1bW1hcnkiLCJUQUJMRTo6
+d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9EWTo6Y2hhciIsIlRCT0RZOjpjaGFyb2ZmIiwiVEJPRFk6
+OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFsaWduIiwiVEQ6OmF4aXMiLCJURDo6Ymdjb2xvciIsIlRE
+OjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6Y29sc3BhbiIsIlREOjpoZWFkZXJzIiwiVEQ6OmhlaWdo
+dCIsIlREOjpub3dyYXAiLCJURDo6cm93c3BhbiIsIlREOjpzY29wZSIsIlREOjp2YWxpZ24iLCJURDo6
+d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5IiwiVEVYVEFSRUE6OmF1dG9jb21wbGV0ZSIsIlRFWFRB
+UkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2FibGVkIiwiVEVYVEFSRUE6OmlucHV0bW9kZSIsIlRFWFRB
+UkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNlaG9sZGVyIiwiVEVYVEFSRUE6OnJlYWRvbmx5IiwiVEVY
+VEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6OnJvd3MiLCJURVhUQVJFQTo6dGFiaW5kZXgiLCJURVhU
+QVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIsIlRGT09UOjpjaGFyIiwiVEZPT1Q6OmNoYXJvZmYiLCJU
+Rk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJUSDo6YWxpZ24iLCJUSDo6YXhpcyIsIlRIOjpiZ2NvbG9y
+IiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIsIlRIOjpjb2xzcGFuIiwiVEg6OmhlYWRlcnMiLCJUSDo6
+aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpyb3dzcGFuIiwiVEg6OnNjb3BlIiwiVEg6OnZhbGlnbiIs
+IlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIsIlRIRUFEOjpjaGFyIiwiVEhFQUQ6OmNoYXJvZmYiLCJU
+SEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwiVFI6OmJnY29sb3IiLCJUUjo6Y2hhciIsIlRSOjpjaGFy
+b2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpkZWZhdWx0IiwiVFJBQ0s6OmtpbmQiLCJUUkFDSzo6bGFi
+ZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpjb21wYWN0IiwiVUw6OnR5cGUiLCJWSURFTzo6Y29udHJv
+bHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86Omxvb3AiLCJWSURFTzo6bWVkaWFncm91cCIsIlZJREVP
+OjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwiVklERU86OndpZHRoIl0pLHUucykKQy5WQz1ILlZNKHQo
+WzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5tSz1ILlZNKHQo
+WzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0N10pLHUudCkKQy5TcT1ILlZNKHQoWyJI
+RUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9OVCIsIkJSIiwiQ09MIiwiQ09MR1JPVVAiLCJFTUJFRCIs
+IkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklNQUdFIiwiSU1HIiwiSU5QVVQiLCJJU0lOREVYIiwiTElO
+SyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIsIlNUWUxFIiwiVElUTEUiLCJXQlIiXSksdS5zKQpDLnhE
+PUguVk0odChbXSksdS5zKQpDLmRuPUguVk0odChbXSksdS5iKQpDLnRvPUguVk0odChbMCwwLDMyNzIy
+LDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50KQpDLkYzPUguVk0odChbMCwwLDI0NTc2
+LDEwMjMsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuZWE9SC5WTSh0KFswLDAsMzI3NTQs
+MTEyNjMsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuWko9SC5WTSh0KFswLDAsMzI3MjIs
+MTIyODcsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuV2Q9SC5WTSh0KFswLDAsNjU0OTAs
+MTIyODcsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuUXg9SC5WTSh0KFsiYmluZCIsImlm
+IiwicmVmIiwicmVwZWF0Iiwic3ludGF4Il0pLHUucykKQy5CST1ILlZNKHQoWyJBOjpocmVmIiwiQVJF
+QTo6aHJlZiIsIkJMT0NLUVVPVEU6OmNpdGUiLCJCT0RZOjpiYWNrZ3JvdW5kIiwiQ09NTUFORDo6aWNv
+biIsIkRFTDo6Y2l0ZSIsIkZPUk06OmFjdGlvbiIsIklNRzo6c3JjIiwiSU5QVVQ6OnNyYyIsIklOUzo6
+Y2l0ZSIsIlE6OmNpdGUiLCJWSURFTzo6cG9zdGVyIl0pLHUucykKQy5XTz1uZXcgSC5MUCgwLHt9LEMu
+eEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaFU9SC5WTSh0KFtdKSxILk4wKCJqZDxHRD4iKSkKQy5DTT1u
+ZXcgSC5MUCgwLHt9LEMuaFUsSC5OMCgiTFA8R0QsQD4iKSkKQy5UZT1uZXcgSC53digiY2FsbCIpfSko
+KTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC55aj0wCiQubUo9bnVsbAokLlA0PW51bGwKJC5ORj1u
+dWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2PW51bGwKJC5TNj1u
+dWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1bXQokLnhvPW51bGwK
+JC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1QLkZsKHUuTix1LlopCiQuSTY9bnVsbAok
+LkZmPW51bGx9KSgpOyhmdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXJzKCl7dmFyIHQ9aHVua0hlbHBlcnMu
+bGF6eQp0KCQsImZhIiwidyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRDbG9zdXJl
+Iil9KQp0KCQsIllmIiwiVU4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9qcyIpfSkKdCgk
+LCJVMiIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmluZzpmdW5jdGlvbigp
+e3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQp0KCQsInhxIiwibHEiLGZ1bmN0aW9uKCl7cmV0dXJuIEgu
+Y00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVy
+JCJ9fSkpfSkKdCgkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcobnVsbCkpfSkK
+dCgkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVu
+dHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0
+Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJxaSIsIktmIixmdW5jdGlvbigpe3JldHVy
+biBILmNNKEguUzcodm9pZCAwKSl9KQp0KCQsInJaIiwiWmgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00o
+ZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5eyh2b2lkIDApLiRt
+ZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgk
+LCJrcSIsImNQIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkKdCgkLCJ0dCIsImMz
+IixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1ldGhvZCR9Y2F0Y2go
+cyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJkdCIsIkhLIixmdW5jdGlvbigpe3JldHVybiBI
+LmNNKEguTWoodm9pZCAwKSl9KQp0KCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oZnVu
+Y3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkp
+fSkKdCgkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQp0KCQsImtoIiwicmYiLGZ1
+bmN0aW9uKCl7cmV0dXJuIFAuV0koKX0pCnQoJCwiYnQiLCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5E
+UShILlhGKEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5
+LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMs
+MTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcs
+MjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcs
+NDgsNDksNTAsNTEsLTIsLTIsLTIsLTIsLTJdLHUudCkpKX0pCnQoJCwiTTUiLCJ3USIsZnVuY3Rpb24o
+KXtyZXR1cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3Ry
+aW5nLmNhbGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09Indp
+bjMyIn0pCnQoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpf
+YS16fl0qJCIpfSkKdCgkLCJKRyIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLnV4KCl9KQp0KCQsIlND
+IiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNT
+IiwiQVJFQSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJM
+T0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwi
+Q09ERSIsIkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVM
+IiwiREVUQUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklH
+Q0FQVElPTiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQi
+LCJINSIsIkg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQi
+LCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRF
+UiIsIk5BViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIs
+IlBST0dSRVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNF
+IiwiU1BBTiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRC
+T0RZIiwiVEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNL
+IiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHUuTil9KQp0KCQsIlg0IiwiaEciLGZ1
+bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKdCgkLCJ3TyIsIm93IixmdW5jdGlvbigpe3Jl
+dHVybiB1LnUuYihQLk5EKHNlbGYpKX0pCnQoJCwia3QiLCJSOCIsZnVuY3Rpb24oKXtyZXR1cm4gSC5Z
+ZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnQoJCwiSmUiLCJrSSIsZnVuY3Rpb24oKXtyZXR1cm4gZnVu
+Y3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQp0KCQsInF0IiwiekIiLGZ1bmN0aW9uKCl7cmV0
+dXJuIG5ldyBULkdWKCl9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9
+KQp0KCQsIm1NIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQp0KCQsInly
+IiwiYkQiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAu
+bnUoIl4vIikpfSkKdCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJb
+L1xcXFxdIiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxc
+XC9dK3xbYS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQp0KCQs
+ImFrIiwiRWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpB
+LVpdWy0rLmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0q
+Oi8vW14vXSoiKSxQLm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5S
+aCgpfSl9KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rp
+b24oYSl7dmFyIG49e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0
+VG9GYXN0T2JqZWN0KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB0KCJf
+X19kYXJ0XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIg
+cj1PYmplY3Rbc118fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHE9Il9aeFl4WCIK
+Zm9yKHZhciBwPTA7O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGluIHIpKXtyW29dPTEK
+di5pc29sYXRlVGFnPW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFn
+KCJkaXNwYXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5
+VGFnKHtET01FcnJvcjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5h
+dmlnYXRvcjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJN
+ZWRpYUVycm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIs
+UmFuZ2U6Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3OkguRVQs
+RmxvYXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJy
+YXk6SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFycmF5OkguUHEsVWlu
+dDhDbGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhU
+TUxBdWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5x
+RSxIVE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVs
+ZW1lbnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRN
+TERldGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpX
+LnFFLEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxl
+bWVudDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxI
+dG1sRWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFF
+LEhUTUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpX
+LnFFLEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1l
+bnQ6Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFF
+bGVtZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9M
+aXN0RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpX
+LnFFLEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1F
+bGVtZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1M
+UHJvZ3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50
+OlcucUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNl
+RWxlbWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1M
+VGFibGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxl
+RGF0YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFi
+bGVDb2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpX
+LnFFLEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxl
+bWVudDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1M
+RGlyZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6
+Vy5xRSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVs
+ZW1lbnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxC
+YXNlRWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246
+Vy5ueCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpX
+Lm54LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6
+Vy5vSixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01F
+eGNlcHRpb246Vy5OaCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50
+OlcuY3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBs
+YXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRG
+ZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRj
+aEZhaWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJv
+bXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQ
+YXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21F
+dmVudDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVh
+LEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50
+OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNo
+RXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZl
+bnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxN
+ZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJh
+Y2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJ
+TWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEs
+UGFnZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVx
+dWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rp
+b25BdmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEs
+UHJvbWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVu
+dDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50
+OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxT
+ZW5zb3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29n
+bml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVh
+LFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRU
+cmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxW
+UlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0
+aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVu
+dDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50Olcu
+ZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuVDUsSFRN
+TEZvcm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1
+ZXN0OlcuTzcsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0
+aW9uOlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdo
+ZWVsRXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpXLnVILERvY3VtZW50
+VHlwZTpXLnVILE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFy
+YWdyYXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6
+Vy5ldyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVS
+b3dFbGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5CVCxIVE1MVGVtcGxhdGVFbGVt
+ZW50OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50
+OlcudzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5L
+NSxET01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3Jr
+ZXJHbG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFs
+U2NvcGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVN
+YXA6Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1l
+bnQ6UC5uZCxTVkdBRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUsU1ZHQW5pbWF0ZU1v
+dGlvbkVsZW1lbnQ6UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGlv
+bkVsZW1lbnQ6UC5kNSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhFbGVtZW50OlAuZDUs
+U1ZHRGVmc0VsZW1lbnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2NhcmRFbGVtZW50OlAu
+ZDUsU1ZHRWxsaXBzZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1LFNWR0ZFQ29sb3JN
+YXRyaXhFbGVtZW50OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5kNSxTVkdGRUNv
+bXBvc2l0ZUVsZW1lbnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmQ1LFNWR0ZFRGlm
+ZnVzZUxpZ2h0aW5nRWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmQ1LFNW
+R0ZFRGlzdGFudExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAuZDUsU1ZHRkVGdW5j
+QUVsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dFbGVtZW50OlAuZDUs
+U1ZHRkVGdW5jUkVsZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5kNSxTVkdGRUlt
+YWdlRWxlbWVudDpQLmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJnZU5vZGVFbGVtZW50
+OlAuZDUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmQ1LFNW
+R0ZFUG9pbnRMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuZDUs
+U1ZHRkVTcG90TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1LFNWR0ZFVHVyYnVs
+ZW5jZUVsZW1lbnQ6UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWlnbk9iamVjdEVsZW1l
+bnQ6UC5kNSxTVkdHRWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1LFNWR0dyYXBoaWNz
+RWxlbWVudDpQLmQ1LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50OlAuZDUsU1ZHTGlu
+ZWFyR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNWR01hc2tFbGVtZW50
+OlAuZDUsU1ZHTWV0YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5kNSxTVkdQYXR0ZXJu
+RWxlbWVudDpQLmQ1LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVFbGVtZW50OlAuZDUs
+U1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5kNSxTVkdTZXRFbGVt
+ZW50OlAuZDUsU1ZHU3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5kNSxTVkdTVkdFbGVt
+ZW50OlAuZDUsU1ZHU3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6UC5kNSxTVkdUU3Bh
+bkVsZW1lbnQ6UC5kNSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0RWxlbWVudDpQLmQ1
+LFNWR1RleHRQYXRoRWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5kNSxTVkdU
+aXRsZUVsZW1lbnQ6UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1lbnQ6UC5kNSxTVkdH
+cmFkaWVudEVsZW1lbnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmQ1
+LFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5kNSxTVkdFbGVtZW50
+OlAuZDV9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLERPTUlt
+cGxlbWVudGF0aW9uOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNv
+bmN1cnJlbnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0
+cmFpbmVkRXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVl
+LERhdGFWaWV3OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0
+NjRBcnJheTp0cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUs
+VWludDE2QXJyYXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2Fu
+dmFzUGl4ZWxBcnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhU
+TUxCUkVsZW1lbnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRy
+dWUsSFRNTENvbnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxl
+bWVudDp0cnVlLEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxI
+VE1MRGlhbG9nRWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0
+cnVlLEhUTUxGaWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVt
+ZW50OnRydWUsSFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElG
+cmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVl
+LEhUTUxMSUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6
+dHJ1ZSxIVE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1l
+bnQ6dHJ1ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJF
+bGVtZW50OnRydWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9i
+amVjdEVsZW1lbnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6
+dHJ1ZSxIVE1MT3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVy
+ZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxI
+VE1MUXVvdGVFbGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVu
+dDp0cnVlLEhUTUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5F
+bGVtZW50OnRydWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRy
+dWUsSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxI
+VE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1M
+VGV4dEFyZWFFbGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0
+cnVlLEhUTUxUcmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25F
+bGVtZW50OnRydWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUs
+SFRNTEZvbnRFbGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1l
+bnQ6dHJ1ZSxIVE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9y
+RWxlbWVudDp0cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6
+ZmFsc2UsSFRNTEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0
+cnVlLENvbW1lbnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5
+bGVEZWNsYXJhdGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6
+dHJ1ZSxYTUxEb2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTVJl
+Y3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVu
+dEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUs
+QXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRy
+dWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxC
+YWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVm
+b3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUs
+Q2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VN
+b3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUs
+RXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6
+dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBh
+ZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNy
+eXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVu
+dDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNz
+YWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVl
+LE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZl
+bnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0
+cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6
+dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25F
+dmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9u
+ZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZl
+bnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0
+cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUs
+U3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxU
+cmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRy
+dWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1
+ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURC
+VmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVk
+aW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElu
+cHV0RXZlbnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0
+cnVlLEhpc3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0
+dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3Vz
+ZUV2ZW50OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVl
+LERvY3VtZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9k
+ZTpmYWxzZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVu
+dDp0cnVlLFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2Vs
+ZWN0RWxlbWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRy
+dWUsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29t
+cG9zaXRpb25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2
+ZW50OnRydWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93
+OnRydWUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2Nv
+cGU6dHJ1ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUs
+QXR0cjp0cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96
+TmFtZWRBdHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZH
+QUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50
+OnRydWUsU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRy
+dWUsU1ZHQ2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVt
+ZW50OnRydWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlw
+c2VFbGVtZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVu
+dDp0cnVlLFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVt
+ZW50OnRydWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGlu
+Z0VsZW1lbnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRM
+aWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRy
+dWUsU1ZHRkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JF
+bGVtZW50OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6
+dHJ1ZSxTVkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZF
+TW9ycGhvbG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGln
+aHRFbGVtZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExp
+Z2h0RWxlbWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50
+OnRydWUsU1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZH
+R0VsZW1lbnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1
+ZSxTVkdJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50
+RWxlbWVudDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01l
+dGFkYXRhRWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1
+ZSxTVkdQb2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdy
+YWRpZW50RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNW
+R1N0b3BFbGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNW
+R1N3aXRjaEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRy
+dWUsU1ZHVGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0
+aEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50
+OnRydWUsU1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVt
+ZW50OnRydWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BT
+aGFkb3dFbGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkgu
+YjAuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJj
+bGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1
+ZmZlclZpZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4k
+bmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNz
+VGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVy
+VmlldyJ9KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTso
+ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJu
+fWlmKHR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7YShkb2N1bWVudC5j
+dXJyZW50U2NyaXB0KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQo
+Yil7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fk
+IixvbkxvYWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5ndGg7KytzKXRbc10u
+YWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVu
+dFNjcmlwdD1hCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpZGFydE1haW5SdW5u
+ZXIoTC5JcSxbXSkKZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGluZ1VSTD1taWdyYXRp
+b24uanMubWFwCg==
 ''';
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart
index 4cece1d..6c7afbd 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/edit_details.dart
@@ -25,12 +25,17 @@
   /// The path of the file that was edited.
   final String path;
 
+  /// A list of traces representing stacktrace-like views of why the change was
+  /// made, or the empty list if there are no traces for this change.
+  final List<Trace> traces;
+
   EditDetails(
       {@required this.details,
       this.edits,
       @required this.explanation,
       @required this.line,
-      @required this.path});
+      @required this.path,
+      this.traces = const []});
 
   EditDetails.fromJson(dynamic json)
       : details = [
@@ -39,7 +44,8 @@
         edits = _decodeEdits(json['edits']),
         explanation = json['explanation'],
         line = json['line'],
-        path = json['path'];
+        path = json['path'],
+        traces = _decodeTraces(json['traces']);
 
   Map<String, Object> toJson() => {
         'details': [for (var detail in details) detail.toJson()],
@@ -47,10 +53,15 @@
         'explanation': explanation,
         'line': line,
         'path': path,
+        if (traces != null)
+          'traces': [for (var trace in traces) trace.toJson()],
       };
 
   static List<EditLink> _decodeEdits(dynamic json) =>
       json == null ? null : [for (var edit in json) EditLink.fromJson(edit)];
+
+  static List<Trace> _decodeTraces(dynamic json) =>
+      json == null ? null : [for (var trace in json) Trace.fromJson(trace)];
 }
 
 /// Information about a single link that should be included in the
@@ -127,3 +138,57 @@
         'path': path,
       };
 }
+
+/// A trace of why a nullability decision was made.
+class Trace {
+  /// Text description of the trace.
+  final String description;
+
+  /// List of trace entries.
+  final List<TraceEntry> entries;
+
+  Trace({@required this.description, @required this.entries});
+
+  Trace.fromJson(dynamic json)
+      : description = json['description'],
+        entries = [
+          for (var entry in json['entries']) TraceEntry.fromJson(entry)
+        ];
+
+  Map<String, Object> toJson() => {
+        'description': description,
+        'entries': [for (var entry in entries) entry.toJson()]
+      };
+}
+
+/// Information about a single entry in a nullability trace.
+class TraceEntry {
+  /// Text description of the entry.
+  final String description;
+
+  /// The function associated with the entry.  We display this before the link
+  /// so that the trace has the familiar appearance of a stacktrace.
+  ///
+  /// Null if not known.
+  final String function;
+
+  /// Source code location associated with the entry, or `null` if no source
+  /// code location is known.
+  final TargetLink link;
+
+  TraceEntry({@required this.description, this.function, this.link});
+
+  TraceEntry.fromJson(dynamic json)
+      : description = json['description'],
+        function = json['function'],
+        link = _decodeLink(json['link']);
+
+  Map<String, Object> toJson() => {
+        'description': description,
+        if (function != null) 'function': function,
+        if (link != null) 'link': link.toJson()
+      };
+
+  static TargetLink _decodeLink(dynamic json) =>
+      json == null ? null : TargetLink.fromJson(json);
+}
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
index f37e014..36caedb 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
@@ -2,6 +2,7 @@
 // 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 'dart:convert';
 import 'dart:html';
 
@@ -26,6 +27,19 @@
         pushState(path, offset, lineNumber);
       });
     }
+
+    final applyMigrationButton = document.querySelector('.apply-migration');
+    applyMigrationButton.onClick.listen((event) {
+      doPost('/apply-migration').then((xhr) {
+        document.body.classes
+          ..remove('proposed')
+          ..add('applied');
+      }).catchError((e, st) {
+        logError('apply migration error: $e', st);
+
+        window.alert('Could not apply migration ($e).');
+      });
+    });
   });
 
   window.addEventListener('popstate', (event) {
@@ -48,15 +62,6 @@
 
 String get rootPath => querySelector('.root').text.trim();
 
-/// Return the absolute path of [path], assuming [path] is relative to [root].
-String absolutePath(String path) {
-  if (path[0] != '/') {
-    return '$rootPath/$path';
-  } else {
-    return path;
-  }
-}
-
 void addArrowClickHandler(Element arrow) {
   Element childList =
       (arrow.parentNode as Element).querySelector(':scope > ul');
@@ -107,6 +112,19 @@
   });
 }
 
+Future<HttpRequest> doPost(String path) => HttpRequest.request(
+      path,
+      method: 'POST',
+      requestHeaders: {'Content-Type': 'application/json; charset=UTF-8'},
+    ).then((HttpRequest xhr) {
+      if (xhr.status == 200) {
+        // Request OK.
+        return xhr;
+      } else {
+        throw 'Request failed; status of ${xhr.status}';
+      }
+    });
+
 int getLine(String location) {
   String str = Uri.parse(location).queryParameters['line'];
   return str == null ? null : int.tryParse(str);
@@ -150,28 +168,17 @@
 
 void handlePostLinkClick(MouseEvent event) {
   String path = (event.currentTarget as Element).getAttribute('href');
-  // TODO(devoncarew): Validate that this path logic is correct.
-  // This is only called by .post-link elements - the 'edits' / incremental
-  // workflow code path.
-  path = absolutePath(path);
 
   // Directing the server to produce an edit; request it, then do work with the
   // response.
-  HttpRequest.request(
-    path,
-    method: 'POST',
-    requestHeaders: {'Content-Type': 'application/json; charset=UTF-8'},
-  ).then((HttpRequest xhr) {
-    if (xhr.status == 200) {
-      // Likely request new navigation and file content.
-    } else {
-      window.alert('Request failed; status of ${xhr.status}');
-    }
-  }).catchError((e, st) {
+  doPost(path).catchError((e, st) {
     logError('handlePostLinkClick: $e', st);
 
     window.alert('Could not load $path ($e).');
   });
+
+  // Don't navigate on link click.
+  event.preventDefault();
 }
 
 void highlightAllCode() {
@@ -289,8 +296,8 @@
 
 /// Scroll target with id [offset] into view if it is not currently in view.
 ///
-/// If [offset] is null, instead scroll the "unit-name" header, at the top of the
-/// page, into view.
+/// If [offset] is null, instead scroll the "unit-name" header, at the top of
+/// the page, into view.
 ///
 /// Also add the "target" class, highlighting the target. Also add the
 /// "highlight" class to the entire line on which the target lies.
@@ -380,18 +387,10 @@
     for (var detail in response.details) {
       var detailItem = detailList.append(document.createElement('li'));
       detailItem.append(Text(detail.description));
-      if (detail.link != null) {
-        int targetLine = detail.link.line;
-
+      var link = detail.link;
+      if (link != null) {
         detailItem.append(Text(' ('));
-        AnchorElement a = detailItem.append(document.createElement('a'));
-        a.append(Text("${detail.link.path}:$targetLine"));
-
-        String relLink = detail.link.href;
-        String fullPath = _p.normalize(_p.join(parentDirectory, relLink));
-
-        a.setAttribute('href', fullPath);
-        a.classes.add('nav-link');
+        detailItem.append(_aElementForLink(link, parentDirectory));
         detailItem.append(Text(')'));
       }
     }
@@ -403,7 +402,25 @@
       Element a = editParagraph.append(document.createElement('a'));
       a.append(Text(edit.description));
       a.setAttribute('href', edit.href);
-      a.classes.add('post-link');
+      a.classes = ['post-link', 'before-apply'];
+    }
+  }
+
+  for (var trace in response.traces) {
+    var traceParagraph = editPanel.append(document.createElement('p'));
+    traceParagraph.append(Text(trace.description));
+    var ul = traceParagraph.append(document.createElement('ul'));
+    for (var entry in trace.entries) {
+      var li = ul.append(document.createElement('li'));
+      li.append(Text(entry.function ?? 'unknown'));
+      var link = entry.link;
+      if (link != null) {
+        li.append(Text(' ('));
+        li.append(_aElementForLink(link, parentDirectory));
+        li.append(Text(')'));
+      }
+      li.append(Text(': '));
+      li.append(Text(entry.description));
     }
   }
 }
@@ -550,6 +567,19 @@
   }
 }
 
+AnchorElement _aElementForLink(TargetLink link, String parentDirectory) {
+  int targetLine = link.line;
+  AnchorElement a = document.createElement('a');
+  a.append(Text('${link.path}:$targetLine'));
+
+  String relLink = link.href;
+  String fullPath = _p.normalize(_p.join(parentDirectory, relLink));
+
+  a.setAttribute('href', fullPath);
+  a.classes.add('nav-link');
+  return a;
+}
+
 class _PermissiveNodeValidator implements NodeValidator {
   static _PermissiveNodeValidator instance = _PermissiveNodeValidator();
 
diff --git a/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart b/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
index e395a67..b0002cb 100644
--- a/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
+++ b/pkg/analysis_server/lib/src/edit/preview/http_preview_server.dart
@@ -14,6 +14,12 @@
   Future<void> handleGetRequest(HttpRequest request);
 }
 
+/// Instances of the class [AbstractPostHandler] handle POST requests.
+abstract class AbstractPostHandler {
+  /// Handle a POST request received by the HTTP server.
+  Future<void> handlePostRequest(HttpRequest request);
+}
+
 /// Instances of the class [HttpPreviewServer] implement a simple HTTP server
 /// that serves up dartfix preview pages.
 class HttpPreviewServer {
@@ -23,6 +29,9 @@
   /// An object that can handle GET requests.
   AbstractGetHandler getHandler;
 
+  /// An object that can handle POST requests.
+  AbstractPostHandler postHandler;
+
   /// Future that is completed with the HTTP server once it is running.
   Future<HttpServer> _serverFuture;
 
@@ -68,12 +77,20 @@
     await getHandler.handleGetRequest(request);
   }
 
+  /// Handle a POST request received by the HTTP server.
+  Future<void> _handlePostRequest(HttpRequest request) async {
+    postHandler ??= PreviewSite(migrationState);
+    await postHandler.handlePostRequest(request);
+  }
+
   /// Attach a listener to a newly created HTTP server.
   void _handleServer(HttpServer httpServer) {
     httpServer.listen((HttpRequest request) async {
       List<String> updateValues = request.headers[HttpHeaders.upgradeHeader];
       if (request.method == 'GET') {
         await _handleGetRequest(request);
+      } else if (request.method == 'POST') {
+        await _handlePostRequest(request);
       } else if (updateValues != null && updateValues.contains('websocket')) {
         // We do not support serving analysis server communications over
         // WebSocket connections.
diff --git a/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart b/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart
index c69ed62..e0996d3 100644
--- a/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart
+++ b/pkg/analysis_server/lib/src/edit/preview/index_file_page.dart
@@ -19,8 +19,10 @@
 
   @override
   Future<void> generatePage(Map<String, String> params) async {
-    InstrumentationRenderer renderer =
-        InstrumentationRenderer(site.migrationInfo, site.pathMapper);
+    InstrumentationRenderer renderer = InstrumentationRenderer(
+        site.migrationInfo,
+        site.pathMapper,
+        site.migrationState.hasBeenApplied);
     buf.write(renderer.render());
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/preview/preview_site.dart b/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
index 999ee2c..302c5ee 100644
--- a/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
+++ b/pkg/analysis_server/lib/src/edit/preview/preview_site.dart
@@ -17,11 +17,13 @@
 import 'package:analysis_server/src/edit/preview/navigation_tree_page.dart';
 import 'package:analysis_server/src/edit/preview/not_found_page.dart';
 import 'package:analysis_server/src/edit/preview/region_page.dart';
+import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/status/pages.dart';
 import 'package:analyzer/file_system/file_system.dart';
 
 /// The site used to serve pages for the preview tool.
-class PreviewSite extends Site implements AbstractGetHandler {
+class PreviewSite extends Site
+    implements AbstractGetHandler, AbstractPostHandler {
   /// The path of the CSS page used to style the semantic highlighting within a
   /// Dart file.
   static const highlightCssPath = '/highlight.css';
@@ -31,6 +33,8 @@
 
   static const navigationTreePath = '/_preview/navigationTree.json';
 
+  static const applyMigrationPath = '/apply-migration';
+
   /// The state of the migration being previewed.
   final MigrationState migrationState;
 
@@ -92,14 +96,6 @@
   @override
   Future<void> handleGetRequest(HttpRequest request) async {
     Uri uri = request.uri;
-    if (uri.queryParameters.containsKey('replacement')) {
-      // TODO(devoncarew): We should only perform work on a 'POST' request.
-      performEdit(uri);
-
-      respondOk(request);
-      return;
-    }
-
     String path = uri.path;
     try {
       if (path == highlightCssPath) {
@@ -121,6 +117,7 @@
         // https://github.com/dart-lang/sdk/issues/39204
         return await respond(request, IndexFilePage(this));
       }
+
       UnitInfo unitInfo = unitInfoMap[path];
       if (unitInfo != null) {
         if (uri.queryParameters.containsKey('inline')) {
@@ -146,18 +143,46 @@
       return await respond(
           request, createUnknownPage(path), HttpStatus.notFound);
     } catch (exception, stackTrace) {
-      try {
-        await respond(
-            request,
-            createExceptionPageWithPath(path, '$exception', stackTrace),
-            HttpStatus.internalServerError);
-      } catch (exception, stackTrace) {
-        HttpResponse response = request.response;
-        response.statusCode = HttpStatus.internalServerError;
-        response.headers.contentType = ContentType.text;
-        response.write('$exception\n\n$stackTrace');
-        response.close();
+      _respondInternalError(request, path, exception, stackTrace);
+    }
+  }
+
+  @override
+  Future<void> handlePostRequest(HttpRequest request) async {
+    Uri uri = request.uri;
+    String path = uri.path;
+    try {
+      if (path == applyMigrationPath) {
+        performApply();
+
+        respondOk(request);
+        return;
+      } else if (uri.queryParameters.containsKey('replacement')) {
+        performEdit(uri);
+
+        respondOk(request);
+        return;
       }
+    } catch (exception, stackTrace) {
+      _respondInternalError(request, path, exception, stackTrace);
+    }
+  }
+
+  /// Perform the migration.
+  void performApply() {
+    if (migrationState.hasBeenApplied) {
+      throw StateError('Cannot reapply migration.');
+    }
+
+    final edits = migrationState.listener.sourceChange.edits;
+
+    // Eagerly mark the migration applied. If this throws, we cannot go back.
+    migrationState.markApplied();
+    for (final fileEdit in edits) {
+      final file = pathMapper.provider.getFile(fileEdit.file);
+      String code = file.exists ? file.readAsStringSync() : '';
+      code = SourceEdit.applySequence(code, fileEdit.edits);
+      file.writeAsStringSync(code);
     }
   }
 
@@ -207,4 +232,20 @@
     response.write(await page.generate(request.uri.queryParameters));
     response.close();
   }
+
+  Future<void> _respondInternalError(HttpRequest request, String path,
+      dynamic exception, StackTrace stackTrace) async {
+    try {
+      await respond(
+          request,
+          createExceptionPageWithPath(path, '$exception', stackTrace),
+          HttpStatus.internalServerError);
+    } catch (exception, stackTrace) {
+      HttpResponse response = request.response;
+      response.statusCode = HttpStatus.internalServerError;
+      response.headers.contentType = ContentType.text;
+      response.write('$exception\n\n$stackTrace');
+      response.close();
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
index 056bd4f..3230f33 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -39,6 +39,9 @@
           RenameRefactoring.getElementToRename(node, element);
       final refactoring = RenameRefactoring(
           server.refactoringWorkspace, unit.result, refactorDetails.element);
+      if (refactoring == null) {
+        return success(null);
+      }
 
       // Check the rename is valid here.
       final initStatus = await refactoring.checkInitialConditions();
@@ -100,6 +103,9 @@
           RenameRefactoring.getElementToRename(node, element);
       final refactoring = RenameRefactoring(
           server.refactoringWorkspace, unit.result, refactorDetails.element);
+      if (refactoring == null) {
+        return success(null);
+      }
 
       // TODO(dantup): Consider using window/showMessageRequest to prompt
       // the user to see if they'd like to proceed with a rename if there
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 30992a8..c8a69de 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -27,6 +27,7 @@
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/plugin/notification_manager.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart'
     show CompletionPerformance;
@@ -118,9 +119,11 @@
     ResourceProvider baseResourceProvider,
     AnalysisServerOptions options,
     this.sdkManager,
+    CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder,
     this.instrumentationService, {
     DiagnosticServer diagnosticServer,
-  }) : super(options, diagnosticServer, baseResourceProvider) {
+  }) : super(options, diagnosticServer, crashReportingAttachmentsBuilder,
+            baseResourceProvider) {
     messageHandler = UninitializedStateMessageHandler(this);
     // TODO(dantup): This code is almost identical to AnalysisServer, consider
     // moving it the base class that already holds many of these fields.
@@ -629,15 +632,7 @@
         }
       }
     });
-    analysisDriver.exceptions.listen((nd.ExceptionResult result) {
-      String message = 'Analysis failed: ${result.path}';
-      if (result.contextKey != null) {
-        message += ' context: ${result.contextKey}';
-      }
-      // TODO(39284): should this exception be silent?
-      AnalysisEngine.instance.instrumentationService.logException(
-          SilentException.wrapInMessage(message, result.exception));
-    });
+    analysisDriver.exceptions.listen(analysisServer.logExceptionResult);
     analysisServer.driverMap[folder] = analysisDriver;
     return analysisDriver;
   }
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
index 55f2bcf..3c49e8a 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
@@ -75,8 +76,13 @@
           'File read mode was set to the unknown mode: $analysisServerOptions.fileReadMode');
     }
 
-    analysisServer = LspAnalysisServer(serverChannel, resourceProvider,
-        analysisServerOptions, sdkManager, instrumentationService,
+    analysisServer = LspAnalysisServer(
+        serverChannel,
+        resourceProvider,
+        analysisServerOptions,
+        sdkManager,
+        CrashReportingAttachmentsBuilder.empty,
+        instrumentationService,
         diagnosticServer: diagnosticServer);
   }
 }
diff --git a/pkg/analysis_server/lib/src/server/crash_reporting.dart b/pkg/analysis_server/lib/src/server/crash_reporting.dart
index f30a41b..247f064 100644
--- a/pkg/analysis_server/lib/src/server/crash_reporting.dart
+++ b/pkg/analysis_server/lib/src/server/crash_reporting.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/instrumentation/noop_service.dart';
 import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:analyzer/instrumentation/service.dart';
 import 'package:telemetry/crash_reporting.dart';
 
 class CrashReportingInstrumentation extends NoopInstrumentationService {
@@ -13,19 +14,30 @@
   CrashReportingInstrumentation(this.reporter);
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
+    var crashReportAttachments = (attachments ?? []).map((e) {
+      return CrashReportAttachment.string(
+        field: 'attachment_${e.id}',
+        value: e.stringValue,
+      );
+    }).toList();
+
     if (exception is CaughtException) {
       // Get the root CaughtException, which matters most for debugging.
       CaughtException root = exception.rootCaughtException;
 
       reporter
-          .sendReport(root.exception, root.stackTrace, comment: root.message)
+          .sendReport(root.exception, root.stackTrace,
+              attachments: crashReportAttachments, comment: root.message)
           .catchError((error) {
         // We silently ignore errors sending crash reports (network issues, ...).
       });
     } else {
       reporter
-          .sendReport(exception, stackTrace ?? StackTrace.current)
+          .sendReport(exception, stackTrace ?? StackTrace.current,
+              attachments: crashReportAttachments)
           .catchError((error) {
         // We silently ignore errors sending crash reports (network issues, ...).
       });
diff --git a/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart b/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart
new file mode 100644
index 0000000..281c6d2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/crash_reporting_attachments.dart
@@ -0,0 +1,19 @@
+// 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/instrumentation/service.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart' show ExceptionResult;
+
+/// A builder for attachments to include into crash reports.
+class CrashReportingAttachmentsBuilder {
+  static final CrashReportingAttachmentsBuilder empty =
+      CrashReportingAttachmentsBuilder();
+
+  /// Return attachments with information about the analysis exception.
+  List<InstrumentationServiceAttachment> forExceptionResult(
+    ExceptionResult result,
+  ) {
+    return const [];
+  }
+}
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 5464aeb..6cb9049 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/lsp/lsp_socket_server.dart';
 import 'package:analysis_server/src/server/crash_reporting.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/dev_server.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
@@ -287,14 +288,17 @@
   /// should be used to compute relevance scores.
   static const String USE_NEW_RELEVANCE = 'use-new-relevance';
 
-  /// The instrumentation service that is to be used by the analysis server.
-  InstrumentationService instrumentationService;
+  /// The builder for attachments that should be included into crash reports.
+  CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder =
+      CrashReportingAttachmentsBuilder.empty;
 
-  /// *
   /// An optional manager to handle file systems which may not always be
   /// available.
   DetachableFileSystemManager detachableFileSystemManager;
 
+  /// The instrumentation service that is to be used by the analysis server.
+  InstrumentationService instrumentationService;
+
   HttpAnalysisServer httpServer;
 
   Driver();
@@ -455,6 +459,7 @@
           analysisServerOptions,
           parser,
           dartSdkManager,
+          crashReportingAttachmentsBuilder,
           instrumentationService,
           RequestStatisticsHelper(),
           analytics,
@@ -468,6 +473,7 @@
     AnalysisServerOptions analysisServerOptions,
     CommandLineParser parser,
     DartSdkManager dartSdkManager,
+    CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder,
     InstrumentationService instrumentationService,
     RequestStatisticsHelper requestStatistics,
     telemetry.Analytics analytics,
@@ -500,6 +506,7 @@
     final socketServer = SocketServer(
         analysisServerOptions,
         dartSdkManager,
+        crashReportingAttachmentsBuilder,
         instrumentationService,
         requestStatistics,
         diagnosticServer,
diff --git a/pkg/analysis_server/lib/src/server/error_notifier.dart b/pkg/analysis_server/lib/src/server/error_notifier.dart
index 0547cd4..79faa40 100644
--- a/pkg/analysis_server/lib/src/server/error_notifier.dart
+++ b/pkg/analysis_server/lib/src/server/error_notifier.dart
@@ -8,7 +8,9 @@
   AbstractAnalysisServer server;
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
     if (exception is SilentException) {
       // Silent exceptions should not be reported to the user.
       return;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 3c9b3e8..e4570fe 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -361,6 +361,7 @@
     }
     if (entity is Token && (entity as Token).type == TokenType.CLOSE_PAREN) {
       _addSuggestion(Keyword.COVARIANT);
+      _addSuggestion(Keyword.DYNAMIC);
       if (request.featureSet.isEnabled(Feature.non_nullable)) {
         _addSuggestion(Keyword.REQUIRED);
       }
@@ -368,6 +369,7 @@
       Token beginToken = (entity as FormalParameter).beginToken;
       if (beginToken != null && request.target.offset == beginToken.end) {
         _addSuggestion(Keyword.COVARIANT);
+        _addSuggestion(Keyword.DYNAMIC);
         if (request.featureSet.isEnabled(Feature.non_nullable)) {
           _addSuggestion(Keyword.REQUIRED);
         }
@@ -513,12 +515,15 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    if (entity == node.methodName || entity == node.argumentList) {
-      // no keywords in '.' expressions or type argument lists
+    if (entity == node.methodName) {
+      // no keywords in '.' expressions
+    } else if (entity == node.argumentList) {
       // Note that we're checking the argumentList rather than the typeArgumentList
       // as you'd expect. For some reason, when the cursor is in a type argument
       // list (f<^>()), the entity is the invocation's argumentList...
       // See similar logic in `imported_reference_contributor`.
+
+      _addSuggestion(Keyword.DYNAMIC);
     } else {
       super.visitMethodInvocation(node);
     }
@@ -659,6 +664,11 @@
   }
 
   @override
+  void visitTypeArgumentList(TypeArgumentList node) {
+    _addSuggestion(Keyword.DYNAMIC);
+  }
+
+  @override
   void visitVariableDeclaration(VariableDeclaration node) {
     if (entity == node.initializer) {
       _addExpressionKeywords(node);
@@ -820,6 +830,7 @@
       Keyword.ASSERT,
       Keyword.CONST,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
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 a5ea15e..a39e416 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
@@ -53,6 +53,8 @@
 
   TypeProvider get typeProvider => _context.typeProvider;
 
+  CompilationUnit get unit => _context.unit;
+
   CorrectionUtils get utils => _context.utils;
 
   Future<void> compute(DartChangeBuilder builder);
@@ -94,6 +96,7 @@
   final int selectionLength;
   final int selectionEnd;
 
+  final CompilationUnit unit;
   final CorrectionUtils utils;
   final String file;
 
@@ -118,6 +121,7 @@
         sessionHelper = AnalysisSessionHelper(resolvedResult.session),
         typeProvider = resolvedResult.typeProvider,
         selectionEnd = (selectionOffset ?? 0) + (selectionLength ?? 0),
+        unit = resolvedResult.unit,
         utils = CorrectionUtils(resolvedResult);
 
   AstNode get node => _node;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
new file mode 100644
index 0000000..a1534d0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
@@ -0,0 +1,146 @@
+// 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/ast/visitor.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 InlineTypedef extends CorrectionProducer {
+  String name;
+
+  @override
+  List<Object> get fixArguments => [name];
+
+  @override
+  FixKind get fixKind => DartFixKind.INLINE_TYPEDEF;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    //
+    // Extract the information needed to build the edit.
+    //
+    TypeAnnotation returnType;
+    TypeParameterList typeParameters;
+    List<FormalParameter> parameters;
+    if (node is FunctionTypeAlias) {
+      var typedef = node as FunctionTypeAlias;
+      returnType = typedef.returnType;
+      name = typedef.name.name;
+      typeParameters = typedef.typeParameters;
+      parameters = typedef.parameters.parameters;
+    } else if (node is GenericTypeAlias) {
+      var typedef = node as GenericTypeAlias;
+      if (typedef.typeParameters != null) {
+        return;
+      }
+      var functionType = typedef.functionType;
+      returnType = functionType.returnType;
+      name = typedef.name.name;
+      typeParameters = functionType.typeParameters;
+      parameters = functionType.parameters.parameters;
+    } else {
+      return;
+    }
+    // TODO(brianwilkerson) Handle parts.
+    var finder = _ReferenceFinder(name);
+    resolvedResult.unit.accept(finder);
+    if (finder.count != 1) {
+      return;
+    }
+    //
+    // Build the edit.
+    //
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addDeletion(utils.getLinesRange(range.node(node)));
+      builder.addReplacement(range.node(finder.reference),
+          (DartEditBuilder builder) {
+        if (returnType != null) {
+          builder.write(utils.getNodeText(returnType));
+          builder.write(' ');
+        }
+        builder.write('Function');
+        if (typeParameters != null) {
+          builder.write(utils.getNodeText(typeParameters));
+        }
+        String groupEnd;
+        builder.write('(');
+        for (int i = 0; i < parameters.length; i++) {
+          var parameter = parameters[i];
+          if (i > 0) {
+            // This intentionally drops any trailing comma in order to improve
+            // formatting.
+            builder.write(', ');
+          }
+          if (parameter is DefaultFormalParameter) {
+            if (groupEnd == null) {
+              if (parameter.isNamed) {
+                groupEnd = '}';
+                builder.write('{');
+              } else {
+                groupEnd = ']';
+                builder.write('[');
+              }
+            }
+            parameter = (parameter as DefaultFormalParameter).parameter;
+          }
+          if (parameter is FunctionTypedFormalParameter) {
+            builder.write(utils.getNodeText(parameter));
+          } else if (parameter is SimpleFormalParameter) {
+            if (parameter.metadata.isNotEmpty) {
+              builder
+                  .write(utils.getRangeText(range.nodes(parameter.metadata)));
+            }
+            if (parameter.requiredKeyword != null) {
+              builder.write('required ');
+            }
+            if (parameter.covariantKeyword != null) {
+              builder.write('covariant ');
+            }
+            var keyword = parameter.keyword;
+            if (keyword != null && keyword.type != Keyword.VAR) {
+              builder.write(keyword.lexeme);
+            }
+            if (parameter.type == null) {
+              builder.write('dynamic');
+            } else {
+              builder.write(utils.getNodeText(parameter.type));
+            }
+            if (parameter.isNamed) {
+              builder.write(' ');
+              builder.write(parameter.identifier.name);
+            }
+          }
+        }
+        if (groupEnd != null) {
+          builder.write(groupEnd);
+        }
+        builder.write(')');
+      });
+    });
+  }
+}
+
+class _ReferenceFinder extends RecursiveAstVisitor {
+  final String typeName;
+
+  TypeName reference;
+
+  int count = 0;
+
+  _ReferenceFinder(this.typeName);
+
+  @override
+  void visitTypeName(TypeName node) {
+    if (node.name.name == typeName) {
+      reference ??= node;
+      count++;
+    }
+    super.visitTypeName(node);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
new file mode 100644
index 0000000..febb28b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -0,0 +1,154 @@
+// 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/visitor.dart';
+import 'package:analyzer/dart/element/element.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 RemoveUnusedElement extends _RemoveUnused {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_ELEMENT;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    final sourceRanges = <SourceRange>[];
+    final referencedNode = node.parent;
+    if (referencedNode is ClassDeclaration ||
+        referencedNode is EnumDeclaration ||
+        referencedNode is FunctionDeclaration ||
+        referencedNode is FunctionTypeAlias ||
+        referencedNode is MethodDeclaration ||
+        referencedNode is VariableDeclaration) {
+      final element = referencedNode is Declaration
+          ? referencedNode.declaredElement
+          : (referencedNode as NamedCompilationUnitMember).declaredElement;
+      final references = _findAllReferences(unit, element);
+      // todo (pq): consider filtering for references that are limited to within the class.
+      if (references.length == 1) {
+        var sourceRange;
+        if (referencedNode is VariableDeclaration) {
+          VariableDeclarationList parent = referencedNode.parent;
+          if (parent.variables.length == 1) {
+            sourceRange = utils.getLinesRange(range.node(parent.parent));
+          } else {
+            sourceRange = range.nodeInList(parent.variables, referencedNode);
+          }
+        } else {
+          sourceRange = utils.getLinesRange(range.node(referencedNode));
+        }
+        sourceRanges.add(sourceRange);
+      }
+    }
+
+    await builder.addFileEdit(file, (builder) {
+      for (var sourceRange in sourceRanges) {
+        builder.addDeletion(sourceRange);
+      }
+    });
+  }
+}
+
+class RemoveUnusedField extends _RemoveUnused {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_UNUSED_FIELD;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    final declaration = node.parent;
+    if (declaration is! VariableDeclaration) {
+      return;
+    }
+    final element = (declaration as VariableDeclaration).declaredElement;
+    if (element is! FieldElement) {
+      return;
+    }
+
+    final sourceRanges = <SourceRange>[];
+    final references = _findAllReferences(unit, element);
+    for (var reference in references) {
+      // todo (pq): consider scoping this to parent or parent.parent.
+      final referenceNode = reference.thisOrAncestorMatching((node) =>
+          node is VariableDeclaration ||
+          node is ExpressionStatement ||
+          node is ConstructorFieldInitializer ||
+          node is FieldFormalParameter);
+      if (referenceNode == null) {
+        return;
+      }
+      var sourceRange;
+      if (referenceNode is VariableDeclaration) {
+        VariableDeclarationList parent = referenceNode.parent;
+        if (parent.variables.length == 1) {
+          sourceRange = utils.getLinesRange(range.node(parent.parent));
+        } else {
+          sourceRange = range.nodeInList(parent.variables, referenceNode);
+        }
+      } else if (referenceNode is ConstructorFieldInitializer) {
+        ConstructorDeclaration cons =
+            referenceNode.parent as ConstructorDeclaration;
+        // A() : _f = 0;
+        if (cons.initializers.length == 1) {
+          sourceRange = range.endEnd(cons.parameters, referenceNode);
+        } else {
+          sourceRange = range.nodeInList(cons.initializers, referenceNode);
+        }
+      } else if (referenceNode is FieldFormalParameter) {
+        FormalParameterList params =
+            referenceNode.parent as FormalParameterList;
+        if (params.parameters.length == 1) {
+          sourceRange =
+              range.endStart(params.leftParenthesis, params.rightParenthesis);
+        } else {
+          sourceRange = range.nodeInList(params.parameters, referenceNode);
+        }
+      } else {
+        sourceRange = utils.getLinesRange(range.node(referenceNode));
+      }
+      sourceRanges.add(sourceRange);
+    }
+
+    await builder.addFileEdit(file, (builder) {
+      for (var sourceRange in sourceRanges) {
+        builder.addDeletion(sourceRange);
+      }
+    });
+  }
+}
+
+class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
+  final Element element;
+  final List<SimpleIdentifier> references = [];
+
+  _ElementReferenceCollector(this.element);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    final staticElement = node.staticElement;
+    if (staticElement == element) {
+      references.add(node);
+    } else if (staticElement is PropertyAccessorElement) {
+      if (staticElement.variable == element) {
+        references.add(node);
+      }
+    } else if (staticElement is FieldFormalParameterElement) {
+      if (staticElement.field == element) {
+        references.add(node);
+      }
+    }
+  }
+}
+
+abstract class _RemoveUnused extends CorrectionProducer {
+  List<SimpleIdentifier> _findAllReferences(AstNode root, Element element) {
+    var collector = _ElementReferenceCollector(element);
+    root.accept(collector);
+    return collector.references;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_future.dart
new file mode 100644
index 0000000..bba9db5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_future.dart
@@ -0,0 +1,38 @@
+// 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 WrapInFuture extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.WRAP_IN_FUTURE;
+
+  @override
+  Future<void> compute(DartChangeBuilder builder) async {
+    //
+    // Extract the information needed to build the edit.
+    //
+    Expression expression;
+    if (node is ReturnStatement) {
+      expression = (node as ReturnStatement).expression;
+    } else if (node is Expression) {
+      expression = node;
+    } else {
+      return;
+    }
+    var value = utils.getNodeText(expression);
+    //
+    // Build the edit.
+    //
+    await builder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleReplacement(
+          range.node(expression), 'Future.value($value)');
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 36ba2de..2b76ff0 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -268,6 +268,8 @@
       FixKind('IMPORT_LIBRARY_SHOW', 55, "Update library '{0}' import");
   static const INLINE_INVOCATION =
       FixKind('INLINE_INVOCATION', 30, "Inline invocation of '{0}'");
+  static const INLINE_TYPEDEF =
+      FixKind('INLINE_TYPEDEF', 30, "Inline the definition of '{0}'");
   static const INSERT_SEMICOLON = FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
   static const MAKE_CLASS_ABSTRACT =
       FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
@@ -409,6 +411,8 @@
           "Use != null instead of 'is! Null' everywhere in file");
   static const USE_RETHROW =
       FixKind('USE_RETHROW', 50, 'Replace throw with rethrow');
+  static const WRAP_IN_FUTURE =
+      FixKind('WRAP_IN_FUTURE', 50, "Wrap in 'Future.value'");
 }
 
 /// An enumeration of quick fix kinds for the errors found in an Android
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 757c8c5..df63966 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -18,9 +18,12 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_null_aware.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/inline_typedef.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_if_null_operator.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_eight_digit_hex.dart';
+import 'package:analysis_server/src/services/correction/dart/wrap_in_future.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';
@@ -33,7 +36,6 @@
 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/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -372,12 +374,6 @@
     if (errorCode == HintCode.UNUSED_CATCH_STACK) {
       await _addFix_removeUnusedCatchStack();
     }
-    if (errorCode == HintCode.UNUSED_ELEMENT) {
-      await _addFix_removeUnusedElement();
-    }
-    if (errorCode == HintCode.UNUSED_FIELD) {
-      await _addFix_removeUnusedField();
-    }
     if (errorCode == HintCode.UNUSED_IMPORT) {
       await _addFix_removeUnusedImport();
     }
@@ -629,6 +625,9 @@
       if (name == LintNames.avoid_return_types_on_setters) {
         await _addFix_removeTypeAnnotation();
       }
+      if (name == LintNames.avoid_returning_null_for_future) {
+        await _addFix_addAsync();
+      }
       if (name == LintNames.avoid_types_on_closure_parameters) {
         await _addFix_replaceWithIdentifier();
       }
@@ -3747,110 +3746,6 @@
     }
   }
 
-  Future<void> _addFix_removeUnusedElement() async {
-    final sourceRanges = <SourceRange>[];
-    final referencedNode = node.parent;
-    if (referencedNode is ClassDeclaration ||
-        referencedNode is EnumDeclaration ||
-        referencedNode is FunctionDeclaration ||
-        referencedNode is FunctionTypeAlias ||
-        referencedNode is MethodDeclaration ||
-        referencedNode is VariableDeclaration) {
-      final element = referencedNode is Declaration
-          ? referencedNode.declaredElement
-          : (referencedNode as NamedCompilationUnitMember).declaredElement;
-      final references = _findAllReferences(unit, element);
-      // todo (pq): consider filtering for references that are limited to within the class.
-      if (references.length == 1) {
-        var sourceRange;
-        if (referencedNode is VariableDeclaration) {
-          VariableDeclarationList parent = referencedNode.parent;
-          if (parent.variables.length == 1) {
-            sourceRange = utils.getLinesRange(range.node(parent.parent));
-          } else {
-            sourceRange = range.nodeInList(parent.variables, referencedNode);
-          }
-        } else {
-          sourceRange = utils.getLinesRange(range.node(referencedNode));
-        }
-        sourceRanges.add(sourceRange);
-      }
-    }
-
-    if (sourceRanges.isNotEmpty) {
-      final changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        for (var sourceRange in sourceRanges) {
-          builder.addDeletion(sourceRange);
-        }
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_ELEMENT);
-    }
-  }
-
-  Future<void> _addFix_removeUnusedField() async {
-    final declaration = node.parent;
-    if (declaration is! VariableDeclaration) {
-      return;
-    }
-    final element = (declaration as VariableDeclaration).declaredElement;
-    if (element is! FieldElement) {
-      return;
-    }
-
-    final sourceRanges = <SourceRange>[];
-    final references = _findAllReferences(unit, element);
-    for (var reference in references) {
-      // todo (pq): consider scoping this to parent or parent.parent.
-      final referenceNode = reference.thisOrAncestorMatching((node) =>
-          node is VariableDeclaration ||
-          node is ExpressionStatement ||
-          node is ConstructorFieldInitializer ||
-          node is FieldFormalParameter);
-      if (referenceNode == null) {
-        return;
-      }
-      var sourceRange;
-      if (referenceNode is VariableDeclaration) {
-        VariableDeclarationList parent = referenceNode.parent;
-        if (parent.variables.length == 1) {
-          sourceRange = utils.getLinesRange(range.node(parent.parent));
-        } else {
-          sourceRange = range.nodeInList(parent.variables, referenceNode);
-        }
-      } else if (referenceNode is ConstructorFieldInitializer) {
-        ConstructorDeclaration cons =
-            referenceNode.parent as ConstructorDeclaration;
-        // A() : _f = 0;
-        if (cons.initializers.length == 1) {
-          sourceRange = range.endEnd(cons.parameters, referenceNode);
-        } else {
-          sourceRange = range.nodeInList(cons.initializers, referenceNode);
-        }
-      } else if (referenceNode is FieldFormalParameter) {
-        FormalParameterList params =
-            referenceNode.parent as FormalParameterList;
-        if (params.parameters.length == 1) {
-          sourceRange =
-              range.endStart(params.leftParenthesis, params.rightParenthesis);
-        } else {
-          sourceRange = range.nodeInList(params.parameters, referenceNode);
-        }
-      } else {
-        sourceRange = utils.getLinesRange(range.node(referenceNode));
-      }
-      sourceRanges.add(sourceRange);
-    }
-
-    final changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      for (var sourceRange in sourceRanges) {
-        builder.addDeletion(sourceRange);
-      }
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_FIELD);
-  }
-
   Future<void> _addFix_removeUnusedImport() async {
     // prepare ImportDirective
     ImportDirective importDirective =
@@ -4709,11 +4604,19 @@
     }
 
     var errorCode = error.errorCode;
-    if (errorCode == StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION) {
+    if (errorCode == HintCode.UNUSED_ELEMENT) {
+      await compute(RemoveUnusedElement());
+    } else if (errorCode == HintCode.UNUSED_FIELD) {
+      await compute(RemoveUnusedField());
+    } else if (errorCode == StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION) {
       await compute(RemoveDeadIfNull());
     } else if (errorCode is LintCode) {
       String name = errorCode.name;
-      if (name == LintNames.prefer_collection_literals) {
+      if (name == LintNames.avoid_private_typedef_functions) {
+        await compute(InlineTypedef());
+      } else if (name == LintNames.avoid_returning_null_for_future) {
+        await compute(WrapInFuture());
+      } else if (name == LintNames.prefer_collection_literals) {
         await compute(ConvertToListLiteral());
         await compute(ConvertToMapLiteral());
         await compute(ConvertToSetLiteral());
@@ -4835,12 +4738,6 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_METHOD, args: [name]);
   }
 
-  List<SimpleIdentifier> _findAllReferences(AstNode root, Element element) {
-    var collector = _ElementReferenceCollector(element);
-    root.accept(collector);
-    return collector.references;
-  }
-
   /// Return the class, enum or mixin declaration for the given [element].
   Future<ClassOrMixinDeclaration> _getClassDeclaration(
       ClassElement element) async {
@@ -5226,32 +5123,6 @@
   }
 }
 
-class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
-  final Element element;
-  final List<SimpleIdentifier> references = [];
-
-  _ElementReferenceCollector(this.element);
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    final staticElement = node.staticElement;
-    if (staticElement == element) {
-      references.add(node);
-    }
-    // Implicit Setter.
-    else if (staticElement is PropertyAccessorElement) {
-      if (staticElement.variable == element) {
-        references.add(node);
-      }
-      // Field Formals.
-    } else if (staticElement is FieldFormalParameterElement) {
-      if (staticElement.field == element) {
-        references.add(node);
-      }
-    }
-  }
-}
-
 /// [ExecutableElement], its parameters, and operations on them.
 class _ExecutableParameters {
   final AnalysisSessionHelper sessionHelper;
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 4c8b4f3..6546d87 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -19,6 +19,10 @@
   static const String avoid_relative_lib_imports = 'avoid_relative_lib_imports';
   static const String avoid_return_types_on_setters =
       'avoid_return_types_on_setters';
+  static const String avoid_private_typedef_functions =
+      'avoid_private_typedef_functions';
+  static const String avoid_returning_null_for_future =
+      'avoid_returning_null_for_future';
   static const String avoid_types_on_closure_parameters =
       'avoid_types_on_closure_parameters';
   static const String await_only_futures = 'await_only_futures';
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 8db1252..a742bcf 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/utilities/request_statistics.dart';
@@ -31,6 +32,7 @@
   /// The function used to create a new SDK using the default SDK.
   final DartSdkManager sdkManager;
 
+  final CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder;
   final InstrumentationService instrumentationService;
   final RequestStatisticsHelper requestStatistics;
   @override
@@ -45,6 +47,7 @@
   SocketServer(
       this.analysisServerOptions,
       this.sdkManager,
+      this.crashReportingAttachmentsBuilder,
       this.instrumentationService,
       this.requestStatistics,
       this.diagnosticServer,
@@ -81,6 +84,7 @@
       resourceProvider,
       analysisServerOptions,
       sdkManager,
+      crashReportingAttachmentsBuilder,
       instrumentationService,
       requestStatistics: requestStatistics,
       diagnosticServer: diagnosticServer,
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index 18e8eac..859f8e7 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -2,6 +2,7 @@
 // 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/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -14,6 +15,11 @@
   /// Initialize a newly created starter to start up an analysis server.
   factory ServerStarter() = Driver;
 
+  /// Set the new builder for attachments that should be included into crash
+  /// reports.
+  set crashReportingAttachmentsBuilder(
+      CrashReportingAttachmentsBuilder builder);
+
   /// An optional manager to handle file systems which may not always be
   /// available.
   set detachableFileSystemManager(DetachableFileSystemManager manager);
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
index 194e306..631c7d6 100644
--- a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -17,13 +17,12 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(NewAnalysisOptionsFileNotificationTest);
-    defineReflectiveTests(OldAnalysisOptionsFileNotificationTest);
+    defineReflectiveTests(AnalysisOptionsFileNotificationTest);
   });
 }
 
-abstract class AnalysisOptionsFileNotificationTest
-    extends AbstractAnalysisTest {
+@reflectiveTest
+class AnalysisOptionsFileNotificationTest extends AbstractAnalysisTest {
   Map<String, List<AnalysisError>> filesErrors = {};
 
   final testSource = '''
@@ -37,7 +36,7 @@
 
   List<AnalysisError> get optionsFileErrors => filesErrors[optionsFilePath];
 
-  String get optionsFilePath;
+  String get optionsFilePath => '$projectPath/analysis_options.yaml';
 
   List<AnalysisError> get testFileErrors => filesErrors[testFile];
 
@@ -260,17 +259,3 @@
     expect(rules, unorderedEquals(lints));
   }
 }
-
-@reflectiveTest
-class NewAnalysisOptionsFileNotificationTest
-    extends AnalysisOptionsFileNotificationTest {
-  @override
-  String get optionsFilePath => '$projectPath/analysis_options.yaml';
-}
-
-@reflectiveTest
-class OldAnalysisOptionsFileNotificationTest
-    extends AnalysisOptionsFileNotificationTest {
-  @override
-  String get optionsFilePath => '$projectPath/.analysis_options';
-}
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 425090c..5461be7 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -200,7 +200,7 @@
   Future<void> test_lintError() async {
     var camelCaseTypesLintName = 'camel_case_types';
 
-    newFile(join(projectPath, '.analysis_options'), content: '''
+    newFile(join(projectPath, 'analysis_options.yaml'), content: '''
 linter:
   rules:
     - $camelCaseTypesLintName
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 9a5107f..07447dd 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -10,6 +10,7 @@
     hide AnalysisOptions;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -125,6 +126,7 @@
         resourceProvider,
         options,
         DartSdkManager(resourceProvider.convertPath('/sdk'), true),
+        CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
   }
 
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index e966735..9588a2f 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -86,6 +87,7 @@
         resourceProvider,
         AnalysisServerOptions(),
         DartSdkManager(convertPath('/sdk'), false),
+        CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
   }
 
diff --git a/pkg/analysis_server/test/client/impl/abstract_client.dart b/pkg/analysis_server/test/client/impl/abstract_client.dart
index 3c5286b..b8f60a0 100644
--- a/pkg/analysis_server/test/client/impl/abstract_client.dart
+++ b/pkg/analysis_server/test/client/impl/abstract_client.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -104,8 +105,13 @@
   AnalysisServer createAnalysisServer(String sdkPath) {
     sdk = MockSdk(resourceProvider: resourceProvider);
     var options = AnalysisServerOptions();
-    return AnalysisServer(serverChannel, resourceProvider, options,
-        DartSdkManager(sdkPath, true), InstrumentationService.NULL_SERVICE);
+    return AnalysisServer(
+        serverChannel,
+        resourceProvider,
+        options,
+        DartSdkManager(sdkPath, true),
+        CrashReportingAttachmentsBuilder.empty,
+        InstrumentationService.NULL_SERVICE);
   }
 
   /// Create a project at [projectPath].
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index b405e4c..80a76a6 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -43,8 +43,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbstractContextManagerTest);
-    defineReflectiveTests(ContextManagerWithNewOptionsTest);
-    defineReflectiveTests(ContextManagerWithOldOptionsTest);
+    defineReflectiveTests(ContextManagerWithOptionsTest);
   });
 }
 
@@ -1657,7 +1656,6 @@
       '**/*.${AnalysisEngine.SUFFIX_DART}',
       '**/*.${AnalysisEngine.SUFFIX_HTML}',
       '**/*.${AnalysisEngine.SUFFIX_HTM}',
-      '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
       '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}'
     ];
     return patterns
@@ -1712,27 +1710,9 @@
 }
 
 @reflectiveTest
-class ContextManagerWithNewOptionsTest extends ContextManagerWithOptionsTest {
-  @override
+class ContextManagerWithOptionsTest extends ContextManagerTest {
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
-  @override
-  @failingTest
-  Future<void> test_analysis_options_parse_failure() async {
-    // We have lost the ability to detect errors of this form.
-    return super.test_analysis_options_parse_failure();
-  }
-}
-
-@reflectiveTest
-class ContextManagerWithOldOptionsTest extends ContextManagerWithOptionsTest {
-  @override
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_FILE;
-}
-
-abstract class ContextManagerWithOptionsTest extends ContextManagerTest {
-  String get optionsFileName;
-
   void deleteOptionsFile() {
     deleteFile('$projPath/$optionsFileName');
   }
@@ -1879,6 +1859,7 @@
     expect(lints[0].name, 'camel_case_types');
   }
 
+  @failingTest
   Future<void> test_analysis_options_parse_failure() async {
     // Create files.
     String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
@@ -2423,7 +2404,7 @@
     driverMap[path] = currentDriver;
     currentDriver.exceptions.listen((ExceptionResult result) {
       AnalysisEngine.instance.instrumentationService.logException(
-          CaughtException.withMessage('Analysis failed: ${result.path}',
+          CaughtException.withMessage('Analysis failed: ${result.filePath}',
               result.exception.exception, result.exception.stackTrace));
     });
     return currentDriver;
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 4765a7e..e2a2668 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -364,6 +365,7 @@
         resourceProvider,
         AnalysisServerOptions(),
         DartSdkManager(convertPath('/sdk'), false),
+        CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
     handler = AnalysisDomainHandler(server);
     // listen for notifications
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index eeb47aa..c439ee55 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_execution.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -32,6 +33,7 @@
           provider,
           AnalysisServerOptions(),
           DartSdkManager('', false),
+          CrashReportingAttachmentsBuilder.empty,
           InstrumentationService.NULL_SERVICE);
       handler = ExecutionDomainHandler(server);
     });
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 012fb35..9447a19 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -29,6 +30,7 @@
         resourceProvider,
         AnalysisServerOptions(),
         DartSdkManager('', false),
+        CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
     handler = ServerDomainHandler(server);
   });
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index 1a31955..0032db9 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -23,7 +23,7 @@
     standardAnalysisSetup();
   }
 
-  Future<void> test_option_warning_newOptionFile() async {
+  Future<void> test_option_warning_optionFile() async {
     String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
     writeFile(options, '''
 linter:
@@ -47,31 +47,4 @@
     expect(error.location.startLine, 3);
     expect(error.location.startColumn, 7);
   }
-
-  Future<void> test_option_warning_oldOptionFile() async {
-    String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-    writeFile(options, '''
-linter:
-  rules:
-    - camel_case_types
-''');
-
-    optionsAnalysisSetup();
-
-    await analysisFinished;
-
-    expect(currentAnalysisErrors[options], isList);
-    List<AnalysisError> errors = currentAnalysisErrors[options];
-    expect(errors, hasLength(1));
-    AnalysisError error = errors[0];
-    expect(error.location.file, options);
-    expect(error.severity, AnalysisErrorSeverity.INFO);
-    expect(error.type, AnalysisErrorType.HINT);
-    expect(error.location.offset, 0);
-    expect(error.location.length, 1);
-    expect(error.location.startLine, 1);
-    expect(error.location.startColumn, 1);
-    expect(error.message,
-        'The name of the analysis options file .analysis_options is deprecated; consider renaming it to analysis_options.yaml.');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index faa2467..05051f5 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -31,7 +31,7 @@
     expect(errors, hasLength(0));
   }
 
-  Future<void> test_simple_lint_newOptionsFile() async {
+  Future<void> test_simple_lint_optionsFile() async {
     writeFile(sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE), '''
 linter:
   rules:
@@ -55,29 +55,4 @@
     expect(error.severity, AnalysisErrorSeverity.INFO);
     expect(error.type, AnalysisErrorType.LINT);
   }
-
-  Future<void> test_simple_lint_oldOptionsFile() async {
-    writeFile(sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_FILE), '''
-linter:
-  rules:
-    - camel_case_types
-''');
-
-    String source = sourcePath('test.dart');
-    writeFile(source, '''
-class a { // lint: not CamelCase
-}''');
-
-    standardAnalysisSetup();
-
-    await analysisFinished;
-
-    expect(currentAnalysisErrors[source], isList);
-    List<AnalysisError> errors = currentAnalysisErrors[source];
-    expect(errors, hasLength(1));
-    AnalysisError error = errors[0];
-    expect(error.location.file, source);
-    expect(error.severity, AnalysisErrorSeverity.INFO);
-    expect(error.type, AnalysisErrorType.LINT);
-  }
 }
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 7472d7e..15bf575 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -79,6 +80,7 @@
         resourceProvider,
         AnalysisServerOptions(),
         DartSdkManager(convertPath('/sdk'), false),
+        CrashReportingAttachmentsBuilder.empty,
         InstrumentationService.NULL_SERVICE);
 
     projectFolderPath = convertPath('/home/test');
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index ebe6350..cf1b4b7 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -71,7 +71,7 @@
   }
 
   List<Keyword> get constructorParameter {
-    List<Keyword> keywords = [Keyword.COVARIANT, Keyword.THIS];
+    List<Keyword> keywords = [Keyword.COVARIANT, Keyword.DYNAMIC, Keyword.THIS];
     if (isEnabled(ExperimentalFeatures.non_nullable)) {
       keywords.add(Keyword.REQUIRED);
     }
@@ -156,7 +156,7 @@
   }
 
   List<Keyword> get methodParameter {
-    List<Keyword> keywords = [Keyword.COVARIANT];
+    List<Keyword> keywords = [Keyword.COVARIANT, Keyword.DYNAMIC];
     if (isEnabled(ExperimentalFeatures.non_nullable)) {
       keywords.add(Keyword.REQUIRED);
     }
@@ -168,6 +168,7 @@
       Keyword.ASSERT,
       Keyword.CONST,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -194,6 +195,7 @@
       Keyword.CONST,
       Keyword.CONTINUE,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -220,6 +222,7 @@
       Keyword.CONST,
       Keyword.CONTINUE,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -243,6 +246,7 @@
       Keyword.BREAK,
       Keyword.CONST,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -268,6 +272,7 @@
       Keyword.BREAK,
       Keyword.CONST,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -293,6 +298,7 @@
       Keyword.CONST,
       Keyword.DEFAULT,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -320,6 +326,7 @@
       Keyword.CONST,
       Keyword.DEFAULT,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -342,6 +349,7 @@
       Keyword.ASSERT,
       Keyword.CONST,
       Keyword.DO,
+      Keyword.DYNAMIC,
       Keyword.FINAL,
       Keyword.FOR,
       Keyword.IF,
@@ -994,13 +1002,13 @@
   }
 
   Future<void> test_constructor_param_noPrefix() async {
-    addTestSource('class A { A(^) {});}');
+    addTestSource('class A { A(^) {}}');
     await computeSuggestions();
     assertSuggestKeywords(constructorParameter);
   }
 
   Future<void> test_constructor_param_prefix() async {
-    addTestSource('class A { A(t^) {});}');
+    addTestSource('class A { A(t^) {}}');
     await computeSuggestions();
     assertSuggestKeywords(constructorParameter);
   }
@@ -1910,7 +1918,7 @@
   }
 
   Future<void> test_method_param_noPrefix() async {
-    addTestSource('class A { foo(^) {});}');
+    addTestSource('class A { foo(^) {}}');
     await computeSuggestions();
     expect(suggestions, isNotEmpty);
     assertSuggestKeywords(methodParameter);
@@ -2142,6 +2150,12 @@
     assertSuggestKeywords(statementStartInSwitchOutsideClass);
   }
 
+  Future<void> test_variable_decl_type_args() async {
+    addTestSource('void m() {List<^> list;}');
+    await computeSuggestions();
+    assertSuggestKeywords([Keyword.DYNAMIC]);
+  }
+
   Future<void> test_while_break_continue() async {
     addTestSource('main() {while (true) {^}}');
     await computeSuggestions();
@@ -2259,7 +2273,7 @@
 ''');
 
     await computeSuggestions();
-    assertSuggestKeywords([]);
+    assertSuggestKeywords([Keyword.DYNAMIC]);
   }
 }
 
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 85d8c45..a2ede5d 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/error_notifier.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
@@ -102,8 +103,14 @@
 
   static SocketServer _createSocketServer(MockServerChannel channel) {
     final errorNotifier = ErrorNotifier();
-    final server = SocketServer(AnalysisServerOptions(),
-        DartSdkManager('', false), errorNotifier, null, null, null);
+    final server = SocketServer(
+        AnalysisServerOptions(),
+        DartSdkManager('', false),
+        CrashReportingAttachmentsBuilder.empty,
+        errorNotifier,
+        null,
+        null,
+        null);
 
     server.createAnalysisServer(channel);
     errorNotifier.server = server.analysisServer;
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index a5c5a92..c1c9e05 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -237,6 +238,16 @@
     }
   }
 
+  void assertTraceEntry(
+      UnitInfo unit, TraceEntryInfo entryInfo, String function, int offset) {
+    var lineInfo = LineInfo.fromContent(unit.content);
+    var expectedLocation = lineInfo.getLocation(offset);
+    expect(entryInfo.target.filePath, unit.path);
+    expect(entryInfo.target.line, expectedLocation.lineNumber);
+    expect(entryInfo.target.offset, expectedLocation.columnNumber);
+    expect(entryInfo.function, function);
+  }
+
   Future<void> test_asExpression() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 void f([num a]) {
@@ -1335,7 +1346,6 @@
         details: ['A nullable value is assigned']);
   }
 
-  @FailingTest(issue: 'https://dartbug.com/40773')
   Future<void> test_parameter_fromOverriddenField_explicit() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 class A {
@@ -1357,8 +1367,7 @@
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
     assertRegion(region: regions[0], offset: 15, details: [
-      // TODO(mfairhurst): Implement something similar to this error message
-      'No initializer is given',
+      'This field is not initialized',
       "An explicit 'null' is assigned in the function 'f'",
     ]);
     assertRegion(region: regions[1], offset: 61, details: [
@@ -1710,6 +1719,73 @@
         details: ['This variable is initialized to a nullable value']);
   }
 
+  Future<void> test_trace_deadCode() async {
+    UnitInfo unit = await buildInfoForSingleTestFile('''
+void f(int/*!*/ i) {
+  if (i == null) return;
+}
+''', migratedContent: '''
+void f(int/*!*/ i) {
+  /* if (i == null) return; */
+}
+''');
+    var region = unit.regions
+        .where(
+            (regionInfo) => regionInfo.offset == unit.content.indexOf('/* if'))
+        .single;
+    // The reason data associated with dead code removal is a non-nullable node,
+    // and we don't currently generate a trace for non-nullable nodes.
+    expect(region.traces, isEmpty);
+  }
+
+  Future<void> test_trace_nullableType() async {
+    UnitInfo unit = await buildInfoForSingleTestFile('''
+void f(int i) {} // f
+void g(int i) { // g
+  f(i);
+}
+void h() {
+  g(null);
+}
+''', migratedContent: '''
+void f(int? i) {} // f
+void g(int? i) { // g
+  f(i);
+}
+void h() {
+  g(null);
+}
+''');
+    var region = unit.regions
+        .where((regionInfo) =>
+            regionInfo.offset == unit.content.indexOf('? i) {} // f'))
+        .single;
+    expect(region.traces, hasLength(1));
+    var entries = region.traces.single.entries;
+    expect(entries, hasLength(3));
+    // Entry 0 is the edge from g's argument to f's argument, due to g's call to
+    // f.
+    assertTraceEntry(unit, entries[0], 'g', unit.content.indexOf('i);'));
+    // Entry 1 is the edge from null to g's argument, due to h's call to g.
+    assertTraceEntry(unit, entries[1], 'h', unit.content.indexOf('null'));
+    // Entry 2 is the edge from always to null.
+    assertTraceEntry(unit, entries[2], 'h', unit.content.indexOf('null'));
+  }
+
+  Future<void> test_trace_nullCheck() async {
+    UnitInfo unit = await buildInfoForSingleTestFile(
+        'int f(int/*?*/ i) => i + 1;',
+        migratedContent: 'int f(int?/*?*/ i) => i! + 1;');
+    var region = unit.regions
+        .where((regionInfo) => regionInfo.offset == unit.content.indexOf('! +'))
+        .single;
+    expect(region.traces, hasLength(1));
+    var entries = region.traces.single.entries;
+    expect(entries, hasLength(1));
+    // Entry 0 is the edge from always to the type of i.
+    assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int?'));
+  }
+
   Future<void> test_uninitializedField() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 class C {
@@ -1747,7 +1823,6 @@
     assertDetail(detail: region.details[2], offset: 70, length: 3);
   }
 
-  @FailingTest(issue: 'https://dartbug.com/40773')
   Future<void> test_uninitializedMember() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 class C {
@@ -1761,10 +1836,11 @@
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(1));
     expect(regions[0].details, isNotEmpty);
-    // disabled so that it won't interfere with @FailingTest annotation.
-    //assertRegion(region: regions[0], offset: 15, length: 1, details: [
-    //  'This field is not initialized and is therefore made nullable'
-    //]);
+    assertRegion(
+        region: regions[0],
+        offset: 15,
+        length: 1,
+        details: ['This field is not initialized']);
   }
 
   Future<void> test_uninitializedVariable_notLate_uninitializedUse() async {
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart
index dbc0e4a..15d9cc8 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/instrumentation_renderer_test.dart
@@ -19,13 +19,14 @@
 @reflectiveTest
 class InstrumentationRendererTest extends NnbdMigrationTestBase {
   /// Render the instrumentation view for [files].
-  Future<String> renderViewForTestFiles(Map<String, String> files) async {
+  Future<String> renderViewForTestFiles(Map<String, String> files,
+      {bool applied = false}) async {
     var packageRoot = convertPath('/project');
     await buildInfoForTestFiles(files, includedRoot: packageRoot);
     var migrationInfo =
         MigrationInfo(infos, {}, resourceProvider.pathContext, packageRoot);
-    var instrumentationRenderer =
-        InstrumentationRenderer(migrationInfo, PathMapper(resourceProvider));
+    var instrumentationRenderer = InstrumentationRenderer(
+        migrationInfo, PathMapper(resourceProvider), applied);
     return instrumentationRenderer.render();
   }
 
@@ -35,4 +36,18 @@
     var expectedPath = convertPath('/project');
     expect(renderedView, contains('<p class="root">$expectedPath</p>'));
   }
+
+  Future<void> test_notAppliedStyle() async {
+    var renderedView = await renderViewForTestFiles(
+        {convertPath('/project/lib/a.dart'): 'int a = null;'},
+        applied: false);
+    expect(renderedView, contains('<body class="proposed">'));
+  }
+
+  Future<void> test_appliedStyle() async {
+    var renderedView = await renderViewForTestFiles(
+        {convertPath('/project/lib/a.dart'): 'int a = null;'},
+        applied: true);
+    expect(renderedView, contains('<body class="applied">'));
+  }
 }
diff --git a/pkg/analysis_server/test/src/edit/preview/preview_site_test.dart b/pkg/analysis_server/test/src/edit/preview/preview_site_test.dart
new file mode 100644
index 0000000..f21fd48
--- /dev/null
+++ b/pkg/analysis_server/test/src/edit/preview/preview_site_test.dart
@@ -0,0 +1,86 @@
+// 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/edit/fix/dartfix_listener.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/migration_state.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
+import 'package:analysis_server/src/edit/preview/preview_site.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PreviewSiteTest);
+  });
+}
+
+@reflectiveTest
+class PreviewSiteTest with ResourceProviderMixin {
+  PreviewSite site;
+  DartFixListener dartfixListener;
+  MigrationState state;
+
+  void setUp() {
+    dartfixListener = DartFixListener(null);
+    resourceProvider = MemoryResourceProvider();
+    final migrationInfo = MigrationInfo({}, {}, null, null);
+    state = MigrationState(null, null, dartfixListener, null, null);
+    state.pathMapper = PathMapper(resourceProvider);
+    state.migrationInfo = migrationInfo;
+    site = PreviewSite(state);
+  }
+
+  void test_applyChangesEmpty() {
+    final file = getFile('/test.dart');
+    file.writeAsStringSync('void main() {}');
+    site.performApply();
+    expect(file.readAsStringSync(), 'void main() {}');
+    expect(state.hasBeenApplied, true);
+  }
+
+  void test_applyChangesTwiceThrows() {
+    site.performApply();
+    expect(site.performApply, throwsA(isA<StateError>()));
+  }
+
+  void test_applyMultipleChanges() {
+    final path = convertPath('/test.dart');
+    final file = getFile(path);
+    file.writeAsStringSync('void main() {}');
+    dartfixListener.addSourceChange(
+        'test change',
+        Location(path, 10, 0, 1, 10),
+        SourceChange('test change', edits: [
+          SourceFileEdit(path, 0, edits: [
+            SourceEdit(10, 0, 'List args'),
+            SourceEdit(13, 0, '\n  print(args);\n')
+          ])
+        ]));
+    site.performApply();
+    expect(file.readAsStringSync(), '''
+void main(List args) {
+  print(args);
+}''');
+    expect(state.hasBeenApplied, true);
+  }
+
+  void test_applySingleChange() {
+    final path = convertPath('/test.dart');
+    final file = getFile(path);
+    file.writeAsStringSync('void main() {}');
+    dartfixListener.addSourceChange(
+        'test change',
+        Location(path, 10, 0, 1, 10),
+        SourceChange('test change', edits: [
+          SourceFileEdit(path, 0, edits: [SourceEdit(10, 0, 'List args')])
+        ]));
+    site.performApply();
+    expect(file.readAsStringSync(), 'void main(List args) {}');
+    expect(state.hasBeenApplied, true);
+  }
+}
diff --git a/pkg/analysis_server/test/src/edit/preview/test_all.dart b/pkg/analysis_server/test/src/edit/preview/test_all.dart
new file mode 100644
index 0000000..e357e6d
--- /dev/null
+++ b/pkg/analysis_server/test/src/edit/preview/test_all.dart
@@ -0,0 +1,13 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'preview_site_test.dart' as preview_site;
+
+void main() {
+  defineReflectiveSuite(() {
+    preview_site.main();
+  }, name: 'preview');
+}
diff --git a/pkg/analysis_server/test/src/edit/test_all.dart b/pkg/analysis_server/test/src/edit/test_all.dart
index b36abbb..f63fe71 100644
--- a/pkg/analysis_server/test/src/edit/test_all.dart
+++ b/pkg/analysis_server/test/src/edit/test_all.dart
@@ -6,10 +6,12 @@
 
 import 'fix/test_all.dart' as fix;
 import 'nnbd_migration/test_all.dart' as nnbd_migration;
+import 'preview/test_all.dart' as preview;
 
 void main() {
   defineReflectiveSuite(() {
     fix.main();
     nnbd_migration.main();
+    preview.main();
   }, name: 'edit');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
index 2dcde2c..0c2a51a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
@@ -3,6 +3,7 @@
 // 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/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -13,6 +14,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AddAsyncTest);
+    defineReflectiveTests(AvoidReturningNullForFutureTest);
   });
 }
 
@@ -183,3 +185,25 @@
 ''');
   }
 }
+
+@reflectiveTest
+class AvoidReturningNullForFutureTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_ASYNC;
+
+  @override
+  String get lintCode => LintNames.avoid_returning_null_for_future;
+
+  Future<void> test_asyncFor() async {
+    await resolveTestUnit('''
+Future<String> f() {
+  return null;
+}
+''');
+    await assertHasFix('''
+Future<String> f() async {
+  return null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index f633431..6631e92 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -27,13 +27,17 @@
   /// The offset of the lint marker in the code being analyzed.
   int lintOffset = -1;
 
+  /// Return a list of the experiments that are to be enabled for tests in this
+  /// class, or `null` if there are no experiments that should be enabled.
+  List<String> get experiments => null;
+
   /// Return the lint code being tested.
   String get lintCode;
 
   @override
   void setUp() {
     super.setUp();
-    createAnalysisOptionsFile(lints: [lintCode]);
+    createAnalysisOptionsFile(experiments: experiments, lints: [lintCode]);
   }
 
   /// Find the error that is to be fixed by computing the errors in the file,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
new file mode 100644
index 0000000..92b2217
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
@@ -0,0 +1,162 @@
+// 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/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(InlineTypedefTest);
+    defineReflectiveTests(InlineTypedefWithNNBDTest);
+  });
+}
+
+@reflectiveTest
+class InlineTypedefTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.INLINE_TYPEDEF;
+
+  @override
+  String get lintCode => LintNames.avoid_private_typedef_functions;
+
+  Future<void> test_generic_parameter_optionalNamed() async {
+    await resolveTestUnit('''
+typedef _F = Function({int i});
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function({int i}) f) {}
+''');
+  }
+
+  Future<void> test_generic_parameter_optionalPositional_withName() async {
+    await resolveTestUnit('''
+typedef _F = Function([int i]);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function([int]) f) {}
+''');
+  }
+
+  Future<void> test_generic_parameter_optionalPositional_withoutName() async {
+    await resolveTestUnit('''
+typedef _F = Function([int]);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function([int]) f) {}
+''');
+  }
+
+  Future<void> test_generic_parameter_requiredPositional_withName() async {
+    await resolveTestUnit('''
+typedef _F = Function(int i);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function(int) f) {}
+''');
+  }
+
+  Future<void> test_generic_parameter_requiredPositional_withoutName() async {
+    await resolveTestUnit('''
+typedef _F = Function(int);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function(int) f) {}
+''');
+  }
+
+  Future<void> test_generic_returnType() async {
+    await resolveTestUnit('''
+typedef _F = void Function();
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(void Function() f) {}
+''');
+  }
+
+  Future<void> test_generic_typeParameters() async {
+    await resolveTestUnit('''
+typedef _F = Function<T>(T);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function<T>(T) f) {}
+''');
+  }
+
+  Future<void> test_nonGeneric_parameter_requiredPositional_typed() async {
+    await resolveTestUnit('''
+typedef _F(int i);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function(int) f) {}
+''');
+  }
+
+  Future<void> test_nonGeneric_parameter_requiredPositional_untyped() async {
+    await resolveTestUnit('''
+typedef _F(i);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function(dynamic) f) {}
+''');
+  }
+
+  Future<void> test_nonGeneric_returnType() async {
+    await resolveTestUnit('''
+typedef void _F();
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(void Function() f) {}
+''');
+  }
+
+  Future<void> test_nonGeneric_typeParameters() async {
+    await resolveTestUnit('''
+typedef _F<T>(T t);
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function<T>(T) f) {}
+''');
+  }
+}
+
+@reflectiveTest
+class InlineTypedefWithNNBDTest extends InlineTypedefTest {
+  @override
+  List<String> get experiments => ['non-nullable'];
+
+  Future<void> test_generic_parameter_requiredNamed() async {
+    await resolveTestUnit('''
+typedef _F = Function({required int i});
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function({required int i}) f) {}
+''');
+  }
+
+  Future<void> test_nonGeneric_parameter_requiredNamed() async {
+    await resolveTestUnit('''
+typedef _F({required int i});
+void g(_F f) {}
+''');
+    await assertHasFix('''
+void g(Function({required int i}) f) {}
+''');
+  }
+}
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 76b12e7..3b49d2a 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
@@ -82,6 +82,7 @@
 import 'import_library_sdk_test.dart' as import_library_sdk;
 import 'import_library_show_test.dart' as import_library_show;
 import 'inline_invocation_test.dart' as inline_invocation;
+import 'inline_typedef_test.dart' as inline_typedef;
 import 'insert_semicolon_test.dart' as insert_semicolon;
 import 'make_class_abstract_test.dart' as make_class_abstract;
 import 'make_field_not_final_test.dart' as make_field_not_final;
@@ -150,6 +151,7 @@
 import 'use_is_not_empty_test.dart' as use_is_not_empty;
 import 'use_not_eq_null_test.dart' as use_not_eq_null;
 import 'use_rethrow_test.dart' as use_rethrow;
+import 'wrap_in_future_test.dart' as wrap_in_future;
 
 void main() {
   defineReflectiveSuite(() {
@@ -220,6 +222,7 @@
     import_library_sdk.main();
     import_library_show.main();
     inline_invocation.main();
+    inline_typedef.main();
     insert_semicolon.main();
     make_class_abstract.main();
     make_field_not_final.main();
@@ -283,5 +286,6 @@
     use_is_not_empty.main();
     use_not_eq_null.main();
     use_rethrow.main();
+    wrap_in_future.main();
   }, name: 'fix');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart
new file mode 100644
index 0000000..3736686
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart
@@ -0,0 +1,38 @@
+// 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 '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(WrapInFutureTest);
+  });
+}
+
+@reflectiveTest
+class WrapInFutureTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.WRAP_IN_FUTURE;
+
+  @override
+  String get lintCode => LintNames.avoid_returning_null_for_future;
+
+  Future<void> test_asyncFor() async {
+    await resolveTestUnit('''
+Future<String> f() {
+  return null;
+}
+''');
+    await assertHasFix('''
+Future<String> f() {
+  return Future.value(null);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
index a410f22..807acf4 100644
--- a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
+++ b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
@@ -46,7 +46,7 @@
       var mrrc = MeanReciprocalRankComputer();
       expect(mrrc.rankCount, equals(0));
       expect(mrrc.ranks, isEmpty);
-      expect(mrrc.mrr, equals(0));
+      expect(mrrc.getMRR(), equals(0));
     });
 
     test('clear', () {
@@ -69,7 +69,7 @@
       mrrc.addRank(3);
       expect(mrrc.rankCount, equals(5));
       expect(mrrc.ranks, equals([3, 3, 3, 3, 3]));
-      expect(mrrc.mrr, doubleEquals(1 / 3));
+      expect(mrrc.getMRR(), doubleEquals(1 / 3));
     });
 
     test('mmr- example', () {
@@ -79,7 +79,17 @@
       mrrc.addRank(1);
       expect(mrrc.rankCount, equals(3));
       expect(mrrc.ranks, equals([3, 2, 1]));
-      expect(mrrc.mrr, doubleEquals(11 / 18));
+      expect(mrrc.getMRR(), doubleEquals(11 / 18));
+    });
+
+    test('mmr- max rank', () {
+      var mrrc = MeanReciprocalRankComputer();
+      mrrc.addRank(3);
+      mrrc.addRank(2);
+      mrrc.addRank(1);
+      expect(mrrc.rankCount, equals(3));
+      expect(mrrc.ranks, equals([3, 2, 1]));
+      expect(mrrc.getMRR(2), doubleEquals(1 / 2));
     });
   });
 
diff --git a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
index d22512d..0c80948 100644
--- a/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/completion_metrics.dart
@@ -20,32 +20,101 @@
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
+import 'package:args/args.dart';
+import 'package:path/path.dart' as path;
 
 import 'metrics_util.dart';
 import 'visitors.dart';
 
 Future<void> main(List<String> args) async {
-  if (args.isEmpty) {
-    print('Usage: a single absolute file path to analyze.');
-    io.exit(1);
+  ArgParser parser = createArgParser();
+  ArgResults result = parser.parse(args);
+
+  if (validArguments(parser, result)) {
+    var code = await CompletionCoverageMetrics(result.rest[0])
+        .compute(corpus: result['corpus'], verbose: result['verbose']);
+    io.exit(code);
   }
-  await CompletionCoverageMetrics(args[0]).compute();
-  io.exit(0);
+  return io.exit(1);
+}
+
+/// Create a parser that can be used to parse the command-line arguments.
+ArgParser createArgParser() {
+  ArgParser parser = ArgParser();
+  parser.addFlag(
+    'corpus',
+    help: 'Analyze each of the subdirectories separately',
+    negatable: false,
+  );
+  parser.addOption(
+    'help',
+    abbr: 'h',
+    help: 'Print this help message.',
+  );
+  parser.addFlag(
+    'verbose',
+    abbr: 'v',
+    help: 'Print additional information about the analysis',
+    negatable: false,
+  );
+  return parser;
+}
+
+/// Return `true` if the command-line arguments (represented by the [result] and
+/// parsed by the [parser]) are valid.
+bool validArguments(ArgParser parser, ArgResults result) {
+  if (result.wasParsed('help')) {
+    printUsage(parser);
+    return false;
+  } else if (result.rest.length != 1) {
+    printUsage(parser, error: 'No package path specified.');
+    return false;
+  }
+  var rootPath = result.rest[0];
+  if (!io.Directory(rootPath).existsSync()) {
+    printUsage(parser, error: 'The directory "$rootPath" does not exist.');
+    return false;
+  }
+  return true;
+}
+
+/// Print usage information for this tool.
+void printUsage(ArgParser parser, {String error}) {
+  if (error != null) {
+    print(error);
+    print('');
+  }
+  print('usage: dart completion_metrics.dart [options] packagePath');
+  print('');
+  print('Compute code completion health metrics.');
+  print('');
+  print(parser.usage);
 }
 
 /// This is the main metrics computer class for code completions. After the
 /// object is constructed, [computeCompletionMetrics] is executed to do analysis
 /// and print a summary of the metrics gathered from the completion tests.
-abstract class AbstractCompletionMetricsComputer {
-  // TODO(brianwilkerson) Consider merging this class into the single concrete
-  //  subclass.
+class CompletionCoverageMetrics {
   final String _rootPath;
 
   String _currentFilePath;
 
+  bool _verbose;
+
   ResolvedUnitResult _resolvedUnitResult;
 
-  AbstractCompletionMetricsComputer(this._rootPath);
+  /// The int to be returned from the [compute] call.
+  int resultCode;
+
+  int includedCount = 0;
+  int notIncludedCount = 0;
+
+  var completionMissedTokenCounter = Counter('missing completion counter');
+  var completionKindCounter = Counter('completion kind counter');
+  var completionElementKindCounter = Counter('completion element kind counter');
+  var mRRComputer = MeanReciprocalRankComputer();
+
+  CompletionCoverageMetrics(this._rootPath);
 
   /// The path to the current file.
   String get currentFilePath => _currentFilePath;
@@ -53,90 +122,141 @@
   /// If the concrete class has this getter return true, then when
   /// [forEachExpectedCompletion] is called, the [List] of
   /// [CompletionSuggestion]s will be passed.
-  bool get doComputeCompletionsFromAnalysisServer;
-
-  /// The current [ResolvedUnitResult].
-  ResolvedUnitResult get resolvedUnitResult => _resolvedUnitResult;
+  bool get doComputeCompletionsFromAnalysisServer => true;
 
   /// The analysis root path that this CompletionMetrics class will be computed.
   String get rootPath => _rootPath;
 
-  void compute() async {
-    print('Analyzing root: \"$_rootPath\"');
+  Future<int> compute({bool corpus = false, bool verbose = false}) async {
+    _verbose = verbose;
+    resultCode = 0;
 
-    if (!io.Directory(_rootPath).existsSync()) {
-      print('\tError: No such directory exists on this machine.\n');
-      return;
-    }
+    var roots = _computeRootPaths(_rootPath, corpus);
+    for (var root in roots) {
+      print('Analyzing root: \"$root\"');
+      final collection = AnalysisContextCollection(
+        includedPaths: [root],
+        resourceProvider: PhysicalResourceProvider.INSTANCE,
+      );
 
-    final collection = AnalysisContextCollection(
-      includedPaths: [_rootPath],
-      resourceProvider: PhysicalResourceProvider.INSTANCE,
-    );
-
-    for (var context in collection.contexts) {
-      // Set the DeclarationsTracker, only call doWork to build up the available
-      // suggestions if doComputeCompletionsFromAnalysisServer is true.
-      var declarationsTracker = DeclarationsTracker(
-          MemoryByteStore(), PhysicalResourceProvider.INSTANCE);
-      declarationsTracker.addContext(context);
-      if (doComputeCompletionsFromAnalysisServer) {
+      for (var context in collection.contexts) {
+        // Set the DeclarationsTracker, only call doWork to build up the available
+        // suggestions if doComputeCompletionsFromAnalysisServer is true.
+        var declarationsTracker = DeclarationsTracker(
+            MemoryByteStore(), PhysicalResourceProvider.INSTANCE);
+        declarationsTracker.addContext(context);
         while (declarationsTracker.hasWork) {
           declarationsTracker.doWork();
         }
-      }
 
-      // Loop through each file, resolve the file and call
-      // forEachExpectedCompletion
-      for (var filePath in context.contextRoot.analyzedFiles()) {
-        if (AnalysisEngine.isDartFileName(filePath)) {
-          _currentFilePath = filePath;
-          try {
-            _resolvedUnitResult =
-                await context.currentSession.getResolvedUnit(filePath);
+        // Loop through each file, resolve the file and call
+        // forEachExpectedCompletion
+        for (var filePath in context.contextRoot.analyzedFiles()) {
+          if (AnalysisEngine.isDartFileName(filePath)) {
+            _currentFilePath = filePath;
+            try {
+              _resolvedUnitResult =
+                  await context.currentSession.getResolvedUnit(filePath);
 
-            var error = getFirstErrorOrNull(resolvedUnitResult);
-            if (error != null) {
-              print('File $filePath skipped due to errors such as:');
-              print('  ${error.toString()}');
-              print('');
-              continue;
+              var analysisError = getFirstErrorOrNull(_resolvedUnitResult);
+              if (analysisError != null) {
+                print('File $filePath skipped due to errors such as:');
+                print('  ${analysisError.toString()}');
+                print('');
+                resultCode = 1;
+                continue;
+              }
+
+              // Use the ExpectedCompletionsVisitor to compute the set of expected
+              // completions for this CompilationUnit.
+              final visitor = ExpectedCompletionsVisitor();
+              _resolvedUnitResult.unit.accept(visitor);
+
+              for (var expectedCompletion in visitor.expectedCompletions) {
+                forEachExpectedCompletion(
+                    expectedCompletion,
+                    doComputeCompletionsFromAnalysisServer
+                        ? await _computeCompletionSuggestions(
+                            _resolvedUnitResult,
+                            expectedCompletion.offset,
+                            declarationsTracker)
+                        : null);
+              }
+            } catch (e) {
+              print('Exception caught analyzing: $filePath');
+              print(e.toString());
+              resultCode = 1;
             }
-
-            // Use the ExpectedCompletionsVisitor to compute the set of expected
-            // completions for this CompilationUnit.
-            final visitor = ExpectedCompletionsVisitor();
-            resolvedUnitResult.unit.accept(visitor);
-
-            for (var expectedCompletion in visitor.expectedCompletions) {
-              // Call forEachExpectedCompletion, passing in the computed
-              // suggestions only if doComputeCompletionsFromAnalysisServer is
-              // true:
-              forEachExpectedCompletion(
-                  expectedCompletion,
-                  doComputeCompletionsFromAnalysisServer
-                      ? await _computeCompletionSuggestions(resolvedUnitResult,
-                          expectedCompletion.offset, declarationsTracker)
-                      : null);
-            }
-          } catch (e) {
-            print('Exception caught analyzing: $filePath');
-            print(e.toString());
           }
         }
       }
     }
     printAndClearComputers();
+    return resultCode;
   }
 
-  /// Overridden by each subclass, this method gathers some set of data from
-  /// each [ExpectedCompletion], and each [CompletionSuggestion] list (if
-  /// [doComputeCompletionsFromAnalysisServer] is set to true.)
   void forEachExpectedCompletion(ExpectedCompletion expectedCompletion,
-      List<CompletionSuggestion> suggestions);
+      List<CompletionSuggestion> suggestions) {
+    assert(suggestions != null);
 
-  /// This method is called to print a summary of the data collected.
-  void printAndClearComputers();
+    var place = placementInSuggestionList(suggestions, expectedCompletion);
+
+    mRRComputer.addRank(place.rank);
+
+    if (place.denominator != 0) {
+      includedCount++;
+    } else {
+      notIncludedCount++;
+
+      completionMissedTokenCounter.count(expectedCompletion.completion);
+      completionKindCounter.count(expectedCompletion.kind.toString());
+      completionElementKindCounter
+          .count(expectedCompletion.elementKind.toString());
+
+      if (_verbose) {
+        // The format "/file/path/foo.dart:3:4" makes for easier input
+        // with the Files dialog in IntelliJ
+        print(
+            '$currentFilePath:${expectedCompletion.lineNumber}:${expectedCompletion.columnNumber}');
+        print(
+            '\tdid not include the expected completion: \"${expectedCompletion.completion}\", completion kind: ${expectedCompletion.kind.toString()}, element kind: ${expectedCompletion.elementKind.toString()}');
+        print('');
+      }
+    }
+  }
+
+  void printAndClearComputers() {
+    final totalCompletionCount = includedCount + notIncludedCount;
+    final percentIncluded = includedCount / totalCompletionCount;
+    final percentNotIncluded = 1 - percentIncluded;
+
+    print('');
+    completionMissedTokenCounter.printCounterValues();
+    print('');
+
+    completionKindCounter.printCounterValues();
+    print('');
+
+    completionElementKindCounter.printCounterValues();
+    print('');
+
+    mRRComputer.printMean();
+    print('');
+
+    print('Summary for $_rootPath:');
+    print('Total number of completion tests   = $totalCompletionCount');
+    print(
+        'Number of successful completions   = $includedCount (${printPercentage(percentIncluded)})');
+    print(
+        'Number of unsuccessful completions = $notIncludedCount (${printPercentage(percentNotIncluded)})');
+
+    includedCount = 0;
+    notIncludedCount = 0;
+    completionMissedTokenCounter.clear();
+    completionKindCounter.clear();
+    completionElementKindCounter.clear();
+    mRRComputer.clear();
+  }
 
   Future<List<CompletionSuggestion>> _computeCompletionSuggestions(
       ResolvedUnitResult resolvedUnitResult, int offset,
@@ -179,6 +299,20 @@
     return suggestions;
   }
 
+  List<String> _computeRootPaths(String rootPath, bool corpus) {
+    var roots = <String>[];
+    if (!corpus) {
+      roots.add(rootPath);
+    } else {
+      for (var child in io.Directory(rootPath).listSync()) {
+        if (child is io.Directory) {
+          roots.add(path.join(rootPath, child.path));
+        }
+      }
+    }
+    return roots;
+  }
+
   /// Given some [ResolvedUnitResult] return the first error of high severity
   /// if such an error exists, null otherwise.
   static err.AnalysisError getFirstErrorOrNull(
@@ -203,80 +337,3 @@
     return Place.none();
   }
 }
-
-class CompletionCoverageMetrics extends AbstractCompletionMetricsComputer {
-  int includedCount = 0;
-  int notIncludedCount = 0;
-  var completionMissedTokenCounter = Counter('missing completion counter');
-  var completionKindCounter = Counter('completion kind counter');
-  var completionElementKindCounter = Counter('completion element kind counter');
-  var mRRComputer = MeanReciprocalRankComputer();
-
-  CompletionCoverageMetrics(String rootPath) : super(rootPath);
-
-  @override
-  bool get doComputeCompletionsFromAnalysisServer => true;
-
-  @override
-  void forEachExpectedCompletion(ExpectedCompletion expectedCompletion,
-      List<CompletionSuggestion> suggestions) {
-    assert(suggestions != null);
-
-    var place = AbstractCompletionMetricsComputer.placementInSuggestionList(
-        suggestions, expectedCompletion);
-
-    mRRComputer.addRank(place.rank);
-
-    if (place.denominator != 0) {
-      includedCount++;
-    } else {
-      notIncludedCount++;
-
-      completionMissedTokenCounter.count(expectedCompletion.completion);
-      completionKindCounter.count(expectedCompletion.kind.toString());
-      completionElementKindCounter
-          .count(expectedCompletion.elementKind.toString());
-
-      // The format "/file/path/foo.dart:3:4" makes for easier input
-      // with the Files dialog in IntelliJ
-      print(
-          '$currentFilePath:${expectedCompletion.lineNumber}:${expectedCompletion.columnNumber}');
-      print(
-          '\tdid not include the expected completion: \"${expectedCompletion.completion}\", completion kind: ${expectedCompletion.kind.toString()}, element kind: ${expectedCompletion.elementKind.toString()}');
-      print('');
-    }
-  }
-
-  @override
-  void printAndClearComputers() {
-    final totalCompletionCount = includedCount + notIncludedCount;
-    final percentIncluded = includedCount / totalCompletionCount;
-    final percentNotIncluded = 1 - percentIncluded;
-
-    completionMissedTokenCounter.printCounterValues();
-    print('');
-
-    completionKindCounter.printCounterValues();
-    print('');
-
-    completionElementKindCounter.printCounterValues();
-    print('');
-
-    mRRComputer.printMean();
-    print('');
-
-    print('Summary for $_rootPath:');
-    print('Total number of completion tests   = $totalCompletionCount');
-    print(
-        'Number of successful completions   = $includedCount (${printPercentage(percentIncluded)})');
-    print(
-        'Number of unsuccessful completions = $notIncludedCount (${printPercentage(percentNotIncluded)})');
-
-    includedCount = 0;
-    notIncludedCount = 0;
-    completionMissedTokenCounter.clear();
-    completionKindCounter.clear();
-    completionElementKindCounter.clear();
-    mRRComputer.clear();
-  }
-}
diff --git a/pkg/analysis_server/tool/completion_metrics/feature_computer.dart b/pkg/analysis_server/tool/completion_metrics/feature_computer.dart
new file mode 100644
index 0000000..bce7cf1
--- /dev/null
+++ b/pkg/analysis_server/tool/completion_metrics/feature_computer.dart
@@ -0,0 +1,440 @@
+// 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.
+
+/// Utility methods to compute the value of the features used for code
+/// completion.
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart'
+    show ClassElement, FieldElement;
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+
+// TODO(brianwilkerson) Move this file to `lib` so that it can be used by the
+//  completion contributors.
+
+/// An object that computes the values of features.
+class FeatureComputer {
+  /// The type provider used to access types defined by the spec.
+  final TypeProvider typeProvider;
+
+  /// Initialize a newly created feature computer.
+  FeatureComputer(this.typeProvider);
+
+  /// Return the type imposed on the given [node] based on its context, or
+  /// `null` if the context does not impose any type.
+  DartType computeContextType(AstNode node) {
+    // This method is only visible for the metrics computation and might be made
+    // private at some future date.
+    var type = node.parent?.accept(_ContextTypeVisitor(typeProvider, node));
+    if (type == null || type.isDynamic) {
+      return null;
+    }
+    return type;
+  }
+
+  /// Return the inheritance distance between the [subclass] and the
+  /// [superclass]. We define the inheritance distance between two types to be
+  /// zero if the two types are the same and the minimum number of edges that
+  /// must be traversed in the type graph to get from the subtype to the
+  /// supertype if the two types are not the same. Return `-1` if the [subclass]
+  /// is not a subclass of the [superclass].
+  int inheritanceDistance(ClassElement subclass, ClassElement superclass) {
+    // This method is only visible for the metrics computation and might be made
+    // private at some future date.
+    return _inheritanceDistance(subclass, superclass, {});
+  }
+
+  /// Return the value of the inheritance distance feature for a member defined
+  /// in the [superclass] that is being accessed through an expression whose
+  /// static type is the [subclass].
+  double inheritanceDistanceFeature(
+      ClassElement subclass, ClassElement superclass) {
+    var distance = _inheritanceDistance(subclass, superclass, {});
+    if (distance < 0) {
+      return 0;
+    }
+    return 1 / (distance + 1);
+  }
+
+  /// Return the inheritance distance between the [subclass] and the
+  /// [superclass]. The set of [visited] elements is used to guard against
+  /// cycles in the type graph.
+  ///
+  /// This is the implementation of [inheritanceDistance].
+  int _inheritanceDistance(ClassElement subclass, ClassElement superclass,
+      Set<ClassElement> visited) {
+    if (subclass == null) {
+      return -1;
+    } else if (subclass == superclass) {
+      return 0;
+    } else if (!visited.add(subclass)) {
+      return -1;
+    }
+    var minDepth =
+        _inheritanceDistance(subclass.supertype?.element, superclass, visited);
+
+    void visitTypes(List<InterfaceType> types) {
+      for (var type in types) {
+        var depth = _inheritanceDistance(type.element, superclass, visited);
+        if (minDepth < 0 || (depth >= 0 && depth < minDepth)) {
+          minDepth = depth;
+        }
+      }
+    }
+
+    visitTypes(subclass.superclassConstraints);
+    visitTypes(subclass.mixins);
+    visitTypes(subclass.interfaces);
+
+    visited.remove(subclass);
+    if (minDepth < 0) {
+      return minDepth;
+    }
+    return minDepth + 1;
+  }
+}
+
+/// An object used to compute metrics for a single file or directory.
+class _ContextTypeVisitor extends SimpleAstVisitor<DartType> {
+  final TypeProvider typeProvider;
+
+  AstNode childNode;
+
+  _ContextTypeVisitor(this.typeProvider, this.childNode);
+
+  @override
+  DartType visitAdjacentStrings(AdjacentStrings node) {
+    if (childNode == node.strings[0]) {
+      return _visitParent(node);
+    }
+    return typeProvider.stringType;
+  }
+
+  @override
+  DartType visitArgumentList(ArgumentList node) {
+    return (childNode as Expression).staticParameterElement?.type;
+  }
+
+  @override
+  DartType visitAssertInitializer(AssertInitializer node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitAssertStatement(AssertStatement node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitAssignmentExpression(AssignmentExpression node) {
+    if (childNode == node.rightHandSide) {
+      return node.leftHandSide.staticType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitAwaitExpression(AwaitExpression node) {
+    return _visitParent(node);
+  }
+
+  @override
+  DartType visitBinaryExpression(BinaryExpression node) {
+    if (childNode == node.rightOperand) {
+      return (childNode as Expression).staticParameterElement?.type;
+    }
+    return _visitParent(node);
+  }
+
+  @override
+  DartType visitCascadeExpression(CascadeExpression node) {
+    if (childNode == node.target) {
+      return _visitParent(node);
+    }
+    return null;
+  }
+
+  @override
+  DartType visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (childNode == node.expression) {
+      var element = node.fieldName.staticElement;
+      if (element is FieldElement) {
+        return element.type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (childNode == node.defaultValue) {
+      return node.parameter.declaredElement.type;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitDoStatement(DoStatement node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
+    if (childNode == node.iterable) {
+      var parent = node.parent;
+      if ((parent is ForStatement && parent.awaitKeyword != null) ||
+          (parent is ForElement && parent.awaitKeyword != null)) {
+        return typeProvider.streamDynamicType;
+      }
+      return typeProvider.iterableDynamicType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
+    if (childNode == node.iterable) {
+      var parent = node.parent;
+      if ((parent is ForStatement && parent.awaitKeyword != null) ||
+          (parent is ForElement && parent.awaitKeyword != null)) {
+        return typeProvider.streamDynamicType;
+      }
+      return typeProvider.iterableDynamicType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitForPartsWithExpression(ForPartsWithExpression node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitFunctionExpressionInvocation(
+      FunctionExpressionInvocation node) {
+    if (childNode == node.function) {
+      return _visitParent(node);
+    }
+    return null;
+  }
+
+  @override
+  DartType visitIfElement(IfElement node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitIfStatement(IfStatement node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitIndexExpression(IndexExpression node) {
+    if (childNode == node.index) {
+      var parameters = node.staticElement?.parameters;
+      if (parameters != null && parameters.length == 1) {
+        return parameters[0].type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitListLiteral(ListLiteral node) {
+    var typeArguments = node.typeArguments?.arguments;
+    if (typeArguments != null && typeArguments.length == 1) {
+      return typeArguments[0].type;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitMapLiteralEntry(MapLiteralEntry node) {
+    var typeArguments =
+        node.thisOrAncestorOfType<SetOrMapLiteral>()?.typeArguments;
+    if (typeArguments != null && typeArguments.length == 2) {
+      if (childNode == node.key) {
+        return typeArguments.arguments[0].type;
+      } else {
+        return typeArguments.arguments[1].type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitMethodInvocation(MethodInvocation node) {
+    if (childNode == node.target) {
+      return _visitParent(node);
+    }
+    return null;
+  }
+
+  @override
+  DartType visitParenthesizedExpression(ParenthesizedExpression node) {
+    return _visitParent(node);
+  }
+
+  @override
+  DartType visitPostfixExpression(PostfixExpression node) {
+    return (childNode as Expression).staticParameterElement?.type;
+  }
+
+  @override
+  DartType visitPrefixExpression(PrefixExpression node) {
+    return (childNode as Expression).staticParameterElement?.type;
+  }
+
+  @override
+  DartType visitPropertyAccess(PropertyAccess node) {
+    if (childNode == node.target) {
+      return _visitParent(node);
+    }
+    return null;
+  }
+
+  @override
+  DartType visitReturnStatement(ReturnStatement node) {
+    if (childNode == node.expression) {
+      return _returnType(node);
+    }
+    return null;
+  }
+
+  @override
+  DartType visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isSet) {
+      var typeArguments = node.typeArguments?.arguments;
+      if (typeArguments != null && typeArguments.length == 1) {
+        return typeArguments[0].type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitSpreadElement(SpreadElement node) {
+    if (childNode == node.expression) {
+      var currentNode = node.parent;
+      while (currentNode != null) {
+        if (currentNode is ListLiteral) {
+          return typeProvider.iterableDynamicType;
+        } else if (currentNode is SetOrMapLiteral) {
+          if (currentNode.isSet) {
+            return typeProvider.iterableDynamicType;
+          }
+          return typeProvider.mapType2(
+              typeProvider.dynamicType, typeProvider.dynamicType);
+        }
+        currentNode = currentNode.parent;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitVariableDeclaration(VariableDeclaration node) {
+    if (childNode == node.initializer) {
+      var parent = node.parent;
+      if (parent is VariableDeclarationList && parent.type != null) {
+        return parent.type.type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  DartType visitWhileStatement(WhileStatement node) {
+    if (childNode == node.condition) {
+      return typeProvider.boolType;
+    }
+    return null;
+  }
+
+  @override
+  DartType visitYieldStatement(YieldStatement node) {
+    if (childNode == node.expression) {
+      return _returnType(node);
+    }
+    return null;
+  }
+
+  DartType _returnType(AstNode node) {
+    DartType unwrap(DartType returnType, FunctionBody body) {
+      if (returnType is InterfaceTypeImpl) {
+        DartType unwrapAs(ClassElement superclass) {
+          var convertedType = returnType.asInstanceOf(superclass);
+          if (convertedType != null) {
+            return convertedType.typeArguments[0];
+          }
+          return null;
+        }
+
+        if (body.isAsynchronous) {
+          if (body.isGenerator) {
+            // async* implies Stream<T>
+            return unwrapAs(typeProvider.streamElement);
+          } else {
+            // async implies Future<T>
+            return unwrapAs(typeProvider.futureElement);
+          }
+        } else if (body.isGenerator) {
+          // sync* implies Iterable<T>
+          return unwrapAs(typeProvider.iterableElement);
+        }
+      }
+      return returnType;
+    }
+
+    var parent = node.parent;
+    while (parent != null) {
+      if (parent is MethodDeclaration) {
+        return unwrap(parent.declaredElement.returnType, parent.body);
+      } else if (parent is ConstructorDeclaration) {
+        return parent.declaredElement.returnType;
+      } else if (parent is FunctionDeclaration) {
+        return unwrap(
+            parent.declaredElement.returnType, parent.functionExpression.body);
+      }
+      parent = parent.parent;
+    }
+    return null;
+  }
+
+  DartType _visitParent(AstNode node) {
+    if (node.parent != null) {
+      childNode = node;
+      return node.parent.accept(this);
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
index 7552187..36ca3e6 100644
--- a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
+++ b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
@@ -65,14 +65,21 @@
   final List<int> ranks = [];
   MeanReciprocalRankComputer();
 
-  double get mrr {
-    if (ranks.isEmpty) {
+  double getMRR([int maxRank = 0]) {
+    if (ranks.isEmpty || maxRank < 0) {
       return 0;
     }
-
     double sum = 0;
     ranks.forEach((rank) {
-      sum += rank != 0 ? (1 / rank) : 0;
+      if (maxRank == 0) {
+        if (rank != 0) {
+          sum += 1 / rank;
+        }
+      } else {
+        if (rank != 0 && rank <= maxRank) {
+          sum += 1 / rank;
+        }
+      }
     });
     return sum / rankCount;
   }
@@ -86,9 +93,15 @@
   void clear() => ranks.clear();
 
   void printMean() {
-    var mrrVal = mrr;
-    print('Mean Reciprocal Rank    = ${mrrVal.toStringAsFixed(5)}');
-    print('Harmonic Mean (inverse) = ${(1 / mrrVal).toStringAsFixed(2)}');
+    var mrrVal = getMRR();
+    print(
+        'Mean Reciprocal Rank                  = ${mrrVal.toStringAsFixed(6)} '
+        '(inverse = ${(1 / mrrVal).toStringAsFixed(3)})');
+
+    var mrrVal5 = getMRR(5);
+    print(
+        'Mean Reciprocal Rank (max rank 5)     = ${mrrVal5.toStringAsFixed(6)} '
+        '(inverse = ${(1 / mrrVal5).toStringAsFixed(3)})');
   }
 }
 
diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
index 60d81c4..1c5b8bf 100644
--- a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart
@@ -24,43 +24,101 @@
         ExtensionElement,
         LibraryElement,
         LocalVariableElement,
-        ParameterElement;
+        ParameterElement,
+        PropertyAccessorElement;
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:args/args.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
+import 'feature_computer.dart';
+
+/// Compute metrics to determine whether they should be used to compute a
+/// relevance score for completion suggestions.
 Future<void> main(List<String> args) async {
-  var out = io.stdout;
-  if (args.isEmpty) {
-    out.writeln('Usage: a single absolute file path to analyze.');
+  ArgParser parser = createArgParser();
+  ArgResults result = parser.parse(args);
+
+  if (validArguments(parser, result)) {
+    var out = io.stdout;
+    var rootPath = result.rest[0];
+    out.writeln('Analyzing root: "$rootPath"');
+
+    var computer = RelevanceMetricsComputer();
+    var stopwatch = Stopwatch();
+    stopwatch.start();
+    await computer.compute(rootPath,
+        corpus: result['corpus'], verbose: result['verbose']);
+    stopwatch.stop();
+
+    var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
+    out.writeln('Metrics computed in $duration');
+    computer.writeMetrics(out);
     await out.flush();
-    io.exit(1);
   }
-
-  var corpus = args[0] == '--corpus';
-  var rootPath = corpus ? args[1] : args[0];
-  out.writeln('Analyzing root: \"$rootPath\"');
-  if (!io.Directory(rootPath).existsSync()) {
-    out.writeln('\tError: No such directory exists on this machine.\n');
-    return;
-  }
-
-  var computer = RelevanceMetricsComputer();
-  var stopwatch = Stopwatch();
-  stopwatch.start();
-  await computer.compute(rootPath, corpus: corpus);
-  stopwatch.stop();
-  var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
-  out.writeln('  Metrics computed in $duration');
-  computer.writeMetrics(out);
-  await out.flush();
   io.exit(0);
 }
 
+/// Create a parser that can be used to parse the command-line arguments.
+ArgParser createArgParser() {
+  ArgParser parser = ArgParser();
+  parser.addFlag(
+    'corpus',
+    help: 'Analyze each of the subdirectories separately',
+    negatable: false,
+  );
+  parser.addOption(
+    'help',
+    abbr: 'h',
+    help: 'Print this help message.',
+  );
+  parser.addFlag(
+    'verbose',
+    abbr: 'v',
+    help: 'Print additional information about the analysis',
+    negatable: false,
+  );
+  return parser;
+}
+
+/// Print usage information for this tool.
+void printUsage(ArgParser parser, {String error}) {
+  if (error != null) {
+    print(error);
+    print('');
+  }
+  print('usage: dart relevance_metrics.dart [options] packagePath');
+  print('');
+  print('Compute metrics to determine whether they should be used to compute');
+  print('a relevance score for completion suggestions.');
+  print('');
+  print(parser.usage);
+}
+
+/// Return `true` if the command-line arguments (represented by the [result] and
+/// parsed by the [parser]) are valid.
+bool validArguments(ArgParser parser, ArgResults result) {
+  if (result.wasParsed('help')) {
+    printUsage(parser);
+    return false;
+  } else if (result.rest.length != 1) {
+    printUsage(parser, error: 'No package path specified.');
+    return false;
+  }
+  var rootPath = result.rest[0];
+  if (!io.Directory(rootPath).existsSync()) {
+    printUsage(parser, error: 'The directory "$rootPath" does not exist.');
+    return false;
+  }
+  return true;
+}
+
 /// An object that records the data used to compute the metrics.
 class RelevanceData {
   /// A number identifying the version of this code that produced a given JSON
@@ -299,9 +357,15 @@
   /// The library containing the compilation unit being visited.
   LibraryElement enclosingLibrary;
 
+  /// The type provider associated with the current compilation unit.
+  TypeProvider typeProvider;
+
   /// The type system associated with the current compilation unit.
   TypeSystem typeSystem;
 
+  /// The object used to compute the values of features.
+  FeatureComputer featureComputer;
+
   /// Initialize a newly created collector to add data points to the given
   /// [data].
   RelevanceDataCollector(this.data);
@@ -503,8 +567,10 @@
   @override
   void visitCompilationUnit(CompilationUnit node) {
     enclosingLibrary = node.declaredElement.library;
+    typeProvider = enclosingLibrary.typeProvider;
     typeSystem = enclosingLibrary.typeSystem;
     inheritanceManager = InheritanceManager3();
+    featureComputer = FeatureComputer(typeProvider);
 
     for (var directive in node.directives) {
       _recordTokenType('CompilationUnit (directive)', directive,
@@ -516,9 +582,11 @@
     }
     super.visitCompilationUnit(node);
 
-    typeSystem = null;
-    enclosingLibrary = null;
+    featureComputer = null;
     inheritanceManager = null;
+    typeSystem = null;
+    typeProvider = null;
+    enclosingLibrary = null;
   }
 
   @override
@@ -775,6 +843,15 @@
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     // There are no completions.
+    var contextType = featureComputer.computeContextType(node);
+    if (contextType != null) {
+      var memberType = _returnType(node.staticElement);
+      if (memberType != null) {
+        _recordTypeRelationships(
+            'function expression invocation', contextType, memberType,
+            isContextType: true);
+      }
+    }
     super.visitFunctionExpressionInvocation(node);
   }
 
@@ -957,8 +1034,10 @@
           (element.enclosingElement as ClassElement).thisType,
           Name(element.librarySource.uri, element.name));
       if (overriddenMembers != null) {
-        // TODO(brianwilkerson) Should we limit this to the most immediate
-        //  override?
+        // Consider limiting this to the most immediate override. If the
+        // signature of a method is changed by one of the overrides, then it
+        // isn't reasonable to expect the overrides of that member to conform to
+        // the signatures of the overridden members from superclasses.
         for (var overridden in overriddenMembers) {
           _recordOverride(element, overridden);
         }
@@ -969,7 +1048,28 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    _recordMemberDepth(node.target?.staticType, node.methodName.staticElement);
+    var member = node.methodName.staticElement;
+    _recordMemberDepth(node.target?.staticType, member);
+    if (node.target is SuperExpression) {
+      var enclosingMethod = node.thisOrAncestorOfType<MethodDeclaration>();
+      if (enclosingMethod != null) {
+        if (enclosingMethod.name.name == node.methodName.name) {
+          data.recordTypeMatch('super invocation member', 'same');
+        } else {
+          data.recordTypeMatch('super invocation member', 'different');
+        }
+      }
+    }
+    if (node.target != null) {
+      var contextType = featureComputer.computeContextType(node);
+      if (contextType != null) {
+        var memberType = _returnType(member);
+        if (memberType != null) {
+          _recordTypeRelationships('method invocation', contextType, memberType,
+              isContextType: true);
+        }
+      }
+    }
     super.visitMethodInvocation(node);
   }
 
@@ -1064,8 +1164,28 @@
 
   @override
   void visitPropertyAccess(PropertyAccess node) {
-    _recordMemberDepth(
-        node.target?.staticType, node.propertyName.staticElement);
+    var member = node.propertyName.staticElement;
+    _recordMemberDepth(node.target?.staticType, member);
+    if (node.target is SuperExpression) {
+      var enclosingMethod = node.thisOrAncestorOfType<MethodDeclaration>();
+      if (enclosingMethod != null) {
+        if (enclosingMethod.name.name == node.propertyName.name) {
+          data.recordTypeMatch('super property access member', 'same');
+        } else {
+          data.recordTypeMatch('super property access member', 'different');
+        }
+      }
+    }
+    if (!(member is PropertyAccessorElement && member.isSetter)) {
+      var contextType = featureComputer.computeContextType(node);
+      if (contextType != null) {
+        var memberType = _returnType(member);
+        if (memberType != null) {
+          _recordTypeRelationships('property access', contextType, memberType,
+              isContextType: true);
+        }
+      }
+    }
     super.visitPropertyAccess(node);
   }
 
@@ -1371,9 +1491,6 @@
       }
     }
     if (currentNode is SimpleIdentifier && currentNode.inDeclarationContext()) {
-      // TODO(brianwilkerson) Explore recording when the left-most identifier is
-      //  in a declaration context to help align identifier counts (from the
-      //  token type list) with the element counts.
       return null;
     }
     return currentNode;
@@ -1417,8 +1534,10 @@
     var distance = 0;
     var node = reference;
     while (node != null) {
-      if (node is ForStatement) {
-        var loopParts = node.forLoopParts;
+      if (node is ForStatement || node is ForElement) {
+        var loopParts = node is ForStatement
+            ? node.forLoopParts
+            : (node as ForElement).forLoopParts;
         if (loopParts is ForPartsWithDeclarations) {
           for (var declaredVariable in loopParts.variables.variables.reversed) {
             if (declaredVariable.declaredElement == variable) {
@@ -1536,6 +1655,9 @@
   /// Record the distance between the static type of the target (the
   /// [targetType]) and the [member] to which the reference was resolved.
   void _recordMemberDepth(DartType targetType, Element member) {
+    if (member == null) {
+      return;
+    }
     if (targetType is InterfaceType) {
       var targetClass = targetType.element;
       var extension = member.thisOrAncestorOfType<ExtensionElement>();
@@ -1581,47 +1703,21 @@
           return depth;
         }
 
-        const notFound = 0xFFFF;
-
-        /// Return the minimum distance from the [currentClass] to the
-        /// [memberClass] along any inheritance chain (including interfaces).
-        /// This includes paths introduced by mixins.
-        int getInterfaceDepth(ClassElement currentClass) {
-          if (currentClass == null) {
-            return notFound;
-          } else if (currentClass == memberClass) {
-            return 0;
-          }
-          var minDepth = getInterfaceDepth(currentClass.supertype?.element);
-          for (var mixin in currentClass.mixins) {
-            var depth = getInterfaceDepth(mixin.element);
-            if (depth < minDepth) {
-              minDepth = depth;
-            }
-          }
-          for (var interface in currentClass.interfaces) {
-            var depth = getInterfaceDepth(interface.element);
-            if (depth < minDepth) {
-              minDepth = depth;
-            }
-          }
-          return minDepth + 1;
-        }
-
         int superclassDepth = getSuperclassDepth();
-        int interfaceDepth = getInterfaceDepth(targetClass);
+        int interfaceDepth =
+            featureComputer.inheritanceDistance(targetClass, memberClass);
         if (superclassDepth >= 0) {
           _recordDistance('member (superclass)', superclassDepth);
-          data.recordDistanceByDepth(getTargetDepth(), superclassDepth);
+        } else if (interfaceDepth >= 0) {
+          _recordDistance('member (interface)', interfaceDepth);
         } else {
-          if (interfaceDepth < notFound) {
-            _recordDistance('member (interface)', interfaceDepth);
-          } else {
-            _recordDistance('member (not found)', 0);
-          }
+          // This shouldn't happen, so it's worth investigating the cause when
+          // it does.
+          _recordDistance('member (not found)', 0);
         }
-        if (interfaceDepth < notFound) {
+        if (interfaceDepth >= 0) {
           _recordDistance('member (shortest distance)', interfaceDepth);
+          data.recordDistanceByDepth(getTargetDepth(), interfaceDepth);
         }
       }
     }
@@ -1691,6 +1787,9 @@
       //  crossed and then reporting the distance with a label such as
       //  'local variable ($boundaryCount)'.
       var distance = _localVariableDistance(node, element);
+      if (distance < 0) {
+        DateTime.now();
+      }
       _recordDistance('distance to local variable', distance);
     } else if (element != null) {
       // TODO(brianwilkerson) We might want to cross reference the depth of
@@ -1791,17 +1890,56 @@
   /// Record information about how the [parameterType] and [argumentType] are
   /// related, using the [descriptor] to differentiate between the counts.
   void _recordTypeRelationships(
-      String descriptor, DartType parameterType, DartType argumentType) {
+      String descriptor, DartType parameterType, DartType argumentType,
+      {bool isContextType = false}) {
     if (argumentType == parameterType) {
       data.recordTypeMatch('$descriptor', 'exact');
+      data.recordTypeMatch('all', 'exact');
     } else if (typeSystem.isSubtypeOf(argumentType, parameterType)) {
       data.recordTypeMatch('$descriptor', 'subtype');
+      data.recordTypeMatch('all', 'subtype');
+      if (isContextType &&
+          argumentType is InterfaceType &&
+          parameterType is InterfaceType) {
+        int distance;
+        if (parameterType.element == typeProvider.futureOrElement) {
+          var typeArgument = parameterType.typeArguments[0];
+          distance = featureComputer.inheritanceDistance(
+              argumentType.element, typeProvider.futureElement);
+          if (typeArgument is InterfaceType) {
+            var argDistance = featureComputer.inheritanceDistance(
+                argumentType.element, typeArgument.element);
+            if (distance < 0 || (argDistance >= 0 && argDistance < distance)) {
+              distance = argDistance;
+            }
+          }
+        } else {
+          distance = featureComputer.inheritanceDistance(
+              argumentType.element, parameterType.element);
+        }
+        if (distance < 0) {
+          DateTime.now();
+        }
+        data.recordDistance('Subtype of context type ($descriptor)', distance);
+        data.recordDistance('Subtype of context type (all)', distance);
+      }
     } else if (typeSystem.isSubtypeOf(parameterType, argumentType)) {
       data.recordTypeMatch('$descriptor', 'supertype');
+      data.recordTypeMatch('all', 'supertype');
     } else {
       data.recordTypeMatch('$descriptor', 'unrelated');
+      data.recordTypeMatch('all', 'unrelated');
     }
   }
+
+  /// Return the return type of the [element], or `null` if the element doesn't
+  /// have a return type.
+  DartType _returnType(Element element) {
+    if (element is ExecutableElement) {
+      return element.returnType;
+    }
+    return null;
+  }
 }
 
 /// An object used to compute metrics for a single file or directory.
@@ -1816,7 +1954,8 @@
   /// Compute the metrics for the file(s) in the [rootPath].
   /// If [corpus] is true, treat rootPath as a container of packages, creating
   /// a new context collection for each subdirectory.
-  void compute(String rootPath, {bool corpus}) async {
+  void compute(String rootPath,
+      {@required bool corpus, @required bool verbose}) async {
     final collector = RelevanceDataCollector(data);
     var roots = _computeRootPaths(rootPath, corpus);
     for (var root in roots) {
@@ -1835,20 +1974,28 @@
               //
               if (resolvedUnitResult == null) {
                 print('File $filePath skipped because resolved unit was null.');
-                print('');
+                if (verbose) {
+                  print('');
+                }
                 continue;
               } else if (resolvedUnitResult.state != ResultState.VALID) {
                 print(
                     'File $filePath skipped because it could not be analyzed.');
-                print('');
+                if (verbose) {
+                  print('');
+                }
                 continue;
               } else if (hasError(resolvedUnitResult)) {
-                print('File $filePath skipped due to errors:');
-                for (var error in resolvedUnitResult.errors
-                    .where((e) => e.severity == Severity.error)) {
-                  print('  ${error.toString()}');
+                if (verbose) {
+                  print('File $filePath skipped due to errors:');
+                  for (var error in resolvedUnitResult.errors
+                      .where((e) => e.severity == Severity.error)) {
+                    print('  ${error.toString()}');
+                  }
+                  print('');
+                } else {
+                  print('File $filePath skipped due to analysis errors.');
                 }
-                print('');
                 continue;
               }
 
@@ -1856,6 +2003,7 @@
               resolvedUnitResult.unit.accept(collector);
             } catch (exception, stacktrace) {
               print('Exception caught analyzing: "$filePath"');
+              print(exception);
               print(stacktrace);
             }
           }
@@ -1874,12 +2022,14 @@
       var firstLabel = ', first token';
       var firstIndex = key.indexOf(firstLabel);
       if (firstIndex > 0) {
-        first[key.replaceFirst(firstLabel, '')] = entry.value;
+        first['  ${key.replaceFirst(firstLabel, '')}'] =
+            entry.value.map((key, value) => MapEntry('  $key', value));
       } else {
         var wholeLabel = ', whole';
         var wholeIndex = key.indexOf(wholeLabel);
         if (wholeIndex > 0) {
-          whole[key.replaceFirst(wholeLabel, '')] = entry.value;
+          whole['  ${key.replaceFirst(wholeLabel, '')}'] =
+              entry.value.map((key, value) => MapEntry('  $key', value));
         } else {
           rest[key] = entry.value;
         }
@@ -2025,7 +2175,11 @@
   void _writeContextMap(
       StringSink sink, Map<String, Map<String, int>> contextMap) {
     var contexts = contextMap.keys.toList()..sort();
-    for (var context in contexts) {
+    for (var i = 0; i < contexts.length; i++) {
+      if (i > 0) {
+        sink.writeln();
+      }
+      var context = contexts[i];
       var lines = _convertMap(context, contextMap[context]);
       for (var line in lines) {
         sink.writeln('  $line');
@@ -2141,3 +2295,24 @@
     return false;
   }
 }
+
+class Timer {
+  Stopwatch stopwatch = Stopwatch();
+
+  int count = 0;
+
+  Timer();
+
+  double get averageTime => count == 0 ? 0 : totalTime / count;
+
+  int get totalTime => stopwatch.elapsedMilliseconds;
+
+  void start() {
+    stopwatch.start();
+  }
+
+  void stop() {
+    stopwatch.stop();
+    count++;
+  }
+}
diff --git a/pkg/analysis_server/tool/migration_runner.dart b/pkg/analysis_server/tool/migration_runner.dart
index ce974de..4a1e7e3 100644
--- a/pkg/analysis_server/tool/migration_runner.dart
+++ b/pkg/analysis_server/tool/migration_runner.dart
@@ -25,6 +25,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
@@ -72,8 +73,13 @@
     String sdkPath = FolderBasedDartSdk.defaultSdkDirectory(
       PhysicalResourceProvider.INSTANCE,
     ).path;
-    return AnalysisServer(serverChannel, resourceProvider, options,
-        DartSdkManager(sdkPath, true), InstrumentationService.NULL_SERVICE);
+    return AnalysisServer(
+        serverChannel,
+        resourceProvider,
+        options,
+        DartSdkManager(sdkPath, true),
+        CrashReportingAttachmentsBuilder.empty,
+        InstrumentationService.NULL_SERVICE);
   }
 
   void processNotification(Notification notification) {
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
index 17d93c6..d8024dd 100644
--- a/pkg/analysis_server_client/lib/server.dart
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -26,6 +26,10 @@
   /// or if the server has already been stopped.
   Process _process;
 
+  /// Replicate all stdout/stderr data from the server process to stdout/stderr,
+  /// when true.
+  bool _stdioPassthrough;
+
   /// Commands that have been sent to the server but not yet acknowledged,
   /// and the [Completer] objects which should be completed
   /// when acknowledgement is received.
@@ -43,9 +47,11 @@
   /// [listenToOutput] has not been called or [stop] has been called.
   StreamSubscription<String> _stdoutSubscription;
 
-  Server({ServerListener listener, Process process})
+  Server(
+      {ServerListener listener, Process process, bool stdioPassthrough = false})
       : _listener = listener,
-        _process = process;
+        _process = process,
+        _stdioPassthrough = stdioPassthrough;
 
   /// Force kill the server. Returns exit code future.
   Future<int> kill({String reason = 'none'}) {
@@ -63,6 +69,7 @@
         .transform(utf8.decoder)
         .transform(LineSplitter())
         .listen((String line) {
+      if (_stdioPassthrough) stdout.writeln(line);
       String trimmedLine = line.trim();
 
       // Guard against lines like:
@@ -116,6 +123,7 @@
         .transform(utf8.decoder)
         .transform(LineSplitter())
         .listen((String line) {
+      if (_stdioPassthrough) stderr.writeln(line);
       String trimmedLine = line.trim();
       _listener?.errorMessage(trimmedLine);
     });
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index f6e77f1..c85edce 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -367,6 +367,8 @@
   HintCode.DUPLICATE_IMPORT,
   HintCode.DUPLICATE_HIDDEN_NAME,
   HintCode.DUPLICATE_SHOWN_NAME,
+  HintCode.EQUAL_ELEMENTS_IN_SET,
+  HintCode.EQUAL_KEYS_IN_MAP,
   HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
   HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
   HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
@@ -381,6 +383,7 @@
   HintCode.INVALID_IMMUTABLE_ANNOTATION,
   HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_AT_SIGN,
   HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_EQUALS,
+  HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION,
   HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOWER_CASE,
   HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_NUMBER,
   HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_PREFIX,
@@ -656,6 +659,7 @@
   ParserErrorCode.VAR_ENUM,
   ParserErrorCode.VAR_RETURN_TYPE,
   ParserErrorCode.VAR_TYPEDEF,
+  ParserErrorCode.VOID_WITH_TYPE_ARGUMENTS,
   ParserErrorCode.WITH_BEFORE_EXTENDS,
   ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
   ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
diff --git a/pkg/analyzer/lib/instrumentation/log_adapter.dart b/pkg/analyzer/lib/instrumentation/log_adapter.dart
index d1b54f5..48dea7d 100644
--- a/pkg/analyzer/lib/instrumentation/log_adapter.dart
+++ b/pkg/analyzer/lib/instrumentation/log_adapter.dart
@@ -38,7 +38,9 @@
   void logError(String message) => _log(TAG_ERROR, message);
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
     if (_instrumentationLogger != null) {
       String message = _toString(exception);
       String trace = _toString(stackTrace);
diff --git a/pkg/analyzer/lib/instrumentation/multicast_service.dart b/pkg/analyzer/lib/instrumentation/multicast_service.dart
index 0d4fa40..d0e288d 100644
--- a/pkg/analyzer/lib/instrumentation/multicast_service.dart
+++ b/pkg/analyzer/lib/instrumentation/multicast_service.dart
@@ -17,8 +17,11 @@
   }
 
   @override
-  void logException(exception, [StackTrace stackTrace]) {
-    _services.forEach((s) => s.logException(exception, stackTrace));
+  void logException(exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
+    _services
+        .forEach((s) => s.logException(exception, stackTrace, attachments));
   }
 
   @override
diff --git a/pkg/analyzer/lib/instrumentation/noop_service.dart b/pkg/analyzer/lib/instrumentation/noop_service.dart
index c550863..47ca4ac 100644
--- a/pkg/analyzer/lib/instrumentation/noop_service.dart
+++ b/pkg/analyzer/lib/instrumentation/noop_service.dart
@@ -12,7 +12,9 @@
   void logError(String message) {}
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {}
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {}
 
   @override
   void logInfo(String message, [dynamic exception]) {}
diff --git a/pkg/analyzer/lib/instrumentation/service.dart b/pkg/analyzer/lib/instrumentation/service.dart
index 59d9a2a..1fda166 100644
--- a/pkg/analyzer/lib/instrumentation/service.dart
+++ b/pkg/analyzer/lib/instrumentation/service.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/instrumentation/noop_service.dart';
 import 'package:analyzer/instrumentation/plugin_data.dart';
+import 'package:meta/meta.dart';
 
 /// The interface used by client code to communicate with an instrumentation
 /// service of some kind.
@@ -16,7 +17,9 @@
 
   /// Log that the given non-priority [exception] was thrown, with the given
   /// [stackTrace].
-  void logException(dynamic exception, [StackTrace stackTrace]);
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]);
 
   /// Log unstructured text information for debugging purposes.
   void logInfo(String message, [dynamic exception]);
@@ -75,3 +78,16 @@
   /// Shut down this service.
   Future<void> shutdown();
 }
+
+/// The additional attachment to be logged.
+class InstrumentationServiceAttachment {
+  final String id;
+  final String stringValue;
+
+  /// Create a new attachment with the unique [id] and string [value].
+  InstrumentationServiceAttachment.string({
+    @required String id,
+    @required String value,
+  })  : id = id,
+        stringValue = value;
+}
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 41ffce6..1a8488c 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -21,8 +21,7 @@
 
   AnalysisOptionsProvider([this.sourceFactory]);
 
-  /// Provide the options found in either
-  /// [root]/[AnalysisEngine.ANALYSIS_OPTIONS_FILE] or
+  /// Provide the options found in
   /// [root]/[AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE].
   /// Recursively merge options referenced by an include directive
   /// and remove the include directive from the resulting options map.
@@ -43,10 +42,6 @@
   File getOptionsFile(Folder root, {bool crawlUp = false}) {
     Resource resource;
     for (Folder folder = root; folder != null; folder = folder.parent) {
-      resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-      if (resource.exists) {
-        break;
-      }
       resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       if (resource.exists || !crawlUp) {
         break;
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index ab6528f..56a0059 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -378,12 +378,7 @@
     }
     Folder root = resourceProvider.getFolder(path);
     for (Folder folder = root; folder != null; folder = folder.parent) {
-      File file =
-          folder.getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-      if (file.exists) {
-        return file;
-      }
-      file = folder
+      File file = folder
           .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       if (file.exists) {
         return file;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index e70caa1..6376a63 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1473,7 +1473,6 @@
     var featureSetProvider = FeatureSetProvider.build(
       resourceProvider: resourceProvider,
       packages: _packages,
-      sourceFactory: _sourceFactory,
       packageDefaultFeatureSet: _analysisOptions.contextFeatures,
       nonPackageDefaultFeatureSet: _analysisOptions.nonPackageFeatureSet,
     );
@@ -1688,7 +1687,15 @@
       contextKey = state.contextKey;
     }
     CaughtException caught = CaughtException(exception, stackTrace);
-    _exceptionController.add(ExceptionResult(path, caught, contextKey));
+    String fileContent = _fsState.getFileForPath(path).content;
+    _exceptionController.add(
+      ExceptionResult(
+        filePath: path,
+        fileContent: fileContent,
+        exception: caught,
+        contextKey: contextKey,
+      ),
+    );
   }
 
   /// Serialize the given [resolvedUnit] errors and index into bytes.
@@ -2116,7 +2123,10 @@
   /// The path of the file being analyzed when the [exception] happened.
   ///
   /// Absolute and normalized.
-  final String path;
+  final String filePath;
+
+  /// The path of the file being analyzed when the [exception] happened.
+  final String fileContent;
 
   /// The exception during analysis of the file with the [path].
   final CaughtException exception;
@@ -2127,7 +2137,12 @@
   /// number of context to store was reached, etc.
   final String contextKey;
 
-  ExceptionResult(this.path, this.exception, this.contextKey);
+  ExceptionResult({
+    @required this.filePath,
+    @required this.fileContent,
+    @required this.exception,
+    @required this.contextKey,
+  });
 }
 
 /// Worker in [AnalysisDriverScheduler].
diff --git a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
index 40511f1..eb9896b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/packages.dart';
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:meta/meta.dart';
 
 class FeatureSetProvider {
@@ -37,7 +37,8 @@
     for (var package in _packages.packages) {
       if (package.rootFolder.contains(path)) {
         var languageVersion = package.languageVersion;
-        if (languageVersion == null) {
+        if (languageVersion == null ||
+            languageVersion == ExperimentStatus.currentVersion) {
           return _packageDefaultFeatureSet;
         } else {
           return _packageDefaultFeatureSet.restrictToVersion(languageVersion);
@@ -51,7 +52,6 @@
   static FeatureSetProvider build({
     @required ResourceProvider resourceProvider,
     @required Packages packages,
-    @required SourceFactory sourceFactory,
     @required FeatureSet packageDefaultFeatureSet,
     @required FeatureSet nonPackageDefaultFeatureSet,
   }) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index a53d2a1..27aaef9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -23,6 +23,10 @@
   /// element model. But we want to index these parameter references
   /// as references to declared parameters.
   ParameterElement namedParameterElement(ExecutableElement executable) {
+    if (executable == null) {
+      return null;
+    }
+
     var parameterName = node.name;
     return executable.declaration.parameters.where((parameter) {
       return parameter.isNamed && parameter.name == parameterName;
@@ -39,7 +43,8 @@
         if (invocation is InstanceCreationExpression) {
           return namedParameterElement(invocation.staticElement);
         } else if (invocation is MethodInvocation) {
-          return namedParameterElement(invocation.methodName.staticElement);
+          var executable = invocation.methodName.staticElement;
+          return namedParameterElement(executable);
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index a41e3dc..7c6cc1c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -14,7 +14,7 @@
 import 'package:analyzer/src/error/best_practices_verifier.dart';
 import 'package:analyzer/src/error/dart2js_verifier.dart';
 import 'package:analyzer/src/error/dead_code_verifier.dart';
-import 'package:analyzer/src/error/invalid_language_version_override_finder.dart';
+import 'package:analyzer/src/error/language_version_override_verifier.dart';
 import 'package:analyzer/src/error/override_verifier.dart';
 import 'package:analyzer/src/error/todo_finder.dart';
 import 'package:analyzer/src/error/unused_local_elements_verifier.dart';
@@ -279,7 +279,7 @@
     ));
 
     TodoFinder(errorReporter).findIn(unit);
-    InvalidLanguageVersionOverrideFinder(errorReporter).findIn(unit);
+    LanguageVersionOverrideVerifier(errorReporter).verify(unit);
 
     // Verify imports.
     {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 5373504..a5a7761 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -1393,14 +1393,14 @@
   @override
   Iterator<SyntacticEntity> get iterator => _entities.iterator;
 
-  /// Add an AST node or token as the next child entity, if it is not null.
+  /// Add an AST node or token as the next child entity, if it is not `null`.
   void add(SyntacticEntity entity) {
     if (entity != null) {
       _entities.add(entity);
     }
   }
 
-  /// Add the given items as the next child entities, if [items] is not null.
+  /// Add the given items as the next child entities, if [items] is not `null`.
   void addAll(Iterable<SyntacticEntity> items) {
     if (items != null) {
       _entities.addAll(items);
@@ -4067,6 +4067,8 @@
     NodeList<Annotation> metadata = this.metadata;
     if (metadata.isNotEmpty) {
       return metadata.beginToken;
+    } else if (requiredKeyword != null) {
+      return requiredKeyword;
     } else if (covariantKeyword != null) {
       return covariantKeyword;
     } else if (keyword != null) {
@@ -5166,11 +5168,19 @@
   }
 
   @override
-  Token get beginToken =>
-      this.metadata.beginToken ??
-      covariantKeyword ??
-      _returnType?.beginToken ??
-      identifier?.beginToken;
+  Token get beginToken {
+    NodeList<Annotation> metadata = this.metadata;
+    if (metadata.isNotEmpty) {
+      return metadata.beginToken;
+    } else if (requiredKeyword != null) {
+      return requiredKeyword;
+    } else if (covariantKeyword != null) {
+      return covariantKeyword;
+    } else if (_returnType != null) {
+      return _returnType.beginToken;
+    }
+    return identifier?.beginToken;
+  }
 
   @override
   Iterable<SyntacticEntity> get childEntities =>
@@ -5853,6 +5863,7 @@
 
   @override
   bool get isNullAware =>
+      question != null ||
       leftBracket.type == TokenType.QUESTION_PERIOD_OPEN_SQUARE_BRACKET ||
       (leftBracket.type == TokenType.OPEN_SQUARE_BRACKET &&
           period != null &&
@@ -7690,9 +7701,7 @@
     } else {
       result.addAll(sortedCommentAndAnnotations);
     }
-    if (covariantKeyword != null) {
-      result.add(covariantKeyword);
-    }
+    result..add(requiredKeyword)..add(covariantKeyword);
     return result;
   }
 
@@ -8724,6 +8733,8 @@
     NodeList<Annotation> metadata = this.metadata;
     if (metadata.isNotEmpty) {
       return metadata.beginToken;
+    } else if (requiredKeyword != null) {
+      return requiredKeyword;
     } else if (covariantKeyword != null) {
       return covariantKeyword;
     } else if (keyword != null) {
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index 1f5145f..81188ae 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -741,13 +741,14 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
-      sink.write(node.period.lexeme);
+      safelyVisitToken(node.period);
     } else {
       safelyVisitNode(node.target);
     }
-    sink.write('[');
+    safelyVisitToken(node.question);
+    safelyVisitToken(node.leftBracket);
     safelyVisitNode(node.index);
-    sink.write(']');
+    safelyVisitToken(node.rightBracket);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 6d5e688..84df830 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -371,6 +371,21 @@
               "members.");
 
   /**
+   * No parameters.
+   */
+  static const HintCode EQUAL_ELEMENTS_IN_SET = HintCode(
+      'EQUAL_ELEMENTS_IN_SET',
+      "Two elements in a set literal shouldn't be equal.",
+      correction: "Change or remove the duplicate element.");
+
+  /**
+   * No parameters.
+   */
+  static const HintCode EQUAL_KEYS_IN_MAP = HintCode(
+      'EQUAL_KEYS_IN_MAP', "Two keys in a map literal shouldn't be equal.",
+      correction: "Change or remove the duplicate key.");
+
+  /**
    * It is a bad practice for a source file in a package "lib" directory
    * hierarchy to traverse outside that directory hierarchy. For example, a
    * source file in the "lib" directory should not contain a directive such as
@@ -727,6 +742,16 @@
           correction: "Specify a Dart language version override with a comment "
               "like '// @dart = 2.0'.");
 
+  static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION =
+      HintCodeWithUniqueName(
+    'INVALID_LANGUAGE_VERSION_OVERRIDE',
+    'INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION',
+    "The language version override must be before any declaration or "
+        "directive.",
+    correction:
+        "Try moving the language version override to the top of the file.",
+  );
+
   /// Invalid Dart language version comments don't follow the specification [1].
   /// If a comment begins with "@dart" or "dart" (letters in any case),
   /// followed by optional whitespace, followed by optional non-alphanumeric,
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 3d72df4..56aa287 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -881,6 +881,9 @@
           correction: "Try removing the keyword 'var', or "
               "replacing it with the name of the return type.");
 
+  static const ParserErrorCode VOID_WITH_TYPE_ARGUMENTS =
+      _VOID_WITH_TYPE_ARGUMENTS;
+
   /**
    * Initialize a newly created error code to have the given [name]. The message
    * associated with the error will be created from the given [message]
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 44e6243..a07b175 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -107,6 +107,7 @@
   _MULTIPLE_VARIANCE_MODIFIERS,
   _INVALID_USE_OF_COVARIANT_IN_EXTENSION,
   _TYPE_PARAMETER_ON_CONSTRUCTOR,
+  _VOID_WITH_TYPE_ARGUMENTS,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = ParserErrorCode(
@@ -574,6 +575,10 @@
     correction:
         "Try removing the keyword 'var', or replacing it with the name of the return type.");
 
+const ParserErrorCode _VOID_WITH_TYPE_ARGUMENTS = ParserErrorCode(
+    'VOID_WITH_TYPE_ARGUMENTS', r"Type 'void' can't have type arguments.",
+    correction: "Try removing the type arguments.");
+
 const ParserErrorCode _WITH_BEFORE_EXTENDS = ParserErrorCode(
     'WITH_BEFORE_EXTENDS',
     r"The extends clause must be before the with clause.",
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 86cf045..4930380 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -101,7 +101,6 @@
     var featureSetProvider = FeatureSetProvider.build(
       resourceProvider: resourceProvider,
       packages: Packages.empty,
-      sourceFactory: analysisContext.sourceFactory,
       packageDefaultFeatureSet: analysisContext.analysisOptions.contextFeatures,
       nonPackageDefaultFeatureSet:
           (options as AnalysisOptionsImpl).nonPackageFeatureSet,
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 7ceee5d..353a746 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -125,14 +125,14 @@
   }
 
   void executableDeclaration_enter(
-      Declaration node, FormalParameterList parameters, bool isClosure) {
+      AstNode node, FormalParameterList parameters, bool isClosure) {
     if (isClosure) {
       flow.functionExpression_begin(node);
     }
 
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
-        flow.initialize(parameter.declaredElement);
+        flow.declare(parameter.declaredElement, true);
       }
     }
   }
@@ -224,9 +224,7 @@
       var variables = node.variables;
       for (var i = 0; i < variables.length; ++i) {
         var variable = variables[i];
-        if (variable.initializer != null) {
-          flow.initialize(variable.declaredElement);
-        }
+        flow.declare(variable.declaredElement, variable.initializer != null);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index d7a6426..efb83e0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -124,6 +124,10 @@
       loopVariableElement.type = elementType;
     }
 
+    if (loopVariable != null) {
+      _flowAnalysis?.flow?.declare(loopVariable.declaredElement, true);
+    }
+
     _flowAnalysis?.flow?.forEach_bodyBegin(
       node,
       identifierElement is VariableElement
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 31d7255..6c5f405 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -566,6 +566,12 @@
   }
 
   @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    _checkForDuplications(node);
+    super.visitSetOrMapLiteral(node);
+  }
+
+  @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForDeprecatedMemberUseAtIdentifier(node);
     _invalidAccessVerifier.verify(node);
@@ -824,6 +830,31 @@
     return false;
   }
 
+  /// Generate hints related to duplicate elements (keys) in sets (maps).
+  void _checkForDuplications(SetOrMapLiteral node) {
+    // This only checks for top-level elements. If, for, and spread elements
+    // that contribute duplicate values are not detected.
+    if (node.isConst) {
+      // This case is covered by the ErrorVerifier.
+      return;
+    }
+    final expressions = node.isSet
+        ? node.elements.whereType<Expression>()
+        : node.elements.whereType<MapLiteralEntry>().map((entry) => entry.key);
+    final alreadySeen = <DartObject>{};
+    for (final expression in expressions) {
+      final constEvaluation = _linterContext.evaluateConstant(expression);
+      if (constEvaluation.errors.isEmpty) {
+        if (!alreadySeen.add(constEvaluation.value)) {
+          var errorCode = node.isSet
+              ? HintCode.EQUAL_ELEMENTS_IN_SET
+              : HintCode.EQUAL_KEYS_IN_MAP;
+          _errorReporter.reportErrorForNode(errorCode, expression);
+        }
+      }
+    }
+  }
+
   /// Checks whether [node] violates the rules of [immutable].
   ///
   /// If [node] is marked with [immutable] or inherits from a class or mixin
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 9352b05..4b9438d 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1654,7 +1654,8 @@
   // returned by an iterator.
   static const CompileTimeErrorCode EQUAL_ELEMENTS_IN_CONST_SET =
       CompileTimeErrorCode('EQUAL_ELEMENTS_IN_CONST_SET',
-          "Two values in a constant set can't be equal.",
+          "Two elements in a constant set literal can't be equal.",
+          correction: "Change or remove the duplicate element.",
           hasPublishedDocs: true);
 
   /**
@@ -8162,14 +8163,16 @@
    * it indicates a different type of programmer error and has different
    * corrections.
    *
-   * Parameters: none
+   * No parameters.
    */
-  static const StaticWarningCode INVALID_USE_OF_NULL_VALUE = StaticWarningCode(
-      'INVALID_USE_OF_NULL_VALUE',
-      "This expression is invalid as it will always be null.",
-      correction:
-          "Try changing the type, or casting, to a more useful type like "
-          "dynamic.");
+  static const StaticWarningCode INVALID_USE_OF_NULL_VALUE =
+      StaticWarningCodeWithUniqueName(
+          'USE_OF_NULLABLE_VALUE',
+          'INVALID_USE_OF_NULL_VALUE',
+          "This expression is invalid as it will always be null.",
+          correction:
+              "Try changing the type, or casting, to a more useful type like "
+              "dynamic.");
 
   /**
    * Parameters:
@@ -9117,10 +9120,11 @@
   /**
    * For the purposes of experimenting with potential non-null type semantics.
    *
-   * Parameters: none
+   * No parameters.
    */
   static const StaticWarningCode UNCHECKED_USE_OF_NULLABLE_VALUE =
-      StaticWarningCode(
+      StaticWarningCodeWithUniqueName(
+          'USE_OF_NULLABLE_VALUE',
           'UNCHECKED_USE_OF_NULLABLE_VALUE',
           "The expression is nullable and must be null-checked before it can "
               "be used.",
diff --git a/pkg/analyzer/lib/src/error/invalid_language_version_override_finder.dart b/pkg/analyzer/lib/src/error/language_version_override_verifier.dart
similarity index 86%
rename from pkg/analyzer/lib/src/error/invalid_language_version_override_finder.dart
rename to pkg/analyzer/lib/src/error/language_version_override_verifier.dart
index 23d397f..d5732f9 100644
--- a/pkg/analyzer/lib/src/error/invalid_language_version_override_finder.dart
+++ b/pkg/analyzer/lib/src/error/language_version_override_verifier.dart
@@ -7,20 +7,17 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/error/codes.dart';
 
-/// Instances of the class `InvalidLanguageVersionOverrideFinder` find invalid
-/// Dart language version override comments in Dart code.
-class InvalidLanguageVersionOverrideFinder {
-  /// The error reporter by which invalid Dart language version override
-  /// comments will be reported.
+/// Finds invalid, or misplaced language override comments.
+class LanguageVersionOverrideVerifier {
+  static final _overrideCommentLine = RegExp(r'^\s*//\s*@dart\s*=\s*\d+\.\d+');
+
   final ErrorReporter _errorReporter;
 
-  /// Initialize a finder to report invalid Dart language version override
-  /// comments to the given reporter.
-  InvalidLanguageVersionOverrideFinder(this._errorReporter);
+  LanguageVersionOverrideVerifier(this._errorReporter);
 
-  /// Search the comments at the top of the given compilation unit for language
-  /// version override comments and report an error for each.
-  void findIn(CompilationUnit unit) {
+  void verify(CompilationUnit unit) {
+    _verifyMisplaced(unit);
+
     Token beginToken = unit.beginToken;
     if (beginToken.type == TokenType.SCRIPT_TAG) {
       beginToken = beginToken.next;
@@ -266,4 +263,42 @@
         length);
     return false;
   }
+
+  /// Verify that all language version overrides are before declarations.
+  void _verifyMisplaced(CompilationUnit unit) {
+    Token firstMeaningfulToken;
+    if (unit.directives.isNotEmpty) {
+      firstMeaningfulToken = unit.directives.first.beginToken;
+    } else if (unit.declarations.isNotEmpty) {
+      firstMeaningfulToken = unit.declarations.first.beginToken;
+    } else {
+      return;
+    }
+
+    var token = firstMeaningfulToken.next;
+    while (token != null) {
+      if (token.offset > firstMeaningfulToken.offset) {
+        var commentToken = token.precedingComments;
+        for (; commentToken != null; commentToken = commentToken.next) {
+          var lexeme = commentToken.lexeme;
+
+          var match = _overrideCommentLine.firstMatch(lexeme);
+          if (match != null) {
+            var atDartStart = lexeme.indexOf('@dart');
+            _errorReporter.reportErrorForOffset(
+              HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION,
+              commentToken.offset + atDartStart,
+              match.end - atDartStart,
+            );
+          }
+        }
+      }
+
+      if (token.next == token) {
+        break;
+      } else {
+        token = token.next;
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index d6090cc..fcf6977 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -142,6 +142,8 @@
       return;
     }
 
+    expressionType = typeSystem.resolveToBound(expressionType);
+
     InterfaceType iterableType;
     if (expressionType is InterfaceTypeImpl) {
       iterableType = expressionType.asInstanceOf(typeProvider.iterableElement);
@@ -183,6 +185,8 @@
       return;
     }
 
+    expressionType = typeSystem.resolveToBound(expressionType);
+
     InterfaceType mapType;
     if (expressionType is InterfaceTypeImpl) {
       mapType = expressionType.asInstanceOf(typeProvider.mapElement);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index c43623c..41ff1ec 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2688,7 +2688,7 @@
       }
     } else if (context == IdentifierContext.enumValueDeclaration) {
       List<Annotation> metadata = pop();
-      Comment comment = _findComment(null, token);
+      Comment comment = _findComment(metadata, token);
       push(ast.enumConstantDeclaration(comment, metadata, identifier));
     } else {
       push(identifier);
@@ -3444,6 +3444,19 @@
   }
 
   @override
+  void handleVoidKeywordWithTypeArguments(Token voidKeyword) {
+    assert(optional('void', voidKeyword));
+    debugEvent("VoidKeywordWithTypeArguments");
+    TypeArgumentList arguments = pop();
+
+    // TODO(paulberry): is this sufficient, or do we need to hook the "void"
+    // keyword up to an element?
+    handleIdentifier(voidKeyword, IdentifierContext.typeReference);
+    push(arguments);
+    handleType(voidKeyword, null);
+  }
+
+  @override
   dynamic internalProblem(Message message, int charOffset, Uri uri) {
     throw UnsupportedError(message.message);
   }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c5bee2a..9b8c2980 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -111,9 +111,6 @@
   /// The long suffix used for HTML files.
   static const String SUFFIX_HTML = "html";
 
-  /// The deprecated file name used for analysis options files.
-  static const String ANALYSIS_OPTIONS_FILE = '.analysis_options';
-
   /// The file name used for analysis options files.
   static const String ANALYSIS_OPTIONS_YAML_FILE = 'analysis_options.yaml';
 
@@ -166,8 +163,7 @@
       return false;
     }
     String basename = (context ?? pathos.posix).basename(fileName);
-    return basename == ANALYSIS_OPTIONS_FILE ||
-        basename == ANALYSIS_OPTIONS_YAML_FILE;
+    return basename == ANALYSIS_OPTIONS_YAML_FILE;
   }
 
   /// Return `true` if the given [fileName] is assumed to contain Dart source
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9297721..82d2949 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2399,9 +2399,6 @@
     }
 
     DartType iterableType = getStaticType(node.iterable);
-    if (iterableType.isDynamic) {
-      return false;
-    }
 
     // TODO(scheglov) use NullableDereferenceVerifier
     if (_isNonNullableByDefault) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ab1a3b7..25334ed 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1106,7 +1106,7 @@
 
     if (_flowAnalysis != null) {
       if (!isFunctionDeclaration) {
-        _flowAnalysis.flow.functionExpression_begin(node);
+        _flowAnalysis.executableDeclaration_enter(node, node.parameters, true);
       }
     } else {
       _promoteManager.enterFunctionBody(body);
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 3f12d2d..60443f8 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -649,6 +649,9 @@
       var constraints = this.constraints[t2.element];
       if (constraints != null) {
         if (!identical(t1, UnknownInferredType.instance)) {
+          if (t2.nullabilitySuffix == NullabilitySuffix.question) {
+            t1 = _typeSystem.promoteToNonNull(t1);
+          }
           var constraint = _TypeConstraint(origin, t2.element, lower: t1);
           constraints.add(constraint);
           _undoBuffer.add(constraint);
@@ -1799,6 +1802,57 @@
     }
   }
 
+  /// Defines the "remainder" of `T` when `S` has been removed from
+  /// consideration by an instance check.  This operation is used for type
+  /// promotion during flow analysis.
+  DartType factor(DartType T, DartType S) {
+    // * If T <: S then Never
+    if (isSubtypeOf2(T, S)) {
+      return NeverTypeImpl.instance;
+    }
+
+    var T_nullability = T.nullabilitySuffix;
+
+    // * Else if T is R? and Null <: S then factor(R, S)
+    // * Else if T is R? then factor(R, S)?
+    if (T_nullability == NullabilitySuffix.question) {
+      var R = (T as TypeImpl).withNullability(NullabilitySuffix.none);
+      var factor_RS = factor(R, S) as TypeImpl;
+      if (isSubtypeOf2(nullNone, S)) {
+        return factor_RS;
+      } else {
+        return factor_RS.withNullability(NullabilitySuffix.question);
+      }
+    }
+
+    // * Else if T is R* and Null <: S then factor(R, S)
+    // * Else if T is R* then factor(R, S)*
+    if (T_nullability == NullabilitySuffix.star) {
+      var R = (T as TypeImpl).withNullability(NullabilitySuffix.none);
+      var factor_RS = factor(R, S) as TypeImpl;
+      if (isSubtypeOf2(nullNone, S)) {
+        return factor_RS;
+      } else {
+        return factor_RS.withNullability(NullabilitySuffix.star);
+      }
+    }
+
+    // * Else if T is FutureOr<R> and Future<R> <: S then factor(R, S)
+    // * Else if T is FutureOr<R> and R <: S then factor(Future<R>, S)
+    if (T is InterfaceType && T.isDartAsyncFutureOr) {
+      var R = T.typeArguments[0];
+      var future_R = typeProvider.futureType2(R);
+      if (isSubtypeOf2(future_R, S)) {
+        return factor(R, S);
+      }
+      if (isSubtypeOf2(R, S)) {
+        return factor(future_R, S);
+      }
+    }
+
+    return T;
+  }
+
   /// Given a type t, if t is an interface type with a call method
   /// defined, return the function type for the call method, otherwise
   /// return null.
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 49536c7..b0e1884 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -272,7 +272,9 @@
   }
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 4d38811..8d3f33e 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -431,14 +431,6 @@
       source,
       isNonNullableByDefault: false,
     );
-    if (AnalysisEngine.ANALYSIS_OPTIONS_FILE == source.shortName) {
-      reporter.reportError(AnalysisError(
-          source,
-          0, // offset
-          1, // length
-          AnalysisOptionsHintCode.DEPRECATED_ANALYSIS_OPTIONS_FILE_NAME,
-          [source.shortName]));
-    }
     _validators.forEach((OptionsValidator v) => v.validate(reporter, options));
     return recorder.errors;
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index a2efa50..46e0226 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -17267,6 +17267,20 @@
     expectCommentText(value.documentationComment, '/// Doc');
   }
 
+  void test_parseEnumDeclaration_withDocComment_onValue_annotated() {
+    createParser('''
+enum E {
+  /// Doc
+  @annotation
+  ONE
+}
+''');
+    var declaration = parseFullCompilationUnitMember() as EnumDeclaration;
+    var value = declaration.constants[0];
+    expectCommentText(value.documentationComment, '/// Doc');
+    expect(value.metadata, hasLength(1));
+  }
+
   void test_parseExportDirective_configuration_multiple() {
     createParser("export 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
     ExportDirective directive = parseFullDirective();
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index c73ec4b..028096c 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -394,7 +394,9 @@
   }
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
     log.add("error: $exception $stackTrace");
   }
 
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index e2e68d6..9e4eb9a 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -20,8 +20,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(AnalysisOptionsProviderOldTest);
-    defineReflectiveTests(AnalysisOptionsProviderNewTest);
+    defineReflectiveTests(AnalysisOptionsProviderTest);
   });
   group('AnalysisOptionsProvider', () {
     void expectMergesTo(String defaults, String overrides, String expected) {
@@ -101,24 +100,13 @@
 }
 
 @reflectiveTest
-class AnalysisOptionsProviderNewTest extends AnalysisOptionsProviderTest {
-  @override
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-}
-
-@reflectiveTest
-class AnalysisOptionsProviderOldTest extends AnalysisOptionsProviderTest {
-  @override
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_FILE;
-}
-
-abstract class AnalysisOptionsProviderTest {
+class AnalysisOptionsProviderTest {
   TestPathTranslator pathTranslator;
   ResourceProvider resourceProvider;
 
   AnalysisOptionsProvider provider;
 
-  String get optionsFileName;
+  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
   void setUp() {
     var rawProvider = MemoryResourceProvider();
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 7e58e58..28a121a 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -796,17 +796,6 @@
     expect(result.path, filePath);
   }
 
-  void test_getOptionsFile_inParentOfRoot_old() {
-    String parentPath = convertPath('/some/directory');
-    String path = join(parentPath, 'path');
-    String filePath = join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-    newFile(filePath);
-
-    File result = builder.getOptionsFile(path);
-    expect(result, isNotNull);
-    expect(result.path, filePath);
-  }
-
   void test_getOptionsFile_inRoot_new() {
     String path = convertPath('/some/directory/path');
     String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
@@ -817,16 +806,6 @@
     expect(result.path, filePath);
   }
 
-  void test_getOptionsFile_inRoot_old() {
-    String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-    newFile(filePath);
-
-    File result = builder.getOptionsFile(path);
-    expect(result, isNotNull);
-    expect(result.path, filePath);
-  }
-
   void _assertPackages(Packages packages, Map<String, String> nameToPath) {
     expect(packages, isNotNull);
     expect(packages.packages, hasLength(nameToPath.length));
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 1d99fe9..a4f0f10 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -3073,7 +3073,7 @@
     if (allExceptions.isNotEmpty) {
       var buffer = StringBuffer();
       for (var exception in allExceptions) {
-        buffer.writeln('Path: ${exception.path}');
+        buffer.writeln('Path: ${exception.filePath}');
         buffer.writeln('Exception: ${exception.exception}');
       }
       fail('Unexpected exceptions:\n$buffer');
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index 7fa6a02..901f3b1 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -35,124 +35,114 @@
     _createSourceFactory();
   }
 
-  test_jsonConfig_defaultNonNullable() {
-    var jsonConfigPath = '/test/.dart_tool/package_config.json';
-    var jsonConfigFile = newFile(jsonConfigPath, content: '''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/"
-    },
-    {
-      "name": "aaa",
-      "rootUri": "${toUriStr('/packages/aaa')}",
-      "packageUri": "lib/",
-      "languageVersion": "2.7"
-    },
-    {
-      "name": "bbb",
-      "rootUri": "${toUriStr('/packages/bbb')}",
-      "packageUri": "lib/"
-    }
-  ]
-}
-''');
-
-    var packages = parsePackageConfigJsonFile(
-      resourceProvider,
-      jsonConfigFile,
+  test_packages() {
+    var packages = Packages(
+      {
+        'aaa': Package(
+          name: 'aaa',
+          rootFolder: newFolder('/packages/aaa'),
+          libFolder: newFolder('/packages/aaa/lib'),
+          languageVersion: null,
+        ),
+        'bbb': Package(
+          name: 'bbb',
+          rootFolder: newFolder('/packages/bbb'),
+          libFolder: newFolder('/packages/bbb/lib'),
+          languageVersion: Version(2, 7, 0),
+        ),
+        'ccc': Package(
+          name: 'ccc',
+          rootFolder: newFolder('/packages/ccc'),
+          libFolder: newFolder('/packages/ccc/lib'),
+          languageVersion: Version(2, 8, 0),
+        ),
+      },
     );
+
     _createSourceFactory(
       packageUriResolver: _createPackageMapUriResolver(packages),
     );
 
-    _simulateNonNullableSdk();
-    _buildProvider(['non-nullable']);
-
-    _assertNonNullableForPath('/test/a.dart', true);
-    _assertNonNullableForPath('/test/lib/b.dart', true);
-    _assertNonNullableForPath('/test/test/c.dart', true);
+    provider = FeatureSetProvider.build(
+      resourceProvider: resourceProvider,
+      packages: packages,
+      packageDefaultFeatureSet: FeatureSet.fromEnableFlags([]),
+      nonPackageDefaultFeatureSet: FeatureSet.fromEnableFlags([]),
+    );
 
     _assertNonNullableForPath('/packages/aaa/a.dart', false);
     _assertNonNullableForPath('/packages/aaa/lib/b.dart', false);
     _assertNonNullableForPath('/packages/aaa/test/c.dart', false);
 
-    _assertNonNullableForPath('/packages/bbb/a.dart', true);
-    _assertNonNullableForPath('/packages/bbb/lib/b.dart', true);
-    _assertNonNullableForPath('/packages/bbb/test/c.dart', true);
+    _assertNonNullableForPath('/packages/bbb/a.dart', false);
+    _assertNonNullableForPath('/packages/bbb/lib/b.dart', false);
+    _assertNonNullableForPath('/packages/bbb/test/c.dart', false);
 
-    _assertNonNullableForPath('/other/file.dart', true);
+    _assertNonNullableForPath('/packages/ccc/a.dart', false);
+    _assertNonNullableForPath('/packages/ccc/lib/b.dart', false);
+    _assertNonNullableForPath('/packages/ccc/test/c.dart', false);
+
+    _assertNonNullableForPath('/other/file.dart', false);
   }
 
-  test_nonPackageDefaultFeatureSet() {
-    newFile('/test/.packages', content: '''
-test:lib/
-''');
-    _simulateNonNullableSdk();
-    _buildProvider(['non-nullable']);
+  test_packages_enabledExperiment_nonNullable() {
+    var packages = Packages(
+      {
+        'aaa': Package(
+          name: 'aaa',
+          rootFolder: newFolder('/packages/aaa'),
+          libFolder: newFolder('/packages/aaa/lib'),
+          languageVersion: null,
+        ),
+        'bbb': Package(
+          name: 'bbb',
+          rootFolder: newFolder('/packages/bbb'),
+          libFolder: newFolder('/packages/bbb/lib'),
+          languageVersion: Version(2, 7, 0),
+        ),
+        'ccc': Package(
+          name: 'ccc',
+          rootFolder: newFolder('/packages/ccc'),
+          libFolder: newFolder('/packages/ccc/lib'),
+          languageVersion: Version(2, 8, 0),
+        ),
+      },
+    );
+
+    _createSourceFactory(
+      packageUriResolver: _createPackageMapUriResolver(packages),
+    );
 
     provider = FeatureSetProvider.build(
       resourceProvider: resourceProvider,
-      packages: Packages(
-        {
-          'aaa': Package(
-            name: 'aaa',
-            rootFolder: newFolder('/packages/aaa'),
-            libFolder: newFolder('/packages/aaa/lib'),
-            languageVersion: null,
-          ),
-          'bbb': Package(
-            name: 'bbb',
-            rootFolder: newFolder('/packages/bbb'),
-            libFolder: newFolder('/packages/bbb/lib'),
-            languageVersion: Version(2, 7, 0),
-          ),
-        },
-      ),
-      sourceFactory: sourceFactory,
+      packages: packages,
       packageDefaultFeatureSet: FeatureSet.fromEnableFlags(['non-nullable']),
       nonPackageDefaultFeatureSet: FeatureSet.fromEnableFlags([]),
     );
 
-    _assertNonNullableForPath('/packages/aaa/lib/a.dart', true);
-    _assertNonNullableForPath('/packages/aaa/test/b.dart', true);
+    _assertNonNullableForPath('/packages/aaa/a.dart', true);
+    _assertNonNullableForPath('/packages/aaa/lib/b.dart', true);
+    _assertNonNullableForPath('/packages/aaa/test/c.dart', true);
 
-    _assertNonNullableForPath('/packages/bbb/lib/a.dart', false);
-    _assertNonNullableForPath('/packages/bbb/test/b.dart', false);
+    _assertNonNullableForPath('/packages/bbb/a.dart', false);
+    _assertNonNullableForPath('/packages/bbb/lib/b.dart', false);
+    _assertNonNullableForPath('/packages/bbb/test/c.dart', false);
 
-    _assertNonNullableForPath('/foo/bar.dart', false);
+    _assertNonNullableForPath('/packages/ccc/a.dart', true);
+    _assertNonNullableForPath('/packages/ccc/lib/b.dart', true);
+    _assertNonNullableForPath('/packages/ccc/test/c.dart', true);
+
+    _assertNonNullableForPath('/other/file.dart', false);
   }
 
-  test_sdk_defaultLegacy_sdkLegacy() {
-    newFile('/test/.packages', content: '''
-test:lib/
-''');
-    _simulateLegacySdk();
+  test_sdk() {
     _buildProvider([]);
 
     var featureSet = _getSdkFeatureSet();
     expect(featureSet.isEnabled(Feature.non_nullable), isTrue);
   }
 
-  test_sdk_defaultNonNullable_sdkLegacy() {
-    newFile('/test/.packages', content: '''
-test:lib/
-''');
-    _simulateLegacySdk();
-    _buildProvider(['non-nullable']);
-
-    var featureSet = _getSdkFeatureSet();
-    expect(featureSet.isEnabled(Feature.non_nullable), isTrue);
-  }
-
-  test_sdk_defaultNonNullable_sdkNonNullable() {
-    newFile('/test/.packages', content: '''
-test:lib/
-''');
-    _simulateNonNullableSdk();
+  test_sdk_enabledExperiment_nonNullable() {
     _buildProvider(['non-nullable']);
 
     var featureSet = _getSdkFeatureSet();
@@ -169,7 +159,6 @@
     provider = FeatureSetProvider.build(
       resourceProvider: resourceProvider,
       packages: findPackagesFrom(resourceProvider, getFolder('/test')),
-      sourceFactory: sourceFactory,
       packageDefaultFeatureSet: featureSet,
       nonPackageDefaultFeatureSet: featureSet,
     );
@@ -208,17 +197,4 @@
     var mathPath = sourceFactory.forUri2(mathUri).fullName;
     return provider.getFeatureSet(mathPath, mathUri);
   }
-
-  void _replaceDartCoreObject(String content) {
-    var path = sourceFactory.forUri('dart:core').fullName;
-    newFile(path, content: content);
-  }
-
-  void _simulateLegacySdk() {
-    _replaceDartCoreObject('// no marker');
-  }
-
-  void _simulateNonNullableSdk() {
-    _replaceDartCoreObject('// bool operator ==(Object other)');
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index c2bdaeb..07a09ca 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -63,7 +63,6 @@
     var featureSetProvider = FeatureSetProvider.build(
       resourceProvider: resourceProvider,
       packages: Packages.empty,
-      sourceFactory: sourceFactory,
       packageDefaultFeatureSet: FeatureSet.fromEnableFlags([]),
       nonPackageDefaultFeatureSet: FeatureSet.fromEnableFlags([]),
     );
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index c5bc120..12ddb58 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -906,18 +906,27 @@
     assertThat(element)..isReferencedAt('p: 1', true);
   }
 
-  test_isReferencedBy_ParameterElement_named_ofMethod_genericClass() async {
+  test_isReferencedBy_ParameterElement_genericFunctionType() async {
     await _indexTestUnit('''
-class A<T> {
-  void foo({T test}) {}
-}
+typedef F = void Function({int p});
 
-main(A<int> a) {
-  a.foo(test: 0);
+void main(F f) {
+  f(p: 0);
 }
 ''');
-    Element element = findElement('test');
-    assertThat(element)..isReferencedAt('test: 0', true);
+    // We should not crash because of reference to "p" - a named parameter
+    // of a generic function type.
+  }
+
+  test_isReferencedBy_ParameterElement_genericFunctionType_call() async {
+    await _indexTestUnit('''
+typedef F<T> = void Function({T test});
+
+main(F<int> f) {
+  f.call(test: 0);
+}
+''');
+    // No exceptions.
   }
 
   test_isReferencedBy_ParameterElement_named_ofConstructor_genericClass() async {
@@ -934,17 +943,18 @@
     assertThat(element)..isReferencedAt('test: 0', true);
   }
 
-  test_isReferencedBy_ParameterElement_genericFunctionType() async {
+  test_isReferencedBy_ParameterElement_named_ofMethod_genericClass() async {
     await _indexTestUnit('''
-typedef F = void Function({int p});
+class A<T> {
+  void foo({T test}) {}
+}
 
-void main() {
-  F f;
-  f(p: 0);
+main(A<int> a) {
+  a.foo(test: 0);
 }
 ''');
-    // We should not crash because of reference to "p" - a named parameter
-    // of a generic function type.
+    Element element = findElement('test');
+    assertThat(element)..isReferencedAt('test: 0', true);
   }
 
   test_isReferencedBy_ParameterElement_optionalPositional() async {
diff --git a/pkg/analyzer/test/src/dart/element/factor_type_test.dart b/pkg/analyzer/test/src/dart/element/factor_type_test.dart
new file mode 100644
index 0000000..111da27
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/factor_type_test.dart
@@ -0,0 +1,128 @@
+// 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/analysis/features.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/resolver.dart' show TypeSystemImpl;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/test_analysis_context.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FactorTypeTest);
+  });
+}
+
+@reflectiveTest
+class FactorTypeTest with ElementsTypesMixin {
+  @override
+  TypeProvider typeProvider;
+
+  TypeSystemImpl typeSystem;
+
+  FeatureSet get testFeatureSet {
+    return FeatureSet.forTesting(
+      additionalFeatures: [Feature.non_nullable],
+    );
+  }
+
+  void setUp() {
+    var analysisContext = TestAnalysisContext(
+      featureSet: testFeatureSet,
+    );
+    typeProvider = analysisContext.typeProviderNonNullableByDefault;
+    typeSystem = analysisContext.typeSystemNonNullableByDefault;
+  }
+
+  void test_futureOr() {
+    _check(futureOrNone(intNone), intNone, 'Future<int>');
+    _check(futureOrNone(intNone), futureNone(intNone), 'int');
+
+    _check(futureOrNone(intQuestion), intNone, 'FutureOr<int?>');
+    _check(futureOrNone(intQuestion), futureNone(intNone), 'FutureOr<int?>');
+    _check(futureOrNone(intQuestion), intQuestion, 'Future<int?>');
+    _check(futureOrNone(intQuestion), futureNone(intQuestion), 'int?');
+    _check(futureOrNone(intQuestion), intStar, 'Future<int?>');
+    _check(futureOrNone(intQuestion), futureNone(intStar), 'int?');
+
+    _check(futureOrNone(intNone), numNone, 'Future<int>');
+    _check(futureOrNone(intNone), futureNone(numNone), 'int');
+  }
+
+  void test_object() {
+    _check(objectNone, objectNone, 'Never');
+    _check(objectNone, objectQuestion, 'Never');
+    _check(objectNone, objectStar, 'Never');
+
+    _check(objectNone, intNone, 'Object');
+    _check(objectNone, intQuestion, 'Object');
+    _check(objectNone, intStar, 'Object');
+
+    _check(objectQuestion, objectNone, 'Never?');
+    _check(objectQuestion, objectQuestion, 'Never');
+    _check(objectQuestion, objectStar, 'Never');
+
+    _check(objectQuestion, intNone, 'Object?');
+    _check(objectQuestion, intQuestion, 'Object');
+    _check(objectQuestion, intStar, 'Object');
+  }
+
+  test_subtype() {
+    _check(intNone, intNone, 'Never');
+    _check(intNone, intQuestion, 'Never');
+    _check(intNone, intStar, 'Never');
+
+    _check(intQuestion, intNone, 'Never?');
+    _check(intQuestion, intQuestion, 'Never');
+    _check(intQuestion, intStar, 'Never');
+
+    _check(intStar, intNone, 'Never');
+    _check(intStar, intQuestion, 'Never');
+    _check(intStar, intStar, 'Never');
+
+    _check(intNone, numNone, 'Never');
+    _check(intNone, numQuestion, 'Never');
+    _check(intNone, numStar, 'Never');
+
+    _check(intQuestion, numNone, 'Never?');
+    _check(intQuestion, numQuestion, 'Never');
+    _check(intQuestion, numStar, 'Never');
+
+    _check(intStar, numNone, 'Never');
+    _check(intStar, numQuestion, 'Never');
+    _check(intStar, numStar, 'Never');
+
+    _check(intNone, nullNone, 'int');
+    _check(intQuestion, nullNone, 'int');
+    _check(intStar, nullNone, 'int');
+
+    _check(intNone, stringNone, 'int');
+    _check(intQuestion, stringNone, 'int?');
+    _check(intStar, stringNone, 'int*');
+
+    _check(intNone, stringQuestion, 'int');
+    _check(intQuestion, stringQuestion, 'int');
+    _check(intStar, stringQuestion, 'int');
+
+    _check(intNone, stringStar, 'int');
+    _check(intQuestion, stringStar, 'int');
+    _check(intStar, stringStar, 'int');
+  }
+
+  void _check(DartType T, DartType S, String expectedStr) {
+    var result = typeSystem.factor(T, S);
+    var resultStr = _typeString(result);
+
+    expect(resultStr, expectedStr);
+  }
+
+  String _typeString(TypeImpl type) {
+    return type.getDisplayString(withNullability: true);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index 14790a0..8a98bd6 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -5,6 +5,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'element_test.dart' as element;
+import 'factor_type_test.dart' as factor_type;
 import 'function_type_test.dart' as function_type;
 import 'inheritance_manager3_test.dart' as inheritance_manager3;
 import 'least_upper_bound_helper_test.dart' as least_upper_bound_helper;
@@ -23,6 +24,7 @@
 main() {
   defineReflectiveSuite(() {
     element.main();
+    factor_type.main();
     function_type.main();
     inheritance_manager3.main();
     least_upper_bound_helper.main();
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 51e24c3..7d0756e 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -32,13 +32,16 @@
     var indexElement = findElement.method('[]');
 
     var indexExpression = findNode.index('a[0]');
-    assertElement(indexExpression, indexElement);
-    assertAuxElement(indexExpression, null);
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: null,
+      type: 'bool',
+    );
     assertParameterElement(
       indexExpression.index,
       indexElement.parameters[0],
     );
-    assertType(indexExpression, 'bool');
   }
 
   test_read_generic() async {
@@ -55,13 +58,19 @@
     var indexElement = findElement.method('[]');
 
     var indexExpression = findNode.index('a[0]');
-    assertMember(indexExpression, indexElement, {'T': 'double'});
-    assertAuxElement(indexExpression, null);
+    assertIndexExpression(
+      indexExpression,
+      readElement: elementMatcher(
+        indexElement,
+        substitution: {'T': 'double'},
+      ),
+      writeElement: null,
+      type: 'double',
+    );
     assertParameterElement(
       indexExpression.index,
       indexElement.parameters[0],
     );
-    assertType(indexExpression, 'double');
   }
 
   test_readWrite() async {
@@ -81,23 +90,26 @@
     var numPlusElement = numElement.getMethod('+');
 
     var indexExpression = findNode.index('a[0]');
-    assertElement(indexExpression, indexEqElement);
-    assertAuxElement(indexExpression, indexElement);
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: indexEqElement,
+      type: 'num',
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'num');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(
+    assertAssignment(
       assignment,
-      elementMatcher(
+      operatorElement: elementMatcher(
         numPlusElement,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      type: 'num',
     );
-    assertType(assignment, 'num');
     assertParameterElement(
       assignment.rightHandSide,
       numPlusElement.parameters[0],
@@ -121,23 +133,32 @@
     var doublePlusElement = doubleElement.getMethod('+');
 
     var indexExpression = findNode.index('a[0]');
-    assertMember(indexExpression, indexEqElement, {'T': 'double'});
-    assertAuxMember(indexExpression, indexElement, {'T': 'double'});
+    assertIndexExpression(
+      indexExpression,
+      readElement: elementMatcher(
+        indexElement,
+        substitution: {'T': 'double'},
+      ),
+      writeElement: elementMatcher(
+        indexEqElement,
+        substitution: {'T': 'double'},
+      ),
+      type: 'double',
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'double');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(
+    assertAssignment(
       assignment,
-      elementMatcher(
+      operatorElement: elementMatcher(
         doublePlusElement,
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      type: 'double',
     );
-    assertType(assignment, 'double');
     assertParameterElement(
       assignment.rightHandSide,
       doublePlusElement.parameters[0],
@@ -158,17 +179,23 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    assertElement(indexExpression, indexEqElement);
-    assertAuxElement(indexExpression, null);
+    assertIndexExpression(
+      indexExpression,
+      readElement: null,
+      writeElement: indexEqElement,
+      type: null,
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'num');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(assignment, null);
-    assertType(assignment, 'double');
+    assertAssignment(
+      assignment,
+      operatorElement: null,
+      type: 'double',
+    );
     assertParameterElement(assignment.rightHandSide, null);
   }
 
@@ -186,17 +213,26 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    assertMember(indexExpression, indexEqElement, {'T': 'double'});
-    assertAuxElement(indexExpression, null);
+    assertIndexExpression(
+      indexExpression,
+      readElement: null,
+      writeElement: elementMatcher(
+        indexEqElement,
+        substitution: {'T': 'double'},
+      ),
+      type: null,
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'double');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(assignment, null);
-    assertType(assignment, 'double');
+    assertAssignment(
+      assignment,
+      operatorElement: null,
+      type: 'double',
+    );
     assertParameterElement(assignment.rightHandSide, null);
   }
 }
@@ -211,6 +247,27 @@
   @override
   bool get typeToStringWithNullability => true;
 
+  test_cascade_read_nullable() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bool operator[](int index) => false;
+}
+
+main(A? a) {
+  a?..[0];
+}
+''');
+
+    var indexElement = findElement.method('[]');
+
+    assertIndexExpression(
+      findNode.index('..[0]'),
+      readElement: indexElement,
+      writeElement: null,
+      type: 'bool?',
+    );
+  }
+
   test_read_nullable() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -218,6 +275,28 @@
 }
 
 main(A? a) {
+  a?[0];
+}
+''');
+
+    var indexElement = findElement.method('[]');
+
+    var indexExpression = findNode.index('a?[0]');
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: null,
+      type: 'bool?',
+    );
+  }
+
+  test_read_nullable_questionDotIndex() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bool operator[](int index) => false;
+}
+
+main(A? a) {
   a?.[0];
 }
 ''');
@@ -225,9 +304,12 @@
     var indexElement = findElement.method('[]');
 
     var indexExpression = findNode.index('a?.[0]');
-    assertElement(indexExpression, indexElement);
-    assertAuxElement(indexExpression, null);
-    assertType(indexExpression, 'bool?');
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: null,
+      type: 'bool?',
+    );
   }
 
   test_readWrite_nullable() async {
@@ -238,6 +320,46 @@
 }
 
 main(A? a) {
+  a?[0] += 1.2;
+}
+''');
+
+    var indexElement = findElement.method('[]');
+    var indexEqElement = findElement.method('[]=');
+    var numPlusElement = numElement.getMethod('+');
+
+    var indexExpression = findNode.index('a?[0]');
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: indexEqElement,
+      type: 'num',
+    );
+    assertParameterElement(
+      indexExpression.index,
+      indexEqElement.parameters[0],
+    );
+
+    var assignment = indexExpression.parent as AssignmentExpression;
+    assertAssignment(
+      assignment,
+      operatorElement: numPlusElement,
+      type: 'num?',
+    );
+    assertParameterElement(
+      assignment.rightHandSide,
+      numPlusElement.parameters[0],
+    );
+  }
+
+  test_readWrite_nullable_questionDotIndex() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  num operator[](int index) => 0;
+  void operator[]=(int index, num value) {}
+}
+
+main(A? a) {
   a?.[0] += 1.2;
 }
 ''');
@@ -247,17 +369,23 @@
     var numPlusElement = numElement.getMethod('+');
 
     var indexExpression = findNode.index('a?.[0]');
-    assertElement(indexExpression, indexEqElement);
-    assertAuxElement(indexExpression, indexElement);
+    assertIndexExpression(
+      indexExpression,
+      readElement: indexElement,
+      writeElement: indexEqElement,
+      type: 'num',
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'num');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(assignment, numPlusElement);
-    assertType(assignment, 'num?');
+    assertAssignment(
+      assignment,
+      operatorElement: numPlusElement,
+      type: 'num?',
+    );
     assertParameterElement(
       assignment.rightHandSide,
       numPlusElement.parameters[0],
@@ -271,6 +399,40 @@
 }
 
 main(A? a) {
+  a?[0] = 1.2;
+}
+''');
+
+    var indexEqElement = findElement.method('[]=');
+
+    var indexExpression = findNode.index('a?[0]');
+    assertIndexExpression(
+      indexExpression,
+      readElement: null,
+      writeElement: indexEqElement,
+      type: null,
+    );
+    assertParameterElement(
+      indexExpression.index,
+      indexEqElement.parameters[0],
+    );
+
+    var assignment = indexExpression.parent as AssignmentExpression;
+    assertAssignment(
+      assignment,
+      operatorElement: null,
+      type: 'double?',
+    );
+    assertParameterElement(assignment.rightHandSide, null);
+  }
+
+  test_write_nullable_questionDotIndex() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  void operator[]=(int index, num value) {}
+}
+
+main(A? a) {
   a?.[0] = 1.2;
 }
 ''');
@@ -278,17 +440,23 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a?.[0]');
-    assertElement(indexExpression, indexEqElement);
-    assertAuxElement(indexExpression, null);
+    assertIndexExpression(
+      indexExpression,
+      readElement: null,
+      writeElement: indexEqElement,
+      type: null,
+    );
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
     );
-    assertType(indexExpression, 'num');
 
     var assignment = indexExpression.parent as AssignmentExpression;
-    assertElement(assignment, null);
-    assertType(assignment, 'double?');
+    assertAssignment(
+      assignment,
+      operatorElement: null,
+      type: 'double?',
+    );
     assertParameterElement(assignment.rightHandSide, null);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index c26a4ee..17fa5b2 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -1702,6 +1702,9 @@
       [EnableString.non_nullable],
     );
 
+  @override
+  bool get typeToStringWithNullability => true;
+
   test_hasReceiver_deferredImportPrefix_loadLibrary_optIn_fromOptOut() async {
     newFile('/test/lib/a.dart', content: r'''
 class A {}
@@ -1724,7 +1727,7 @@
     assertMethodInvocation(
       invocation,
       import.importedLibrary.loadLibraryFunction,
-      'Future<dynamic> Function()',
+      'Future<dynamic>* Function()*',
     );
   }
 
@@ -1834,6 +1837,29 @@
     );
   }
 
+  test_hasReceiver_interfaceTypeQ_defined_extensionQ2() async {
+    await assertNoErrorsInCode(r'''
+extension E<T> on T? {
+  T foo() => throw 0;
+}
+
+main(int? a) {
+  a.foo();
+}
+''');
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('a.foo()'),
+      element: elementMatcher(
+        findElement.method('foo', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      typeArgumentTypes: [],
+      invokeType: 'int Function()',
+      type: 'int',
+    );
+  }
+
   test_hasReceiver_interfaceTypeQ_notDefined() async {
     await assertErrorsInCode(r'''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index be19ec4..0a7b1c4 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -94,10 +94,10 @@
 
   void assertAssignment(
     AssignmentExpression node, {
-    @required ExecutableElement operatorElement,
+    @required Object operatorElement,
     @required String type,
   }) {
-    expect(node.staticElement, same(operatorElement));
+    assertElement(node.staticElement, operatorElement);
     assertType(node, type);
   }
 
@@ -304,22 +304,29 @@
 
   void assertIndexExpression(
     IndexExpression node, {
-    @required MethodElement readElement,
-    @required MethodElement writeElement,
+    @required Object readElement,
+    @required Object writeElement,
     @required String type,
   }) {
     var isRead = node.inGetterContext();
     var isWrite = node.inSetterContext();
     if (isRead && isWrite) {
-      expect(node.auxiliaryElements?.staticElement, readElement);
-      expect(node.staticElement, writeElement);
+      assertElement(node.auxiliaryElements?.staticElement, readElement);
+      assertElement(node.staticElement, writeElement);
     } else if (isRead) {
-      expect(node.staticElement, readElement);
+      assertElement(node.staticElement, readElement);
     } else {
       expect(isWrite, isTrue);
-      expect(node.staticElement, writeElement);
+      assertElement(node.staticElement, writeElement);
     }
-    assertType(node, type);
+
+    if (isRead) {
+      assertType(node, type);
+    } else {
+      // TODO(scheglov) enforce this
+//      expect(type, isNull);
+//      assertTypeNull(node);
+    }
   }
 
   void assertInstanceCreation(InstanceCreationExpression creation,
@@ -447,7 +454,7 @@
 
   void assertMethodInvocation2(
     MethodInvocation node, {
-    @required ExecutableElement element,
+    @required Object element,
     @required List<String> typeArgumentTypes,
     @required String invokeType,
     @required String type,
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 56e5f2b..69b5728 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -177,9 +177,12 @@
   }
 
   test_nonConst_entry() async {
-    await assertNoErrorsInCode('''
+    // No error, but there is a hint.
+    await assertErrorsInCode('''
 var c = {1, 2, 1};
-''');
+''', [
+      error(HintCode.EQUAL_ELEMENTS_IN_SET, 15, 1),
+    ]);
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart
new file mode 100644
index 0000000..261e8bf
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.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:analyzer/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EqualElementsInSetTest);
+  });
+}
+
+@reflectiveTest
+class EqualElementsInSetTest extends DriverResolutionTest {
+  test_constant_constant() async {
+    await assertErrorsInCode('''
+const a = 1;
+const b = 1;
+var s = {a, b};
+''', [
+      error(HintCode.EQUAL_ELEMENTS_IN_SET, 38, 1),
+    ]);
+  }
+
+  test_literal_constant() async {
+    await assertErrorsInCode('''
+const one = 1;
+var s = {1, one};
+''', [
+      error(HintCode.EQUAL_ELEMENTS_IN_SET, 27, 3),
+    ]);
+  }
+
+  test_literal_literal() async {
+    await assertErrorsInCode('''
+var s = {1, 1};
+''', [
+      error(HintCode.EQUAL_ELEMENTS_IN_SET, 12, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index 0e9ea6b..7334278 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -158,9 +158,12 @@
   }
 
   test_nonConst_entry() async {
-    await assertNoErrorsInCode('''
+    // No error, but there is a hint.
+    await assertErrorsInCode('''
 var c = {1: null, 2: null, 1: null};
-''');
+''', [
+      error(HintCode.EQUAL_KEYS_IN_MAP, 27, 1),
+    ]);
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
new file mode 100644
index 0000000..a546d1b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.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:analyzer/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EqualKeysInMapTest);
+  });
+}
+
+@reflectiveTest
+class EqualKeysInMapTest extends DriverResolutionTest {
+  test_constant_constant() async {
+    await assertErrorsInCode('''
+const a = 1;
+const b = 1;
+var s = {a: 2, b: 3};
+''', [
+      error(HintCode.EQUAL_KEYS_IN_MAP, 41, 1),
+    ]);
+  }
+
+  test_literal_constant() async {
+    await assertErrorsInCode('''
+const one = 1;
+var s = {1: 2, one: 3};
+''', [
+      error(HintCode.EQUAL_KEYS_IN_MAP, 30, 3),
+    ]);
+  }
+
+  test_literal_literal() async {
+    await assertErrorsInCode('''
+var s = {1: 2, 1: 3};
+''', [
+      error(HintCode.EQUAL_KEYS_IN_MAP, 15, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_language_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_language_override_test.dart
index 8a9aa78..5e72381 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_language_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_language_override_test.dart
@@ -9,12 +9,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(BadDartLanguageOverrideTest);
+    defineReflectiveTests(InvalidLanguageOverrideTest);
   });
 }
 
 @reflectiveTest
-class BadDartLanguageOverrideTest extends DriverResolutionTest {
+class InvalidLanguageOverrideTest extends DriverResolutionTest {
   test_correct_11_12() async {
     await assertNoErrorsInCode(r'''
 // @dart = 11.12
@@ -77,6 +77,57 @@
 ''');
   }
 
+  test_location_afterClass() async {
+    await assertErrorsInCode(r'''
+class A {
+  // @dart = 2.5
+  void test() {}
+}
+''', [
+      error(HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION, 15, 11),
+    ]);
+  }
+
+  test_location_afterDeclaration() async {
+    await assertErrorsInCode(r'''
+class A {}
+// @dart = 2.5
+''', [error(HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION, 14, 11)]);
+  }
+
+  test_location_afterDeclaration_beforeEof() async {
+    await assertErrorsInCode(r'''
+class A {}
+// @dart = 2.5
+''', [error(HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION, 14, 11)]);
+  }
+
+  test_location_afterDirective() async {
+    await assertErrorsInCode(r'''
+import 'dart:core';
+// @dart = 2.5
+class A {}
+''', [error(HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION, 23, 11)]);
+  }
+
+  test_location_beforeDeclaration() async {
+    await assertNoErrorsInCode(r'''
+// @dart = 2.5
+class A {}
+''');
+  }
+
+  test_location_notLineStart() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  /**
+   * For example '// @dart = 2.1'.
+   */
+  void test() {}
+}
+''');
+  }
+
   test_missingAtSign() async {
     await assertErrorsInCode(r'''
 // dart = 2.0
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart
deleted file mode 100644
index c680ec7..0000000
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart
+++ /dev/null
@@ -1,128 +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.
-
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(InvalidUseOfNullValueTest);
-  });
-}
-
-@reflectiveTest
-class InvalidUseOfNullValueTest extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.non_nullable],
-    );
-
-  test_as() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x as int; // ignore: unnecessary_cast
-}
-''');
-  }
-
-  test_await() async {
-    await assertNoErrorsInCode(r'''
-m() async {
-  Null x;
-  await x;
-}
-''');
-  }
-
-  test_cascade() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x..toString;
-}
-''');
-  }
-
-  test_eq() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x == null;
-}
-''');
-  }
-
-  test_forLoop() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
-  for (var y in x) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 27, 1),
-      error(StaticWarningCode.INVALID_USE_OF_NULL_VALUE, 32, 1),
-    ]);
-  }
-
-  test_is() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x is int;
-}
-''');
-  }
-
-  test_member() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x.runtimeType;
-}
-''');
-  }
-
-  test_method() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x.toString();
-}
-''');
-  }
-
-  test_notEq() async {
-    await assertNoErrorsInCode(r'''
-m() {
-  Null x;
-  x != null;
-}
-''');
-  }
-
-  test_ternary_lhs() async {
-    await assertNoErrorsInCode(r'''
-m(bool cond) {
-  Null x;
-  cond ? x : 1;
-}
-''');
-  }
-
-  test_ternary_rhs() async {
-    await assertNoErrorsInCode(r'''
-m(bool cond) {
-  Null x;
-  cond ? 0 : x;
-}
-''');
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
index 4b774e1..06f4f23 100644
--- a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
@@ -2,7 +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:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,10 +12,31 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NotIterableSpreadTest);
+    defineReflectiveTests(NotIterableSpreadNullSafetyTest);
   });
 }
 
 @reflectiveTest
+class NotIterableSpreadNullSafetyTest extends NotIterableSpreadTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.7.0', additionalFeatures: [Feature.non_nullable]);
+
+  @override
+  bool get typeToStringWithNullability => true;
+
+  test_iterable_typeParameter_bound_listQuestion() async {
+    await assertNoErrorsInCode('''
+void f<T extends List<int>?>(T a) {
+  var v = [...?a];
+  v;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class NotIterableSpreadTest extends DriverResolutionTest {
   test_iterable_list() async {
     await assertNoErrorsInCode('''
@@ -28,6 +51,15 @@
 ''');
   }
 
+  test_iterable_typeParameter_bound_list() async {
+    await assertNoErrorsInCode('''
+void f<T extends List<int>>(T a) {
+  var v = [...a];
+  v;
+}
+''');
+  }
+
   test_notIterable_direct() async {
     await assertErrorsInCode('''
 var a = 0;
@@ -64,4 +96,15 @@
       error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 34, 1),
     ]);
   }
+
+  test_notIterable_typeParameter_bound() async {
+    await assertErrorsInCode('''
+void f<T extends num>(T a) {
+  var v = [...a];
+  v;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 43, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
index 2f7e415..98ccc0d 100644
--- a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
@@ -2,7 +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:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,10 +12,31 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NotMapSpreadTest);
+    defineReflectiveTests(NotMapSpreadNullSafetyTest);
   });
 }
 
 @reflectiveTest
+class NotMapSpreadNullSafetyTest extends NotMapSpreadTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.7.0', additionalFeatures: [Feature.non_nullable]);
+
+  @override
+  bool get typeToStringWithNullability => true;
+
+  test_map_typeParameter_bound_mapQuestion() async {
+    await assertNoErrorsInCode('''
+void f<T extends Map<int, String>?>(T a) {
+  var v = <int, String>{...?a};
+  v;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class NotMapSpreadTest extends DriverResolutionTest {
   test_map() async {
     await assertNoErrorsInCode('''
@@ -28,6 +51,15 @@
 ''');
   }
 
+  test_map_typeParameter_bound_map() async {
+    await assertNoErrorsInCode('''
+void f<T extends Map<int, String>>(T a) {
+  var v = <int, String>{...a};
+  v;
+}
+''');
+  }
+
   test_notMap_direct() async {
     await assertErrorsInCode('''
 var a = 0;
@@ -64,4 +96,15 @@
       error(CompileTimeErrorCode.NOT_MAP_SPREAD, 44, 1),
     ]);
   }
+
+  test_notMap_typeParameter_bound() async {
+    await assertErrorsInCode('''
+void f<T extends num>(T a) {
+  var v = <int, int>{...a};
+  v;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_MAP_SPREAD, 53, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/private_optional_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/private_optional_parameter_test.dart
index 58b1fc5..6c11828 100644
--- a/pkg/analyzer/test/src/diagnostics/private_optional_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/private_optional_parameter_test.dart
@@ -9,12 +9,12 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(RecursiveCompileTimeConstantTest);
+    defineReflectiveTests(PrivateOptionalParameterTest);
   });
 }
 
 @reflectiveTest
-class RecursiveCompileTimeConstantTest extends DriverResolutionTest {
+class PrivateOptionalParameterTest extends DriverResolutionTest {
   test_private() async {
     await assertErrorsInCode('''
 f({var _p}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart b/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
index 2245354..05d0a4c 100644
--- a/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/recursive_compile_time_constant_test.dart
@@ -47,10 +47,12 @@
 ''',
     );
     // No errors, because the cycle is not in this source.
-    await assertNoErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'constants.dart';
 final z = {x: 0, y: 1};
-''');
+''', [
+      error(HintCode.EQUAL_KEYS_IN_MAP, 42, 1),
+    ]);
   }
 
   test_initializer_after_toplevel_var() async {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 973eec9..9275a0a 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -82,7 +82,9 @@
 import 'duplicate_part_test.dart' as duplicate_part;
 import 'duplicate_shown_name_test.dart' as duplicate_shown_name;
 import 'equal_elements_in_const_set_test.dart' as equal_elements_in_const_set;
+import 'equal_elements_in_set_test.dart' as equal_elements_in_set;
 import 'equal_keys_in_const_map_test.dart' as equal_keys_in_const_map;
+import 'equal_keys_in_map_test.dart' as equal_keys_in_map;
 import 'expected_one_list_type_arguments_test.dart'
     as expected_one_list_type_arguments;
 import 'expected_one_set_type_arguments_test.dart'
@@ -221,7 +223,6 @@
 import 'invalid_uri_test.dart' as invalid_uri;
 import 'invalid_use_of_covariant_in_extension_test.dart'
     as invalid_use_of_covariant_in_extension;
-import 'invalid_use_of_null_value_test.dart' as invalid_use_of_null_value;
 import 'invalid_use_of_protected_member_test.dart'
     as invalid_use_of_protected_member;
 import 'invalid_use_of_visible_for_template_member_test.dart'
@@ -443,8 +444,6 @@
 import 'type_test_with_non_type_test.dart' as type_test_with_non_type;
 import 'type_test_with_undefined_name_test.dart'
     as type_test_with_undefined_name;
-import 'unchecked_use_of_nullable_value_test.dart'
-    as unchecked_use_of_nullable_value;
 import 'undefined_annotation_test.dart' as undefined_annotation;
 import 'undefined_class_boolean_test.dart' as undefined_class_boolean;
 import 'undefined_class_test.dart' as undefined_class;
@@ -485,8 +484,10 @@
 import 'unused_shown_name_test.dart' as unused_shown_name;
 import 'uri_does_not_exist_test.dart' as uri_does_not_exist;
 import 'uri_with_interpolation_test.dart' as uri_with_interpolation;
+import 'use_of_nullable_value_test.dart' as use_of_nullable_value_test;
 import 'use_of_void_result_test.dart' as use_of_void_result;
 import 'variable_type_mismatch_test.dart' as variable_type_mismatch;
+import 'void_with_type_arguments_test.dart' as void_with_type_arguments_test;
 import 'wrong_number_of_parameters_for_operator_test.dart'
     as wrong_number_of_parameters_for_operator;
 import 'wrong_number_of_parameters_for_setter_test.dart'
@@ -556,7 +557,9 @@
     duplicate_part.main();
     duplicate_shown_name.main();
     equal_elements_in_const_set.main();
+    equal_elements_in_set.main();
     equal_keys_in_const_map.main();
+    equal_keys_in_map.main();
     expected_one_list_type_arguments.main();
     expected_one_set_type_arguments.main();
     expected_two_map_type_arguments.main();
@@ -646,7 +649,6 @@
     invalid_type_argument_in_const_set.main();
     invalid_uri.main();
     invalid_use_of_covariant_in_extension.main();
-    invalid_use_of_null_value.main();
     invalid_use_of_protected_member.main();
     invalid_use_of_visible_for_template_member.main();
     invalid_use_of_visible_for_testing_member.main();
@@ -794,7 +796,6 @@
     type_parameter_referenced_by_static.main();
     type_test_with_non_type.main();
     type_test_with_undefined_name.main();
-    unchecked_use_of_nullable_value.main();
     undefined_annotation.main();
     undefined_class_boolean.main();
     undefined_class.main();
@@ -832,8 +833,10 @@
     unused_shown_name.main();
     uri_does_not_exist.main();
     uri_with_interpolation.main();
+    use_of_nullable_value_test.main();
     use_of_void_result.main();
     variable_type_mismatch.main();
+    void_with_type_arguments_test.main();
     wrong_number_of_parameters_for_operator.main();
     wrong_number_of_parameters_for_setter.main();
     wrong_number_of_type_arguments.main();
diff --git a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
similarity index 93%
rename from pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
rename to pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 0c8a498..4cc8770 100644
--- a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -13,12 +13,124 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfNullValueTest);
     defineReflectiveTests(UncheckedUseOfNullableValueTest);
     defineReflectiveTests(UncheckedUseOfNullableValueInsideExtensionTest);
   });
 }
 
 @reflectiveTest
+class InvalidUseOfNullValueTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.fromEnableFlags(
+      [EnableString.non_nullable],
+    );
+
+  test_as() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x as int; // ignore: unnecessary_cast
+}
+''');
+  }
+
+  test_await() async {
+    await assertNoErrorsInCode(r'''
+m() async {
+  Null x;
+  await x;
+}
+''');
+  }
+
+  test_cascade() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x..toString;
+}
+''');
+  }
+
+  test_eq() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x == null;
+}
+''');
+  }
+
+  test_forLoop() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  for (var y in x) {}
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 27, 1),
+      error(StaticWarningCode.INVALID_USE_OF_NULL_VALUE, 32, 1),
+    ]);
+  }
+
+  test_is() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x is int;
+}
+''');
+  }
+
+  test_member() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x.runtimeType;
+}
+''');
+  }
+
+  test_method() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x.toString();
+}
+''');
+  }
+
+  test_notEq() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x != null;
+}
+''');
+  }
+
+  test_ternary_lhs() async {
+    await assertNoErrorsInCode(r'''
+m(bool cond) {
+  Null x;
+  cond ? x : 1;
+}
+''');
+  }
+
+  test_ternary_rhs() async {
+    await assertNoErrorsInCode(r'''
+m(bool cond) {
+  Null x;
+  cond ? 0 : x;
+}
+''');
+  }
+}
+
+@reflectiveTest
 class UncheckedUseOfNullableValueInsideExtensionTest
     extends DriverResolutionTest {
   @override
diff --git a/pkg/analyzer/test/src/diagnostics/void_with_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/void_with_type_arguments_test.dart
new file mode 100644
index 0000000..bc3d754
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/void_with_type_arguments_test.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:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(VoidWithTypeArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class VoidWithTypeArgumentsTest extends DriverResolutionTest {
+  test_noArguments() async {
+    await assertNoErrorsInCode('''
+void f() {}
+''');
+  }
+
+  test_withArguments() async {
+    await assertErrorsInCode('''
+void<int> f() {}
+''', [
+      error(ParserErrorCode.VOID_WITH_TYPE_ARGUMENTS, 4, 1),
+    ]);
+    assertTypeName(findNode.typeName('int>'), intElement, 'int');
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 38c6691..1472711 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -5413,6 +5413,42 @@
 ''');
   }
 
+  test_enum_value_documented_withMetadata() async {
+    var library = await checkLibrary('''
+enum E {
+  /**
+   * aaa
+   */
+  @annotation
+  a,
+  /// bbb
+  @annotation
+  b,
+}
+
+const int annotation = 0;
+''');
+    checkElementText(
+        library,
+        r'''
+enum E {
+  synthetic final int index;
+  synthetic static const List<E> values;
+  /**
+   * aaa
+   */
+  @annotation
+  static const E a;
+  /// bbb
+  @annotation
+  static const E b;
+  String toString() {}
+}
+const int annotation = 0;
+''',
+        withConstElements: false);
+  }
+
   test_enum_values() async {
     var library = await checkLibrary('enum E { v1, v2 }');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 0adf387..557aef8 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:yaml/yaml.dart';
@@ -30,7 +29,6 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ContextConfigurationTest);
     defineReflectiveTests(ErrorCodeValuesTest);
-    defineReflectiveTests(GenerateOldOptionsErrorsTaskTest);
     defineReflectiveTests(OptionsFileValidatorTest);
     defineReflectiveTests(OptionsProviderTest);
   });
@@ -209,42 +207,6 @@
 }
 
 @reflectiveTest
-class GenerateOldOptionsErrorsTaskTest with ResourceProviderMixin {
-  final AnalysisOptionsProvider optionsProvider = AnalysisOptionsProvider();
-
-  String get optionsFilePath => '/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}';
-
-  test_does_analyze_old_options_files() {
-    validate('''
-analyzer:
-  strong-mode: true
-    ''', [
-      AnalysisOptionsHintCode.DEPRECATED_ANALYSIS_OPTIONS_FILE_NAME,
-      AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED
-    ]);
-  }
-
-  test_finds_issues_in_old_options_files() {
-    validate('''
-analyzer:
-  strong_mode: true
-    ''', [
-      AnalysisOptionsHintCode.DEPRECATED_ANALYSIS_OPTIONS_FILE_NAME,
-      AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES
-    ]);
-  }
-
-  void validate(String content, List<ErrorCode> expected) {
-    final source = newFile(optionsFilePath, content: content).createSource();
-    var options = optionsProvider.getOptionsFromSource(source);
-    final OptionsFileValidator validator = OptionsFileValidator(source);
-    var errors = validator.validate(options);
-    expect(errors.map((AnalysisError e) => e.errorCode),
-        unorderedEquals(expected));
-  }
-}
-
-@reflectiveTest
 class OptionsFileValidatorTest {
   final OptionsFileValidator validator = OptionsFileValidator(TestSource());
   final AnalysisOptionsProvider optionsProvider = AnalysisOptionsProvider();
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index f96bb3d..2850837 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -2126,6 +2126,46 @@
     await check(implicitCasts: false);
   }
 
+  test_implicitCasts_forEach() async {
+    addFile(r'''
+main(dynamic a) {
+  for (int v in a) {
+    v;
+  }
+}
+''');
+    await check();
+
+    addFile(r'''
+main(dynamic a) {
+  for (int v in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/a) {
+    v;
+  }
+}
+''');
+    await check(implicitCasts: false);
+  }
+
+  test_implicitCasts_forEach_async() async {
+    addFile(r'''
+main(dynamic a) async {
+  await for (int v in a) {
+    v;
+  }
+}
+''');
+    await check();
+
+    addFile(r'''
+main(dynamic a) async {
+  await for (int v in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/a) {
+    v;
+  }
+}
+''');
+    await check(implicitCasts: false);
+  }
+
   test_implicitCasts_functionCall() async {
     addFile('''num n;
                f(int i) => i;
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 96b84bd..bd24cb1 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -1399,7 +1399,7 @@
 
 ### equal_elements_in_const_set
 
-_Two values in a constant set can't be equal._
+_Two elements in a constant set literal can't be equal._
 
 #### Description
 
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index b52cf59..0f45e9f 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -269,7 +269,9 @@
   }
 
   @override
-  void logException(dynamic exception, [StackTrace stackTrace]) {
+  void logException(dynamic exception,
+      [StackTrace stackTrace,
+      List<InstrumentationServiceAttachment> attachments]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index bacd4b0..e97abae 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -280,8 +280,7 @@
       // Analyze the libraries.
       for (String path in filesToAnalyze) {
         var shortName = resourceProvider.pathContext.basename(path);
-        if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE ||
-            shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE) {
+        if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE) {
           File file = resourceProvider.getFile(path);
           String content = file.readAsStringSync();
           LineInfo lineInfo = LineInfo.fromContent(content);
diff --git a/pkg/async_helper/lib/async_minitest.dart b/pkg/async_helper/lib/async_minitest.dart
index 3668aba..c7dcb86 100644
--- a/pkg/async_helper/lib/async_minitest.dart
+++ b/pkg/async_helper/lib/async_minitest.dart
@@ -189,6 +189,11 @@
       Expect.fail("$v is not less than $n");
     };
 
+Matcher predicate(bool fn(dynamic value), [String description = ""]) =>
+    (dynamic v) {
+      Expect.isTrue(fn(v), description);
+    };
+
 void isTrue(dynamic v) {
   Expect.isTrue(v);
 }
@@ -223,6 +228,16 @@
   });
 }
 
+void returnsNormally(dynamic o) {
+  try {
+    Expect.type<Function()>(o);
+    o();
+  } catch (error, trace) {
+    Expect.fail(
+        "Expected function to return normally, but threw:\n$error\n\n$trace");
+  }
+}
+
 void throws(dynamic v) {
   _checkThrow<Object>(v, (_) {});
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index af946d8..8d56df5 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -65,6 +65,7 @@
   static const String noMinify = '--no-minify';
   static const String noSourceMaps = '--no-source-maps';
   static const String preserveUris = '--preserve-uris';
+  static const String printLegacyStars = '--debug-print-legacy-stars';
   static const String showPackageWarnings = '--show-package-warnings';
   static const String suppressHints = '--suppress-hints';
   static const String suppressWarnings = '--suppress-warnings';
@@ -94,8 +95,8 @@
 
   static const String serverMode = '--server-mode';
 
-  static const String runtimeNullSafety = '--runtime-null-safety';
-  static const String noRuntimeNullSafety = '--no-runtime-null-safety';
+  static const String nullSafety = '--null-safety';
+  static const String noNullSafety = '--no-null-safety';
 
   static const String newDeferredSplit = '--new-deferred-split';
   static const String reportInvalidInferredDeferredTypes =
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 3a77982..65ac11c 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -513,6 +513,9 @@
   FunctionEntity get generalAsCheckImplementation;
   FunctionEntity get generalTypeCheckImplementation;
 
+  FunctionEntity get specializedIsObject;
+  FunctionEntity get specializedAsObject;
+  FunctionEntity get specializedCheckObject;
   FunctionEntity get specializedIsTop;
   FunctionEntity get specializedAsTop;
   FunctionEntity get specializedIsBool;
@@ -1976,6 +1979,21 @@
       _generalTypeCheckImplementation ??=
           _findRtiFunction('_generalTypeCheckImplementation');
 
+  FunctionEntity _specializedIsObject;
+  @override
+  FunctionEntity get specializedIsObject =>
+      _specializedIsObject ??= _findRtiFunction('_isObject');
+
+  FunctionEntity _specializedAsObject;
+  @override
+  FunctionEntity get specializedAsObject =>
+      _specializedAsObject ??= _findRtiFunction('_asObject');
+
+  FunctionEntity _specializedCheckObject;
+  @override
+  FunctionEntity get specializedCheckObject =>
+      _specializedCheckObject ??= _findRtiFunction('_checkObject');
+
   @override
   FunctionEntity get specializedIsTop => _findRtiFunction('_isTop');
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 0480aea..7b300b0 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -38,7 +38,7 @@
 import 'kernel/kernel_strategy.dart';
 import 'kernel/loader.dart' show KernelLoaderTask, KernelResult;
 import 'null_compiler_output.dart' show NullCompilerOutput;
-import 'options.dart' show CompilerOptions, DiagnosticOptions;
+import 'options.dart' show CompilerOptions;
 import 'serialization/task.dart';
 import 'serialization/strategies.dart';
 import 'ssa/nodes.dart' show HInstruction;
@@ -144,7 +144,7 @@
     if (makeReporter != null) {
       _reporter = makeReporter(this, options);
     } else {
-      _reporter = new CompilerDiagnosticReporter(this, options);
+      _reporter = new CompilerDiagnosticReporter(this);
     }
     kernelFrontEndTask = new GenericTask('Front end', measurer);
     frontendStrategy = new KernelFrontendStrategy(
@@ -631,7 +631,7 @@
 class CompilerDiagnosticReporter extends DiagnosticReporter {
   final Compiler compiler;
   @override
-  final DiagnosticOptions options;
+  CompilerOptions get options => compiler.options;
 
   Entity _currentElement;
   bool hasCrashed = false;
@@ -644,7 +644,7 @@
   /// suppressed for each library.
   Map<Uri, SuppressionInfo> suppressedWarnings = <Uri, SuppressionInfo>{};
 
-  CompilerDiagnosticReporter(this.compiler, this.options);
+  CompilerDiagnosticReporter(this.compiler);
 
   Entity get currentElement => _currentElement;
 
@@ -653,7 +653,7 @@
       [Map arguments = const {}]) {
     SourceSpan span = spanFromSpannable(spannable);
     MessageTemplate template = MessageTemplate.TEMPLATES[messageKind];
-    Message message = template.message(arguments, options.terseDiagnostics);
+    Message message = template.message(arguments, options);
     return new DiagnosticMessage(span, spannable, message);
   }
 
@@ -830,7 +830,7 @@
 
   void pleaseReportCrash() {
     print(MessageTemplate.TEMPLATES[MessageKind.PLEASE_REPORT_THE_CRASH]
-        .message({'buildId': compiler.options.buildId}));
+        .message({'buildId': compiler.options.buildId}, options));
   }
 
   /// Finds the approximate [Element] for [node]. [currentElement] is used as
@@ -848,7 +848,7 @@
   @override
   void log(message) {
     Message msg = MessageTemplate.TEMPLATES[MessageKind.GENERIC]
-        .message({'text': '$message'});
+        .message({'text': '$message'}, options);
     reportDiagnostic(new DiagnosticMessage(null, null, msg),
         const <DiagnosticMessage>[], api.Diagnostic.VERBOSE_INFO);
   }
@@ -901,7 +901,7 @@
         MessageTemplate template = MessageTemplate.TEMPLATES[kind];
         Message message = template.message(
             {'warnings': info.warnings, 'hints': info.hints, 'uri': uri},
-            options.terseDiagnostics);
+            options);
         reportDiagnostic(new DiagnosticMessage(null, null, message),
             const <DiagnosticMessage>[], api.Diagnostic.HINT);
       });
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 512a657..2a882d5 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -418,6 +418,7 @@
     new OptionHandler(Flags.minify, passThrough),
     new OptionHandler(Flags.noMinify, passThrough),
     new OptionHandler(Flags.preserveUris, ignoreOption),
+    new OptionHandler(Flags.printLegacyStars, passThrough),
     new OptionHandler('--force-strip=.*', setStrip),
     new OptionHandler(Flags.disableDiagnosticColors, (_) {
       enableColors = false;
@@ -464,8 +465,8 @@
     new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
     new OptionHandler(Flags.benchmarkingExperiment, passThrough),
-    new OptionHandler(Flags.runtimeNullSafety, setNullSafetyMode),
-    new OptionHandler(Flags.noRuntimeNullSafety, setNullSafetyMode),
+    new OptionHandler(Flags.nullSafety, setNullSafetyMode),
+    new OptionHandler(Flags.noNullSafety, 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/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index c85a784..34edd57 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -19,6 +19,8 @@
 import 'generated/shared_messages.dart' as shared_messages;
 import '../constants/values.dart' show ConstantValue;
 import '../commandline_options.dart';
+import '../elements/types.dart';
+import '../options.dart';
 import 'invariant.dart' show failedAt;
 import 'spannable.dart' show CURRENT_ELEMENT_SPANNABLE;
 
@@ -76,7 +78,6 @@
   INVALID_PACKAGE_URI,
   INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
   JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
-  JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR,
   JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
   JS_INTEROP_FIELD_NOT_SUPPORTED,
   JS_INTEROP_NON_EXTERNAL_MEMBER,
@@ -232,13 +233,6 @@
           howToFix: "Try marking the enclosing class as js-interop or "
               "remove the js-interop annotation from the member."),
 
-      MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR:
-          const MessageTemplate(
-              MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR,
-              "Constructor '#{constructor}' in js-interop class '#{cls}' is "
-              "not external.",
-              howToFix: "Try adding the 'external' to '#{constructor}'."),
-
       MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
           MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
           "Member '#{member}' in js-interop class '#{cls}' is not external.",
@@ -667,8 +661,8 @@
   @override
   String toString() => template;
 
-  Message message([Map arguments = const {}, bool terse = false]) {
-    return new Message(this, arguments, terse);
+  Message message(Map arguments, CompilerOptions options) {
+    return new Message(this, arguments, options);
   }
 
   bool get hasHowToFix => howToFix != null && howToFix != DONT_KNOW_HOW_TO_FIX;
@@ -677,10 +671,12 @@
 class Message {
   final MessageTemplate template;
   final Map arguments;
-  final bool terse;
+  final CompilerOptions _options;
+  bool get terse => _options?.terseDiagnostics ?? false;
+  bool get _printLegacyStars => _options?.printLegacyStars ?? false;
   String message;
 
-  Message(this.template, this.arguments, this.terse) {
+  Message(this.template, this.arguments, this._options) {
     assert(() {
       computeMessage();
       return true;
@@ -725,8 +721,10 @@
   @override
   int get hashCode => throw new UnsupportedError('Message.hashCode');
 
-  static String convertToString(value) {
-    if (value is ConstantValue) {
+  String convertToString(value) {
+    if (value is DartType) {
+      value = value.toStructuredText(printLegacyStars: _printLegacyStars);
+    } else if (value is ConstantValue) {
       value = value.toDartText();
     } else {
       value = tokenToString(value);
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 9dafa6c..a7a5404 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -128,7 +128,10 @@
   bool _equals(DartType other, _Assumptions assumptions);
 
   @override
-  String toString() => _DartTypeToStringVisitor().run(this);
+  String toString() => toStructuredText();
+
+  String toStructuredText({bool printLegacyStars = false}) =>
+      _DartTypeToStringVisitor(printLegacyStars).run(this);
 }
 
 /// Pairs of [FunctionTypeVariable]s that are currently assumed to be
@@ -1418,12 +1421,15 @@
 }
 
 class _DartTypeToStringVisitor extends DartTypeVisitor<void, void> {
+  final bool _printLegacyStars;
   final List _fragments = []; // Strings and _DeferredNames
   bool _lastIsIdentifier = false;
   List<FunctionTypeVariable> _boundVariables;
   Map<FunctionTypeVariable, _DeferredName> _variableToName;
   Set<FunctionType> _genericFunctions;
 
+  _DartTypeToStringVisitor(this._printLegacyStars);
+
   String run(DartType type) {
     _visit(type);
     if (_variableToName != null &&
@@ -1484,7 +1490,10 @@
     // We do not emit the '*' token for legacy types because this is a purely
     // internal notion. The language specification does not define a '*' token
     // in the type language, and no such token should be surfaced to users.
-    // TODO(fishythefish): Add a flag to enable printing '*'.
+    // For debugging, pass `--debug-print-legacy-stars` to emit the '*'.
+    if (_printLegacyStars) {
+      _token('*');
+    }
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 2a8247f..5d6d6ac 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -2251,34 +2251,34 @@
 AbstractValue _narrowType(
     JClosedWorld closedWorld, AbstractValue type, DartType annotation,
     {bool isNullable: true}) {
-  annotation = annotation.withoutNullability;
   AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
-  AbstractValue otherType;
-  if (closedWorld.dartTypes.isTopType(annotation)) {
-    return type;
-  } else if (annotation is InterfaceType) {
-    if (annotation.element == closedWorld.commonElements.objectClass) {
-      return type;
+
+  AbstractValue _intersectionWith(AbstractValue otherType) {
+    if (isNullable) {
+      otherType = abstractValueDomain.includeNull(otherType);
     }
-    otherType = abstractValueDomain.createNonNullSubtype(annotation.element);
-  } else if (annotation is VoidType) {
+    return type == null
+        ? otherType
+        : abstractValueDomain.intersection(type, otherType);
+  }
+
+  // TODO(joshualitt): FutureOrType, TypeVariableType, and FunctionTypeVariable
+  // can be narrowed.
+  // TODO(fishythefish): Use nullability.
+  annotation = annotation.withoutNullability;
+  if (closedWorld.dartTypes.isTopType(annotation) ||
+      annotation is FutureOrType ||
+      annotation is TypeVariableType ||
+      annotation is FunctionTypeVariable) {
     return type;
+  } else if (annotation is NeverType) {
+    return _intersectionWith(abstractValueDomain.emptyType);
+  } else if (annotation is InterfaceType) {
+    return _intersectionWith(
+        abstractValueDomain.createNonNullSubtype(annotation.element));
   } else if (annotation is FunctionType) {
-    otherType = closedWorld.abstractValueDomain.functionType;
-  } else if (annotation is FutureOrType) {
-    // TODO(johnniwinther): Narrow FutureOr types.
-    return type;
+    return _intersectionWith(abstractValueDomain.functionType);
   } else {
-    assert(
-        annotation is TypeVariableType || annotation is FunctionTypeVariable);
-    // TODO(ngeoffray): Narrow to bound.
-    return type;
+    throw 'Unexpected annotation type $annotation';
   }
-  if (isNullable) {
-    otherType = abstractValueDomain.includeNull(otherType);
-  }
-  if (type == null) {
-    return otherType;
-  }
-  return abstractValueDomain.intersection(type, otherType);
 }
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index 597ae50..1234917 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -317,43 +317,42 @@
   /// type.
   TypeInformation narrowType(TypeInformation type, DartType annotation,
       {bool isNullable: true}) {
+    TypeInformation _narrowTo(AbstractValue otherType) {
+      if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) return type;
+      if (isNullable) {
+        otherType = _abstractValueDomain.includeNull(otherType);
+      }
+      TypeInformation newType =
+          new NarrowTypeInformation(_abstractValueDomain, type, otherType);
+      allocatedTypes.add(newType);
+      return newType;
+    }
+
+    // TODO(fishythefish): Use nullability.
     annotation = annotation.withoutNullability;
-    AbstractValue otherType;
     if (annotation is VoidType) return type;
     if (_closedWorld.dartTypes.isTopType(annotation)) {
       if (isNullable) return type;
       // If the input is already narrowed to be not-null, there is no value
       // in adding another narrowing node.
       if (_isNonNullNarrow(type)) return type;
-      otherType = _abstractValueDomain.excludeNull(dynamicType.type);
+      return _narrowTo(_abstractValueDomain.excludeNull(dynamicType.type));
+    } else if (annotation is NeverType) {
+      return _narrowTo(_abstractValueDomain.emptyType);
     } else if (annotation is InterfaceType) {
-      InterfaceType interface = annotation;
-      if (interface.element == _closedWorld.commonElements.objectClass) {
-        if (isNullable) return type;
-        if (_isNonNullNarrow(type)) return type;
-        otherType = _abstractValueDomain.excludeNull(dynamicType.type);
-      } else {
-        otherType =
-            _abstractValueDomain.createNonNullSubtype(interface.element);
-      }
+      return _narrowTo(
+          _abstractValueDomain.createNonNullSubtype(annotation.element));
     } else if (annotation is FunctionType) {
-      otherType = functionType.type;
+      return _narrowTo(functionType.type);
     } else if (annotation is FutureOrType) {
       // TODO(johnniwinther): Support narrowing of FutureOr.
       return type;
-    } else {
-      assert(annotation is TypeVariableType);
+    } else if (annotation is TypeVariableType) {
       // TODO(ngeoffray): Narrow to bound.
       return type;
+    } else {
+      throw 'Unexpected annotation type $annotation';
     }
-    if (isNullable) {
-      otherType = _abstractValueDomain.includeNull(otherType);
-    }
-    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) return type;
-    TypeInformation newType =
-        new NarrowTypeInformation(_abstractValueDomain, type, otherType);
-    allocatedTypes.add(newType);
-    return newType;
   }
 
   ParameterTypeInformation getInferredTypeOfParameter(Local parameter) {
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 3301d8f..dbe085e 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1013,8 +1013,11 @@
 
   @override
   ir.DartType visitExpressionStatement(ir.ExpressionStatement node) {
-    visitNode(node.expression);
-    return null;
+    if (completes(visitNode(node.expression))) {
+      return null;
+    } else {
+      return const DoesNotCompleteType();
+    }
   }
 
   void handleAsExpression(ir.AsExpression node, ir.DartType operandType) {}
diff --git a/pkg/compiler/lib/src/ir/types.dart b/pkg/compiler/lib/src/ir/types.dart
index 74f42e6..a43e4fe 100644
--- a/pkg/compiler/lib/src/ir/types.dart
+++ b/pkg/compiler/lib/src/ir/types.dart
@@ -12,14 +12,14 @@
 /// Support for subtype checks of kernel based [DartType]s.
 class KernelDartTypes extends DartTypes {
   final IrToElementMap elementMap;
-  @override
-  final bool useNullSafety;
-  @override
-  final bool useLegacySubtyping;
+  final CompilerOptions _options;
 
-  KernelDartTypes(this.elementMap, CompilerOptions options)
-      : useNullSafety = options.useNullSafety,
-        useLegacySubtyping = options.useLegacySubtyping;
+  KernelDartTypes(this.elementMap, this._options);
+
+  @override
+  bool get useNullSafety => _options.useNullSafety;
+  @override
+  bool get useLegacySubtyping => _options.useLegacySubtyping;
 
   @override
   InterfaceType getThisType(ClassEntity cls) {
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 05a38b0..42fea65 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -832,6 +832,9 @@
           _commonElements.specializedIsTop,
           _commonElements.specializedAsTop,
           // no specializedCheckTop
+          _commonElements.specializedIsObject,
+          _commonElements.specializedAsObject,
+          _commonElements.specializedCheckObject,
         ], globalClasses: [
           _commonElements.closureClass, // instanceOrFunctionType uses this.
         ])
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 4511fdf..9144014 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -266,7 +266,7 @@
 
     // 15.1.4 Constructor Properties of the Global Object
     "Object", "Function", "Array", "String", "Boolean", "Number", "Date",
-    "RegExp", "Error", "EvalError", "RangeError", "ReferenceError",
+    "RegExp", "Symbol", "Error", "EvalError", "RangeError", "ReferenceError",
     "SyntaxError", "TypeError", "URIError",
 
     // 15.1.5 Other Properties of the Global Object
@@ -2599,16 +2599,6 @@
         return runtimeTypeName(_commonElements.jsJavaScriptFunctionClass);
       case JsGetName.FUTURE_CLASS_TYPE_NAME:
         return runtimeTypeName(_commonElements.futureClass);
-      case JsGetName.BOOL_RECIPE:
-        return runtimeTypeName(_commonElements.boolClass);
-      case JsGetName.DOUBLE_RECIPE:
-        return runtimeTypeName(_commonElements.doubleClass);
-      case JsGetName.INT_RECIPE:
-        return runtimeTypeName(_commonElements.intClass);
-      case JsGetName.NUM_RECIPE:
-        return runtimeTypeName(_commonElements.numClass);
-      case JsGetName.STRING_RECIPE:
-        return runtimeTypeName(_commonElements.stringClass);
       case JsGetName.RTI_FIELD_IS:
         return instanceFieldPropertyName(_commonElements.rtiIsField);
       default:
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
index ca9bcf9..7b3745f 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -390,22 +390,23 @@
     }
 
     void processCheckedType(DartType type) {
-      if (type is InterfaceType) {
+      var typeWithoutNullability = type.withoutNullability;
+      if (typeWithoutNullability is InterfaceType) {
         // Register that if [cls] needs type arguments then so do the entities
         // that declare type variables occurring in [type].
-        ClassEntity cls = type.element;
-        registerDependencies(_getClassNode(cls), type);
+        ClassEntity cls = typeWithoutNullability.element;
+        registerDependencies(_getClassNode(cls), typeWithoutNullability);
       }
-      if (type is FutureOrType) {
-        // [type] is `FutureOr<X>`.
+      if (typeWithoutNullability is FutureOrType) {
+        // [typeWithoutNullability] is `FutureOr<X>`.
 
         // For the implied `is Future<X>` test, register that if `Future` needs
         // type arguments then so do the entities that declare type variables
         // occurring in `type.typeArgument`.
-        registerDependencies(
-            _getClassNode(commonElements.futureClass), type.typeArgument);
+        registerDependencies(_getClassNode(commonElements.futureClass),
+            typeWithoutNullability.typeArgument);
         // Process `type.typeArgument` for the implied `is X` test.
-        processCheckedType(type.typeArgument);
+        processCheckedType(typeWithoutNullability.typeArgument);
       }
     }
 
@@ -486,11 +487,12 @@
     }
 
     void processType(DartType type, {bool direct: true}) {
-      if (type is FutureOrType) {
+      var typeWithoutNullability = type.withoutNullability;
+      if (typeWithoutNullability is FutureOrType) {
         _getClassNode(commonElements.futureClass).markIndirectTest();
-        processType(type.typeArgument, direct: false);
+        processType(typeWithoutNullability.typeArgument, direct: false);
       } else {
-        type.forEachTypeVariable((TypeVariableType type) {
+        typeWithoutNullability.forEachTypeVariable((TypeVariableType type) {
           processTypeVariableType(type, direct: direct);
         });
       }
@@ -568,10 +570,12 @@
     /// If [type] is of the form `FutureOr<X>`, also register the implicit
     /// is-tests of `Future<X>` and `X`.
     void addImplicitCheck(DartType type) {
-      if (implicitIsChecks.add(type)) {
-        if (type is FutureOrType) {
-          addImplicitCheck(commonElements.futureType(type.typeArgument));
-          addImplicitCheck(type.typeArgument);
+      var typeWithoutNullability = type.withoutNullability;
+      if (implicitIsChecks.add(typeWithoutNullability)) {
+        if (typeWithoutNullability is FutureOrType) {
+          addImplicitCheck(
+              commonElements.futureType(typeWithoutNullability.typeArgument));
+          addImplicitCheck(typeWithoutNullability.typeArgument);
         }
       }
     }
@@ -581,9 +585,11 @@
     }
 
     world.isChecks.forEach((DartType type) {
-      if (type is FutureOrType) {
-        addImplicitCheck(commonElements.futureType(type.typeArgument));
-        addImplicitCheck(type.typeArgument);
+      var typeWithoutNullability = type.withoutNullability;
+      if (typeWithoutNullability is FutureOrType) {
+        addImplicitCheck(
+            commonElements.futureType(typeWithoutNullability.typeArgument));
+        addImplicitCheck(typeWithoutNullability.typeArgument);
       }
     });
 
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index f11f556..c0c4dff 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1942,7 +1942,13 @@
       globals.add(new js.Property(js.string(LEAF_TAGS), new js.LiteralNull()));
     }
 
-    js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals);
+    globals.add(js.Property(
+        js.string(ARRAY_RTI_PROPERTY),
+        js.js(r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
+            r'    ? Symbol("$ti")'
+            r'    : "$ti"')));
+
+    js.ObjectInitializer globalsObject = js.ObjectInitializer(globals);
 
     return js.js.statement('var init = #;', globalsObject);
   }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 5158656..cf04b75 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -9,6 +9,7 @@
 
 import 'package:js_runtime/shared/embedded_names.dart'
     show
+        ARRAY_RTI_PROPERTY,
         DEFERRED_INITIALIZED,
         DEFERRED_LIBRARY_PARTS,
         DEFERRED_PART_URIS,
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 2cf6805..5e5fdd6 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -2250,28 +2250,34 @@
   @override
   DartType getAsyncOrSyncStarElementType(
       AsyncMarker asyncMarker, DartType returnType) {
+    var returnTypeWithoutNullability = returnType.withoutNullability;
     switch (asyncMarker) {
       case AsyncMarker.SYNC:
         return returnType;
       case AsyncMarker.SYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.iterableClass) {
-            return returnType.typeArguments.first;
+        if (returnTypeWithoutNullability is InterfaceType) {
+          if (returnTypeWithoutNullability.element ==
+              elementMap.commonElements.iterableClass) {
+            return returnTypeWithoutNullability.typeArguments.first;
           }
         }
         return dynamicType;
       case AsyncMarker.ASYNC:
-        if (returnType is FutureOrType) return returnType.typeArgument;
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.futureClass) {
-            return returnType.typeArguments.first;
+        if (returnTypeWithoutNullability is FutureOrType) {
+          return returnTypeWithoutNullability.typeArgument;
+        }
+        if (returnTypeWithoutNullability is InterfaceType) {
+          if (returnTypeWithoutNullability.element ==
+              elementMap.commonElements.futureClass) {
+            return returnTypeWithoutNullability.typeArguments.first;
           }
         }
         return dynamicType;
       case AsyncMarker.ASYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.streamClass) {
-            return returnType.typeArguments.first;
+        if (returnTypeWithoutNullability is InterfaceType) {
+          if (returnTypeWithoutNullability.element ==
+              elementMap.commonElements.streamClass) {
+            return returnTypeWithoutNullability.typeArguments.first;
           }
         }
         return dynamicType;
@@ -2461,26 +2467,6 @@
   }
 }
 
-/// [BehaviorBuilder] for kernel based elements.
-class JsBehaviorBuilder extends BehaviorBuilder {
-  @override
-  final ElementEnvironment elementEnvironment;
-  @override
-  final CommonElements commonElements;
-  @override
-  final DiagnosticReporter reporter;
-  @override
-  final NativeBasicData nativeBasicData;
-  final CompilerOptions _options;
-
-  JsBehaviorBuilder(this.elementEnvironment, this.commonElements,
-      this.nativeBasicData, this.reporter, this._options);
-
-  @override
-  bool get trustJSInteropTypeAnnotations =>
-      _options.trustJSInteropTypeAnnotations;
-}
-
 /// [EntityLookup] implementation used to deserialize [JsKernelToElementMap].
 ///
 /// Since data objects and environments are registered together with their
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 1512e6b..ff92060 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -50,6 +50,7 @@
 
 /// A kernel [Target] to configure the Dart Front End for dart2js.
 class Dart2jsTarget extends Target {
+  @override
   final TargetFlags flags;
   @override
   final String name;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 2df6dcb..1c49912 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1475,7 +1475,7 @@
     if (supertype != null) {
       return true;
     }
-    return data.callType is FunctionType;
+    return data.callType?.withoutNullability is FunctionType;
   }
 
   @override
@@ -1869,14 +1869,15 @@
   final DiagnosticReporter reporter;
   @override
   final NativeBasicData nativeBasicData;
-  final CompilerOptions _options;
+  @override
+  final CompilerOptions options;
 
   KernelBehaviorBuilder(this.elementEnvironment, this.commonElements,
-      this.nativeBasicData, this.reporter, this._options);
+      this.nativeBasicData, this.reporter, this.options);
 
   @override
   bool get trustJSInteropTypeAnnotations =>
-      _options.trustJSInteropTypeAnnotations;
+      options.trustJSInteropTypeAnnotations;
 }
 
 class KernelNativeMemberResolver implements NativeMemberResolver {
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index bfdf6ee..a218e6a 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -105,7 +105,10 @@
             _options.librariesSpecificationUri,
             dependencies,
             _options.packageConfig,
-            experimentalFlags: _options.languageExperiments);
+            experimentalFlags: _options.languageExperiments,
+            nnbdMode: _options.useLegacySubtyping
+                ? fe.NnbdMode.Weak
+                : fe.NnbdMode.Strong);
         component = await fe.compile(
             initializedCompilerState,
             false,
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 98a9541..81256fb 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -162,19 +162,6 @@
                 constructor, memberName);
           }
 
-          // TODO(33834): It is a breaking change (at least against in some of
-          // our own tests) but JS-interop constructors should be required to be
-          // external since we otherwise allow creating a Dart object that tries
-          // to pass as a JS-interop class.
-          /*if (!constructor.isExternal) {
-            reporter.reportErrorMessage(constructor,
-                MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR, {
-              'cls': cls.name,
-              'constructor':
-                  constructor.name.isEmpty ? '${cls.name}.' : constructor.name
-            });
-          }*/
-
           if (constructor.isFactoryConstructor && isAnonymous) {
             if (constructor.parameterStructure.positionalParameters > 0) {
               reporter.reportErrorMessage(
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index 3f064b5..21fc93c 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -9,6 +9,7 @@
 import '../elements/types.dart';
 import '../js/js.dart' as js;
 import '../js_backend/native_data.dart' show NativeBasicData;
+import '../options.dart';
 import '../serialization/serialization.dart';
 import '../universe/side_effects.dart' show SideEffects;
 import 'js.dart';
@@ -737,6 +738,8 @@
   NativeBasicData get nativeBasicData;
   bool get trustJSInteropTypeAnnotations;
   ElementEnvironment get elementEnvironment;
+  CompilerOptions get options;
+  DartTypes get dartTypes => commonElements.dartTypes;
 
   NativeBehavior _behavior;
 
@@ -796,6 +799,7 @@
   /// We assume that JS-interop APIs cannot instantiate Dart types or
   /// non-JSInterop native types.
   void _capture(DartType type, bool isJsInterop) {
+    type = type.withoutNullability;
     if (type is FunctionType) {
       FunctionType functionType = type;
       _capture(functionType.returnType, isJsInterop);
@@ -813,9 +817,7 @@
           _behavior.typesInstantiated.add(type);
         }
 
-        if (!trustJSInteropTypeAnnotations ||
-            type is DynamicType ||
-            type == commonElements.objectType) {
+        if (!trustJSInteropTypeAnnotations || dartTypes.isTopType(type)) {
           // By saying that only JS-interop types can be created, we prevent
           // pulling in every other native type (e.g. all of dart:html) when a
           // JS interop API returns dynamic or when we don't trust the type
@@ -842,6 +844,18 @@
     _behavior.sideEffects.setAllSideEffects();
   }
 
+  void _addReturnType(DartType type) {
+    _behavior.typesReturned.add(type.withoutNullability);
+
+    // Breakdown nullable type into TypeWithoutNullability|Null.
+    // Pre-nnbd Declared types are nullable, so we also add null in that case.
+    if (type is NullableType ||
+        type is LegacyType ||
+        (!options.useNullSafety && type is! VoidType)) {
+      _behavior.typesReturned.add(commonElements.nullType);
+    }
+  }
+
   NativeBehavior buildFieldLoadBehavior(
       DartType type,
       Iterable<String> createsAnnotations,
@@ -850,11 +864,9 @@
       {bool isJsInterop}) {
     _behavior = new NativeBehavior();
     // TODO(sigmund,sra): consider doing something better for numeric types.
-    _behavior.typesReturned.add(!isJsInterop || trustJSInteropTypeAnnotations
+    _addReturnType(!isJsInterop || trustJSInteropTypeAnnotations
         ? type
         : commonElements.dynamicType);
-    // Declared types are nullable.
-    _behavior.typesReturned.add(commonElements.nullType);
     _capture(type, isJsInterop);
     _overrideWithAnnotations(
         createsAnnotations, returnsAnnotations, lookupType);
@@ -888,13 +900,9 @@
     // an interop call returns a DOM type and declares a dynamic return type,
     // but otherwise we would include a lot of code by default).
     // TODO(sigmund,sra): consider doing something better for numeric types.
-    _behavior.typesReturned.add(!isJsInterop || trustJSInteropTypeAnnotations
+    _addReturnType(!isJsInterop || trustJSInteropTypeAnnotations
         ? returnType
         : commonElements.dynamicType);
-    if (type.returnType is! VoidType) {
-      // Declared types are nullable.
-      _behavior.typesReturned.add(commonElements.nullType);
-    }
     _capture(type, isJsInterop);
 
     for (DartType type in type.optionalParameterTypes) {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 99c5833..7355060 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -239,6 +239,9 @@
   /// Location of the kernel platform `.dill` files.
   Uri platformBinaries;
 
+  /// Whether to print legacy types as T* rather than T.
+  bool printLegacyStars = false;
+
   /// URI where the compiler should generate the output source map file.
   Uri sourceMapUri;
 
@@ -332,13 +335,13 @@
 
   /// When null-safety is enabled, whether the compiler should emit code with
   /// weak or strong semantics.
-  bool useWeakNullSafetySemantics = false;
+  bool _useWeakNullSafetySemantics = true;
 
   /// 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
   /// warnings.
-  bool get useLegacySubtyping => !useNullSafety || useWeakNullSafetySemantics;
+  bool get useLegacySubtyping => !useNullSafety || _useWeakNullSafetySemantics;
 
   /// The path to the file that contains the profiled allocations.
   ///
@@ -437,6 +440,7 @@
       ..outputUri = _extractUriOption(options, '--out=')
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
+      ..printLegacyStars = _hasOption(options, Flags.printLegacyStars)
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
       ..omitAsCasts = _hasOption(options, Flags.omitAsCasts)
@@ -464,11 +468,7 @@
       ..codegenShards = _extractIntOption(options, '${Flags.codegenShards}=')
       ..cfeOnly = _hasOption(options, Flags.cfeOnly)
       ..debugGlobalInference = _hasOption(options, Flags.debugGlobalInference)
-      // TODO(sigmund): if no flag is specified, the default should depend on
-      // whether the entry point library is opted-in (see
-      // https://github.com/dart-lang/language/pull/779)
-      ..useWeakNullSafetySemantics =
-          _hasOption(options, Flags.noRuntimeNullSafety);
+      .._useWeakNullSafetySemantics = !_hasOption(options, Flags.nullSafety);
   }
 
   void validate() {
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index ee11cdb..d1c2c14 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -391,6 +391,8 @@
         return options.useNullSafety;
       case 'LEGACY':
         return options.useLegacySubtyping;
+      case 'PRINT_LEGACY_STARS':
+        return options.printLegacyStars;
       default:
         return null;
     }
@@ -5246,7 +5248,8 @@
     inputs.addAll(arguments);
 
     AbstractValue typeMask;
-    if (target is FunctionEntity) {
+    if (selector.isGetter && target.isGetter ||
+        !selector.isGetter && target is FunctionEntity) {
       typeMask = _typeInferenceMap.getReturnTypeOf(target);
     } else {
       typeMask = _abstractValueDomain.dynamicType;
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 321de33..cddfa66 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -4543,8 +4543,9 @@
   HInstruction get typeInput => inputs[0];
   HInstruction get checkedInput => inputs[1];
 
-  AbstractBool evaluate(JClosedWorld closedWorld) =>
-      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld);
+  AbstractBool evaluate(JClosedWorld closedWorld, bool useNullSafety) =>
+      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld,
+          useNullSafety);
 
   @override
   accept(HVisitor visitor) => visitor.visitIsTest(this);
@@ -4577,8 +4578,9 @@
 
   HInstruction get checkedInput => inputs[0];
 
-  AbstractBool evaluate(JClosedWorld closedWorld) =>
-      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld);
+  AbstractBool evaluate(JClosedWorld closedWorld, bool useNullSafety) =>
+      _isTestResult(checkedInput, dartType, checkedAbstractValue, closedWorld,
+          useNullSafety);
 
   @override
   accept(HVisitor visitor) => visitor.visitIsTestSimple(this);
@@ -4596,11 +4598,36 @@
   String toString() => 'HIsTestSimple()';
 }
 
-AbstractBool _isTestResult(HInstruction expression, DartType dartType,
-    AbstractValueWithPrecision checkedAbstractValue, JClosedWorld closedWorld) {
+AbstractBool _isTestResult(
+    HInstruction expression,
+    DartType dartType,
+    AbstractValueWithPrecision checkedAbstractValue,
+    JClosedWorld closedWorld,
+    bool useNullSafety) {
   AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
   AbstractValue subsetType = expression.instructionType;
   AbstractValue supersetType = checkedAbstractValue.abstractValue;
+
+  if (useNullSafety &&
+      expression.isNull(abstractValueDomain).isDefinitelyTrue) {
+    if (closedWorld.dartTypes.isTopType(dartType) ||
+        dartType is NullableType ||
+        dartType.isNull) {
+      return AbstractBool.True;
+    }
+    if (dartType is TypeVariableType || dartType is FunctionTypeVariable) {
+      return AbstractBool.Maybe;
+    }
+    if (dartType is LegacyType) {
+      DartType baseType = dartType.baseType;
+      if (baseType is NeverType) return AbstractBool.True;
+      if (baseType is TypeVariableType || baseType is FunctionTypeVariable) {
+        return AbstractBool.Maybe;
+      }
+    }
+    return AbstractBool.False;
+  }
+
   if (checkedAbstractValue.isPrecise &&
       abstractValueDomain.isIn(subsetType, supersetType).isDefinitelyTrue) {
     return AbstractBool.True;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index e8c6a86..5c12d0b 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2123,6 +2123,9 @@
 
   @override
   HInstruction visitAsCheck(HAsCheck node) {
+    // TODO(fishythefish): Correctly constant fold `null as T` (also in
+    // [visitAsCheckSimple]) when running with strong NNBD. We might get this
+    // for free if nullability is precisely propagated to the typemasks.
     if (node.isRedundant(_closedWorld)) return node.checkedInput;
 
     // See if this check can be lowered to a simple one.
@@ -2153,7 +2156,7 @@
 
   @override
   HInstruction visitIsTest(HIsTest node) {
-    AbstractBool result = node.evaluate(_closedWorld);
+    AbstractBool result = node.evaluate(_closedWorld, _options.useNullSafety);
     if (result.isDefinitelyFalse) {
       return _graph.addConstantBool(false, _closedWorld);
     }
@@ -2199,7 +2202,7 @@
 
   @override
   HInstruction visitIsTestSimple(HIsTestSimple node) {
-    AbstractBool result = node.evaluate(_closedWorld);
+    AbstractBool result = node.evaluate(_closedWorld, _options.useNullSafety);
     if (result.isDefinitelyFalse) {
       return _graph.addConstantBool(false, _closedWorld);
     }
diff --git a/pkg/compiler/tool/generate_kernel.dart b/pkg/compiler/tool/generate_kernel.dart
index 9a61b87..39fba2c 100644
--- a/pkg/compiler/tool/generate_kernel.dart
+++ b/pkg/compiler/tool/generate_kernel.dart
@@ -28,9 +28,7 @@
     ..target = new Dart2jsTarget("dart2js", new TargetFlags())
     ..packagesFileUri = Uri.base.resolve('.packages')
     ..setExitCodeOnProblem = true
-    ..linkedDependencies = [
-      Uri.base.resolve(nativeToUriPath(flags['platform']))
-    ];
+    ..additionalDills = [Uri.base.resolve(nativeToUriPath(flags['platform']))];
 
   if (flags.rest.isEmpty) {
     var script = relativizeUri(Uri.base, Platform.script, false);
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index 11e3616..1bb0668 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' show File, Platform, stdin;
+import 'dart:io' show File, Platform;
 
 import 'package:analysis_server_client/handler/connection_handler.dart';
 import 'package:analysis_server_client/handler/notification_handler.dart';
@@ -16,8 +16,12 @@
 import 'package:dartfix/src/context.dart';
 import 'package:dartfix/src/options.dart';
 import 'package:dartfix/src/util.dart';
+import 'package:path/path.dart' as path;
 import 'package:pub_semver/pub_semver.dart';
 
+import 'migrate/display.dart';
+import 'util.dart';
+
 class Driver {
   Context context;
   _Handler handler;
@@ -140,20 +144,7 @@
 
   /// Return `true` if the changes should be applied.
   bool shouldApplyFixes(EditDartfixResult result) {
-    if (result.edits.isEmpty) {
-      logger.stdout('');
-      logger.stdout(result.otherSuggestions.isNotEmpty
-          ? 'None of the recommended changes can be automatically applied.'
-          : 'There are no recommended changes.');
-      return false;
-    }
-    if (overwrite || force) {
-      return true;
-    }
-    logger.stdout('');
-    logger.stdout('Would you like to apply these changes? (yes/no)');
-    var response = stdin.readLineSync();
-    return response.toLowerCase() == 'yes';
+    return overwrite || force;
   }
 
   void showDescriptions(String title, List<DartFixSuggestion> suggestions) {
@@ -241,8 +232,6 @@
     Progress progress;
     if (options.showHelp) {
       progress = logger.progress('${ansi.emphasized('Listing fixes')}');
-    } else if (options.isUpgrade) {
-      progress = logger.progress('${ansi.emphasized('Calculating changes')}');
     } else {
       progress = logger.progress('${ansi.emphasized('Calculating fixes')}');
     }
@@ -280,57 +269,28 @@
         editCount += fileEdit.edits.length;
       }
       logger.stdout('Found $editCount changes in ${fileEdits.length} files.');
+
+      previewFixes(logger, result);
+
       //
-      // Print instructions for opening the preview tool.
+      // Stop the server.
       //
-      var urls = result.urls;
-      if (urls != null) {
-        // Server has already started the preview server.
-        if (result.hasErrors) {
-          // TODO(brianwilkerson) When we have previews for fixes, tailor the
-          //  message to be appropriate for fixes.
-          logger.stdout('');
-          String warning = ansi.emphasized('WARNING');
-          logger.stdout('$warning: The unmodified code contains errors that '
-              'might affect the accuracy of the upgrade.');
-          options.overwrite = false;
-        }
-        if (options.isUpgrade && options.upgradeOptions.preview) {
-          logger.stdout('');
-          String open;
-          if (urls.length == 1) {
-            open = ansi.emphasized('Please open this URL');
-          } else {
-            open = ansi.emphasized('Please open these URLs');
-          }
-          logger.stdout('$open in your browser to see the changes:');
-          for (var url in urls) {
-            logger.stdout('  $url');
-          }
-          logger.stdout('');
-          String enter = ansi.emphasized('ENTER');
-          logger.stdout('When done previewing, press $enter.');
-          stdin.readLineSync();
-        }
-        //
-        // Stop the server.
-        //
-        serverStopped = server.stop();
-        if (shouldApplyFixes(result)) {
-          applyFixes();
-          logger.stdout('Changes have been applied.');
-        } else {
-          logger.stdout('No changes applied.');
-        }
-        await serverStopped;
+      serverStopped = server.stop();
+
+      logger.stdout('');
+
+      // Check if we should apply fixes.
+      if (result.edits.isEmpty) {
+        logger.stdout(result.otherSuggestions.isNotEmpty
+            ? 'None of the recommended changes can be automatically applied.'
+            : 'There are no recommended changes.');
+      } else if (shouldApplyFixes(result)) {
+        applyFixes();
+        logger.stdout('Changes have been applied.');
       } else {
-        //
-        // Stop the server.
-        //
-        serverStopped = server.stop();
-        await printAndApplyFixes();
-        await serverStopped;
+        logger.stdout('Re-run with --overwrite to apply the above changes.');
       }
+      await serverStopped;
     } finally {
       // If we didn't already try to stop the server, then stop it now.
       if (serverStopped == null) {
@@ -398,6 +358,53 @@
 The --$option option is not supported by analysis server version $version.
 Please upgrade to a newer version of the Dart SDK to use this option.''');
   }
+
+  void previewFixes(
+    Logger logger,
+    EditDartfixResult results,
+  ) {
+    final Ansi ansi = logger.ansi;
+
+    Map<String, List<DartFixSuggestion>> fileSuggestions = {};
+    for (DartFixSuggestion suggestion in results.suggestions) {
+      String file = suggestion.location.file;
+      fileSuggestions.putIfAbsent(file, () => <DartFixSuggestion>[]);
+      fileSuggestions[file].add(suggestion);
+    }
+
+    // present a diff-like view
+    for (SourceFileEdit sourceFileEdit in results.edits) {
+      String file = sourceFileEdit.file;
+      String relPath = path.relative(file);
+      int count = sourceFileEdit.edits.length;
+
+      logger.stdout('');
+      logger.stdout('${ansi.emphasized(relPath)} '
+          '($count ${pluralize('change', count)}):');
+
+      String source;
+      try {
+        source = File(file).readAsStringSync();
+      } catch (_) {}
+
+      if (source == null) {
+        logger.stdout('  (unable to retrieve source for file)');
+      } else {
+        SourcePrinter sourcePrinter = SourcePrinter(source);
+
+        List<SourceEdit> edits = sortEdits(sourceFileEdit);
+
+        // Apply edits.
+        sourcePrinter.applyEdits(edits);
+
+        // Render the changed lines.
+        sourcePrinter.processChangedLines((lineNumber, lineText) {
+          String prefix = '  line ${lineNumber.toString().padRight(3)} •';
+          logger.stdout('$prefix ${lineText.trim()}');
+        });
+      }
+    }
+  }
 }
 
 class _Handler
@@ -454,15 +461,15 @@
     if (version > expectedVersion) {
       logger.stdout('''
 This version of dartfix is incompatible with the current Dart SDK.
-Try installing a newer version of dartfix by running
+Try installing a newer version of dartfix by running:
 
     pub global activate dartfix
 ''');
     } else {
       logger.stdout('''
-This version of dartfix is too new to be used with the current Dart SDK.
-Try upgrading the Dart SDK to a newer version
-or installing an older version of dartfix using
+This version of dartfix is too new to be used with the current Dart SDK. Try
+upgrading the Dart SDK to a newer version or installing an older version of
+dartfix using:
 
     pub global activate dartfix <version>
 ''');
diff --git a/pkg/dartfix/lib/src/migrate/apply.dart b/pkg/dartfix/lib/src/migrate/apply.dart
index 0120c5c..290c345 100644
--- a/pkg/dartfix/lib/src/migrate/apply.dart
+++ b/pkg/dartfix/lib/src/migrate/apply.dart
@@ -4,14 +4,11 @@
 
 import 'package:analysis_server_client/protocol.dart';
 
+import '../util.dart';
+
 /// Perform the indicated source edits to the given source, returning the
 /// resulting transformed text.
 String applyEdits(SourceFileEdit sourceFileEdit, String source) {
-  // Sort edits in reverse offset order.
-  List<SourceEdit> edits = sourceFileEdit.edits.toList();
-  edits.sort((a, b) {
-    return b.offset - a.offset;
-  });
-
+  List<SourceEdit> edits = sortEdits(sourceFileEdit);
   return SourceEdit.applySequence(source, edits);
 }
diff --git a/pkg/dartfix/lib/src/migrate/display.dart b/pkg/dartfix/lib/src/migrate/display.dart
index 2099835..d14fd8e 100644
--- a/pkg/dartfix/lib/src/migrate/display.dart
+++ b/pkg/dartfix/lib/src/migrate/display.dart
@@ -41,9 +41,21 @@
 
   SourcePrinter(this.source);
 
-  void deleteRange(int offset, int length) {
-    // \u001b[31m - red
+  void applyEdits(List<SourceEdit> edits) {
+    for (SourceEdit edit in edits) {
+      if (edit.replacement.isNotEmpty) {
+        // an addition
+        insertText(edit.offset + edit.length, edit.replacement);
+      }
 
+      if (edit.length != 0) {
+        // a removal
+        deleteRange(edit.offset, edit.length);
+      }
+    }
+  }
+
+  void deleteRange(int offset, int length) {
     source = source.substring(0, offset) +
         red +
         reversed +
diff --git a/pkg/dartfix/lib/src/migrate/migrate.dart b/pkg/dartfix/lib/src/migrate/migrate.dart
index 8d6a497..d008d1a 100644
--- a/pkg/dartfix/lib/src/migrate/migrate.dart
+++ b/pkg/dartfix/lib/src/migrate/migrate.dart
@@ -13,6 +13,7 @@
 import 'package:cli_util/cli_logging.dart';
 import 'package:path/path.dart' as path;
 
+import '../util.dart';
 import 'apply.dart';
 import 'display.dart';
 import 'options.dart';
@@ -60,17 +61,46 @@
     logger.stdout('Migrating ${options.directory}');
     logger.stdout('');
 
-    Progress progress =
-        logger.progress('${ansi.emphasized('Analyzing project')}');
-
-    Server server =
-        Server(listener: logger.isVerbose ? _ServerListener(logger) : null);
+    Progress getProgress(String message) => options.debug
+        ? SimpleProgress(logger, message)
+        : logger.progress(message);
 
     Map<String, List<AnalysisError>> fileErrors = {};
 
+    bool enableAsserts = false;
+    String instrumentationLogFile;
+    bool profileServer = false;
+    String serverPath = options.serverPath;
+    int servicesPort;
+    String sdkPath = options.sdkPath;
+    bool stdioPassthrough = false;
+
+    if (options.debug) {
+      enableAsserts = true;
+      profileServer = true;
+      servicesPort = 9500;
+      stdioPassthrough = true;
+      instrumentationLogFile = path.join(
+          Directory.systemTemp.createTempSync('migration_debug').path,
+          'instrumentationLog');
+      logger.stdout('Instrumentation log file:  ${instrumentationLogFile}');
+    }
+
+    Progress progress = getProgress('${ansi.emphasized('Analyzing project')}');
+
+    Server server = Server(
+        listener: logger.isVerbose ? _ServerListener(logger) : null,
+        stdioPassthrough: stdioPassthrough);
     try {
       await server.start(
-          clientId: 'dart $name', clientVersion: _dartSdkVersion);
+          clientId: 'dart $name',
+          clientVersion: _dartSdkVersion,
+          enableAsserts: enableAsserts,
+          instrumentationLogFile: instrumentationLogFile,
+          profileServer: profileServer,
+          serverPath: serverPath,
+          servicesPort: servicesPort,
+          sdkPath: sdkPath);
       _ServerNotifications serverNotifications = _ServerNotifications(server);
       await serverNotifications.listenToServer(server);
 
@@ -106,7 +136,7 @@
       int issueCount =
           fileErrors.values.map((list) => list.length).reduce((a, b) => a + b);
       logger.stdout(
-          '$issueCount analysis ${_pluralize('issue', issueCount)} found:');
+          '$issueCount analysis ${pluralize('issue', issueCount)} found:');
       _displayIssues(
         logger,
         options.directory,
@@ -134,9 +164,8 @@
 
     // Calculate migration suggestions.
     logger.stdout('');
-    progress = logger
-        .progress('${ansi.emphasized('Generating migration suggestions')}');
-
+    progress =
+        getProgress('${ansi.emphasized('Generating migration suggestions')}');
     Map<String, dynamic> json;
 
     try {
@@ -163,8 +192,8 @@
         migrationResults.edits.map((edit) => edit.file).toList();
 
     logger.stdout('Found ${allEdits.length} '
-        'suggested ${_pluralize('change', allEdits.length)} in '
-        '${files.length} ${_pluralize('file', files.length)}.');
+        'suggested ${pluralize('change', allEdits.length)} in '
+        '${files.length} ${pluralize('file', files.length)}.');
 
     logger.stdout('');
 
@@ -175,24 +204,30 @@
 
       logger.stdout('');
       logger.stdout(
-          'Applied ${allEdits.length} ${_pluralize('edit', allEdits.length)}.');
+          'Applied ${allEdits.length} ${pluralize('edit', allEdits.length)}.');
 
+      // Note: do not open the web preview if apply-changes is specified, as we
+      // currently cannot tell the web preview to disable the "apply migration"
+      // button.
       return 0;
     }
 
     if (options.webPreview) {
       String url = migrationResults.urls.first;
 
-      logger.stdout(ansi.emphasized('Migration results available:'));
-      logger.stdout('Visit $url to see the migration results.');
+      logger.stdout(ansi.emphasized('View migration results:'));
 
       // TODO(devoncarew): Open a browser automatically.
+      logger.stdout('''
+Visit:
+  
+  ${ansi.emphasized(url)}
 
-      logger.stdout('');
-      logger.stdout('To apply these changes, re-run the tool with '
-          '--${MigrateOptions.applyChangesOption}.');
+to see the migration results. Use the interactive web view to review, improve, or apply
+the results (alternatively, to apply the results without using the web preview, re-run
+the tool with --${MigrateOptions.applyChangesOption}).
+''');
 
-      logger.stdout('');
       logger.stdout('When finished with the preview, hit ctrl-c '
           'to terminate this process.');
 
@@ -284,7 +319,7 @@
 
       logger.stdout('');
       logger.stdout('${ansi.emphasized(relPath)} '
-          '($count ${_pluralize('change', count)}):');
+          '($count ${pluralize('change', count)}):');
 
       String source;
       try {
@@ -296,24 +331,10 @@
       } else {
         SourcePrinter sourcePrinter = SourcePrinter(source);
 
-        // Sort edits in reverse offset order.
-        List<SourceEdit> edits = sourceFileEdit.edits;
-        edits.sort((a, b) {
-          return b.offset - a.offset;
-        });
+        List<SourceEdit> edits = sortEdits(sourceFileEdit);
 
-        for (SourceEdit edit in sourceFileEdit.edits) {
-          if (edit.replacement.isNotEmpty) {
-            // an addition
-            sourcePrinter.insertText(
-                edit.offset + edit.length, edit.replacement);
-          }
-
-          if (edit.length != 0) {
-            // a removal
-            sourcePrinter.deleteRange(edit.offset, edit.length);
-          }
-        }
+        // Apply edits.
+        sourcePrinter.applyEdits(edits);
 
         // Render the changed lines.
         sourcePrinter.processChangedLines((lineNumber, lineText) {
@@ -333,7 +354,7 @@
     for (SourceFileEdit sourceFileEdit in migrationResults.edits) {
       String relPath = path.relative(sourceFileEdit.file, from: directory);
       int count = sourceFileEdit.edits.length;
-      logger.stdout('  $relPath ($count ${_pluralize('change', count)})');
+      logger.stdout('  $relPath ($count ${pluralize('change', count)})');
 
       String source;
       try {
@@ -441,5 +462,3 @@
 
   return version;
 }
-
-String _pluralize(String word, int count) => count == 1 ? word : '${word}s';
diff --git a/pkg/dartfix/lib/src/migrate/options.dart b/pkg/dartfix/lib/src/migrate/options.dart
index d72394a..20e2e67 100644
--- a/pkg/dartfix/lib/src/migrate/options.dart
+++ b/pkg/dartfix/lib/src/migrate/options.dart
@@ -9,17 +9,27 @@
 import 'package:path/path.dart' as path;
 
 class MigrateOptions {
-  static const ignoreErrorsOption = 'ignore-errors';
   static const applyChangesOption = 'apply-changes';
+  static const debugOption = 'debug';
+  static const ignoreErrorsOption = 'ignore-errors';
+  static const sdkPathOption = 'sdk-path';
+  static const serverPathOption = 'server-path';
+  static const webPreviewOption = 'web-preview';
 
-  final String directory;
   final bool applyChanges;
+  final bool debug;
+  final String directory;
   final bool ignoreErrors;
+  final String serverPath;
+  final String sdkPath;
   final bool webPreview;
 
   MigrateOptions(ArgResults argResults, this.directory)
       : applyChanges = argResults[applyChangesOption] as bool,
+        debug = argResults[debugOption] as bool,
         ignoreErrors = argResults[ignoreErrorsOption] as bool,
+        sdkPath = argResults[sdkPathOption] as String,
+        serverPath = argResults[serverPathOption] as String,
         webPreview = argResults['web-preview'] as bool;
 
   String get directoryAbsolute => Directory(path.canonicalize(directory)).path;
@@ -37,14 +47,32 @@
       help: 'Apply the proposed null safety changes to the files on disk.',
     );
     argParser.addFlag(
+      debugOption,
+      defaultsTo: false,
+      hide: true,
+      negatable: true,
+      help: 'Show (very verbose) debugging information to stdout during '
+          'migration',
+    );
+    argParser.addFlag(
       ignoreErrorsOption,
       defaultsTo: false,
       negatable: false,
       help: 'Attempt to perform null safety analysis even if there are '
           'analysis errors in the project.',
     );
+    argParser.addOption(
+      sdkPathOption,
+      hide: true,
+      help: 'Override the SDK path used for migration.',
+    );
+    argParser.addOption(
+      serverPathOption,
+      hide: true,
+      help: 'Override the analysis server path used for migration.',
+    );
     argParser.addFlag(
-      'web-preview',
+      webPreviewOption,
       defaultsTo: true,
       negatable: true,
       help: 'Show an interactive preview of the proposed null safety changes '
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
index 24a5d37..b6d2cbb 100644
--- a/pkg/dartfix/lib/src/options.dart
+++ b/pkg/dartfix/lib/src/options.dart
@@ -21,11 +21,9 @@
 
 const _binaryName = 'dartfix';
 const _colorOption = 'color';
-const _dependencies = 'migrate-dependencies';
 
 // options only supported by server 1.22.2 and greater
 const _helpOption = 'help';
-const _previewOption = 'preview';
 const _serverSnapshot = 'server';
 
 // options not supported yet by any server
@@ -36,7 +34,6 @@
   final Context context;
   Logger logger;
 
-  UpgradeOptions upgradeOptions;
   List<String> targets;
   final String sdkPath;
   final String serverSnapshot;
@@ -66,8 +63,6 @@
             : null,
         verbose = results[_verboseOption] as bool;
 
-  bool get isUpgrade => upgradeOptions != null;
-
   String makeAbsoluteAndNormalize(String target) {
     if (!path.isAbsolute(target)) {
       target = path.join(context.workingDir, target);
@@ -118,21 +113,6 @@
           help: 'Use ansi colors when printing messages.',
           defaultsTo: Ansi.terminalSupportsAnsi);
 
-    //
-    // Commands.
-    //
-    parser.addCommand('upgrade')
-      ..addFlag(_dependencies,
-          help: 'Upgrade dependencies automatically (not yet implemented)',
-          defaultsTo: false,
-          negatable: true,
-          hide: true)
-      ..addFlag(_previewOption,
-          help: 'Open the preview tool to view changes.',
-          defaultsTo: true,
-          negatable: true,
-          hide: true);
-
     context ??= Context();
 
     ArgResults results;
@@ -177,43 +157,6 @@
       context.exit(19);
     }
 
-    var command = results.command;
-    if (command != null) {
-      if (command.name == 'upgrade') {
-        options.upgradeOptions = UpgradeOptions._fromCommand(results.command);
-        var rest = command.rest;
-        if (rest.isNotEmpty) {
-          if (rest[0] == 'sdk') {
-            if (results.wasParsed(includeFixOption)) {
-              logger.stderr('Cannot define includeFixes when using upgrade.');
-              context.exit(22);
-            }
-            if (results.wasParsed(excludeFixOption)) {
-              logger.stderr('Cannot define excludeFixes when using upgrade.');
-              context.exit(22);
-            }
-            if (results.wasParsed(pedanticOption) && options.pedanticFixes) {
-              logger.stderr('Cannot use pedanticFixes when using upgrade.');
-              context.exit(22);
-            }
-            // TODO(jcollins-g): prevent non-nullable outside of upgrade
-            // command.
-            options.includeFixes.add('non-nullable');
-            if (rest.length > 1) {
-              options.targets = command.rest.sublist(1);
-            } else {
-              options.targets = [Directory.current.path];
-            }
-          } else {
-            logger
-                .stderr('Missing or invalid specification of what to upgrade.');
-            logger.stderr("(Currently 'sdk' is the only supported option.)");
-            context.exit(22);
-          }
-        }
-      }
-    }
-
     // Check for files and/or directories to analyze.
     if (options.targets == null || options.targets.isEmpty) {
       logger.stderr('Expected at least one file or directory to analyze.');
@@ -265,13 +208,3 @@
         : '');
   }
 }
-
-/// Command line options for `dartfix upgrade`.
-class UpgradeOptions {
-  final bool dependencies;
-  final bool preview;
-
-  UpgradeOptions._fromCommand(ArgResults results)
-      : dependencies = results[_dependencies] as bool,
-        preview = results[_previewOption] as bool;
-}
diff --git a/pkg/dartfix/lib/src/util.dart b/pkg/dartfix/lib/src/util.dart
index b3935f8..07ad858 100644
--- a/pkg/dartfix/lib/src/util.dart
+++ b/pkg/dartfix/lib/src/util.dart
@@ -56,3 +56,14 @@
       ? message.substring(0, message.length - 1)
       : message;
 }
+
+String pluralize(String word, int count) => count == 1 ? word : '${word}s';
+
+List<SourceEdit> sortEdits(SourceFileEdit sourceFileEdit) {
+  // Sort edits in reverse offset order.
+  List<SourceEdit> edits = sourceFileEdit.edits.toList();
+  edits.sort((a, b) {
+    return b.offset - a.offset;
+  });
+  return edits;
+}
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
index ff91250..9843fab 100644
--- a/pkg/dartfix/test/src/options_test.dart
+++ b/pkg/dartfix/test/src/options_test.dart
@@ -139,29 +139,6 @@
   test('verbose', () {
     parse(['--verbose', 'foo'], verbose: true);
   });
-
-  group('upgrade', () {
-    group('sdk', () {
-      test('no target', () {
-        var options = parse(['upgrade', 'sdk'], includeFixes: ['non-nullable']);
-        expect(options.targets, hasLength(1));
-      });
-
-      test('target', () {
-        var target = p('/pkg/foo');
-        var options =
-            parse(['upgrade', 'sdk', target], includeFixes: ['non-nullable']);
-        expect(options.targets, [target]);
-      });
-
-      test('dependencies', () {
-        var options = parse(
-            ['upgrade', 'sdk', '--migrate-dependencies', p('/pkg/foo')],
-            includeFixes: ['non-nullable']);
-        expect(options.upgradeOptions.dependencies, isTrue);
-      });
-    });
-  });
 }
 
 void expectContains(Iterable<String> collection, String suffix) {
@@ -172,9 +149,3 @@
   }
   fail('Expected one of $collection\n  to end with "$suffix"');
 }
-
-void expectOneFileTarget(Options options, String fileName) {
-  expect(options.targets, hasLength(1));
-  final target = options.targets[0];
-  expect(target.endsWith(fileName), isTrue);
-}
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 435c241..cc4011d 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -66,9 +66,6 @@
   /// This is required for a modular build process.
   final bool summarizeApi;
 
-  /// Whether to preserve metdata only accessible via mirrors.
-  final bool emitMetadata;
-
   // Whether to enable assertions.
   final bool enableAsserts;
 
@@ -98,7 +95,6 @@
       {this.sourceMap = true,
       this.inlineSourceMap = false,
       this.summarizeApi = true,
-      this.emitMetadata = false,
       this.enableAsserts = true,
       this.replCompile = false,
       this.summaryModules = const {},
@@ -112,7 +108,6 @@
             sourceMap: args['source-map'] as bool,
             inlineSourceMap: args['inline-source-map'] as bool,
             summarizeApi: args['summarize'] as bool,
-            emitMetadata: args['emit-metadata'] as bool,
             enableAsserts: args['enable-asserts'] as bool,
             experiments: parseExperimentalArguments(
                 args['enable-experiment'] as List<String>),
@@ -139,8 +134,6 @@
           help: 'emit source mapping', defaultsTo: true, hide: hide)
       ..addFlag('inline-source-map',
           help: 'emit source mapping inline', defaultsTo: false, hide: hide)
-      ..addFlag('emit-metadata',
-          help: 'emit metadata annotations queriable via mirrors', hide: hide)
       ..addFlag('enable-asserts',
           help: 'enable assertions', defaultsTo: true, hide: hide)
       ..addOption('module-name',
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index b7524cc..04b3e86 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -255,11 +255,11 @@
 
   var compileSdk = argResults['compile-sdk'] == true;
   var oldCompilerState = compilerState;
-  List<Component> doneInputSummaries;
+  List<Component> doneAdditionalDills;
   fe.IncrementalCompiler incrementalCompiler;
   fe.WorkerInputComponent cachedSdkInput;
   var recordUsedInputs = argResults['used-inputs-file'] != null;
-  var inputSummaries = summaryModules.keys.toList();
+  var additionalDills = summaryModules.keys.toList();
   if (!useIncrementalCompiler) {
     compilerState = await fe.initializeCompiler(
         oldCompilerState,
@@ -268,7 +268,7 @@
         compileSdk ? null : sourcePathToUri(sdkSummaryPath),
         sourcePathToUri(packageFile),
         sourcePathToUri(librarySpecPath),
-        inputSummaries,
+        additionalDills,
         DevCompilerTarget(TargetFlags(
             trackWidgetCreation: trackWidgetCreation,
             enableNullSafety: options.enableNullSafety)),
@@ -290,7 +290,7 @@
       }
     }
 
-    doneInputSummaries = List<Component>(summaryModules.length);
+    doneAdditionalDills = List<Component>(summaryModules.length);
     compilerState = await fe.initializeIncrementalCompiler(
         oldCompilerState,
         {
@@ -298,13 +298,13 @@
           'multiRootScheme=${fileSystem.markerScheme}',
           'multiRootRoots=${fileSystem.roots}',
         },
-        doneInputSummaries,
+        doneAdditionalDills,
         compileSdk,
         sourcePathToUri(getSdkPath()),
         compileSdk ? null : sourcePathToUri(sdkSummaryPath),
         sourcePathToUri(packageFile),
         sourcePathToUri(librarySpecPath),
-        inputSummaries,
+        additionalDills,
         inputDigests,
         DevCompilerTarget(TargetFlags(
             trackWidgetCreation: trackWidgetCreation,
@@ -332,7 +332,7 @@
     var incrementalComponent = await incrementalCompiler.computeDelta(
         entryPoints: inputs, fullComponent: true);
     result = fe.DdcResult(incrementalComponent, cachedSdkInput.component,
-        doneInputSummaries, incrementalCompiler.userCode.loader.hierarchy);
+        doneAdditionalDills, incrementalCompiler.userCode.loader.hierarchy);
   }
   compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
 
@@ -348,10 +348,6 @@
     if (!librariesFromDill.contains(lib)) compiledLibraries.libraries.add(lib);
   }
 
-  if (!options.emitMetadata && _checkForDartMirrorsImport(compiledLibraries)) {
-    return CompilerResult(1, kernelState: compilerState);
-  }
-
   // Output files can be written in parallel, so collect the futures.
   var outFiles = <Future>[];
   if (argResults['summarize'] as bool) {
@@ -390,13 +386,13 @@
 
   final importToSummary = Map<Library, Component>.identity();
   final summaryToModule = Map<Component, String>.identity();
-  for (var i = 0; i < result.inputSummaries.length; i++) {
-    var summary = result.inputSummaries[i];
-    var moduleImport = summaryModules[inputSummaries[i]];
-    for (var l in summary.libraries) {
+  for (var i = 0; i < result.additionalDills.length; i++) {
+    var additionalDill = result.additionalDills[i];
+    var moduleImport = summaryModules[additionalDills[i]];
+    for (var l in additionalDill.libraries) {
       assert(!importToSummary.containsKey(l));
-      importToSummary[l] = summary;
-      summaryToModule[summary] = moduleImport;
+      importToSummary[l] = additionalDill;
+      summaryToModule[additionalDill] = moduleImport;
     }
   }
 
@@ -631,21 +627,6 @@
 
 final defaultLibrarySpecPath = p.join(getSdkPath(), 'lib', 'libraries.json');
 
-bool _checkForDartMirrorsImport(Component component) {
-  for (var library in component.libraries) {
-    if (library.importUri.scheme == 'dart') continue;
-    for (var dep in library.dependencies) {
-      var uri = dep.targetLibrary.importUri;
-      if (uri.scheme == 'dart' && uri.path == 'mirrors') {
-        print('${library.importUri}: Error: Cannot import "dart:mirrors" '
-            'in web applications (https://goo.gl/R1anEs).');
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
 /// Returns the absolute path to the default `.packages` file, or `null` if one
 /// could not be found.
 ///
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 1ff7e3c..e36af94 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -348,15 +348,15 @@
     // emitted before dart.defineLazy.
     if (_constLazyAccessors.isNotEmpty) {
       var constTableBody = runtimeStatement(
-          'defineLazy(#, { # })', [_constTable, _constLazyAccessors]);
+          'defineLazy(#, { # }, false)', [_constTable, _constLazyAccessors]);
       moduleItems.insert(_constTableInsertionIndex, constTableBody);
       _constLazyAccessors.clear();
     }
 
     // Add assert locations
     _uriMap.forEach((location, id) {
-      moduleItems
-          .add(js.statement('var # = #;', [id, js.escapedString(location)]));
+      moduleItems.insert(_constTableInsertionIndex,
+          js.statement('var # = #;', [id, js.escapedString(location)]));
     });
 
     moduleItems.addAll(afterClassDefItems);
@@ -588,13 +588,18 @@
 
     var finishGenericTypeTest = _emitClassTypeTests(c, className, body);
 
+    // Attach caches on all canonicalized types not in our runtime.
+    // Types in the runtime will have caches attached in their constructors.
+    if (!isSdkInternalRuntime(_currentLibrary)) {
+      body.add(runtimeStatement('addTypeCaches(#)', [className]));
+    }
+
     _emitVirtualFieldSymbols(c, body);
     _emitClassSignature(c, className, body);
     _initExtensionSymbols(c);
     if (!c.isMixinDeclaration) {
       _defineExtensionMembers(className, body);
     }
-    _emitClassMetadata(c.annotations, className, body);
 
     var classDef = js_ast.Statement.from(body);
     var typeFormals = c.typeParameters;
@@ -1156,19 +1161,6 @@
     }
   }
 
-  void _emitClassMetadata(List<Expression> metadata,
-      js_ast.Expression className, List<js_ast.Statement> body) {
-    // Metadata
-    if (_options.emitMetadata && metadata.isNotEmpty) {
-      body.add(js.statement('#[#.metadata] = #;', [
-        className,
-        runtimeModule,
-        _arrowFunctionWithLetScope(() => js_ast.ArrayInitializer(
-            metadata.map(_instantiateAnnotation).toList()))
-      ]));
-    }
-  }
-
   /// Ensure `dartx.` symbols we will use are present.
   void _initExtensionSymbols(Class c) {
     if (_extensionTypes.hasNativeSubtype(c) || c == _coreTypes.objectClass) {
@@ -1266,7 +1258,7 @@
     for (var member in classProcedures) {
       // Static getters/setters/methods cannot be called with dynamic dispatch,
       // nor can they be torn off.
-      if (!_options.emitMetadata && member.isStatic) continue;
+      if (member.isStatic) continue;
 
       var name = member.name.name;
       var reifiedType = _memberRuntimeType(member, c) as FunctionType;
@@ -1287,14 +1279,11 @@
       if (needsSignature) {
         js_ast.Expression type;
         if (member.isAccessor) {
-          type = _emitAnnotatedResult(
-              _emitType(member.isGetter
-                  ? reifiedType.returnType
-                  : reifiedType.positionalParameters[0]),
-              member.annotations,
-              member);
+          type = _emitType(member.isGetter
+              ? reifiedType.returnType
+              : reifiedType.positionalParameters[0]);
         } else {
-          type = _emitAnnotatedFunctionType(reifiedType, member);
+          type = visitFunctionType(reifiedType, member: member);
         }
         var property = js_ast.Property(_declareMemberName(member), type);
         var signatures = getSignatureList(member);
@@ -1323,7 +1312,7 @@
     for (var field in classFields) {
       // Only instance fields need to be saved for dynamic dispatch.
       var isStatic = field.isStatic;
-      if (!_options.emitMetadata && isStatic) continue;
+      if (isStatic) continue;
 
       var memberName = _declareMemberName(field);
       var fieldSig = _emitFieldSignature(field, c);
@@ -1333,24 +1322,6 @@
     emitSignature('Field', instanceFields);
     emitSignature('StaticField', staticFields);
 
-    if (_options.emitMetadata) {
-      var constructors = <js_ast.Property>[];
-      var allConstructors = [
-        ...c.constructors,
-        ...c.procedures.where((p) => p.isFactory),
-      ];
-      for (var ctor in allConstructors) {
-        var memberName = _constructorName(ctor.name.name);
-        var type = _emitAnnotatedFunctionType(
-            ctor.function
-                .computeThisFunctionType(c.enclosingLibrary.nonNullable)
-                .withoutTypeParameters,
-            ctor);
-        constructors.add(js_ast.Property(memberName, type));
-      }
-      emitSignature('Constructor', constructors);
-    }
-
     // Add static property dart._runtimeType to Object.
     // All other Dart classes will (statically) inherit this property.
     if (c == _coreTypes.objectClass) {
@@ -1364,16 +1335,6 @@
   js_ast.Expression _emitFieldSignature(Field field, Class fromClass) {
     var type = _typeFromClass(field.type, field.enclosingClass, fromClass);
     var args = [_emitType(type)];
-    var annotations = field.annotations;
-    if (_options.emitMetadata &&
-        annotations != null &&
-        annotations.isNotEmpty) {
-      var savedUri = _currentUri;
-      _currentUri = field.enclosingClass.fileUri;
-      args.add(js_ast.ArrayInitializer(
-          annotations.map(_instantiateAnnotation).toList()));
-      _currentUri = savedUri;
-    }
     return runtimeCall(
         field.isFinal ? 'finalFieldType(#)' : 'fieldType(#)', [args]);
   }
@@ -2061,9 +2022,6 @@
         ]) as js_ast.Fun);
   }
 
-  js_ast.Expression _instantiateAnnotation(Expression node) =>
-      _visitExpression(node);
-
   void _registerExtensionType(
       Class c, String jsPeerName, List<js_ast.Statement> body) {
     var className = _emitTopLevelName(c);
@@ -2148,10 +2106,13 @@
       }
       _staticTypeContext.leaveMember(field);
     }
-    _currentUri = _currentLibrary.fileUri;
-
     _currentUri = savedUri;
-    return runtimeStatement('defineLazy(#, { # })', [objExpr, accessors]);
+
+    return runtimeStatement('defineLazy(#, { # }, #)', [
+      objExpr,
+      accessors,
+      js.boolean(!_currentLibrary.isNonNullableByDefault)
+    ]);
   }
 
   js_ast.Fun _emitStaticFieldInitializer(Field field) {
@@ -2175,19 +2136,6 @@
     return body;
   }
 
-  js_ast.ArrowFun _arrowFunctionWithLetScope(
-      js_ast.Expression Function() visitBody) {
-    var savedLetVariables = _letVariables;
-    _letVariables = [];
-
-    var expr = visitBody();
-    var letVars = _initLetVariables();
-
-    _letVariables = savedLetVariables;
-    return js_ast.ArrowFun(
-        [], letVars == null ? expr : js_ast.Block([letVars, expr.toReturn()]));
-  }
-
   js_ast.PropertyAccess _emitTopLevelName(NamedNode n, {String suffix = ''}) {
     return _emitJSInterop(n) ?? _emitTopLevelNameNoInterop(n, suffix: suffix);
   }
@@ -2534,18 +2482,6 @@
     var nameExpr = _emitTopLevelName(p);
     body.add(js.statement('# = #',
         [nameExpr, js_ast.NamedFunction(_emitTemporaryId(p.name.name), fn)]));
-    // Function types of top-level/static functions are only needed when
-    // dart:mirrors is enabled.
-    // TODO(jmesserly): do we even need this for mirrors, since statics are not
-    // commonly reflected on?
-    if (_options.emitMetadata && _reifyFunctionType(p.function)) {
-      body.add(_emitFunctionTagged(
-              nameExpr,
-              p.function
-                  .computeThisFunctionType(p.enclosingLibrary.nonNullable),
-              topLevel: true)
-          .toStatement());
-    }
 
     _currentUri = savedUri;
     _staticTypeContext.leaveMember(p);
@@ -2881,24 +2817,6 @@
     return _emitNullabilityWrapper(typeRep, type.nullability);
   }
 
-  js_ast.Expression _emitAnnotatedFunctionType(
-      FunctionType type, Member member) {
-    var result = visitFunctionType(type, member: member);
-
-    var annotations = member.annotations;
-    if (_options.emitMetadata && annotations.isNotEmpty) {
-      // TODO(jmesserly): should we disable source info for annotations?
-      var savedUri = _currentUri;
-      _currentUri = member.enclosingClass.fileUri;
-      result = js_ast.ArrayInitializer([
-        result,
-        for (var annotation in annotations) _instantiateAnnotation(annotation)
-      ]);
-      _currentUri = savedUri;
-    }
-    return result;
-  }
-
   /// Emits an expression that lets you access statics on a [type] from code.
   js_ast.Expression _emitConstructorAccess(InterfaceType type) {
     return _emitJSInterop(type.classNode) ??
@@ -2917,21 +2835,6 @@
     return _emitTopLevelName(c);
   }
 
-  // Wrap a result - usually a type - with its metadata.  The runtime is
-  // responsible for unpacking this.
-  js_ast.Expression _emitAnnotatedResult(
-      js_ast.Expression result, List<Expression> metadata, Member member) {
-    if (_options.emitMetadata && metadata.isNotEmpty) {
-      // TODO(jmesserly): should we disable source info for annotations?
-      var savedUri = _currentUri;
-      _currentUri = member.enclosingClass.fileUri;
-      result = js_ast.ArrayInitializer(
-          [result, for (var value in metadata) _instantiateAnnotation(value)]);
-      _currentUri = savedUri;
-    }
-    return result;
-  }
-
   /// Emits named parameters in the form '{name: type}'.
   js_ast.ObjectInitializer _emitTypeProperties(Iterable<NamedType> types) {
     return js_ast.ObjectInitializer(types
@@ -2943,17 +2846,8 @@
   ///
   /// Annotatable contexts include typedefs and method/function declarations.
   js_ast.ArrayInitializer _emitTypeNames(List<DartType> types,
-      List<VariableDeclaration> parameters, Member member) {
-    var result = <js_ast.Expression>[];
-    for (var i = 0; i < types.length; ++i) {
-      var type = _emitType(types[i]);
-      if (parameters != null) {
-        type = _emitAnnotatedResult(type, parameters[i].annotations, member);
-      }
-      result.add(type);
-    }
-    return js_ast.ArrayInitializer(result);
-  }
+          List<VariableDeclaration> parameters, Member member) =>
+      js_ast.ArrayInitializer([for (var type in types) _emitType(type)]);
 
   @override
   js_ast.Expression visitTypeParameterType(TypeParameterType type) =>
@@ -3279,7 +3173,8 @@
         body.add(js.statement('if (# == null) return false;', [jsParam]));
       } else if (_annotatedNullCheck(p.annotations)) {
         body.add(_nullParameterCheck(jsParam));
-      } else if (_mustBeNonNullable(p.type)) {
+      } else if (_mustBeNonNullable(p.type) &&
+          !_annotatedNotNull(p.annotations)) {
         // TODO(vsm): Remove if / when CFE does this:
         // https://github.com/dart-lang/sdk/issues/40597
         // The check on `p.type` is per:
@@ -3335,6 +3230,9 @@
   bool _annotatedNullCheck(List<Expression> annotations) =>
       annotations.any(_nullableInference.isNullCheckAnnotation);
 
+  bool _annotatedNotNull(List<Expression> annotations) =>
+      annotations.any(_nullableInference.isNotNullAnnotation);
+
   bool _reifyGenericFunction(Member m) =>
       m == null ||
       m.enclosingLibrary.importUri.scheme != 'dart' ||
@@ -4857,21 +4755,35 @@
     if (target.isFactory) return _emitFactoryInvocation(node);
 
     // Optimize some internal SDK calls.
-    if (isSdkInternalRuntime(target.enclosingLibrary) &&
-        node.arguments.positional.length == 1) {
-      var name = target.name.name;
-      var firstArg = node.arguments.positional[0];
-      if (name == 'getGenericClass' && firstArg is TypeLiteral) {
-        var type = firstArg.type;
-        if (type is InterfaceType) {
-          return _emitTopLevelNameNoInterop(type.classNode, suffix: '\$');
+    if (isSdkInternalRuntime(target.enclosingLibrary)) {
+      if (node.arguments.positional.length == 1) {
+        var name = target.name.name;
+        var firstArg = node.arguments.positional[0];
+        if (name == 'getGenericClass' && firstArg is TypeLiteral) {
+          var type = firstArg.type;
+          if (type is InterfaceType) {
+            return _emitTopLevelNameNoInterop(type.classNode, suffix: '\$');
+          }
         }
-      }
-      if (name == 'unwrapType' && firstArg is TypeLiteral) {
-        return _emitType(firstArg.type);
-      }
-      if (name == 'extensionSymbol' && firstArg is StringLiteral) {
-        return getExtensionSymbolInternal(firstArg.value);
+        if (name == 'unwrapType' && firstArg is TypeLiteral) {
+          return _emitType(firstArg.type);
+        }
+        if (name == 'extensionSymbol' && firstArg is StringLiteral) {
+          return getExtensionSymbolInternal(firstArg.value);
+        }
+      } else if (node.arguments.positional.length == 2) {
+        var name = target.name.name;
+        var firstArg = node.arguments.positional[0];
+        var secondArg = node.arguments.positional[1];
+        if (name == '_jsInstanceOf' && secondArg is TypeLiteral) {
+          return js.call('# instanceof #',
+              [_visitExpression(firstArg), _emitType(secondArg.type)]);
+        }
+
+        if (name == '_equalType' && secondArg is TypeLiteral) {
+          return js.call('# === #',
+              [_visitExpression(firstArg), _emitType(secondArg.type)]);
+        }
       }
     }
     if (target == _coreTypes.identicalProcedure) {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 82341ab..acf7573 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -23,6 +23,7 @@
 class DevCompilerTarget extends Target {
   DevCompilerTarget(this.flags);
 
+  @override
   final TargetFlags flags;
 
   WidgetCreatorTracker _widgetTracker;
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index 22cd4cc..1a63f96 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -1,6 +1,6 @@
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|2688|17|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3628|5|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3656|5|6|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
+ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|2689|17|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
+ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3629|5|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
+ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3657|5|6|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '&': int.& (int Function(int)), JSNumber.& (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '<<': int.<< (int Function(int)), JSNumber.<< (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '>>': int.>> (int Function(int)), JSNumber.>> (num Function(num)).
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index c9b519d..07bb9a3 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -7,7 +7,8 @@
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
-import 'package:kernel/ast.dart' as kernel show Library;
+import 'package:kernel/default_language_version.dart' as kernel
+    show defaultLanguageVersionMajor, defaultLanguageVersionMinor;
 
 import 'package:kernel/target/targets.dart' show Target;
 
@@ -24,6 +25,8 @@
 
 import 'standard_file_system.dart' show StandardFileSystem;
 
+import '../api_unstable/util.dart';
+
 export 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage;
 
@@ -65,29 +68,14 @@
   /// will be used.
   Uri packagesFileUri;
 
-  /// URIs of input summary files (excluding the SDK summary; typically these
-  /// will be "file:" URIs).
+  /// URIs of additional dill files.
   ///
-  /// These files should be summary files generated by this package (and not the
-  /// similarly named summary files from `package:analyzer`.)
+  /// These will be loaded and linked into the output.
   ///
-  /// Summaries may be provided in any order, but they should be acyclic and
-  /// closed: any libraries that they reference should be defined in either one
-  /// of [inputSummaries] or [sdkSummary].
-  List<Uri> inputSummaries = [];
-
-  /// URIs of other kernel components to link.
-  ///
-  /// Commonly used to link the code for the SDK libraries that was compiled
-  /// separately. For example, dart2js needs to link the SDK so it can
-  /// optimize and tree-shake the code for the application, whereas the VM
-  /// always embeds the SDK internally and doesn't need it as part of the
-  /// program.
-  ///
-  /// The components provided here should be closed and acyclic: any libraries
-  /// that they reference should be defined in a component in
-  /// [linkedDependencies] or any of the [inputSummaries] or [sdkSummary].
-  List<Uri> linkedDependencies = [];
+  /// The components provided here should be closed: any libraries that they
+  /// reference should be defined in a component in [additionalDills] or
+  /// [sdkSummary].
+  List<Uri> additionalDills = [];
 
   /// URI of the SDK summary file (typically a "file:" URI).
   ///
@@ -116,7 +104,7 @@
   /// When this option is `true`, [sdkSummary] must be null.
   bool compileSdk = false;
 
-  @deprecated
+  @Deprecated("Unused internally.")
   bool chaseDependencies;
 
   /// Patch files to apply on the core libraries for a specific target platform.
@@ -133,6 +121,7 @@
   /// directly, while relative URIs are resolved from the [sdkRoot].
   // TODO(sigmund): provide also a flag to load this data from a file (like
   // libraries.json)
+  @Deprecated("Unused internally.")
   Map<String, List<Uri>> targetPatches = <String, List<Uri>>{};
 
   /// Enable or disable experimental features. Features mapping to `true` are
@@ -167,6 +156,7 @@
 
   /// Deprecated. Has no affect on front-end.
   // TODO(dartbug.com/37514) Remove this field once DDK removes its uses of it.
+  @Deprecated("Unused internally.")
   bool enableAsserts = false;
 
   /// Whether to show verbose messages (mainly for debugging and performance
@@ -243,9 +233,68 @@
   /// The current sdk version string, e.g. "2.6.0-edge.sha1hash".
   /// For instance used for language versioning (specifying the maximum
   /// version).
-  String currentSdkVersion = "${kernel.Library.defaultLanguageVersionMajor}"
+  String currentSdkVersion = "${kernel.defaultLanguageVersionMajor}"
       "."
-      "${kernel.Library.defaultLanguageVersionMinor}";
+      "${kernel.defaultLanguageVersionMinor}";
+
+  bool equivalent(CompilerOptions other,
+      {bool ignoreOnDiagnostic: true,
+      bool ignoreVerbose: true,
+      bool ignoreVerify: true,
+      bool ignoreDebugDump: true}) {
+    if (sdkRoot != other.sdkRoot) return false;
+    if (librariesSpecificationUri != other.librariesSpecificationUri) {
+      return false;
+    }
+    if (!ignoreOnDiagnostic) {
+      if (onDiagnostic != other.onDiagnostic) return false;
+    }
+    if (packagesFileUri != other.packagesFileUri) return false;
+    if (!equalLists(additionalDills, other.additionalDills)) return false;
+    if (sdkSummary != other.sdkSummary) return false;
+    if (!equalMaps(declaredVariables, other.declaredVariables)) return false;
+    if (fileSystem != other.fileSystem) return false;
+    if (compileSdk != compileSdk) return false;
+    // chaseDependencies aren't used anywhere, so ignored here.
+    // targetPatches aren't used anywhere, so ignored here.
+    if (!equalMaps(experimentalFlags, other.experimentalFlags)) return false;
+    if (!equalMaps(environmentDefines, other.environmentDefines)) return false;
+    if (errorOnUnevaluatedConstant != other.errorOnUnevaluatedConstant) {
+      return false;
+    }
+    if (target != other.target) {
+      if (target.runtimeType != other.target.runtimeType) return false;
+      if (target.name != other.target.name) return false;
+      if (target.flags != other.target.flags) return false;
+    }
+    // enableAsserts is not used anywhere, so ignored here.
+    if (!ignoreVerbose) {
+      if (verbose != other.verbose) return false;
+    }
+    if (!ignoreVerify) {
+      if (verify != other.verify) return false;
+    }
+    if (!ignoreDebugDump) {
+      if (debugDump != other.debugDump) return false;
+    }
+    if (omitPlatform != other.omitPlatform) return false;
+    if (setExitCodeOnProblem != other.setExitCodeOnProblem) return false;
+    if (embedSourceText != other.embedSourceText) return false;
+    if (throwOnErrorsForDebugging != other.throwOnErrorsForDebugging) {
+      return false;
+    }
+    if (throwOnWarningsForDebugging != other.throwOnWarningsForDebugging) {
+      return false;
+    }
+    if (skipForDebugging != other.skipForDebugging) return false;
+    if (bytecode != other.bytecode) return false;
+    if (writeFileOnCrashReport != other.writeFileOnCrashReport) return false;
+    if (nnbdMode != other.nnbdMode) return false;
+    if (performNnbdChecks != other.performNnbdChecks) return false;
+    if (currentSdkVersion != other.currentSdkVersion) return false;
+
+    return true;
+  }
 }
 
 /// Parse experimental flag arguments of the form 'flag' or 'no-flag' into a map
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index 110685b..9945733 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -19,6 +19,25 @@
   variance,
 }
 
+const int enableConstantUpdate2018MajorVersion = 2;
+const int enableConstantUpdate2018MinorVersion = 4;
+const int enableControlFlowCollectionsMajorVersion = 2;
+const int enableControlFlowCollectionsMinorVersion = 2;
+const int enableExtensionMethodsMajorVersion = 2;
+const int enableExtensionMethodsMinorVersion = 6;
+const int enableNonNullableMajorVersion = 2;
+const int enableNonNullableMinorVersion = 8;
+const int enableNonfunctionTypeAliasesMajorVersion = 2;
+const int enableNonfunctionTypeAliasesMinorVersion = 8;
+const int enableSetLiteralsMajorVersion = 2;
+const int enableSetLiteralsMinorVersion = 2;
+const int enableSpreadCollectionsMajorVersion = 2;
+const int enableSpreadCollectionsMinorVersion = 2;
+const int enableTripleShiftMajorVersion = 2;
+const int enableTripleShiftMinorVersion = 8;
+const int enableVarianceMajorVersion = 2;
+const int enableVarianceMinorVersion = 8;
+
 ExperimentalFlag parseExperimentalFlag(String flag) {
   switch (flag) {
     case "constant-update-2018":
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index 783bee2..a5fe70a 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -54,6 +54,24 @@
         incrementalSerializer);
   }
 
+  /// Initialize the incremental compiler specifically for expression
+  /// compilation where the dill is external and we cannot expect to have access
+  /// to the sources.
+  ///
+  /// The resulting incremental compiler allows for expression compilation,
+  /// but not for general compilation. Note that computeDelta will have to be
+  /// called once to setup properly though.
+  ///
+  /// Notice that the component has to include the platform, and that no other
+  /// platform will be loaded.
+  factory IncrementalKernelGenerator.forExpressionCompilationOnly(
+      CompilerOptions options, Uri entryPoint, Component component) {
+    return new IncrementalCompiler.forExpressionCompilationOnly(
+        new CompilerContext(
+            new ProcessedOptions(options: options, inputs: [entryPoint])),
+        component);
+  }
+
   /// Returns a component whose libraries are the recompiled libraries,
   /// or - in the case of [fullComponent] - a full Component.
   Future<Component> computeDelta({List<Uri> entryPoints, bool fullComponent});
diff --git a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
index 8de9131..8519ca0 100644
--- a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
@@ -82,8 +82,8 @@
 /// must be acyclic.
 ///
 /// This API is intended for modular compilation. Dependencies to other modules
-/// are specified using [CompilerOptions.inputSummaries]. Any dependency
-/// of [sources] that is not listed in [CompilerOptions.inputSummaries] and
+/// are specified using [CompilerOptions.additionalDills]. Any dependency
+/// of [sources] that is not listed in [CompilerOptions.additionalDills] and
 /// [CompilerOptions.sdkSummary] is treated as an additional source file for the
 /// module.
 ///
diff --git a/pkg/front_end/lib/src/api_prototype/summary_generator.dart b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
index 9103689..5385311 100644
--- a/pkg/front_end/lib/src/api_prototype/summary_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
@@ -17,8 +17,8 @@
 /// Intended to be a part of a modular compilation process.
 ///
 /// Any dependency of [sources] that is not listed in
-/// [CompilerOptions.inputSummaries] and [CompilerOptions.sdkSummary] is treated
-/// as an additional source file for the build unit.
+/// [CompilerOptions.additionalDills] and [CompilerOptions.sdkSummary] is
+/// treated as an additional source file for the build unit.
 ///
 /// Any `part` declarations found in [sources] must refer to part files which
 /// are also listed in the build unit sources, otherwise an error results.  (It
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 2e14914..eacc6bb 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -64,7 +64,7 @@
     Uri sdkSummary,
     Uri packagesFile,
     Uri librariesSpecificationUri,
-    List<Uri> summaryInputs,
+    List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     FileSystem fileSystem,
@@ -72,19 +72,19 @@
     bool outlineOnly,
     Map<String, String> environmentDefines,
     {bool trackNeededDillLibraries: false}) async {
-  List<Component> outputLoadedInputSummaries =
-      new List<Component>(summaryInputs.length);
+  List<Component> outputLoadedAdditionalDills =
+      new List<Component>(additionalDills.length);
   Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
       parseExperimentalArguments(experiments),
       onError: (e) => throw e);
   return modular.initializeIncrementalCompiler(
       oldState,
       tags,
-      outputLoadedInputSummaries,
+      outputLoadedAdditionalDills,
       sdkSummary,
       packagesFile,
       librariesSpecificationUri,
-      summaryInputs,
+      additionalDills,
       workerInputDigests,
       target,
       fileSystem: fileSystem,
@@ -100,8 +100,7 @@
     Uri sdkSummary,
     Uri librariesSpecificationUri,
     Uri packagesFile,
-    List<Uri> summaryInputs,
-    List<Uri> linkedInputs,
+    List<Uri> additionalDills,
     Target target,
     FileSystem fileSystem,
     Iterable<String> experiments,
@@ -115,8 +114,7 @@
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
     ..librariesSpecificationUri = librariesSpecificationUri
-    ..inputSummaries = summaryInputs
-    ..linkedDependencies = linkedInputs
+    ..additionalDills = additionalDills
     ..target = target
     ..fileSystem = fileSystem
     ..environmentDefines = environmentDefines
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 0088540..9cb036e 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -33,6 +33,8 @@
 
 import '../base/libraries_specification.dart' show LibrariesSpecification;
 
+import '../base/nnbd_mode.dart' show NnbdMode;
+
 import '../fasta/compiler_context.dart' show CompilerContext;
 
 import '../kernel_generator_impl.dart' show generateKernelInternal;
@@ -109,6 +111,8 @@
 
 export '../api_prototype/standard_file_system.dart' show DataFileSystemEntity;
 
+export '../base/nnbd_mode.dart' show NnbdMode;
+
 export '../compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
@@ -129,28 +133,30 @@
     InitializedCompilerState oldState,
     Target target,
     Uri librariesSpecificationUri,
-    List<Uri> linkedDependencies,
+    List<Uri> additionalDills,
     Uri packagesFileUri,
     {List<Uri> dependencies,
     Map<ExperimentalFlag, bool> experimentalFlags,
-    bool verify: false}) {
-  linkedDependencies.sort((a, b) => a.toString().compareTo(b.toString()));
+    bool verify: false,
+    NnbdMode nnbdMode}) {
+  additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
 
   if (oldState != null &&
       oldState.options.packagesFileUri == packagesFileUri &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
-      equalLists(oldState.options.linkedDependencies, linkedDependencies) &&
+      equalLists(oldState.options.additionalDills, additionalDills) &&
       equalMaps(oldState.options.experimentalFlags, experimentalFlags)) {
     return oldState;
   }
 
   CompilerOptions options = new CompilerOptions()
     ..target = target
-    ..linkedDependencies = linkedDependencies
+    ..additionalDills = additionalDills
     ..librariesSpecificationUri = librariesSpecificationUri
     ..packagesFileUri = packagesFileUri
     ..experimentalFlags = experimentalFlags
     ..verify = verify;
+  if (nnbdMode != null) options.nnbdMode = nnbdMode;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 412e59f..eaf6e00 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -72,17 +72,17 @@
 class DdcResult {
   final Component component;
   final Component sdkSummary;
-  final List<Component> inputSummaries;
+  final List<Component> additionalDills;
   final ClassHierarchy classHierarchy;
 
-  DdcResult(
-      this.component, this.sdkSummary, this.inputSummaries, this.classHierarchy)
+  DdcResult(this.component, this.sdkSummary, this.additionalDills,
+      this.classHierarchy)
       : assert(classHierarchy != null);
 
   Set<Library> computeLibrariesFromDill() {
     Set<Library> librariesFromDill = new Set<Library>();
 
-    for (Component c in inputSummaries) {
+    for (Component c in additionalDills) {
       for (Library lib in c.libraries) {
         librariesFromDill.add(lib);
       }
@@ -104,19 +104,19 @@
     Uri sdkSummary,
     Uri packagesFile,
     Uri librariesSpecificationUri,
-    List<Uri> inputSummaries,
+    List<Uri> additionalDills,
     Target target,
     {FileSystem fileSystem,
     Map<ExperimentalFlag, bool> experiments,
     Map<String, String> environmentDefines}) async {
-  inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
+  additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
 
   if (oldState != null &&
       oldState.options.compileSdk == compileSdk &&
       oldState.options.sdkSummary == sdkSummary &&
       oldState.options.packagesFileUri == packagesFile &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
-      equalLists(oldState.options.inputSummaries, inputSummaries) &&
+      equalLists(oldState.options.additionalDills, additionalDills) &&
       equalMaps(oldState.options.experimentalFlags, experiments) &&
       equalMaps(oldState.options.environmentDefines, environmentDefines)) {
     // Reuse old state.
@@ -128,7 +128,7 @@
     ..sdkRoot = sdkRoot
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
-    ..inputSummaries = inputSummaries
+    ..additionalDills = additionalDills
     ..librariesSpecificationUri = librariesSpecificationUri
     ..target = target
     ..fileSystem = fileSystem ?? StandardFileSystem.instance
@@ -147,13 +147,13 @@
 Future<InitializedCompilerState> initializeIncrementalCompiler(
     InitializedCompilerState oldState,
     Set<String> tags,
-    List<Component> doneInputSummaries,
+    List<Component> doneAdditionalDills,
     bool compileSdk,
     Uri sdkRoot,
     Uri sdkSummary,
     Uri packagesFile,
     Uri librariesSpecificationUri,
-    List<Uri> inputSummaries,
+    List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     {FileSystem fileSystem,
@@ -163,11 +163,11 @@
   return modular.initializeIncrementalCompiler(
       oldState,
       tags,
-      doneInputSummaries,
+      doneAdditionalDills,
       sdkSummary,
       packagesFile,
       librariesSpecificationUri,
-      inputSummaries,
+      additionalDills,
       workerInputDigests,
       target,
       compileSdk: compileSdk,
@@ -198,7 +198,7 @@
 
   // These should be cached.
   Component sdkSummary = await processedOpts.loadSdkSummary(null);
-  List<Component> summaries = await processedOpts.loadInputSummaries(null);
+  List<Component> summaries = await processedOpts.loadAdditionalDills(null);
   return new DdcResult(
       component, sdkSummary, summaries, compilerResult.classHierarchy);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 3916c39..16c2863 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -31,19 +31,19 @@
 /// as necessary based on [workerInputDigests].
 ///
 /// Notes:
-/// * [outputLoadedInputSummaries] should be given as an empty list of the same
-///   size as the [inputSummaries]. The input summaries are loaded (or taken
+/// * [outputLoadedAdditionalDills] should be given as an empty list of the same
+///   size as the [additionalDills]. The input summaries are loaded (or taken
 ///   from cache) and placed in this list in order, i.e. the `i`-th entry in
-///   [outputLoadedInputSummaries] after this call corresponds to the component
-///   loaded from the `i`-th entry in [inputSummaries].
+///   [outputLoadedAdditionalDills] after this call corresponds to the component
+///   loaded from the `i`-th entry in [additionalDills].
 Future<InitializedCompilerState> initializeIncrementalCompiler(
     InitializedCompilerState oldState,
     Set<String> tags,
-    List<Component> outputLoadedInputSummaries,
+    List<Component> outputLoadedAdditionalDills,
     Uri sdkSummary,
     Uri packagesFile,
     Uri librariesSpecificationUri,
-    List<Uri> inputSummaries,
+    List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     {bool compileSdk: false,
@@ -129,8 +129,8 @@
         // although it's not entirely obvious why.
         // It likely has to do with several outlines containing the same
         // libraries. Once that stops (and we check for it) we can probably
-        // remove this, and instead only do it when about to reuse an outline
-        // in the 'inputSummaries.add(component);' line further down.
+        // remove this, and instead only do it when about to reuse a component
+        // further down.
         for (WorkerInputComponent cachedInput in workerInputCache.values) {
           cachedInput.component.adoptChildren();
         }
@@ -154,13 +154,13 @@
 
       // Notice that the ordering of the input summaries matter, so we need to
       // keep them in order.
-      if (outputLoadedInputSummaries.length != inputSummaries.length) {
+      if (outputLoadedAdditionalDills.length != additionalDills.length) {
         throw new ArgumentError("Invalid length.");
       }
-      Set<Uri> inputSummariesSet = new Set<Uri>();
-      for (int i = 0; i < inputSummaries.length; i++) {
-        Uri summaryUri = inputSummaries[i];
-        inputSummariesSet.add(summaryUri);
+      Set<Uri> additionalDillsSet = new Set<Uri>();
+      for (int i = 0; i < additionalDills.length; i++) {
+        Uri summaryUri = additionalDills[i];
+        additionalDillsSet.add(summaryUri);
         WorkerInputComponent cachedInput = workerInputCache[summaryUri];
         List<int> digest = workerInputDigests[summaryUri];
         if (digest == null) {
@@ -187,30 +187,30 @@
             }
           }
           component.computeCanonicalNames(); // this isn't needed, is it?
-          outputLoadedInputSummaries[i] = component;
+          outputLoadedAdditionalDills[i] = component;
         }
       }
 
       for (int i = 0; i < loadFromDillIndexes.length; i++) {
         int index = loadFromDillIndexes[i];
-        Uri summaryUri = inputSummaries[index];
-        List<int> digest = workerInputDigests[summaryUri];
+        Uri additionalDillUri = additionalDills[index];
+        List<int> digest = workerInputDigests[additionalDillUri];
         if (digest == null) {
-          throw new StateError("Expected to get digest for $summaryUri");
+          throw new StateError("Expected to get digest for $additionalDillUri");
         }
 
         List<int> bytes =
-            await fileSystem.entityForUri(summaryUri).readAsBytes();
+            await fileSystem.entityForUri(additionalDillUri).readAsBytes();
         WorkerInputComponent cachedInput = new WorkerInputComponent(
             digest,
             await processedOpts.loadComponent(bytes, nameRoot,
                 alwaysCreateNewNamedNodes: true));
-        workerInputCache[summaryUri] = cachedInput;
-        outputLoadedInputSummaries[index] = cachedInput.component;
+        workerInputCache[additionalDillUri] = cachedInput;
+        outputLoadedAdditionalDills[index] = cachedInput.component;
         for (Library lib in cachedInput.component.libraries) {
           if (workerInputCacheLibs.containsKey(lib.importUri)) {
             Uri fromSummary = workerInputCacheLibs[lib.importUri];
-            if (inputSummariesSet.contains(fromSummary)) {
+            if (additionalDillsSet.contains(fromSummary)) {
               throw new StateError(
                   "Asked to load several summaries that contain the same "
                   "library.");
@@ -223,17 +223,17 @@
               }
             }
           } else {
-            workerInputCacheLibs[lib.importUri] = summaryUri;
+            workerInputCacheLibs[lib.importUri] = additionalDillUri;
           }
 
           if (trackNeededDillLibraries) {
-            libraryToInputDill[lib.importUri] = summaryUri;
+            libraryToInputDill[lib.importUri] = additionalDillUri;
           }
         }
       }
 
       incrementalCompiler
-          .setModulesToLoadOnNextComputeDelta(outputLoadedInputSummaries);
+          .setModulesToLoadOnNextComputeDelta(outputLoadedAdditionalDills);
 
       return new InitializedCompilerState(options, processedOpts,
           workerInputCache: workerInputCache,
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 458cda1..b0cacef 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -109,17 +109,13 @@
   /// types unless legacy mode is enabled.
   Component _sdkSummaryComponent;
 
-  /// The summary for each uri in `options.inputSummaries`.
+  /// The component for each uri in `options.additionalDills`.
   ///
   /// A summary, also referred to as "outline" internally, is a [Component]
   /// where all method bodies are left out. In essence, it contains just API
   /// signatures and constants. The summaries should include inferred top-level
   /// types unless legacy mode is enabled.
-  List<Component> _inputSummariesComponents;
-
-  /// Other components that are meant to be linked and compiled with the input
-  /// sources.
-  List<Component> _linkedDependencies;
+  List<Component> _additionalDillComponents;
 
   /// The location of the SDK, or `null` if the location hasn't been determined
   /// yet.
@@ -288,7 +284,7 @@
       return false;
     }
 
-    for (Uri source in _raw.linkedDependencies) {
+    for (Uri source in _raw.additionalDills) {
       // TODO(ahe): Remove this check, the compiler itself should handle and
       // recover from this.
       if (!await fileSystem.entityForUri(source).exists()) {
@@ -360,42 +356,27 @@
     _sdkSummaryComponent = platform;
   }
 
-  /// Get the summary programs for each of the underlying `inputSummaries`
+  /// Get the components for each of the underlying `additionalDill`
   /// provided via [CompilerOptions].
   // TODO(sigmund): move, this doesn't feel like an "option".
-  Future<List<Component>> loadInputSummaries(CanonicalName nameRoot) async {
-    if (_inputSummariesComponents == null) {
-      List<Uri> uris = _raw.inputSummaries;
+  Future<List<Component>> loadAdditionalDills(CanonicalName nameRoot) async {
+    if (_additionalDillComponents == null) {
+      List<Uri> uris = _raw.additionalDills;
       if (uris == null || uris.isEmpty) return const <Component>[];
       // TODO(sigmund): throttle # of concurrent operations.
       List<List<int>> allBytes = await Future.wait(
           uris.map((uri) => _readAsBytes(fileSystem.entityForUri(uri))));
-      _inputSummariesComponents =
+      _additionalDillComponents =
           allBytes.map((bytes) => loadComponent(bytes, nameRoot)).toList();
     }
-    return _inputSummariesComponents;
+    return _additionalDillComponents;
   }
 
-  void set inputSummariesComponents(List<Component> components) {
-    if (_inputSummariesComponents != null) {
-      throw new StateError("inputSummariesComponents already loaded.");
+  void set loadAdditionalDillsComponents(List<Component> components) {
+    if (_additionalDillComponents != null) {
+      throw new StateError("inputAdditionalDillsComponents already loaded.");
     }
-    _inputSummariesComponents = components;
-  }
-
-  /// Load each of the [CompilerOptions.linkedDependencies] components.
-  // TODO(sigmund): move, this doesn't feel like an "option".
-  Future<List<Component>> loadLinkDependencies(CanonicalName nameRoot) async {
-    if (_linkedDependencies == null) {
-      List<Uri> uris = _raw.linkedDependencies;
-      if (uris == null || uris.isEmpty) return const <Component>[];
-      // TODO(sigmund): throttle # of concurrent operations.
-      List<List<int>> allBytes = await Future.wait(
-          uris.map((uri) => _readAsBytes(fileSystem.entityForUri(uri))));
-      _linkedDependencies =
-          allBytes.map((bytes) => loadComponent(bytes, nameRoot)).toList();
-    }
-    return _linkedDependencies;
+    _additionalDillComponents = components;
   }
 
   /// Helper to load a .dill file from [uri] using the existing [nameRoot].
@@ -709,8 +690,7 @@
     sb.writeln('FileSystem: ${_fileSystem.runtimeType} '
         '(provided: ${_raw.fileSystem.runtimeType})');
 
-    writeList('Input Summaries', _raw.inputSummaries);
-    writeList('Linked Dependencies', _raw.linkedDependencies);
+    writeList('Additional Dills', _raw.additionalDills);
 
     sb.writeln('Packages uri: ${_raw.packagesFileUri}');
     sb.writeln('Packages: ${_packages}');
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 8943783..46e5327 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -16,6 +16,7 @@
         templateMissingExplicitTypeArguments,
         messageNotATypeContext,
         LocatedMessage,
+        templateExtendingRestricted,
         templateNotAType,
         templateTypeArgumentMismatch,
         templateTypeArgumentsOnTypeVariable,
@@ -226,6 +227,13 @@
       LibraryBuilder library, int charOffset, Uri fileUri) {
     TypeDeclarationBuilder declaration = this.declaration;
     if (declaration is ClassBuilder) {
+      if (declaration.isNullClass && !library.mayImplementRestrictedTypes) {
+        library.addProblem(
+            templateExtendingRestricted.withArguments(declaration.name),
+            charOffset,
+            noLength,
+            fileUri);
+      }
       return declaration.buildSupertype(library, arguments);
     } else if (declaration is TypeAliasBuilder) {
       TypeDeclarationBuilder declarationBuilder =
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index 28d20c0..184af64 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -4,8 +4,6 @@
 
 library fasta.function_type_alias_builder;
 
-import 'package:front_end/src/fasta/builder/fixed_type_builder.dart';
-import 'package:front_end/src/fasta/builder/named_type_builder.dart';
 import 'package:kernel/ast.dart'
     show
         DartType,
@@ -21,6 +19,8 @@
 import 'package:kernel/type_algebra.dart'
     show FreshTypeParameters, getFreshTypeParameters, substitute;
 
+import 'package:kernel/src/future_or.dart';
+
 import '../fasta_codes.dart'
     show noLength, templateCyclicTypedef, templateTypeArgumentMismatch;
 
@@ -29,10 +29,12 @@
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'class_builder.dart';
+import 'fixed_type_builder.dart';
 import 'formal_parameter_builder.dart';
 import 'function_type_builder.dart';
 import 'library_builder.dart';
 import 'metadata_builder.dart';
+import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 import 'type_declaration_builder.dart';
@@ -237,16 +239,23 @@
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments) {
     DartType thisType = buildThisType(library);
     if (thisType is InvalidType) return thisType;
+    // TODO(dmitryas): Remove the following comment when FutureOr has its own
+    // encoding and isn't represented as an InterfaceType.
+
+    // The following won't work if the right-hand side of the typedef is a
+    // FutureOr.
+    Nullability rhsNullability = thisType.nullability;
     if (typedef.typeParameters.isEmpty && arguments == null) {
       Nullability nullability = isNullAlias
           ? Nullability.nullable
           : nullabilityBuilder.build(library);
-      return thisType.withNullability(nullability);
+      return thisType
+          .withNullability(uniteNullabilities(rhsNullability, nullability));
     }
     // Otherwise, substitute.
     return buildTypesWithBuiltArguments(
         library,
-        nullabilityBuilder.build(library),
+        uniteNullabilities(rhsNullability, nullabilityBuilder.build(library)),
         buildTypeArguments(library, arguments));
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 047a3f9..cf98a1f 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -43,6 +43,7 @@
       {bool filter(Uri uri), int byteCount: 0}) {
     List<Library> componentLibraries = component.libraries;
     List<Uri> requestedLibraries = <Uri>[];
+    List<Uri> requestedLibrariesFileUri = <Uri>[];
     DillTarget target = this.target;
     for (int i = 0; i < componentLibraries.length; i++) {
       Library library = componentLibraries[i];
@@ -51,11 +52,13 @@
         libraries.add(library);
         target.addLibrary(library);
         requestedLibraries.add(uri);
+        requestedLibrariesFileUri.add(library.fileUri);
       }
     }
     List<DillLibraryBuilder> result = <DillLibraryBuilder>[];
     for (int i = 0; i < requestedLibraries.length; i++) {
-      result.add(read(requestedLibraries[i], -1));
+      result.add(read(requestedLibraries[i], -1,
+          fileUri: requestedLibrariesFileUri[i]));
     }
     target.uriToSource.addAll(component.uriToSource);
     this.byteCount += byteCount;
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 5fd3fb8..dc0344c 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -144,6 +144,8 @@
   Map<String, Package> previousPackagesMap;
   Map<String, Package> currentPackagesMap;
   bool hasToCheckPackageUris = false;
+  final bool initializedForExpressionCompilationOnly;
+  bool computeDeltaRunOnce = false;
   Map<Uri, List<DiagnosticMessageFromJson>> remainingComponentProblems =
       new Map<Uri, List<DiagnosticMessageFromJson>>();
   List<Component> modulesToLoad;
@@ -159,25 +161,34 @@
 
   IncrementalCompiler.fromComponent(
       this.context, this.componentToInitializeFrom,
-      [bool outlineOnly, IncrementalSerializer incrementalSerializer])
+      [bool outlineOnly, this.incrementalSerializer])
       : ticker = context.options.ticker,
         initializeFromDillUri = null,
         this.outlineOnly = outlineOnly ?? false,
-        this.incrementalSerializer = incrementalSerializer {
+        this.initializedForExpressionCompilationOnly = false {
     enableExperimentsBasedOnEnvironment();
   }
 
   IncrementalCompiler(this.context,
       [this.initializeFromDillUri,
       bool outlineOnly,
-      IncrementalSerializer incrementalSerializer])
+      this.incrementalSerializer])
       : ticker = context.options.ticker,
         componentToInitializeFrom = null,
         this.outlineOnly = outlineOnly ?? false,
-        this.incrementalSerializer = incrementalSerializer {
+        this.initializedForExpressionCompilationOnly = false {
     enableExperimentsBasedOnEnvironment();
   }
 
+  IncrementalCompiler.forExpressionCompilationOnly(
+      this.context, this.componentToInitializeFrom)
+      : ticker = context.options.ticker,
+        initializeFromDillUri = null,
+        this.outlineOnly = false,
+        this.incrementalSerializer = null,
+        this.initializedForExpressionCompilationOnly = true {
+    enableExperimentsBasedOnEnvironment();
+  }
   void enableExperimentsBasedOnEnvironment() {
     // Note that these are all experimental. Use at your own risk.
     Set<String> enabledExperiments = getExperimentEnvironment();
@@ -198,6 +209,11 @@
     ticker.reset();
     entryPoints ??= context.options.inputs;
     return context.runInContext<Component>((CompilerContext c) async {
+      if (computeDeltaRunOnce && initializedForExpressionCompilationOnly) {
+        throw new StateError("Initialized for expression compilation: "
+            "cannot do another general compile.");
+      }
+      computeDeltaRunOnce = true;
       // Initial setup: Load platform, initialize from dill or component etc.
       UriTranslator uriTranslator = await setupPackagesAndUriTranslator(c);
       IncrementalCompilerData data =
@@ -953,6 +969,9 @@
     // changed and only set this to true if it did.
     hasToCheckPackageUris = hasToCheckPackageUris || bypassCache;
     ticker.logMs("Read packages file");
+    if (initializedForExpressionCompilationOnly) {
+      hasToCheckPackageUris = false;
+    }
     return uriTranslator;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index c53b67a..a302ce4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -895,12 +895,12 @@
 
     FunctionBuilder builder = member;
     if (extensionThis != null) {
-      typeInferrer?.flowAnalysis?.initialize(extensionThis);
+      typeInferrer?.flowAnalysis?.declare(extensionThis, true);
     }
     if (formals?.parameters != null) {
       for (int i = 0; i < formals.parameters.length; i++) {
         FormalParameterBuilder parameter = formals.parameters[i];
-        typeInferrer?.flowAnalysis?.initialize(parameter.variable);
+        typeInferrer?.flowAnalysis?.declare(parameter.variable, true);
       }
       for (int i = 0; i < formals.parameters.length; i++) {
         FormalParameterBuilder parameter = formals.parameters[i];
@@ -1373,7 +1373,7 @@
     if (formals != null) {
       for (int i = 0; i < formals.length; i++) {
         FormalParameterBuilder parameter = formals[i];
-        typeInferrer?.flowAnalysis?.initialize(parameter.variable);
+        typeInferrer?.flowAnalysis?.declare(parameter.variable, true);
       }
     }
     if (_initializers != null) {
@@ -3185,6 +3185,17 @@
   }
 
   @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    assert(checkState(token, <ValueKind>[
+      /* arguments */ ValueKinds.TypeArgumentsOrNull,
+    ]));
+
+    debugEvent("handleVoidKeywordWithTypeArguments");
+    pop(); // arguments.
+    handleVoidKeyword(token);
+  }
+
+  @override
   void handleAsOperator(Token operator) {
     debugEvent("AsOperator");
     DartType type = buildDartType(pop());
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 2266c1e..2436056 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -225,7 +225,6 @@
 
   final List<DelayedMember> delayedMemberChecks = <DelayedMember>[];
 
-  // TODO(dmitryas): Consider removing this.
   final CoreTypes coreTypes;
 
   Types types;
@@ -254,28 +253,27 @@
         getNodeFromClassBuilder(loader.computeClassBuilderFromTargetClass(cls));
   }
 
-  InterfaceType asSupertypeOf(InterfaceType subtype, Class supertype) {
+  Supertype asSupertypeOf(InterfaceType subtype, Class supertype) {
     if (subtype.classNode == supertype) {
-      return subtype;
+      return new Supertype(supertype, subtype.typeArguments);
     }
     ClassHierarchyNode clsNode = getNodeFromClass(subtype.classNode);
     ClassHierarchyNode supertypeNode = getNodeFromClass(supertype);
-    List<DartType> superclasses = clsNode.superclasses;
+    List<Supertype> superclasses = clsNode.superclasses;
     int depth = supertypeNode.depth;
     if (depth < superclasses.length) {
-      DartType superclass = superclasses[depth];
-      if (superclass is InterfaceType && superclass.classNode == supertype) {
+      Supertype superclass = superclasses[depth];
+      if (superclass.classNode == supertype) {
         return Substitution.fromInterfaceType(subtype)
-            .substituteType(superclass);
+            .substituteSupertype(superclass);
       }
     }
-    List<DartType> superinterfaces = clsNode.interfaces;
+    List<Supertype> superinterfaces = clsNode.interfaces;
     for (int i = 0; i < superinterfaces.length; i++) {
-      DartType superinterface = superinterfaces[i];
-      if (superinterface is InterfaceType &&
-          superinterface.classNode == supertype) {
+      Supertype superinterface = superinterfaces[i];
+      if (superinterface.classNode == supertype) {
         return Substitution.fromInterfaceType(subtype)
-            .substituteType(superinterface);
+            .substituteSupertype(superinterface);
       }
     }
     return null;
@@ -298,7 +296,9 @@
                 superclass.typeParameters.length, coreTypes.nullType));
       }
     }
-    return asSupertypeOf(type, superclass);
+    return asSupertypeOf(type, superclass)
+        .asInterfaceType
+        .withNullability(type.nullability);
   }
 
   List<DartType> getKernelTypeArgumentsAsInstanceOf(
@@ -1365,9 +1365,9 @@
     /// superclasses.
     List<ClassMember> interfaceSetters;
 
-    List<DartType> superclasses;
+    List<Supertype> superclasses;
 
-    List<DartType> interfaces;
+    List<Supertype> interfaces;
 
     int maxInheritancePath;
 
@@ -1375,18 +1375,20 @@
       // This should be Object.
       classMembers = localMembers;
       classSetters = localSetters;
-      superclasses = new List<DartType>(0);
-      interfaces = new List<DartType>(0);
+      superclasses = new List<Supertype>(0);
+      interfaces = new List<Supertype>(0);
       maxInheritancePath = 0;
     } else {
       maxInheritancePath = supernode.maxInheritancePath + 1;
 
-      superclasses = new List<DartType>(supernode.superclasses.length + 1);
-      DartType supertype = classBuilder.supertype.build(classBuilder.library);
-      if (supertype is! InterfaceType) {
+      superclasses = new List<Supertype>(supernode.superclasses.length + 1);
+      Supertype supertype = classBuilder.supertype.buildSupertype(
+          classBuilder.library, classBuilder.charOffset, classBuilder.fileUri);
+      if (supertype == null) {
         // If the superclass is not an interface type we use Object instead.
         // A similar normalization is performed on [supernode] above.
-        supertype = hierarchy.coreTypes.objectNonNullableRawType;
+        supertype =
+            new Supertype(hierarchy.coreTypes.objectClass, const <DartType>[]);
       }
       superclasses.setRange(0, superclasses.length - 1,
           substSupertypes(supertype, supernode.superclasses));
@@ -1404,11 +1406,14 @@
       }
       if (directInterfaceBuilders != null) {
         for (int i = 0; i < directInterfaceBuilders.length; i++) {
-          recordSupertype(
-              directInterfaceBuilders[i].build(classBuilder.library));
+          Supertype interface = directInterfaceBuilders[i].buildSupertype(
+              classBuilder.library,
+              classBuilder.charOffset,
+              classBuilder.fileUri);
+          if (interface != null) recordSupertype(interface);
         }
       }
-      List<DartType> superclassInterfaces = supernode.interfaces;
+      List<Supertype> superclassInterfaces = supernode.interfaces;
       if (superclassInterfaces != null) {
         superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
       }
@@ -1423,7 +1428,7 @@
             mergeInterfaces(supernode, directInterfaceBuilders);
         interfaceMembers = result.mergedMembers;
         interfaceSetters = result.mergedSetters;
-        interfaces = <DartType>[];
+        interfaces = <Supertype>[];
         if (superclassInterfaces != null) {
           for (int i = 0; i < superclassInterfaces.length; i++) {
             addInterface(interfaces, superclasses, superclassInterfaces[i]);
@@ -1431,10 +1436,12 @@
         }
 
         for (int i = 0; i < directInterfaceBuilders.length; i++) {
-          DartType directInterface =
-              directInterfaceBuilders[i].build(classBuilder.library);
-          addInterface(interfaces, superclasses, directInterface);
-          if (directInterface is InterfaceType) {
+          Supertype directInterface = directInterfaceBuilders[i].buildSupertype(
+              classBuilder.library,
+              classBuilder.charOffset,
+              classBuilder.fileUri);
+          if (directInterface != null) {
+            addInterface(interfaces, superclasses, directInterface);
             ClassHierarchyNode interfaceNode =
                 hierarchy.getNodeFromClass(directInterface.classNode);
             if (interfaceNode != null) {
@@ -1442,13 +1449,13 @@
                 maxInheritancePath = interfaceNode.maxInheritancePath + 1;
               }
 
-              List<DartType> types =
+              List<Supertype> types =
                   substSupertypes(directInterface, interfaceNode.superclasses);
               for (int i = 0; i < types.length; i++) {
                 addInterface(interfaces, superclasses, types[i]);
               }
               if (interfaceNode.interfaces != null) {
-                List<DartType> types =
+                List<Supertype> types =
                     substSupertypes(directInterface, interfaceNode.interfaces);
                 for (int i = 0; i < types.length; i++) {
                   addInterface(interfaces, superclasses, types[i]);
@@ -1511,39 +1518,35 @@
     );
   }
 
-  DartType recordSupertype(DartType supertype) {
+  Supertype recordSupertype(Supertype supertype) {
     debug?.log("In ${this.classBuilder.fullNameForErrors} "
         "recordSupertype(${supertype})");
-    if (supertype is InterfaceType) {
-      Class cls = supertype.classNode;
-      if (cls.isMixinApplication) {
-        recordSupertype(cls.mixedInType.asInterfaceType);
+    Class cls = supertype.classNode;
+    if (cls.isMixinApplication) {
+      recordSupertype(cls.mixedInType);
+    }
+    List<TypeParameter> typeVariableBuilders = cls.typeParameters;
+    if (typeVariableBuilders == null) {
+      substitutions[cls] = Substitution.empty;
+      assert(cls.typeParameters.isEmpty);
+    } else {
+      List<DartType> arguments = supertype.typeArguments;
+      List<DartType> typeArguments = new List<DartType>(arguments.length);
+      List<TypeParameter> typeParameters =
+          new List<TypeParameter>(arguments.length);
+      for (int i = 0; i < arguments.length; i++) {
+        typeParameters[i] = typeVariableBuilders[i];
+        typeArguments[i] = arguments[i];
       }
-      List<TypeParameter> typeVariableBuilders = cls.typeParameters;
-      if (typeVariableBuilders == null) {
-        substitutions[cls] = Substitution.empty;
-        assert(cls.typeParameters.isEmpty);
-      } else {
-        List<DartType> arguments = supertype.typeArguments;
-        List<DartType> typeArguments = new List<DartType>(arguments.length);
-        List<TypeParameter> typeParameters =
-            new List<TypeParameter>(arguments.length);
-        for (int i = 0; i < arguments.length; i++) {
-          typeParameters[i] = typeVariableBuilders[i];
-          typeArguments[i] = arguments[i];
-        }
-        substitutions[cls] =
-            Substitution.fromPairs(typeParameters, typeArguments);
-      }
+      substitutions[cls] =
+          Substitution.fromPairs(typeParameters, typeArguments);
     }
     return supertype;
   }
 
-  List<DartType> substSupertypes(
-      DartType supertype, List<DartType> supertypes) {
-    if (supertype is! InterfaceType) return supertypes;
-    InterfaceType cls = supertype;
-    List<TypeParameter> typeVariables = cls.classNode.typeParameters;
+  List<Supertype> substSupertypes(
+      Supertype supertype, List<Supertype> supertypes) {
+    List<TypeParameter> typeVariables = supertype.classNode.typeParameters;
     if (typeVariables.isEmpty) {
       debug?.log("In ${this.classBuilder.fullNameForErrors} "
           "$supertypes aren't substed");
@@ -1553,16 +1556,16 @@
       return supertypes;
     }
     Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
-    List<DartType> arguments = cls.typeArguments;
+    List<DartType> arguments = supertype.typeArguments;
     for (int i = 0; i < typeVariables.length; i++) {
       map[typeVariables[i]] = arguments[i];
     }
     Substitution substitution = Substitution.fromMap(map);
-    List<DartType> result;
+    List<Supertype> result;
     for (int i = 0; i < supertypes.length; i++) {
-      DartType supertype = supertypes[i];
-      DartType substituted =
-          recordSupertype(substitution.substituteType(supertype));
+      Supertype supertype = supertypes[i];
+      Supertype substituted =
+          recordSupertype(substitution.substituteSupertype(supertype));
       if (supertype != substituted) {
         debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
             " -> $substituted");
@@ -1597,63 +1600,60 @@
     }
   }
 
-  DartType addInterface(
-      List<DartType> interfaces, List<DartType> superclasses, DartType type) {
+  Supertype addInterface(List<Supertype> interfaces,
+      List<Supertype> superclasses, Supertype type) {
+    if (type == null) return null;
     if (!classBuilder.library.isNonNullableByDefault) {
-      type = legacyErasure(hierarchy.coreTypes, type);
+      type = legacyErasureSupertype(hierarchy.coreTypes, type);
     }
-    if (type is InterfaceType) {
-      ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
-      if (node == null) return null;
-      int depth = node.depth;
-      int myDepth = superclasses.length;
-      DartType superclass = depth < myDepth ? superclasses[depth] : null;
-      if (superclass is InterfaceType &&
-          superclass.classNode == type.classNode) {
-        // This is a potential conflict.
-        if (classBuilder.library.isNonNullableByDefault) {
-          superclass = nnbdTopMerge(
-              hierarchy.coreTypes,
-              norm(hierarchy.coreTypes, superclass),
-              norm(hierarchy.coreTypes, type));
-          if (superclass == null) {
-            // This is a conflict.
-            // TODO(johnniwinther): Report errors here instead of through
-            // the computation of the [ClassHierarchy].
-            superclass = superclasses[depth];
-          } else {
-            superclasses[depth] = superclass;
-          }
-        }
-        return superclass;
-      } else {
-        for (int i = 0; i < interfaces.length; i++) {
-          // This is a quadratic algorithm, but normally, the number of
-          // interfaces is really small.
-          DartType interface = interfaces[i];
-          if (interface is InterfaceType &&
-              interface.classNode == type.classNode) {
-            // This is a potential conflict.
-            if (classBuilder.library.isNonNullableByDefault) {
-              interface = nnbdTopMerge(
-                  hierarchy.coreTypes,
-                  norm(hierarchy.coreTypes, interface),
-                  norm(hierarchy.coreTypes, type));
-              if (interface == null) {
-                // This is a conflict.
-                // TODO(johnniwinther): Report errors here instead of through
-                // the computation of the [ClassHierarchy].
-                interface = interfaces[i];
-              } else {
-                interfaces[i] = interface;
-              }
-            }
-            return interface;
-          }
+    ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
+    if (node == null) return null;
+    int depth = node.depth;
+    int myDepth = superclasses.length;
+    Supertype superclass = depth < myDepth ? superclasses[depth] : null;
+    if (superclass != null && superclass.classNode == type.classNode) {
+      // This is a potential conflict.
+      if (classBuilder.library.isNonNullableByDefault) {
+        superclass = nnbdTopMergeSupertype(
+            hierarchy.coreTypes,
+            normSupertype(hierarchy.coreTypes, superclass),
+            normSupertype(hierarchy.coreTypes, type));
+        if (superclass == null) {
+          // This is a conflict.
+          // TODO(johnniwinther): Report errors here instead of through
+          // the computation of the [ClassHierarchy].
+          superclass = superclasses[depth];
+        } else {
+          superclasses[depth] = superclass;
         }
       }
-      interfaces.add(type);
+      return superclass;
+    } else {
+      for (int i = 0; i < interfaces.length; i++) {
+        // This is a quadratic algorithm, but normally, the number of
+        // interfaces is really small.
+        Supertype interface = interfaces[i];
+        if (interface.classNode == type.classNode) {
+          // This is a potential conflict.
+          if (classBuilder.library.isNonNullableByDefault) {
+            interface = nnbdTopMergeSupertype(
+                hierarchy.coreTypes,
+                normSupertype(hierarchy.coreTypes, interface),
+                normSupertype(hierarchy.coreTypes, type));
+            if (interface == null) {
+              // This is a conflict.
+              // TODO(johnniwinther): Report errors here instead of through
+              // the computation of the [ClassHierarchy].
+              interface = interfaces[i];
+            } else {
+              interfaces[i] = interface;
+            }
+          }
+          return interface;
+        }
+      }
     }
+    interfaces.add(type);
     return null;
   }
 
@@ -1893,11 +1893,11 @@
 
   /// All superclasses of [classBuilder] excluding itself. The classes are
   /// sorted by depth from the root (Object) in ascending order.
-  final List<DartType> superclasses;
+  final List<Supertype> superclasses;
 
   /// The list of all classes implemented by [classBuilder] and its supertypes
   /// excluding any classes from [superclasses].
-  final List<DartType> interfaces;
+  final List<Supertype> interfaces;
 
   /// The longest inheritance path from [classBuilder] to `Object`.
   final int maxInheritancePath;
@@ -1923,17 +1923,13 @@
     List<ClassHierarchyNode> result = new List<ClassHierarchyNode>(
         1 + superclasses.length + interfaces.length);
     for (int i = 0; i < superclasses.length; i++) {
-      DartType type = superclasses[i];
-      if (type is InterfaceType) {
-        result[i] = hierarchy.getNodeFromClass(type.classNode);
-      }
+      Supertype type = superclasses[i];
+      result[i] = hierarchy.getNodeFromClass(type.classNode);
     }
     for (int i = 0; i < interfaces.length; i++) {
-      DartType type = interfaces[i];
-      if (type is InterfaceType) {
-        result[i + superclasses.length] =
-            hierarchy.getNodeFromClass(type.classNode);
-      }
+      Supertype type = interfaces[i];
+      result[i + superclasses.length] =
+          hierarchy.getNodeFromClass(type.classNode);
     }
     return result..last = this;
   }
@@ -1950,20 +1946,20 @@
     }
     sb..writeln("  superclasses:");
     int depth = 0;
-    for (DartType superclass in superclasses) {
+    for (Supertype superclass in superclasses) {
       sb.write("  " * (depth + 2));
       if (depth != 0) sb.write("-> ");
-      sb.write(typeToText(superclass));
+      sb.write(typeToText(superclass.asInterfaceType));
       sb.writeln();
       depth++;
     }
     if (interfaces != null) {
       sb.write("  interfaces:");
       bool first = true;
-      for (DartType i in interfaces) {
+      for (Supertype i in interfaces) {
         if (!first) sb.write(",");
         sb.write(" ");
-        sb.write(typeToText(i));
+        sb.write(typeToText(i.asInterfaceType));
         first = false;
       }
       sb.writeln();
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 a9bf4c6..f91bfea 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -791,6 +791,7 @@
 
     // This is matched by the call to [forEach_end] in
     // [inferElement], [inferMapEntry] or [inferForInStatement].
+    inferrer.flowAnalysis.declare(variable, true);
     inferrer.flowAnalysis.forEach_bodyBegin(node, variable, variable.type);
 
     VariableDeclaration tempVariable =
@@ -1049,6 +1050,7 @@
   @override
   StatementInferenceResult visitFunctionDeclaration(
       covariant FunctionDeclarationImpl node) {
+    inferrer.flowAnalysis.declare(node.variable, true);
     inferrer.flowAnalysis.functionExpression_begin(node);
     inferrer.inferMetadataKeepingHelper(
         node.variable, node.variable.annotations);
@@ -5372,8 +5374,9 @@
       inferredType = inferrer.inferDeclarationType(
           initializerResult.inferredType,
           forSyntheticVariable: node.name == null);
-      inferrer.flowAnalysis.initialize(node);
+      inferrer.flowAnalysis.declare(node, true);
     } else {
+      inferrer.flowAnalysis.declare(node, false);
       inferredType = const DynamicType();
     }
     if (node.isImplicitlyTyped) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 2cda2a5..97a844a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -24,9 +24,6 @@
 
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
 
-import 'package:kernel/binary/limited_ast_to_binary.dart'
-    show LimitedBinaryPrinter;
-
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 
 /// Print the given [component].  Do nothing if it is `null`.  If the
@@ -52,9 +49,7 @@
   File output = new File.fromUri(uri);
   IOSink sink = output.openWrite();
   try {
-    BinaryPrinter printer = filter == null
-        ? new BinaryPrinter(sink)
-        : new LimitedBinaryPrinter(sink, filter ?? (_) => true, false);
+    BinaryPrinter printer = new BinaryPrinter(sink, libraryFilter: filter);
     printer.writeComponentFile(component);
   } finally {
     await sink.close();
@@ -67,11 +62,10 @@
     bool includeSources: true,
     bool includeOffsets: true}) {
   ByteSink byteSink = new ByteSink();
-  BinaryPrinter printer = filter == null
-      ? new BinaryPrinter(byteSink,
-          includeSources: includeSources, includeOffsets: includeOffsets)
-      : new LimitedBinaryPrinter(byteSink, filter, !includeSources,
-          includeOffsets: includeOffsets);
+  BinaryPrinter printer = new BinaryPrinter(byteSink,
+      libraryFilter: filter,
+      includeSources: includeSources,
+      includeOffsets: includeOffsets);
   printer.writeComponentFile(component);
   return byteSink.builder.takeBytes();
 }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index e0516e5..d293e88 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -377,6 +377,11 @@
   }
 
   @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    debugEvent("VoidKeywordWithTypeArguments");
+  }
+
+  @override
   void handleNoInitializers() {
     debugEvent("NoInitializers");
   }
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 43d0792..33555b8 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1386,6 +1386,13 @@
   }
 
   @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    debugEvent("VoidKeyword");
+    /*List<TypeBuilder> arguments =*/ pop();
+    push(libraryBuilder.addVoidType(token.charOffset));
+  }
+
+  @override
   void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
       Token covariantToken, Token varFinalOrConst) {
     if (requiredToken != null && !libraryBuilder.isNonNullableByDefault) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 51842c7..6e651ce 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -51,6 +51,9 @@
         VariableDeclaration,
         VoidType;
 
+import 'package:kernel/default_language_version.dart' as kernel
+    show defaultLanguageVersionMajor, defaultLanguageVersionMinor;
+
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
@@ -165,9 +168,8 @@
 
 import 'source_loader.dart' show SourceLoader;
 
-// TODO(johnniwinther,jensj): Replace this with the correct scheme.
-const int enableNonNullableDefaultMajorVersion = 2;
-const int enableNonNullableDefaultMinorVersion = 8;
+import '../../api_prototype/experimental_flags.dart'
+    show enableNonNullableMajorVersion, enableNonNullableMinorVersion;
 
 class SourceLibraryBuilder extends LibraryBuilderImpl {
   static const String MALFORMED_URI_SCHEME = "org-dartlang-malformed-uri";
@@ -383,8 +385,8 @@
   @override
   bool get isNonNullableByDefault =>
       loader.target.enableNonNullable &&
-      languageVersion.major >= enableNonNullableDefaultMajorVersion &&
-      languageVersion.minor >= enableNonNullableDefaultMinorVersion &&
+      languageVersion.major >= enableNonNullableMajorVersion &&
+      languageVersion.minor >= enableNonNullableMinorVersion &&
       !isOptOutPackage(library.importUri) &&
       !isOptOutTest(library.importUri);
 
@@ -3958,10 +3960,10 @@
       this.fileUri, this.charOffset, this.charCount, this.isExplicit);
 
   @override
-  int get major => Library.defaultLanguageVersionMajor;
+  int get major => kernel.defaultLanguageVersionMajor;
 
   @override
-  int get minor => Library.defaultLanguageVersionMinor;
+  int get minor => kernel.defaultLanguageVersionMinor;
 
   @override
   bool get valid => false;
@@ -3983,10 +3985,10 @@
   const ImplicitLanguageVersion();
 
   @override
-  int get major => Library.defaultLanguageVersionMajor;
+  int get major => kernel.defaultLanguageVersionMajor;
 
   @override
-  int get minor => Library.defaultLanguageVersionMinor;
+  int get minor => kernel.defaultLanguageVersionMinor;
 
   @override
   bool get valid => true;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 23f77b1..3a83aa2 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -2369,7 +2369,8 @@
             argMessage.messageObject, argMessage.charOffset, argMessage.length);
       } else {
         // Argument counts and names match. Compare types.
-        int numPositionalArgs = arguments.positional.length;
+        int positionalShift = isImplicitExtensionMember ? 1 : 0;
+        int numPositionalArgs = arguments.positional.length - positionalShift;
         for (int i = 0; i < formalTypes.length; i++) {
           DartType formalType = formalTypes[i];
           DartType expectedType = substitution != null
@@ -2379,7 +2380,7 @@
           Expression expression;
           NamedExpression namedExpression;
           if (i < numPositionalArgs) {
-            expression = arguments.positional[i];
+            expression = arguments.positional[positionalShift + i];
             positionalArgumentTypes.add(actualType);
           } else {
             namedExpression = arguments.named[i - numPositionalArgs];
@@ -2393,7 +2394,8 @@
               // invocations.
               errorTemplate: templateArgumentTypeNotAssignable);
           if (namedExpression == null) {
-            arguments.positional[i] = expression..parent = arguments;
+            arguments.positional[positionalShift + i] = expression
+              ..parent = arguments;
           } else {
             namedExpression.value = expression..parent = namedExpression;
           }
@@ -2460,7 +2462,7 @@
           function.positionalParameters;
       for (int i = 0; i < positionalParameters.length; i++) {
         VariableDeclaration parameter = positionalParameters[i];
-        flowAnalysis.initialize(parameter);
+        flowAnalysis.declare(parameter, true);
         inferMetadataKeepingHelper(parameter, parameter.annotations);
         if (parameter.initializer != null) {
           ExpressionInferenceResult initializerResult = inferExpression(
@@ -2470,7 +2472,7 @@
         }
       }
       for (VariableDeclaration parameter in function.namedParameters) {
-        flowAnalysis.initialize(parameter);
+        flowAnalysis.declare(parameter, true);
         inferMetadataKeepingHelper(parameter, parameter.annotations);
         ExpressionInferenceResult initializerResult =
             inferExpression(parameter.initializer, parameter.type, !isTopLevel);
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index a430146..4c59273 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -83,19 +83,10 @@
       dillTarget.loader.appendLibraries(sdkSummary);
     }
 
-    // TODO(sigmund): provide better error reporting if input summaries or
-    // linked dependencies were listed out of order (or provide mechanism to
-    // sort them).
-    for (Component inputSummary in await options.loadInputSummaries(nameRoot)) {
-      loadedComponents.add(inputSummary);
-      dillTarget.loader.appendLibraries(inputSummary);
-    }
-
-    // Linked dependencies are meant to be part of the component so they are not
-    // marked external.
-    for (Component dependency in await options.loadLinkDependencies(nameRoot)) {
-      loadedComponents.add(dependency);
-      dillTarget.loader.appendLibraries(dependency);
+    for (Component additionalDill
+        in await options.loadAdditionalDills(nameRoot)) {
+      loadedComponents.add(additionalDill);
+      dillTarget.loader.appendLibraries(additionalDill);
     }
 
     await dillTarget.buildOutlines();
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 7adb555..e47eb41 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -34,8 +34,7 @@
 /// Wraps [kernelForProgram] with some default testing options (see [setup]).
 Future<CompilerResult> compileScript(dynamic scriptOrSources,
     {String fileName: 'main.dart',
-    List<String> inputSummaries: const [],
-    List<String> linkedDependencies: const [],
+    List<String> additionalDills: const [],
     CompilerOptions options,
     bool retainDataForTesting: false,
     bool requireMain: true}) async {
@@ -47,8 +46,7 @@
     assert(scriptOrSources is Map);
     sources = scriptOrSources;
   }
-  await setup(options, sources,
-      inputSummaries: inputSummaries, linkedDependencies: linkedDependencies);
+  await setup(options, sources, additionalDills: additionalDills);
   return await kernelForProgramInternal(toTestUri(fileName), options,
       retainDataForTesting: retainDataForTesting, requireMain: requireMain);
 }
@@ -57,12 +55,9 @@
 ///
 /// Wraps [kernelForModule] with some default testing options (see [setup]).
 Future<Component> compileUnit(List<String> inputs, Map<String, dynamic> sources,
-    {List<String> inputSummaries: const [],
-    List<String> linkedDependencies: const [],
-    CompilerOptions options}) async {
+    {List<String> additionalDills: const [], CompilerOptions options}) async {
   options ??= new CompilerOptions();
-  await setup(options, sources,
-      inputSummaries: inputSummaries, linkedDependencies: linkedDependencies);
+  await setup(options, sources, additionalDills: additionalDills);
   return (await kernelForModule(inputs.map(toTestUri).toList(), options))
       .component;
 }
@@ -71,11 +66,11 @@
 ///
 /// Wraps [summaryFor] with some default testing options (see [setup]).
 Future<List<int>> summarize(List<String> inputs, Map<String, dynamic> sources,
-    {List<String> inputSummaries: const [],
+    {List<String> additionalDills: const [],
     CompilerOptions options,
     bool truncate: false}) async {
   options ??= new CompilerOptions();
-  await setup(options, sources, inputSummaries: inputSummaries);
+  await setup(options, sources, additionalDills: additionalDills);
   return await summaryFor(inputs.map(toTestUri).toList(), options,
       truncate: truncate);
 }
@@ -91,8 +86,7 @@
 ///
 ///   * specify the location of the sdk summaries.
 Future<Null> setup(CompilerOptions options, Map<String, dynamic> sources,
-    {List<String> inputSummaries: const [],
-    List<String> linkedDependencies: const []}) async {
+    {List<String> additionalDills: const []}) async {
   MemoryFileSystem fs = new MemoryFileSystem(_defaultDir);
   sources.forEach((name, data) {
     MemoryFileSystemEntity entity = fs.entityForUri(toTestUri(name));
@@ -111,8 +105,7 @@
   options
     ..verify = true
     ..fileSystem = new HybridFileSystem(fs)
-    ..inputSummaries = inputSummaries.map(toTestUri).toList()
-    ..linkedDependencies = linkedDependencies.map(toTestUri).toList()
+    ..additionalDills = additionalDills.map(toTestUri).toList()
     ..packagesFileUri = toTestUri('.packages');
 
   if (options.sdkSummary == null) {
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index f3c7e88..2ae59d3 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -415,6 +415,8 @@
 InvalidVoid/script2: Fail
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
+JsInteropNonExternalConstructor/analyzerCode: Fail # Web compiler specific
+JsInteropNonExternalConstructor/example: Fail # Web compiler specific
 LanguageVersionInvalidInDotPackages/analyzerCode: Fail
 LanguageVersionMismatchInPart/analyzerCode: Fail
 LanguageVersionMismatchInPart/part_wrapped_script: Fail # Part in (now) part.
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index faa3186..8b833caa 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -971,6 +971,14 @@
     - "void x; main() {}"
     - "foo(void x) {} main() { foo(null); }"
 
+VoidWithTypeArguments:
+  template: "Type 'void' can't have type arguments."
+  tip: "Try removing the type arguments."
+  index: 100
+  analyzerCode: ParserErrorCode.VOID_WITH_TYPE_ARGUMENTS
+  script:
+    - "void<int> f() {}"
+
 # TODO(danrubel): Review where this error is generated and consider generating
 # FieldInitializedOutsideDeclaringClass instead of this in some situations.
 InvalidInitializer:
@@ -3974,7 +3982,10 @@
 
 NonNullableOptOut:
   template: "Null safety features are disabled for this library."
-  tip: "Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`."
+  # Used to be this:
+  # tip: "Try removing the `@dart=` annotation or setting the language version higher."
+  # Once the version number is locked in, we can write something like that again.
+  tip: "Try removing the `@dart=` annotation or setting the language version higher."
 
 NonNullableOptOutComment:
   template: "This is the annotation that opts out this library from null safety features."
@@ -4008,6 +4019,10 @@
   template: "JS interop classes do not support [] and []= operator methods."
   tip: "Try replacing with a normal method."
 
+JsInteropNonExternalConstructor:
+  template: "JS interop classes do not support non-external constructors."
+  tip: "Try annotating with `external`."
+
 DefaultListConstructorError:
   template: "Can't use the default List constructor."
   tip: "Try using List.filled instead."
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart
new file mode 100644
index 0000000..8bde84a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart
@@ -0,0 +1 @@
+void<int> f() {}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.expect
new file mode 100644
index 0000000..b18d71f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.expect
@@ -0,0 +1,28 @@
+Problems reported:
+
+parser/error_recovery/issue_39958_01:1:5: Type 'void' can't have type arguments.
+void<int> f() {}
+    ^
+
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleRecoverableError(VoidWithTypeArguments, <, <)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleVoidKeywordWithTypeArguments(void)
+      handleIdentifier(f, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.intertwined.expect
new file mode 100644
index 0000000..da6f501
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.intertwined.expect
@@ -0,0 +1,40 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, f)
+        listener: beginTopLevelMethod(, null)
+        reportRecoverableError(<, VoidWithTypeArguments)
+          listener: handleRecoverableError(VoidWithTypeArguments, <, <)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        listener: handleVoidKeywordWithTypeArguments(void)
+        ensureIdentifier(>, topLevelFunctionDeclaration)
+          listener: handleIdentifier(f, topLevelFunctionDeclaration)
+        parseMethodTypeVar(f)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(f, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.parser.expect
new file mode 100644
index 0000000..9820aec
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.parser.expect
@@ -0,0 +1,3 @@
+void<int> f() {}
+
+void[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.scanner.expect
new file mode 100644
index 0000000..9820aec
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_01.dart.scanner.expect
@@ -0,0 +1,3 @@
+void<int> f() {}
+
+void[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart
new file mode 100644
index 0000000..58b5740
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart
@@ -0,0 +1 @@
+dynamic<int> f() {}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.expect
new file mode 100644
index 0000000..ea1fdaf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.expect
@@ -0,0 +1,22 @@
+beginCompilationUnit(dynamic)
+  beginMetadataStar(dynamic)
+  endMetadataStar(0)
+  beginTopLevelMember(dynamic)
+    beginTopLevelMethod(, null)
+      handleIdentifier(dynamic, typeReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleType(dynamic, null)
+      handleIdentifier(f, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(dynamic, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.intertwined.expect
new file mode 100644
index 0000000..23ab86d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.intertwined.expect
@@ -0,0 +1,39 @@
+parseUnit(dynamic)
+  skipErrorTokens(dynamic)
+  listener: beginCompilationUnit(dynamic)
+  syntheticPreviousToken(dynamic)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(dynamic)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(dynamic)
+      parseTopLevelMethod(, null, , Instance of 'SimpleTypeWith1Argument', null, f)
+        listener: beginTopLevelMethod(, null)
+        listener: handleIdentifier(dynamic, typeReference)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        listener: handleType(dynamic, null)
+        ensureIdentifier(>, topLevelFunctionDeclaration)
+          listener: handleIdentifier(f, topLevelFunctionDeclaration)
+        parseMethodTypeVar(f)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(f, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(dynamic, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(dynamic)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.parser.expect
new file mode 100644
index 0000000..fc0bc4d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.parser.expect
@@ -0,0 +1,3 @@
+dynamic<int> f() {}
+
+dynamic[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.scanner.expect
new file mode 100644
index 0000000..fc0bc4d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_02.dart.scanner.expect
@@ -0,0 +1,3 @@
+dynamic<int> f() {}
+
+dynamic[KeywordToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart
new file mode 100644
index 0000000..1a13723
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart
@@ -0,0 +1 @@
+int<int> f() {}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.expect
new file mode 100644
index 0000000..c630e6a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.expect
@@ -0,0 +1,22 @@
+beginCompilationUnit(int)
+  beginMetadataStar(int)
+  endMetadataStar(0)
+  beginTopLevelMember(int)
+    beginTopLevelMethod(, null)
+      handleIdentifier(int, typeReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleType(int, null)
+      handleIdentifier(f, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(int, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.intertwined.expect
new file mode 100644
index 0000000..86f90d9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.intertwined.expect
@@ -0,0 +1,39 @@
+parseUnit(int)
+  skipErrorTokens(int)
+  listener: beginCompilationUnit(int)
+  syntheticPreviousToken(int)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(int)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(int)
+      parseTopLevelMethod(, null, , Instance of 'SimpleTypeWith1Argument', null, f)
+        listener: beginTopLevelMethod(, null)
+        listener: handleIdentifier(int, typeReference)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        listener: handleType(int, null)
+        ensureIdentifier(>, topLevelFunctionDeclaration)
+          listener: handleIdentifier(f, topLevelFunctionDeclaration)
+        parseMethodTypeVar(f)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(f, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(int, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(int)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.parser.expect
new file mode 100644
index 0000000..4131ad4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.parser.expect
@@ -0,0 +1,3 @@
+int<int> f() {}
+
+int[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.scanner.expect
new file mode 100644
index 0000000..4131ad4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_03.dart.scanner.expect
@@ -0,0 +1,3 @@
+int<int> f() {}
+
+int[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart
new file mode 100644
index 0000000..1a373f5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart
@@ -0,0 +1 @@
+Foo<int> f() {}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.expect
new file mode 100644
index 0000000..bb5654f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.expect
@@ -0,0 +1,22 @@
+beginCompilationUnit(Foo)
+  beginMetadataStar(Foo)
+  endMetadataStar(0)
+  beginTopLevelMember(Foo)
+    beginTopLevelMethod(, null)
+      handleIdentifier(Foo, typeReference)
+      beginTypeArguments(<)
+        handleIdentifier(int, typeReference)
+        handleNoTypeArguments(>)
+        handleType(int, null)
+      endTypeArguments(1, <, >)
+      handleType(Foo, null)
+      handleIdentifier(f, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(Foo, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.intertwined.expect
new file mode 100644
index 0000000..502ba49
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.intertwined.expect
@@ -0,0 +1,39 @@
+parseUnit(Foo)
+  skipErrorTokens(Foo)
+  listener: beginCompilationUnit(Foo)
+  syntheticPreviousToken(Foo)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(Foo)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(Foo)
+      parseTopLevelMethod(, null, , Instance of 'SimpleTypeWith1Argument', null, f)
+        listener: beginTopLevelMethod(, null)
+        listener: handleIdentifier(Foo, typeReference)
+        listener: beginTypeArguments(<)
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(int, null)
+        listener: endTypeArguments(1, <, >)
+        listener: handleType(Foo, null)
+        ensureIdentifier(>, topLevelFunctionDeclaration)
+          listener: handleIdentifier(f, topLevelFunctionDeclaration)
+        parseMethodTypeVar(f)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(f, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(Foo, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(Foo)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.parser.expect
new file mode 100644
index 0000000..59a90cf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.parser.expect
@@ -0,0 +1,3 @@
+Foo<int> f() {}
+
+Foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.scanner.expect
new file mode 100644
index 0000000..59a90cf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39958_04.dart.scanner.expect
@@ -0,0 +1,3 @@
+Foo<int> f() {}
+
+Foo[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] f[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index c3addc7..5f473d7 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -2923,6 +2923,11 @@
     calls.add('handleVoidKeyword $token');
   }
 
+  @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    calls.add('handleVoidKeywordWithTypeArguments $token');
+  }
+
   noSuchMethod(Invocation invocation) {
     throw '${invocation.memberName} should not be called.';
   }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index ce31947..61b94ee 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -23,7 +23,7 @@
     show CompilerOptions, DiagnosticMessage;
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
+    show ExperimentalFlag, defaultExperimentalFlags;
 
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
@@ -148,21 +148,25 @@
 final Expectation runtimeError = ExpectationSet.Default["RuntimeError"];
 
 const String experimentalFlagOptions = '--enable-experiment=';
+const String overwriteCurrentSdkVersion = '--overwrite-current-sdk-version=';
 
 class TestOptions {
-  final Map<ExperimentalFlag, bool> experimentalFlags;
+  final Map<ExperimentalFlag, bool> _experimentalFlags;
   final bool forceLateLowering;
   final bool forceNnbdChecks;
   final bool forceNoExplicitGetterCalls;
   final bool nnbdAgnosticMode;
   final String target;
+  final String overwriteCurrentSdkVersion;
 
-  TestOptions(this.experimentalFlags,
+  TestOptions(this._experimentalFlags,
       {this.forceLateLowering: false,
       this.forceNnbdChecks: false,
       this.forceNoExplicitGetterCalls: false,
       this.nnbdAgnosticMode: false,
-      this.target: "vm"})
+      this.target: "vm",
+      // can be null
+      this.overwriteCurrentSdkVersion})
       : assert(forceLateLowering != null),
         assert(forceNnbdChecks != null),
         assert(forceNoExplicitGetterCalls != null),
@@ -171,7 +175,8 @@
 
   Map<ExperimentalFlag, bool> computeExperimentalFlags(
       Map<ExperimentalFlag, bool> forcedExperimentalFlags) {
-    Map<ExperimentalFlag, bool> flags = new Map.from(experimentalFlags);
+    Map<ExperimentalFlag, bool> flags = new Map.from(defaultExperimentalFlags);
+    flags.addAll(_experimentalFlags);
     flags.addAll(forcedExperimentalFlags);
     return flags;
   }
@@ -305,11 +310,15 @@
             new File.fromUri(directory.uri.resolve('test.options'));
         if (optionsFile.existsSync()) {
           List<String> experimentalFlagsArguments = [];
+          String overwriteCurrentSdkVersionArgument = null;
           for (String line in optionsFile.readAsStringSync().split('\n')) {
             line = line.trim();
             if (line.startsWith(experimentalFlagOptions)) {
               experimentalFlagsArguments =
                   line.substring(experimentalFlagOptions.length).split('\n');
+            } else if (line.startsWith(overwriteCurrentSdkVersion)) {
+              overwriteCurrentSdkVersionArgument =
+                  line.substring(overwriteCurrentSdkVersion.length);
             } else if (line.startsWith(Flags.forceLateLowering)) {
               forceLateLowering = true;
             } else if (line.startsWith(Flags.forceNnbdChecks)) {
@@ -338,7 +347,8 @@
               forceNnbdChecks: forceNnbdChecks,
               forceNoExplicitGetterCalls: forceNoExplicitGetterCalls,
               nnbdAgnosticMode: nnbdAgnosticMode,
-              target: target);
+              target: target,
+              overwriteCurrentSdkVersion: overwriteCurrentSdkVersionArgument);
         } else {
           testOptions = _computeTestOptionsForDirectory(directory.parent);
         }
@@ -366,22 +376,26 @@
       Uri sdk = Uri.base.resolve("sdk/");
       Uri packages = Uri.base.resolve(".packages");
       TestOptions testOptions = computeTestOptions(description);
-      ProcessedOptions options = new ProcessedOptions(
-          options: new CompilerOptions()
-            ..onDiagnostic = (DiagnosticMessage message) {
-              throw message.plainTextFormatted.join("\n");
-            }
-            ..sdkRoot = sdk
-            ..packagesFileUri = packages
-            ..environmentDefines = {}
-            ..experimentalFlags =
-                testOptions.computeExperimentalFlags(experimentalFlags)
-            ..nnbdMode = weak
-                ? NnbdMode.Weak
-                : (testOptions.nnbdAgnosticMode
-                    ? NnbdMode.Agnostic
-                    : NnbdMode.Strong)
-            ..librariesSpecificationUri = librariesSpecificationUri);
+      CompilerOptions compilerOptions = new CompilerOptions()
+        ..onDiagnostic = (DiagnosticMessage message) {
+          throw message.plainTextFormatted.join("\n");
+        }
+        ..sdkRoot = sdk
+        ..packagesFileUri = packages
+        ..environmentDefines = {}
+        ..experimentalFlags =
+            testOptions.computeExperimentalFlags(experimentalFlags)
+        ..nnbdMode = weak
+            ? NnbdMode.Weak
+            : (testOptions.nnbdAgnosticMode
+                ? NnbdMode.Agnostic
+                : NnbdMode.Strong)
+        ..librariesSpecificationUri = librariesSpecificationUri;
+      if (testOptions.overwriteCurrentSdkVersion != null) {
+        compilerOptions.currentSdkVersion =
+            testOptions.overwriteCurrentSdkVersion;
+      }
+      ProcessedOptions options = new ProcessedOptions(options: compilerOptions);
       uriTranslator = await options.getUriTranslator();
       _uriTranslators[librariesSpecificationUri] = uriTranslator;
     }
@@ -535,6 +549,8 @@
 
   Future<Result<int>> run(ComponentResult result, FastaContext context) async {
     TestOptions testOptions = context.computeTestOptions(result.description);
+    Map<ExperimentalFlag, bool> experimentalFlags =
+        testOptions.computeExperimentalFlags(context.experimentalFlags);
     switch (testOptions.target) {
       case "vm":
         if (context.platformUri == null) {
@@ -544,6 +560,12 @@
         StdioProcess process;
         try {
           var args = <String>[];
+          if (experimentalFlags[ExperimentalFlag.nonNullable]) {
+            args.add("--enable-experiment=non-nullable");
+            if (!context.weak) {
+              args.add("--null-safety");
+            }
+          }
           args.add(generated.path);
           process = await StdioProcess.run(context.vm.toFilePath(), args);
           print(process.output);
@@ -590,20 +612,23 @@
     List<Uri> inputs = <Uri>[description.uri];
 
     ProcessedOptions createProcessedOptions(NnbdMode nnbdMode) {
-      return new ProcessedOptions(
-          options: new CompilerOptions()
-            ..onDiagnostic = (DiagnosticMessage message) {
-              if (errors.isNotEmpty) {
-                errors.write("\n\n");
-              }
-              errors.writeAll(message.plainTextFormatted, "\n");
-            }
-            ..environmentDefines = {}
-            ..experimentalFlags = experimentalFlags
-            ..performNnbdChecks = testOptions.forceNnbdChecks
-            ..nnbdMode = nnbdMode
-            ..librariesSpecificationUri = librariesSpecificationUri,
-          inputs: inputs);
+      CompilerOptions compilerOptions = new CompilerOptions()
+        ..onDiagnostic = (DiagnosticMessage message) {
+          if (errors.isNotEmpty) {
+            errors.write("\n\n");
+          }
+          errors.writeAll(message.plainTextFormatted, "\n");
+        }
+        ..environmentDefines = {}
+        ..experimentalFlags = experimentalFlags
+        ..performNnbdChecks = testOptions.forceNnbdChecks
+        ..nnbdMode = nnbdMode
+        ..librariesSpecificationUri = librariesSpecificationUri;
+      if (testOptions.overwriteCurrentSdkVersion != null) {
+        compilerOptions.currentSdkVersion =
+            testOptions.overwriteCurrentSdkVersion;
+      }
+      return new ProcessedOptions(options: compilerOptions, inputs: inputs);
     }
 
     // Disable colors to ensure that expectation files are the same across
diff --git a/pkg/front_end/test/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
index cda1f76..d58ec7f 100644
--- a/pkg/front_end/test/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_test.dart
@@ -19,8 +19,7 @@
 
 import 'package:kernel/ast.dart' show Component;
 
-import 'package:kernel/binary/limited_ast_to_binary.dart'
-    show LimitedBinaryPrinter;
+import 'package:kernel/binary/ast_to_binary.dart';
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions;
@@ -321,8 +320,8 @@
   var sink = new File.fromUri(outputUri).openWrite();
   // TODO(sigmund): the incremental generator should always filter these
   // libraries instead.
-  new LimitedBinaryPrinter(
-          sink, (library) => library.importUri.scheme != 'dart', false)
+  new BinaryPrinter(sink,
+          libraryFilter: (library) => library.importUri.scheme != 'dart')
       .writeComponentFile(component);
   await sink.close();
 }
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index fa0b755..33de8fd 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -191,21 +191,18 @@
       ClassHierarchyNode classHierarchyNode =
           _classHierarchyBuilder.getNodeFromClass(node);
       Set<String> supertypes = <String>{};
-      void addDartType(DartType type) {
-        if (type is InterfaceType) {
-          if (type.classNode.isAnonymousMixin) return;
-          Supertype supertype =
-              new Supertype(type.classNode, type.typeArguments);
-          supertypes.add(supertypeToText(
-              supertype, TypeRepresentation.analyzerNonNullableByDefault));
-        }
+      void addSupertype(Supertype supertype) {
+        if (supertype.classNode.isAnonymousMixin) return;
+        supertypes.add(supertypeToText(
+            supertype, TypeRepresentation.analyzerNonNullableByDefault));
       }
 
-      addDartType(_coreTypes.thisInterfaceType(
+      addSupertype(new Supertype(
           classHierarchyNode.classBuilder.cls,
-          classHierarchyNode.classBuilder.cls.enclosingLibrary.nonNullable));
-      classHierarchyNode.superclasses.forEach(addDartType);
-      classHierarchyNode.interfaces.forEach(addDartType);
+          getAsTypeArguments(classHierarchyNode.classBuilder.cls.typeParameters,
+              classHierarchyNode.classBuilder.library.library)));
+      classHierarchyNode.superclasses.forEach(addSupertype);
+      classHierarchyNode.interfaces.forEach(addSupertype);
       List<String> sorted = supertypes.toList()..sort();
       return sorted.join(',');
     }
diff --git a/pkg/front_end/test/issue_34856_test.dart b/pkg/front_end/test/issue_34856_test.dart
index 15f424c..7e78eb1 100644
--- a/pkg/front_end/test/issue_34856_test.dart
+++ b/pkg/front_end/test/issue_34856_test.dart
@@ -85,7 +85,7 @@
 
   options = new CompilerOptions()
     ..fileSystem = fs
-    ..linkedDependencies = <Uri>[base.resolve("lib.dart.dill")]
+    ..additionalDills = <Uri>[base.resolve("lib.dart.dill")]
     ..sdkSummary = platformDill;
 
   List<Uri> inputs = <Uri>[base.resolve("repro.dart")];
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 8103c8c..27fe114 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -138,7 +138,7 @@
       sources['a.dill'] = serializeComponent(unitA);
 
       var unitBC = await compileUnit(['b.dart', 'c.dart'], sources,
-          inputSummaries: ['a.dill']);
+          additionalDills: ['a.dill']);
 
       // Pretend that the compiled code is a summary
       sources['bc.dill'] = serializeComponent(unitBC);
@@ -155,11 +155,11 @@
       }
 
       var unitD1 = await compileUnit(['d.dart'], sources,
-          inputSummaries: ['a.dill', 'bc.dill']);
+          additionalDills: ['a.dill', 'bc.dill']);
       checkDCallsC(unitD1);
 
       var unitD2 = await compileUnit(['d.dart'], sources,
-          inputSummaries: ['bc.dill', 'a.dill']);
+          additionalDills: ['bc.dill', 'a.dill']);
       checkDCallsC(unitD2);
     });
 
diff --git a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_test.dart b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_test.dart
index 36d0799..171e212 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_test.dart
@@ -3,8 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io' show Platform, Process, ProcessResult;
+
 import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:kernel/ast.dart' as kernel show Library;
+
+import 'package:kernel/default_language_version.dart' as kernel
+    show defaultLanguageVersionMajor, defaultLanguageVersionMinor;
 
 import '../utils/io_utils.dart';
 
@@ -34,12 +37,12 @@
   int major = int.tryParse(dotSeparatedParts[0]);
   int minor = int.tryParse(dotSeparatedParts[1]);
 
-  if (kernel.Library.defaultLanguageVersionMajor != major ||
-      kernel.Library.defaultLanguageVersionMinor != minor) {
+  if (kernel.defaultLanguageVersionMajor != major ||
+      kernel.defaultLanguageVersionMinor != minor) {
     throw "Kernel defaults "
-        "${kernel.Library.defaultLanguageVersionMajor}"
+        "${kernel.defaultLanguageVersionMajor}"
         "."
-        "${kernel.Library.defaultLanguageVersionMinor}"
+        "${kernel.defaultLanguageVersionMinor}"
         " does not match output from make_version.py ($major.$minor)";
   } else {
     print("Kernel version matches.");
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index b3f5376..7845720 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -1603,6 +1603,10 @@
     doPrint('handleVoidKeyword(' '$token)');
   }
 
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    doPrint('handleVoidKeywordWithTypeArguments(' '$token)');
+  }
+
   void beginYieldStatement(Token token) {
     doPrint('beginYieldStatement(' '$token)');
     indent++;
diff --git a/pkg/front_end/test/patching/data/opt_in/origin.dart b/pkg/front_end/test/patching/data/opt_in/origin.dart
index 87b2f28..1ccedea 100644
--- a/pkg/front_end/test/patching/data/opt_in/origin.dart
+++ b/pkg/front_end/test/patching/data/opt_in/origin.dart
@@ -4,6 +4,6 @@
 
 /*cfe:nnbd.library: nnbd=true*/
 
-// @dart=2.8
+// @dart=2.9999
 
 external int method(int? i);
diff --git a/pkg/front_end/test/patching/data/opt_in/patch.dart b/pkg/front_end/test/patching/data/opt_in/patch.dart
index 43884ea..298cd4a 100644
--- a/pkg/front_end/test/patching/data/opt_in/patch.dart
+++ b/pkg/front_end/test/patching/data/opt_in/patch.dart
@@ -2,7 +2,7 @@
 // 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.8
+// @dart=2.9999
 
 // ignore: import_internal_library
 import 'dart:_internal';
diff --git a/pkg/front_end/test/patching/data/opt_in_patch/patch.dart b/pkg/front_end/test/patching/data/opt_in_patch/patch.dart
index 8b8d368..9ee2b59 100644
--- a/pkg/front_end/test/patching/data/opt_in_patch/patch.dart
+++ b/pkg/front_end/test/patching/data/opt_in_patch/patch.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*cfe:nnbd.error: message=The language version override has to be the same in the library and its patch(es).*/
-// @dart=2.8
+// @dart=2.9999
 
 // ignore: import_internal_library
 import 'dart:_internal';
diff --git a/pkg/front_end/test/patching/data/opt_out_patch/origin.dart b/pkg/front_end/test/patching/data/opt_out_patch/origin.dart
index 6234d1a..e90fe24 100644
--- a/pkg/front_end/test/patching/data/opt_out_patch/origin.dart
+++ b/pkg/front_end/test/patching/data/opt_out_patch/origin.dart
@@ -4,6 +4,6 @@
 
 /*cfe:nnbd.library: nnbd=true*/
 
-// @dart=2.8
+// @dart=2.9999
 
 external int method();
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 5e9b0a4..753ef203 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -8,6 +8,7 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, runTests;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/fasta/builder/builder.dart';
 import 'package:front_end/src/fasta/builder/class_builder.dart';
@@ -25,9 +26,10 @@
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
       runTest: runTestFor(const PatchingDataComputer(), [
-        new TestConfig(cfeMarker, 'cfe with libraries specification',
+        new TestConfigWithLanguageVersion(
+            cfeMarker, 'cfe with libraries specification',
             librariesSpecificationUri: createUriForFileName('libraries.json')),
-        new TestConfig(cfeWithNnbdMarker,
+        new TestConfigWithLanguageVersion(cfeWithNnbdMarker,
             'cfe with libraries specification and non-nullable',
             librariesSpecificationUri: createUriForFileName('libraries.json'),
             experimentalFlags: {ExperimentalFlag.nonNullable: true})
@@ -42,6 +44,20 @@
       });
 }
 
+class TestConfigWithLanguageVersion extends TestConfig {
+  TestConfigWithLanguageVersion(String marker, String name,
+      {Uri librariesSpecificationUri,
+      Map<ExperimentalFlag, bool> experimentalFlags = const {}})
+      : super(marker, name,
+            librariesSpecificationUri: librariesSpecificationUri,
+            experimentalFlags: experimentalFlags);
+
+  @override
+  void customizeCompilerOptions(CompilerOptions options) {
+    options.currentSdkVersion = "2.9999";
+  }
+}
+
 class PatchingDataComputer extends DataComputer<Features> {
   const PatchingDataComputer();
 
diff --git a/pkg/front_end/test/simple_stats.dart b/pkg/front_end/test/simple_stats.dart
index c8ef59e..062d59d 100644
--- a/pkg/front_end/test/simple_stats.dart
+++ b/pkg/front_end/test/simple_stats.dart
@@ -23,9 +23,10 @@
     if (confidence < diffMean.abs()) {
       double percentDiff = diffMean * 100 / bMean;
       double percentDiffConfidence = confidence * 100 / bMean;
-      return new TTestResult(true, percentDiff, percentDiffConfidence);
+      return new TTestResult(
+          true, percentDiff, percentDiffConfidence, diffMean, confidence);
     } else {
-      return new TTestResult(false, 0, 0);
+      return new TTestResult(false, 0, 0, 0, 0);
     }
   }
 
@@ -94,15 +95,30 @@
   final bool significant;
   final double percentDiff;
   final double percentDiffConfidence;
+  final double diff;
+  final double confidence;
 
-  TTestResult(this.significant, this.percentDiff, this.percentDiffConfidence);
+  TTestResult(this.significant, this.percentDiff, this.percentDiffConfidence,
+      this.diff, this.confidence);
 
   String toString() {
     if (significant) {
+      double leastConfidentChange;
+      if (diff < 0) {
+        leastConfidentChange = diff + confidence;
+      } else {
+        leastConfidentChange = diff - confidence;
+      }
       return "TTestResult[significant: "
-          "$percentDiff% +/- $percentDiffConfidence%]";
+          "${_format(percentDiff)}% +/- ${_format(percentDiffConfidence)}% "
+          "(${_format(diff)} +/- ${_format(confidence)}) "
+          "(at least ${_format(leastConfidentChange)})]";
     } else {
       return "TTestResult[not significant]";
     }
   }
+
+  String _format(double d) {
+    return d.toStringAsFixed(2);
+  }
 }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1553958..1552922 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -151,6 +151,7 @@
 ck
 cl
 claim
+claimed
 clarification
 clashes
 class's
@@ -282,6 +283,7 @@
 digest
 digests
 dijkstra's
+dills
 directed
 directions
 dirtify
@@ -875,6 +877,7 @@
 rs
 runnable
 s
+saw
 say
 sb
 sc
@@ -1122,6 +1125,7 @@
 unwraps
 unzip
 upcast
+update2018
 ur
 uri's
 url
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 8e62978..68fea26 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -136,6 +136,7 @@
 angle
 annotatable
 annotated
+annotating
 annotation
 annotations
 annotator
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 7f38ea6..89ce2e9 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -98,6 +98,7 @@
 complement
 completers
 confidence
+confident
 confirm
 consecutive
 considering
@@ -115,6 +116,7 @@
 daemon
 dartanalyzer
 dartfile
+dash
 dashes
 day
 db
@@ -184,6 +186,7 @@
 explain
 extern
 fac
+faking
 falling
 favors
 fetched
@@ -379,6 +382,7 @@
 retains
 rev
 risky
+runtimes
 say
 scans
 screen
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index bd4775e..486295d 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -40,7 +40,7 @@
     sourcesWithA['a.dill'] = summaryA;
 
     var summaryBC = await summarize(['b.dart', 'c.dart'], sourcesWithA,
-        inputSummaries: ['a.dill']);
+        additionalDills: ['a.dill']);
 
     var sourcesWithABC = new Map<String, dynamic>.from(sourcesWithA);
     sourcesWithABC['bc.dill'] = summaryBC;
@@ -48,7 +48,7 @@
     // Note: a is loaded first, bc.dill have a.dart as an external reference so
     // we want to ensure loading them here will not create a problem.
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
-        inputSummaries: ['a.dill', 'bc.dill']);
+        additionalDills: ['a.dill', 'bc.dill']);
 
     checkDSummary(summaryD);
   });
@@ -59,7 +59,7 @@
     sourcesWithA['a.dill'] = summaryA;
 
     var summaryBC = await summarize(['b.dart', 'c.dart'], sourcesWithA,
-        inputSummaries: ['a.dill']);
+        additionalDills: ['a.dill']);
 
     var sourcesWithABC = new Map<String, dynamic>.from(sourcesWithA);
     sourcesWithABC['bc.dill'] = summaryBC;
@@ -69,7 +69,7 @@
     // because we share a CanonicalName root to resolve names across multiple
     // dill files and because of how the kernel loader merges definitions.
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
-        inputSummaries: ['bc.dill', 'a.dill']);
+        additionalDills: ['bc.dill', 'a.dill']);
     checkDSummary(summaryD);
   });
 
@@ -84,7 +84,7 @@
     var sourcesWithA = new Map<String, dynamic>.from(allSources);
     sourcesWithA['a.dill'] = summaryA;
     var summaryB = await summarize(['b.dart'], sourcesWithA,
-        inputSummaries: ['a.dill'], truncate: true);
+        additionalDills: ['a.dill'], truncate: true);
     component = loadComponentFromBytes(summaryB);
     expect(component.libraries.length, 1);
     expect(
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart b/pkg/front_end/testcases/extensions/issue40816.dart
new file mode 100644
index 0000000..d521d29
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40816.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.
+
+class A {}
+
+class B {}
+
+extension on A {
+  void foo(A a, B b) {}
+}
+
+void main() {
+  dynamic a = A();
+  dynamic b = B();
+  A().foo(a, b);
+}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.outline.expect b/pkg/front_end/testcases/extensions/issue40816.dart.outline.expect
new file mode 100644
index 0000000..934efa0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+extension _extension#0 on self::A* {
+  method foo = self::_extension#0|foo;
+  tearoff foo = self::_extension#0|get#foo;
+}
+static method _extension#0|foo(final self::A* #this, self::A* a, self::B* b) → void
+  ;
+static method _extension#0|get#foo(final self::A* #this) → (self::A*, self::B*) →* void
+  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.strong.expect b/pkg/front_end/testcases/extensions/issue40816.dart.strong.expect
new file mode 100644
index 0000000..b69ff84
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::A* {
+  method foo = self::_extension#0|foo;
+  tearoff foo = self::_extension#0|get#foo;
+}
+static method _extension#0|foo(final self::A* #this, self::A* a, self::B* b) → void {}
+static method _extension#0|get#foo(final self::A* #this) → (self::A*, self::B*) →* void
+  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method main() → void {
+  dynamic a = new self::A::•();
+  dynamic b = new self::B::•();
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue40816.dart.strong.transformed.expect
new file mode 100644
index 0000000..b69ff84
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::A* {
+  method foo = self::_extension#0|foo;
+  tearoff foo = self::_extension#0|get#foo;
+}
+static method _extension#0|foo(final self::A* #this, self::A* a, self::B* b) → void {}
+static method _extension#0|get#foo(final self::A* #this) → (self::A*, self::B*) →* void
+  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method main() → void {
+  dynamic a = new self::A::•();
+  dynamic b = new self::B::•();
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+}
diff --git a/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
index 2fe75da..2d6ae21 100644
--- a/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
@@ -27,9 +27,9 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  self::Node* :async_temporary_0;
-  self::Node* :async_temporary_1;
-  self::Node* :async_temporary_2;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
@@ -42,11 +42,11 @@
         [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[:async_temporary_1, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
         [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node* node = new self::Node::•("1", <self::Node*>[:async_temporary_2, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)]);
+        self::Node* node = new self::Node::•("1", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)]);
         core::String* actual = node.{self::Node::toSimpleString}() as{TypeError,ForDynamic} core::String*;
         core::print(actual);
         if(!actual.{core::String::==}(expected)) {
diff --git a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
index 3840565..8a2da7f 100644
--- a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
@@ -55,39 +55,39 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
-  core::int* :async_temporary_5;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
+  dynamic :async_temporary_5;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
       {
         :async_temporary_0 = self::C::staticField;
         [yield] let dynamic #t1 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::C::staticField = 1;
         [yield] let dynamic #t2 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* f = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* f = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, f);
         :async_temporary_2 = self::C::staticGetter;
         [yield] let dynamic #t3 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_3 = self::C::staticSetter = 1;
         [yield] let dynamic #t4 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_4 = self::C::staticFoo(2);
         [yield] let dynamic #t5 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(3, d);
         :async_temporary_5 = self::C::staticField.{core::num::+}(self::C::staticGetter).{core::num::+}(self::C::staticSetter = 1).{core::num::+}(self::C::staticFoo(1));
         [yield] let dynamic #t6 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_5.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_5).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -111,34 +111,34 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L2:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t7 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::topLevelGetter;
         [yield] let dynamic #t8 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = self::topLevelSetter = 1;
         [yield] let dynamic #t9 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = self::topLevelFoo(1);
         [yield] let dynamic #t10 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = self::globalVariable.{core::num::+}(self::topLevelGetter).{core::num::+}(self::topLevelSetter = 1).{core::num::+}(self::topLevelFoo(1));
         [yield] let dynamic #t11 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -162,11 +162,11 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L3:
@@ -174,23 +174,23 @@
         self::C* inst = new self::C::•();
         :async_temporary_0 = inst.{self::C::field};
         [yield] let dynamic #t12 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = inst.{self::C::getter};
         [yield] let dynamic #t13 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = inst.{self::C::setter} = 1;
         [yield] let dynamic #t14 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = inst.{self::C::foo}(1);
         [yield] let dynamic #t15 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = inst.{self::C::field}.{core::num::+}(inst.{self::C::getter}).{core::num::+}(inst.{self::C::setter} = 1).{core::num::+}(inst.{self::C::foo}(1));
         [yield] let dynamic #t16 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -214,35 +214,35 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::String* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::List<core::int*>* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L4:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t17 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = "${:async_temporary_0} ${:result} ";
+        :async_temporary_0 = "${_in::unsafeCast<core::int*>(:async_temporary_0)} ${:result} ";
         [yield] let dynamic #t18 = asy::_awaitHelper("someString", :async_op_then, :async_op_error, :async_op) in null;
-        core::String* a = :async_temporary_0.{core::String::+}(_in::unsafeCast<core::String*>(:result));
+        core::String* a = _in::unsafeCast<core::String*>(:async_temporary_0).{core::String::+}(_in::unsafeCast<core::String*>(:result));
         self::expect("1 1 someString", a);
         self::C* c = new self::C::•();
         :async_temporary_1 = c.{self::C::field};
         [yield] let dynamic #t19 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         core::int* cnt = 2;
         core::List<core::int*>* b = <core::int*>[1, 2, 3];
         :async_temporary_3 = b;
         :async_temporary_2 = cnt;
         [yield] let dynamic #t20 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_3.{core::List::[]=}(:async_temporary_2, :result as{TypeError,ForDynamic} core::int*);
+        _in::unsafeCast<core::List<core::int*>*>(:async_temporary_3).{core::List::[]=}(_in::unsafeCast<core::int*>(:async_temporary_2), :result as{TypeError,ForDynamic} core::int*);
         self::expect(1, b.{core::List::[]}(cnt));
         :async_temporary_4 = b.{core::List::[]}(0);
         [yield] let dynamic #t21 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -416,8 +416,8 @@
   dynamic :saved_try_context_var3;
   dynamic :exception0;
   dynamic :stack_trace0;
-  core::List<dynamic>* :async_temporary_0;
-  core::List<dynamic>* :async_temporary_1;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L7:
@@ -631,7 +631,7 @@
               }
               :async_temporary_0 = <dynamic>[42];
               [yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_0, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_0), _in::unsafeCast<core::List<core::int*>*>(:result));
               function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
                 asy::_AsyncStarStreamController<core::int*>* :controller;
                 dynamic :controller_stream;
@@ -670,7 +670,7 @@
               }
               :async_temporary_1 = <dynamic>[42];
               [yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_1, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_1), _in::unsafeCast<core::List<core::int*>*>(:result));
             }
           }
         }
diff --git a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
index afe0a4f..52fd146 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -17,10 +17,10 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
   core::List<core::int*>* :async_temporary_2;
-  core::int* :async_temporary_3;
+  dynamic :async_temporary_3;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
@@ -30,12 +30,12 @@
           :async_temporary_1 = x.{core::num::+}(1);
           :async_temporary_0 = x.{core::num::+}(2);
           [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          :async_temporary_2 = <core::int*>[:async_temporary_1, :async_temporary_0, _in::unsafeCast<core::Null?>(:result)];
+          :async_temporary_2 = <core::int*>[_in::unsafeCast<core::int*>(:async_temporary_1), _in::unsafeCast<core::int*>(:async_temporary_0), _in::unsafeCast<core::Null?>(:result)];
         }
         else {
           :async_temporary_2 = null;
         }
-        :return_value = self::bar(:async_temporary_3, :async_temporary_2);
+        :return_value = self::bar(_in::unsafeCast<core::int*>(:async_temporary_3), :async_temporary_2);
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart
new file mode 100644
index 0000000..c056d2b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart
@@ -0,0 +1,4 @@
+dynamic<int> f() {}
+main() {
+  f();
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.outline.expect b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.outline.expect
new file mode 100644
index 0000000..bf2c639
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_dynamic.dart:1:1: Error: Expected 0 type arguments.
+// dynamic<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.expect b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.expect
new file mode 100644
index 0000000..5e20cb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_dynamic.dart:1:1: Error: Expected 0 type arguments.
+// dynamic<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.transformed.expect
new file mode 100644
index 0000000..5e20cb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_dynamic.dart:1:1: Error: Expected 0 type arguments.
+// dynamic<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general/type_parameters_on_void.dart b/pkg/front_end/testcases/general/type_parameters_on_void.dart
new file mode 100644
index 0000000..ad72c99
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_void.dart
@@ -0,0 +1,5 @@
+void<int> f() {}
+
+main() {
+  f();
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/type_parameters_on_void.dart.outline.expect b/pkg/front_end/testcases/general/type_parameters_on_void.dart.outline.expect
new file mode 100644
index 0000000..841412c
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_void.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_void.dart:1:5: Error: Type 'void' can't have type arguments.
+// Try removing the type arguments.
+// void<int> f() {}
+//     ^
+//
+import self as self;
+
+static method f() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.expect b/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.expect
new file mode 100644
index 0000000..0f39d1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_void.dart:1:5: Error: Type 'void' can't have type arguments.
+// Try removing the type arguments.
+// void<int> f() {}
+//     ^
+//
+import self as self;
+
+static method f() → void {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f39d1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_void.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_void.dart:1:5: Error: Type 'void' can't have type arguments.
+// Try removing the type arguments.
+// void<int> f() {}
+//     ^
+//
+import self as self;
+
+static method f() → void {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.strong.transformed.expect
index 2fe75da..2d6ae21 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.strong.transformed.expect
@@ -27,9 +27,9 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  self::Node* :async_temporary_0;
-  self::Node* :async_temporary_1;
-  self::Node* :async_temporary_2;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
@@ -42,11 +42,11 @@
         [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[:async_temporary_1, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
         [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node* node = new self::Node::•("1", <self::Node*>[:async_temporary_2, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)]);
+        self::Node* node = new self::Node::•("1", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)]);
         core::String* actual = node.{self::Node::toSimpleString}() as{TypeError,ForDynamic} core::String*;
         core::print(actual);
         if(!actual.{core::String::==}(expected)) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
index 2fe75da..2d6ae21 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
@@ -27,9 +27,9 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  self::Node* :async_temporary_0;
-  self::Node* :async_temporary_1;
-  self::Node* :async_temporary_2;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
@@ -42,11 +42,11 @@
         [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[:async_temporary_1, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
         [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
         :async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
         [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node* node = new self::Node::•("1", <self::Node*>[:async_temporary_2, :async_temporary_0, _in::unsafeCast<self::Node*>(:result)]);
+        self::Node* node = new self::Node::•("1", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)]);
         core::String* actual = node.{self::Node::toSimpleString}() as{TypeError,ForDynamic} core::String*;
         core::print(actual);
         if(!actual.{core::String::==}(expected)) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.strong.transformed.expect
index 3840565..8a2da7f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.strong.transformed.expect
@@ -55,39 +55,39 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
-  core::int* :async_temporary_5;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
+  dynamic :async_temporary_5;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
       {
         :async_temporary_0 = self::C::staticField;
         [yield] let dynamic #t1 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::C::staticField = 1;
         [yield] let dynamic #t2 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* f = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* f = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, f);
         :async_temporary_2 = self::C::staticGetter;
         [yield] let dynamic #t3 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_3 = self::C::staticSetter = 1;
         [yield] let dynamic #t4 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_4 = self::C::staticFoo(2);
         [yield] let dynamic #t5 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(3, d);
         :async_temporary_5 = self::C::staticField.{core::num::+}(self::C::staticGetter).{core::num::+}(self::C::staticSetter = 1).{core::num::+}(self::C::staticFoo(1));
         [yield] let dynamic #t6 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_5.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_5).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -111,34 +111,34 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L2:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t7 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::topLevelGetter;
         [yield] let dynamic #t8 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = self::topLevelSetter = 1;
         [yield] let dynamic #t9 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = self::topLevelFoo(1);
         [yield] let dynamic #t10 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = self::globalVariable.{core::num::+}(self::topLevelGetter).{core::num::+}(self::topLevelSetter = 1).{core::num::+}(self::topLevelFoo(1));
         [yield] let dynamic #t11 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -162,11 +162,11 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L3:
@@ -174,23 +174,23 @@
         self::C* inst = new self::C::•();
         :async_temporary_0 = inst.{self::C::field};
         [yield] let dynamic #t12 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = inst.{self::C::getter};
         [yield] let dynamic #t13 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = inst.{self::C::setter} = 1;
         [yield] let dynamic #t14 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = inst.{self::C::foo}(1);
         [yield] let dynamic #t15 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = inst.{self::C::field}.{core::num::+}(inst.{self::C::getter}).{core::num::+}(inst.{self::C::setter} = 1).{core::num::+}(inst.{self::C::foo}(1));
         [yield] let dynamic #t16 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -214,35 +214,35 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::String* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::List<core::int*>* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L4:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t17 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = "${:async_temporary_0} ${:result} ";
+        :async_temporary_0 = "${_in::unsafeCast<core::int*>(:async_temporary_0)} ${:result} ";
         [yield] let dynamic #t18 = asy::_awaitHelper("someString", :async_op_then, :async_op_error, :async_op) in null;
-        core::String* a = :async_temporary_0.{core::String::+}(_in::unsafeCast<core::String*>(:result));
+        core::String* a = _in::unsafeCast<core::String*>(:async_temporary_0).{core::String::+}(_in::unsafeCast<core::String*>(:result));
         self::expect("1 1 someString", a);
         self::C* c = new self::C::•();
         :async_temporary_1 = c.{self::C::field};
         [yield] let dynamic #t19 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         core::int* cnt = 2;
         core::List<core::int*>* b = <core::int*>[1, 2, 3];
         :async_temporary_3 = b;
         :async_temporary_2 = cnt;
         [yield] let dynamic #t20 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_3.{core::List::[]=}(:async_temporary_2, :result as{TypeError,ForDynamic} core::int*);
+        _in::unsafeCast<core::List<core::int*>*>(:async_temporary_3).{core::List::[]=}(_in::unsafeCast<core::int*>(:async_temporary_2), :result as{TypeError,ForDynamic} core::int*);
         self::expect(1, b.{core::List::[]}(cnt));
         :async_temporary_4 = b.{core::List::[]}(0);
         [yield] let dynamic #t21 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -416,8 +416,8 @@
   dynamic :saved_try_context_var3;
   dynamic :exception0;
   dynamic :stack_trace0;
-  core::List<dynamic>* :async_temporary_0;
-  core::List<dynamic>* :async_temporary_1;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L7:
@@ -631,7 +631,7 @@
               }
               :async_temporary_0 = <dynamic>[42];
               [yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_0, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_0), _in::unsafeCast<core::List<core::int*>*>(:result));
               function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
                 asy::_AsyncStarStreamController<core::int*>* :controller;
                 dynamic :controller_stream;
@@ -670,7 +670,7 @@
               }
               :async_temporary_1 = <dynamic>[42];
               [yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_1, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_1), _in::unsafeCast<core::List<core::int*>*>(:result));
             }
           }
         }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
index 3840565..8a2da7f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
@@ -55,39 +55,39 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
-  core::int* :async_temporary_5;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
+  dynamic :async_temporary_5;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L1:
       {
         :async_temporary_0 = self::C::staticField;
         [yield] let dynamic #t1 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::C::staticField = 1;
         [yield] let dynamic #t2 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* f = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* f = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, f);
         :async_temporary_2 = self::C::staticGetter;
         [yield] let dynamic #t3 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_3 = self::C::staticSetter = 1;
         [yield] let dynamic #t4 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_4 = self::C::staticFoo(2);
         [yield] let dynamic #t5 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(3, d);
         :async_temporary_5 = self::C::staticField.{core::num::+}(self::C::staticGetter).{core::num::+}(self::C::staticSetter = 1).{core::num::+}(self::C::staticFoo(1));
         [yield] let dynamic #t6 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_5.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_5).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -111,34 +111,34 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L2:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t7 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = self::topLevelGetter;
         [yield] let dynamic #t8 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = self::topLevelSetter = 1;
         [yield] let dynamic #t9 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = self::topLevelFoo(1);
         [yield] let dynamic #t10 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = self::globalVariable.{core::num::+}(self::topLevelGetter).{core::num::+}(self::topLevelSetter = 1).{core::num::+}(self::topLevelFoo(1));
         [yield] let dynamic #t11 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -162,11 +162,11 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::int* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::int* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L3:
@@ -174,23 +174,23 @@
         self::C* inst = new self::C::•();
         :async_temporary_0 = inst.{self::C::field};
         [yield] let dynamic #t12 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* a = :async_temporary_0.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* a = _in::unsafeCast<core::int*>(:async_temporary_0).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, a);
         :async_temporary_1 = inst.{self::C::getter};
         [yield] let dynamic #t13 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* b = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* b = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, b);
         :async_temporary_2 = inst.{self::C::setter} = 1;
         [yield] let dynamic #t14 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* c = :async_temporary_2.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* c = _in::unsafeCast<core::int*>(:async_temporary_2).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, c);
         :async_temporary_3 = inst.{self::C::foo}(1);
         [yield] let dynamic #t15 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_3.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_3).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, d);
         :async_temporary_4 = inst.{self::C::field}.{core::num::+}(inst.{self::C::getter}).{core::num::+}(inst.{self::C::setter} = 1).{core::num::+}(inst.{self::C::foo}(1));
         [yield] let dynamic #t16 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(5, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -214,35 +214,35 @@
   core::int* :await_jump_var = 0;
   dynamic :await_ctx_var;
   dynamic :saved_try_context_var0;
-  core::String* :async_temporary_0;
-  core::int* :async_temporary_1;
-  core::int* :async_temporary_2;
-  core::List<core::int*>* :async_temporary_3;
-  core::int* :async_temporary_4;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  dynamic :async_temporary_3;
+  dynamic :async_temporary_4;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L4:
       {
         :async_temporary_0 = self::globalVariable;
         [yield] let dynamic #t17 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = "${:async_temporary_0} ${:result} ";
+        :async_temporary_0 = "${_in::unsafeCast<core::int*>(:async_temporary_0)} ${:result} ";
         [yield] let dynamic #t18 = asy::_awaitHelper("someString", :async_op_then, :async_op_error, :async_op) in null;
-        core::String* a = :async_temporary_0.{core::String::+}(_in::unsafeCast<core::String*>(:result));
+        core::String* a = _in::unsafeCast<core::String*>(:async_temporary_0).{core::String::+}(_in::unsafeCast<core::String*>(:result));
         self::expect("1 1 someString", a);
         self::C* c = new self::C::•();
         :async_temporary_1 = c.{self::C::field};
         [yield] let dynamic #t19 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* d = :async_temporary_1.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* d = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         core::int* cnt = 2;
         core::List<core::int*>* b = <core::int*>[1, 2, 3];
         :async_temporary_3 = b;
         :async_temporary_2 = cnt;
         [yield] let dynamic #t20 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_3.{core::List::[]=}(:async_temporary_2, :result as{TypeError,ForDynamic} core::int*);
+        _in::unsafeCast<core::List<core::int*>*>(:async_temporary_3).{core::List::[]=}(_in::unsafeCast<core::int*>(:async_temporary_2), :result as{TypeError,ForDynamic} core::int*);
         self::expect(1, b.{core::List::[]}(cnt));
         :async_temporary_4 = b.{core::List::[]}(0);
         [yield] let dynamic #t21 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
-        core::num* e = :async_temporary_4.{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
+        core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
         self::expect(2, e);
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -416,8 +416,8 @@
   dynamic :saved_try_context_var3;
   dynamic :exception0;
   dynamic :stack_trace0;
-  core::List<dynamic>* :async_temporary_0;
-  core::List<dynamic>* :async_temporary_1;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
   function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
     try {
       #L7:
@@ -631,7 +631,7 @@
               }
               :async_temporary_0 = <dynamic>[42];
               [yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_0, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_0), _in::unsafeCast<core::List<core::int*>*>(:result));
               function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
                 asy::_AsyncStarStreamController<core::int*>* :controller;
                 dynamic :controller_stream;
@@ -670,7 +670,7 @@
               }
               :async_temporary_1 = <dynamic>[42];
               [yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
-              self::expectList(:async_temporary_1, _in::unsafeCast<core::List<core::int*>*>(:result));
+              self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_1), _in::unsafeCast<core::List<core::int*>*>(:result));
             }
           }
         }
diff --git a/pkg/front_end/testcases/late_lowering/later.dart b/pkg/front_end/testcases/late_lowering/later.dart
index 61d02ae..810ed2f 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart
+++ b/pkg/front_end/testcases/late_lowering/later.dart
@@ -2,7 +2,7 @@
 // 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.8
+// @dart=2.9999
 
 // This test checks for compile-time errors and their absence for some use cases
 // of late fields and variables.
diff --git a/pkg/front_end/testcases/late_lowering/test.options b/pkg/front_end/testcases/late_lowering/test.options
index 0b0b221..63755f4 100644
--- a/pkg/front_end/testcases/late_lowering/test.options
+++ b/pkg/front_end/testcases/late_lowering/test.options
@@ -1,3 +1,4 @@
 --enable-experiment=non-nullable
 --force-late-lowering
 --force-nnbd-checks
+--overwrite-current-sdk-version=2.9999
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.outline.expect b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.outline.expect
index 3874625..765b560 100644
--- a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.outline.expect
@@ -12,7 +12,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:21:52: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class LegacyClass4c implements GenericInterface<num?> {}
 //                                                    ^
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.strong.expect b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.strong.expect
index 734a657..24eb602 100644
--- a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.strong.expect
@@ -12,7 +12,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:21:52: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class LegacyClass4c implements GenericInterface<num?> {}
 //                                                    ^
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.weak.expect
index 734a657..24eb602 100644
--- a/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart.weak.expect
@@ -12,7 +12,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:21:52: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class LegacyClass4c implements GenericInterface<num?> {}
 //                                                    ^
 // pkg/front_end/testcases/nnbd/inheritance_from_opt_in.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart
new file mode 100644
index 0000000..3d43a76
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart
@@ -0,0 +1,18 @@
+// 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.
+
+typedef F = void Function()?;
+
+void foo(void Function() x) {
+  bar(x);
+  bar(null);
+
+  baz(x);
+  baz(null);
+}
+
+void bar(F x) {}
+void baz(F? x) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
new file mode 100644
index 0000000..3429c36
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = () →? void;
+static method foo(() → void x) → void
+  ;
+static method bar(() →? void x) → void
+  ;
+static method baz(() →? void x) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
new file mode 100644
index 0000000..425f791
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = () →? void;
+static method foo(() → void x) → void {
+  self::bar(x);
+  self::bar(null);
+  self::baz(x);
+  self::baz(null);
+}
+static method bar(() →? void x) → void {}
+static method baz(() →? void x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
new file mode 100644
index 0000000..425f791
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = () →? void;
+static method foo(() → void x) → void {
+  self::bar(x);
+  self::bar(null);
+  self::baz(x);
+  self::baz(null);
+}
+static method bar(() →? void x) → void {}
+static method baz(() →? void x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
new file mode 100644
index 0000000..425f791
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = () →? void;
+static method foo(() → void x) → void {
+  self::bar(x);
+  self::bar(null);
+  self::baz(x);
+  self::baz(null);
+}
+static method bar(() →? void x) → void {}
+static method baz(() →? void x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
new file mode 100644
index 0000000..425f791
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+typedef F = () →? void;
+static method foo(() → void x) → void {
+  self::bar(x);
+  self::bar(null);
+  self::baz(x);
+  self::baz(null);
+}
+static method bar(() →? void x) → void {}
+static method baz(() →? void x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
index cfcc66f..7361e96 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
@@ -30,7 +30,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class B extends A<String?> {}
 //                         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -38,7 +38,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // typedef F = void Function()?;
 //                            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -46,7 +46,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -54,7 +54,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // String? s = null;
 //       ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -62,7 +62,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // void method(void f()?, {int a}) {}
 //                     ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -70,7 +70,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // var t = s!;
 //          ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
index 2fce215..66a160f 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
@@ -35,7 +35,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class B extends A<String?> {}
 //                         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -43,7 +43,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // typedef F = void Function()?;
 //                            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -51,7 +51,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -59,7 +59,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // String? s = null;
 //       ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -67,7 +67,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // void method(void f()?, {int a}) {}
 //                     ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -75,7 +75,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // var t = s!;
 //          ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -83,7 +83,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:32:14: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   List<String?> l = null;
 //              ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -91,7 +91,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:33:9: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   String? s = null;
 //         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -99,7 +99,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:34:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   var t = s!;
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
index 2fce215..66a160f 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class B extends A<String?> {}
 //                         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -43,7 +43,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // typedef F = void Function()?;
 //                            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -51,7 +51,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -59,7 +59,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // String? s = null;
 //       ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -67,7 +67,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // void method(void f()?, {int a}) {}
 //                     ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -75,7 +75,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // var t = s!;
 //          ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -83,7 +83,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:32:14: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   List<String?> l = null;
 //              ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -91,7 +91,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:33:9: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   String? s = null;
 //         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -99,7 +99,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:34:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   var t = s!;
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
index 2fce215..66a160f 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
@@ -35,7 +35,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class B extends A<String?> {}
 //                         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -43,7 +43,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // typedef F = void Function()?;
 //                            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -51,7 +51,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -59,7 +59,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // String? s = null;
 //       ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -67,7 +67,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // void method(void f()?, {int a}) {}
 //                     ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -75,7 +75,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // var t = s!;
 //          ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -83,7 +83,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:32:14: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   List<String?> l = null;
 //              ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -91,7 +91,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:33:9: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   String? s = null;
 //         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -99,7 +99,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:34:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   var t = s!;
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
index 2fce215..66a160f 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // class B extends A<String?> {}
 //                         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -43,7 +43,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // typedef F = void Function()?;
 //                            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -51,7 +51,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -59,7 +59,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // String? s = null;
 //       ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -67,7 +67,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // void method(void f()?, {int a}) {}
 //                     ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -75,7 +75,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 // var t = s!;
 //          ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -83,7 +83,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:32:14: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   List<String?> l = null;
 //              ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -91,7 +91,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:33:9: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   String? s = null;
 //         ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
@@ -99,7 +99,7 @@
 // ^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:34:12: Error: Null safety features are disabled for this library.
-// Try removing the `@dart=` annotation or setting the language version to at least `@dart=2.8`.
+// Try removing the `@dart=` annotation or setting the language version higher.
 //   var t = s!;
 //            ^
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 3cee311..95377bb 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -57,6 +57,7 @@
 extensions/issue38755: TextSerializationFailure
 extensions/issue38915: TextSerializationFailure
 extensions/issue39938/issue39938: TextSerializationFailure
+extensions/issue40816: TextSerializationFailure
 extensions/missing_toplevel: TextSerializationFailure
 extensions/nested_on_types: TextSerializationFailure
 extensions/null_aware: TextSerializationFailure
@@ -342,6 +343,8 @@
 general/type_literal_as_metadata: TextSerializationFailure
 general/type_of_null: TextSerializationFailure
 general/type_parameter_type_named_int: TextSerializationFailure
+general/type_parameters_on_dynamic: TextSerializationFailure
+general/type_parameters_on_void: TextSerializationFailure
 general/type_variable_as_super: TextSerializationFailure # Was: RuntimeError
 general/type_variable_bound_access: TypeCheckError
 general/type_variable_prefix: TextSerializationFailure # Was: RuntimeError
@@ -1299,6 +1302,7 @@
 nnbd/nullable_null: TextSerializationFailure
 nnbd/nullable_param: TextSerializationFailure
 nnbd/nullable_receiver: TextSerializationFailure
+nnbd/nullable_rhs_of_typedef: TextSerializationFailure
 nnbd/opt_out: TextSerializationFailure
 nnbd/override_checks: TextSerializationFailure
 nnbd/platform_definite_assignment/main: TextSerializationFailure
diff --git a/pkg/front_end/tool/_fasta/bulk_compile.dart b/pkg/front_end/tool/_fasta/bulk_compile.dart
deleted file mode 100644
index c50da92..0000000
--- a/pkg/front_end/tool/_fasta/bulk_compile.dart
+++ /dev/null
@@ -1,106 +0,0 @@
-// 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.
-
-import 'dart:async' show Future;
-
-import 'dart:convert' show utf8;
-
-import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
-
-import 'package:front_end/src/api_prototype/file_system.dart'
-    show FileSystem, FileSystemEntity, FileSystemException;
-
-import 'package:front_end/src/api_prototype/standard_file_system.dart'
-    show StandardFileSystem;
-
-import 'package:front_end/src/base/processed_options.dart'
-    show ProcessedOptions;
-
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
-
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-
-import 'package:front_end/src/kernel_generator_impl.dart'
-    show InternalCompilerResult, generateKernelInternal;
-
-const String customScheme = "org-dartlang-bulkcompile";
-
-final Uri mainUri = new Uri(scheme: customScheme, host: "", path: "/main.dart");
-
-class BulkCompiler {
-  final ProcessedOptions options;
-
-  BulkCompiler(CompilerOptions options)
-      : options = new ProcessedOptions(
-            options: options
-              ..packagesFileUri ??= Uri.base.resolve(".packages")
-              ..linkedDependencies = <Uri>[
-                computePlatformBinariesLocation(forceBuildDir: true)
-                    .resolve("vm_platform_strong.dill")
-              ]
-              ..fileSystem = (new FileBackedMemoryFileSystem()
-                ..entities[mainUri.path] =
-                    (new MemoryFileSystemEntity(mainUri)..bytes = <int>[])),
-            inputs: <Uri>[mainUri]);
-
-  Future<Null> compile(String source) {
-    defineSource(mainUri.path, source);
-    return CompilerContext.runWithOptions(options,
-        (CompilerContext context) async {
-      (await context.options.loadSdkSummary(null))?.computeCanonicalNames();
-      InternalCompilerResult result = await generateKernelInternal();
-      result?.component?.unbindCanonicalNames();
-      return null;
-    });
-  }
-
-  void defineSource(String path, String source) {
-    if (!path.startsWith("/")) {
-      throw new ArgumentError("'path' should start with a slash ('/').");
-    }
-    Uri uri = new Uri(scheme: customScheme, host: "", path: path);
-    MemoryFileSystemEntity entity = options.fileSystem.entityForUri(uri);
-    entity.bytes = utf8.encode(source);
-  }
-}
-
-class FileBackedMemoryFileSystem implements FileSystem {
-  final Map<String, MemoryFileSystemEntity> entities =
-      <String, MemoryFileSystemEntity>{};
-
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.scheme == customScheme) {
-      MemoryFileSystemEntity entity = entities[uri.path];
-      if (entity == null) {
-        entity = new MemoryFileSystemEntity(uri);
-        entities[uri.path] = entity;
-      }
-      return entity;
-    } else {
-      return StandardFileSystem.instance.entityForUri(uri);
-    }
-  }
-}
-
-class MemoryFileSystemEntity implements FileSystemEntity {
-  final Uri uri;
-
-  List<int> bytes;
-
-  MemoryFileSystemEntity(this.uri);
-
-  Future<List<int>> readAsBytes() {
-    return bytes == null
-        ? new Future.error(new FileSystemException(uri, "Not found"))
-        : new Future.value(bytes);
-  }
-
-  Future<String> readAsString() {
-    throw "unsupported operation";
-  }
-
-  Future<bool> exists() => new Future.value(bytes != null);
-}
diff --git a/pkg/front_end/tool/_fasta/bulk_compile_test.dart b/pkg/front_end/tool/_fasta/bulk_compile_test.dart
deleted file mode 100644
index 29b98c9..0000000
--- a/pkg/front_end/tool/_fasta/bulk_compile_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-import 'dart:isolate' show ReceivePort;
-
-import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
-
-import 'bulk_compile.dart' show BulkCompiler;
-
-testCompiler() async {
-  BulkCompiler compiler = new BulkCompiler(new CompilerOptions()
-    ..debugDump = true
-    ..verbose = true);
-  await compiler.compile("main() { print('Hello, World!'); }");
-  await compiler.compile(
-      // This example is a regression test of lazy loading of FunctionNode
-      // which would break when this is preceded by hello-world.
-      "main() { [].map(); }");
-  await compiler.compile("main() { print('Hello, Brave New World!'); }");
-  await compiler.compile("import 'package';");
-}
-
-main() {
-  var port = new ReceivePort();
-  testCompiler().whenComplete(port.close);
-}
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index 2b2442e..9d8b634 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -2,11 +2,7 @@
 // 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 'dart:io';
-
-import 'dart:isolate';
+import 'dart:io' show File, Platform;
 
 import 'package:_fe_analyzer_shared/src/scanner/characters.dart'
     show $A, $MINUS, $a, $z;
@@ -15,23 +11,75 @@
 
 import 'package:yaml/yaml.dart' show YamlMap, loadYaml;
 
-main(List<String> arguments) async {
-  var port = new ReceivePort();
-  await new File.fromUri(await computeGeneratedFile())
-      .writeAsString(await generateMessagesFile(), flush: true);
-  port.close();
+main(List<String> arguments) {
+  new File.fromUri(computeCfeGeneratedFile())
+      .writeAsStringSync(generateCfeFile(), flush: true);
+  new File.fromUri(computeKernelGeneratedFile())
+      .writeAsStringSync(generateKernelFile(), flush: true);
 }
 
-Future<Uri> computeGeneratedFile() {
-  return Isolate.resolvePackageUri(
-      Uri.parse('package:front_end/src/api_prototype/experimental_flags.dart'));
+Uri computeCfeGeneratedFile() {
+  return Platform.script
+      .resolve("../../lib/src/api_prototype/experimental_flags.dart");
 }
 
-Future<String> generateMessagesFile() async {
-  Uri messagesFile =
-      Platform.script.resolve("../../../../tools/experimental_features.yaml");
+Uri computeKernelGeneratedFile() {
+  return Platform.script
+      .resolve("../../../kernel/lib/default_language_version.dart");
+}
+
+Uri computeYamlFile() {
+  return Platform.script
+      .resolve("../../../../tools/experimental_features.yaml");
+}
+
+String generateKernelFile() {
+  Uri yamlFile = computeYamlFile();
   Map<dynamic, dynamic> yaml =
-      loadYaml(await new File.fromUri(messagesFile).readAsStringSync());
+      loadYaml(new File.fromUri(yamlFile).readAsStringSync());
+
+  int currentVersionMajor;
+  int currentVersionMinor;
+  {
+    String currentVersion = getAsVersionNumberString(yaml['current-version']);
+    List<String> split = currentVersion.split(".");
+    currentVersionMajor = int.parse(split[0]);
+    currentVersionMinor = int.parse(split[1]);
+  }
+
+  StringBuffer sb = new StringBuffer();
+
+  sb.write('''
+// 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.
+
+// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
+//
+// Instead modify 'tools/experimental_features.yaml' and run
+// 'pkg/front_end/tool/fasta generate-experimental-flags' to update.
+
+  int defaultLanguageVersionMajor = $currentVersionMajor;
+  int defaultLanguageVersionMinor = $currentVersionMinor;
+''');
+
+  return new DartFormatter().format("$sb");
+}
+
+String generateCfeFile() {
+  Uri yamlFile = computeYamlFile();
+  Map<dynamic, dynamic> yaml =
+      loadYaml(new File.fromUri(yamlFile).readAsStringSync());
+
+  int currentVersionMajor;
+  int currentVersionMinor;
+  {
+    String currentVersion = getAsVersionNumberString(yaml['current-version']);
+    List<String> split = currentVersion.split(".");
+    currentVersionMajor = int.parse(split[0]);
+    currentVersionMinor = int.parse(split[1]);
+  }
+
   StringBuffer sb = new StringBuffer();
 
   sb.write('''
@@ -53,16 +101,41 @@
 
 enum ExperimentalFlag {
 ''');
-  for (var key in keys) {
+  for (String key in keys) {
     sb.writeln('  ${keyToIdentifier(key)},');
   }
   sb.write('''
 }
 
+''');
+
+  for (String key in keys) {
+    int major;
+    int minor;
+    String enabledIn =
+        getAsVersionNumberString((features[key] as YamlMap)['enabledIn']);
+    if (enabledIn == null) {
+      major = currentVersionMajor;
+      minor = currentVersionMinor;
+    } else {
+      List<String> split = enabledIn.split(".");
+      major = int.parse(split[0]);
+      minor = int.parse(split[1]);
+    }
+    sb.writeln('  const int enable'
+        '${keyToIdentifier(key, upperCaseFirst: true)}'
+        'MajorVersion = $major;');
+    sb.writeln('  const int enable'
+        '${keyToIdentifier(key, upperCaseFirst: true)}'
+        'MinorVersion = $minor;');
+  }
+
+  sb.write('''
+
 ExperimentalFlag parseExperimentalFlag(String flag) {
   switch (flag) {
 ''');
-  for (var key in keys) {
+  for (String key in keys) {
     sb.writeln('    case "$key":');
     sb.writeln('     return ExperimentalFlag.${keyToIdentifier(key)};');
   }
@@ -72,8 +145,8 @@
 
 const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
 ''');
-  for (var key in keys) {
-    var expired = (features[key] as YamlMap)['expired'];
+  for (String key in keys) {
+    bool expired = (features[key] as YamlMap)['expired'];
     bool shipped = (features[key] as YamlMap)['enabledIn'] != null;
     sb.writeln('  ExperimentalFlag.${keyToIdentifier(key)}: ${shipped},');
     if (shipped) {
@@ -87,7 +160,7 @@
 
 const Map<ExperimentalFlag, bool> expiredExperimentalFlags = {
 ''');
-  for (var key in keys) {
+  for (String key in keys) {
     bool expired = (features[key] as YamlMap)['expired'] == true;
     sb.writeln('  ExperimentalFlag.${keyToIdentifier(key)}: ${expired},');
   }
@@ -96,10 +169,11 @@
   return new DartFormatter().format("$sb");
 }
 
-keyToIdentifier(String key) {
-  var identifier = StringBuffer();
+keyToIdentifier(String key, {bool upperCaseFirst = false}) {
+  StringBuffer identifier = StringBuffer();
+  bool first = true;
   for (int index = 0; index < key.length; ++index) {
-    var code = key.codeUnitAt(index);
+    int code = key.codeUnitAt(index);
     if (code == $MINUS) {
       ++index;
       code = key.codeUnitAt(index);
@@ -107,7 +181,18 @@
         code = code - $a + $A;
       }
     }
+    if (first && upperCaseFirst && $a <= code && code <= $z) {
+      code = code - $a + $A;
+    }
+    first = false;
     identifier.writeCharCode(code);
   }
   return identifier.toString();
 }
+
+String getAsVersionNumberString(dynamic value) {
+  if (value == null) return null;
+  if (value is String) return value;
+  if (value is double) return "$value";
+  throw "Unexpected value: $value (${value.runtimeType})";
+}
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart
index ad1ac6e..1249933 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags_test.dart
@@ -2,22 +2,35 @@
 // 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" show File;
-
-import "package:async_helper/async_helper.dart" show asyncTest;
-
-import "package:expect/expect.dart" show Expect;
+import "dart:io" show File, exitCode;
 
 import "generate_experimental_flags.dart"
-    show computeGeneratedFile, generateMessagesFile;
+    show
+        computeCfeGeneratedFile,
+        computeKernelGeneratedFile,
+        generateCfeFile,
+        generateKernelFile;
 
 main() {
-  asyncTest(() async {
-    Uri generatedFile = await computeGeneratedFile();
-    String generated = await generateMessagesFile();
-    String actual = (await new File.fromUri(generatedFile).readAsString())
+  {
+    Uri generatedFile = computeCfeGeneratedFile();
+    String generated = generateCfeFile();
+    String actual = (new File.fromUri(generatedFile).readAsStringSync())
         .replaceAll('\r\n', '\n');
-    Expect.stringEquals(generated, actual, """
+    check(generated, actual, generatedFile);
+  }
+  {
+    Uri generatedFile = computeKernelGeneratedFile();
+    String generated = generateKernelFile();
+    String actual = (new File.fromUri(generatedFile).readAsStringSync())
+        .replaceAll('\r\n', '\n');
+    check(generated, actual, generatedFile);
+  }
+}
+
+void check(String generated, String actual, Uri generatedFile) {
+  if (generated != actual) {
+    print("""
 ------------------------
 
 The generated file
@@ -28,5 +41,6 @@
 
 ------------------------
 """);
-  });
+    exitCode = 1;
+  }
 }
diff --git a/pkg/front_end/tool/stat_on_dash_v.dart b/pkg/front_end/tool/stat_on_dash_v.dart
new file mode 100644
index 0000000..ead3e7b
--- /dev/null
+++ b/pkg/front_end/tool/stat_on_dash_v.dart
@@ -0,0 +1,225 @@
+import "dart:io";
+
+import "../test/simple_stats.dart";
+
+void usage([String extraMessage]) {
+  print("Usage:");
+  print("On Linux via bash you can do something like");
+  print("dart pkg/front_end/tool/stat_on_dash_v.dart \ "
+      "   now_run_{1..10}.data then_run_{1..10}.data");
+  if (extraMessage != null) {
+    print("");
+    print("Notice:");
+    print(extraMessage);
+  }
+  exit(1);
+}
+
+main(List<String> args) {
+  if (args.length < 4) {
+    usage("Requires more input.");
+  }
+  // Maps from "part" (or "category" or whatever) =>
+  // (map from file group => list of runtimes)
+  Map<String, Map<String, List<int>>> data = {};
+  Set<String> allGroups = {};
+  for (String file in args) {
+    File f = new File(file);
+    if (!f.existsSync()) usage("$file doesn't exist.");
+    String groupId = replaceNumbers(file);
+    allGroups.add(groupId);
+    String fileContent = f.readAsStringSync();
+    List<String> fileLines = fileContent.split("\n");
+    Set<String> partsSeen = {};
+    for (String line in fileLines) {
+      if (!isTimePrependedLine(line)) continue;
+      String trimmedLine = line.substring(16).trim();
+      String part = replaceNumbers(trimmedLine);
+      if (!partsSeen.add(part)) {
+        int seen = 2;
+        while (true) {
+          String newPartName = "$part ($seen)";
+          if (partsSeen.add(newPartName)) {
+            part = newPartName;
+            break;
+          }
+          seen++;
+        }
+      }
+      int microSeconds = findMs(trimmedLine, inMs: true);
+      Map<String, List<int>> groupToTime = data[part] ??= {};
+      List<int> times = groupToTime[groupId] ??= [];
+      times.add(microSeconds);
+    }
+  }
+
+  if (allGroups.length < 2) {
+    assert(allGroups.length == 1);
+    usage("Found only 1 group. At least two are required.");
+  }
+
+  Map<String, double> combinedChange = {};
+
+  bool printedAnything = false;
+  for (String part in data.keys) {
+    Map<String, List<int>> partData = data[part];
+    List<int> prevRuntimes;
+    String prevGroup;
+    bool printed = false;
+    for (String group in allGroups) {
+      List<int> runtimes = partData[group];
+      if (runtimes == null) {
+        // Fake it to be a small list of 0s.
+        runtimes = new List<int>.filled(5, 0);
+        if (!printed) {
+          printed = true;
+          print("$part:");
+        }
+        print("Notice: faking data for $group");
+      }
+      if (prevRuntimes != null) {
+        TTestResult result = SimpleTTestStat.ttest(runtimes, prevRuntimes);
+        if (result.significant) {
+          if (!printed) {
+            printed = true;
+            print("$part:");
+          }
+          print("$prevGroup => $group: $result");
+          print("$group: $runtimes");
+          print("$prevGroup: $prevRuntimes");
+          combinedChange["$prevGroup => $group"] ??= 0;
+          double leastConfidentChange;
+          if (result.diff < 0) {
+            leastConfidentChange = result.diff + result.confidence;
+          } else {
+            leastConfidentChange = result.diff - result.confidence;
+          }
+
+          combinedChange["$prevGroup => $group"] += leastConfidentChange;
+        }
+      }
+      prevRuntimes = runtimes;
+      prevGroup = group;
+    }
+    if (printed) {
+      print("---");
+      printedAnything = true;
+    }
+  }
+  if (printedAnything) {
+    for (String part in combinedChange.keys) {
+      print("Combined least change for $part: "
+          "${combinedChange[part].toStringAsFixed(2)} ms.");
+    }
+  } else {
+    print("Nothing significant found.");
+  }
+}
+
+/// Returns ms or µs or throws if ms not found.
+int findMs(String s, {bool inMs: true}) {
+  // Find " in " followed by numbers possibly followed by (a dot and more
+  // numbers) followed by "ms"; e.g. " in 42.3ms"
+
+  // This is O(n^2) but it doesn't matter.
+  for (int i = 0; i < s.length; i++) {
+    int j = 0;
+    if (s.codeUnitAt(i + j++) != $SPACE) continue;
+    if (s.codeUnitAt(i + j++) != $i) continue;
+    if (s.codeUnitAt(i + j++) != $n) continue;
+    if (s.codeUnitAt(i + j++) != $SPACE) continue;
+    int numberStartsAt = i + j;
+    if (!isNumber(s.codeUnitAt(i + j++))) continue;
+    while (isNumber(s.codeUnitAt(i + j))) {
+      j++;
+    }
+    // We've seen " is 0+" => we should now either have "ms" or a dot,
+    // more numbers followed by "ms".
+    if (s.codeUnitAt(i + j) == $m) {
+      j++;
+      if (s.codeUnitAt(i + j++) != $s) continue;
+      // Seen " is 0+ms" => We're done.
+      int ms = int.parse(s.substring(numberStartsAt, i + j - 2));
+      if (inMs) return ms;
+      return ms * 1000;
+    } else if (s.codeUnitAt(i + j) == $PERIOD) {
+      int dotAt = i + j;
+      j++;
+      if (!isNumber(s.codeUnitAt(i + j++))) continue;
+      while (isNumber(s.codeUnitAt(i + j))) {
+        j++;
+      }
+      if (s.codeUnitAt(i + j++) != $m) continue;
+      if (s.codeUnitAt(i + j++) != $s) continue;
+      // Seen " is 0+.0+ms" => We're done.
+      // int.parse(s.substring(numberStartsAt, i + j - 2));
+      int ms = int.parse(s.substring(numberStartsAt, dotAt));
+      if (inMs) return ms;
+      int fraction = int.parse(s.substring(dotAt + 1, i + j - 2));
+      while (fraction < 100) {
+        fraction *= 10;
+      }
+      while (fraction >= 1000) {
+        fraction ~/= 10;
+      }
+      return ms * 1000 + fraction;
+    } else {
+      continue;
+    }
+  }
+  usage("Didn't find any ms data in line '$s'.");
+  throw "usage should exit";
+}
+
+const int $SPACE = 32;
+const int $PERIOD = 46;
+const int $0 = 48;
+const int $9 = 57;
+const int $COLON = 58;
+const int $_ = 95;
+const int $i = 105;
+const int $m = 109;
+const int $n = 110;
+const int $s = 115;
+
+/// Check that format is like '0:00:00.000000: '.
+bool isTimePrependedLine(String s) {
+  if (s.length < 15) return false;
+  int index = 0;
+  if (!isNumber(s.codeUnitAt(index++))) return false;
+  if (s.codeUnitAt(index++) != $COLON) return false;
+  if (!isNumber(s.codeUnitAt(index++))) return false;
+  if (!isNumber(s.codeUnitAt(index++))) return false;
+  if (s.codeUnitAt(index++) != $COLON) return false;
+  if (!isNumber(s.codeUnitAt(index++))) return false;
+  if (!isNumber(s.codeUnitAt(index++))) return false;
+  if (s.codeUnitAt(index++) != $PERIOD) return false;
+  for (int i = 0; i < 6; i++) {
+    if (!isNumber(s.codeUnitAt(index++))) return false;
+  }
+  if (s.codeUnitAt(index++) != $COLON) return false;
+  return true;
+}
+
+bool isNumber(int codeUnit) {
+  return codeUnit >= $0 && codeUnit <= $9;
+}
+
+String replaceNumbers(String s) {
+  StringBuffer sb = new StringBuffer();
+  bool lastWasNumber = false;
+  for (int i = 0; i < s.length; i++) {
+    int codeUnit = s.codeUnitAt(i);
+    if (isNumber(codeUnit)) {
+      if (!lastWasNumber) {
+        // Ignore number; replace with '_'.
+        sb.writeCharCode($_);
+        lastWasNumber = true;
+      }
+    } else {
+      sb.writeCharCode(codeUnit);
+      lastWasNumber = false;
+    }
+  }
+  return sb.toString();
+}
diff --git a/pkg/frontend_server/bin/frontend_server_starter.dart b/pkg/frontend_server/bin/frontend_server_starter.dart
index fedda20..2113752 100644
--- a/pkg/frontend_server/bin/frontend_server_starter.dart
+++ b/pkg/frontend_server/bin/frontend_server_starter.dart
@@ -6,7 +6,7 @@
 import '../lib/frontend_server.dart';
 
 Future<Null> main(List<String> args) async {
-  final int exitCode = await starter(args);
+  exitCode = await starter(args);
   if (exitCode != 0) {
     exit(exitCode);
   }
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 80d72c3..add6b9a 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -19,13 +19,12 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, parseExperimentalFlags;
 import 'package:front_end/src/api_unstable/vm.dart';
-import 'package:kernel/ast.dart';
+import 'package:kernel/ast.dart' show Library, Procedure, LibraryDependency;
 import 'package:kernel/binary/ast_to_binary.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:kernel/kernel.dart'
     show Component, loadComponentSourceFromBytes;
 import 'package:kernel/target/targets.dart' show targets, TargetFlags;
-import 'package:package_resolver/package_resolver.dart';
+import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as path;
 import 'package:usage/uuid/uuid.dart';
 
@@ -161,7 +160,9 @@
       help: 'Name of the subdirectory of //data for output files')
   ..addOption('far-manifest', help: 'Path to output Fuchsia package manifest')
   ..addOption('libraries-spec',
-      help: 'A path or uri to the libraries specification JSON file');
+      help: 'A path or uri to the libraries specification JSON file')
+  ..addFlag('debugger-module-names',
+      help: 'Use debugger-friendly modules names', defaultsTo: false);
 
 String usage = '''
 Usage: server [options] [input.dart]
@@ -298,8 +299,7 @@
 class BinaryPrinterFactory {
   /// Creates new [BinaryPrinter] to write to [targetSink].
   BinaryPrinter newBinaryPrinter(Sink<List<int>> targetSink) {
-    return LimitedBinaryPrinter(targetSink, (_) => true /* predicate */,
-        false /* excludeUriToSource */);
+    return BinaryPrinter(targetSink);
   }
 }
 
@@ -308,7 +308,8 @@
       {this.printerFactory,
       this.transformer,
       this.unsafePackageSerialization,
-      this.incrementalSerialization: true}) {
+      this.incrementalSerialization: true,
+      this.useDebuggerModuleNames: false}) {
     _outputStream ??= stdout;
     printerFactory ??= new BinaryPrinterFactory();
   }
@@ -317,6 +318,7 @@
   BinaryPrinterFactory printerFactory;
   bool unsafePackageSerialization;
   bool incrementalSerialization;
+  bool useDebuggerModuleNames;
 
   CompilerOptions _compilerOptions;
   BytecodeOptions _bytecodeOptions;
@@ -457,7 +459,7 @@
 
     final String importDill = options['import-dill'];
     if (importDill != null) {
-      compilerOptions.inputSummaries = <Uri>[
+      compilerOptions.additionalDills = <Uri>[
         Uri.base.resolveUri(Uri.file(importDill))
       ];
     }
@@ -494,11 +496,12 @@
 
       incrementalSerializer = _generator.incrementalSerializer;
       _component = component;
+      _component.computeCanonicalNames();
     } else {
       if (options['link-platform']) {
         // TODO(aam): Remove linkedDependencies once platform is directly embedded
         // into VM snapshot and http://dartbug.com/30111 is fixed.
-        compilerOptions.linkedDependencies = <Uri>[
+        compilerOptions.additionalDills = <Uri>[
           sdkRoot.resolve(platformKernelDill)
         ];
       }
@@ -589,8 +592,8 @@
   /// Write a JavaScript bundle containg the provided component.
   Future<void> writeJavascriptBundle(KernelCompilationResults results,
       String filename, String fileSystemScheme) async {
-    var packageResolver = await PackageResolver.loadConfig(
-        _compilerOptions.packagesFileUri ?? '.packages');
+    var packageConfig = await loadPackageConfigUri(
+        _compilerOptions.packagesFileUri ?? File('.packages').absolute.uri);
     final Component component = results.component;
     // Compute strongly connected components.
     final strongComponents = StrongComponents(component,
@@ -605,7 +608,8 @@
       sourceFile.parent.createSync(recursive: true);
     }
     _bundler = JavaScriptBundler(
-        component, strongComponents, fileSystemScheme, packageResolver);
+        component, strongComponents, fileSystemScheme, packageConfig,
+        useDebuggerModuleNames: useDebuggerModuleNames);
     final sourceFileSink = sourceFile.openWrite();
     final manifestFileSink = manifestFile.openWrite();
     final sourceMapsFileSink = sourceMapsFile.openWrite();
@@ -670,10 +674,9 @@
         final IOSink sink = file.openWrite();
         final Set<Library> loadedLibraries = results.loadedLibraries;
         final BinaryPrinter printer = filterExternal
-            ? LimitedBinaryPrinter(
-                sink,
-                (lib) => !loadedLibraries.contains(lib),
-                true /* excludeUriToSource */)
+            ? BinaryPrinter(sink,
+                libraryFilter: (lib) => !loadedLibraries.contains(lib),
+                includeSources: false)
             : printerFactory.newBinaryPrinter(sink);
 
         sortComponent(component);
@@ -686,8 +689,9 @@
       final IOSink sink = File(filename).openWrite();
       final Set<Library> loadedLibraries = results.loadedLibraries;
       final BinaryPrinter printer = filterExternal
-          ? LimitedBinaryPrinter(sink, (lib) => !loadedLibraries.contains(lib),
-              true /* excludeUriToSource */)
+          ? BinaryPrinter(sink,
+              libraryFilter: (lib) => !loadedLibraries.contains(lib),
+              includeSources: false)
           : printerFactory.newBinaryPrinter(sink);
 
       sortComponent(component);
@@ -814,10 +818,9 @@
     }
 
     final byteSink = ByteSink();
-    final BinaryPrinter printer = LimitedBinaryPrinter(
-        byteSink,
-        (lib) => packageFor(lib, result.loadedLibraries) == package,
-        false /* excludeUriToSource */);
+    final BinaryPrinter printer = BinaryPrinter(byteSink,
+        libraryFilter: (lib) =>
+            packageFor(lib, result.loadedLibraries) == package);
     printer.writeComponentFile(partComponent);
 
     final bytes = byteSink.builder.takeBytes();
@@ -907,6 +910,11 @@
 
     if (_bundler != null) {
       var kernel2jsCompiler = _bundler.compilers[moduleName];
+      if (kernel2jsCompiler == null) {
+        throw Exception('Cannot find kernel2js compiler for $moduleName. '
+            'Compilers are avaiable for modules: '
+            '\n\t${_bundler.compilers.keys.toString()}');
+      }
       assert(kernel2jsCompiler != null);
 
       var evaluator = new ExpressionCompiler(
@@ -917,7 +925,7 @@
       var procedure = await evaluator.compileExpressionToJs(libraryUri, line,
           column, jsModules, jsFrameValues, moduleName, expression);
 
-      var result = procedure ?? errors[0];
+      var result = errors.length > 0 ? errors[0] : procedure;
 
       // TODO(annagrin): kernelBinaryFilename is too specific
       // rename to _outputFileName?
@@ -1120,15 +1128,15 @@
 
 /// Listens for the compilation commands on [input] stream.
 /// This supports "interactive" recompilation mode of execution.
-void listenAndCompile(CompilerInterface compiler, Stream<List<int>> input,
-    ArgResults options, Completer<int> completer,
+StreamSubscription<String> listenAndCompile(CompilerInterface compiler,
+    Stream<List<int>> input, ArgResults options, Completer<int> completer,
     {IncrementalCompiler generator}) {
   _State state = _State.READY_FOR_INSTRUCTION;
   _CompileExpressionRequest compileExpressionRequest;
   _CompileExpressionToJsRequest compileExpressionToJsRequest;
   String boundaryKey;
   String recompileEntryPoint;
-  input
+  return input
       .transform(utf8.decoder)
       .transform(const LineSplitter())
       .listen((String string) async {
@@ -1198,7 +1206,9 @@
         } else if (string == 'reset') {
           compiler.resetIncrementalCompiler();
         } else if (string == 'quit') {
-          completer.complete(0);
+          if (!completer.isCompleted) {
+            completer.complete(0);
+          }
         }
         break;
       case _State.RECOMPILE_LIST:
@@ -1365,7 +1375,8 @@
   compiler ??= FrontendCompiler(output,
       printerFactory: binaryPrinterFactory,
       unsafePackageSerialization: options["unsafe-package-serialization"],
-      incrementalSerialization: options["incremental-serialization"]);
+      incrementalSerialization: options["incremental-serialization"],
+      useDebuggerModuleNames: options['debugger-module-names']);
 
   if (options.rest.isNotEmpty) {
     return await compiler.compile(options.rest[0], options,
@@ -1375,7 +1386,8 @@
   }
 
   Completer<int> completer = Completer<int>();
-  listenAndCompile(compiler, input ?? stdin, options, completer,
+  var subscription = listenAndCompile(
+      compiler, input ?? stdin, options, completer,
       generator: generator);
-  return completer.future;
+  return completer.future..then((value) => subscription.cancel());
 }
diff --git a/pkg/frontend_server/lib/src/expression_compiler.dart b/pkg/frontend_server/lib/src/expression_compiler.dart
index 6f81341..2902fc5 100644
--- a/pkg/frontend_server/lib/src/expression_compiler.dart
+++ b/pkg/frontend_server/lib/src/expression_compiler.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, DiagnosticMessageHandler;
@@ -232,7 +233,10 @@
 
   void _log(String message) {
     if (verbose) {
-      print(message);
+      // writing to stdout breaks communication to
+      // frontend server, which is done on stdin/stdout,
+      // so we use stderr here instead
+      stderr.writeln(message);
     }
   }
 
@@ -250,14 +254,14 @@
   ///
   /// Returns expression compiled to JavaScript or null on error.
   /// Errors are reported using onDiagnostic function
-  /// [moduleName] is of the form '/packages/hello_world_main.dart'
+  /// [moduleName] is of the form 'packages/hello_world_main.dart'
   /// [jsFrameValues] is a map from js variable name to its primitive value
   /// or another variable name, for example
   /// { 'x': '1', 'y': 'y', 'o': 'null' }
   /// [jsModules] is a map from variable name to the module name, where
   /// variable name is the name originally used in JavaScript to contain the
   /// module object, for example:
-  /// { 'dart':'dart_sdk', 'main': '/packages/hello_world_main.dart' }
+  /// { 'dart':'dart_sdk', 'main': 'packages/hello_world_main.dart' }
   Future<String> compileExpressionToJs(
       String libraryUri,
       int line,
@@ -270,8 +274,6 @@
 
     _log('ExpressionCompiler: compiling:  $expression in $moduleName');
 
-    var moduleVariable = moduleName.split('/').last;
-
     var dartScope = await _findScopeAt(Uri.parse(libraryUri), line, column);
     if (dartScope == null) {
       _log('ExpressionCompiler: scope not found at $libraryUri:$line:$column');
@@ -299,8 +301,8 @@
 
     // 3. compile dart expression to JS
 
-    var jsExpression = await _compileExpression(
-        dartScope, jsModules, moduleVariable, expression);
+    var jsExpression =
+        await _compileExpression(dartScope, jsModules, moduleName, expression);
 
     if (jsExpression == null) {
       _log('ExpressionCompiler: failed to compile $expression, $jsExpression');
@@ -370,10 +372,13 @@
   Future<Library> _getLibrary(Uri libraryUri) async {
     return await _compiler.context.runInContext((_) async {
       var builder = _compiler.userCode.loader.builders[libraryUri];
-      var library =
-          _compiler.userCode.loader.read(libraryUri, -1, accessor: builder);
+      if (builder != null) {
+        var library =
+            _compiler.userCode.loader.read(libraryUri, -1, accessor: builder);
 
-      return library.library;
+        return library.library;
+      }
+      return null;
     });
   }
 
@@ -381,12 +386,12 @@
   /// example:
   /// let dart = require('dart_sdk').dart;
   js_ast.Statement _createRequireModuleStatement(
-      String moduleName, String moduleVariable) {
+      String moduleName, String moduleVariable, String fieldName) {
     var variableName = moduleVariable.replaceFirst('.dart', '');
     var rhs = js_ast.PropertyAccess.field(
         js_ast.Call(js_ast.Identifier('require'),
             [js_ast.LiteralExpression('\'$moduleName\'')]),
-        '$variableName');
+        '$fieldName');
 
     return rhs.toVariableDeclaration(js_ast.Identifier('$variableName'));
   }
@@ -416,16 +421,18 @@
   /// [scope] current dart scope information
   /// [modules] map from module variable names to module names in JavaScript
   /// code. For example,
-  /// { 'dart':'dart_sdk', 'main': '/packages/hello_world_main.dart' }
+  /// { 'dart':'dart_sdk', 'main': 'packages/hello_world_main.dart' }
   /// [currentModule] current js module name.
   /// For example, in library package:hello_world/main.dart:
-  /// '/packages/hello_world/main.dart'
+  /// 'packages/hello_world/main.dart'
   /// [expression] expression to compile in given [scope].
   Future<String> _compileExpression(
       DartScope scope,
       Map<String, String> modules,
       String currentModule,
       String expression) async {
+    var currentModuleVariable = currentModule.split('/').last;
+
     // 1. Compile expression to kernel AST
 
     var procedure = await _compiler.compileExpression(
@@ -437,6 +444,10 @@
         scope.cls?.name,
         scope.procedure.isStatic);
 
+    // TODO(annagrin): The condition below seems to be always false.
+    // Errors are still correctly reported in the frontent_server,
+    // but we end up doing unnesessary work below.
+    // Add communication of error state from compiler here.
     if (_compiler.context.errors.length > 0) {
       return null;
     }
@@ -468,18 +479,46 @@
     var body = js_ast.Block([
       // require dart, core, self and other modules
       ...modules.keys.map((String variable) {
-        return _createRequireModuleStatement(modules[variable], variable);
+        var module = modules[variable];
+        _log('ExpressionCompiler: '
+            'module: $module, '
+            'variable: $variable, '
+            'currentModule: $currentModule');
+
+        return _createRequireModuleStatement(
+            module,
+            // Inside a module, the library variable compiler creates is the
+            // file name without extension (currentModuleVariable).
+            //
+            // Inside a non-package module, the statement we need to produce
+            // to reload the library is
+            //      'main = require('web/main.dart').web__main'
+            //
+            // This is the only special case where currentModuleVariable
+            // ('main') is different from variable and field ('web_name')
+            //
+            // In all other cases, the variable, currentModuleVariable and
+            // the field are the same:
+            //      'library = require('packages/_test/library.dart').library'
+            //
+            // TODO(annagrin): save metadata decribing the variables and fields
+            // to use during compilation and use this information here to make
+            // expression compilation resilient to name convention changes
+            // See [issue 891](https://github.com/dart-lang/webdev/issues/891)
+            module == currentModule ? currentModuleVariable : variable,
+            variable);
       }),
       // re-create private field accessors
       ...scope.privateFields
-          .map((String v) => _createPrivateField(v, currentModule)),
-      ...privateFields.map((String v) => _createPrivateField(v, currentModule)),
+          .map((String v) => _createPrivateField(v, currentModuleVariable)),
+      ...privateFields
+          .map((String v) => _createPrivateField(v, currentModuleVariable)),
       // statements generated by the FE
       ...jsFun.body.statements
     ]);
 
     var jsFunModified = js_ast.Fun(jsFun.params, body);
-    _log('ExpressionCompiler: JS AST: ${jsFunModified.toString()}');
+    _log('ExpressionCompiler: JS AST: $jsFunModified');
 
     // 4. print JS ast to string for evaluation
 
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index 84f0118..cedccc6 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -10,7 +10,7 @@
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:path/path.dart' as p;
-import 'package:package_resolver/package_resolver.dart';
+import 'package:package_config/package_config.dart';
 import 'strong_components.dart';
 
 /// Produce a special bundle format for compiled JavaScript.
@@ -24,11 +24,13 @@
 /// only the updated libraries.
 class JavaScriptBundler {
   JavaScriptBundler(this._originalComponent, this._strongComponents,
-      this._fileSystemScheme, this._packageResolver)
+      this._fileSystemScheme, this._packageConfig,
+      {this.useDebuggerModuleNames = false})
       : compilers = <String, ProgramCompiler>{} {
     _summaries = <Component>[];
     _summaryUris = <Uri>[];
     _moduleImportForSummary = <Uri, String>{};
+    _moduleImportNameForSummary = <Uri, String>{};
     _uriToComponent = <Uri, Component>{};
     for (Uri uri in _strongComponents.modules.keys) {
       final List<Library> libraries = _strongComponents.modules[uri].toList();
@@ -39,7 +41,13 @@
       );
       _summaries.add(summaryComponent);
       _summaryUris.add(uri);
-      _moduleImportForSummary[uri] = '${urlForComponentUri(uri)}.lib.js';
+
+      var baseName = urlForComponentUri(uri);
+      _moduleImportForSummary[uri] = '$baseName.lib.js';
+      if (useDebuggerModuleNames) {
+        _moduleImportNameForSummary[uri] = makeDebuggerModuleName(baseName);
+      }
+
       _uriToComponent[uri] = summaryComponent;
     }
   }
@@ -47,12 +55,14 @@
   final StrongComponents _strongComponents;
   final Component _originalComponent;
   final String _fileSystemScheme;
-  final PackageResolver _packageResolver;
+  final PackageConfig _packageConfig;
+  final bool useDebuggerModuleNames;
   final Map<String, ProgramCompiler> compilers;
 
   List<Component> _summaries;
   List<Uri> _summaryUris;
   Map<Uri, String> _moduleImportForSummary;
+  Map<Uri, String> _moduleImportNameForSummary;
   Map<Uri, Component> _uriToComponent;
 
   /// Compile each component into a single JavaScript module.
@@ -72,7 +82,10 @@
     final summaryToModule = Map<Component, String>.identity();
     for (var i = 0; i < _summaries.length; i++) {
       var summary = _summaries[i];
-      var moduleImport = _moduleImportForSummary[_summaryUris[i]];
+      var moduleImport = useDebuggerModuleNames
+          // debugger loads modules by modules names, not paths
+          ? _moduleImportNameForSummary[_summaryUris[i]]
+          : _moduleImportForSummary[_summaryUris[i]];
       for (var l in summary.libraries) {
         assert(!importToSummary.containsKey(l));
         importToSummary[l] = summary;
@@ -95,10 +108,15 @@
       final summaryComponent = _uriToComponent[moduleUri];
 
       // module name to use in trackLibraries
-      // use full path for tracking if module uri is not a package uri
-      final String moduleName = moduleUri.scheme == 'package'
-          ? '/packages/${moduleUri.path}'
-          : moduleUri.path;
+      // use full path for tracking if module uri is not a package uri.
+      String moduleName = urlForComponentUri(moduleUri);
+      if (useDebuggerModuleNames) {
+        // Skip the leading '/' as module names are used to require
+        // modules using module paths mape in RequireJS, which treats
+        // names with leading '/' or '.js' extensions specially
+        // and tries to load them without mapping.
+        moduleName = makeDebuggerModuleName(moduleName);
+      }
 
       var compiler = ProgramCompiler(
         _originalComponent,
@@ -127,7 +145,7 @@
         // make relative paths in the source map we get the absolute uri for
         // the module and make them relative to that.
         sourceMapBase =
-            p.dirname((await _packageResolver.resolveUri(moduleUri)).path);
+            p.dirname((await _packageConfig.resolve(moduleUri)).path);
       }
       final code = jsProgramToCode(
         jsModule,
@@ -160,3 +178,7 @@
 String urlForComponentUri(Uri componentUri) => componentUri.scheme == 'package'
     ? '/packages/${componentUri.path}'
     : componentUri.path;
+
+String makeDebuggerModuleName(String name) {
+  return name.startsWith('/') ? name.substring(1) : name;
+}
diff --git a/pkg/frontend_server/pubspec.yaml b/pkg/frontend_server/pubspec.yaml
index 0436be0..c14c3b8 100644
--- a/pkg/frontend_server/pubspec.yaml
+++ b/pkg/frontend_server/pubspec.yaml
@@ -13,7 +13,7 @@
   front_end: ^0.1.6
   kernel: ^0.3.6
   args: ^1.4.4
-  package_resolver: ^1.0.0
+  package_config: ^1.9.0
 
 dev_dependencies:
   test: any
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 267a812..8e521f4 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -548,7 +548,7 @@
       ];
 
       var library = 'package:hello/foo.dart';
-      var module = '/packages/hello/foo.dart';
+      var module = 'packages/hello/foo.dart';
 
       final StreamController<List<int>> streamController =
           StreamController<List<int>>();
@@ -1470,7 +1470,7 @@
         ..writeAsStringSync("hello:${tempDir.uri}\n");
 
       var library = 'package:hello/foo.dart';
-      var module = '/packages/hello/foo.dart';
+      var module = 'packages/hello/foo.dart';
 
       var dillFile = File('${tempDir.path}/foo.dart.dill');
       var sourceFile = File('${dillFile.path}.sources');
@@ -1486,6 +1486,7 @@
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
         '--packages=${tempDir.path}/.packages',
+        '--debugger-module-names'
       ];
 
       final StreamController<List<int>> streamController =
@@ -1577,7 +1578,7 @@
         ..writeAsStringSync("hello:${tempDir.uri}\n");
 
       var library = 'package:hello/foo.dart';
-      var module = '/packages/hello/foo.dart';
+      var module = 'packages/hello/foo.dart';
 
       var dillFile = File('${tempDir.path}/foo.dart.dill');
       var sourceFile = File('${dillFile.path}.sources');
@@ -1593,6 +1594,7 @@
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
         '--packages=${tempDir.path}/.packages',
+        '--debugger-module-names'
       ];
 
       final StreamController<List<int>> streamController =
diff --git a/pkg/frontend_server/test/src/expression_compiler_test.dart b/pkg/frontend_server/test/src/expression_compiler_test.dart
index fd4cb68..4528537 100644
--- a/pkg/frontend_server/test/src/expression_compiler_test.dart
+++ b/pkg/frontend_server/test/src/expression_compiler_test.dart
@@ -137,7 +137,8 @@
     // create expression compiler
     var evaluator = new ExpressionCompiler(
         compiler, kernel2jsCompiler, component,
-        verbose: false, onDiagnostic: setup.options.onDiagnostic);
+        verbose: setup.options.verbose,
+        onDiagnostic: setup.options.onDiagnostic);
 
     // collect all module names and paths
     Map<Uri, Module> moduleInfo = _collectModules(component);
@@ -164,9 +165,6 @@
       return TestCompilationResult(jsExpression, false);
     }
 
-    // use to generate expected test results
-    //print("\njsExpression: ${jsExpression}");
-
     return TestCompilationResult(jsExpression, true);
   }
 
diff --git a/pkg/frontend_server/test/src/javascript_bundle_test.dart b/pkg/frontend_server/test/src/javascript_bundle_test.dart
index e410461..c24aa9e 100644
--- a/pkg/frontend_server/test/src/javascript_bundle_test.dart
+++ b/pkg/frontend_server/test/src/javascript_bundle_test.dart
@@ -10,7 +10,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:package_resolver/package_resolver.dart';
+import 'package:package_config/package_config.dart';
 import 'package:test/test.dart';
 
 /// Additional indexed types required by the dev_compiler's NativeTypeSet.
@@ -73,7 +73,16 @@
       ]),
   ];
 
-  final packageResolver = PackageResolver.config({'a': Uri.file('/pkg/a')});
+  final packageConfig = PackageConfig.parseJson({
+    'configVersion': 2,
+    'packages': [
+      {
+        'name': 'a',
+        'rootUri': 'file:///pkg/a',
+        'packagesUri': '',
+      }
+    ],
+  }, Uri.base);
   final multiRootScheme = 'org-dartlang-app';
 
   test('compiles JavaScript code', () async {
@@ -90,7 +99,7 @@
         StrongComponents(testComponent, {}, Uri.file('/c.dart'));
     strongComponents.computeModules();
     final javaScriptBundler = JavaScriptBundler(
-        testComponent, strongComponents, multiRootScheme, packageResolver);
+        testComponent, strongComponents, multiRootScheme, packageConfig);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
@@ -116,7 +125,7 @@
 
   test('converts package: uris into /packages/ uris', () async {
     var importUri = Uri.parse('package:a/a.dart');
-    var fileUri = await packageResolver.resolveUri(importUri);
+    var fileUri = await packageConfig.resolve(importUri);
     final library = Library(
       importUri,
       fileUri: fileUri,
@@ -130,7 +139,7 @@
     final strongComponents = StrongComponents(testComponent, {}, fileUri);
     strongComponents.computeModules();
     final javaScriptBundler = JavaScriptBundler(
-        testComponent, strongComponents, multiRootScheme, packageResolver);
+        testComponent, strongComponents, multiRootScheme, packageConfig);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
@@ -170,7 +179,7 @@
     final strongComponents = StrongComponents(testComponent, {}, fileUri);
     strongComponents.computeModules();
     final javaScriptBundler = JavaScriptBundler(
-        testComponent, strongComponents, multiRootScheme, packageResolver);
+        testComponent, strongComponents, multiRootScheme, packageConfig);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
@@ -219,7 +228,7 @@
         StrongComponents(testComponent, {}, Uri.file('/a.dart'));
     strongComponents.computeModules();
     final javaScriptBundler = JavaScriptBundler(
-        testComponent, strongComponents, multiRootScheme, packageResolver);
+        testComponent, strongComponents, multiRootScheme, packageConfig);
     final manifestSink = _MemorySink();
     final codeSink = _MemorySink();
     final sourcemapSink = _MemorySink();
diff --git a/pkg/kernel/bin/split.dart b/pkg/kernel/bin/split.dart
index d3abed4..e3c99e8 100755
--- a/pkg/kernel/bin/split.dart
+++ b/pkg/kernel/bin/split.dart
@@ -8,7 +8,6 @@
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/src/tool/command_line_util.dart';
 
@@ -45,7 +44,7 @@
   IOSink sink = output.openWrite();
   try {
     BinaryPrinter printer =
-        new LimitedBinaryPrinter(sink, (lib) => lib == wantedLibrary, false);
+        new BinaryPrinter(sink, libraryFilter: (lib) => lib == wantedLibrary);
     printer.writeComponentFile(component);
   } finally {
     await sink.close();
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index aa2408c..92e1b4c 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -73,6 +73,8 @@
 import 'canonical_name.dart' show CanonicalName;
 export 'canonical_name.dart' show CanonicalName;
 
+import 'default_language_version.dart';
+
 import 'transformations/flags.dart';
 import 'text/ast_to_text.dart';
 import 'core_types.dart';
@@ -329,10 +331,6 @@
   /// The URI of the source file this library was loaded from.
   Uri fileUri;
 
-  // TODO(jensj): Do we have a better option than this?
-  static int defaultLanguageVersionMajor = 2;
-  static int defaultLanguageVersionMinor = 8;
-
   int _languageVersionMajor;
   int _languageVersionMinor;
   int get languageVersionMajor =>
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 190429c..dbdee4d 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -37,8 +37,9 @@
   final BytesSink _constantsBytesSink;
   BufferedSink _constantsSink;
   BufferedSink _sink;
-  bool includeSources;
-  bool includeOffsets;
+  final bool includeSources;
+  final bool includeOffsets;
+  final LibraryFilter libraryFilter;
 
   List<int> libraryOffsets;
   List<int> classOffsets;
@@ -52,7 +53,6 @@
 
   List<CanonicalName> _canonicalNameList;
   Set<CanonicalName> _knownCanonicalNameNonRootTops = new Set<CanonicalName>();
-  Set<CanonicalName> _reindexedCanonicalNames = new Set<CanonicalName>();
 
   Library _currentLibrary;
 
@@ -61,7 +61,8 @@
   /// The BinaryPrinter will use its own buffer, so the [sink] does not need
   /// one.
   BinaryPrinter(Sink<List<int>> sink,
-      {StringIndexer stringIndexer,
+      {this.libraryFilter,
+      StringIndexer stringIndexer,
       this.includeSources = true,
       this.includeOffsets = true})
       : _mainSink = new BufferedSink(sink),
@@ -504,9 +505,10 @@
     _canonicalNameList = <CanonicalName>[];
     for (int i = 0; i < component.libraries.length; ++i) {
       Library library = component.libraries[i];
-      if (!shouldWriteLibraryCanonicalNames(library)) continue;
-      _indexLinkTableInternal(library.canonicalName);
-      _knownCanonicalNameNonRootTops.add(library.canonicalName);
+      if (libraryFilter == null || libraryFilter(library)) {
+        _indexLinkTableInternal(library.canonicalName);
+        _knownCanonicalNameNonRootTops.add(library.canonicalName);
+      }
     }
   }
 
@@ -523,15 +525,14 @@
 
   /// Compute canonical names for the whole component or parts of it.
   void computeCanonicalNames(Component component) {
-    component.computeCanonicalNames();
+    for (int i = 0; i < component.libraries.length; ++i) {
+      Library library = component.libraries[i];
+      if (libraryFilter == null || libraryFilter(library)) {
+        component.computeCanonicalNamesForLibrary(library);
+      }
+    }
   }
 
-  /// Return `true` if all canonical names of the [library] should be written
-  /// into the link table.  If some libraries of the component are skipped,
-  /// then all the additional names referenced by the libraries that are written
-  /// by [writeLibraries] are automatically added.
-  bool shouldWriteLibraryCanonicalNames(Library library) => true;
-
   void writeCanonicalNameEntry(CanonicalName node) {
     CanonicalName parent = node.parent;
     if (parent.isRoot) {
@@ -565,7 +566,16 @@
       _writeMetadataSection(component);
       writeStringTable(stringIndexer);
       writeConstantTable(_constantIndexer);
-      writeComponentIndex(component, component.libraries);
+      List<Library> libraries = component.libraries;
+      if (libraryFilter != null) {
+        List<Library> librariesNew = new List<Library>();
+        for (int i = 0; i < libraries.length; i++) {
+          Library library = libraries[i];
+          if (libraryFilter(library)) librariesNew.add(library);
+        }
+        libraries = librariesNew;
+      }
+      writeComponentIndex(component, libraries);
 
       _flush();
     });
@@ -703,7 +713,10 @@
   /// Write all of some of the libraries of the [component].
   void writeLibraries(Component component) {
     for (int i = 0; i < component.libraries.length; ++i) {
-      writeLibraryNode(component.libraries[i]);
+      Library library = component.libraries[i];
+      if (libraryFilter == null || libraryFilter(library)) {
+        writeLibraryNode(library);
+      }
     }
   }
 
@@ -862,35 +875,16 @@
   void checkCanonicalName(CanonicalName node) {
     if (_knownCanonicalNameNonRootTops.contains(node.nonRootTop)) return;
     if (node == null || node.isRoot) return;
-    bool indexCheckContains;
-    {
-      if (node.index < 0) {
-        indexCheckContains = false;
-      } else if (node.index >= _canonicalNameList.length) {
-        indexCheckContains = false;
-      } else {
-        CanonicalName claim = _canonicalNameList[node.index];
-        if (node != claim) {
-          indexCheckContains = false;
-        } else {
-          indexCheckContains = true;
-        }
+    if (node.index >= 0 && node.index < _canonicalNameList.length) {
+      CanonicalName claim = _canonicalNameList[node.index];
+      if (node == claim) {
+        // Already has the claimed index.
+        return;
       }
     }
-
-    bool setContains = _reindexedCanonicalNames.contains(node);
-    if (setContains != indexCheckContains) {
-      throw "Unexpected difference between set and index";
-    }
-
-    if (_reindexedCanonicalNames.contains(node)) {
-      return;
-    }
-
     checkCanonicalName(node.parent);
     node.index = _canonicalNameList.length;
     _canonicalNameList.add(node);
-    _reindexedCanonicalNames.add(node);
   }
 
   void writeNullAllowedCanonicalNameReference(CanonicalName name) {
diff --git a/pkg/kernel/lib/binary/limited_ast_to_binary.dart b/pkg/kernel/lib/binary/limited_ast_to_binary.dart
deleted file mode 100644
index 6f5208e..0000000
--- a/pkg/kernel/lib/binary/limited_ast_to_binary.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/binary/ast_to_binary.dart';
-
-/// Writes libraries that satisfy the [predicate].
-///
-/// Only the referenced subset of canonical names is indexed and written,
-/// so we don't waste time indexing all libraries of a component, when only
-/// a tiny subset is used.
-class LimitedBinaryPrinter extends BinaryPrinter {
-  final LibraryFilter predicate;
-
-  LimitedBinaryPrinter(
-      Sink<List<int>> sink, this.predicate, bool excludeUriToSource,
-      {bool includeOffsets = true})
-      : super(sink,
-            includeSources: !excludeUriToSource,
-            includeOffsets: includeOffsets);
-
-  @override
-  void computeCanonicalNames(Component component) {
-    for (var library in component.libraries) {
-      if (predicate(library)) {
-        component.root
-            .getChildFromUri(library.importUri)
-            .bindTo(library.reference);
-        library.computeCanonicalNames();
-      }
-    }
-  }
-
-  @override
-  bool shouldWriteLibraryCanonicalNames(Library library) {
-    return predicate(library);
-  }
-
-  void writeLibraries(Component component) {
-    for (int i = 0; i < component.libraries.length; ++i) {
-      Library library = component.libraries[i];
-      if (predicate(library)) writeLibraryNode(library);
-    }
-  }
-
-  @override
-  void writeNode(Node node) {
-    if (node is Library) {
-      throw "Internal error: writeNode should not see a Library.";
-    }
-    super.writeNode(node);
-  }
-
-  @override
-  void writeComponentIndex(Component component, List<Library> libraries) {
-    var librariesToWrite = libraries.where(predicate).toList();
-    super.writeComponentIndex(component, librariesToWrite);
-  }
-}
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
new file mode 100644
index 0000000..73670a5
--- /dev/null
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -0,0 +1,11 @@
+// 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.
+
+// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
+//
+// Instead modify 'tools/experimental_features.yaml' and run
+// 'pkg/front_end/tool/fasta generate-experimental-flags' to update.
+
+int defaultLanguageVersionMajor = 2;
+int defaultLanguageVersionMinor = 8;
diff --git a/pkg/kernel/lib/src/norm.dart b/pkg/kernel/lib/src/norm.dart
index 5c161a9..c434b90 100644
--- a/pkg/kernel/lib/src/norm.dart
+++ b/pkg/kernel/lib/src/norm.dart
@@ -13,6 +13,7 @@
   return type.accept(new _Norm(coreTypes)) ?? type;
 }
 
+/// Returns normalization of [supertype].
 Supertype normSupertype(CoreTypes coreTypes, Supertype supertype) {
   if (supertype.typeArguments.isEmpty) return supertype;
   _Norm normVisitor = new _Norm(coreTypes);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 0b9e21b..8c6a691 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -22,6 +22,32 @@
       this.forceLateLoweringForTesting = false,
       this.forceNoExplicitGetterCallsForTesting = false,
       this.enableNullSafety = false});
+
+  bool operator ==(other) {
+    if (other is! TargetFlags) return false;
+    TargetFlags o = other;
+    if (trackWidgetCreation != o.trackWidgetCreation) return false;
+    if (forceLateLoweringForTesting != o.forceLateLoweringForTesting) {
+      return false;
+    }
+    if (forceNoExplicitGetterCallsForTesting !=
+        o.forceNoExplicitGetterCallsForTesting) {
+      return false;
+    }
+    if (enableNullSafety != o.enableNullSafety) return false;
+    return true;
+  }
+
+  int get hashCode {
+    int hash = 485786;
+    hash = 0x3fffffff & (hash * 31 + (hash ^ trackWidgetCreation.hashCode));
+    hash = 0x3fffffff &
+        (hash * 31 + (hash ^ forceLateLoweringForTesting.hashCode));
+    hash = 0x3fffffff &
+        (hash * 31 + (hash ^ forceNoExplicitGetterCallsForTesting.hashCode));
+    hash = 0x3fffffff & (hash * 31 + (hash ^ enableNullSafety.hashCode));
+    return hash;
+  }
 }
 
 typedef Target _TargetBuilder(TargetFlags flags);
@@ -87,6 +113,7 @@
 
 /// A target provides backend-specific options for generating kernel IR.
 abstract class Target {
+  TargetFlags get flags;
   String get name;
 
   /// A list of URIs of required libraries, not including dart:core.
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 88188f5..9d5b372 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -116,17 +116,22 @@
   }
 
   // Name an expression by emitting an assignment to a temporary variable.
-  VariableGet name(Expression expr) {
+  Expression name(Expression expr) {
+    // Allocate as dynamic as temps might be reused with different types.
     VariableDeclaration temp =
-        allocateTemporary(nameIndex, expr.getStaticType(_staticTypeContext));
-    statements.add(new ExpressionStatement(new VariableSet(temp, expr)));
-    return new VariableGet(temp);
+        allocateTemporary(nameIndex, const DynamicType());
+    statements.add(ExpressionStatement(VariableSet(temp, expr)));
+    // Type annotate the get via an unsafe cast since all temps are allocated
+    // as dynamic.
+    DartType type = expr.getStaticType(_staticTypeContext);
+    return StaticInvocation(continuationRewriter.helper.unsafeCast,
+        Arguments(<Expression>[VariableGet(temp)], types: <DartType>[type]));
   }
 
-  VariableDeclaration allocateTemporary(int index, DartType type) {
+  VariableDeclaration allocateTemporary(int index,
+      [DartType type = const DynamicType()]) {
     for (var i = variables.length; i <= index; i++) {
-      variables
-          .add(new VariableDeclaration(":async_temporary_${i}", type: type));
+      variables.add(VariableDeclaration(":async_temporary_${i}", type: type));
     }
     return variables[index];
   }
@@ -159,11 +164,12 @@
   // Getting a final or const variable is not an effect so it can be evaluated
   // after an await to its right.
   TreeNode visitVariableGet(VariableGet expr) {
+    Expression result = expr;
     if (seenAwait && !expr.variable.isFinal && !expr.variable.isConst) {
-      expr = name(expr);
+      result = name(expr);
       ++nameIndex;
     }
-    return expr;
+    return result;
   }
 
   // Transform an expression given an action to transform the children.  For
diff --git a/pkg/nnbd_migration/bin/steamroll_ecosystem.dart b/pkg/nnbd_migration/bin/steamroll_ecosystem.dart
index 35a443d..341eca2 100644
--- a/pkg/nnbd_migration/bin/steamroll_ecosystem.dart
+++ b/pkg/nnbd_migration/bin/steamroll_ecosystem.dart
@@ -4,12 +4,13 @@
 
 import 'dart:io';
 
+import 'package:args/args.dart';
+
 /// This binary can generate and update an integrated workspace for upgrading
 /// individual packages and their dependencies simultaneously.
 
 import 'package:nnbd_migration/src/fantasyland/fantasy_workspace.dart';
 import 'package:path/path.dart' as path;
-import 'package:args/args.dart';
 
 final parser = ArgParser()
   ..addMultiOption('extra-packages', abbr: 'e', splitCommas: true)
@@ -25,18 +26,15 @@
       defaultsTo: false,
       negatable: true,
       help:
-          'Use dartfix to force-update all dependencies (lib/ directory only).')
+          'Use dart migrate to force-update all dependencies (lib/ directory only).')
   ..addFlag('force-migrate-package',
       defaultsTo: false,
       negatable: true,
-      help: 'Use dartfix to force-update the base package (from root).')
+      help: 'Use dart migrate to force-update the base package (from root).')
   ..addFlag('force-migrate-extras',
       defaultsTo: false,
       negatable: true,
-      help: 'Use dartfix to force-update extra packages (from root).')
-  ..addOption('sdk',
-      help:
-          'Use the given path to a NNBD-compliant sdk.  Required for any --force options.')
+      help: 'Use dart migrate to force-update extra packages (from root).')
   ..addOption('analyze-results',
       defaultsTo: 'full',
       allowed: ['full', 'none', 'all'],
@@ -106,15 +104,11 @@
           (s) => s.name != packageName && !extraPackages.contains(s.name)));
     }
 
-    if (results['sdk'] as String == null) {
-      _showHelp('error: --sdk required with force-migrate options');
-      exit(1);
-    }
-    if (!await workspace.forceMigratePackages(upgradedSubPackages,
-        upgradedSubPackagesLibOnly, results['sdk'] as String, [
+    if (!await workspace
+        .forceMigratePackages(upgradedSubPackages, upgradedSubPackagesLibOnly, [
       Platform.resolvedExecutable,
       path.normalize(path.join(Platform.script.toFilePath(), '..', '..', '..',
-          'dartfix', 'bin', 'dartfix.dart'))
+          'dartdev', 'bin', 'dartdev.dart'))
     ])) {
       stderr.writeln('//// Everything already upgraded.');
     }
@@ -137,8 +131,7 @@
     if (results['analyze-results'] == 'all') {
       subPackagesLibOnly = upgradedSubPackagesLibOnly;
     }
-    await workspace.analyzePackages(
-        subPackages, subPackagesLibOnly, results['sdk'] as String, [
+    await workspace.analyzePackages(subPackages, subPackagesLibOnly, [
       Platform.resolvedExecutable,
       path.normalize(path.join(Platform.script.toFilePath(), '..', '..', '..',
           'analyzer_cli', 'bin', 'analyzer.dart'))
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 594be67..820e4bf 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -8,6 +8,42 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
 
+/// Data structure used by the nullability migration engine to refer to a
+/// specific location in source code.
+class CodeReference {
+  final String path;
+
+  final int line;
+
+  final int column;
+
+  /// Name of the enclosing function, or `null` if not known.
+  String function;
+
+  CodeReference(this.path, this.line, this.column, this.function);
+
+  CodeReference.fromJson(dynamic json)
+      : path = json['path'] as String,
+        line = json['line'] as int,
+        column = json['col'] as int,
+        function = json['function'] as String;
+
+  Map<String, Object> toJson() {
+    return {
+      'path': path,
+      'line': line,
+      'col': column,
+      if (function != null) 'function': function
+    };
+  }
+
+  @override
+  String toString() {
+    var pathAsUri = Uri.file(path);
+    return 'unknown ($pathAsUri:$line:$column)';
+  }
+}
+
 /// Information exposed to the migration client about the set of nullability
 /// nodes decorating a type in the program being migrated.
 abstract class DecoratedTypeInfo {
@@ -267,6 +303,14 @@
 
   /// The edges that caused this node to have the nullability that it has.
   Iterable<EdgeInfo> get upstreamEdges;
+
+  PropagationStepInfo get whyNullable;
+}
+
+abstract class PropagationStepInfo {
+  CodeReference get codeReference;
+
+  PropagationStepInfo get principalCause;
 }
 
 /// Information exposed to the migration client about a node in the nullability
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index b7efcd9..bd2113c 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -63,7 +63,7 @@
           'Changed a null-aware access into an ordinary access, because the target cannot be null',
       kind: NullabilityFixKind.removeNullAwareness);
 
-  /// A message used by dartfix to indicate a fix has been applied.
+  /// A message used to indicate a fix has been applied.
   final String appliedMessage;
 
   /// The kind of fix described.
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 9b55b96..48517ac 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -1593,6 +1593,9 @@
         assert(_flowAnalysis != null);
       }
       try {
+        if (declaredElement is PromotableElement) {
+          _flowAnalysis.declare(declaredElement, initializer != null);
+        }
         if (initializer == null) {
           // For top level variables and static fields, we have to generate an
           // implicit assignment of `null`.  For instance fields, this is done
@@ -1606,9 +1609,6 @@
                 type.node, ImplicitNullInitializerOrigin(source, node));
           }
         } else {
-          if (declaredElement is PromotableElement) {
-            _flowAnalysis.initialize(declaredElement);
-          }
           var destinationType = getOrComputeElementType(declaredElement);
           _handleAssignment(initializer, destinationType: destinationType);
         }
@@ -1652,7 +1652,7 @@
   void _addParametersToFlowAnalysis(FormalParameterList parameters) {
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
-        _flowAnalysis.initialize(parameter.declaredElement);
+        _flowAnalysis.declare(parameter.declaredElement, true);
       }
     }
   }
@@ -1703,7 +1703,7 @@
         _assignedVariables);
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
-        _flowAnalysis.initialize(parameter.declaredElement);
+        _flowAnalysis.declare(parameter.declaredElement, true);
       }
     }
   }
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index e22e48b..f5ada49 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/instrumentation.dart';
-import 'package:nnbd_migration/src/nullability_node.dart';
 
 /// Edge origin resulting from a type in already-migrated code.
 ///
@@ -107,11 +106,32 @@
           .thisOrAncestorOfType<CompilationUnit>()
           .lineInfo
           .getLocation(node.offset);
-      return CodeReference(
-          source.fullName, location.lineNumber, location.columnNumber);
+      return CodeReference(source.fullName, location.lineNumber,
+          location.columnNumber, _computeEnclosingName(node));
     }
     return null;
   }
+
+  static String _computeEnclosingName(AstNode node) {
+    List<String> parts = [];
+    while (node != null) {
+      var nodeName = _computeNodeDeclarationName(node);
+      if (nodeName != null) {
+        parts.add(nodeName);
+      }
+      node = node.parent;
+    }
+    if (parts.isEmpty) return null;
+    return parts.reversed.join('.');
+  }
+
+  static String _computeNodeDeclarationName(AstNode node) {
+    if (node is Declaration) {
+      return node.declaredElement?.name;
+    } else {
+      return null;
+    }
+  }
 }
 
 /// An edge origin used for edges that originated because of a reference to an
diff --git a/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace.dart b/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace.dart
index e9aa2ae..87a39e7 100644
--- a/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace.dart
+++ b/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace.dart
@@ -28,7 +28,6 @@
   Future<void> analyzePackages(
       Iterable<FantasySubPackage> subPackages,
       Iterable<FantasySubPackage> subPackagesLibOnly,
-      String sdkPath,
       List<String> dartanalyzerExec);
 
   /// Force-migrate these packages.
@@ -36,11 +35,8 @@
   /// All [subPackages] must be part of this workspace.  Returned future
   /// completes when all [subPackages] have been migrated.  Completes with
   /// `true` if packages needed to be migrated, `false` if skipped.
-  Future<bool> forceMigratePackages(
-      Iterable<FantasySubPackage> subPackages,
-      Iterable<FantasySubPackage> subPackagesLibOnly,
-      String sdkPath,
-      List<String> dartfixExec);
+  Future<bool> forceMigratePackages(Iterable<FantasySubPackage> subPackages,
+      Iterable<FantasySubPackage> subPackagesLibOnly, List<String> dartdevExec);
 
   /// Rewrite the package_config.json and/or .packages for this package.
   Future<void> rewritePackageConfigWith(FantasySubPackage subPackage);
diff --git a/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace_impl.dart b/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace_impl.dart
index a760781..4888a3f 100644
--- a/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace_impl.dart
+++ b/pkg/nnbd_migration/lib/src/fantasyland/fantasy_workspace_impl.dart
@@ -13,9 +13,11 @@
 import 'package:nnbd_migration/src/fantasyland/fantasy_workspace.dart';
 import 'package:nnbd_migration/src/utilities/multi_future_tracker.dart';
 import 'package:nnbd_migration/src/utilities/subprocess_launcher.dart';
+import 'package:path/path.dart' as path;
 
 class FantasyWorkspaceError extends Error {
   final String message;
+
   FantasyWorkspaceError(this.message);
 
   @override
@@ -35,7 +37,7 @@
       Future<FantasyRepo> Function(FantasyRepoSettings, String, bool,
               {FantasyRepoDependencies fantasyRepoDependencies})
           buildGitRepoFrom,
-      List<String> dartfixExec})
+      List<String> dartdevExec})
       : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE,
         launcher = launcher ?? SubprocessLauncher('fantasy-workspace'),
@@ -67,16 +69,19 @@
   Map<FantasySubPackageSettings, FantasySubPackage> subPackages = {};
 
   File _packagesFile;
+
   File get packagesFile => _packagesFile ??= _external.resourceProvider.getFile(
       _external.resourceProvider.pathContext
           .join(workspaceRootPath, '.packages'));
 
   File _packageConfigJson;
+
   File get packageConfigJson => _packageConfigJson ??=
       _external.resourceProvider.getFile(_external.resourceProvider.pathContext
           .join(workspaceRootPath, '.dart_tool', 'package_config.json'));
 
   File _migratedPackagesFile;
+
   // TODO(jcollins-g): Remove this hack once a good way of determining whether
   // a package is already migrated is available. (and our front-end implements it)
   File get migratedPackagesFile => _migratedPackagesFile ??=
@@ -84,6 +89,7 @@
           .join(workspaceRootPath, '.steamroller_already_migrated'));
 
   Set<String> _migratedPackagePaths;
+
   Set<String> get migratedPackagePaths =>
       _migratedPackagePaths ??= migratedPackagesFile.exists
           ? migratedPackagesFile.readAsStringSync().split('\n').toSet()
@@ -128,15 +134,14 @@
   Future<bool> forceMigratePackages(
       Iterable<FantasySubPackage> subPackages,
       Iterable<FantasySubPackage> subPackagesLibOnly,
-      String sdkPath,
-      List<String> dartfixExec) async {
-    String dartfix_bin = dartfixExec.first;
-    List<String> args = dartfixExec.sublist(1);
+      List<String> dartdevExec) async {
+    String dartdevBin = dartdevExec.first;
+    List<String> args = dartdevExec.sublist(1);
     args.addAll(
-        ['upgrade', 'sdk', '--no-preview', '--force', '--sdk=$sdkPath']);
+        ['migrate', '--no-web-preview', '--apply-changes', '--ignore-errors']);
     bool migrationNecessary = false;
     // TODO(jcollins-g): consider using the package graph to break up and
-    // parallelize dartfix runs
+    // parallelize dartdev migrate runs
     for (FantasySubPackage subPackage in subPackages) {
       if (!migratedPackagePaths.contains(subPackage.packageRoot.path)) {
         args.add(subPackage.packageRoot.path);
@@ -151,7 +156,7 @@
     }
     if (migrationNecessary) {
       await _external.launcher
-          .runStreamed(dartfix_bin, args, instance: 'dartfix');
+          .runStreamed(dartdevBin, args, instance: 'dartdev');
     }
     // Update the file once we're sure it has completed successfully.
     packagesMigrated(subPackages);
@@ -163,8 +168,9 @@
   Future<void> analyzePackages(
       Iterable<FantasySubPackage> subPackages,
       Iterable<FantasySubPackage> subPackagesLibOnly,
-      String sdkPath,
       List<String> dartanalyzerExec) async {
+    var sdkPath = path.dirname(path.dirname(Platform.resolvedExecutable));
+
     var analyzers = <Future>[];
     String dartanalyzer_bin = dartanalyzerExec.first;
     List<String> baseArgs = dartanalyzerExec.sublist(1);
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 524691d..fe9bab5 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -10,33 +10,6 @@
 
 import 'edge_origin.dart';
 
-/// Data structure used by the nullability migration engine to refer to a
-/// specific location in source code.
-class CodeReference {
-  final String path;
-
-  final int line;
-
-  final int column;
-
-  CodeReference(this.path, this.line, this.column);
-
-  CodeReference.fromJson(dynamic json)
-      : path = json['path'] as String,
-        line = json['line'] as int,
-        column = json['col'] as int;
-
-  Map<String, Object> toJson() {
-    return {'path': path, 'line': line, 'col': column};
-  }
-
-  @override
-  String toString() {
-    var pathAsUri = Uri.file(path);
-    return 'unknown ($pathAsUri:$line:$column)';
-  }
-}
-
 /// Base class for steps that occur as part of downstream propagation, where the
 /// nullability of a node is changed to a new state.
 abstract class DownstreamPropagationStep extends PropagationStep {
@@ -992,6 +965,8 @@
 
   NonNullIntent _nonNullIntent;
 
+  DownstreamPropagationStep _whyNullable;
+
   NullabilityNodeMutable.fromJson(
       dynamic json, NullabilityGraphDeserializer deserializer)
       : _nullability = json['nullability'] == null
@@ -1021,9 +996,13 @@
   NonNullIntent get nonNullIntent => _nonNullIntent;
 
   @override
+  PropagationStepInfo get whyNullable => _whyNullable;
+
+  @override
   void resetState() {
     _nullability = Nullability.nonNullable;
     _nonNullIntent = NonNullIntent.none;
+    _whyNullable = null;
   }
 
   @override
@@ -1052,7 +1031,7 @@
 }
 
 /// Class representing a step taken by the nullability propagation algorithm.
-abstract class PropagationStep {
+abstract class PropagationStep implements PropagationStepInfo {
   PropagationStep();
 
   factory PropagationStep.fromJson(
@@ -1278,6 +1257,9 @@
       isNullable ? NonNullIntent.none : NonNullIntent.direct;
 
   @override
+  PropagationStepInfo get whyNullable => null;
+
+  @override
   String get _jsonKind => 'immutable';
 
   @override
@@ -1534,6 +1516,7 @@
     node._nullability = newState;
     _postmortemFileWriter?.addPropagationStep(step);
     if (!oldState.isNullable) {
+      node._whyNullable = step;
       // Was not previously nullable, so we need to propagate.
       for (var edge in node._downstreamEdges) {
         _pendingDownstreamSteps
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index b40cac4..9296346 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeSystemImpl;
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/edge_builder.dart';
@@ -2655,6 +2656,36 @@
     assertNoUpstreamNullability(decoratedTypeAnnotation('double').node);
   }
 
+  Future<void> test_edgeOrigin_call_from_function() async {
+    await analyze('''
+void f(int i) {}
+void g(int j) {
+  f(j);
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int j').node,
+        decoratedTypeAnnotation('int i').node,
+        hard: true,
+        codeReference:
+            matchCodeRef(offset: findNode.simple('j);').offset, function: 'g'));
+  }
+
+  Future<void> test_edgeOrigin_call_from_method() async {
+    await analyze('''
+class C {
+  void f(int i) {}
+  void g(int j) {
+    f(j);
+  }
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int j').node,
+        decoratedTypeAnnotation('int i').node,
+        hard: true,
+        codeReference: matchCodeRef(
+            offset: findNode.simple('j);').offset, function: 'C.g'));
+  }
+
   Future<void> test_export_metadata() async {
     await analyze('''
 @deprecated
diff --git a/pkg/nnbd_migration/test/fantasyland/fantasy_workspace_test.dart b/pkg/nnbd_migration/test/fantasyland/fantasy_workspace_test.dart
index e60f7c5..ff3ae24 100644
--- a/pkg/nnbd_migration/test/fantasyland/fantasy_workspace_test.dart
+++ b/pkg/nnbd_migration/test/fantasyland/fantasy_workspace_test.dart
@@ -2,9 +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 'dart:io';
+
 import 'package:mockito/mockito.dart';
 import 'package:nnbd_migration/src/fantasyland/fantasy_workspace.dart';
 import 'package:nnbd_migration/src/fantasyland/fantasy_workspace_impl.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -33,19 +36,20 @@
             workspaceDependencies: workspaceDependencies);
     await testWorkspace.analyzePackages(
         testWorkspace.subPackages.values.where((p) => p.name == 'test_package'),
-        // We are forcing extra_package_1 to be treated as migrated with 'lib_only'
-        // for the purpose of testing.  This would not be the case in normal
-        // steamroll_ecosystem.dart runs.
+        // We are forcing extra_package_1 to be treated as migrated with
+        // 'lib_only' for the purpose of testing.  This would not be the case in
+        // normal steamroll_ecosystem.dart runs.
         testWorkspace.subPackages.values
             .where((p) => p.name == 'extra_package_1'),
-        convertPath('/path/to/a/sdk'),
         ['dart', 'really_the_analyzer.dart']);
+
+    var sdkPath = path.dirname(path.dirname(Platform.resolvedExecutable));
     verify(mockLauncher.runStreamed(
         'dart',
         [
           'really_the_analyzer.dart',
           '--enable-experiment=non-nullable',
-          '--dart-sdk=${convertPath("/path/to/a/sdk")}',
+          '--dart-sdk=$sdkPath',
           '.'
         ],
         workingDirectory: convertPath('/fantasyland/_repo/test_package'),
@@ -56,7 +60,7 @@
         [
           'really_the_analyzer.dart',
           '--enable-experiment=non-nullable',
-          '--dart-sdk=${convertPath("/path/to/a/sdk")}',
+          '--dart-sdk=$sdkPath',
           'lib'
         ],
         workingDirectory: convertPath('/fantasyland/_repo/extra_package_1'),
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index f4f53ac..34716eb 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:meta/meta.dart';
+import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/conditional_discard.dart';
 import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
@@ -197,7 +198,10 @@
   /// aren't already.  In practice this means that the caller can pass in either
   //  /// a [NodeMatcher] or a [NullabilityNode].
   NullabilityEdge assertEdge(Object source, Object destination,
-      {@required bool hard, bool checkable = true, Object guards = isEmpty}) {
+      {@required bool hard,
+      bool checkable = true,
+      Object guards = isEmpty,
+      Object codeReference}) {
     var edges = getEdges(source, destination);
     if (edges.length == 0) {
       fail('Expected edge $source -> $destination, found none');
@@ -208,6 +212,9 @@
       expect(edge.isHard, hard);
       expect(edge.isCheckable, checkable);
       expect(edge.guards, guards);
+      if (codeReference != null) {
+        expect(edge.codeReference, codeReference);
+      }
       return edge;
     }
   }
@@ -402,6 +409,17 @@
     return variables.conditionalDiscard(findNode.collectionElement(text));
   }
 
+  /// Returns a [Matcher] that matches a [CodeReference] pointing to the given
+  /// file [offset], with the given [function] name.
+  TypeMatcher<CodeReference> matchCodeRef(
+      {@required int offset, @required String function}) {
+    var location = testUnit.lineInfo.getLocation(offset);
+    return TypeMatcher<CodeReference>()
+        .having((cr) => cr.line, 'line', location.lineNumber)
+        .having((cr) => cr.column, 'column', location.columnNumber)
+        .having((cr) => cr.function, 'function', function);
+  }
+
   NullabilityNode possiblyOptionalParameter(String text) {
     return variables.possiblyOptionalParameter(findNode.defaultParameter(text));
   }
diff --git a/pkg/nnbd_migration/test/nullability_node_test.dart b/pkg/nnbd_migration/test/nullability_node_test.dart
index 639b5a9..e674000 100644
--- a/pkg/nnbd_migration/test/nullability_node_test.dart
+++ b/pkg/nnbd_migration/test/nullability_node_test.dart
@@ -2,6 +2,7 @@
 // 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:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/edge_origin.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:test/test.dart';
diff --git a/pkg/nnbd_migration/tool/trial_migration.sh b/pkg/nnbd_migration/tool/trial_migration.sh
index a2e048f..4db1c2b 100755
--- a/pkg/nnbd_migration/tool/trial_migration.sh
+++ b/pkg/nnbd_migration/tool/trial_migration.sh
@@ -7,12 +7,12 @@
 
 TRIAL_MIGRATION=`dirname "$0"`/trial_migration.dart
 
-# Priority One, Group One
+# Priority One, Group One, as defined at go/dart-null-safety-migration-order.
 p1g1 () {
   for n in charcode collection logging path pedantic term_glyph typed_data ; do
     echo "-g https://dart.googlesource.com/${n}.git"
   done
-  # Some packages do not have googlesource mirrors, use github directly.
+  # Some packages do not have googlesource mirrors; use GitHub directly.
   echo "-g https://github.com/google/vector_math.dart.git"
   # SDK-only packages.
   echo "-p meta"
diff --git a/pkg/nnbd_migration/tool/trial_migration_p2.sh b/pkg/nnbd_migration/tool/trial_migration_p2.sh
new file mode 100755
index 0000000..63fee78
--- /dev/null
+++ b/pkg/nnbd_migration/tool/trial_migration_p2.sh
@@ -0,0 +1,148 @@
+#!/usr/bin/env bash
+#
+# 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.
+#
+
+TRIAL_MIGRATION=`dirname "$0"`/trial_migration.dart
+
+# Priority Two, Group One, as defined at go/dart-null-safety-migration-order.
+p2g1 () {
+  echo "-g https://github.com/google/ansicolor-dart.git"
+  echo "-g https://dart.googlesource.com/args.git"
+  echo "-p dart_internal"
+  echo "-g https://dart.googlesource.com/fixnum.git"
+  echo "-g https://github.com/google/inject.dart.git"
+  echo "-p js"
+  echo "-g https://github.com/a14n/dart-js-wrapping.git"
+  echo "-g https://dart.googlesource.com/mime.git"
+  echo "-g https://github.com/xxgreg/mustache.git"
+  echo "-g https://github.com/leonsenft/path_to_regexp.git"
+  echo "-g https://github.com/petitparser/dart-petitparser.git"
+  echo "-g https://github.com/google/platform.dart.git"
+  echo "-g https://github.com/dart-lang/stream_transform.git"
+  echo "-g https://github.com/dart-lang/sync_http.git"
+  echo "-g https://github.com/srawlins/timezone.git"
+}
+
+# Priority Two, Group Two, as defined at go/dart-null-safety-migration-order.
+p2g2 () {
+  echo "-g https://github.com/google/ansicolor-dart.git"
+  echo "-g https://dart.googlesource.com/cli_util.git"
+  echo "-g https://github.com/dart-lang/clock.git"
+  echo "-g https://github.com/kevmoo/completion.dart.git"
+  echo "-g https://dart.googlesource.com/convert.git"
+  echo "-g https://github.com/a14n/dart-google-maps.git"
+  echo "-g https://github.com/dart-lang/http_server.git"
+  echo "-g https://dart.googlesource.com/intl.git"
+  echo "-p kernel"
+  echo "-g https://dart.googlesource.com/package_config.git"
+  # TODO(srawlins): Add protobuf, from monorepo
+  #  https://github.com/dart-lang/protobuf.
+  echo "-g https://dart.googlesource.com/pub_semver.git"
+  echo "-g https://github.com/google/quiver-dart.git"
+}
+
+# Priority Two, Group Three, as defined at go/dart-null-safety-migration-order.
+p2g3 () {
+  # TODO(srawlins): Add android_intent, from monorepo
+  #  https://github.com/flutter/plugins/tree/master/packages/android_intent.
+  # SDK-only packages.
+  echo "-g https://dart.googlesource.com/bazel_worker.git"
+  echo "-g https://github.com/google/built_collection.dart.git"
+  # TODO(srawlins): Add charts_common, from monorepo
+  #  https://github.com/google/charts/tree/master/charts_common.
+  echo "-g https://github.com/jathak/cli_repl.git"
+  echo "-g https://dart.googlesource.com/crypto.git"
+  echo "-g https://dart.googlesource.com/csslib.git"
+  echo "-g https://github.com/google/file.dart.git"
+  # TODO(srawlins): Add front_end, which currently crashes.
+  echo "-g https://github.com/reyerstudio/google-maps-markerclusterer.git"
+  # TODO(srawlins): Add google_sign_in, from monorepo
+  #  https://github.com/flutter/plugins/tree/master/packages/google_sign_in.
+  echo "-g https://dart.googlesource.com/http_multi_server.git"
+  echo "-g https://github.com/dart-lang/observable.git"
+  # TODO(srawlins): Add package_info, from monorepo
+  #  https://github.com/flutter/plugins/tree/master/packages/package_info.
+  echo "-g https://dart.googlesource.com/pool.git"
+  # TODO(srawlins): Add protoc_plugin, from monorepo
+  #  https://github.com/dart-lang/protobuf.
+  echo "-g https://github.com/google/quiver-log.git"
+  # TODO(srawlins): Add shared_preferences, from monorepo
+  #  https://github.com/flutter/plugins/tree/master/packages/shared_preferences.
+  echo "-g https://dart.googlesource.com/source_maps.git"
+  echo "-g https://dart.googlesource.com/string_scanner.git"
+  echo "-g https://github.com/renggli/dart-xml.git"
+}
+
+# Priority Two, Group Four, as defined at go/dart-null-safety-migration-order.
+p2g4 () {
+  echo "-g https://github.com/brendan-duncan/archive.git"
+  # TODO(srawlins): Add built_value, from monorepo
+  #  https://github.com/google/built_value.dart
+  # Not including charted; concern is internal copy; not old published copy.
+  echo "-g https://dart.googlesource.com/glob.git"
+  echo "-g https://dart.googlesource.com/html.git"
+  echo "-g https://dart.googlesource.com/http_parser.git"
+  echo "-g https://dart.googlesource.com/json_rpc_2.git"
+  # Not including observe; concern is internal copy; not old published copy.
+  echo "-g https://github.com/google/process.dart.git"
+  # Not including scissors; concern is internal copy; not old published copy.
+}
+
+# Priority Two, Group Five, as defined at go/dart-null-safety-migration-order.
+p2g5 () {
+  echo "-p analyzer"
+  # Not including angular_forms; concern is internal copy; not old published copy.
+  # Not including angular_router; concern is internal copy; not old published copy.
+  # Not including angular_test; concern is internal copy; not old published copy.
+  echo "-g https://github.com/dart-lang/code_builder.git"
+  echo "-g https://dart.googlesource.com/http.git"
+  echo "-g https://github.com/brendan-duncan/image.git"
+  echo "-g https://dart.googlesource.com/shelf.git"
+}
+
+# Priority Two, Group Six, as defined at go/dart-null-safety-migration-order.
+p2g6 () {
+  echo "-p analyzer_plugin"
+  # TODO(srawlins): Add build, from monorepo
+  #  https://github.com/dart-lang/build/tree/master/build.
+  echo "-g https://github.com/dart-lang/coverage.git"
+  echo "-g https://dart.googlesource.com/dart_style.git"
+  # TODO(srawlins): Add flutter_test.
+  echo "-g https://github.com/dart-lang/googleapis_auth.git"
+  echo "-g https://github.com/dart-lang/intl_translation.git"
+  echo "-g https://dart.googlesource.com/mockito.git"
+  echo "-g https://dart.googlesource.com/package_resolver.git"
+  # Not including pageloader ("2"); concern is internal copy; not old published copy.
+  echo "-g https://dart.googlesource.com/shelf_static.git"
+  echo "-g https://dart.googlesource.com/shelf_web_socket.git"
+}
+
+# Priority Two, Group Seven, as defined at go/dart-null-safety-migration-order.
+p2g7 () {
+  echo "-g https://github.com/dart-lang/grpc-dart.git"
+  echo "-g https://github.com/google/pageloader.git" # This is pageloader3.
+  echo "-g https://github.com/sass/dart-sass.git"
+  echo "-g https://dart.googlesource.com/shelf_packages_handler.git"
+  echo "-g https://github.com/dart-lang/source_gen.git"
+  echo "-g https://dart.googlesource.com/source_map_stack_trace.git"
+}
+
+# Priority Two, Group Eight, as defined at go/dart-null-safety-migration-order.
+p2g8 () {
+  # Not including angular_compiler; concern is internal copy; not old published copy.
+  # TODO(srawlins): Add built_value_generator, from monorepo
+  #  https://github.com/google/built_value.dart.
+  # TODO(srawlins): Add flutter_tools, from monorepo
+  #  https://github.com/flutter/flutter.
+  # TODO(srawlins): Locate and add rpc_client.
+  echo ""
+}
+
+# The current "official" set of parameters for the trial_migration script.
+set -x
+dart --enable-asserts ${TRIAL_MIGRATION} \
+  $(p2g1) $(p2g2) $(p2g3) $(p2g4) $(p2g5) $(p2g6) $(p2g7) $(p2g8) \
+  "$@"
diff --git a/pkg/telemetry/lib/crash_reporting.dart b/pkg/telemetry/lib/crash_reporting.dart
index 6e44d8e..808c4ac 100644
--- a/pkg/telemetry/lib/crash_reporting.dart
+++ b/pkg/telemetry/lib/crash_reporting.dart
@@ -66,6 +66,7 @@
   Future sendReport(
     dynamic error,
     StackTrace stackTrace, {
+    List<CrashReportAttachment> attachments = const [],
     String comment,
   }) async {
     if (!shouldSend()) {
@@ -129,6 +130,15 @@
           _stackTraceFileField, chain.terse.toString(),
           filename: _stackTraceFilename));
 
+      for (var attachment in attachments) {
+        req.files.add(
+          new http.MultipartFile.fromString(
+            attachment._field,
+            attachment._value,
+          ),
+        );
+      }
+
       final http.StreamedResponse resp = await _httpClient.send(req);
 
       if (resp.statusCode != 200) {
@@ -152,6 +162,18 @@
   }
 }
 
+/// The additional attachment to be added to a crash report.
+class CrashReportAttachment {
+  final String _field;
+  final String _value;
+
+  CrashReportAttachment.string({
+    @required String field,
+    @required String value,
+  })  : _field = field,
+        _value = value;
+}
+
 /// A typedef to allow crash reporting to query as to whether it should send a
 /// crash report.
 typedef bool EnablementCallback();
diff --git a/pkg/telemetry/test/crash_reporting_test.dart b/pkg/telemetry/test/crash_reporting_test.dart
index 9d48324..be93424 100644
--- a/pkg/telemetry/test/crash_reporting_test.dart
+++ b/pkg/telemetry/test/crash_reporting_test.dart
@@ -72,6 +72,27 @@
       expect(body, contains('additional message'));
     });
 
+    test('has attachments', () async {
+      CrashReportSender sender = new CrashReportSender(
+          analytics.trackingId, shouldSend,
+          httpClient: mockClient);
+
+      await sender.sendReport(
+        'test-error',
+        StackTrace.current,
+        attachments: [
+          CrashReportAttachment.string(field: 'attachment-1', value: 'aaa'),
+          CrashReportAttachment.string(field: 'attachment-2', value: 'bbb'),
+        ],
+      );
+
+      String body = utf8.decode(request.bodyBytes);
+      expect(body, contains('attachment-1'));
+      expect(body, contains('aaa'));
+      expect(body, contains('attachment-2'));
+      expect(body, contains('bbb'));
+    });
+
     test('has ptime', () async {
       CrashReportSender sender = new CrashReportSender(
           analytics.trackingId, shouldSend,
diff --git a/pkg/test_runner/bin/http_server.dart b/pkg/test_runner/bin/http_server.dart
index 881dd35..b034e72 100644
--- a/pkg/test_runner/bin/http_server.dart
+++ b/pkg/test_runner/bin/http_server.dart
@@ -20,7 +20,6 @@
   parser.addFlag('help',
       abbr: 'h', negatable: false, help: 'Print this usage information.');
   parser.addOption('build-directory', help: 'The build directory to use.');
-  parser.addOption('package-root', help: 'The package root to use.');
   parser.addOption('packages', help: 'The package spec file to use.');
   parser.addOption('network',
       help: 'The network interface to use.', defaultsTo: '0.0.0.0');
@@ -38,7 +37,6 @@
         args['csp'] as bool,
         Runtime.find(args['runtime'] as String),
         null,
-        args['package-root'] as String,
         args['packages'] as String);
     var port = int.parse(args['port'] as String);
     var crossOriginPort = int.parse(args['crossOriginPort'] as String);
diff --git a/pkg/test_runner/lib/src/configuration.dart b/pkg/test_runner/lib/src/configuration.dart
index 63fc701..b5cf4ea 100644
--- a/pkg/test_runner/lib/src/configuration.dart
+++ b/pkg/test_runner/lib/src/configuration.dart
@@ -63,7 +63,6 @@
       this.keepGeneratedFiles,
       this.sharedOptions,
       String packages,
-      this.packageRoot,
       this.suiteDirectory,
       this.outputDirectory,
       this.reproducingArguments,
@@ -170,15 +169,12 @@
 
   String get packages {
     // If the .packages file path wasn't given, find it.
-    if (packageRoot == null && _packages == null) {
-      _packages = Repository.uri.resolve('.packages').toFilePath();
-    }
+    _packages ??= Repository.uri.resolve('.packages').toFilePath();
 
     return _packages;
   }
 
   final String outputDirectory;
-  final String packageRoot;
   final String suiteDirectory;
   String get babel => configuration.babel;
   String get builderTag => configuration.builderTag;
@@ -431,8 +427,7 @@
   /// server for cross-domain tests can be found by calling
   /// `getCrossOriginPortNumber()`.
   Future startServers() {
-    _servers = TestingServers(
-        buildDirectory, isCsp, runtime, null, packageRoot, packages);
+    _servers = TestingServers(buildDirectory, isCsp, runtime, null, packages);
     var future = servers.startServers(localIP,
         port: testServerPort, crossOriginPort: testServerCrossOriginPort);
 
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index eae5f49..757e362 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -747,7 +747,6 @@
           localIP: data["local_ip"] as String,
           sharedOptions: sharedOptions,
           packages: data["packages"] as String,
-          packageRoot: data["package_root"] as String,
           suiteDirectory: data["suite_dir"] as String,
           outputDirectory: data["output_directory"] as String,
           reproducingArguments:
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 11c1d4bf..74bb378 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -18,7 +18,6 @@
 
 final _vmOptionsRegExp = RegExp(r"// VMOptions=(.*)");
 final _environmentRegExp = RegExp(r"// Environment=(.*)");
-final _packageRootRegExp = RegExp(r"// PackageRoot=(.*)");
 final _packagesRegExp = RegExp(r"// Packages=(.*)");
 final _experimentRegExp = RegExp(r"^--enable-experiment=([a-z,-]+)$");
 
@@ -180,7 +179,6 @@
           dart2jsOptions: [],
           ddcOptions: [],
           dartOptions: [],
-          packageRoot: null,
           packages: null,
           hasSyntaxError: false,
           hasCompileError: false,
@@ -259,34 +257,17 @@
     }
 
     // Packages.
-    String packageRoot;
     String packages;
-    matches = _packageRootRegExp.allMatches(contents);
-    for (var match in matches) {
-      if (packageRoot != null || packages != null) {
-        throw Exception('More than one "// Package... line in test $filePath');
-      }
-      packageRoot = match[1];
-      if (packageRoot != 'none') {
-        // PackageRoot=none means that no packages or package-root option
-        // should be given. Any other value overrides package-root and
-        // removes any packages option.  Don't use with // Packages=.
-        packageRoot = Uri.file(filePath)
-            .resolveUri(Uri.directory(packageRoot))
-            .toFilePath();
-      }
-    }
 
     matches = _packagesRegExp.allMatches(contents);
     for (var match in matches) {
-      if (packages != null || packageRoot != null) {
+      if (packages != null) {
         throw Exception('More than one "// Package..." line in test $filePath');
       }
       packages = match[1];
       if (packages != 'none') {
-        // Packages=none means that no packages or package-root option
-        // should be given. Any other value overrides packages and removes
-        // any package-root option. Don't use with // PackageRoot=.
+        // Packages=none means that no packages option should be given. Any
+        // other value overrides packages.
         packages =
             Uri.file(filePath).resolveUri(Uri.file(packages)).toFilePath();
       }
@@ -338,7 +319,6 @@
     }
 
     return TestFile._(suiteDirectory, Path(filePath), errorExpectations,
-        packageRoot: packageRoot,
         packages: packages,
         environment: environment,
         isMultitest: isMultitest,
@@ -367,8 +347,7 @@
       this.hasRuntimeError,
       this.hasStaticWarning,
       this.hasCrash})
-      : packageRoot = null,
-        packages = null,
+      : packages = null,
         environment = null,
         isMultitest = false,
         isMultiHtmlTest = false,
@@ -385,8 +364,7 @@
         super(null, null, []);
 
   TestFile._(Path suiteDirectory, Path path, List<StaticError> expectedErrors,
-      {this.packageRoot,
-      this.packages,
+      {this.packages,
       this.environment,
       this.isMultitest,
       this.isMultiHtmlTest,
@@ -413,7 +391,6 @@
 
   String get multitestKey => "";
 
-  final String packageRoot;
   final String packages;
 
   final Map<String, String> environment;
@@ -465,7 +442,6 @@
           hasSyntaxError: hasSyntaxError ?? false);
 
   String toString() => """TestFile(
-  packageRoot: $packageRoot
   packages: $packages
   environment: $environment
   isMultitest: $isMultitest
@@ -514,7 +490,6 @@
 
   Path get originPath => _origin.path;
 
-  String get packageRoot => _origin.packageRoot;
   String get packages => _origin.packages;
 
   List<Feature> get requirements => _origin.requirements;
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 317a917..45c8d41 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -782,8 +782,7 @@
             _createUrlPathFromFile(Path('$compilationTempDir/$nameNoExt.js'));
         content = dart2jsHtml(testFile.path.toNativePath(), scriptPath);
       } else {
-        var packageRoot =
-            packagesArgument(configuration.packageRoot, configuration.packages);
+        var packageRoot = packagesArgument(configuration.packages);
         packageRoot =
             packageRoot == null ? nameNoExt : packageRoot.split("=").last;
         var nameFromModuleRoot =
@@ -860,7 +859,7 @@
   List<String> _commonArgumentsFromFile(TestFile testFile) {
     var args = configuration.standardOptions.toList();
 
-    var packages = packagesArgument(testFile.packageRoot, testFile.packages);
+    var packages = packagesArgument(testFile.packages);
     if (packages != null) {
       args.add(packages);
     }
@@ -880,25 +879,17 @@
     return args;
   }
 
-  String packagesArgument(String packageRoot, String packages) {
+  String packagesArgument(String packages) {
     // If this test is inside a package, we will check if there is a
     // pubspec.yaml file and if so, create a custom package root for it.
-    if (packageRoot == null && packages == null) {
-      if (configuration.packageRoot != null) {
-        packageRoot = Path(configuration.packageRoot).toNativePath();
-      }
-
-      if (configuration.packages != null) {
-        packages = Path(configuration.packages).toNativePath();
-      }
+    if (packages == null && configuration.packages != null) {
+      packages = Path(configuration.packages).toNativePath();
     }
 
-    if (packageRoot == 'none' || packages == 'none') {
+    if (packages == 'none') {
       return null;
     } else if (packages != null) {
       return '--packages=$packages';
-    } else if (packageRoot != null) {
-      return '--package-root=$packageRoot';
     } else {
       return null;
     }
diff --git a/pkg/test_runner/lib/src/testing_servers.dart b/pkg/test_runner/lib/src/testing_servers.dart
index faf3ece..f46956c 100644
--- a/pkg/test_runner/lib/src/testing_servers.dart
+++ b/pkg/test_runner/lib/src/testing_servers.dart
@@ -6,7 +6,7 @@
 import 'dart:convert' show HtmlEscape;
 import 'dart:io';
 
-import 'package:package_resolver/package_resolver.dart';
+import 'package:package_config/package_config.dart';
 
 import 'package:test_runner/src/configuration.dart';
 import 'package:test_runner/src/repository.dart';
@@ -74,35 +74,28 @@
   ];
 
   final List<HttpServer> _serverList = [];
-  Uri _buildDirectory;
-  Uri _dartDirectory;
-  Uri _packageRoot;
-  Uri _packages;
+  final Uri _buildDirectory;
+  final Uri _dartDirectory;
+  final Uri _packages;
+  PackageConfig _packageConfig;
   final bool useContentSecurityPolicy;
   final Runtime runtime;
   DispatchingServer _server;
-  SyncPackageResolver _resolver;
 
-  TestingServers(String buildDirectory, this.useContentSecurityPolicy,
-      [this.runtime = Runtime.none,
-      String dartDirectory,
-      String packageRoot,
-      String packages]) {
-    _buildDirectory = Uri.base.resolveUri(Uri.directory(buildDirectory));
-    if (dartDirectory == null) {
-      _dartDirectory = Repository.uri;
-    } else {
-      _dartDirectory = Uri.base.resolveUri(Uri.directory(dartDirectory));
-    }
-    if (packageRoot == null) {
-      if (packages == null) {
-        _packages = _dartDirectory.resolve('.packages');
-      } else {
-        _packages = Uri.file(packages);
-      }
-    } else {
-      _packageRoot = Uri.directory(packageRoot);
-    }
+  TestingServers._(this.useContentSecurityPolicy, this._buildDirectory,
+      this._dartDirectory, this._packages, this.runtime);
+
+  factory TestingServers(String buildDirectory, bool useContentSecurityPolicy,
+      [Runtime runtime = Runtime.none, String dartDirectory, String packages]) {
+    var buildDirectoryUri = Uri.base.resolveUri(Uri.directory(buildDirectory));
+    var dartDirectoryUri = dartDirectory == null
+        ? Repository.uri
+        : Uri.base.resolveUri(Uri.directory(dartDirectory));
+    var packagesUri = packages == null
+        ? dartDirectoryUri.resolve('.packages')
+        : Uri.file(packages);
+    return TestingServers._(useContentSecurityPolicy, buildDirectoryUri,
+        dartDirectoryUri, packagesUri, runtime);
   }
 
   String get network => _serverList[0].address.address;
@@ -122,11 +115,8 @@
   ///   "Access-Control-Allow-Credentials: true"
   Future startServers(String host,
       {int port = 0, int crossOriginPort = 0}) async {
-    if (_packages != null) {
-      _resolver = await SyncPackageResolver.loadConfig(_packages);
-    } else {
-      _resolver = SyncPackageResolver.root(_packageRoot);
-    }
+    _packageConfig = await loadPackageConfigUri(_packages);
+
     _server = await _startHttpServer(host, port: port);
     await _startHttpServer(host,
         port: crossOriginPort, allowedPort: _serverList[0].port);
@@ -150,10 +140,7 @@
       '--build-directory=$buildDirectory',
       '--runtime=${runtime.name}',
       if (useContentSecurityPolicy) '--csp',
-      if (_packages != null)
-        '--packages=${_packages.toFilePath()}'
-      else if (_packageRoot != null)
-        '--package-root=${_packageRoot.toFilePath()}'
+      '--packages=${_packages.toFilePath()}'
     ].join(' ');
   }
 
@@ -260,7 +247,7 @@
       var packageUri = Uri(
           scheme: 'package',
           pathSegments: pathSegments.skip(packagesIndex + 1));
-      return _resolver.resolveUri(packageUri);
+      return _packageConfig.resolve(packageUri);
     }
     if (pathSegments[0] == prefixBuildDir) {
       return _buildDirectory.resolve(pathSegments.skip(1).join('/'));
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index ac6729b..b927d5b 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -11,8 +11,8 @@
     path: ../expect
   glob:
     path: ../../third_party/pkg/glob
-  package_resolver:
-    path: ../../third_party/pkg_tested/package_resolver
+  package_config:
+    path: ../../third_party/pkg_tested/package_config
   smith:
     path: ../smith
   status_file:
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index 1cc4883..6419750 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -16,6 +16,8 @@
     show ProcedureAttributesMetadataRepository;
 import 'package:vm/metadata/table_selector.dart'
     show TableSelectorMetadataRepository;
+import 'package:vm/metadata/unboxing_info.dart'
+    show UnboxingInfoMetadataRepository;
 import 'package:vm/metadata/unreachable.dart'
     show UnreachableNodeMetadataRepository;
 import 'package:vm/metadata/call_site_attributes.dart'
@@ -42,6 +44,7 @@
   component.addMetadataRepository(new InferredTypeMetadataRepository());
   component.addMetadataRepository(new ProcedureAttributesMetadataRepository());
   component.addMetadataRepository(new TableSelectorMetadataRepository());
+  component.addMetadataRepository(new UnboxingInfoMetadataRepository());
   component.addMetadataRepository(new UnreachableNodeMetadataRepository());
   component.addMetadataRepository(new BytecodeMetadataRepository());
   component.addMetadataRepository(new CallSiteAttributesMetadataRepository());
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index fe0e4da..5cd0297 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -33,6 +33,8 @@
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/binary/ast_from_binary.dart'
+    show BinaryBuilderWithMetadata;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/kernel.dart' show Component, Library, Procedure;
@@ -51,6 +53,7 @@
 final bool verbose = new bool.fromEnvironment('DFE_VERBOSE');
 final bool dumpKernel = new bool.fromEnvironment('DFE_DUMP_KERNEL');
 const String platformKernelFile = 'virtual_platform_kernel.dill';
+const String dotPackagesFile = '.packages';
 
 // NOTE: Any changes to these tags need to be reflected in kernel_isolate.cc
 // Tags used to indicate different requests to the dart frontend.
@@ -136,7 +139,6 @@
           parseExperimentalArguments(expFlags),
           onError: (msg) => errors.add(msg))
       ..environmentDefines = new EnvironmentMap()
-      ..enableAsserts = enableAsserts
       ..nnbdMode = nullSafety ? NnbdMode.Strong : NnbdMode.Weak
       ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
@@ -298,6 +300,29 @@
             supportCodeCoverage: true,
             packageConfig: packageConfig);
 
+  factory IncrementalCompilerWrapper.forExpressionCompilationOnly(
+      Component component,
+      int isolateId,
+      FileSystem fileSystem,
+      Uri platformKernelPath,
+      {bool suppressWarnings: false,
+      bool enableAsserts: false,
+      List<String> experimentalFlags: null,
+      bool bytecode: false,
+      String packageConfig: null}) {
+    IncrementalCompilerWrapper result = IncrementalCompilerWrapper(
+        isolateId, fileSystem, platformKernelPath,
+        suppressWarnings: suppressWarnings,
+        enableAsserts: enableAsserts,
+        experimentalFlags: experimentalFlags,
+        bytecode: bytecode);
+    result.generator = new IncrementalCompiler.forExpressionCompilationOnly(
+        component,
+        result.options,
+        component.mainMethod?.enclosingLibrary?.fileUri);
+    return result;
+  }
+
   @override
   Future<CompilerResult> compileInternal(Uri script) async {
     if (generator == null) {
@@ -379,6 +404,8 @@
 final Map<int, IncrementalCompilerWrapper> isolateCompilers =
     new Map<int, IncrementalCompilerWrapper>();
 final Map<int, List<Uri>> isolateDependencies = new Map<int, List<Uri>>();
+final Map<int, _ExpressionCompilationFromDillSettings> isolateLoadNotifies =
+    new Map<int, _ExpressionCompilationFromDillSettings>();
 
 IncrementalCompilerWrapper lookupIncrementalCompiler(int isolateId) {
   return isolateCompilers[isolateId];
@@ -469,9 +496,73 @@
   final String libraryUri = request[6];
   final String klass = request[7]; // might be null
   final bool isStatic = request[8];
+  final List dillData = request[9];
+  final int hotReloadCount = request[10];
+  final bool suppressWarnings = request[11];
+  final bool enableAsserts = request[12];
+  final List<String> experimentalFlags =
+      request[13] != null ? request[13].cast<String>() : null;
+  final bool bytecode = request[14];
 
   IncrementalCompilerWrapper compiler = isolateCompilers[isolateId];
 
+  _ExpressionCompilationFromDillSettings isolateLoadDillData =
+      isolateLoadNotifies[isolateId];
+  if (isolateLoadDillData != null) {
+    // Check if we can reuse the compiler.
+    if (isolateLoadDillData.hotReloadCount != hotReloadCount ||
+        isolateLoadDillData.prevDillCount != dillData.length) {
+      compiler = isolateCompilers[isolateId] = null;
+    }
+  }
+
+  if (compiler == null) {
+    if (dillData.isNotEmpty) {
+      if (verbose) {
+        print("DFE: Initializing compiler from ${dillData.length} dill files");
+      }
+      isolateLoadNotifies[isolateId] =
+          new _ExpressionCompilationFromDillSettings(
+              hotReloadCount, dillData.length);
+
+      Uri platformUri =
+          computePlatformBinariesLocation().resolve('vm_platform_strong.dill');
+
+      List<List<int>> data = [];
+      data.add(new File.fromUri(platformUri).readAsBytesSync());
+      for (int i = 0; i < dillData.length; i++) {
+        data.add(dillData[i]);
+      }
+
+      // Create Component initialized from the bytes.
+      Component component = new Component();
+      for (List<int> bytes in data) {
+        // TODO(jensj): There might be an issue if main has changed.
+        new BinaryBuilderWithMetadata(bytes, alwaysCreateNewNamedNodes: true)
+            .readComponent(component);
+      }
+
+      FileSystem fileSystem =
+          _buildFileSystem([dotPackagesFile, <int>[]], null, null, null);
+
+      // TODO(aam): IncrementalCompilerWrapper instance created below have to be
+      // destroyed when corresponding isolate is shut down. To achieve that
+      // kernel isolate needs to receive a message indicating that particular
+      // isolate was shut down. Message should be handled here in this script.
+      compiler = new IncrementalCompilerWrapper.forExpressionCompilationOnly(
+          component, isolateId, fileSystem, null,
+          suppressWarnings: suppressWarnings,
+          enableAsserts: enableAsserts,
+          experimentalFlags: experimentalFlags,
+          bytecode: bytecode,
+          packageConfig: dotPackagesFile);
+      isolateCompilers[isolateId] = compiler;
+      await compiler.compile(
+          component.mainMethod?.enclosingLibrary?.importUri ??
+              component.libraries.last.importUri);
+    }
+  }
+
   if (compiler == null) {
     port.send(new CompilationResult.errors(
             ["No incremental compiler available for this isolate."], null)
@@ -574,6 +665,7 @@
   final int isolateId = request[1];
   isolateCompilers.remove(isolateId);
   isolateDependencies.remove(isolateId);
+  isolateLoadNotifies.remove(isolateId);
 }
 
 Future _processLoadRequest(request) async {
@@ -994,3 +1086,11 @@
   new File('kernel_service.tmp${_debugDumpCounter++}.dill')
       .writeAsBytesSync(bytes);
 }
+
+class _ExpressionCompilationFromDillSettings {
+  int hotReloadCount;
+  int prevDillCount;
+
+  _ExpressionCompilationFromDillSettings(
+      this.hotReloadCount, this.prevDillCount);
+}
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index ac3e756..0f9bf55 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -30,7 +30,6 @@
 import 'package:args/args.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:vm/kernel_front_end.dart'
     show runGlobalTransformations, ErrorDetector;
 import 'package:kernel/target/targets.dart' show TargetFlags, getTarget;
@@ -186,11 +185,11 @@
   }
 
   final sink = File(filename).openWrite();
-  final printer = LimitedBinaryPrinter(sink, (lib) {
+  final printer = BinaryPrinter(sink, libraryFilter: (lib) {
     if (removeCoreLibs && isCoreLibrary(lib)) return false;
     if (isLibEmpty(lib)) return false;
     return true;
-  }, /*excludeUriToSource=*/ removeSource);
+  }, includeSources: !removeSource);
 
   printer.writeComponentFile(component);
   await sink.close();
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index d9d274d..10eeeaa 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -30,12 +30,14 @@
   bool fullComponent = false;
   Uri initializeFromDillUri;
   Uri _entryPoint;
+  final bool forExpressionCompilationOnly;
 
   Uri get entryPoint => _entryPoint;
   IncrementalKernelGenerator get generator => _generator;
 
   IncrementalCompiler(this._compilerOptions, this._entryPoint,
-      {this.initializeFromDillUri, bool incrementalSerialization: true}) {
+      {this.initializeFromDillUri, bool incrementalSerialization: true})
+      : forExpressionCompilationOnly = false {
     if (incrementalSerialization) {
       incrementalSerializer = new IncrementalSerializer();
     }
@@ -44,6 +46,14 @@
     _pendingDeltas = <Component>[];
   }
 
+  IncrementalCompiler.forExpressionCompilationOnly(
+      Component component, this._compilerOptions, this._entryPoint)
+      : forExpressionCompilationOnly = true {
+    _generator = new IncrementalKernelGenerator.forExpressionCompilationOnly(
+        _compilerOptions, _entryPoint, component);
+    _pendingDeltas = <Component>[];
+  }
+
   /// Recompiles invalidated files, produces incremental component.
   ///
   /// If [entryPoint] is specified, that points to new entry point for the
@@ -96,6 +106,10 @@
   /// were accepted, don't need to be included into subsequent [compile] calls
   /// results.
   accept() {
+    if (forExpressionCompilationOnly) {
+      throw new StateError("Incremental compiler created for expression "
+          "compilation only; cannot accept");
+    }
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = <Uri, Source>{};
 
@@ -128,6 +142,10 @@
   /// were rejected. Subsequent [compile] or [compileExpression] calls need to
   /// be processed without changes picked up by rejected [compile] call.
   reject() async {
+    if (forExpressionCompilationOnly) {
+      throw new StateError("Incremental compiler created for expression "
+          "compilation only; cannot reject");
+    }
     _pendingDeltas.clear();
     // Need to reset and warm up compiler so that expression evaluation requests
     // are processed in that known good state.
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 9199fa9..1db09a1 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -39,8 +39,6 @@
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/ast.dart' show Component, Library, Reference;
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
-import 'package:kernel/binary/limited_ast_to_binary.dart'
-    show LimitedBinaryPrinter;
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
 
@@ -207,9 +205,9 @@
   final Uri packagesUri = packages != null ? resolveInputUri(packages) : null;
 
   final platformKernelUri = Uri.base.resolveUri(new Uri.file(platformKernel));
-  final List<Uri> linkedDependencies = <Uri>[];
+  final List<Uri> additionalDills = <Uri>[];
   if (aot || linkPlatform) {
-    linkedDependencies.add(platformKernelUri);
+    additionalDills.add(platformKernelUri);
   }
 
   Uri mainUri = resolveInputUri(input);
@@ -224,7 +222,7 @@
     ..sdkSummary = platformKernelUri
     ..target = target
     ..fileSystem = fileSystem
-    ..linkedDependencies = linkedDependencies
+    ..additionalDills = additionalDills
     ..packagesFileUri = packagesUri
     ..experimentalFlags = parseExperimentalFlags(
         parseExperimentalArguments(experimentalFlags),
@@ -236,7 +234,7 @@
     ..embedSourceText = embedSources;
 
   final results = await compileToKernel(mainUri, compilerOptions,
-      includePlatform: linkedDependencies.isNotEmpty,
+      includePlatform: additionalDills.isNotEmpty,
       aot: aot,
       useGlobalTypeFlowAnalysis: tfa,
       environmentDefines: environmentDefines,
@@ -660,11 +658,9 @@
         }
       }
 
-      final BinaryPrinter printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) =>
-              packageFor(lib, compilationResults.loadedLibraries) == package,
-          false /* excludeUriToSource */);
+      final BinaryPrinter printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) =>
+              packageFor(lib, compilationResults.loadedLibraries) == package);
       printer.writeComponentFile(partComponent);
 
       await sink.close();
diff --git a/pkg/vm/lib/metadata/unboxing_info.dart b/pkg/vm/lib/metadata/unboxing_info.dart
new file mode 100644
index 0000000..3824ca7
--- /dev/null
+++ b/pkg/vm/lib/metadata/unboxing_info.dart
@@ -0,0 +1,60 @@
+// 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/ast.dart';
+
+class UnboxingInfoMetadata {
+  static const kBoxed = 0;
+  static const kUnboxedIntCandidate = 1 << 0;
+  static const kUnboxedDoubleCandidate = 1 << 1;
+  static const kUnboxingCandidate =
+      kUnboxedIntCandidate | kUnboxedDoubleCandidate;
+
+  final List<int> unboxedArgsInfo;
+  int returnInfo;
+
+  UnboxingInfoMetadata(int argsLen) : unboxedArgsInfo = [] {
+    for (int i = 0; i < argsLen; i++) {
+      unboxedArgsInfo.add(kUnboxingCandidate);
+    }
+    returnInfo = kUnboxingCandidate;
+  }
+
+  UnboxingInfoMetadata.readFromBinary(BinarySource source)
+      : unboxedArgsInfo = List<int>.generate(
+            source.readUInt(), (_) => source.readByte(),
+            growable: true),
+        returnInfo = source.readByte();
+
+  void writeToBinary(BinarySink sink) {
+    sink.writeUInt30(unboxedArgsInfo.length);
+    for (int val in unboxedArgsInfo) {
+      sink.writeByte(val);
+    }
+    sink.writeByte(returnInfo);
+  }
+}
+
+class UnboxingInfoMetadataRepository
+    extends MetadataRepository<UnboxingInfoMetadata> {
+  static const repositoryTag = 'vm.unboxing-info.metadata';
+
+  @override
+  final String tag = repositoryTag;
+
+  @override
+  final Map<TreeNode, UnboxingInfoMetadata> mapping =
+      <TreeNode, UnboxingInfoMetadata>{};
+
+  @override
+  void writeToBinary(
+      UnboxingInfoMetadata metadata, Node node, BinarySink sink) {
+    metadata.writeToBinary(sink);
+  }
+
+  @override
+  UnboxingInfoMetadata readFromBinary(Node node, BinarySource source) {
+    return UnboxingInfoMetadata.readFromBinary(source);
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 39c24e7..cab8e4d 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -511,6 +511,7 @@
 
   List<Statement> _statements = <Statement>[];
   TypeExpr result = null;
+  Type resultType = EmptyType();
 
   Summary(
       {this.parameterCount: 0,
@@ -620,7 +621,9 @@
 
     Statistics.summariesAnalyzed++;
 
-    return result.getComputedType(types);
+    Type computedType = result.getComputedType(types);
+    resultType = resultType.union(computedType, typeHierarchy);
+    return computedType;
   }
 
   Args<Type> get argumentTypes {
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index da7813f..12a97c8 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -19,6 +19,7 @@
 import 'summary.dart';
 import 'table_selector.dart';
 import 'types.dart';
+import 'unboxing_info.dart';
 import 'utils.dart';
 import '../pragma.dart';
 import '../devirtualization.dart' show Devirtualization;
@@ -26,6 +27,7 @@
 import '../../metadata/inferred_type.dart';
 import '../../metadata/procedure_attributes.dart';
 import '../../metadata/table_selector.dart';
+import '../../metadata/unboxing_info.dart';
 import '../../metadata/unreachable.dart';
 
 const bool kDumpClassHierarchy =
@@ -73,7 +75,12 @@
   new TFADevirtualization(component, typeFlowAnalysis, hierarchy)
       .visitComponent(component);
 
-  new AnnotateKernel(component, typeFlowAnalysis).visitComponent(component);
+  final unboxingInfo = new UnboxingInfoManager(typeFlowAnalysis);
+
+  _makePartition(component, typeFlowAnalysis, unboxingInfo);
+
+  new AnnotateKernel(component, typeFlowAnalysis, unboxingInfo)
+      .visitComponent(component);
 
   transformsStopWatch.stop();
 
@@ -117,10 +124,13 @@
   final ProcedureAttributesMetadataRepository _procedureAttributesMetadata;
   final TableSelectorMetadataRepository _tableSelectorMetadata;
   final TableSelectorAssigner _tableSelectorAssigner;
+  final UnboxingInfoMetadataRepository _unboxingInfoMetadata;
+  final UnboxingInfoManager _unboxingInfo;
   final Class _intClass;
   Constant _nullConstant;
 
-  AnnotateKernel(Component component, this._typeFlowAnalysis)
+  AnnotateKernel(
+      Component component, this._typeFlowAnalysis, this._unboxingInfo)
       : _directCallMetadataRepository =
             component.metadata[DirectCallMetadataRepository.repositoryTag],
         _inferredTypeMetadata = new InferredTypeMetadataRepository(),
@@ -129,11 +139,13 @@
             new ProcedureAttributesMetadataRepository(),
         _tableSelectorMetadata = new TableSelectorMetadataRepository(),
         _tableSelectorAssigner = new TableSelectorAssigner(),
+        _unboxingInfoMetadata = new UnboxingInfoMetadataRepository(),
         _intClass = _typeFlowAnalysis.environment.coreTypes.intClass {
     component.addMetadataRepository(_inferredTypeMetadata);
     component.addMetadataRepository(_unreachableNodeMetadata);
     component.addMetadataRepository(_procedureAttributesMetadata);
     component.addMetadataRepository(_tableSelectorMetadata);
+    component.addMetadataRepository(_unboxingInfoMetadata);
   }
 
   // Query whether a call site was marked as a direct call by the analysis.
@@ -301,10 +313,35 @@
               skipCheck: uncheckedParameters.contains(param));
         }
 
+        final unboxingInfoMetadata =
+            _unboxingInfo.getUnboxingInfoOfMember(member);
+
+        if (unboxingInfoMetadata != null) {
+          _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
+        }
+
         // TODO(alexmarkov): figure out how to pass receiver type.
       }
     } else if (!member.isAbstract) {
       _setUnreachable(member);
+    } else if (member is! Field) {
+      final unboxingInfoMetadata =
+          _unboxingInfo.getUnboxingInfoOfMember(member);
+      if (unboxingInfoMetadata != null) {
+        // Check for partitions that only have abstract methods should be marked as boxed.
+        if (unboxingInfoMetadata.returnInfo ==
+            UnboxingInfoMetadata.kUnboxingCandidate) {
+          unboxingInfoMetadata.returnInfo = UnboxingInfoMetadata.kBoxed;
+        }
+        for (int i = 0; i < unboxingInfoMetadata.unboxedArgsInfo.length; i++) {
+          if (unboxingInfoMetadata.unboxedArgsInfo[i] ==
+              UnboxingInfoMetadata.kUnboxingCandidate) {
+            unboxingInfoMetadata.unboxedArgsInfo[i] =
+                UnboxingInfoMetadata.kBoxed;
+          }
+        }
+        _unboxingInfoMetadata.mapping[member] = unboxingInfoMetadata;
+      }
     }
 
     // We need to attach ProcedureAttributesMetadata to all members, even
@@ -424,6 +461,76 @@
   }
 }
 
+// Partition the methods in order to idenfity parameters and return values
+// that are unboxing candidates
+void _makePartition(Component component, TypeFlowAnalysis typeFlowAnalysis,
+    UnboxingInfoManager unboxingInfo) {
+  // Traverses all the members and creates the partition graph.
+  // Currently unboxed parameters and return value are not supported for
+  // closures, therefore they do not exist in this graph
+  for (bool registering in const [true, false]) {
+    for (Library library in component.libraries) {
+      for (Class cls in library.classes) {
+        for (Member member in cls.members) {
+          if (registering) {
+            unboxingInfo.registerMember(member);
+          } else {
+            unboxingInfo.linkWithSuperClasses(member);
+          }
+        }
+      }
+      if (registering) {
+        for (Member member in library.members) {
+          unboxingInfo.registerMember(member);
+        }
+      }
+    }
+  }
+  unboxingInfo.finishGraph();
+
+  for (Library library in component.libraries) {
+    for (Class cls in library.classes) {
+      for (Member member in cls.members) {
+        _updateUnboxingInfoOfMember(member, typeFlowAnalysis, unboxingInfo);
+      }
+    }
+    for (Member member in library.members) {
+      _updateUnboxingInfoOfMember(member, typeFlowAnalysis, unboxingInfo);
+    }
+  }
+}
+
+void _updateUnboxingInfoOfMember(Member member,
+    TypeFlowAnalysis typeFlowAnalysis, UnboxingInfoManager unboxingInfo) {
+  if (typeFlowAnalysis.isMemberUsed(member) && (member is! Field)) {
+    final Args<Type> argTypes = typeFlowAnalysis.argumentTypes(member);
+    assertx(argTypes != null);
+
+    final int firstParamIndex =
+        numTypeParams(member) + (hasReceiverArg(member) ? 1 : 0);
+
+    final positionalParams = member.function.positionalParameters;
+    assertx(
+        argTypes.positionalCount == firstParamIndex + positionalParams.length);
+
+    for (int i = 0; i < positionalParams.length; i++) {
+      final inferredType = argTypes.values[firstParamIndex + i];
+      unboxingInfo.applyToArg(member, i, inferredType);
+    }
+
+    final names = argTypes.names;
+    for (int i = 0; i < names.length; i++) {
+      final inferredType =
+          argTypes.values[firstParamIndex + positionalParams.length + i];
+      unboxingInfo.applyToArg(
+          member, positionalParams.length + i, inferredType);
+    }
+
+    final Type resultType = typeFlowAnalysis.getSummary(member).resultType;
+    unboxingInfo.applyToReturn(member, resultType);
+  }
+}
+
 /// Tree shaking based on results of type flow analysis (TFA).
 ///
 /// TFA provides information about allocated classes and reachable member
diff --git a/pkg/vm/lib/transformations/type_flow/unboxing_info.dart b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
new file mode 100644
index 0000000..67be799
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/unboxing_info.dart
@@ -0,0 +1,286 @@
+// 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:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/external_name.dart' show getExternalName;
+import 'package:vm/transformations/type_flow/analysis.dart';
+import 'package:vm/transformations/type_flow/types.dart';
+
+import '../../metadata/unboxing_info.dart';
+import 'utils.dart';
+
+class UnboxingInfoManager {
+  final List<UnboxingInfoMetadata> _allUnboxingInfo = [];
+  final Map<Member, int> _memberIds = {};
+  final List<int> _partitionIds = [];
+  final List<int> _partitionRank = [];
+  final Set<Member> _mustBox = {};
+
+  final TypeHierarchy _typeHierarchy;
+  final CoreTypes _coreTypes;
+  bool _finishedGraph;
+
+  UnboxingInfoManager(TypeFlowAnalysis typeFlowAnalysis)
+      : _typeHierarchy = typeFlowAnalysis.hierarchyCache,
+        _coreTypes = typeFlowAnalysis.environment.coreTypes,
+        _finishedGraph = false;
+
+  void registerMember(Member member) {
+    member = _validMemberOrNull(member);
+    if (member == null) return;
+    _addMember(member);
+  }
+
+  UnboxingInfoMetadata getUnboxingInfoOfMember(Member member) {
+    assertx(_finishedGraph);
+    member = _validMemberOrNull(member);
+    if ((member == null || (!_memberIds.containsKey(member)))) {
+      return null;
+    }
+    final partitionId = _memberIds[member];
+    return _allUnboxingInfo[partitionId];
+  }
+
+  void linkWithSuperClasses(Member member) {
+    member = _validMemberOrNull(member);
+    if (member == null) return;
+    _linkRecursive(member, member.enclosingClass);
+  }
+
+  void finishGraph() {
+    assertx(!_finishedGraph);
+    final oldToNewId = {};
+    final newUnboxingInfo = <UnboxingInfoMetadata>[];
+    for (int i = 0; i < _allUnboxingInfo.length; i++) {
+      if (_find(i) == i) {
+        final newId = oldToNewId.length;
+        oldToNewId[i] = newId;
+        newUnboxingInfo.add(_allUnboxingInfo[i]);
+      }
+    }
+    for (final key in _memberIds.keys) {
+      final newId = oldToNewId[_partitionIds[_memberIds[key]]];
+      assertx(newId != null);
+      _memberIds[key] = newId;
+    }
+    _allUnboxingInfo.clear();
+    _allUnboxingInfo.insertAll(0, newUnboxingInfo);
+    _memberIds.forEach((member, id) {
+      if (_mustBox.contains(member)) {
+        _allUnboxingInfo[id].returnInfo = UnboxingInfoMetadata.kBoxed;
+        _allUnboxingInfo[id].unboxedArgsInfo.clear();
+      }
+    });
+    _partitionIds.clear();
+    _partitionRank.clear();
+    _finishedGraph = true;
+  }
+
+  void applyToArg(Member member, int argPos, Type type) {
+    assertx(_finishedGraph);
+    member = _validMemberOrNull(member);
+    if (member == null) return;
+    assertx(_memberIds.containsKey(member));
+    final partitionId = _memberIds[member];
+
+    if (argPos < 0 ||
+        _allUnboxingInfo[partitionId].unboxedArgsInfo.length <= argPos) {
+      return;
+    }
+
+    final unboxingInfo = _allUnboxingInfo[partitionId];
+
+    if (type is NullableType ||
+        (!type.isSubtypeOf(_typeHierarchy, _coreTypes.intClass) &&
+            !type.isSubtypeOf(_typeHierarchy, _coreTypes.doubleClass))) {
+      unboxingInfo.unboxedArgsInfo[argPos] = UnboxingInfoMetadata.kBoxed;
+    } else {
+      final unboxingType = type.isSubtypeOf(_typeHierarchy, _coreTypes.intClass)
+          ? UnboxingInfoMetadata.kUnboxedIntCandidate
+          : UnboxingInfoMetadata.kUnboxedDoubleCandidate;
+      unboxingInfo.unboxedArgsInfo[argPos] &= unboxingType;
+    }
+  }
+
+  void applyToReturn(Member member, Type type) {
+    assertx(_finishedGraph);
+    member = _validMemberOrNull(member);
+    if (member == null) return;
+    assertx(_memberIds.containsKey(member));
+    final partitionId = _memberIds[member];
+    final unboxingInfo = _allUnboxingInfo[partitionId];
+
+    if (type is NullableType ||
+        (!type.isSubtypeOf(_typeHierarchy, _coreTypes.intClass) &&
+            !type.isSubtypeOf(_typeHierarchy, _coreTypes.doubleClass))) {
+      unboxingInfo.returnInfo = UnboxingInfoMetadata.kBoxed;
+    } else {
+      final unboxingType = type.isSubtypeOf(_typeHierarchy, _coreTypes.intClass)
+          ? UnboxingInfoMetadata.kUnboxedIntCandidate
+          : UnboxingInfoMetadata.kUnboxedDoubleCandidate;
+      unboxingInfo.returnInfo &= unboxingType;
+    }
+  }
+
+  void _linkRecursive(Member member, Class cls) {
+    for (final superType in cls.supers) {
+      final superClass = superType.classNode;
+      bool linked = false;
+      superClass.procedures.forEach((Procedure procedure) {
+        if (member.name == procedure.name) {
+          _linkMembers(member, procedure);
+          linked = true;
+        }
+      });
+      if (!linked) {
+        _linkRecursive(member, superClass);
+      }
+    }
+  }
+
+  void _linkMembers(Member member1, Member member2) {
+    member1 = _validMemberOrNull(member1);
+    member2 = _validMemberOrNull(member2);
+    if (member1 == null ||
+        member2 == null ||
+        _isConstructorOrStatic(member1) ||
+        _isConstructorOrStatic(member2)) {
+      return;
+    }
+    _union(_getMemberId(member1), _getMemberId(member2));
+  }
+
+  Member _validMemberOrNull(Member member) {
+    if (member == null || (member is! Procedure && member is! Constructor)) {
+      return null;
+    }
+
+    // TODO(dartbug.com/33549): Support setters with unboxed arguments
+    // For this, fields should also be considered in the partition
+    // and be annotated with the UnboxingInfoMetadata.
+    if (member is Procedure && (member.isSetter || member.isGetter)) {
+      return null;
+    }
+
+    return member;
+  }
+
+  bool _isConstructorOrStatic(Member member) {
+    return ((member is Constructor) ||
+        ((member is Procedure) && member.isStatic));
+  }
+
+  void _addMember(Member member) {
+    assertx(!_finishedGraph);
+
+    if (_cannotUnbox(member)) {
+      _mustBox.add(member);
+    }
+
+    final int memberId = _allUnboxingInfo.length;
+    assertx(memberId == _partitionIds.length);
+    assertx(_partitionIds.length == _partitionRank.length);
+    final int argsLen = member.function.requiredParameterCount;
+    _memberIds[member] = memberId;
+    _allUnboxingInfo.add(UnboxingInfoMetadata(argsLen));
+    _partitionIds.add(memberId);
+    _partitionRank.add(1);
+  }
+
+  bool _cannotUnbox(Member member) {
+    // Methods that do not need dynamic invocation forwarders can not have
+    // unboxed parameters and return because dynamic calls always use boxed
+    // values.
+
+    return (_isNative(member) ||
+        _isEnclosingClassSubtypeOfNum(member) ||
+        (!_isConstructorOrStatic(member) &&
+            !_needsDynamicInvocationForwarder(member)));
+  }
+
+  bool _isNative(Member member) {
+    return (getExternalName(member) != null);
+  }
+
+  // TODO(dartbug.com/33549): Calls to these methods could be replaced by
+  // CheckedSmiOpInstr, so in order to allow the parameters and return
+  // value to be unboxed, the slow path for such instructions should be
+  // updated to be consistent with the representations from the target interface.
+  bool _isEnclosingClassSubtypeOfNum(Member member) {
+    return (member.enclosingClass != null &&
+        ConeType(_typeHierarchy.getTFClass(member.enclosingClass))
+            .isSubtypeOf(_typeHierarchy, _coreTypes.numClass));
+  }
+
+  bool _needsDynamicInvocationForwarder(Procedure procedure) {
+    for (var param in procedure.function.positionalParameters) {
+      if (!_isTopTypeForAssignability(param.type) &&
+          !param.isCovariant &&
+          !param.isGenericCovariantImpl) {
+        return true;
+      }
+    }
+
+    for (var param in procedure.function.namedParameters) {
+      if (!_isTopTypeForAssignability(param.type) &&
+          !param.isCovariant &&
+          !param.isGenericCovariantImpl) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  bool _isTopTypeForAssignability(DartType type) {
+    return (_coreTypes.isTop(type) || (type == Object) || (type == FutureOr));
+  }
+
+  int _getMemberId(Member member) {
+    return _memberIds[member];
+  }
+
+  int _find(int memberId) {
+    assertx(!_finishedGraph);
+    if (memberId == _partitionIds[memberId]) {
+      return memberId;
+    }
+    final partitionId = _find(_partitionIds[memberId]);
+    _allUnboxingInfo[memberId] = null;
+    _partitionIds[memberId] = partitionId;
+    return partitionId;
+  }
+
+  void _union(int memberId1, int memberId2) {
+    assertx(!_finishedGraph);
+    final partitionId1 = _find(memberId1);
+    final partitionId2 = _find(memberId2);
+
+    if (partitionId1 == partitionId2) {
+      return;
+    }
+
+    int from, to;
+    if (_partitionRank[partitionId1] < _partitionRank[partitionId2]) {
+      from = partitionId1;
+      to = partitionId2;
+    } else {
+      from = partitionId2;
+      to = partitionId1;
+    }
+    final fromArgsInfo = _allUnboxingInfo[from].unboxedArgsInfo;
+    final toArgsInfo = _allUnboxingInfo[to].unboxedArgsInfo;
+    if (fromArgsInfo.length < toArgsInfo.length) {
+      toArgsInfo.length = fromArgsInfo.length;
+    }
+    _allUnboxingInfo[from] = null;
+    _partitionIds[from] = to;
+    if (_partitionRank[from] == _partitionRank[to]) {
+      _partitionRank[to]++;
+    }
+  }
+}
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index afa5e6b..5473874 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -43,7 +43,7 @@
   environmentDefines ??= <String, String>{};
   final options = new CompilerOptions()
     ..target = target
-    ..linkedDependencies = <Uri>[platformKernel]
+    ..additionalDills = <Uri>[platformKernel]
     ..environmentDefines = environmentDefines
     ..onDiagnostic = (DiagnosticMessage message) {
       fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 1399f8f..9ab5182 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -10,7 +10,6 @@
     show CompilerOptions, DiagnosticMessage, computePlatformBinariesLocation;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 import 'package:kernel/binary/ast_to_binary.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart';
@@ -27,14 +26,19 @@
   final platformKernel =
       computePlatformBinariesLocation().resolve('vm_platform_strong.dill');
   final sdkRoot = computePlatformBinariesLocation();
-  final options = new CompilerOptions()
-    ..sdkRoot = sdkRoot
-    ..target = new VmTarget(new TargetFlags())
-    ..linkedDependencies = <Uri>[platformKernel]
-    ..onDiagnostic = (DiagnosticMessage message) {
-      fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
-    }
-    ..environmentDefines = const {};
+
+  CompilerOptions getFreshOptions() {
+    return new CompilerOptions()
+      ..sdkRoot = sdkRoot
+      ..target = new VmTarget(new TargetFlags())
+      ..additionalDills = <Uri>[platformKernel]
+      ..onDiagnostic = (DiagnosticMessage message) {
+        fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
+      }
+      ..environmentDefines = const {};
+  }
+
+  final options = getFreshOptions();
 
   group('basic', () {
     Directory mytest;
@@ -70,13 +74,8 @@
     });
 
     test('compile exclude sources', () async {
-      CompilerOptions optionsExcludeSources = new CompilerOptions()
-        ..sdkRoot = options.sdkRoot
-        ..target = options.target
-        ..linkedDependencies = options.linkedDependencies
-        ..onDiagnostic = options.onDiagnostic
-        ..embedSourceText = false
-        ..environmentDefines = options.environmentDefines;
+      CompilerOptions optionsExcludeSources = getFreshOptions()
+        ..embedSourceText = false;
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsExcludeSources, main.uri);
       Component component = await compiler.compile();
@@ -98,15 +97,11 @@
 
     test('compile expressions errors are not re-reported', () async {
       var errorsReported = 0;
-      CompilerOptions optionsAcceptErrors = new CompilerOptions()
-        ..sdkRoot = options.sdkRoot
-        ..target = options.target
-        ..linkedDependencies = options.linkedDependencies
+      CompilerOptions optionsAcceptErrors = getFreshOptions()
         ..onDiagnostic = (DiagnosticMessage message) {
           errorsReported++;
           message.plainTextFormatted.forEach(print);
-        }
-        ..environmentDefines = options.environmentDefines;
+        };
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsAcceptErrors, main.uri);
       await compiler.compile();
@@ -309,18 +304,14 @@
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
-      BinaryPrinter printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) => lib.fileUri.path.endsWith("main.dart"),
-          false /* excludeUriToSource */);
+      BinaryPrinter printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) => lib.fileUri.path.endsWith("main.dart"));
       printer.writeComponentFile(component);
       await sink.flush();
       await sink.close();
       sink = libDill.openWrite();
-      printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) => lib.fileUri.path.endsWith("lib.dart"),
-          false /* excludeUriToSource */);
+      printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) => lib.fileUri.path.endsWith("lib.dart"));
       printer.writeComponentFile(component);
       await sink.flush();
       await sink.close();
@@ -550,26 +541,20 @@
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
-      BinaryPrinter printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) => lib.fileUri.path.endsWith("main.dart"),
-          false /* excludeUriToSource */);
+      BinaryPrinter printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) => lib.fileUri.path.endsWith("main.dart"));
       printer.writeComponentFile(component);
       await sink.flush();
       await sink.close();
       sink = lib1Dill.openWrite();
-      printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) => lib.fileUri.path.endsWith("lib1.dart"),
-          false /* excludeUriToSource */);
+      printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) => lib.fileUri.path.endsWith("lib1.dart"));
       printer.writeComponentFile(component);
       await sink.flush();
       await sink.close();
       sink = lib2Dill.openWrite();
-      printer = new LimitedBinaryPrinter(
-          sink,
-          (lib) => lib.fileUri.path.endsWith("lib2.dart"),
-          false /* excludeUriToSource */);
+      printer = new BinaryPrinter(sink,
+          libraryFilter: (lib) => lib.fileUri.path.endsWith("lib2.dart"));
       printer.writeComponentFile(component);
       await sink.flush();
       await sink.close();
@@ -627,9 +612,22 @@
   });
 
   group('reload', () {
+    Directory mytest;
+
+    setUpAll(() {
+      mytest = Directory.systemTemp.createTempSync('incremental');
+    });
+
+    tearDownAll(() {
+      try {
+        mytest.deleteSync(recursive: true);
+      } catch (_) {
+        // Ignore errors;
+      }
+    });
+
     test('picks up after rejected delta', () async {
-      var systemTempDir = Directory.systemTemp;
-      var file = new File('${systemTempDir.path}/foo.dart')..createSync();
+      var file = new File('${mytest.path}/foo.dart')..createSync();
       file.writeAsStringSync("import 'bar.dart';\n"
           "import 'baz.dart';\n"
           "main() {\n"
@@ -637,17 +635,17 @@
           "  openReceivePortSoWeWontDie();"
           "}\n");
 
-      var fileBar = new File('${systemTempDir.path}/bar.dart')..createSync();
+      var fileBar = new File('${mytest.path}/bar.dart')..createSync();
       fileBar.writeAsStringSync("class A<T> { int _a; }\n");
 
-      var fileBaz = new File('${systemTempDir.path}/baz.dart')..createSync();
+      var fileBaz = new File('${mytest.path}/baz.dart')..createSync();
       fileBaz.writeAsStringSync("import 'dart:isolate';\n"
           "openReceivePortSoWeWontDie() { new RawReceivePort(); }\n");
 
       IncrementalCompiler compiler = new IncrementalCompiler(options, file.uri);
       Component component = await compiler.compile();
 
-      File outputFile = new File('${systemTempDir.path}/foo.dart.dill');
+      File outputFile = new File('${mytest.path}/foo.dart.dill');
       await _writeProgramToFile(component, outputFile);
 
       final List<String> vmArgs = [
@@ -755,9 +753,11 @@
           "openReceivePortSoWeWontDie() { new RawReceivePort(); }\n");
 
       Uri packageEntry = Uri.parse('package:foo/foo.dart');
-      options.packagesFileUri = packageUri;
+
+      CompilerOptions optionsModified = getFreshOptions()
+        ..packagesFileUri = packageUri;
       IncrementalCompiler compiler =
-          new IncrementalCompiler(options, packageEntry);
+          new IncrementalCompiler(optionsModified, packageEntry);
       {
         Component component = await compiler.compile(entryPoint: packageEntry);
         File outputFile = new File('${mytest.path}/foo.dart.dill');
@@ -786,12 +786,476 @@
       }
     });
   });
+
+  group('expression evaluation', () {
+    Directory mytest;
+    Process vm;
+
+    setUpAll(() {
+      mytest = Directory.systemTemp.createTempSync('expression_evaluation');
+    });
+
+    tearDownAll(() {
+      try {
+        mytest.deleteSync(recursive: true);
+      } catch (_) {
+        // Ignore errors;
+      }
+      try {
+        vm.kill();
+      } catch (_) {
+        // Ignore errors;
+      }
+    });
+
+    launchBreakAndEvaluate(File scriptOrDill, String scriptUriToBreakIn,
+        int lineToBreakAt, List<String> expressionsAndExpectedResults,
+        {Future Function(RemoteVm remoteVm) callback}) async {
+      vm = await Process.start(Platform.resolvedExecutable, <String>[
+        "--pause-isolates-on-start",
+        "--enable-vm-service:0",
+        "--disable-service-auth-codes",
+        scriptOrDill.path
+      ]);
+
+      const kObservatoryListening = 'Observatory listening on ';
+      final RegExp observatoryPortRegExp =
+          new RegExp("Observatory listening on http://127.0.0.1:\([0-9]*\)/");
+      int port;
+      final splitter = new LineSplitter();
+      Completer<String> portLineCompleter = new Completer<String>();
+      vm.stdout
+          .transform(utf8.decoder)
+          .transform(splitter)
+          .listen((String s) async {
+        print("vm stdout: $s");
+        if (s.startsWith(kObservatoryListening)) {
+          expect(observatoryPortRegExp.hasMatch(s), isTrue);
+          final match = observatoryPortRegExp.firstMatch(s);
+          port = int.parse(match.group(1));
+          RemoteVm remoteVm = new RemoteVm(port);
+
+          // Wait for the script to have loaded.
+          while (true) {
+            Map isolate = await remoteVm.getIsolate();
+            Map pauseEvent = isolate["pauseEvent"];
+            if (pauseEvent["kind"] == "PauseStart") break;
+          }
+
+          var breakpoint = await findScriptAndBreak(
+              remoteVm, scriptUriToBreakIn, lineToBreakAt);
+          await remoteVm.resume();
+          await waitForScriptToHavePaused(remoteVm);
+          await evaluateExpressions(expressionsAndExpectedResults, remoteVm);
+          await deletePossibleBreakpoint(remoteVm, breakpoint);
+
+          if (callback != null) {
+            await callback(remoteVm);
+          }
+
+          await remoteVm.resume();
+
+          if (!portLineCompleter.isCompleted) {
+            portLineCompleter.complete("done");
+          }
+        }
+      });
+      bool gotStdErrOutput = false;
+      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
+        print("vm stderr: $s");
+        gotStdErrOutput = true;
+      });
+      await portLineCompleter.future;
+      int exitCode = await vm.exitCode;
+      print("Compiler terminated with ${exitCode} exit code");
+      expect(exitCode, equals(0));
+      expect(gotStdErrOutput, isFalse);
+    }
+
+    test('from source', () async {
+      Directory dir = mytest.createTempSync();
+      File mainFile = new File.fromUri(dir.uri.resolve("main.dart"));
+      mainFile.writeAsStringSync(r"""
+        var hello = "Hello";
+        main() {
+          var s = "$hello world!";
+          print(s);
+        }
+        int extra() { return 22; }
+      """);
+
+      await launchBreakAndEvaluate(mainFile, mainFile.uri.toString(), 4, [
+        // 1st expression
+        "s.length",
+        "12",
+
+        // 2nd expression
+        "s",
+        "Hello world!",
+
+        // 3rd expression
+        "hello",
+        "Hello",
+
+        // 4th expression
+        "extra()",
+        "22",
+      ]);
+    });
+
+    test('from dill', () async {
+      Directory dir = mytest.createTempSync();
+      File mainFile = new File.fromUri(dir.uri.resolve("main.dart"));
+      mainFile.writeAsStringSync(r"""
+        var hello = "Hello";
+        main() {
+          var s = "$hello world!";
+          print(s);
+        }
+        int extra() { return 22; }
+      """);
+      IncrementalCompiler compiler =
+          new IncrementalCompiler(options, mainFile.uri);
+      Component component = await compiler.compile();
+      File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
+      IOSink sink = mainDill.openWrite();
+      new BinaryPrinter(sink).writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+
+      mainFile.deleteSync();
+
+      await launchBreakAndEvaluate(mainDill, mainFile.uri.toString(), 4, [
+        // 1st expression
+        "s.length",
+        "12",
+
+        // 2nd expression
+        "s",
+        "Hello world!",
+
+        // 3rd expression
+        "hello",
+        "Hello",
+
+        // 4th expression
+        "extra()",
+        "22",
+      ]);
+    });
+
+    test('from dill with reload', () async {
+      Directory dir = mytest.createTempSync();
+      File mainFile = new File.fromUri(dir.uri.resolve("main.dart"));
+      mainFile.writeAsStringSync(r"""
+        import 'dart:async';
+        import 'helper.dart';
+        main() {
+          int latestReloadTime;
+          int noChangeCount = 0;
+          int numChanges = 0;
+          new Timer.periodic(new Duration(milliseconds: 5), (timer) async {
+            var result = reloadTime();
+            if (latestReloadTime != result) {
+              latestReloadTime = result;
+              numChanges++;
+              helperMethod();
+            } else {
+              noChangeCount++;
+            }
+            if (latestReloadTime == 42) {
+              timer.cancel();
+            }
+            if (numChanges > 20) {
+              timer.cancel();
+            }
+            if (noChangeCount >= 400) {
+              // ~2 seconds with no change.
+              throw "Expected to be done but wasn't";
+            }
+          });
+        }
+      """);
+      File helperFile = new File.fromUri(dir.uri.resolve("helper.dart"));
+      helperFile.writeAsStringSync(r"""
+        int reloadTime() {
+          return 0;
+        }
+        void helperMethod() {
+          var hello = "Hello";
+          var s = "$hello world!";
+          print(s);
+        }
+      """);
+      IncrementalCompiler compiler =
+          new IncrementalCompiler(options, mainFile.uri);
+      Component component = await compiler.compile();
+      File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
+      IOSink sink = mainDill.openWrite();
+      new BinaryPrinter(sink).writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+      print("=> Notice main file has size ${mainDill.lengthSync()}");
+
+      helperFile.writeAsStringSync(r"""
+        int reloadTime() {
+          return 1;
+        }
+        void helperMethod() {
+          var hello = "Hello";
+          var s = "$hello world!!!";
+          print(s);
+        }
+        int helperMethod2() {
+          return 42;
+        }
+      """);
+      compiler.invalidate(helperFile.uri);
+      component = await compiler.compile();
+      File partial1Dill =
+          new File.fromUri(mainFile.uri.resolve("partial1.dill"));
+      sink = partial1Dill.openWrite();
+      new BinaryPrinter(sink).writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+      print("=> Notice partial file #1 has size ${partial1Dill.lengthSync()}");
+
+      helperFile.writeAsStringSync(r"""
+        int reloadTime() {
+          return 2;
+        }
+        void helperMethod() {
+          var hello = "Hello";
+          var s = "$hello world!!!!";
+          print(s);
+        }
+        int helperMethod2() {
+          return 21;
+        }
+        int helperMethod3() {
+          return 84;
+        }
+      """);
+      compiler.invalidate(helperFile.uri);
+      component = await compiler.compile();
+      File partial2Dill =
+          new File.fromUri(mainFile.uri.resolve("partial2.dill"));
+      sink = partial2Dill.openWrite();
+      new BinaryPrinter(sink).writeComponentFile(component);
+      await sink.flush();
+      await sink.close();
+      print("=> Notice partial file #2 has size ${partial2Dill.lengthSync()}");
+
+      mainFile.deleteSync();
+      helperFile.deleteSync();
+
+      await launchBreakAndEvaluate(mainDill, helperFile.uri.toString(), 7, [
+        // 1st expression
+        "s.length",
+        "12",
+
+        // 2nd expression
+        "s",
+        "Hello world!",
+
+        // 3rd expression
+        "hello",
+        "Hello",
+
+        // 4th expression
+        "reloadTime()",
+        "0",
+      ], callback: (RemoteVm remoteVm) async {
+        for (int q = 0; q < 10; q++) {
+          var reloadResult = await remoteVm.reload(partial1Dill.uri);
+          expect(reloadResult is Map, isTrue);
+          expect(reloadResult["success"], equals(true));
+
+          await remoteVm.forceGc();
+
+          var breakpoint =
+              await findScriptAndBreak(remoteVm, helperFile.uri.toString(), 7);
+          await remoteVm.resume();
+          await waitForScriptToHavePaused(remoteVm);
+          await evaluateExpressions([
+            // 1st expression
+            "s.length",
+            "14",
+
+            // 2nd expression
+            "s",
+            "Hello world!!!",
+
+            // 3rd expression
+            "hello",
+            "Hello",
+
+            // 4th expression
+            "reloadTime()",
+            "1",
+
+            // 5th expression
+            "helperMethod2()",
+            "42",
+          ], remoteVm);
+          await deletePossibleBreakpoint(remoteVm, breakpoint);
+
+          reloadResult = await remoteVm.reload(partial2Dill.uri);
+          expect(reloadResult is Map, isTrue);
+          expect(reloadResult["success"], equals(true));
+
+          await remoteVm.forceGc();
+
+          breakpoint =
+              await findScriptAndBreak(remoteVm, helperFile.uri.toString(), 7);
+          await remoteVm.resume();
+          await waitForScriptToHavePaused(remoteVm);
+          await evaluateExpressions([
+            // 1st expression
+            "s.length",
+            "15",
+
+            // 2nd expression
+            "s",
+            "Hello world!!!!",
+
+            // 3rd expression
+            "hello",
+            "Hello",
+
+            // 4th expression
+            "reloadTime()",
+            "2",
+
+            // 5th expression
+            "helperMethod2()",
+            "21",
+
+            // 6th expression
+            "helperMethod3()",
+            "84",
+          ], remoteVm);
+          await deletePossibleBreakpoint(remoteVm, breakpoint);
+        }
+      });
+    });
+
+    test('from dill with package uri', () async {
+      // 2 iterations: One where the .packages file is deleted, and one where
+      // it is not.
+      for (int i = 0; i < 2; i++) {
+        Directory dir = mytest.createTempSync();
+        File mainFile = new File.fromUri(dir.uri.resolve("main.dart"));
+        mainFile.writeAsStringSync(r"""
+          var hello = "Hello";
+          main() {
+            var s = "$hello world!";
+            print(s);
+          }
+          int extra() { return 22; }
+        """);
+
+        File packagesFile = new File.fromUri(dir.uri.resolve(".packages"));
+        packagesFile.writeAsStringSync("foo:.");
+
+        Uri mainUri = Uri.parse("package:foo/main.dart");
+
+        CompilerOptions optionsModified = getFreshOptions()
+          ..packagesFileUri = packagesFile.uri;
+        IncrementalCompiler compiler =
+            new IncrementalCompiler(optionsModified, mainUri);
+
+        Component component = await compiler.compile();
+        File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
+        IOSink sink = mainDill.openWrite();
+        new BinaryPrinter(sink).writeComponentFile(component);
+        await sink.flush();
+        await sink.close();
+
+        mainFile.deleteSync();
+        if (i == 0) {
+          packagesFile.deleteSync();
+        }
+
+        await launchBreakAndEvaluate(mainDill, mainUri.toString(), 4, [
+          // 1st expression
+          "s.length",
+          "12",
+
+          // 2nd expression
+          "s",
+          "Hello world!",
+
+          // 3rd expression
+          "hello",
+          "Hello",
+
+          // 4th expression
+          "extra()",
+          "22",
+        ]);
+
+        try {
+          dir.deleteSync(recursive: true);
+        } catch (e) {
+          // ignore.
+        }
+      }
+    });
+  });
+}
+
+Future evaluateExpressions(
+    List<String> expressionsAndExpectedResults, RemoteVm remoteVm) async {
+  for (int i = 0; i < expressionsAndExpectedResults.length; i += 2) {
+    String expression = expressionsAndExpectedResults[i];
+    String expectedResult = expressionsAndExpectedResults[i + 1];
+
+    print("Evaluating $expression (expecting $expectedResult)");
+    var result = await remoteVm.evaluateInFrame(expression);
+    expect(result is Map, isTrue);
+    expect(result["type"], equals("@Instance"));
+    expect(result["valueAsString"], equals(expectedResult));
+  }
+}
+
+Future waitForScriptToHavePaused(RemoteVm remoteVm) async {
+  // Wait for the script to have paused.
+  while (true) {
+    Map isolate = await remoteVm.getIsolate();
+    Map pauseEvent = isolate["pauseEvent"];
+    if (pauseEvent["kind"] == "PauseBreakpoint") break;
+  }
+}
+
+Future findScriptAndBreak(
+    RemoteVm remoteVm, String scriptUriToBreakIn, int lineToBreakAt) async {
+  Map scriptsMap = await remoteVm.getScripts();
+  List scripts = scriptsMap["scripts"];
+  String scriptId;
+  for (int i = 0; i < scripts.length; i++) {
+    Map script = scripts[i];
+    String scriptUri = script["uri"];
+    if (scriptUri == scriptUriToBreakIn) {
+      scriptId = script["id"];
+      break;
+    }
+  }
+  expect(scriptId, isNotNull);
+
+  return await remoteVm.addBreakpoint(scriptId, lineToBreakAt);
+}
+
+Future deletePossibleBreakpoint(
+    RemoteVm remoteVm, dynamic possibleBreakpoint) async {
+  if (possibleBreakpoint is Map && possibleBreakpoint["id"] is String) {
+    return await remoteVm.removeBreakpoint(possibleBreakpoint["id"]);
+  }
 }
 
 _writeProgramToFile(Component component, File outputFile) async {
   final IOSink sink = outputFile.openWrite();
-  final BinaryPrinter printer = new LimitedBinaryPrinter(
-      sink, (_) => true /* predicate */, false /* excludeUriToSource */);
+  final BinaryPrinter printer = new BinaryPrinter(sink);
   printer.writeComponentFile(component);
   await sink.flush();
   await sink.close();
@@ -903,6 +1367,46 @@
     });
   }
 
+  Future addBreakpoint(String scriptId, int line) async {
+    var id = await mainId;
+    return await rpc.sendRequest('addBreakpoint', {
+      'isolateId': id,
+      'scriptId': scriptId,
+      'line': line,
+    });
+  }
+
+  Future removeBreakpoint(String breakpointId) async {
+    var id = await mainId;
+    return await rpc.sendRequest('removeBreakpoint', {
+      'isolateId': id,
+      'breakpointId': breakpointId,
+    });
+  }
+
+  Future evaluateInFrame(String expression) async {
+    var id = await mainId;
+    var frameIndex = 0;
+    return await rpc.sendRequest('evaluateInFrame', {
+      'isolateId': id,
+      "frameIndex": frameIndex,
+      'expression': expression,
+    });
+  }
+
+  Future forceGc() async {
+    int expectGcAfter = new DateTime.now().millisecondsSinceEpoch;
+    while (true) {
+      var id = await mainId;
+      Map result = await rpc.sendRequest('getAllocationProfile', {
+        'isolateId': id,
+        "gc": true,
+      });
+      String lastGc = result["dateLastServiceGC"];
+      if (lastGc != null && int.parse(lastGc) >= expectGcAfter) return;
+    }
+  }
+
   /// Close any connections used to communicate with the VM.
   Future disconnect() async {
     if (_rpc == null) return null;
diff --git a/pkg/vm/test/modular_kernel_plus_aot_test.dart b/pkg/vm/test/modular_kernel_plus_aot_test.dart
index d382501..594e11e 100644
--- a/pkg/vm/test/modular_kernel_plus_aot_test.dart
+++ b/pkg/vm/test/modular_kernel_plus_aot_test.dart
@@ -36,21 +36,14 @@
     await File.fromUri(mixinFilename).writeAsStringSync(mixinFile);
 
     await compileToKernel(vmTarget, librariesFile, sdkSummary, packagesFile,
-        mixinDillFilename, <Uri>[mixinFilename], <Uri>[], <Uri>[]);
+        mixinDillFilename, <Uri>[mixinFilename], <Uri>[]);
 
     final mainFilename = uri.resolve('main.dart');
     final mainDillFilename = uri.resolve('main.dart.dill');
     await File.fromUri(mainFilename).writeAsStringSync(mainFile);
 
-    await compileToKernel(
-        vmTarget,
-        librariesFile,
-        sdkSummary,
-        packagesFile,
-        mainDillFilename,
-        <Uri>[mainFilename],
-        <Uri>[mixinDillFilename],
-        <Uri>[]);
+    await compileToKernel(vmTarget, librariesFile, sdkSummary, packagesFile,
+        mainDillFilename, <Uri>[mainFilename], <Uri>[mixinDillFilename]);
 
     final bytes = concat(
         await File.fromUri(sdkSummary).readAsBytes(),
@@ -84,15 +77,13 @@
     Uri packagesFile,
     Uri outputFile,
     List<Uri> sources,
-    List<Uri> linkedInputs,
-    List<Uri> summaryInputs) async {
+    List<Uri> additionalDills) async {
   final state = await fe.initializeCompiler(
       null,
       sdkSummary,
       librariesFile,
       packagesFile,
-      summaryInputs,
-      linkedInputs,
+      additionalDills,
       target,
       StandardFileSystem.instance, const <String>[], const <String, String>{});
 
diff --git a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
index 2b2397a..58b77d7 100644
--- a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
+++ b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
@@ -7,7 +7,7 @@
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
@@ -45,8 +45,7 @@
       new File('${systemTempDir.path}/${source.pathSegments.last}.dill');
   try {
     final sink = file.openWrite();
-    final printer =
-        LimitedBinaryPrinter(sink, (lib) => true, /*excludeUriToSource=*/ true);
+    final printer = BinaryPrinter(sink, includeSources: false);
 
     printer.writeComponentFile(component);
     await sink.close();
diff --git a/pkg/vm/test/unlinked_ast_to_text_test.dart b/pkg/vm/test/unlinked_ast_to_text_test.dart
index ee580e2..8b03a2c 100644
--- a/pkg/vm/test/unlinked_ast_to_text_test.dart
+++ b/pkg/vm/test/unlinked_ast_to_text_test.dart
@@ -7,7 +7,7 @@
 import 'package:args/args.dart';
 import 'package:expect/expect.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/binary/limited_ast_to_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:vm/kernel_front_end.dart';
 
 main() async {
@@ -44,8 +44,8 @@
     // Load the dart2js.dart.dill and write the unlinked version.
     final component = loadComponentFromBinary(dillFile);
     final IOSink sink = new File(unlinkedDillFile).openWrite();
-    final printer = new LimitedBinaryPrinter(
-        sink, (lib) => lib.importUri.scheme != 'dart', false);
+    final printer = new BinaryPrinter(sink,
+        libraryFilter: (lib) => lib.importUri.scheme != 'dart');
     printer.writeComponentFile(component);
     await sink.close();
 
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 831596f..d015481 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -2060,7 +2060,7 @@
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
-    dart.core::int* :async_temporary_0;
+    dynamic :async_temporary_0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L3:
@@ -2068,7 +2068,7 @@
           [yield] let dynamic #t2 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
           :async_temporary_0 = dart._internal::unsafeCast<dart.core::int*>(:result);
           [yield] let dynamic #t3 = dart.async::_awaitHelper(b, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :async_temporary_0.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
+          :return_value = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
           break #L3;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -2092,8 +2092,8 @@
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
     dynamic :saved_try_context_var0;
-    dart.core::int* :async_temporary_0;
-    dart.core::int* :async_temporary_1;
+    dynamic :async_temporary_0;
+    dynamic :async_temporary_1;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L4:
@@ -2108,7 +2108,7 @@
                   :async_temporary_1 = sum;
                   :async_temporary_0 = i.{dart.core::num::+}(j);
                   [yield] let dynamic #t4 = dart.async::_awaitHelper(#lib::foo(), :async_op_then, :async_op_error, :async_op) in null;
-                  sum = :async_temporary_1.{dart.core::num::+}(:async_temporary_0.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result)));
+                  sum = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_1).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result)));
                 }
               }
             }
@@ -2144,9 +2144,9 @@
     dynamic :saved_try_context_var2;
     dynamic :exception0;
     dynamic :stack_trace0;
-    dart.core::int* :async_temporary_0;
-    dart.core::int* :async_temporary_1;
-    dart.core::int* :async_temporary_2;
+    dynamic :async_temporary_0;
+    dynamic :async_temporary_1;
+    dynamic :async_temporary_2;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L5:
@@ -2156,7 +2156,7 @@
             try {
               :async_temporary_0 = x;
               [yield] let dynamic #t5 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
-              x = :async_temporary_0.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
+              x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
             }
             on dynamic catch(final dynamic e) {
               if(e is dart.core::Error*) {
@@ -2165,14 +2165,14 @@
               }
               :async_temporary_1 = x;
               [yield] let dynamic #t6 = dart.async::_awaitHelper(b, :async_op_then, :async_op_error, :async_op) in null;
-              x = :async_temporary_1.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
+              x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_1).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
               rethrow;
             }
           finally {
             dart.core::print("fin");
             :async_temporary_2 = x;
             [yield] let dynamic #t7 = dart.async::_awaitHelper(c, :async_op_then, :async_op_error, :async_op) in null;
-            x = :async_temporary_2.{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
+            x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_2).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
             :return_value = x;
             break #L5;
           }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
index 3864b4c..cbf2f0b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/abstract_class_entry_point.dart.expect
@@ -5,4 +5,4 @@
 @#C3
 abstract class AbstractEmptyClass extends core::Object {
 }
-static method main() → dynamic {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index a866265..fb1f6ec 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -18,21 +18,21 @@
 [@vm.unreachable.metadata=] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  final field self::ParametrizedAnnotation::T* foo;
 }
 abstract class A extends core::Object {
-  static method staticMethod() → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  static method staticMethod() → void {}
 }
 @#C6
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C8
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  @#C8
   method instanceMethod() → void {}
 }
-static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
   @#C9 core::int* x = 2;
   return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
 }
-@#C11
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']@#C11
 static method main(core::List<core::String*>* args) → dynamic {
   self::A::staticMethod();
   [@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
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 d79868a..052f360 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
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
   if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
     return false;
   for (core::int* i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num*>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
@@ -12,7 +12,7 @@
   }
   return true;
 }
-static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi (value: 50000)] core::int* n) → core::int* {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi (value: 50000)] core::int* n) → core::int* {
   core::int* counter = 0;
   for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
@@ -22,14 +22,14 @@
     }
   }
 }
-static method run() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method run() → void {
   core::int* e = 611953;
   core::int* p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber(50000);
   if(![@vm.inferred-type.metadata=dart.core::bool] p.{core::num::==}(e)) {
     throw core::Exception::•("Unexpected result: ${p} != ${e}");
   }
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']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=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
   for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_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 09996bb..68decfe 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
@@ -9,15 +9,15 @@
 [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  final field core::int* _offset;
 [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  final field core::int* _length;
 [@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8,getterSelectorId:9]  final field core::List<core::double*>* _elements;
-  constructor •([@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] core::int* size) → self::_Vector*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •([@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] core::int* size) → self::_Vector*
     : self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1]  operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
     return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}));
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
     let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
     core::double* result = 0.0;
     for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
@@ -26,7 +26,7 @@
 }
 [@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 {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   core::Stopwatch* timer = let final core::Stopwatch* #t4 = new core::Stopwatch::•() in let final void #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
   for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::x = [@vm.direct-call.metadata=dart.core::_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=#lib::_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/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index fd9dd20..6140efa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::D::•<self::C::T*>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T* x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T* x) → dynamic
     return x;
 }
 class D<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::C<self::E::T*> {
-  synthetic constructor •() → self::E<self::E::S*, self::E::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::E<self::E::S*, self::E::T*>*
     : super self::C::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method bar() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar() → dynamic
     return new self::D::•<self::E::S*>();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method baz() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method baz() → dynamic
     return new self::D::•<self::E::T*>();
 }
 abstract class X extends core::Object {
-  synthetic constructor •() → self::X*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → self::Y*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Y*
     : super self::X::•()
     ;
 }
 class Z extends self::X {
-  synthetic constructor •() → self::Z*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Z*
     : super self::X::•()
     ;
 }
@@ -49,20 +49,20 @@
 abstract class J extends self::I<core::int*> {
 }
 class K<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::K<self::K::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::K<self::K::T*>*
     : super core::Object::•()
     ;
 }
 class C2<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C2<self::C2::T*>*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
     return x;
 }
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
   core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
   core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
index 8c4940c..f919630 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
@@ -5,20 +5,20 @@
 import "dart:collection";
 
 class Element extends core::Object {
-  synthetic constructor •() → self::Element*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Element*
     : super core::Object::•()
     ;
 }
 class InheritedElement extends self::Element {
 [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
-  synthetic constructor •() → self::InheritedElement*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::InheritedElement*
     : super self::Element::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
     [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
   }
 }
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   self::InheritedElement* ie = new self::InheritedElement::•();
   [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(ie, 0);
   [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
index 4c84b68..e0f5062 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
@@ -3,53 +3,53 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get foo() → core::String*
     return "foo";
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method getBar() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method getBar() → core::String*
     return "bar";
 }
 class B extends core::Object /*isEnum*/  {
 [@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  final field core::int* index;
 [@vm.inferred-type.metadata=dart.core::_OneByteString (value: B.b2)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8,getterSelectorId:9]  final field core::String* _name;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method toString() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method toString() → core::String*
     return [@vm.inferred-type.metadata=dart.core::_OneByteString (value: B.b2)] this.{=self::B::_name};
 }
-static method test0([@vm.inferred-type.metadata=dart.core::_Smi (value: 40)] core::int* arg) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test0([@vm.inferred-type.metadata=dart.core::_Smi (value: 40)] core::int* arg) → void {
   core::print(arg);
 }
-static method test1([[@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] core::int* arg = #C1]) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test1([[@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] core::int* arg = #C1]) → void {
   core::print(arg);
 }
-static method test2({[@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* arg = #C2}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test2({[@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* arg = #C2}) → void {
   core::print(arg);
 }
 static get getD() → dynamic
   return 100.0;
-static method testDouble([@vm.inferred-type.metadata=dart.core::_Double (value: 3.14)] core::double* arg) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method testDouble([@vm.inferred-type.metadata=dart.core::_Double (value: 3.14)] core::double* arg) → void {
   core::print(arg);
   core::print([@vm.inferred-type.metadata=dart.core::_Double (value: 100.0)] self::getD);
 }
-static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A* a0, [@vm.inferred-type.metadata=dart.core::_OneByteString (value: bazz)] core::String* a1) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A* a0, [@vm.inferred-type.metadata=dart.core::_OneByteString (value: bazz)] core::String* a1) → void {
   core::print([@vm.direct-call.metadata=#lib::A::foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: foo)] a0.{self::A::foo});
   core::print([@vm.direct-call.metadata=#lib::A::getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: bar)] a0.{self::A::getBar}());
   core::print(a1);
 }
-static method testPassEnum([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method testPassEnum([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
   self::testPassEnum2(arg);
 }
-static method testPassEnum2([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method testPassEnum2([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
   core::print(arg);
 }
-static method getList() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getList() → dynamic
   return #C6;
-static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([4, 5]))] dynamic arg2 = #C9]) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([4, 5]))] dynamic arg2 = #C9]) → void {
   core::print(arg1);
   core::print(arg2);
 }
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   self::test0(40);
   self::test1();
   self::test2();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index 1469023..087a1100 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -3,58 +3,58 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → core::int*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return 1;
 }
 class C extends core::Object implements self::A {
-  synthetic constructor •() → self::C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return 2;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method toString() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method toString() → core::String*
     return "D";
 }
 [@vm.inferred-type.metadata=#lib::D?]static field self::A* dd;
 [@vm.inferred-type.metadata=#lib::E?]static field self::E* ee = new self::E::•();
-static method callerA1([@vm.inferred-type.metadata=!] self::A* aa) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerA1([@vm.inferred-type.metadata=!] self::A* aa) → void {
   [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A* aa) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A* aa) → void {
   [@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A* aa = #C1}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A* aa = #C1}) → void {
   [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A* aa) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A* aa) → void {
   [@vm.direct-call.metadata=#lib::C::foo??] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString (value: abc)] dynamic x) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString (value: abc)] dynamic x) → void {
   [@vm.direct-call.metadata=dart.core::_StringBase::toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] x.{core::Object::toString}();
 }
-static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
   [@vm.inferred-type.metadata=!? (receiver not int)] x.{core::Object::toString}();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::callerA1(new self::B::•());
   self::callerA1(new self::C::•());
   self::callerA2(new self::B::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
index 2f98a40..fbd47a2 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   dynamic x = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(10);
   [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.direct-call.metadata=dart.core::_List::[]] [@vm.inferred-type.metadata=int? (receiver not int)] x.[](0).+(10);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
index be83db0..0714c99 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
@@ -6,21 +6,21 @@
 import "dart:async";
 
 class C<T extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
 }
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   dynamic c = new self::C::•<core::int*>();
   [@vm.direct-call.metadata=#lib::C::test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2c(3);
   [@vm.direct-call.metadata=#lib::C::test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
index d7385b2..fb078b8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
@@ -6,39 +6,39 @@
 import "dart:async";
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
-static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
-static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
   self::foo1_a1(a1);
   self::foo1_a2(a2);
   self::foo1_a3(a3);
   self::foo1_a4(a4);
 }
-static method foo2_a1([@vm.inferred-type.metadata=dart.async::_Future?] dynamic x) → void {}
-static method foo2_a2([@vm.inferred-type.metadata=#lib::B?] dynamic x) → void {}
-static method foo2_a3(dynamic x) → void {}
-static method foo2_a4(dynamic x) → void {}
-static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B?] self::A* a2, asy::FutureOr<self::A*>* a3, asy::FutureOr<self::A*>* a4) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2_a1([@vm.inferred-type.metadata=dart.async::_Future?] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2_a2([@vm.inferred-type.metadata=#lib::B?] dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2_a3(dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2_a4(dynamic x) → void {}
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B?] self::A* a2, asy::FutureOr<self::A*>* a3, asy::FutureOr<self::A*>* a4) → void {
   self::foo2_a1(a1);
   self::foo2_a2(a2);
   self::foo2_a3(a3);
   self::foo2_a4(a4);
 }
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
   self::foo2(self::getDynamic() as{TypeError,ForDynamic} asy::Future<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} self::A*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
index 2296f5b..63026c8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static method foo() → core::Object*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo() → core::Object*
   return new self::A::•();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A] self::foo());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index 5226932..2d5e9ca 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -3,100 +3,100 @@
 import "dart:core" as core;
 
 abstract class StreamSubscription extends core::Object {
-  synthetic constructor •() → self::StreamSubscription*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::StreamSubscription*
     : super core::Object::•()
     ;
 }
 class _BufferingStreamSubscription extends self::StreamSubscription {
-  synthetic constructor •() → self::_BufferingStreamSubscription*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_BufferingStreamSubscription*
     : super self::StreamSubscription::•()
     ;
 }
 class _BroadcastSubscription extends self::StreamSubscription {
-  synthetic constructor •() → self::_BroadcastSubscription*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_BroadcastSubscription*
     : super self::StreamSubscription::•()
     ;
 }
 abstract class Stream extends core::Object {
-  synthetic constructor •() → self::Stream*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Stream*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foobar((dynamic) →* void onData, {core::Function* onError = #C1}) → self::StreamSubscription*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foobar((dynamic) →* void onData, {core::Function* onError = #C1}) → self::StreamSubscription*;
 }
 abstract class _StreamImpl extends self::Stream {
-  synthetic constructor •() → self::_StreamImpl*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_StreamImpl*
     : super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
     return [@vm.inferred-type.metadata=! (skip check)] this.{self::_StreamImpl::_createSubscription}();
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method _createSubscription() → self::StreamSubscription* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method _createSubscription() → self::StreamSubscription* {
     return new self::_BufferingStreamSubscription::•();
   }
 }
 class _ControllerStream extends self::_StreamImpl {
-  synthetic constructor •() → self::_ControllerStream*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_ControllerStream*
     : super self::_StreamImpl::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method _createSubscription() → self::StreamSubscription* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method _createSubscription() → self::StreamSubscription* {
     return new self::_BroadcastSubscription::•();
   }
 }
 class _GeneratedStreamImpl extends self::_StreamImpl {
-  synthetic constructor •() → self::_GeneratedStreamImpl*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_GeneratedStreamImpl*
     : super self::_StreamImpl::•()
     ;
 }
 abstract class StreamView extends self::Stream {
 [@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  final field self::Stream* _stream;
-  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::StreamView*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::StreamView*
     : self::StreamView::_stream = stream, super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
     return [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
   }
 }
 class ByteStream extends self::StreamView {
-  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::ByteStream*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::ByteStream*
     : super self::StreamView::•(stream)
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method super_foobar1([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method super_foobar1([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → dynamic {
     super.{self::StreamView::foobar}(onData, onError: onError);
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13]  get super_stream() → self::Stream*
     return [@vm.inferred-type.metadata=!] super.{self::StreamView::_stream};
 }
 class _HandleErrorStream extends self::Stream {
-  synthetic constructor •() → self::_HandleErrorStream*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_HandleErrorStream*
     : super self::Stream::•()
     ;
 }
-static method round0() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round0() → void {
   new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
 }
-static method round1({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round1({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
   self::ByteStream* x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
   [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
 }
-static method round2({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round2({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
   new self::_ControllerStream::•();
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   [@vm.direct-call.metadata=#lib::StreamView::foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x = new self::_ControllerStream::•();
   [@vm.direct-call.metadata=#lib::_StreamImpl::foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round4({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round4({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
   self::ByteStream* x = new self::ByteStream::•(new self::_ControllerStream::•());
   self::Stream* y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
   self::Stream* z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
@@ -104,12 +104,12 @@
     [@vm.direct-call.metadata=#lib::ByteStream::super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
   }
 }
-static method round5() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method round5() → void {
   self::ByteStream* x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
   new self::_HandleErrorStream::•();
   [@vm.direct-call.metadata=#lib::ByteStream::super_foobar3] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar3}();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   new self::_GeneratedStreamImpl::•();
   self::round0();
   self::round1();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index 6d5cf67..d5ff659 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -3,80 +3,80 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → core::Object*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → core::Object*;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::Object*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::Object*
     return new self::T1::•();
 }
 class C extends core::Object implements self::A {
-  synthetic constructor •() → self::C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::Object*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::Object*
     return new self::T2::•();
 }
 class DeepCaller1 extends core::Object {
-  synthetic constructor •() → self::DeepCaller1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::DeepCaller1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method barL1() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL1() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL2}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method barL2() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL2() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL3}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method barL3() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL3() → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL4}();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method barL4() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL4() → dynamic
     return self::field1;
 }
 class D extends core::Object {
 [@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  field core::Object* field2 = [@vm.inferred-type.metadata=!] self::getValue();
-  synthetic constructor •() → self::D*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class DeepCaller2 extends core::Object {
-  synthetic constructor •() → self::DeepCaller2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::DeepCaller2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method barL1([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL1([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(dd);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method barL2([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL2([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(dd);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method barL3([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL3([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(dd);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method barL4([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL4([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::D::field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
 static field core::Object* field1 = [@vm.inferred-type.metadata=!] self::getValue();
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method getValue() → core::Object* {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getValue() → core::Object* {
   self::A* aa = self::getDynamic() as{TypeError,ForDynamic} self::A*;
   return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
-static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::DeepCaller1::barL1}();
-static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(new self::D::•());
-static method createC() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method createC() → dynamic {
   new self::C::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   new self::B::•();
   self::use1(new self::DeepCaller1::•());
   self::use2(new self::DeepCaller2::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
index 95c4d00..0c1a531 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
@@ -3,41 +3,41 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::T1::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → self::Intermediate*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Intermediate*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar([@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar([@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] aa.{self::A::foo}();
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method allocateB() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method allocateB() → dynamic {
   new self::B::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError,ForDynamic} self::A*);
   self::allocateB();
   self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError,ForDynamic} self::A*);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
index 6149267..145cb92 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
@@ -3,70 +3,70 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::T1::•();
 }
 abstract class C extends core::Object implements self::B {
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 abstract class _E&D&C extends self::D implements self::C /*isAnonymousMixin,isEliminatedMixin*/  {
-  synthetic constructor •() → self::_E&D&C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::_E&D&C*
     : super self::D::•()
     ;
 }
 class E extends self::_E&D&C {
-  synthetic constructor •() → self::E*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::E*
     : super self::_E&D&C::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::T2::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → self::Intermediate*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Intermediate*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar(self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar(self::A* aa) → dynamic
     return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
-static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method allocateB() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method allocateB() → dynamic {
   new self::B::•();
 }
-static method allocateE() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method allocateE() → dynamic {
   new self::E::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError,ForDynamic} self::A*);
   self::allocateB();
   self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError,ForDynamic} self::A*);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
index c86de6e..e950fb6 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
@@ -3,60 +3,60 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::T1::•();
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar() → dynamic
     return new self::T2::•();
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method bazz() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bazz() → dynamic
     return new self::T3::•();
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → dynamic
     return new self::T1::•();
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar() → dynamic
     return new self::T2::•();
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method bazz() → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bazz() → dynamic
     return new self::T3::•();
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method use_foo1(dynamic x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use_foo1(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T1] x.foo();
-static method use_foo2(dynamic x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use_foo2(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T1] x.foo();
-static method use_bar(dynamic x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use_bar(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T2] x.bar();
-static method use_bazz(dynamic x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use_bazz(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method allocateA() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method allocateA() → dynamic {
   new self::A::•();
 }
-static method allocateB() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method allocateB() → dynamic {
   new self::B::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::use_foo1(self::getDynamic());
   self::allocateA();
   self::use_foo2(self::getDynamic());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
index 6698bb7..6cc04be 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
@@ -3,59 +3,59 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
 [@vm.inferred-type.metadata=#lib::T1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  field dynamic field1 = new self::T1::•();
 [@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  field dynamic field2 = new self::T1::•();
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class DeepCaller1 extends core::Object {
-  synthetic constructor •() → self::DeepCaller1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::DeepCaller1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL2}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL3}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL4}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field1??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::field1};
 }
 class DeepCaller2 extends core::Object {
-  synthetic constructor •() → self::DeepCaller2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::DeepCaller2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(aa);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field2??] [@vm.inferred-type.metadata=!] aa.{self::A::field2};
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=#lib::T1 (skip check)] x.{self::DeepCaller1::barL1}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
   [@vm.direct-call.metadata=#lib::A::field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   new self::A::•();
   new self::T1::•();
   new self::T2::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index 9372e70..4ed4d6c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method go() → self::T3*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method go() → self::T3*
     return new self::T3::•();
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method run() → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method run() → dynamic {
     core::print("hi");
   }
 }
 class Q<T extends core::Object* = dynamic> extends core::Object {
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  final field self::Q::T* result;
-  constructor •(self::Q::T* result) → self::Q<self::Q::T*>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •(self::Q::T* result) → self::Q<self::Q::T*>*
     : self::Q::result = result, super core::Object::•()
     ;
 }
-static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
   [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
 }
-static method foo2NewValue() → self::Q<dynamic>*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo2NewValue() → self::Q<dynamic>*
   return new self::Q::•<self::T2*>(new self::T2::•());
-static method foo3NewT1() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo3NewT1() → dynamic {
   new self::T1::•();
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::foo1(<self::T1*>[]);
   self::foo2NewValue();
   self::foo3NewT1();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
index 3390a91..bb8ca0f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → void;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → void;
 }
 class T1 extends core::Object implements self::I {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → void {}
 }
 class T2 extends core::Object implements self::I {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → void {}
 }
 class Point extends core::Object /*hasConstConstructor*/  {
 [@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  final field self::I* x;
-  const constructor •([@vm.inferred-type.metadata=!] self::I* x) → self::Point*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  const constructor •([@vm.inferred-type.metadata=!] self::I* x) → self::Point*
     : self::Point::x = x, super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method newPoint1() → self::Point*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method newPoint1() → self::Point*
     return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method newPoint2() → self::Point*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method newPoint2() → self::Point*
     return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
 }
-static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
   [@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!? (receiver not int)] point.x;
 }
-static method main() → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic {
   self::Point* a = new self::Point::•(new self::T1::•());
   core::print([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
   self::Point* c = new self::Point::•(new self::T2::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index fa129ad..d8952be 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -4,118 +4,118 @@
 import "dart:_internal" as _in;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T4 extends core::Object {
-  synthetic constructor •() → self::T4*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T4*
     : super core::Object::•()
     ;
 }
 class T5 extends core::Object {
-  synthetic constructor •() → self::T5*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T5*
     : super core::Object::•()
     ;
 }
 class T6 extends core::Object {
-  synthetic constructor •() → self::T6*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T6*
     : super core::Object::•()
     ;
 }
 class T7 extends core::Object {
-  synthetic constructor •() → self::T7*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T7*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → dynamic;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  abstract get bar() → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = #C1, dynamic a5 = #C1]) → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = #C1, dynamic a5 = #C1]) → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T1::•();
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  no-such-method-forwarder method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  no-such-method-forwarder method foo() → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T2::•();
   }
 }
 class D extends self::C implements self::A {
-  synthetic constructor •() → self::D*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  no-such-method-forwarder method foo() → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  no-such-method-forwarder method foo() → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 class E extends core::Object implements self::A {
-  synthetic constructor •() → self::E*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T4::•();
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
     return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T2::•();
   }
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T5::•();
   }
 }
 class H extends core::Object {
-  synthetic constructor •() → self::H*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::H*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic left = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic right = #C1}) → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo({[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic left = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic right = #C1}) → dynamic
     return new self::T6::•();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T7::•();
   }
 }
 [@vm.inferred-type.metadata=#lib::B?]static field self::A* bb = new self::B::•();
 [@vm.inferred-type.metadata=#lib::D?]static field self::A* dd = new self::D::•();
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
   core::print([@vm.direct-call.metadata=#lib::B::bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
   core::print([@vm.direct-call.metadata=#lib::B::bazz??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index 0378cce..f28ccae 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 abstract class T0 extends core::Object {
-  synthetic constructor •() → self::T0*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T0*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → void;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → void;
 }
 class T2 extends self::T0 {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super self::T0::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → void {}
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method method1(self::T0* t0) → void {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method method1(self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 abstract class B extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  abstract method method2(covariant dynamic arg) → void;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method method2(covariant dynamic arg) → void;
 }
 class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method method2(covariant self::T0* t0) → void {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method method2(covariant self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method method3(self::T0* t0) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method method3(self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0* t0) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0* t0) → void {
   [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
-static method func2(self::T0* t0) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method func2(self::T0* t0) → void {
   [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
-static method getDynamic() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
-static method use(dynamic x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method use(dynamic x) → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call(x);
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::func1(self::getDynamic() as{TypeError,ForDynamic} self::T0*);
   self::use(#C1);
   self::use(new self::A::•().{self::A::method1});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
index a7ca2b5..37be74f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
@@ -4,17 +4,17 @@
 
 class A extends core::Object {
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  final field core::List<dynamic>* afield;
-  constructor •([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::List<dynamic>* afield) → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::List<dynamic>* afield) → self::A*
     : self::A::afield = afield, super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method toString() → core::String*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method toString() → core::String*
     return [@vm.direct-call.metadata=dart.core::_GrowableList::toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] [@vm.direct-call.metadata=#lib::A::afield] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] this.{self::A::afield}.{core::Object::toString}();
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
     core::List<dynamic>* result = <dynamic>[];
     while ([@vm.direct-call.metadata=dart._internal::ListIterator::moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
       if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator::current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}.{core::num::<}(0)) {
@@ -25,7 +25,7 @@
     return result;
   }
 }
-static method main() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → void {
   core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
   core::print(list);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
index 2cbbfed..823e781 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
   return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList::[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
-static method main() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → dynamic
   return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo(<core::int*>[1]));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index ab1a24e..ce77fcd 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -7,104 +7,104 @@
 import "package:expect/expect.dart";
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method doTest1() → void {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doTest1() → void {
     self::ok = true;
   }
 }
 class A1 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T1?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  field self::T1* foo = null;
-  synthetic constructor •() → self::A1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
   }
 }
 class B1 extends core::Object {
 [@vm.inferred-type.metadata=#lib::A1] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  field self::A1* aa1 = new self::A1::•();
-  synthetic constructor •() → self::B1*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method doTest2() → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doTest2() → void {
     self::ok = true;
   }
 }
 class A2 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T2?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  field dynamic foo = null;
-  synthetic constructor •() → self::A2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A2::foo} = a6;
   }
 }
 abstract class B2Base extends core::Object {
 [@vm.inferred-type.metadata=#lib::A2] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:12,getterSelectorId:13]  field dynamic _aa = new self::A2::•();
-  synthetic constructor •() → self::B2Base*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B2Base*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11]  get aa2() → dynamic
     return [@vm.direct-call.metadata=#lib::B2Base::_aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa};
 }
 class B2 extends self::B2Base {
-  synthetic constructor •() → self::B2*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B2*
     : super self::B2Base::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:14,getterSelectorId:15]  method doSuperCall() → void {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:14,getterSelectorId:15] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doSuperCall() → void {
     [@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::A2::call] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::A2] super.{self::B2Base::aa2}.call(1, 2, 3, 4, 5, new self::T2::•());
   }
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:16,getterSelectorId:17]  method doTest3() → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:16,getterSelectorId:17] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doTest3() → void {
     self::ok = true;
   }
 }
 class A3 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T3?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  field dynamic foo = null;
-  synthetic constructor •() → self::A3*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A3*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A3::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A3::foo} = a7;
   }
 }
 class B3 extends core::Object {
 [@vm.inferred-type.metadata=#lib::A3] [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:18,getterSelectorId:19]  field self::A3* aa3 = new self::A3::•();
-  synthetic constructor •() → self::B3*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B3*
     : super core::Object::•()
     ;
 }
 class T4 extends core::Object {
-  synthetic constructor •() → self::T4*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::T4*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:20,getterSelectorId:21]  method doTest4() → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:20,getterSelectorId:21] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doTest4() → void {
     self::ok = true;
   }
 }
 class A4 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T4?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  field dynamic foo = null;
-  synthetic constructor •() → self::A4*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A4*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A4::foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A4::foo} = a8;
   }
 }
 class B4 extends core::Object {
 [@vm.inferred-type.metadata=#lib::A4] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:12,getterSelectorId:13]  field dynamic _aa = new self::A4::•();
-  synthetic constructor •() → self::B4*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B4*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,getterSelectorId:22]  get aa4() → dynamic
@@ -115,37 +115,37 @@
 [@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown3 = () → dynamic => self::bb3;
 [@vm.inferred-type.metadata=#lib::B4?]static field dynamic bb4 = new self::B4::•();
 [@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown4 = () → dynamic => self::bb4;
-static method test1() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test1() → void {
   self::B1* bb = new self::B1::•();
   let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:#lib::A1*] [@vm.direct-call.metadata=#lib::A1::call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
-static method test2() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test2() → void {
   self::B2* bb = new self::B2::•();
   [@vm.direct-call.metadata=#lib::B2::doSuperCall] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B2::doSuperCall}();
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T2::doTest2??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=#lib::T2? (receiver not int)] [@vm.direct-call.metadata=#lib::B2Base::aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
-static method getDynamic3() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic3() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown3.call();
-static method test3() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test3() → void {
   self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T3::doTest3??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A3::foo] [@vm.inferred-type.metadata=#lib::T3? (receiver not int)] [@vm.direct-call.metadata=#lib::B3::aa3??] [@vm.inferred-type.metadata=#lib::A3 (receiver not int)] [@vm.inferred-type.metadata=#lib::B3?] self::bb3.aa3.foo.doTest3();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
-static method getDynamic4() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method getDynamic4() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown4.call();
-static method test4() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method test4() → void {
   self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T4::doTest4??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A4::foo] [@vm.inferred-type.metadata=#lib::T4? (receiver not int)] [@vm.inferred-type.metadata=#lib::A4] self::getDynamic4().aa4.foo.doTest4();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
-static method main() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → void {
   self::test1();
   self::test2();
   self::test3();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index e3c2996..9caa665 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=! (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError,ForDynamic} core::num*) as{TypeError} core::int*;
 }
 class TearOffDynamicMethod extends core::Object {
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  field dynamic bazz;
-  constructor •(dynamic arg) → self::TearOffDynamicMethod*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •(dynamic arg) → self::TearOffDynamicMethod*
     : self::TearOffDynamicMethod::bazz = arg.foo, super core::Object::•() {
     [@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::TearOffDynamicMethod::bazz] this.{self::TearOffDynamicMethod::bazz}.call();
   }
 }
-static method knownResult() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   core::Function* closure = () → self::B* => new self::B::•();
   new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] closure.call());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index 48d30e5..94cf14a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -4,28 +4,28 @@
 import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → core::int*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num*>([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 3) (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar() → core::int*
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar() → core::int*
     return 3;
 }
 class TearOffInterfaceMethod extends core::Object {
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  field dynamic bazz;
-  constructor •([@vm.inferred-type.metadata=#lib::B] self::A* arg) → self::TearOffInterfaceMethod*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •([@vm.inferred-type.metadata=#lib::B] self::A* arg) → self::TearOffInterfaceMethod*
     : self::TearOffInterfaceMethod::bazz = arg.{self::A::foo}, super core::Object::•()
     ;
 }
-static method knownResult() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   [@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::TearOffInterfaceMethod::bazz] new self::TearOffInterfaceMethod::•(new self::B::•()).{self::TearOffInterfaceMethod::bazz}.call();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index 557d8ea..7c51147 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
@@ -4,38 +4,38 @@
 import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → core::int*;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num*>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 }
 abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method foo() → core::int*
     return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num*>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method doCall(dynamic x) → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method doCall(dynamic x) → core::int*
     return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError,ForDynamic} core::int*;
 }
 class TearOffSuperMethod extends self::Base {
-  synthetic constructor •() → self::TearOffSuperMethod*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::TearOffSuperMethod*
     : super self::Base::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method bar() → core::int*
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  method bar() → core::int*
     return [@vm.direct-call.metadata=#lib::Base::doCall] [@vm.inferred-type.metadata=int? (skip check)] this.{self::Base::doCall}(super.{self::Base::foo});
 }
 [@vm.inferred-type.metadata=#lib::B?]static field self::A* aa = new self::B::•();
-static method knownResult() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   [@vm.direct-call.metadata=#lib::TearOffSuperMethod::bar] [@vm.inferred-type.metadata=!? (skip check)] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
   [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
index 74d3bb3..4e012e2 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 [@vm.inferred-type.metadata=#lib::A?]static field dynamic static_field_good = [@vm.inferred-type.metadata=#lib::A] self::good();
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field dynamic static_field_bad = [@vm.inferred-type.metadata=!] self::bad();
-static method good() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method good() → dynamic
   return new self::A::•();
-static method bad() → dynamic
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method bad() → dynamic
   return throw "No return!";
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A?] self::static_field_good);
   core::print([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::static_field_bad);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
index 47a15c4..2e7e6be 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
@@ -7,16 +7,16 @@
 abstract class A extends core::Object implements self::I {
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 [@vm.inferred-type.metadata=#lib::B?]static field self::I* ii = new self::B::•();
-static method bar([@vm.inferred-type.metadata=#lib::B?] self::I* i) → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method bar([@vm.inferred-type.metadata=#lib::B?] self::I* i) → void {
   if(i is self::A*) {
     let dynamic #t1 = i{self::A*} in let dynamic #t2 = 42 in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
 }
-static method main(core::List<core::String*>* args) → dynamic {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main(core::List<core::String*>* args) → dynamic {
   self::bar([@vm.inferred-type.metadata=#lib::B?] self::ii);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
index e02c5ea..ec1d988 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
@@ -5,19 +5,19 @@
 abstract class A extends core::Object {
 }
 class B extends core::Object {
-  constructor •() → self::B*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  constructor •() → self::B*
     : super core::Object::•() {
     core::print("B");
   }
 }
 class C extends core::Object {
 [@vm.inferred-type.metadata=#lib::B?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  field self::B* instanceField = new self::B::•();
-  synthetic constructor •() → self::C*
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field self::A* field = throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
-static method main() → void {
+[@vm.unboxing-info.metadata=Instance of 'UnboxingInfoMetadata']static method main() → void {
   self::field = null;
   [@vm.direct-call.metadata=#lib::C::instanceField] [@vm.inferred-type.metadata=!? (skip check)] new self::C::•().{self::C::instanceField} = null;
 }
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 2041a96..6758942 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,7 +1,14 @@
 # Changelog
 
+## 4.0.0
+- **breaking**: RPCs which can return a `Sentinel` will now throw the `Sentinel`
+  it is received as a response.
+- **breaking**: RPCs which can return multiple values now return
+  `Future<Response>` rather than `Future<dynamic>`.
+- `RPCError` now implements `Exception`.
+
 ## 3.0.0
-**breaking**: RPCs which have an isolateId parameter now return
+- **breaking**: RPCs which have an isolateId parameter now return
   `Future<dynamic>` as a `Sentinel` can be returned if the target isolate no
   longer exists.
 
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 563d826d..7fc8e94 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -80,11 +80,9 @@
   if (json is List) {
     return json.map((e) => creator(e)).toList();
   } else if (json is Map) {
-    Map<String, dynamic> map = {};
-    for (dynamic key in json.keys) {
-      map[key as String] = json[key];
-    }
-    return creator(map);
+    return creator({
+      for (String key in json.keys) key: json[key],
+    });
   } else {
     // Handle simple types.
     return json;
@@ -187,47 +185,47 @@
 };
 
 Map<String, List<String>> _methodReturnTypes = {
-  'addBreakpoint': const ['Breakpoint', 'Sentinel'],
-  'addBreakpointWithScriptUri': const ['Breakpoint', 'Sentinel'],
-  'addBreakpointAtEntry': const ['Breakpoint', 'Sentinel'],
-  'clearCpuSamples': const ['Success', 'Sentinel'],
+  'addBreakpoint': const ['Breakpoint'],
+  'addBreakpointWithScriptUri': const ['Breakpoint'],
+  'addBreakpointAtEntry': const ['Breakpoint'],
+  'clearCpuSamples': const ['Success'],
   'clearVMTimeline': const ['Success'],
-  'invoke': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
-  'evaluate': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
-  'evaluateInFrame': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
-  'getAllocationProfile': const ['AllocationProfile', 'Sentinel'],
+  'invoke': const ['InstanceRef', 'ErrorRef'],
+  'evaluate': const ['InstanceRef', 'ErrorRef'],
+  'evaluateInFrame': const ['InstanceRef', 'ErrorRef'],
+  'getAllocationProfile': const ['AllocationProfile'],
   'getClientName': const ['ClientName'],
-  'getCpuSamples': const ['CpuSamples', 'Sentinel'],
+  'getCpuSamples': const ['CpuSamples'],
   'getFlagList': const ['FlagList'],
-  'getInboundReferences': const ['InboundReferences', 'Sentinel'],
-  'getInstances': const ['InstanceSet', 'Sentinel'],
-  'getIsolate': const ['Isolate', 'Sentinel'],
-  'getIsolateGroup': const ['IsolateGroup', 'Sentinel'],
-  'getMemoryUsage': const ['MemoryUsage', 'Sentinel'],
-  'getIsolateGroupMemoryUsage': const ['MemoryUsage', 'Sentinel'],
-  'getScripts': const ['ScriptList', 'Sentinel'],
-  'getObject': const ['Obj', 'Sentinel'],
-  'getRetainingPath': const ['RetainingPath', 'Sentinel'],
-  'getStack': const ['Stack', 'Sentinel'],
-  'getSourceReport': const ['SourceReport', 'Sentinel'],
+  'getInboundReferences': const ['InboundReferences'],
+  'getInstances': const ['InstanceSet'],
+  'getIsolate': const ['Isolate'],
+  'getIsolateGroup': const ['IsolateGroup'],
+  'getMemoryUsage': const ['MemoryUsage'],
+  'getIsolateGroupMemoryUsage': const ['MemoryUsage'],
+  'getScripts': const ['ScriptList'],
+  'getObject': const ['Obj'],
+  'getRetainingPath': const ['RetainingPath'],
+  'getStack': const ['Stack'],
+  'getSourceReport': const ['SourceReport'],
   'getVersion': const ['Version'],
   'getVM': const ['VM'],
   'getVMTimeline': const ['Timeline'],
   'getVMTimelineFlags': const ['TimelineFlags'],
   'getVMTimelineMicros': const ['Timestamp'],
-  'pause': const ['Success', 'Sentinel'],
-  'kill': const ['Success', 'Sentinel'],
+  'pause': const ['Success'],
+  'kill': const ['Success'],
   'registerService': const ['Success'],
-  'reloadSources': const ['ReloadReport', 'Sentinel'],
-  'removeBreakpoint': const ['Success', 'Sentinel'],
-  'requestHeapSnapshot': const ['Success', 'Sentinel'],
+  'reloadSources': const ['ReloadReport'],
+  'removeBreakpoint': const ['Success'],
+  'requestHeapSnapshot': const ['Success'],
   'requirePermissionToResume': const ['Success'],
-  'resume': const ['Success', 'Sentinel'],
+  'resume': const ['Success'],
   'setClientName': const ['Success'],
-  'setExceptionPauseMode': const ['Success', 'Sentinel'],
+  'setExceptionPauseMode': const ['Success'],
   'setFlag': const ['Success', 'Error'],
-  'setLibraryDebuggable': const ['Success', 'Sentinel'],
-  'setName': const ['Success', 'Sentinel'],
+  'setLibraryDebuggable': const ['Success'],
+  'setName': const ['Success'],
   'setVMName': const ['Success'],
   'setVMTimelineFlags': const ['Success'],
   'streamCancel': const ['Success'],
@@ -274,8 +272,9 @@
   ///
   /// See [Breakpoint].
   ///
-  /// The return value can be one of [Breakpoint] or [Sentinel].
-  Future<dynamic> addBreakpoint(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Breakpoint> addBreakpoint(
     String isolateId,
     String scriptId,
     int line, {
@@ -310,8 +309,9 @@
   ///
   /// See [Breakpoint].
   ///
-  /// The return value can be one of [Breakpoint] or [Sentinel].
-  Future<dynamic> addBreakpointWithScriptUri(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Breakpoint> addBreakpointWithScriptUri(
     String isolateId,
     String scriptUri,
     int line, {
@@ -331,8 +331,9 @@
   ///
   /// Note that breakpoints are added and removed on a per-isolate basis.
   ///
-  /// The return value can be one of [Breakpoint] or [Sentinel].
-  Future<dynamic> addBreakpointAtEntry(String isolateId, String functionId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Breakpoint> addBreakpointAtEntry(String isolateId, String functionId);
 
   /// Clears all CPU profiling samples.
   ///
@@ -341,8 +342,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> clearCpuSamples(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> clearCpuSamples(String isolateId);
 
   /// Clears all VM timeline events.
   ///
@@ -381,8 +383,11 @@
   /// If the invocation is evaluated successfully, an [InstanceRef] reference
   /// will be returned.
   ///
-  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
-  Future<dynamic> invoke(
+  /// The return value can be one of [InstanceRef] or [ErrorRef].
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Response> invoke(
     String isolateId,
     String targetId,
     String selector,
@@ -424,8 +429,11 @@
   /// If the expression is evaluated successfully, an [InstanceRef] reference
   /// will be returned.
   ///
-  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
-  Future<dynamic> evaluate(
+  /// The return value can be one of [InstanceRef] or [ErrorRef].
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Response> evaluate(
     String isolateId,
     String targetId,
     String expression, {
@@ -459,8 +467,11 @@
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
-  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
-  Future<dynamic> evaluateInFrame(
+  /// The return value can be one of [InstanceRef] or [ErrorRef].
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Response> evaluateInFrame(
     String isolateId,
     int frameIndex,
     String expression, {
@@ -481,8 +492,10 @@
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
-  /// The return value can be one of [AllocationProfile] or [Sentinel].
-  Future<dynamic> getAllocationProfile(String isolateId, {bool reset, bool gc});
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<AllocationProfile> getAllocationProfile(String isolateId,
+      {bool reset, bool gc});
 
   /// The `getClientName` RPC is used to retrieve the name associated with the
   /// currently connected VM service client. If no name was previously set
@@ -502,8 +515,9 @@
   ///
   /// See [CpuSamples].
   ///
-  /// The return value can be one of [CpuSamples] or [Sentinel].
-  Future<dynamic> getCpuSamples(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<CpuSamples> getCpuSamples(
       String isolateId, int timeOriginMicros, int timeExtentMicros);
 
   /// The `getFlagList` RPC returns a list of all command line flags in the VM
@@ -537,8 +551,9 @@
   ///
   /// See [InboundReferences].
   ///
-  /// The return value can be one of [InboundReferences] or [Sentinel].
-  Future<dynamic> getInboundReferences(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<InboundReferences> getInboundReferences(
       String isolateId, String targetId, int limit);
 
   /// The `getInstances` RPC is used to retrieve a set of instances which are of
@@ -563,8 +578,10 @@
   ///
   /// See [InstanceSet].
   ///
-  /// The return value can be one of [InstanceSet] or [Sentinel].
-  Future<dynamic> getInstances(String isolateId, String objectId, int limit);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<InstanceSet> getInstances(
+      String isolateId, String objectId, int limit);
 
   /// The `getIsolate` RPC is used to lookup an `Isolate` object by its `id`.
   ///
@@ -573,8 +590,9 @@
   ///
   /// See [Isolate].
   ///
-  /// The return value can be one of [Isolate] or [Sentinel].
-  Future<dynamic> getIsolate(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Isolate> getIsolate(String isolateId);
 
   /// The `getIsolateGroup` RPC is used to lookup an `IsolateGroup` object by
   /// its `id`.
@@ -588,8 +606,9 @@
   ///
   /// See [IsolateGroup], [VM].
   ///
-  /// The return value can be one of [IsolateGroup] or [Sentinel].
-  Future<dynamic> getIsolateGroup(String isolateGroupId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<IsolateGroup> getIsolateGroup(String isolateGroupId);
 
   /// The `getMemoryUsage` RPC is used to lookup an isolate's memory usage
   /// statistics by its `id`.
@@ -599,8 +618,9 @@
   ///
   /// See [Isolate].
   ///
-  /// The return value can be one of [MemoryUsage] or [Sentinel].
-  Future<dynamic> getMemoryUsage(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<MemoryUsage> getMemoryUsage(String isolateId);
 
   /// The `getIsolateGroupMemoryUsage` RPC is used to lookup an isolate group's
   /// memory usage statistics by its `id`.
@@ -610,8 +630,9 @@
   ///
   /// See [IsolateGroup].
   ///
-  /// The return value can be one of [MemoryUsage] or [Sentinel].
-  Future<dynamic> getIsolateGroupMemoryUsage(String isolateGroupId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<MemoryUsage> getIsolateGroupMemoryUsage(String isolateGroupId);
 
   /// The `getScripts` RPC is used to retrieve a `ScriptList` containing all
   /// scripts for an isolate based on the isolate's `isolateId`.
@@ -621,8 +642,9 @@
   ///
   /// See [ScriptList].
   ///
-  /// The return value can be one of [ScriptList] or [Sentinel].
-  Future<dynamic> getScripts(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<ScriptList> getScripts(String isolateId);
 
   /// The `getObject` RPC is used to lookup an `object` from some isolate by its
   /// `id`.
@@ -648,8 +670,9 @@
   /// Int32List, Int64List, Flooat32List, Float64List, Inst32x3List,
   /// Float32x4List, and Float64x2List. These parameters are otherwise ignored.
   ///
-  /// The return value can be one of [Obj] or [Sentinel].
-  Future<dynamic> getObject(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Obj> getObject(
     String isolateId,
     String objectId, {
     int offset,
@@ -678,8 +701,9 @@
   ///
   /// See [RetainingPath].
   ///
-  /// The return value can be one of [RetainingPath] or [Sentinel].
-  Future<dynamic> getRetainingPath(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<RetainingPath> getRetainingPath(
       String isolateId, String targetId, int limit);
 
   /// The `getStack` RPC is used to retrieve the current execution stack and
@@ -690,8 +714,9 @@
   ///
   /// See [Stack].
   ///
-  /// The return value can be one of [Stack] or [Sentinel].
-  Future<dynamic> getStack(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Stack> getStack(String isolateId);
 
   /// The `getSourceReport` RPC is used to generate a set of reports tied to
   /// source locations in an isolate.
@@ -730,8 +755,9 @@
   ///
   /// See [SourceReport].
   ///
-  /// The return value can be one of [SourceReport] or [Sentinel].
-  Future<dynamic> getSourceReport(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<SourceReport> getSourceReport(
     String isolateId,
     /*List<SourceReportKind>*/
     List<String> reports, {
@@ -801,8 +827,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> pause(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> pause(String isolateId);
 
   /// The `kill` RPC is used to kill an isolate as if by dart:isolate's
   /// `Isolate.kill(IMMEDIATE)`.
@@ -814,8 +841,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> kill(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> kill(String isolateId);
 
   /// Registers a service that can be invoked by other VM service clients, where
   /// `service` is the name of the service to advertise and `alias` is an
@@ -845,8 +873,9 @@
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
-  /// The return value can be one of [ReloadReport] or [Sentinel].
-  Future<dynamic> reloadSources(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<ReloadReport> reloadSources(
     String isolateId, {
     bool force,
     bool pause,
@@ -863,8 +892,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> removeBreakpoint(String isolateId, String breakpointId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> removeBreakpoint(String isolateId, String breakpointId);
 
   /// Requests a dump of the Dart heap of the given isolate.
   ///
@@ -877,8 +907,9 @@
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> requestHeapSnapshot(String isolateId);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> requestHeapSnapshot(String isolateId);
 
   /// The `requirePermissionToResume` RPC is used to change the pause/resume
   /// behavior of isolates by providing a way for the VM service to wait for
@@ -932,8 +963,9 @@
   ///
   /// See [Success], [StepOption].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> resume(String isolateId,
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> resume(String isolateId,
       {/*StepOption*/ String step, int frameIndex});
 
   /// The `setClientName` RPC is used to set a name to be associated with the
@@ -957,8 +989,9 @@
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> setExceptionPauseMode(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> setExceptionPauseMode(
       String isolateId, /*ExceptionPauseMode*/ String mode);
 
   /// The `setFlag` RPC is used to set a VM flag at runtime. Returns an error if
@@ -968,7 +1001,7 @@
   /// The following flags may be set at runtime:
   ///
   /// The return value can be one of [Success] or [Error].
-  Future<dynamic> setFlag(String name, String value);
+  Future<Response> setFlag(String name, String value);
 
   /// The `setLibraryDebuggable` RPC is used to enable or disable whether
   /// breakpoints and stepping work for a given library.
@@ -978,8 +1011,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> setLibraryDebuggable(
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> setLibraryDebuggable(
       String isolateId, String libraryId, bool isDebuggable);
 
   /// The `setName` RPC is used to change the debugging name for an isolate.
@@ -989,8 +1023,9 @@
   ///
   /// See [Success].
   ///
-  /// The return value can be one of [Success] or [Sentinel].
-  Future<dynamic> setName(String isolateId, String name);
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> setName(String isolateId, String name);
 
   /// The `setVMName` RPC is used to change the debugging name for the vm.
   ///
@@ -1542,210 +1577,179 @@
   Stream<Event> get onStderrEvent => _getEventController('Stderr').stream;
 
   @override
-  Future<dynamic> addBreakpoint(
+  Future<Breakpoint> addBreakpoint(
     String isolateId,
     String scriptId,
     int line, {
     int column,
-  }) {
-    Map m = {'isolateId': isolateId, 'scriptId': scriptId, 'line': line};
-    if (column != null) {
-      m['column'] = column;
-    }
-    return _call('addBreakpoint', m);
-  }
+  }) =>
+      _call('addBreakpoint', {
+        'isolateId': isolateId,
+        'scriptId': scriptId,
+        'line': line,
+        if (column != null) 'column': column,
+      });
 
   @override
-  Future<dynamic> addBreakpointWithScriptUri(
+  Future<Breakpoint> addBreakpointWithScriptUri(
     String isolateId,
     String scriptUri,
     int line, {
     int column,
-  }) {
-    Map m = {'isolateId': isolateId, 'scriptUri': scriptUri, 'line': line};
-    if (column != null) {
-      m['column'] = column;
-    }
-    return _call('addBreakpointWithScriptUri', m);
-  }
+  }) =>
+      _call('addBreakpointWithScriptUri', {
+        'isolateId': isolateId,
+        'scriptUri': scriptUri,
+        'line': line,
+        if (column != null) 'column': column,
+      });
 
   @override
-  Future<dynamic> addBreakpointAtEntry(String isolateId, String functionId) {
-    return _call('addBreakpointAtEntry',
-        {'isolateId': isolateId, 'functionId': functionId});
-  }
+  Future<Breakpoint> addBreakpointAtEntry(
+          String isolateId, String functionId) =>
+      _call('addBreakpointAtEntry',
+          {'isolateId': isolateId, 'functionId': functionId});
 
   @override
-  Future<dynamic> clearCpuSamples(String isolateId) {
-    return _call('clearCpuSamples', {'isolateId': isolateId});
-  }
+  Future<Success> clearCpuSamples(String isolateId) =>
+      _call('clearCpuSamples', {'isolateId': isolateId});
 
   @override
   Future<Success> clearVMTimeline() => _call('clearVMTimeline');
 
   @override
-  Future<dynamic> invoke(
+  Future<Response> invoke(
     String isolateId,
     String targetId,
     String selector,
     List<String> argumentIds, {
     bool disableBreakpoints,
-  }) {
-    Map m = {
-      'isolateId': isolateId,
-      'targetId': targetId,
-      'selector': selector,
-      'argumentIds': argumentIds
-    };
-    if (disableBreakpoints != null) {
-      m['disableBreakpoints'] = disableBreakpoints;
-    }
-    return _call('invoke', m);
-  }
+  }) =>
+      _call('invoke', {
+        'isolateId': isolateId,
+        'targetId': targetId,
+        'selector': selector,
+        'argumentIds': argumentIds,
+        if (disableBreakpoints != null)
+          'disableBreakpoints': disableBreakpoints,
+      });
 
   @override
-  Future<dynamic> evaluate(
+  Future<Response> evaluate(
     String isolateId,
     String targetId,
     String expression, {
     Map<String, String> scope,
     bool disableBreakpoints,
-  }) {
-    Map m = {
-      'isolateId': isolateId,
-      'targetId': targetId,
-      'expression': expression
-    };
-    if (scope != null) {
-      m['scope'] = scope;
-    }
-    if (disableBreakpoints != null) {
-      m['disableBreakpoints'] = disableBreakpoints;
-    }
-    return _call('evaluate', m);
-  }
+  }) =>
+      _call('evaluate', {
+        'isolateId': isolateId,
+        'targetId': targetId,
+        'expression': expression,
+        if (scope != null) 'scope': scope,
+        if (disableBreakpoints != null)
+          'disableBreakpoints': disableBreakpoints,
+      });
 
   @override
-  Future<dynamic> evaluateInFrame(
+  Future<Response> evaluateInFrame(
     String isolateId,
     int frameIndex,
     String expression, {
     Map<String, String> scope,
     bool disableBreakpoints,
-  }) {
-    Map m = {
-      'isolateId': isolateId,
-      'frameIndex': frameIndex,
-      'expression': expression
-    };
-    if (scope != null) {
-      m['scope'] = scope;
-    }
-    if (disableBreakpoints != null) {
-      m['disableBreakpoints'] = disableBreakpoints;
-    }
-    return _call('evaluateInFrame', m);
-  }
+  }) =>
+      _call('evaluateInFrame', {
+        'isolateId': isolateId,
+        'frameIndex': frameIndex,
+        'expression': expression,
+        if (scope != null) 'scope': scope,
+        if (disableBreakpoints != null)
+          'disableBreakpoints': disableBreakpoints,
+      });
 
   @override
-  Future<dynamic> getAllocationProfile(String isolateId,
-      {bool reset, bool gc}) {
-    Map m = {'isolateId': isolateId};
-    if (reset != null && reset) {
-      m['reset'] = reset;
-    }
-    if (gc != null && gc) {
-      m['gc'] = gc;
-    }
-    return _call('getAllocationProfile', m);
-  }
+  Future<AllocationProfile> getAllocationProfile(String isolateId,
+          {bool reset, bool gc}) =>
+      _call('getAllocationProfile', {
+        'isolateId': isolateId,
+        if (reset != null && reset) 'reset': reset,
+        if (gc != null && gc) 'gc': gc,
+      });
 
   @override
   Future<ClientName> getClientName() => _call('getClientName');
 
   @override
-  Future<dynamic> getCpuSamples(
-      String isolateId, int timeOriginMicros, int timeExtentMicros) {
-    return _call('getCpuSamples', {
-      'isolateId': isolateId,
-      'timeOriginMicros': timeOriginMicros,
-      'timeExtentMicros': timeExtentMicros
-    });
-  }
+  Future<CpuSamples> getCpuSamples(
+          String isolateId, int timeOriginMicros, int timeExtentMicros) =>
+      _call('getCpuSamples', {
+        'isolateId': isolateId,
+        'timeOriginMicros': timeOriginMicros,
+        'timeExtentMicros': timeExtentMicros
+      });
 
   @override
   Future<FlagList> getFlagList() => _call('getFlagList');
 
   @override
-  Future<dynamic> getInboundReferences(
-      String isolateId, String targetId, int limit) {
-    return _call('getInboundReferences',
-        {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
-  }
+  Future<InboundReferences> getInboundReferences(
+          String isolateId, String targetId, int limit) =>
+      _call('getInboundReferences',
+          {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
 
   @override
-  Future<dynamic> getInstances(String isolateId, String objectId, int limit) {
-    return _call('getInstances',
-        {'isolateId': isolateId, 'objectId': objectId, 'limit': limit});
-  }
+  Future<InstanceSet> getInstances(
+          String isolateId, String objectId, int limit) =>
+      _call('getInstances',
+          {'isolateId': isolateId, 'objectId': objectId, 'limit': limit});
 
   @override
-  Future<dynamic> getIsolate(String isolateId) {
-    return _call('getIsolate', {'isolateId': isolateId});
-  }
+  Future<Isolate> getIsolate(String isolateId) =>
+      _call('getIsolate', {'isolateId': isolateId});
 
   @override
-  Future<dynamic> getIsolateGroup(String isolateGroupId) {
-    return _call('getIsolateGroup', {'isolateGroupId': isolateGroupId});
-  }
+  Future<IsolateGroup> getIsolateGroup(String isolateGroupId) =>
+      _call('getIsolateGroup', {'isolateGroupId': isolateGroupId});
 
   @override
-  Future<dynamic> getMemoryUsage(String isolateId) {
-    return _call('getMemoryUsage', {'isolateId': isolateId});
-  }
+  Future<MemoryUsage> getMemoryUsage(String isolateId) =>
+      _call('getMemoryUsage', {'isolateId': isolateId});
 
   @override
-  Future<dynamic> getIsolateGroupMemoryUsage(String isolateGroupId) {
-    return _call(
-        'getIsolateGroupMemoryUsage', {'isolateGroupId': isolateGroupId});
-  }
+  Future<MemoryUsage> getIsolateGroupMemoryUsage(String isolateGroupId) =>
+      _call('getIsolateGroupMemoryUsage', {'isolateGroupId': isolateGroupId});
 
   @override
-  Future<dynamic> getScripts(String isolateId) {
-    return _call('getScripts', {'isolateId': isolateId});
-  }
+  Future<ScriptList> getScripts(String isolateId) =>
+      _call('getScripts', {'isolateId': isolateId});
 
   @override
-  Future<dynamic> getObject(
+  Future<Obj> getObject(
     String isolateId,
     String objectId, {
     int offset,
     int count,
-  }) {
-    Map m = {'isolateId': isolateId, 'objectId': objectId};
-    if (offset != null) {
-      m['offset'] = offset;
-    }
-    if (count != null) {
-      m['count'] = count;
-    }
-    return _call('getObject', m);
-  }
+  }) =>
+      _call('getObject', {
+        'isolateId': isolateId,
+        'objectId': objectId,
+        if (offset != null) 'offset': offset,
+        if (count != null) 'count': count,
+      });
 
   @override
-  Future<dynamic> getRetainingPath(
-      String isolateId, String targetId, int limit) {
-    return _call('getRetainingPath',
-        {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
-  }
+  Future<RetainingPath> getRetainingPath(
+          String isolateId, String targetId, int limit) =>
+      _call('getRetainingPath',
+          {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
 
   @override
-  Future<dynamic> getStack(String isolateId) {
-    return _call('getStack', {'isolateId': isolateId});
-  }
+  Future<Stack> getStack(String isolateId) =>
+      _call('getStack', {'isolateId': isolateId});
 
   @override
-  Future<dynamic> getSourceReport(
+  Future<SourceReport> getSourceReport(
     String isolateId,
     /*List<SourceReportKind>*/
     List<String> reports, {
@@ -1753,22 +1757,15 @@
     int tokenPos,
     int endTokenPos,
     bool forceCompile,
-  }) {
-    Map m = {'isolateId': isolateId, 'reports': reports};
-    if (scriptId != null) {
-      m['scriptId'] = scriptId;
-    }
-    if (tokenPos != null) {
-      m['tokenPos'] = tokenPos;
-    }
-    if (endTokenPos != null) {
-      m['endTokenPos'] = endTokenPos;
-    }
-    if (forceCompile != null) {
-      m['forceCompile'] = forceCompile;
-    }
-    return _call('getSourceReport', m);
-  }
+  }) =>
+      _call('getSourceReport', {
+        'isolateId': isolateId,
+        'reports': reports,
+        if (scriptId != null) 'scriptId': scriptId,
+        if (tokenPos != null) 'tokenPos': tokenPos,
+        if (endTokenPos != null) 'endTokenPos': endTokenPos,
+        if (forceCompile != null) 'forceCompile': forceCompile,
+      });
 
   @override
   Future<Version> getVersion() => _call('getVersion');
@@ -1777,16 +1774,12 @@
   Future<VM> getVM() => _call('getVM');
 
   @override
-  Future<Timeline> getVMTimeline({int timeOriginMicros, int timeExtentMicros}) {
-    Map m = {};
-    if (timeOriginMicros != null) {
-      m['timeOriginMicros'] = timeOriginMicros;
-    }
-    if (timeExtentMicros != null) {
-      m['timeExtentMicros'] = timeExtentMicros;
-    }
-    return _call('getVMTimeline', m);
-  }
+  Future<Timeline> getVMTimeline(
+          {int timeOriginMicros, int timeExtentMicros}) =>
+      _call('getVMTimeline', {
+        if (timeOriginMicros != null) 'timeOriginMicros': timeOriginMicros,
+        if (timeExtentMicros != null) 'timeExtentMicros': timeExtentMicros,
+      });
 
   @override
   Future<TimelineFlags> getVMTimelineFlags() => _call('getVMTimelineFlags');
@@ -1795,135 +1788,100 @@
   Future<Timestamp> getVMTimelineMicros() => _call('getVMTimelineMicros');
 
   @override
-  Future<dynamic> pause(String isolateId) {
-    return _call('pause', {'isolateId': isolateId});
-  }
+  Future<Success> pause(String isolateId) =>
+      _call('pause', {'isolateId': isolateId});
 
   @override
-  Future<dynamic> kill(String isolateId) {
-    return _call('kill', {'isolateId': isolateId});
-  }
+  Future<Success> kill(String isolateId) =>
+      _call('kill', {'isolateId': isolateId});
 
   @override
-  Future<Success> registerService(String service, String alias) {
-    return _call('registerService', {'service': service, 'alias': alias});
-  }
+  Future<Success> registerService(String service, String alias) =>
+      _call('registerService', {'service': service, 'alias': alias});
 
   @override
-  Future<dynamic> reloadSources(
+  Future<ReloadReport> reloadSources(
     String isolateId, {
     bool force,
     bool pause,
     String rootLibUri,
     String packagesUri,
-  }) {
-    Map m = {'isolateId': isolateId};
-    if (force != null) {
-      m['force'] = force;
-    }
-    if (pause != null) {
-      m['pause'] = pause;
-    }
-    if (rootLibUri != null) {
-      m['rootLibUri'] = rootLibUri;
-    }
-    if (packagesUri != null) {
-      m['packagesUri'] = packagesUri;
-    }
-    return _call('reloadSources', m);
-  }
+  }) =>
+      _call('reloadSources', {
+        'isolateId': isolateId,
+        if (force != null) 'force': force,
+        if (pause != null) 'pause': pause,
+        if (rootLibUri != null) 'rootLibUri': rootLibUri,
+        if (packagesUri != null) 'packagesUri': packagesUri,
+      });
 
   @override
-  Future<dynamic> removeBreakpoint(String isolateId, String breakpointId) {
-    return _call('removeBreakpoint',
-        {'isolateId': isolateId, 'breakpointId': breakpointId});
-  }
+  Future<Success> removeBreakpoint(String isolateId, String breakpointId) =>
+      _call('removeBreakpoint',
+          {'isolateId': isolateId, 'breakpointId': breakpointId});
 
   @override
-  Future<dynamic> requestHeapSnapshot(String isolateId) {
-    return _call('requestHeapSnapshot', {'isolateId': isolateId});
-  }
+  Future<Success> requestHeapSnapshot(String isolateId) =>
+      _call('requestHeapSnapshot', {'isolateId': isolateId});
 
   @override
   Future<Success> requirePermissionToResume(
-      {bool onPauseStart, bool onPauseReload, bool onPauseExit}) {
-    Map m = {};
-    if (onPauseStart != null) {
-      m['onPauseStart'] = onPauseStart;
-    }
-    if (onPauseReload != null) {
-      m['onPauseReload'] = onPauseReload;
-    }
-    if (onPauseExit != null) {
-      m['onPauseExit'] = onPauseExit;
-    }
-    return _call('requirePermissionToResume', m);
-  }
+          {bool onPauseStart, bool onPauseReload, bool onPauseExit}) =>
+      _call('requirePermissionToResume', {
+        if (onPauseStart != null) 'onPauseStart': onPauseStart,
+        if (onPauseReload != null) 'onPauseReload': onPauseReload,
+        if (onPauseExit != null) 'onPauseExit': onPauseExit,
+      });
 
   @override
-  Future<dynamic> resume(String isolateId,
-      {/*StepOption*/ String step, int frameIndex}) {
-    Map m = {'isolateId': isolateId};
-    if (step != null) {
-      m['step'] = step;
-    }
-    if (frameIndex != null) {
-      m['frameIndex'] = frameIndex;
-    }
-    return _call('resume', m);
-  }
+  Future<Success> resume(String isolateId,
+          {/*StepOption*/ String step, int frameIndex}) =>
+      _call('resume', {
+        'isolateId': isolateId,
+        if (step != null) 'step': step,
+        if (frameIndex != null) 'frameIndex': frameIndex,
+      });
 
   @override
-  Future<Success> setClientName(String name) {
-    return _call('setClientName', {'name': name});
-  }
+  Future<Success> setClientName(String name) =>
+      _call('setClientName', {'name': name});
 
   @override
-  Future<dynamic> setExceptionPauseMode(
-      String isolateId, /*ExceptionPauseMode*/ String mode) {
-    return _call(
-        'setExceptionPauseMode', {'isolateId': isolateId, 'mode': mode});
-  }
+  Future<Success> setExceptionPauseMode(
+          String isolateId, /*ExceptionPauseMode*/ String mode) =>
+      _call('setExceptionPauseMode', {'isolateId': isolateId, 'mode': mode});
 
   @override
-  Future<dynamic> setFlag(String name, String value) {
-    return _call('setFlag', {'name': name, 'value': value});
-  }
+  Future<Response> setFlag(String name, String value) =>
+      _call('setFlag', {'name': name, 'value': value});
 
   @override
-  Future<dynamic> setLibraryDebuggable(
-      String isolateId, String libraryId, bool isDebuggable) {
-    return _call('setLibraryDebuggable', {
-      'isolateId': isolateId,
-      'libraryId': libraryId,
-      'isDebuggable': isDebuggable
-    });
-  }
+  Future<Success> setLibraryDebuggable(
+          String isolateId, String libraryId, bool isDebuggable) =>
+      _call('setLibraryDebuggable', {
+        'isolateId': isolateId,
+        'libraryId': libraryId,
+        'isDebuggable': isDebuggable
+      });
 
   @override
-  Future<dynamic> setName(String isolateId, String name) {
-    return _call('setName', {'isolateId': isolateId, 'name': name});
-  }
+  Future<Success> setName(String isolateId, String name) =>
+      _call('setName', {'isolateId': isolateId, 'name': name});
 
   @override
-  Future<Success> setVMName(String name) {
-    return _call('setVMName', {'name': name});
-  }
+  Future<Success> setVMName(String name) => _call('setVMName', {'name': name});
 
   @override
-  Future<Success> setVMTimelineFlags(List<String> recordedStreams) {
-    return _call('setVMTimelineFlags', {'recordedStreams': recordedStreams});
-  }
+  Future<Success> setVMTimelineFlags(List<String> recordedStreams) =>
+      _call('setVMTimelineFlags', {'recordedStreams': recordedStreams});
 
   @override
-  Future<Success> streamCancel(String streamId) {
-    return _call('streamCancel', {'streamId': streamId});
-  }
+  Future<Success> streamCancel(String streamId) =>
+      _call('streamCancel', {'streamId': streamId});
 
   @override
-  Future<Success> streamListen(String streamId) {
-    return _call('streamListen', {'streamId': streamId});
-  }
+  Future<Success> streamListen(String streamId) =>
+      _call('streamListen', {'streamId': streamId});
 
   /// Call an arbitrary service protocol method. This allows clients to call
   /// methods not explicitly exposed by this library.
@@ -2063,7 +2021,9 @@
     } else {
       Map<String, dynamic> result = json['result'] as Map<String, dynamic>;
       String type = result['type'];
-      if (_typeFactories[type] == null) {
+      if (type == 'Sentinel') {
+        completer.completeError(SentinelException.parse(methodName, result));
+      } else if (_typeFactories[type] == null) {
         completer.complete(Response.parse(result));
       } else {
         completer.complete(createServiceObject(result, returnTypes));
@@ -2116,7 +2076,7 @@
 
 typedef DisposeHandler = Future Function();
 
-class RPCError {
+class RPCError implements Exception {
   static RPCError parse(String callingMethod, dynamic json) {
     return RPCError(callingMethod, json['code'], json['message'], json['data']);
   }
@@ -2139,6 +2099,17 @@
   }
 }
 
+/// Thrown when an RPC response is a [Sentinel].
+class SentinelException implements Exception {
+  final String callingMethod;
+  final Sentinel sentinel;
+
+  SentinelException.parse(this.callingMethod, Map<String, dynamic> data)
+      : sentinel = Sentinel.parse(data);
+
+  String toString() => '$sentinel from ${callingMethod}()';
+}
+
 /// An `ExtensionData` is an arbitrary map that can have any contents.
 class ExtensionData {
   static ExtensionData parse(Map json) =>
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 99a3026..366bd74 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: 3.0.0+1
+version: 4.0.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/async_generator_breakpoint_test.dart b/pkg/vm_service/test/async_generator_breakpoint_test.dart
index 4d52ce4..3cf2655 100644
--- a/pkg/vm_service/test/async_generator_breakpoint_test.dart
+++ b/pkg/vm_service/test/async_generator_breakpoint_test.dart
@@ -48,7 +48,7 @@
 
 Future testAsync(VmService service, IsolateRef isolateRef) async {
   final isolate = await service.getIsolate(isolateRef.id);
-  final lib = await service.getObject(isolate.id, isolate.rootLib.id);
+  final Library lib = await service.getObject(isolate.id, isolate.rootLib.id);
   final script = lib.scripts[0];
 
   final bp1 = await service.addBreakpoint(isolate.id, script.id, 11);
@@ -77,10 +77,10 @@
   // ignore: unawaited_futures
   service
       .evaluate(isolate.id, lib.id, 'testerReady = true')
-      .then((result) async {
-    result = await service.getObject(isolate.id, result.id);
-    print(result);
-    expect((result as Instance).valueAsString, equals('true'));
+      .then((Response result) async {
+    Obj res = await service.getObject(isolate.id, (result as InstanceRef).id);
+    print(res);
+    expect((res as Instance).valueAsString, equals('true'));
   });
 
   final stream = service.onDebugEvent;
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index e5dea67..55edf13 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -117,7 +117,7 @@
   return (VmService service, IsolateRef isolateRef) async {
     print("Setting breakpoint for line $line");
     final isolate = await service.getIsolate(isolateRef.id);
-    final lib = await service.getObject(isolate.id, isolate.rootLib.id);
+    final Library lib = await service.getObject(isolate.id, isolate.rootLib.id);
     final script = lib.scripts.first;
 
     Breakpoint bpt = await service.addBreakpoint(isolate.id, script.id, line);
@@ -139,7 +139,8 @@
     expect(frames.length, greaterThanOrEqualTo(1));
 
     final top = frames[0];
-    final script = await service.getObject(isolate.id, top.location.script.id);
+    final Script script =
+        await service.getObject(isolate.id, top.location.script.id);
     int actualLine = script.getLineNumberFromTokenPos(top.location.tokenPos);
     if (actualLine != line) {
       print("Actual: $actualLine Line: $line");
diff --git a/pkg/vm_service/test/coverage_leaf_function_test.dart b/pkg/vm_service/test/coverage_leaf_function_test.dart
index fe28924..eac959f 100644
--- a/pkg/vm_service/test/coverage_leaf_function_test.dart
+++ b/pkg/vm_service/test/coverage_leaf_function_test.dart
@@ -37,9 +37,11 @@
     expect(stack.frames.length, greaterThanOrEqualTo(1));
     expect(stack.frames[0].function.name, 'testFunction');
 
-    final root = await service.getObject(isolate.id, isolate.rootLib.id);
-    var func = root.functions.singleWhere((f) => f.name == 'leafFunction');
-    func = await service.getObject(isolate.id, func.id);
+    final Library root =
+        await service.getObject(isolate.id, isolate.rootLib.id);
+    FuncRef funcRef =
+        root.functions.singleWhere((f) => f.name == 'leafFunction');
+    Func func = await service.getObject(isolate.id, funcRef.id) as Func;
 
     final expectedRange = {
       'scriptIndex': 0,
@@ -73,9 +75,11 @@
     expect(stack.frames.length, greaterThanOrEqualTo(1));
     expect(stack.frames[0].function.name, 'testFunction');
 
-    final root = await service.getObject(isolate.id, isolate.rootLib.id);
-    var func = root.functions.singleWhere((f) => f.name == 'leafFunction');
-    func = await service.getObject(isolate.id, func.id);
+    final Library root =
+        await service.getObject(isolate.id, isolate.rootLib.id);
+    FuncRef funcRef =
+        root.functions.singleWhere((f) => f.name == 'leafFunction');
+    Func func = await service.getObject(isolate.id, funcRef.id) as Func;
 
     var expectedRange = {
       'scriptIndex': 0,
diff --git a/pkg/vm_service/test/debugging_test.dart b/pkg/vm_service/test/debugging_test.dart
index 8bfefd6..df3a1ed 100644
--- a/pkg/vm_service/test/debugging_test.dart
+++ b/pkg/vm_service/test/debugging_test.dart
@@ -80,16 +80,14 @@
       }
     });
     await service.streamListen(EventStreams.kDebug);
-    final script =
+    final Script script =
         await service.getObject(isolate.id, rootLib.scripts.first.id);
     // Add the breakpoint.
-    final Breakpoint result =
+    final Breakpoint bpt =
         await service.addBreakpoint(isolate.id, script.id, 16);
-    print(result);
-    expect(result is Breakpoint, isTrue);
-    Breakpoint bpt = result;
-    expect(bpt.location.script.id, script.id);
-    expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 16);
+    final SourceLocation location = bpt.location;
+    expect(location.script.id, script.id);
+    expect(script.getLineNumberFromTokenPos(location.tokenPos), 16);
 
     isolate = await service.getIsolate(isolate.id);
     expect(isolate.breakpoints.length, 1);
diff --git a/pkg/vm_service/test/eval_test.dart b/pkg/vm_service/test/eval_test.dart
index b751001..4eb8bb5 100644
--- a/pkg/vm_service/test/eval_test.dart
+++ b/pkg/vm_service/test/eval_test.dart
@@ -45,7 +45,7 @@
     // Make sure we are in the right place.
     expect(stack.frames.length, greaterThanOrEqualTo(2));
     expect(stack.frames[0].function.name, 'method');
-    expect(stack.frames[0].function.owner.name, 'MyClass');
+    expect((stack.frames[0].function.owner as ClassRef).name, 'MyClass');
 
     final LibraryRef lib = isolate.rootLib;
     final ClassRef cls = stack.frames[0].function.owner;
@@ -81,11 +81,12 @@
     // Make sure we are in the right place.
     expect(stack.frames.length, greaterThanOrEqualTo(2));
     expect(stack.frames[0].function.name, 'foo');
-    expect(stack.frames[0].function.owner.name, '_MyClass');
+    expect((stack.frames[0].function.owner as ClassRef).name, '_MyClass');
 
     final ClassRef cls = stack.frames[0].function.owner;
 
-    final result = await service.evaluate(isolate.id, cls.id, "1+1");
+    final InstanceRef result =
+        await service.evaluate(isolate.id, cls.id, "1+1");
     print(result);
     expect(result.valueAsString, "2");
   }
diff --git a/pkg/vm_service/test/evaluate_with_scope_test.dart b/pkg/vm_service/test/evaluate_with_scope_test.dart
index ad4a106..38588d8 100644
--- a/pkg/vm_service/test/evaluate_with_scope_test.dart
+++ b/pkg/vm_service/test/evaluate_with_scope_test.dart
@@ -22,13 +22,13 @@
 final tests = <IsolateTest>[
   (VmService service, IsolateRef isolateRef) async {
     final isolate = await service.getIsolate(isolateRef.id);
-    final lib = await service.getObject(isolate.id, isolate.rootLib.id);
+    final Library lib = await service.getObject(isolate.id, isolate.rootLib.id);
 
-    final field1 = await service.getObject(
+    final Field field1 = await service.getObject(
         isolate.id, lib.variables.singleWhere((v) => v.name == 'thing1').id);
     final thing1 = (await service.getObject(isolate.id, field1.staticValue.id));
 
-    final field2 = await service.getObject(
+    final Field field2 = await service.getObject(
         isolate.id, lib.variables.singleWhere((v) => v.name == 'thing2').id);
     final thing2 = (await service.getObject(isolate.id, field2.staticValue.id));
 
diff --git a/pkg/vm_service/test/get_flag_list_rpc_test.dart b/pkg/vm_service/test/get_flag_list_rpc_test.dart
index f7a8b70..8b6c337 100644
--- a/pkg/vm_service/test/get_flag_list_rpc_test.dart
+++ b/pkg/vm_service/test/get_flag_list_rpc_test.dart
@@ -22,16 +22,14 @@
 var tests = <VMTest>[
   // Modify a flag which does not exist.
   (VmService service) async {
-    final result = await service.setFlag('does_not_exist', 'true');
-    expect(result, TypeMatcher<Error>());
+    final Error result = await service.setFlag('does_not_exist', 'true');
     expect(result.message, 'Cannot set flag: flag not found');
   },
 
   // Modify a flag with the wrong value type.
   (VmService service) async {
-    final result =
+    final Error result =
         await service.setFlag('pause_isolates_on_start', 'not-boolean');
-    expect(result, TypeMatcher<Error>());
     expect(result.message, equals('Cannot set flag: invalid value'));
   },
 
@@ -43,8 +41,7 @@
 
   // Modify a flag which cannot be set at runtime.
   (VmService service) async {
-    final result = await service.setFlag('random_seed', '42');
-    expect(result, TypeMatcher<Error>());
+    final Error result = await service.setFlag('random_seed', '42');
     expect(result.message, 'Cannot set flag: cannot change at runtime');
   },
 
diff --git a/pkg/vm_service/test/invoke_test.dart b/pkg/vm_service/test/invoke_test.dart
index dcbb16e..651e39e 100644
--- a/pkg/vm_service/test/invoke_test.dart
+++ b/pkg/vm_service/test/invoke_test.dart
@@ -31,7 +31,7 @@
   hasStoppedAtBreakpoint,
   (VmService service, IsolateRef isolateRef) async {
     final isolate = await service.getIsolate(isolateRef.id);
-    final lib = await service.getObject(isolate.id, isolate.rootLib.id);
+    final Library lib = await service.getObject(isolate.id, isolate.rootLib.id);
     final cls = lib.classes.singleWhere((cls) => cls.name == "Klass");
     FieldRef fieldRef =
         lib.variables.singleWhere((field) => field.name == "instance");
diff --git a/pkg/vm_service/test/throws_sentinel_test.dart b/pkg/vm_service/test/throws_sentinel_test.dart
new file mode 100644
index 0000000..b399f06
--- /dev/null
+++ b/pkg/vm_service/test/throws_sentinel_test.dart
@@ -0,0 +1,23 @@
+// 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:vm_service/vm_service.dart';
+import 'package:test/test.dart';
+
+import 'common/test_helper.dart';
+
+var tests = <VMTest>[
+  (VmService vm) async {
+    try {
+      final res = await vm.getIsolate('isolates/12321');
+      fail('Expected SentinelException, got $res');
+    } on SentinelException catch (e) {
+      // Expected.
+    } catch (e) {
+      fail('Expected SentinelException, got $e');
+    }
+  },
+];
+
+main([args = const <String>[]]) async => await runVMTests(args, tests);
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 158e24f..eb2e6e8 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -210,7 +210,9 @@
     } else {
       Map<String, dynamic> result = json['result'] as Map<String, dynamic>;
       String type = result['type'];
-      if (_typeFactories[type] == null) {
+      if (type == 'Sentinel') {
+        completer.completeError(SentinelException.parse(methodName, result));
+      } else if (_typeFactories[type] == null) {
         completer.complete(Response.parse(result));
       } else {
         completer.complete(createServiceObject(result, returnTypes));
@@ -265,7 +267,7 @@
 
 typedef DisposeHandler = Future Function();
 
-class RPCError {
+class RPCError implements Exception {
   static RPCError parse(String callingMethod, dynamic json) {
     return RPCError(callingMethod, json['code'], json['message'], json['data']);
   }
@@ -288,6 +290,17 @@
   }
 }
 
+/// Thrown when an RPC response is a [Sentinel].
+class SentinelException implements Exception {
+  final String callingMethod;
+  final Sentinel sentinel;
+
+  SentinelException.parse(this.callingMethod, Map<String, dynamic> data) :
+    sentinel = Sentinel.parse(data);
+
+  String toString() => '$sentinel from ${callingMethod}()';
+}
+
 /// An `ExtensionData` is an arbitrary map that can have any contents.
 class ExtensionData {
   static ExtensionData parse(Map json) =>
@@ -512,11 +525,10 @@
   if (json is List) {
     return json.map((e) => creator(e)).toList();
   } else if (json is Map) {
-    Map<String, dynamic> map = {};
-    for (dynamic key in json.keys) {
-      map[key as String] = json[key];
-    }
-    return creator(map);
+    return creator({
+      for (String key in json.keys)
+        key: json[key],
+    });
   } else {
     // Handle simple types.
     return json;
@@ -1067,35 +1079,31 @@
     if (!hasArgs) {
       gen.writeStatement("=> _call('${name}');");
     } else if (hasOptionalArgs) {
-      gen.writeStatement('{');
-      gen.write('Map m = {');
+      gen.writeStatement("=> _call('$name', {");
       gen.write(args
           .where((MethodArg a) => !a.optional)
-          .map((arg) => "'${arg.name}': ${arg.name}")
-          .join(', '));
-      gen.writeln('};');
+          .map((arg) => "'${arg.name}': ${arg.name},")
+          .join());
+
       args.where((MethodArg a) => a.optional).forEach((MethodArg arg) {
         String valueRef = arg.name;
         // Special case for `getAllocationProfile`. We do not want to add these
         // params if they are false.
         if (name == 'getAllocationProfile') {
-          gen.writeln("if (${arg.name} != null && ${arg.name}) {");
+          gen.writeln("if (${arg.name} != null && ${arg.name})");
         } else {
-          gen.writeln("if (${arg.name} != null) {");
+          gen.writeln("if (${arg.name} != null)");
         }
-        gen.writeln("m['${arg.name}'] = ${valueRef};");
-        gen.writeln("}");
+        gen.writeln("'${arg.name}': $valueRef,");
       });
-      gen.writeStatement("return _call('${name}', m);");
-      gen.writeStatement('}');
+
+      gen.writeln('});');
     } else {
-      gen.writeStatement('{');
-      gen.write("return _call('${name}', {");
+      gen.write("=> _call('${name}', {");
       gen.write(args.map((MethodArg arg) {
         return "'${arg.name}': ${arg.name}";
       }).join(', '));
       gen.writeStatement('});');
-      gen.writeStatement('}');
     }
   }
 
@@ -1115,6 +1123,11 @@
             '${joinLast(returnType.types.map((t) => '[${t}]'), ', ', ' or ')}.';
         _docs = _docs.trim();
       }
+      if (returnType.canReturnSentinel) {
+        _docs +=
+            '\n\nThis method will throw a [SentinelException] in the case a [Sentinel] is returned.';
+        _docs = _docs.trim();
+      }
       if (_docs.isNotEmpty) gen.writeDocs(_docs);
     }
     if (withOverrides) gen.writeln('@override');
@@ -1152,10 +1165,11 @@
 
   MemberType();
 
-  void parse(Parser parser) {
+  void parse(Parser parser, {bool isReturnType = false}) {
     // foo|bar[]|baz
     // (@Instance|Sentinel)[]
     bool loop = true;
+    this.isReturnType = isReturnType;
 
     while (loop) {
       if (parser.consume('(')) {
@@ -1177,7 +1191,11 @@
           parser.expect(']');
           ref.arrayDepth++;
         }
-        types.add(ref);
+        if (isReturnType && ref.name == 'Sentinel') {
+          canReturnSentinel = true;
+        } else {
+          types.add(ref);
+        }
       }
 
       loop = parser.consume('|');
@@ -1187,9 +1205,13 @@
   String get name {
     if (types.isEmpty) return '';
     if (types.length == 1) return types.first.ref;
+    if (isReturnType) return 'Response';
     return 'dynamic';
   }
 
+  bool isReturnType = false;
+  bool canReturnSentinel = false;
+
   bool get isMultipleReturns => types.length > 1;
 
   bool get isSimple => types.length == 1 && types.first.isSimple;
@@ -1928,7 +1950,7 @@
     // method is return type, name, (, args )
     // args is type name, [optional], comma
 
-    method.returnType.parse(this);
+    method.returnType.parse(this, isReturnType: true);
 
     Token t = expectName();
     validate(
diff --git a/runtime/bin/elf_loader.h b/runtime/bin/elf_loader.h
index 759d01e..483fbe79 100644
--- a/runtime/bin/elf_loader.h
+++ b/runtime/bin/elf_loader.h
@@ -37,6 +37,7 @@
 #endif
 
 #if !defined(__Fuchsia__)
+/// Please see documentation for Dart_LoadElf_Fd.
 DART_EXPORT Dart_LoadedElf* Dart_LoadELF(const char* filename,
                                          uint64_t file_offset,
                                          const char** error,
@@ -46,6 +47,7 @@
                                          const uint8_t** vm_isolate_instrs);
 #endif
 
+/// Please see documentation for Dart_LoadElf_Fd.
 DART_EXPORT Dart_LoadedElf* Dart_LoadELF_Memory(
     const uint8_t* snapshot,
     uint64_t snapshot_size,
@@ -55,6 +57,11 @@
     const uint8_t** vm_isolate_data,
     const uint8_t** vm_isolate_instrs);
 
+/// Unloads an ELF object loaded through Dart_LoadELF{_Fd, _Memory}.
+///
+/// Unlike dlclose(), this does not use reference counting.
+/// Dart_LoadELF{_Fd, _Memory} will return load the target library separately
+/// each time it is called, and the results must be unloaded separately.
 DART_EXPORT void Dart_UnloadELF(Dart_LoadedElf* loaded);
 
 #endif  // RUNTIME_BIN_ELF_LOADER_H_
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index 2716d41..ac89688 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -196,7 +196,7 @@
   // when the file is explicitly closed and the finalizer is no longer
   // needed.
   void DeleteWeakHandle(Dart_Isolate isolate) {
-    Dart_DeleteWeakPersistentHandle(isolate, weak_handle_);
+    Dart_DeleteWeakPersistentHandle(weak_handle_);
     weak_handle_ = NULL;
   }
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index eef0f09..0da49b0 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -79,6 +79,7 @@
  * set by any call to Dart_CreateIsolateGroup or Dart_EnterIsolate.
  */
 typedef struct _Dart_Isolate* Dart_Isolate;
+typedef struct _Dart_IsolateGroup* Dart_IsolateGroup;
 
 /**
  * An object reference managed by the Dart VM garbage collector.
@@ -441,8 +442,6 @@
 
 /**
  * Deallocates a persistent handle.
- *
- * Requires there to be a current isolate.
  */
 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object);
 
@@ -456,13 +455,16 @@
  * calling Dart_DeleteWeakPersistentHandle.
  *
  * If the object becomes unreachable the callback is invoked with the weak
- * persistent handle and the peer as arguments. The callback is invoked on the
- * thread that has entered the isolate at the time of garbage collection. This
- * gives the embedder the ability to cleanup data associated with the object and
- * clear out any cached references to the handle. All references to this handle
- * after the callback will be invalid. It is illegal to call into the VM from
- * the callback. If the handle is deleted before the object becomes unreachable,
- * the callback is never invoked.
+ * persistent handle and the peer as arguments. The callback can be executed
+ * on any thread, will not have a current isolate, and can only call
+ * Dart_DeletePersistentHandle or Dart_DeleteWeakPersistentHandle. The callback
+ * must not call Dart_DeleteWeakPersistentHandle for the handle being finalized,
+ * as it is automatically deleted by the VM after the callback returns.
+ * This gives the embedder the ability to cleanup data associated with the
+ * object and clear out any cached references to the handle. All references to
+ * this handle after the callback will be invalid. It is illegal to call into
+ * the VM from the callback. If the handle is deleted before the object becomes
+ * unreachable, the callback is never invoked.
  *
  * Requires there to be a current isolate.
  *
@@ -485,7 +487,6 @@
                              Dart_WeakPersistentHandleFinalizer callback);
 
 DART_EXPORT void Dart_DeleteWeakPersistentHandle(
-    Dart_Isolate isolate,
     Dart_WeakPersistentHandle object);
 
 /*
@@ -992,6 +993,12 @@
 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate);
 
 /**
+ * Returns the current isolate group. Will return NULL if there is no
+ * current isolate group.
+ */
+DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup();
+
+/**
  * Returns the callback data associated with the current isolate group. This
  * data was passed to the isolate group when it was created.
  */
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 79af3a3..47ead67 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -325,8 +325,7 @@
   // the function so that we can reuse the function for each c function with
   // the same signature.
   const Context& context = Context::Handle(Context::New(1));
-  context.SetAt(0,
-                Integer::Handle(zone, Integer::New(pointer.NativeAddress())));
+  context.SetAt(0, pointer);
 
   return Closure::New(Object::null_type_arguments(),
                       Object::null_type_arguments(), function, context,
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 4311238..502fe47 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -20,8 +20,8 @@
   const Array& fun_arg_names =
       Array::CheckedHandle(zone, arguments->NativeArgAt(1));
   const Array& fun_args_desc = Array::Handle(
-      zone, ArgumentsDescriptor::New(kTypeArgsLen, fun_arguments.Length(),
-                                     fun_arg_names));
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, fun_arguments.Length(),
+                                          fun_arg_names));
   const Object& result = Object::Handle(
       zone, DartEntry::InvokeClosure(fun_arguments, fun_args_desc));
   if (result.IsError()) {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index bb59896..e931966 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1510,7 +1510,7 @@
 
   const int kTypeArgsLen = 0;
   const Array& args_descriptor_array = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), arg_names));
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), arg_names));
 
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   if (!redirected_constructor.AreValidArguments(args_descriptor, NULL)) {
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 4463e66..acdaddc 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -320,11 +320,11 @@
   Array& args_desc = Array::Handle(zone);
   Array& args = Array::Handle(zone);
   if (extracted_type_args.IsNull()) {
-    args_desc = ArgumentsDescriptor::New(0, 1);
+    args_desc = ArgumentsDescriptor::NewBoxed(0, 1);
     args = Array::New(1);
     args.SetAt(0, extract);
   } else {
-    args_desc = ArgumentsDescriptor::New(num_type_args, 1);
+    args_desc = ArgumentsDescriptor::NewBoxed(num_type_args, 1);
     args = Array::New(2);
     args.SetAt(0, extracted_type_args);
     args.SetAt(1, extract);
diff --git a/runtime/tests/vm/dart/dylib_utils.dart b/runtime/tests/vm/dart/dylib_utils.dart
new file mode 100644
index 0000000..75ba33b
--- /dev/null
+++ b/runtime/tests/vm/dart/dylib_utils.dart
@@ -0,0 +1,26 @@
+// 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:ffi' as ffi;
+import 'dart:io' show Platform;
+
+String _platformPath(String name, {String path}) {
+  if (path == null) path = "";
+  if (Platform.isLinux || Platform.isAndroid)
+    return path + "lib" + name + ".so";
+  if (Platform.isMacOS) return path + "lib" + name + ".dylib";
+  if (Platform.isWindows) return path + name + ".dll";
+  throw Exception("Platform not implemented");
+}
+
+ffi.DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
+  String fullPath = _platformPath(name, path: path);
+  return ffi.DynamicLibrary.open(fullPath);
+}
+
+ffi.DynamicLibrary ffiTestFunctions =
+    dlopenPlatformSpecific("ffi_test_functions");
+
+final triggerGc = ffiTestFunctions
+    .lookupFunction<ffi.Void Function(), void Function()>("TriggerGC");
diff --git a/runtime/tests/vm/dart/regress_40754_test.dart b/runtime/tests/vm/dart/regress_40754_test.dart
index 82a2ce0..a532eb2 100644
--- a/runtime/tests/vm/dart/regress_40754_test.dart
+++ b/runtime/tests/vm/dart/regress_40754_test.dart
@@ -2,3247 +2,43 @@
 // 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=1 --use-slow-path --old_gen_heap_size=128
+// VMOptions=--deterministic --optimization_counter_threshold=1
 
-// Regression test for https://dartbug.com/40754.
-// Generated using the Dart Project Fuzz Tester (1.88) as follows:
-//   dart dartfuzz.dart --seed 1031911076 --no-fp --no-ffi --no-flat
+// A phi can have Smi type but non-Smi bounds if it is dominated by a smi check
+// which always deoptimizes. Test that bounds check generalizer guards against
+// such situations.
 
-import 'dart:async';
-import 'dart:cli';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:core';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
+@pragma('vm:prefer-inline')
+int checkSmi(int a) => ~a;
 
-MapEntry<MapEntry<int, String>, String> var0 =
-    MapEntry<MapEntry<int, String>, String>(
-        MapEntry<int, String>(19, '+-SE#'), '');
-Map<Expando<bool>, Set<String>> var1 = {
-  Expando<bool>('@'): {'O', 'qgLHC', 's\u{1f600}3', 'yiC-', 'q4Z'},
-  new Expando<bool>(''): {'\u{1f600}'},
-  Expando<bool>('DlE9'): {'-qYQYbD', 'y\u26659G\u2665T', '\u2665T9 ', 'od04C'},
-  Expando<bool>('ogdgHz\u{1f600}'): {
-    'gxNA',
-    'c8@uUZJ',
-    '\u{1f600}h)yo',
-    'Kactwvm'
-  },
-  Expando<bool>('wB+Y'): {'WtyR5#K', 'bz1'}
-};
-MapEntry<Set<int>, MapEntry<bool, int>> var2 =
-    new MapEntry<Set<int>, MapEntry<bool, int>>({
-  ...{-93, 49},
-  -39,
-  4,
-  48,
-  -87,
-  2147483647
-}, MapEntry<bool, int>(false, 16));
-Endian var3 = (Endian.host);
-ByteData var4 = ByteData(34);
-Int8List var5 = Int8List(26);
-Uint8List var6 =
-    Uint8List.fromList([-9223372034707292161, if (true) 31, -47, -2147483647]);
-Uint8ClampedList var7 = Uint8ClampedList(39);
-Int16List var8 = Int16List.fromList(Int32List.fromList([-26, 31, -12, 28]));
-Uint16List var9 = Uint16List(40);
-Int32List var10 = Int32List.fromList(new Uint32List(45));
-Uint32List var11 = Uint32List.fromList(Int8List(9));
-Int64List var12 = Int64List(12);
-Uint64List var13 = Uint64List.fromList(new Uint64List(5));
-Int32x4List var14 = new Int32x4List(4);
-Int32x4 var15 = Int32x4(2, 32, 22, 12);
-Deprecated var16 = Deprecated('');
-Provisional var17 = Provisional();
-bool var18 = bool.fromEnvironment('4)eAkmb');
-Duration var19 = Duration();
-Error var20 = Error();
-AssertionError var21 = AssertionError(39);
-TypeError var22 = TypeError();
-CastError var23 = CastError();
-NullThrownError var24 = NullThrownError();
-ArgumentError var25 = ArgumentError.value(1, '', 3);
-RangeError var26 = RangeError.index(47, 25, '\u2665&69D', 'cE(L', 2);
-IndexError var27 = IndexError(3, 29, '', 'N7u', 27);
-FallThroughError var28 = FallThroughError();
-AbstractClassInstantiationError var29 =
-    AbstractClassInstantiationError('2xjF8');
-UnsupportedError var30 = UnsupportedError('eH\u{1f600}');
-UnimplementedError var31 = UnimplementedError('k@\u{1f600}!\u{1f600}(');
-StateError var32 = StateError('8\u2665YK');
-ConcurrentModificationError var33 = ConcurrentModificationError(14);
-StackOverflowError var34 = StackOverflowError();
-CyclicInitializationError var35 = CyclicInitializationError('L37w3tb');
-Exception var36 = Exception(45);
-FormatException var37 = FormatException('7Xe@ ', 9, 34);
-IntegerDivisionByZeroException var38 = IntegerDivisionByZeroException();
-int var39 = 7;
-Null var40 = null;
-num var41 = 18;
-RegExp var42 = RegExp('Lz');
-String var43 = 'v';
-Runes var44 = new Runes('ax\u2665CO(l');
-RuneIterator var45 = RuneIterator(' u');
-StringBuffer var46 = StringBuffer(0);
-Symbol var47 = Symbol('z');
-Expando<bool> var48 = Expando<bool>('!)sO2');
-Expando<int> var49 = new Expando<int>('DUk');
-Expando<String> var50 = Expando<String>('Hj3!!');
-List<bool> var51 = [false, false, true];
-List<int> var52 = Uint8List(26);
-List<String> var53 = ['yPUIV\u{1f600}M', '1T'];
-Set<bool> var54 = {false, true, true, true, true};
-Set<int> var55 = {
-  ...{26},
-  37,
-  16
-};
-Set<String> var56 = {'FZClYgD'};
-Map<bool, bool> var57 = {true: true, true: false, true: true};
-Map<bool, int> var58 = {
-  true: -79,
-  false: 38,
-  false: -40,
-  false: 12,
-  false: 4,
-  false: -18
-};
-Map<bool, String> var59 = {
-  true: '',
-  true: '5',
-  false: 'JfkI',
-  true: '\u{1f600}T\u26651',
-  false: 'a'
-};
-Map<int, bool> var60 = {20: false, 11: true};
-Map<int, int> var61 = {
-  -77: -9223372034707292161,
-  -55: -65,
-  4294967296: 22,
-  19: -32,
-  13: -9223372032559808513,
-  -89: -46
-};
-Map<int, String> var62 = {
-  if (true) -51: 'IKA' else -88: 'L0TX',
-  -74: '',
-  -74: 'fnNp\u2665',
-  -9223372030412324864: ''
-};
-Map<String, bool> var63 = {'V\u{1f600}hhZ': false, '1M#': false};
-Map<String, int> var64 = {
-  'J': 7,
-  '': -19,
-  'z4\u2665ui': 0,
-  '8mdYgX&': 49,
-  '(VIc-': 0,
-  '7w1O3AT': -19
-};
-Map<String, String> var65 = {
-  'D': 'WkN9WV@',
-  'Giujsb': '\u{1f600}',
-  'JBI': '\u{1f600}\u{1f600}',
-  '3 2+EF': '',
-  '': '',
-  '6': 'hEQj'
-};
-MapEntry<bool, bool> var66 = MapEntry<bool, bool>(true, true);
-MapEntry<bool, int> var67 = new MapEntry<bool, int>(true, 19);
-MapEntry<bool, String> var68 = MapEntry<bool, String>(false, 'mLO8E');
-MapEntry<int, bool> var69 = MapEntry<int, bool>(46, true);
-MapEntry<int, int> var70 = new MapEntry<int, int>(18, 34);
-MapEntry<int, String> var71 = MapEntry<int, String>(31, '4W-');
-MapEntry<String, bool> var72 = MapEntry<String, bool>('8D\u2665jJiM', true);
-MapEntry<String, int> var73 = MapEntry<String, int>('w', 0);
-MapEntry<String, String> var74 = MapEntry<String, String>('zCHHK', '');
-Expando<Expando<bool>> var75 = Expando<Expando<bool>>('Q');
-Expando<Expando<int>> var76 = Expando<Expando<int>>('');
-Expando<Expando<String>> var77 = Expando<Expando<String>>('NR-n');
-Expando<List<bool>> var78 = Expando<List<bool>>('WYs\u2665');
-Expando<List<int>> var79 = Expando<List<int>>('yAg\u26659cO');
-Expando<List<String>> var80 = Expando<List<String>>('');
-Expando<Set<bool>> var81 = Expando<Set<bool>>('Y9!');
-Expando<Set<int>> var82 = Expando<Set<int>>('8!hTXx');
-Expando<Set<String>> var83 = Expando<Set<String>>('');
-Expando<Map<bool, bool>> var84 = Expando<Map<bool, bool>>('IDlgb!Y');
-Expando<Map<bool, int>> var85 = Expando<Map<bool, int>>('ybQ');
-Expando<Map<bool, String>> var86 = Expando<Map<bool, String>>('');
-Expando<Map<int, bool>> var87 = new Expando<Map<int, bool>>('ACW+SP');
-Expando<Map<int, int>> var88 = Expando<Map<int, int>>('d&N\u{1f600}L\u26652');
-Expando<Map<int, String>> var89 = Expando<Map<int, String>>('v\u2665\u2665');
-Expando<Map<String, bool>> var90 =
-    Expando<Map<String, bool>>('i\u{1f600}\u2665i1');
-Expando<Map<String, int>> var91 = Expando<Map<String, int>>('@9');
-Expando<Map<String, String>> var92 = Expando<Map<String, String>>('MO');
-Expando<MapEntry<bool, bool>> var93 = new Expando<MapEntry<bool, bool>>('n');
-Expando<MapEntry<bool, int>> var94 = Expando<MapEntry<bool, int>>('X7J@');
-Expando<MapEntry<bool, String>> var95 = Expando<MapEntry<bool, String>>('@pN');
-Expando<MapEntry<int, bool>> var96 = Expando<MapEntry<int, bool>>('');
-Expando<MapEntry<int, int>> var97 = Expando<MapEntry<int, int>>('XYpFl');
-Expando<MapEntry<int, String>> var98 =
-    new Expando<MapEntry<int, String>>('o+\u{1f600}i');
-Expando<MapEntry<String, bool>> var99 = Expando<MapEntry<String, bool>>('!2');
-Expando<MapEntry<String, int>> var100 = Expando<MapEntry<String, int>>('lv!x');
-Expando<MapEntry<String, String>> var101 =
-    Expando<MapEntry<String, String>>('X+\u2665Vsi');
-List<Expando<bool>> var102 = [
-  Expando<bool>('A\u{1f600}'),
-  Expando<bool>('u\u{1f600}In'),
-  Expando<bool>('(VN#zT\u2665')
-];
-List<Expando<int>> var103 = [
-  Expando<int>('!oMzu!6'),
-  new Expando<int>('n)NK6u'),
-  Expando<int>('ZR'),
-  Expando<int>('\u2665Acscbv')
-];
-List<Expando<String>> var104 = [
-  new Expando<String>('A&'),
-  Expando<String>('zqB'),
-  Expando<String>('X'),
-  new Expando<String>('q7')
-];
-List<List<bool>> var105 = [
-  [false, false, false],
-  [false, true, true],
-  [false, true],
-  [true],
-  [false, false, false, false, true]
-];
-List<List<int>> var106 = [
-  Uint8List(44),
-  Uint16List.fromList(new Int16List(36)),
-  Uint16List.fromList(Uint16List.fromList([-9223372032559808512])),
-  Uint32List(39)
-];
-List<List<String>> var107 = [
-  ['j45\u2665', 'S+wOIx!', 'bU4', 'AJnYc', '+zzgHB\u{1f600}']
-];
-List<Set<bool>> var108 = [
-  {true, false, true, false},
-  {true},
-  {true, false, false, false}
-];
-List<Set<int>> var109 = [
-  {9223372034707292159, -43},
-  {5, 9223372032559808513, 21, 18},
-  {32, -1, -99, 30}
-];
-List<Set<String>> var110 = [
-  {'0g7'}
-];
-List<Map<bool, bool>> var111 = [
-  {true: true, true: true, true: true, false: true, true: true},
-  {false: true, true: false},
-  {false: false, true: false, true: true, true: false, true: false}
-];
-List<Map<bool, int>> var112 = [
-  {true: 38},
-  {true: 13, true: -70, true: -95, false: -75},
-  {false: 21, true: 6, true: 9223372032559808513, true: -49},
-  {true: -20, true: -37, true: -81},
-  {true: -38, false: -60}
-];
-List<Map<bool, String>> var113 = [
-  {true: 'M@&hDh!', false: 'pLZ', false: '', true: 'p'},
-  {false: '', true: 'A', false: 'bs', true: 'i', true: 'Sg'},
-  {
-    true: 'bt5c!\u{1f600}C',
-    true: 'R\u{1f600}S',
-    true: 'c)H\u{1f600}',
-    false: '5',
-    false: '9j\u{1f600}qKm'
-  }
-];
-List<Map<int, bool>> var114 = [
-  {-9223372030412324864: true, -50: true},
-  {-54: true}
-];
-List<Map<int, int>> var115 = [
-  {-78: 10, 40: -65, -73: 1, 33: 6},
-  {-47: 0, -66: -97, -9223372036854775807: -2, -97: -42, -83: -50},
-  {38: 10, 16: 40, -60: -9223372036854775808, -23: -35},
-  {-15: 41, 12: -67, 5: -38},
-  {9: -37, -78: -62, -19: 34, -79: -93, 36: 17}
-];
-List<Map<int, String>> var116 = [
-  {
-    -47: 'g\u26654NBt',
-    -82: 'wN9UP7',
-    38: '6fg',
-    -1: '!k)',
-    -40: '!cug\u{1f600}'
-  },
-  {46: '7U)Wz+', -4294967296: 'CD0J', 24: ''},
-  {16: '', 41: '#@4de#z'},
-  {5: 'Q7', 21: 'k', 12: 'STLg9M\u2665'}
-];
-List<Map<String, bool>> var117 = [
-  {'U#\u2665#V': true, '\u2665': true, 'r7\u2665T-Gr': false},
-  {
-    'E)8EJ': true,
-    'DOsPU\u{1f600}\u2665': false,
-    'K\u2665': true,
-    'Yhl': true,
-    'D': false
-  },
-  {'FIH': true, 'fxPsEC': false, '': false},
-  {
-    'TkVR': false,
-    '1#\u2665L\u2665@q': false,
-    'rxmO-\u{1f600}i': true,
-    'fF5yl': false,
-    'ePZ': false
-  },
-  {
-    'gVFAQt&': false,
-    '-7': true,
-    '4t\u2665)uP': false,
-    '\u{1f600}': false,
-    'p': true
-  },
-  {'OPH': true, '+8\u{1f600}': true, 'Tgn\u2665o': true}
-];
-List<Map<String, int>> var118 = [
-  {'D)': 9223372036854775807, '': -63, '0-': -4}
-];
-List<Map<String, String>> var119 = [
-  {'1': 'W9dogx ', 'UL1': '', '': 'R&', 'O)': 'l!\u2665r9'},
-  {
-    '\u{1f600}lE1(xL': '\u26656',
-    'kAm': '',
-    'y\u{1f600}\u2665Fd2': '\u{1f600}WLZtuP',
-    'qe2': '7nkDI'
-  }
-];
-List<MapEntry<bool, bool>> var120 = [
-  MapEntry<bool, bool>(true, false),
-  MapEntry<bool, bool>(true, false),
-  MapEntry<bool, bool>(false, true),
-  MapEntry<bool, bool>(false, true)
-];
-List<MapEntry<bool, int>> var121 = [
-  MapEntry<bool, int>(false, 27),
-  MapEntry<bool, int>(true, 12),
-  MapEntry<bool, int>(true, 47),
-  MapEntry<bool, int>(true, 36),
-  MapEntry<bool, int>(true, 11)
-];
-List<MapEntry<bool, String>> var122 = [
-  MapEntry<bool, String>(false, 'goNsM3'),
-  MapEntry<bool, String>(true, 'qWMG')
-];
-List<MapEntry<int, bool>> var123 = [
-  MapEntry<int, bool>(28, false),
-  MapEntry<int, bool>(15, true),
-  MapEntry<int, bool>(40, false),
-  MapEntry<int, bool>(40, true)
-];
-List<MapEntry<int, int>> var124 = [
-  MapEntry<int, int>(40, 38),
-  MapEntry<int, int>(0, 28),
-  MapEntry<int, int>(37, 27),
-  new MapEntry<int, int>(36, 24)
-];
-List<MapEntry<int, String>> var125 = [
-  MapEntry<int, String>(12, 'Okr1o'),
-  MapEntry<int, String>(47, ''),
-  MapEntry<int, String>(38, '')
-];
-List<MapEntry<String, bool>> var126 = [
-  MapEntry<String, bool>('j3A&J', true),
-  MapEntry<String, bool>('', true),
-  new MapEntry<String, bool>('', true),
-  MapEntry<String, bool>('AO2n&\u2665a', true)
-];
-List<MapEntry<String, int>> var127 = [
-  MapEntry<String, int>('ljJxBQ', 29),
-  MapEntry<String, int>('', 24),
-  MapEntry<String, int>('\u2665DH', 17),
-  MapEntry<String, int>('', 10),
-  MapEntry<String, int>('FI\u{1f600}a', 23)
-];
-List<MapEntry<String, String>> var128 = [
-  MapEntry<String, String>('\u26656NjP\u{1f600}\u2665', ''),
-  MapEntry<String, String>('+zt)ouN', '6e'),
-  MapEntry<String, String>('y\u{1f600}r', '(HStKU'),
-  MapEntry<String, String>('ZFRAix\u{1f600}', 'Z5Bla'),
-  MapEntry<String, String>('OmP', 'YdU'),
-  MapEntry<String, String>('yS\u{1f600}z!Op', 'DkIb\u2665ID')
-];
-Set<Expando<bool>> var129 = {
-  Expando<bool>('f\u{1f600}79C0#'),
-  Expando<bool>('c\u{1f600}m&'),
-  Expando<bool>(''),
-  Expando<bool>(''),
-  Expando<bool>('32K(pJk'),
-  Expando<bool>('l21ecJH')
-};
-Set<Expando<int>> var130 = {
-  Expando<int>('QyX2'),
-  Expando<int>('PN'),
-  Expando<int>('i9'),
-  Expando<int>('-'),
-  Expando<int>('F')
-};
-Set<Expando<String>> var131 = {Expando<String>('-!\u{1f600}')};
-Set<List<bool>> var132 = {
-  [true, true, false],
-  [true, false, false, true, false],
-  [true],
-  [true, true, false, false, false],
-  [true, false],
-  [false, true, false, true]
-};
-Set<List<int>> var133 = {
-  Int16List.fromList(Uint16List.fromList(Int8List(12))),
-  Int8List(1),
-  [18, 36, -2147483647]
-};
-Set<List<String>> var134 = {
-  ['', 'j5EUr3', 'T', ')irWN'],
-  ['2tNSf9', '@', ')ed'],
-  ['jq)', 'O!Zd8', 'YX8P', 'lJ0'],
-  ['aA!kqj9', 'J36M#8J', '\u2665a2i-)', 'S\u2665', 't1o ']
-};
-Set<Set<bool>> var135 = {
-  {true, false},
-  {true},
-  {false}
-};
-Set<Set<int>> var136 = {
-  {-36, -2147483647, -21, 2, 2},
-  {-43, 34},
-  {-18, 4294967295},
-  {-63, -82}
-};
-Set<Set<String>> var137 = {
-  {'O', '\u{1f600}fCb+', 'NC6FO', '7Si'}
-};
-Set<Map<bool, bool>> var138 = {
-  {false: true, true: false, true: true, true: false}
-};
-Set<Map<bool, int>> var139 = {
-  {false: -54, true: 4294967295, false: -49},
-  {false: 6442450945},
-  {
-    false: 6442450945,
-    false: 35,
-    true: -32,
-    true: -9223372036854775808,
-    false: 49
-  }
-};
-Set<Map<bool, String>> var140 = {
-  {true: 'B(94 (', false: 'tvuL@S', true: 'Aue\u{1f600}#!', false: 'FeX'},
-  {false: 'O\u2665a', false: 'W2kR', false: 'wP6\u{1f600}6R', true: 'py'},
-  {false: '3tPk9t'},
-  {false: 'Fi', true: 'IKO'},
-  {false: '6'}
-};
-Set<Map<int, bool>> var141 = {
-  {-26: true}
-};
-Set<Map<int, int>> var142 = {
-  {-26: 48, -4: -48, -4294967295: -55},
-  {-31: -0, 9: 9},
-  {37: -71, 39: -15, 42: 41, 11: 31, 21: -59},
-  {-77: -21, 47: 3},
-  {-46: -49, -25: -70},
-  {-1: 1, -29: -80, -77: -55, 30: 33}
-};
-Set<Map<int, String>> var143 = {
-  {-99: 'Lj\u{1f600}PWm', 45: 'HK\u{1f600}u9F', -92: '+nv1\u2665#'}
-};
-Set<Map<String, bool>> var144 = {
-  {'#4ADh\u2665i': true, 'z': false, '': true}
-};
-Set<Map<String, int>> var145 = {
-  {'-\u2665nkOj': 9223372032559808513, 'rl': -58, 'R': 1, 'phO': 20}
-};
-Set<Map<String, String>> var146 = {
-  {'&-o-M': '2afIi'},
-  {'': 'fH@B', 'rHg': 'vla@UWl', 'y': 'tAy', 'b&z\u{1f600}': 'V0Lf'},
-  {'a#zRRn\u2665': '-4 ', '\u{1f600}q&5': 'js'},
-  {'f': ''},
-  {'UnD4F': 'm', '': '', '5&7': 'hyKT'}
-};
-Set<MapEntry<bool, bool>> var147 = {MapEntry<bool, bool>(true, true)};
-Set<MapEntry<bool, int>> var148 = {
-  MapEntry<bool, int>(false, 35),
-  MapEntry<bool, int>(false, 19),
-  MapEntry<bool, int>(true, 21)
-};
-Set<MapEntry<bool, String>> var149 = {
-  MapEntry<bool, String>(false, '\u26652&'),
-  MapEntry<bool, String>(true, 'j#+5G2'),
-  new MapEntry<bool, String>(true, 'n\u2665-\u{1f600}'),
-  MapEntry<bool, String>(true, 'e'),
-  MapEntry<bool, String>(false, 'GC\u{1f600}D')
-};
-Set<MapEntry<int, bool>> var150 = {
-  new MapEntry<int, bool>(8, true),
-  MapEntry<int, bool>(39, false),
-  MapEntry<int, bool>(21, false),
-  MapEntry<int, bool>(33, false)
-};
-Set<MapEntry<int, int>> var151 = {
-  new MapEntry<int, int>(18, 8),
-  MapEntry<int, int>(33, 0),
-  MapEntry<int, int>(26, 30)
-};
-Set<MapEntry<int, String>> var152 = {
-  new MapEntry<int, String>(49, 'a(\u{1f600}Vfh'),
-  new MapEntry<int, String>(38, '7Oh')
-};
-Set<MapEntry<String, bool>> var153 = {
-  MapEntry<String, bool>('xD8P7', false),
-  MapEntry<String, bool>('838', true),
-  MapEntry<String, bool>('', true)
-};
-Set<MapEntry<String, int>> var154 = {MapEntry<String, int>('#nRvj', 18)};
-Set<MapEntry<String, String>> var155 = {
-  MapEntry<String, String>('Y', 'T'),
-  MapEntry<String, String>('\u{1f600}\u{1f600}XO8(d', 'k)h'),
-  MapEntry<String, String>('', 'ke5D\u{1f600}6'),
-  MapEntry<String, String>('', '@Z&1'),
-  MapEntry<String, String>('pBF', 'A66')
-};
-Map<bool, Expando<bool>> var156 = {
-  false: Expando<bool>('p@Pa'),
-  false: Expando<bool>('Bhx5a\u{1f600}o'),
-  true: Expando<bool>('\u2665Uxh8Gw'),
-  true: Expando<bool>('j5'),
-  false: Expando<bool>('CzxY'),
-  false: Expando<bool>('cPL\u2665')
-};
-Map<bool, Expando<int>> var157 = {
-  true: Expando<int>('MhPZ'),
-  true: new Expando<int>('#\u{1f600}@yDZv'),
-  true: new Expando<int>('7('),
-  true: Expando<int>('83ns')
-};
-Map<bool, Expando<String>> var158 = {
-  true: Expando<String>('Ns'),
-  true: Expando<String>('JW'),
-  false: Expando<String>('(y'),
-  true: Expando<String>('\u2665j!'),
-  false: Expando<String>('M')
-};
-Map<bool, List<bool>> var159 = {
-  true: [false, false, true, true, false],
-  false: [true, false, true]
-};
-Map<bool, List<int>> var160 = {
-  false: [29],
-  true: Int16List.fromList(Int32List(10))
-};
-Map<bool, List<String>> var161 = {
-  true: ['y1H', '2&5', 'pNYYu', '', ''],
-  false: ['8B', 'd4AJIL ', '\u26652u-T', 'in\u2665', ''],
-  false: ['\u{1f600}Hv-y\u2665k', '\u{1f600}tn\u2665\u2665'],
-  true: ['gKZ', '2IG\u2665IV', 'P(9Ky', ''],
-  false: ['4', '', 'kKUG@']
-};
-Map<bool, Set<bool>> var162 = {
-  false: {true}
-};
-Map<bool, Set<int>> var163 = {
-  false: {6442450944, -56, -72}
-};
-Map<bool, Set<String>> var164 = {
-  false: {'zleg', 'g', 'H\u{1f600}a()!6', '\u{1f600}0mTmy', 'Y'},
-  false: {'g\u2665cOb', 'k28F', 'Q', '24XsZ\u2665'},
-  false: {'ct\u2665\u2665#'},
-  true: {'miy'}
-};
-Map<bool, Map<bool, bool>> var165 = {
-  false: {true: false},
-  true: {false: false, false: true, true: false, false: true},
-  false: {false: false, false: false, true: true}
-};
-Map<bool, Map<bool, int>> var166 = {
-  false: {true: 35, true: 42, false: -82, false: 45},
-  true: {true: -23, false: -52, true: -81},
-  true: {false: 45, true: -9223372030412324864, true: -60, true: 34, false: 0},
-  false: {true: 17, true: -3},
-  false: {true: -4294967296}
-};
-Map<bool, Map<bool, String>> var167 = {
-  false: {false: 'jV\u2665l'},
-  false: {true: 'FWaNQP', false: 'w'},
-  false: {false: 'it'},
-  false: {true: 'x', true: 'AU3e-v', true: 'Kh\u2665b47&', false: 'u#1\u2665'},
-  true: {true: '1', true: 'WDi-X', true: 'vw+\u{1f600}&', true: '3vT'}
-};
-Map<bool, Map<int, bool>> var168 = {
-  true: {15: true, 14: false, 4294967297: false, -53: false, 6442450944: true},
-  false: {-9223372030412324863: true},
-  false: {-8: true, -22: false, 49: true, -0: false, -17: true},
-  false: {-60: false, 35: false, 21: false}
-};
-Map<bool, Map<int, int>> var169 = {
-  false: {42: -51, -9223372034707292159: -14, -42: 6, 46: 21},
-  false: {-9223372034707292160: -51, -91: -61, 23: -98, -27: 47},
-  false: {-78: 38},
-  true: {42: -0},
-  true: {
-    -9223372032559808512: -9,
-    -13: -9223372028264841217,
-    -43: -63,
-    15: -46,
-    -4294967296: 47
-  }
-};
-Map<bool, Map<int, String>> var170 = {
-  false: {48: 'ScV', 38: '9IzTK9', 3: 'sNeS', -67: 'YSt3\u{1f600}#'},
-  true: {1: 'iEaGC+', 40: 'YBb\u{1f600}Htx', -55: 'd\u{1f600}y9wk'},
-  true: {-2147483647: '+c'},
-  true: {-1: ''},
-  true: {
-    9223372032559808512: '\u2665NgRZ3B',
-    -94: 'J23',
-    -33: '',
-    -37: 'p(\u2665X\u{1f600}',
-    17: 'oN'
-  },
-  true: {
-    -3: 'MJW1tbq',
-    34: '6\u{1f600}e@p-5',
-    2147483648: 'CVT\u{1f600}',
-    48: '9'
-  }
-};
-Map<bool, Map<String, bool>> var171 = {
-  false: {
-    'yoczgj(': false,
-    '\u26659': false,
-    'bT-J35': false,
-    '': false,
-    'rdg(DC': true
-  },
-  true: {
-    'c\u{1f600}': true,
-    '-#V-e': true,
-    'mB0-#\u2665': true,
-    'S': true,
-    '\u2665)-q': true
-  },
-  false: {'E2sIO3Z': true, 'wJ\u{1f600}Dy\u2665X': false}
-};
-Map<bool, Map<String, int>> var172 = {
-  false: {
-    'G\u{1f600}B': 38,
-    '!ROypT': 46,
-    '\u2665oG': -9223372032559808511,
-    'CWqV\u2665': -25,
-    '-e\u{1f600}f': -78
-  },
-  true: {'': 34, 'nPqlU\u2665': 31, '\u{1f600}J#': 9, 'ED9gj': 22}
-};
-Map<bool, Map<String, String>> var173 = {
-  false: {'59HUX( ': 'sQZPA', '3': '3a'}
-};
-Map<bool, MapEntry<bool, bool>> var174 = {
-  false: MapEntry<bool, bool>(true, false),
-  true: MapEntry<bool, bool>(true, true)
-};
-Map<bool, MapEntry<bool, int>> var175 = {
-  false: MapEntry<bool, int>(true, 21),
-  false: MapEntry<bool, int>(false, 23),
-  false: MapEntry<bool, int>(true, 35),
-  false: MapEntry<bool, int>(false, 30),
-  false: new MapEntry<bool, int>(false, 30)
-};
-Map<bool, MapEntry<bool, String>> var176 = {
-  true: MapEntry<bool, String>(true, '0t7!-')
-};
-Map<bool, MapEntry<int, bool>> var177 = {
-  false: MapEntry<int, bool>(47, true),
-  true: MapEntry<int, bool>(16, false),
-  false: MapEntry<int, bool>(18, true),
-  false: MapEntry<int, bool>(12, true),
-  true: MapEntry<int, bool>(41, false),
-  true: MapEntry<int, bool>(4, false)
-};
-Map<bool, MapEntry<int, int>> var178 = {
-  true: new MapEntry<int, int>(3, 37),
-  false: MapEntry<int, int>(4, 37),
-  false: MapEntry<int, int>(6, 36),
-  false: MapEntry<int, int>(26, 31),
-  true: MapEntry<int, int>(28, 7)
-};
-Map<bool, MapEntry<int, String>> var179 = {
-  false: MapEntry<int, String>(45, 'H'),
-  true: MapEntry<int, String>(47, 'B\u2665awZ(i'),
-  true: MapEntry<int, String>(36, '\u{1f600}P'),
-  false: MapEntry<int, String>(18, 'xzDll')
-};
-Map<bool, MapEntry<String, bool>> var180 = {
-  false: MapEntry<String, bool>('11vn9O', false),
-  true: MapEntry<String, bool>('x2i7@O', false),
-  true: MapEntry<String, bool>('#5\u{1f600}khw', true),
-  true: MapEntry<String, bool>('47W+F', true),
-  false: MapEntry<String, bool>('(NpA', false),
-  false: MapEntry<String, bool>('', true)
-};
-Map<bool, MapEntry<String, int>> var181 = {
-  false: MapEntry<String, int>('JNX', 19),
-  true: MapEntry<String, int>('\u2665jcOS', 8),
-  false: MapEntry<String, int>('A', 44),
-  false: MapEntry<String, int>('', 40),
-  true: MapEntry<String, int>('', 5)
-};
-Map<bool, MapEntry<String, String>> var182 = {
-  false: MapEntry<String, String>('V#L8)', 'F3JdH'),
-  false: MapEntry<String, String>('', 'x&GJsnQ'),
-  false: MapEntry<String, String>('N', '@(gV'),
-  true: MapEntry<String, String>('', '+g2#nTA')
-};
-Map<int, Expando<bool>> var183 = {
-  44: Expando<bool>('fh'),
-  11: Expando<bool>('sUbgrs'),
-  14: Expando<bool>('1\u{1f600}\u2665'),
-  -73: Expando<bool>('0ubwc'),
-  -52: Expando<bool>('!\u{1f600}\u2665E&lS'),
-  -0: Expando<bool>('\u26655')
-};
-Map<int, Expando<int>> var184 = {
-  -33: Expando<int>('unFc'),
-  -26: Expando<int>('rlmQe')
-};
-Map<int, Expando<String>> var185 = {
-  45: new Expando<String>('@'),
-  36: Expando<String>('!D\u2665&Jxy'),
-  -44: Expando<String>('')
-};
-Map<int, List<bool>> var186 = {
-  35: [true, true, true, false],
-  -79: [false, true, true],
-  19: [true, true],
-  14: [true]
-};
-Map<int, List<int>> var187 = {
-  38: Uint8ClampedList(40),
-  27: Uint8ClampedList(11),
-  12: Uint32List(40)
-};
-Map<int, List<String>> var188 = {
-  34: ['ub\u2665vBP', 'ZI', 'mVrRK\u{1f600}9', '9zz6D']
-};
-Map<int, Set<bool>> var189 = {
-  2147483649: {true, true, false}
-};
-Map<int, Set<int>> var190 = {
-  -32: {-92}
-};
-Map<int, Set<String>> var191 = {
-  -37: {'F7D', 'K10FvCj', 'zDD@a\u{1f600}-', ''},
-  -21: {' CV1', '\u{1f600}C\u{1f600}', '', '49t es7', 'cS\u2665Pv\u2665'},
-  16: {'P3\u2665\u{1f600}XL', 'a@\u26654z', '\u{1f600}\u{1f600}TdU@', 'cPV'},
-  17: {'P1!', 'uA-CbQB'},
-  4: {'cECL', 'N10!V', '0LjZ0hA', 'U7'},
-  8: {'\u2665C', 'aKR'}
-};
-Map<int, Map<bool, bool>> var192 = {
-  42: {false: false},
-  1: {true: false, false: false, false: false, false: false},
-  -91: {true: false, false: true, false: true, false: false, true: true},
-  -66: {true: true, true: true, false: false},
-  10: {false: true, true: true, true: false}
-};
-Map<int, Map<bool, int>> var193 = {
-  -65: {false: -0, false: 17, true: 9, true: 23, false: 6},
-  11: {false: -9223372032559808513, true: 0, true: -57, true: 24, true: 44}
-};
-Map<int, Map<bool, String>> var194 = {
-  38: {
-    false: '\u2665I!2ro',
-    true: 'NS',
-    false: 'MLf\u2665 ',
-    true: 'Jb',
-    false: ''
-  },
-  9223372034707292160: {true: 'b#Crcb'}
-};
-Map<int, Map<int, bool>> var195 = {
-  4: {-89: false, 36: true, 42: true, -9223372028264841217: false, -9: true},
-  42: {
-    -9223372036854775807: true,
-    -95: true,
-    -59: false,
-    -25: false,
-    -93: false
-  },
-  39: {-76: false, 39: true, -52: false, -69: false},
-  -74: {-74: true, 11: false, -21: true, -63: false, -37: false},
-  -40: {42: false, -9223372034707292159: true, -39: false, 9: false, 12: true},
-  38: {-9223372034707292160: false, -50: false, 28: false, -63: true}
-};
-Map<int, Map<int, int>> var196 = {
-  -9223372032559808512: {48: 25, -87: -39},
-  -60: {-5: 15, -94: -8},
-  9223372036854775807: {
-    -54: -58,
-    -91: -9223372036854775808,
-    9223372034707292161: -45,
-    -30: 3
-  },
-  9223372032559808512: {-21: 15, 30: 28, 1: -53, -4294967296: -78, 21: -52},
-  -2: {9: -9223372032559808511, -9223372036854775808: 11}
-};
-Map<int, Map<int, String>> var197 = {
-  6: {-15: 'JH', -18: '\u2665P0nWY'},
-  -2147483647: {11: 'eq', 37: '-\u{1f600}'},
-  -24: {-49: 'Fox9', -9: ''},
-  -25: {15: 'VXR2E'}
-};
-Map<int, Map<String, bool>> var198 = {
-  6442450944: {'\u{1f600}': false, 'S': true},
-  -22: {'#0bj\u{1f600}': false, 'O\u2665O\u{1f600}n\u2665': false},
-  -94: {'qiS&D\u{1f600}K': false}
-};
-Map<int, Map<String, int>> var199 = {
-  -17: {'ybZg': -57, '(x\u{1f600}Tl': 6, '\u2665': -40, '3Xz6iOR': 32},
-  15: {'W\u2665rx': 2147483649, 'Q9Dn4Mf': 26, '7gV2i&c': -9223372032559808512},
-  36: {'7Nq5p': -65}
-};
-Map<int, Map<String, String>> var200 = {
-  15: {'VE&': '', 'xCki9Br': 'pR\u2665', 'j\u{1f600}': 'iV'}
-};
-Map<int, MapEntry<bool, bool>> var201 = {
-  -9223372034707292160: MapEntry<bool, bool>(true, false)
-};
-Map<int, MapEntry<bool, int>> var202 = {
-  -5: MapEntry<bool, int>(true, 11),
-  -32: MapEntry<bool, int>(false, 39),
-  -79: MapEntry<bool, int>(true, 49),
-  -89: MapEntry<bool, int>(false, 43),
-  45: MapEntry<bool, int>(false, 22)
-};
-Map<int, MapEntry<bool, String>> var203 = {
-  33: MapEntry<bool, String>(true, 'zMmhEl#'),
-  -72: MapEntry<bool, String>(true, 'o0a@Bv'),
-  -76: MapEntry<bool, String>(false, '7 2d-'),
-  21: MapEntry<bool, String>(true, '+xtB!w'),
-  -40: MapEntry<bool, String>(true, 'ac')
-};
-Map<int, MapEntry<int, bool>> var204 = {
-  -14: MapEntry<int, bool>(14, true),
-  -3: MapEntry<int, bool>(9, false),
-  33: MapEntry<int, bool>(43, true)
-};
-Map<int, MapEntry<int, int>> var205 = {-11: MapEntry<int, int>(46, 47)};
-Map<int, MapEntry<int, String>> var206 = {
-  25: MapEntry<int, String>(34, 'i'),
-  46: MapEntry<int, String>(24, '0\u26652'),
-  25: MapEntry<int, String>(31, '#g')
-};
-Map<int, MapEntry<String, bool>> var207 = {
-  9: MapEntry<String, bool>('q@P7', false),
-  28: MapEntry<String, bool>('v7BApvo', false),
-  -4: MapEntry<String, bool>('&', true)
-};
-Map<int, MapEntry<String, int>> var208 = {
-  24: MapEntry<String, int>('', 29),
-  24: MapEntry<String, int>('GC', 14),
-  13: MapEntry<String, int>('iQ', 40),
-  42: MapEntry<String, int>('wS5nsdq', 39),
-  24: MapEntry<String, int>('e', 4),
-  -97: MapEntry<String, int>('G\u2665', 49)
-};
-Map<int, MapEntry<String, String>> var209 = {
-  -47: MapEntry<String, String>('ae#d!R', 'kI3g'),
-  48: MapEntry<String, String>('kp\u2665HmDw', ''),
-  34: MapEntry<String, String>('kf#', '\u2665'),
-  4294967297: MapEntry<String, String>('', '3WQ')
-};
-Map<String, Expando<bool>> var210 = {
-  '6x\u{1f600}\u2665': Expando<bool>('t \u{1f600}#cuZ')
-};
-Map<String, Expando<int>> var211 = {
-  '': new Expando<int>('9 iK7'),
-  'q\u2665V4v': Expando<int>('!WI'),
-  '': Expando<int>('#Y'),
-  '': Expando<int>('s\u{1f600}PQtMR'),
-  'xk': new Expando<int>('')
-};
-Map<String, Expando<String>> var212 = {
-  '3bj': Expando<String>('(bBR\u{1f600}'),
-  '+lvg\u{1f600}8': Expando<String>('HslP0fq'),
-  'rA11': Expando<String>('OIj7'),
-  'pOFk\u2665p\u2665': Expando<String>('')
-};
-Map<String, List<bool>> var213 = {
-  'Pp#': [false, true, true, false, true],
-  'kF\u{1f600}V\u{1f600}': [true, false, false, true]
-};
-Map<String, List<int>> var214 = {
-  'Mi1': [25, 10],
-  'E': Uint8List(12),
-  'a)\u26658dIb': Uint16List(26),
-  'RyfPfGs': Int64List(1),
-  '\u{1f600}ro7Ld&': Int8List.fromList(Int16List.fromList(Uint8List(48))),
-  '\u{1f600}+eIoZ@': Int16List.fromList(Uint32List.fromList(Int8List(7)))
-};
-Map<String, List<String>> var215 = {
-  '&lVCT+(': ['AqlE\u2665', 'AM', 'k@NN\u2665'],
-  't': ['', '', 'm']
-};
-Map<String, Set<bool>> var216 = {
-  'M\u2665LS': {true, false, true},
-  'EY&-': {false, true},
-  'JL(&': {true, true, true},
-  'cbsKwv': {true, false},
-  'RxFq': {false, false, false, false, false}
-};
-Map<String, Set<int>> var217 = {
-  '': {29, 4, -9223372030412324863},
-  '': {-87, -29, -1},
-  'UKawkR': {-4, -49, -13, 48},
-  '': {-88, 19},
-  '': {-70, -57, -56, 41, 19}
-};
-Map<String, Set<String>> var218 = {
-  '6L': {'8#On0\u2665', 'u8()Rs', 'D\u2665K', 'bl', 'c\u{1f600}('},
-  '': {'w\u{1f600}RQr+', 'MOe', 'k OX2', '', 'RGP4d'},
-  'nndS6J': {'', 'C\u{1f600}(y9-6', 'lU\u{1f600}Y', '', '\u2665xulu)\u2665'},
-  '\u{1f600}GiFU': {'', 'lHCkM', ''},
-  '': {'6', '!(0S6'},
-  '!\u2665': {'\u2665s\u{1f600}MSPe', '-3#XZ'}
-};
-Map<String, Map<bool, bool>> var219 = {
-  'yz539': {true: false},
-  '\u2665cai\u2665lj': {false: false, true: true},
-  'qvZAFXL': {true: false, true: false, true: true, false: true},
-  'ss!G': {true: true, false: true},
-  'M': {false: false, false: true, true: true}
-};
-Map<String, Map<bool, int>> var220 = {
-  'vnaZiHB': {true: -13, false: 47, false: -11},
-  'I!#\u{1f600}i-': {true: 31, false: 34, false: 22, false: 27, false: -86},
-  'C': {false: -64, false: 4294967295},
-  '': {true: -60, false: 40, true: 17},
-  'b': {true: 10, true: -11, false: 25}
-};
-Map<String, Map<bool, String>> var221 = {
-  '5sr': {true: 'Bxl\u{1f600}nk\u2665'},
-  'DlxqF-s': {false: '+o9T'},
-  '\u{1f600}lO!': {false: 'kdOB\u{1f600}9', false: '-cwUJ(1', false: 'Y+pX'},
-  'ljP': {false: 'mdcI', true: 'B7', false: 'in'},
-  'Me3': {
-    true: 'uMS-',
-    false: 'hQf5V7',
-    false: 'tjj@d-',
-    false: 'pw',
-    true: 'n\u{1f600}'
-  }
-};
-Map<String, Map<int, bool>> var222 = {
-  'G': {22: true, -51: true}
-};
-Map<String, Map<int, int>> var223 = {
-  'ooBph': {-73: 31, -50: -39, -2147483647: 3},
-  '': {-73: 47},
-  '3G@UXqo': {-73: -68, 24: -46},
-  'NasAQM)': {-13: 24, -36: 40}
-};
-Map<String, Map<int, String>> var224 = {
-  '': {37: '(l+'},
-  'P7y!5Fp': {14: 'udi7l'},
-  'wx@y(': {-9223372030412324864: '\u{1f600}J', -84: ''},
-  'g': {16: 'P20(', -85: ''},
-  'T\u2665\u{1f600}!i': {-34: 'o', -88: 'l2fyoK'},
-  'y2l': {-77: '+qDu', -2147483647: 'P-f\u2665', -94: ''}
-};
-Map<String, Map<String, bool>> var225 = {
-  'TSvQ#g': {'7)': false, 'fUG': false, 'P@O#': true},
-  'GY\u2665CN1@': {
-    '': false,
-    '': true,
-    '1&I\u{1f600}nCX': false,
-    '\u2665G': true
-  },
-  '': {'G48al': false, 'k0i': false, 'Fy4': false},
-  '': {
-    'Q#\u{1f600}': false,
-    '8v': false,
-    'Cn': true,
-    'p@v#&Q': false,
-    's#Lsunk': true
-  }
-};
-Map<String, Map<String, int>> var226 = {
-  'h4': {'bH@': -43, 'X': 6442450943},
-  '\u{1f600}HYA)': {
-    'OyUyc': 11,
-    '\u{1f600}pF\u{1f600}o': 1,
-    '#VI': 39,
-    '3DAIp\u2665i': 36
-  },
-  '#e yi\u{1f600}': {'vHpe': -96, '&8t': 27, 'z': -78, 'G03t': 8},
-  'B-nlX': {'\u{1f600}W': -3, 'gI': 36, 'ACX\u2665b': -54, 'JVQH': -94},
-  'G': {'smp': 17, 'v\u26654': -95, 'La': 48}
-};
-Map<String, Map<String, String>> var227 = {
-  '\u{1f600}': {'jcRoE': '\u{1f600}2U\u{1f600}x', '18FqrQl': 'Qhh9', 'z': 'RY'},
-  '77s': {'': 'kTdk6'},
-  'xF(': {'RC': 'h'},
-  'r': {'X': 'L\u2665\u26650', '2BH': ')F@', '2\u2665': '5'},
-  'GN': {'yI!!Sp': 'w9\u{1f600}p\u2665d', '&Uwf\u{1f600}G0': 'wVk'},
-  'Oi5M+': {'8nT\u26657f': 'hq', 'YD79\u2665': '\u2665yGpQi'}
-};
-Map<String, MapEntry<bool, bool>> var228 = {
-  '\u{1f600}+0': MapEntry<bool, bool>(false, false),
-  '\u{1f600}': MapEntry<bool, bool>(true, true),
-  '': MapEntry<bool, bool>(true, false),
-  'P@': MapEntry<bool, bool>(false, false)
-};
-Map<String, MapEntry<bool, int>> var229 = {
-  '\u{1f600}HDRH-': new MapEntry<bool, int>(false, 44),
-  '\u2665F\u2665x': MapEntry<bool, int>(true, 25),
-  '\u{1f600}': MapEntry<bool, int>(false, 36)
-};
-Map<String, MapEntry<bool, String>> var230 = {
-  '': MapEntry<bool, String>(false, '\u{1f600}V')
-};
-Map<String, MapEntry<int, bool>> var231 = {
-  'QNiqVJ': MapEntry<int, bool>(9, false)
-};
-Map<String, MapEntry<int, int>> var232 = {
-  'BT5E4': new MapEntry<int, int>(36, 14),
-  '\u2665 T89\u26659': MapEntry<int, int>(40, 3),
-  '': MapEntry<int, int>(14, 13)
-};
-Map<String, MapEntry<int, String>> var233 = {
-  '\u{1f600}P\u2665\u{1f600}i': MapEntry<int, String>(33, 'Z1Q\u{1f600}9M0'),
-  '': MapEntry<int, String>(19, 'DcF4)'),
-  'OjM': MapEntry<int, String>(13, '\u2665PVgs'),
-  '@+P': MapEntry<int, String>(2, '-O25'),
-  '\u{1f600}\u2665M0V': MapEntry<int, String>(15, '\u{1f600}l\u266553'),
-  ')8aC(G': MapEntry<int, String>(28, '')
-};
-Map<String, MapEntry<String, bool>> var234 = {
-  '': MapEntry<String, bool>('', true),
-  'wuN': MapEntry<String, bool>('BYim@k', true),
-  ' Af\u{1f600}SC': MapEntry<String, bool>('4V', true),
-  'x': MapEntry<String, bool>('W#C\u26652\u{1f600}', true)
-};
-Map<String, MapEntry<String, int>> var235 = {
-  '0M\u266594L': MapEntry<String, int>('6CWY@N', 49),
-  '6\u2665xy\u{1f600}': MapEntry<String, int>('2C', 41),
-  '6w': MapEntry<String, int>('@7No', 33)
-};
-Map<String, MapEntry<String, String>> var236 = {
-  '\u{1f600}l ': new MapEntry<String, String>('6KD', 'p1Q\u2665l08'),
-  'RBrvyj3': MapEntry<String, String>('t9M1qq', 'e\u{1f600}y!Esm'),
-  '\u{1f600}Q3': MapEntry<String, String>('mQG)eT', 'L\u2665j'),
-  'gD': MapEntry<String, String>('bfwv', '0&47'),
-  '@vD\u{1f600}': MapEntry<String, String>('2', 'x')
-};
-Map<Expando<bool>, bool> var237 = {
-  Expando<bool>('6'): false,
-  Expando<bool>('H&\u{1f600}Lc5'): false,
-  Expando<bool>('I'): true
-};
-Map<Expando<bool>, int> var238 = {
-  new Expando<bool>('('): 42,
-  Expando<bool>('GbdYoW#'): -33,
-  Expando<bool>(''): -71,
-  new Expando<bool>(')zb'): -61
-};
-Map<Expando<bool>, String> var239 = {
-  Expando<bool>('QiL8b'): '9',
-  Expando<bool>(''): '3X'
-};
-Map<Expando<bool>, Expando<bool>> var240 = {
-  Expando<bool>('gI2tZ'): Expando<bool>('EW)db8'),
-  Expando<bool>('\u2665'): Expando<bool>('PaR'),
-  Expando<bool>(''): new Expando<bool>('+HAws!N')
-};
-Map<Expando<bool>, Expando<int>> var241 = {
-  Expando<bool>('u3'): Expando<int>('\u{1f600}'),
-  Expando<bool>(''): Expando<int>('\u2665-AJG'),
-  Expando<bool>('nZ'): Expando<int>('#7)@'),
-  Expando<bool>('\u{1f600}I'): new Expando<int>('\u{1f600}m'),
-  Expando<bool>('Ht'): Expando<int>('\u2665M')
-};
-Map<Expando<bool>, Expando<String>> var242 = {
-  new Expando<bool>('s8 z2GH'): Expando<String>('\u2665r'),
-  Expando<bool>('I'): Expando<String>('NI5\u2665'),
-  Expando<bool>('\u2665N90\u{1f600}'): Expando<String>(''),
-  Expando<bool>(')M00O'): Expando<String>('Osx'),
-  Expando<bool>(''): Expando<String>('\u26659G'),
-  Expando<bool>(' n9'): Expando<String>('fM')
-};
-Map<Expando<bool>, List<bool>> var243 = {
-  Expando<bool>('cBQFP'): [false],
-  Expando<bool>('\u{1f600}\u{1f600}P\u26655'): [true, true],
-  Expando<bool>('V\u26657'): [true],
-  Expando<bool>('L'): [true, true, true],
-  new Expando<bool>('h@\u26659no'): [false, true]
-};
-Map<Expando<bool>, List<int>> var244 = {
-  Expando<bool>('pY#bx'): Uint16List.fromList(Int8List.fromList([-11])),
-  Expando<bool>('V8LZNv'): Int32List(41),
-  Expando<bool>('kii'): Uint8List(4),
-  Expando<bool>('gPCnM'): Uint32List.fromList(
-      Int64List.fromList(Uint8List.fromList(Int16List(48)))),
-  Expando<bool>(''): Int8List.fromList(Int8List(17))
-};
-Map<Expando<bool>, List<String>> var245 = {
-  Expando<bool>('J!XE--p'): ['cI7A7R']
-};
-Map<Expando<bool>, Set<bool>> var246 = {
-  Expando<bool>('f6EOenH'): {false, false, true, true, true},
-  Expando<bool>('R'): {false, false, false, true},
-  Expando<bool>('9o'): {false, true},
-  Expando<bool>('d'): {false, false},
-  Expando<bool>('L\u2665Ky'): {false}
-};
-Map<Expando<bool>, Set<int>> var247 = {
-  Expando<bool>('1#9'): {11, 8, 32},
-  new Expando<bool>('k4v7'): {-80, 26}
-};
-Map<Expando<bool>, Set<String>> var248 = {
-  Expando<bool>('P\u{1f600}RYk'): {'2q', ''},
-  Expando<bool>('mf7M8y9'): {'lXR51Q', '-4BCx6', ''},
-  Expando<bool>('lVl'): {'V'},
-  Expando<bool>('&9'): {'Gi2MU', 'TFc\u{1f600}', '7d2T\u{1f600}TO'},
-  Expando<bool>('O\u{1f600}45\u2665'): {'\u{1f600}f8gx&y', 'O\u2665jn1A'}
-};
-Map<Expando<bool>, Map<bool, bool>> var249 = {
-  Expando<bool>('d#qb\u{1f600}R'): {true: true},
-  Expando<bool>('2'): {true: false},
-  Expando<bool>('mUXc)F'): {
-    true: false,
-    true: false,
-    false: false,
-    false: false
-  },
-  Expando<bool>(''): {true: false, false: true, false: true, true: false},
-  Expando<bool>('BF'): {true: false, true: false}
-};
-Map<Expando<bool>, Map<bool, int>> var250 = {
-  Expando<bool>('x'): {true: 22, true: 18, false: -79, true: 29},
-  Expando<bool>(''): {false: -1, true: -28, true: 4294967295, false: 48},
-  Expando<bool>('kn'): {
-    false: 0,
-    false: -47,
-    false: -17,
-    false: -2147483647,
-    true: 4294967297
-  }
-};
-Map<Expando<bool>, Map<bool, String>> var251 = {
-  Expando<bool>('Ox#4\u2665Uk'): {
-    false: '\u26650VEl0',
-    true: 'b',
-    false: 'n2vLKn',
-    false: 'jqB'
-  },
-  Expando<bool>('('): {
-    true: 'K',
-    false: '9\u{1f600}wY5fJ',
-    true: 'W',
-    true: 'aFkf',
-    false: 'P'
-  },
-  Expando<bool>('zQJqbH'): {false: '&dp\u2665'},
-  Expando<bool>('\u{1f600}\u{1f600}v(w'): {
-    false: '8\u2665JYw1',
-    false: '5NF',
-    false: ''
-  },
-  Expando<bool>(''): {
-    false: 'U7\u2665k8j',
-    false: 'L',
-    true: '',
-    true: '#QU9beI'
-  },
-  Expando<bool>('1'): {false: 'IpqA\u{1f600}mK', false: 'Z6o', false: '!Xus'}
-};
-Map<Expando<bool>, Map<int, bool>> var252 = {
-  Expando<bool>('t2ocMu'): {-2147483649: false, -50: true, -41: true}
-};
-Map<Expando<bool>, Map<int, int>> var253 = {
-  Expando<bool>('x#6N\u2665'): {32: 42, 16: 16},
-  Expando<bool>(''): {-3: -9223372032559808513, 9: 33, -97: -14, 37: 1},
-  Expando<bool>('3Z@6'): {9223372034707292160: 15, -32: 2147483647, -38: 47},
-  Expando<bool>('G'): {-7: -67, -9223372030412324863: -21, -69: 47, 42: 24}
-};
-Map<Expando<bool>, Map<int, String>> var254 = {
-  Expando<bool>('+zuOBn'): {
-    -19: 'n8',
-    -77: '!T',
-    -9223372034707292159: 'MV',
-    -33: 'sd1Jim6'
-  },
-  Expando<bool>('4\u2665RNL'): {5: ')R'},
-  Expando<bool>('cgE@ i'): {
-    -9223372028264841217: 'an+bXm',
-    12: 'G-\u{1f600}',
-    4294967295: 'P8T'
-  }
-};
-Map<Expando<bool>, Map<String, bool>> var255 = {
-  Expando<bool>('&1\u2665('): {
-    'A\u{1f600}@': true,
-    '3': true,
-    'Wm+q': true,
-    '1T2Qzu5': true
-  },
-  Expando<bool>('t\u{1f600}F1'): {'hN': false},
-  Expando<bool>('7sF\u{1f600}'): {'fbXP': false},
-  new Expando<bool>('XdqyY\u{1f600}'): {
-    '9': false,
-    'EQtm': true,
-    '!16f(': false,
-    '': false,
-    'Y8\u2665ZV': true
-  },
-  new Expando<bool>(''): {'': true, 't#bze4': true},
-  Expando<bool>('oL)O\u2665'): {
-    '0\u266517z': true,
-    '@\u{1f600}@LSBL': true,
-    'oTzPe': false
-  }
-};
-Map<Expando<bool>, Map<String, int>> var256 = {
-  new Expando<bool>(''): {'99s': 32, 'hLsiuY!': 11, 'o\u2665Bh2': -83},
-  Expando<bool>('kCg'): {'oE9!0M': -94, 'n&)QJ!k': -91},
-  Expando<bool>(''): {
-    'Y\u{1f600}TE5\u{1f600}': -13,
-    '': 24,
-    '\u26652\u2665i\u{1f600}1': 0,
-    'nRj)PR': -9,
-    'l\u2665': 9
-  },
-  Expando<bool>('2nF2uuW'): {'6\u2665OOZ': 48, 'i': 47, '': 0}
-};
-Map<Expando<bool>, Map<String, String>> var257 = {
-  Expando<bool>('CAw@Q'): {
-    'vCE\u2665j5': '',
-    '\u{1f600}SWMUs': '',
-    'L\u{1f600}4J(': 'o&uCe',
-    'Gks@Gg\u{1f600}': 'HDWk-E',
-    '': 'bB68L('
-  },
-  Expando<bool>('y2X5M\u2665'): {
-    'xhQ0ga8': 'iaKE\u{1f600}',
-    'f@': '-uX',
-    '\u{1f600}U3\u2665x': '&N(7F',
-    'vF': 's#VUSTJ',
-    '1M25d': 'Wy'
-  },
-  new Expando<bool>(''): {
-    '1L': 'XCk\u{1f600}(#@',
-    '0u': 'Ij',
-    '&ga': '\u{1f600}3Y!',
-    'jw4': 'dPhwMu8'
-  },
-  Expando<bool>('\u2665Clpf#u'): {
-    'tkGRA\u2665&': 'iSsZh',
-    'cD\u2665': 'cp',
-    'l ': 'Rz',
-    '7qnBOFC': 'qq\u2665'
-  }
-};
-Map<Expando<bool>, MapEntry<bool, bool>> var258 = {
-  Expando<bool>('9c'): MapEntry<bool, bool>(true, false),
-  Expando<bool>(''): MapEntry<bool, bool>(true, false),
-  new Expando<bool>('A&mY+ '): MapEntry<bool, bool>(false, false),
-  Expando<bool>('Pi'): MapEntry<bool, bool>(false, false),
-  Expando<bool>('30ZY\u2665W'): new MapEntry<bool, bool>(true, true)
-};
-Map<Expando<bool>, MapEntry<bool, int>> var259 = {
-  Expando<bool>(''): new MapEntry<bool, int>(true, 9),
-  Expando<bool>('6m\u{1f600}\u2665l'): MapEntry<bool, int>(true, 38),
-  Expando<bool>('NP!'): MapEntry<bool, int>(false, 3),
-  new Expando<bool>('JPhv(Xv'): MapEntry<bool, int>(true, 26)
-};
-Map<Expando<bool>, MapEntry<bool, String>> var260 = {
-  Expando<bool>('T'): MapEntry<bool, String>(true, '!\u{1f600}x'),
-  Expando<bool>('\u2665o'): MapEntry<bool, String>(false, 'sR'),
-  new Expando<bool>('sm7umZ'): MapEntry<bool, String>(true, ''),
-  Expando<bool>(''): MapEntry<bool, String>(true, 'FNU'),
-  Expando<bool>('oh\u26658S9'): MapEntry<bool, String>(false, 'V  ')
-};
-Map<Expando<bool>, MapEntry<int, bool>> var261 = {
-  Expando<bool>('c\u{1f600}8d&PW'): MapEntry<int, bool>(34, false),
-  Expando<bool>('b'): MapEntry<int, bool>(15, true),
-  Expando<bool>('MxPZ-'): MapEntry<int, bool>(17, false),
-  Expando<bool>('s7Pnm0k'): MapEntry<int, bool>(8, false)
-};
-Map<Expando<bool>, MapEntry<int, int>> var262 = {
-  new Expando<bool>('gE@loMf'): MapEntry<int, int>(18, 44),
-  Expando<bool>('bW\u{1f600}(5Y'): MapEntry<int, int>(26, 29),
-  new Expando<bool>('&'): MapEntry<int, int>(33, 41),
-  Expando<bool>('p1iZ2\u2665'): MapEntry<int, int>(15, 28),
-  Expando<bool>('bFwdO'): MapEntry<int, int>(49, 24)
-};
-Map<Expando<bool>, MapEntry<int, String>> var263 = {
-  Expando<bool>('P'): MapEntry<int, String>(31, '\u2665\u2665'),
-  new Expando<bool>('jWi\u26650'): MapEntry<int, String>(3, 'en'),
-  Expando<bool>('a'): MapEntry<int, String>(21, 'U8#H')
-};
-Map<Expando<bool>, MapEntry<String, bool>> var264 = {
-  Expando<bool>('(Eq5 YW'): MapEntry<String, bool>('', true),
-  new Expando<bool>('4!PVW9)'): MapEntry<String, bool>('5G', true),
-  new Expando<bool>('\u{1f600}gZRjD'): MapEntry<String, bool>('T', false),
-  Expando<bool>('vu1r(zF'): MapEntry<String, bool>('A7O4\u{1f600}0', false)
-};
-Map<Expando<bool>, MapEntry<String, int>> var265 = {
-  Expando<bool>(''): MapEntry<String, int>('r\u2665p\u{1f600}w', 18),
-  Expando<bool>('ey-F'): MapEntry<String, int>('I&', 0),
-  Expando<bool>('!6cZ'): MapEntry<String, int>('B6A!yF', 1),
-  Expando<bool>('RMzgo&'): MapEntry<String, int>('\u2665Puj', 13)
-};
-Map<Expando<bool>, MapEntry<String, String>> var266 = {
-  Expando<bool>('0'): new MapEntry<String, String>('', 'U\u{1f600}pc')
-};
-Map<Expando<int>, bool> var267 = {
-  Expando<int>('VOagX'): false,
-  Expando<int>('Q m2f'): true,
-  Expando<int>('0xpI7FY'): false
-};
-Map<Expando<int>, int> var268 = {
-  new Expando<int>('q5lFA'): -51,
-  Expando<int>('N\u{1f600}HO(\u26654'): -11
-};
-Map<Expando<int>, String> var269 = {
-  new Expando<int>('EM'): '',
-  Expando<int>('Em'): 'msFOdv'
-};
-Map<Expando<int>, Expando<bool>> var270 = {
-  Expando<int>('x\u2665bRp3u'): Expando<bool>('Ac7L4')
-};
-Map<Expando<int>, Expando<int>> var271 = {
-  Expando<int>('nY7re3'): Expando<int>('w\u2665vb'),
-  Expando<int>('YF72B\u{1f600}7'): Expando<int>('F1bw\u{1f600}m'),
-  new Expando<int>(''): Expando<int>('im\u{1f600}0+6'),
-  Expando<int>('pBf'): Expando<int>('U97VKl')
-};
-Map<Expando<int>, Expando<String>> var272 = {
-  Expando<int>('zoeD(XH'): Expando<String>('aj'),
-  Expando<int>('!3nI1'): Expando<String>('q3BW')
-};
-Map<Expando<int>, List<bool>> var273 = {
-  Expando<int>('3bOR\u2665h'): [true, true, false, true],
-  Expando<int>('E'): [true],
-  Expando<int>('a\u2665I6'): [true, false, true, false]
-};
-Map<Expando<int>, List<int>> var274 = {
-  Expando<int>('k\u2665a'): Int8List(39),
-  new Expando<int>('z6H+'): Int32List(29),
-  Expando<int>('@\u2665f\u2665Clu'):
-      Int8List.fromList(Uint32List.fromList(Int32List(7))),
-  Expando<int>(''): Int32List.fromList(Uint8ClampedList(44))
-};
-Map<Expando<int>, List<String>> var275 = {
-  Expando<int>('rot'): ['sYkag', '\u2665Thw\u{1f600}h#', '\u2665T'],
-  new Expando<int>('g1X'): ['\u2665@#d\u2665wc', 'DJG6', 'f', 'sQ!', 'Q-X2Q'],
-  Expando<int>('oc&g\u{1f600}'): ['', 'GqtHGR', '\u{1f600}'],
-  Expando<int>('\u2665F)W'): ['Nvc\u2665GkW'],
-  Expando<int>(')+J'): ['ae588'],
-  Expando<int>('Rq\u266526b'): ['4Zt0', 'mB', '', 'ZW', 'lg23vG']
-};
-Map<Expando<int>, Set<bool>> var276 = {
-  Expando<int>('3!fxt'): {true, false, true},
-  Expando<int>(''): {false, false, true, false}
-};
-Map<Expando<int>, Set<int>> var277 = {
-  Expando<int>('vAxC'): {-81, 28},
-  Expando<int>('yA\u2665VIue'): {-19},
-  Expando<int>('o'): {28, 9223372034707292161, 45, 40, -91},
-  Expando<int>('ZiYVP'): {22},
-  Expando<int>('0IBG'): {1, 15, 20, 22, -93},
-  Expando<int>('TE3mIt '): {-43, -70, -31, -83, -55}
-};
-Map<Expando<int>, Set<String>> var278 = {
-  Expando<int>('4j\u2665tN'): {
-    '634@',
-    '\u{1f600}aVQxt3',
-    'K7\u{1f600}s',
-    '-2b',
-    'hirU'
-  },
-  Expando<int>('3t'): {'pR\u2665', 'n!H-Wm'},
-  Expando<int>(''): {'', 'r'},
-  Expando<int>('\u{1f600}!83F-'): {'Lnm2W'},
-  Expando<int>('v2Ct2q'): {'AxUFNZ', 'z', 'XCN4U\u{1f600}-', '\u2665JP'},
-  Expando<int>(''): {'S-', '4(\u{1f600}BOlO'}
-};
-Map<Expando<int>, Map<bool, bool>> var279 = {
-  Expando<int>('cx9I'): {
-    false: true,
-    true: false,
-    false: false,
-    false: true,
-    true: true
-  },
-  Expando<int>('\u2665N7On'): {true: false, true: true}
-};
-Map<Expando<int>, Map<bool, int>> var280 = {
-  Expando<int>('Hvv'): {true: 4, true: -78, true: -9223372034707292160},
-  Expando<int>('4dZ9sbZ'): {true: 32, true: 37, true: -29, true: -41},
-  Expando<int>('kE\u2665bg'): {
-    true: -1,
-    true: 9223372036854775807,
-    false: 10,
-    true: -75
-  },
-  Expando<int>(')B\u2665s '): {true: 2, true: 19, true: -27, true: 31}
-};
-Map<Expando<int>, Map<bool, String>> var281 = {
-  Expando<int>(''): {
-    true: 'ccZ',
-    true: 'UQ20S',
-    true: 'b\u{1f600}FWSv',
-    true: ' -Vj\u26656x',
-    true: '@S\u{1f600}(K'
-  },
-  Expando<int>('5J'): {true: ')nz&', false: 'L&M\u{1f600}d', false: 'H P'}
-};
-Map<Expando<int>, Map<int, bool>> var282 = {
-  Expando<int>('MUD '): {-9223372034707292160: false},
-  Expando<int>('3J'): {7: true, 23: false, 0: false, -71: false, -14: false},
-  Expando<int>('n'): {
-    -9223372034707292159: true,
-    -2147483649: true,
-    -16: true,
-    42: false
-  }
-};
-Map<Expando<int>, Map<int, int>> var283 = {
-  Expando<int>('ldfJ'): {
-    -13: 48,
-    0: -61,
-    -9223372036854775808: 19,
-    9223372032559808513: 4294967295
-  },
-  Expando<int>('PnV\u{1f600}'): {46: -48},
-  Expando<int>('qk0'): {-56: -32}
-};
-Map<Expando<int>, Map<int, String>> var284 = {
-  Expando<int>('tz Cn'): {7: 'bnwz\u2665yy', 43: '1TEDPk', 4: 'Lxd'}
-};
-Map<Expando<int>, Map<String, bool>> var285 = {
-  Expando<int>('9g4fB'): {'': true},
-  new Expando<int>('&'): {'@': false},
-  Expando<int>('FK!g)UY'): {'\u2665': true},
-  Expando<int>('n8'): {'Q#dp02': true},
-  Expando<int>('lI#'): {
-    '4avZeg': true,
-    'X': false,
-    'N\u{1f600}Rw\u2665w!': true
-  }
-};
-Map<Expando<int>, Map<String, int>> var286 = {
-  Expando<int>('Wuvk'): {
-    'D@rqA': 30,
-    'Co5': -98,
-    'j': 41,
-    '\u26655d': -9223372032559808513
-  }
-};
-Map<Expando<int>, Map<String, String>> var287 = {
-  new Expando<int>('Uakek5m'): {
-    'Uvp\u{1f600}': '1@',
-    'z Tm\u{1f600}\u{1f600}': '-34n\u26656V',
-    'gG': ''
-  },
-  Expando<int>(''): {'mjY@s': '0\u2665\u{1f600}X', '5m(hR': '', '': 'SnT'},
-  Expando<int>('R\u2665IQ7a'): {'dMY': 'R\u2665v', '!\u{1f600}': 'x&V(LU'},
-  Expando<int>('iB0'): {'tN)': 'zFOk\u2665rn'},
-  Expando<int>('6Zu5S'): {'\u{1f600}T r\u2665-': 'Vb'}
-};
-Map<Expando<int>, MapEntry<bool, bool>> var288 = {
-  Expando<int>('7'): MapEntry<bool, bool>(true, false),
-  Expando<int>('\u2665nx'): MapEntry<bool, bool>(false, false),
-  Expando<int>('\u2665Q2KP\u2665'): MapEntry<bool, bool>(false, true),
-  Expando<int>('hrc6\u2665Ts'): MapEntry<bool, bool>(true, false),
-  Expando<int>('tDFwT'): MapEntry<bool, bool>(false, false)
-};
-Map<Expando<int>, MapEntry<bool, int>> var289 = {
-  Expando<int>('IUcO 16'): MapEntry<bool, int>(true, 11)
-};
-Map<Expando<int>, MapEntry<bool, String>> var290 = {
-  Expando<int>(')'): MapEntry<bool, String>(false, 'o&a'),
-  Expando<int>('KCFkBPC'): MapEntry<bool, String>(false, ''),
-  Expando<int>('OC\u2665GSo9'): MapEntry<bool, String>(false, 'g9\u{1f600}@r('),
-  new Expando<int>('bX'): MapEntry<bool, String>(false, 'r('),
-  Expando<int>('NV'): MapEntry<bool, String>(false, ''),
-  Expando<int>('\u{1f600}4y'): MapEntry<bool, String>(true, 'YTb\u{1f600}')
-};
-Map<Expando<int>, MapEntry<int, bool>> var291 = {
-  Expando<int>('k\u2665SXw'): MapEntry<int, bool>(32, false)
-};
-Map<Expando<int>, MapEntry<int, int>> var292 = {
-  Expando<int>('\u{1f600}h'): MapEntry<int, int>(0, 18),
-  Expando<int>(''): MapEntry<int, int>(18, 15),
-  Expando<int>('H\u{1f600}'): MapEntry<int, int>(10, 29),
-  Expando<int>('&x'): MapEntry<int, int>(36, 0),
-  Expando<int>('J'): MapEntry<int, int>(47, 43)
-};
-Map<Expando<int>, MapEntry<int, String>> var293 = {
-  Expando<int>(''): MapEntry<int, String>(19, 'gCDV1'),
-  Expando<int>('&lQLHS'): MapEntry<int, String>(37, '\u2665'),
-  Expando<int>('d'): MapEntry<int, String>(29, '9Ps'),
-  Expando<int>('e'): MapEntry<int, String>(45, 'mkF')
-};
-Map<Expando<int>, MapEntry<String, bool>> var294 = {
-  Expando<int>('\u2665b6ml4'): MapEntry<String, bool>('z8\u2665', false),
-  Expando<int>('3iA'): MapEntry<String, bool>('JE@v', false),
-  Expando<int>('DA'): MapEntry<String, bool>('cA\u2665', false),
-  Expando<int>('\u2665\u2665jwNR'): new MapEntry<String, bool>('', true)
-};
-Map<Expando<int>, MapEntry<String, int>> var295 = {
-  new Expando<int>('pYU'): MapEntry<String, int>('', 26)
-};
-Map<Expando<int>, MapEntry<String, String>> var296 = {
-  Expando<int>('X8\u2665\u{1f600}'):
-      new MapEntry<String, String>('Fc', 'ze\u2665'),
-  Expando<int>('B3gz'): MapEntry<String, String>('BiG#', 'g')
-};
-Map<Expando<String>, bool> var297 = {
-  Expando<String>('62KtgN'): true,
-  new Expando<String>('ob'): false
-};
-Map<Expando<String>, int> var298 = {
-  Expando<String>(''): 0,
-  Expando<String>(''): 7,
-  Expando<String>('FN1ut'): -63
-};
-Map<Expando<String>, String> var299 = {
-  Expando<String>('!Hnw!1F'): '\u{1f600}',
-  Expando<String>('8XtB'): 'Q',
-  Expando<String>('JTs'): 'kYXwZ!',
-  Expando<String>('cu\u{1f600}P1D)'): 'nl',
-  Expando<String>('q Vy'): 'a',
-  Expando<String>('0'): 'hy'
-};
-Map<Expando<String>, Expando<bool>> var300 = {
-  Expando<String>('n'): new Expando<bool>('#v7'),
-  Expando<String>('I\u{1f600}DU+bp'): Expando<bool>('f&'),
-  Expando<String>('\u{1f600}+RV'): Expando<bool>('ZOayLo'),
-  Expando<String>(')\u2665\u2665p\u{1f600}cf'): new Expando<bool>('Xm'),
-  Expando<String>('X(nV+nY'): Expando<bool>('1b'),
-  Expando<String>('ti\u2665'): Expando<bool>(' ')
-};
-Map<Expando<String>, Expando<int>> var301 = {
-  Expando<String>('wa@r-wY'): Expando<int>('Q'),
-  Expando<String>('+8YcLq'): Expando<int>(''),
-  Expando<String>('bMC\u2665'): Expando<int>('urG2w'),
-  Expando<String>('Se\u2665#e\u{1f600}'): Expando<int>('@F\u2665V B')
-};
-Map<Expando<String>, Expando<String>> var302 = {
-  Expando<String>(''): Expando<String>('A&'),
-  Expando<String>('Z)#K'): Expando<String>('H(UiG'),
-  Expando<String>('D1ONM+'): new Expando<String>('Z'),
-  Expando<String>('5+&aO9#'): Expando<String>('\u{1f600}V'),
-  Expando<String>('0l&Nbvs'): Expando<String>(')N(C2'),
-  Expando<String>('vfM'): Expando<String>('')
-};
-Map<Expando<String>, List<bool>> var303 = {
-  Expando<String>('r88'): [true, false, false],
-  Expando<String>('gj'): [true, true, true, true, true],
-  Expando<String>('FX'): [true, true, false, true],
-  Expando<String>('I3F'): [true, false],
-  Expando<String>(''): [false, true, true, true, true]
-};
-Map<Expando<String>, List<int>> var304 = {
-  Expando<String>('aS'): [-9223372034707292159, 11, 15, 9223372034707292160],
-  Expando<String>('u'): Uint64List.fromList(
-      Uint32List.fromList(Uint8ClampedList.fromList(Int16List(10))))
-};
-Map<Expando<String>, List<String>> var305 = {
-  Expando<String>('M+\u{1f600}\u{1f600}re'): ['ylMIq(\u2665', ''],
-  Expando<String>('X'): ['j4fRH', 'q\u2665', '3d\u2665Cy\u{1f600}k']
-};
-Map<Expando<String>, Set<bool>> var306 = {
-  Expando<String>('+rNw'): {true, false},
-  Expando<String>('zp1nkT'): {false},
-  Expando<String>(''): {false}
-};
-Map<Expando<String>, Set<int>> var307 = {
-  Expando<String>('KnRY'): {44, 4294967296, 4294967296, -36, -75},
-  Expando<String>(''): {26, -43},
-  new Expando<String>('M@Tco'): {-21},
-  Expando<String>('qe)f'): {29, -82, 35, -30}
-};
-Map<Expando<String>, Set<String>> var308 = {
-  new Expando<String>('HnVl'): {'\u{1f600}5z5'},
-  Expando<String>(''): {'\u{1f600}', '9ugafm', '7e\u{1f600}', 'W9', 'f\u2665'}
-};
-Map<Expando<String>, Map<bool, bool>> var309 = {
-  Expando<String>('t2\u{1f600}m15p'): {
-    true: true,
-    false: false,
-    true: true,
-    true: false,
-    true: false
-  }
-};
-Map<Expando<String>, Map<bool, int>> var310 = {
-  Expando<String>('cG@\u2665\u2665W'): {
-    true: -28,
-    false: -2147483649,
-    false: -73,
-    true: -65
-  },
-  Expando<String>('gL\u2665'): {false: -46, true: 46, false: -11},
-  Expando<String>('E1'): {true: -96}
-};
-Map<Expando<String>, Map<bool, String>> var311 = {
-  Expando<String>('&+@+pDj'): {true: '\u2665a\u26650W', true: 'xVzZ', true: '7'}
-};
-Map<Expando<String>, Map<int, bool>> var312 = {
-  Expando<String>('TxM(O&#'): {-13: false, -75: false, -46: false},
-  Expando<String>('PVASZn\u2665'): {33: true, -68: false, 15: false},
-  new Expando<String>('c'): {-3: true}
-};
-Map<Expando<String>, Map<int, int>> var313 = {
-  Expando<String>('\u26650DstdF'): {
-    42: -91,
-    -9223372030412324865: 46,
-    23: -1,
-    -70: 18
-  },
-  Expando<String>(''): {-72: 31, -84: 34, -85: 19, -12: 43},
-  Expando<String>('T0Y'): {5: -11},
-  Expando<String>('\u{1f600}Z!O'): {
-    48: 9223372032559808512,
-    6442450945: -28,
-    22: -79,
-    -59: -67,
-    -58: 8589934591
-  },
-  Expando<String>(''): {32: 43, 25: 47, -73: -5, -0: 16},
-  Expando<String>('\u2665qFIcms'): {-87: 9223372034707292161}
-};
-Map<Expando<String>, Map<int, String>> var314 = {
-  Expando<String>('PPM'): {-92: 'L9Bl'},
-  Expando<String>('bX'): {-69: '7\u{1f600}\u{1f600}'},
-  Expando<String>('\u{1f600}'): {37: '-sRbe'},
-  Expando<String>('eW&S'): {
-    -90: 'Ji)0\u2665Kx',
-    -9223372032559808511: 'YWh\u2665x@',
-    -78: 'ZZ-p4',
-    -84: 'GOeNvs'
-  }
-};
-Map<Expando<String>, Map<String, bool>> var315 = {
-  Expando<String>('6&'): {
-    'gkm\u2665Q': true,
-    '!ka': false,
-    'nd': false,
-    '8': true,
-    '': true
-  },
-  Expando<String>('Zs\u26656cL'): {
-    '2r4mm': false,
-    'KO74': false,
-    'aK2Q': false,
-    'EVma-7': true,
-    'qHAifN': true
-  },
-  Expando<String>('AZI'): {
-    '': false,
-    'gs': true,
-    '': true,
-    '': true,
-    '7\u{1f600}73': false
-  },
-  Expando<String>('z5K\u2665Q1s'): {
-    'ma': false,
-    '\u{1f600}': false,
-    'X)\u2665&0': true
-  },
-  Expando<String>('\u26659\u2665b@aA'): {'s89F+@': true, 'KTci': false},
-  Expando<String>('WN\u{1f600} \u2665'): {
-    'RGtehh': false,
-    'JjY\u{1f600}': false,
-    'LgM-': false,
-    'YJlako': true
-  }
-};
-Map<Expando<String>, Map<String, int>> var316 = {
-  Expando<String>('\u{1f600}hOK@l'): {
-    'J9SG#0y': -47,
-    '\u2665': -31,
-    '\u26651\u{1f600}b&\u2665': -35,
-    '-vWorUT': 17,
-    '6': 5
-  },
-  Expando<String>('\u{1f600}Vl'): {'\u{1f600}': 34, 'GK7vI8r': 23, '': 4},
-  Expando<String>('Ez!'): {
-    'u': 45,
-    'd2\u{1f600}HZg': 9223372032559808512,
-    'czAE 1I': 37,
-    'H\u26656': -72,
-    '': 9223372034707292160
-  }
-};
-Map<Expando<String>, Map<String, String>> var317 = {
-  Expando<String>('(mh'): {'yt\u2665TIh': '\u{1f600}U'},
-  Expando<String>('edV'): {
-    'Rl3GQy': 'OI',
-    'D\u{1f600}8W': 'HboKy@P',
-    'a': 'I9\u2665!B',
-    '': ')'
-  }
-};
-Map<Expando<String>, MapEntry<bool, bool>> var318 = {
-  Expando<String>('y-azeFH'): MapEntry<bool, bool>(true, true),
-  new Expando<String>('0RB'): MapEntry<bool, bool>(false, true),
-  new Expando<String>('\u{1f600}+8'): MapEntry<bool, bool>(false, true),
-  Expando<String>('KJ)45t'): MapEntry<bool, bool>(true, false)
-};
-Map<Expando<String>, MapEntry<bool, int>> var319 = {
-  Expando<String>('s3'): MapEntry<bool, int>(true, 18),
-  Expando<String>('g\u2665c'): MapEntry<bool, int>(false, 20)
-};
-Map<Expando<String>, MapEntry<bool, String>> var320 = {
-  Expando<String>('!0eCTrN'): MapEntry<bool, String>(true, ''),
-  Expando<String>('MP\u{1f600}\u{1f600}'):
-      new MapEntry<bool, String>(false, 'iHk\u{1f600}B'),
-  Expando<String>('@\u{1f600}'): MapEntry<bool, String>(true, ' o'),
-  Expando<String>('cC!OWT'): MapEntry<bool, String>(true, ''),
-  Expando<String>('Im\u{1f600}@1\u26655'): MapEntry<bool, String>(true, '04'),
-  new Expando<String>(''): MapEntry<bool, String>(true, '&QHf9')
-};
-Map<Expando<String>, MapEntry<int, bool>> var321 = {
-  Expando<String>('j'): MapEntry<int, bool>(3, false)
-};
-Map<Expando<String>, MapEntry<int, int>> var322 = {
-  Expando<String>('cxH1x5x'): new MapEntry<int, int>(24, 45)
-};
-Map<Expando<String>, MapEntry<int, String>> var323 = {
-  new Expando<String>('D'): MapEntry<int, String>(26, '3pM'),
-  Expando<String>('\u2665UZU'): MapEntry<int, String>(22, '&pLKM-\u{1f600}'),
-  Expando<String>('9g'): MapEntry<int, String>(40, '\u2665xw+mD')
-};
-Map<Expando<String>, MapEntry<String, bool>> var324 = {
-  Expando<String>('\u2665\u2665'): MapEntry<String, bool>('', true),
-  Expando<String>('f#keD\u2665!'):
-      MapEntry<String, bool>('6&\u{1f600}3CI', false),
-  Expando<String>('\u2665\u{1f600}Z6EZ'): MapEntry<String, bool>('X27', true),
-  Expando<String>('GFz67r'): MapEntry<String, bool>('D \u{1f600}e', false),
-  Expando<String>('AU I'): new MapEntry<String, bool>('P', false)
-};
-Map<Expando<String>, MapEntry<String, int>> var325 = {
-  Expando<String>('wW&+xMm'): MapEntry<String, int>('#CXm\u2665\u2665v', 2),
-  Expando<String>('qE\u2665Ro '): new MapEntry<String, int>('vl))#T', 4)
-};
-Map<Expando<String>, MapEntry<String, String>> var326 = {
-  Expando<String>('Pj'):
-      new MapEntry<String, String>('6\u266513A7', 'rz\u2665qxs'),
-  new Expando<String>('AqZ!q'): MapEntry<String, String>('AT', 'hyk'),
-  Expando<String>(''): MapEntry<String, String>('', 'kRuj'),
-  Expando<String>('@a-P'): MapEntry<String, String>('3qxy4', 'M8pKtYU'),
-  Expando<String>('\u2665n'): MapEntry<String, String>('CXT&uR', 't#T'),
-  Expando<String>('E4\u{1f600}Z@'): MapEntry<String, String>('m', 'Qh\u{1f600}')
-};
-Map<List<bool>, bool> var327 = {
-  [false, false]: false,
-  [false, true, true]: false,
-  [false]: true,
-  [false]: true,
-  [true, true, false]: true,
-  [true, false]: false
-};
-Map<List<bool>, int> var328 = {
-  [true, true, true, true]: -54
-};
-Map<List<bool>, String> var329 = {
-  [true, true]: 'r'
-};
-Map<List<bool>, Expando<bool>> var330 = {
-  [true, true, true]: Expando<bool>('!jj\u{1f600}0Am'),
-  [true, false, true]: Expando<bool>(''),
-  [false, true, false, true]: Expando<bool>('-H'),
-  [false]: Expando<bool>('K6q')
-};
-Map<List<bool>, Expando<int>> var331 = {
-  [false, false, true]: Expando<int>('uH-Vc\u{1f600}'),
-  [true, true, false, true, false]: Expando<int>('P'),
-  [false, false, false, false]: Expando<int>('lM')
-};
-Map<List<bool>, Expando<String>> var332 = {
-  [true]: Expando<String>('i75veY'),
-  [false, true]: Expando<String>('oM!'),
-  [false, true, false]: Expando<String>(''),
-  [true, true, true]: Expando<String>('8aeOcF\u{1f600}'),
-  [false, false, true]: Expando<String>('U+s'),
-  [false, true, true]: Expando<String>('qg@\u2665O')
-};
-Map<List<bool>, List<bool>> var333 = {
-  [false, true, false, true, false]: [true],
-  [true, true, false]: [true, false, true],
-  [true, true, false, true, false]: [false, true]
-};
-Map<List<bool>, List<int>> var334 = {
-  [true, true]: new Int32List(43),
-  [true]: Uint8List.fromList(Uint32List.fromList(Int64List(12)))
-};
-Map<List<bool>, List<String>> var335 = {
-  [false]: ['7bY9@']
-};
-Map<List<bool>, Set<bool>> var336 = {
-  [true, true, true, true, false]: {true, true, false},
-  [false, true, true, true]: {true, false, false, false},
-  [false, true, false, false, true]: {false},
-  [true, false, true, true]: {true, false},
-  [false, true, false, false, false]: {true, true, true},
-  [false]: {true, false, true, false}
-};
-Map<List<bool>, Set<int>> var337 = {
-  [true, false, true]: {20, -51, 6442450943, 27, 41},
-  [true, true]: {-14, 40, 26, -41}
-};
-Map<List<bool>, Set<String>> var338 = {
-  [false]: {'o&+KL', 'eP', '', 'tDxa'},
-  [true, false, true, false, false]: {'DMjCmq'}
-};
-Map<List<bool>, Map<bool, bool>> var339 = {
-  [false, true]: {false: true, false: true},
-  [false, false]: {
-    true: true,
-    true: false,
-    false: false,
-    false: true,
-    true: true
-  },
-  [true, false]: {true: true},
-  [false, false, true, true, false]: {false: true, false: false, false: false},
-  [true, false, true, false, false]: {
-    false: false,
-    true: false,
-    false: false,
-    true: true,
-    false: false
-  }
-};
-Map<List<bool>, Map<bool, int>> var340 = {
-  [true]: {true: -74, false: 6442450943, false: 26, true: -44}
-};
-Map<List<bool>, Map<bool, String>> var341 = {
-  [true, true]: {
-    true: '\u2665()\u{1f600}',
-    false: '+',
-    true: 'p4\u{1f600}3',
-    false: 'i',
-    true: 'D'
-  },
-  [false, false]: {false: '', true: '7b'},
-  [false, true]: {
-    true: 's',
-    true: 'O\u2665r',
-    false: 'W',
-    false: ' H499i',
-    true: 'U\u2665Z-Md'
-  },
-  [true, false, true]: {true: 'LU'},
-  [true, false, false]: {
-    false: 'T&c',
-    true: 'Z0 6\u{1f600}dA',
-    false: 's(Jt38q'
-  }
-};
-Map<List<bool>, Map<int, bool>> var342 = {
-  [true, true, true, true, true]: {21: true},
-  [true, true, true]: {-38: false, 33: false}
-};
-Map<List<bool>, Map<int, int>> var343 = {
-  [true, false]: {38: 36, 46: 32, -88: -10, -9223372030412324863: -15},
-  [true, false, true, true, true]: {14: -22, 9: 21, 45: 39},
-  [true, false, true, false]: {9223372034707292161: -1, 0: 34, 4294967296: -32}
-};
-Map<List<bool>, Map<int, String>> var344 = {
-  [false, true]: {36: 'hPH'},
-  [false, true, true, true, false]: {
-    3: 'Cz\u2665)Q1',
-    44: '\u{1f600}t\u{1f600}',
-    -24: 'Sb',
-    27: 'mZi'
-  },
-  [false, true]: {
-    -54: '\u266520\u{1f600}b',
-    19: '7UJf',
-    1: 'ZPkJgl',
-    -74: 'Sf1xxUN',
-    25: 'N'
-  },
-  [true, true, true, true]: {7: 'a\u266589w', -59: 'vg', -91: 'zvFq'}
-};
-Map<List<bool>, Map<String, bool>> var345 = {
-  [false]: {'A)!8bIp': true},
-  [true, true, true, false, true]: {'OP': true}
-};
-Map<List<bool>, Map<String, int>> var346 = {
-  [false, false]: {
-    '7KGnR2Y': -96,
-    'n\u2665A\u{1f600}': 40,
-    '\u{1f600}': -9223372034707292161
-  },
-  [true, true, false, true]: {'K': 37, '': 38, '!m-#': -49},
-  [true, false]: {'zsO6Sk\u{1f600}': 8},
-  [true]: {'Q': 2147483649, 'RE8': 43, 'tM24b6y': -50, '2\u2665P\u2665WL': -43},
-  [true, true]: {'m': 15, '': 11}
-};
-Map<List<bool>, Map<String, String>> var347 = {
-  [true]: {'6&oz-T': 'vh!A', 'tb\u2665': '9q'},
-  [true, false, false, false]: {'o': 'jA\u{1f600}', '6#S 0e': 'TA'},
-  [true, true, true]: {
-    '4abo': '',
-    'f': 'G19z',
-    't5As': 'LoMBQ',
-    'X\u{1f600}O': 'N5'
-  },
-  [false, false]: {
-    '&6qzt': '2w',
-    'ylk ': 'z8o',
-    'KM!#br': 'Er\u{1f600}pw5M',
-    'J(I\u{1f600}': '\u{1f600}RX9\u2665c'
-  },
-  [false, true, false]: {
-    'uX': 'i9\u{1f600}6XU',
-    'z6R': '#WQ(W',
-    'Wy2': 'g(',
-    'Qr': '+'
-  },
-  [true, false, true, true, false]: {
-    'NhX\u{1f600}': '5rQt\u26650w',
-    ')nFFr': 'tTzqg',
-    '1': '&EPc1V',
-    'IU4U p': '-W\u{1f600}7I',
-    'P6': '5'
-  }
-};
-Map<List<bool>, MapEntry<bool, bool>> var348 = {
-  [false, false]: new MapEntry<bool, bool>(false, false),
-  [true, true]: MapEntry<bool, bool>(false, false),
-  [true, true, false, false, true]: MapEntry<bool, bool>(true, true),
-  [true, true, true, true]: MapEntry<bool, bool>(false, true)
-};
-Map<List<bool>, MapEntry<bool, int>> var349 = {
-  [false, false, true, false, false]: MapEntry<bool, int>(false, 11),
-  [false, true, true, false, true]: MapEntry<bool, int>(false, 5),
-  [true, true, true]: MapEntry<bool, int>(false, 9),
-  [true, false]: MapEntry<bool, int>(false, 3)
-};
-Map<List<bool>, MapEntry<bool, String>> var350 = {
-  [true, true, true]: MapEntry<bool, String>(true, '\u2665up'),
-  [false, true, false]: MapEntry<bool, String>(true, '&x5m')
-};
-Map<List<bool>, MapEntry<int, bool>> var351 = {
-  [false, true, false]: new MapEntry<int, bool>(38, false),
-  [false, false, false, true, false]: MapEntry<int, bool>(10, false),
-  [false, true, false, true]: MapEntry<int, bool>(11, false),
-  [true]: MapEntry<int, bool>(12, true)
-};
-Map<List<bool>, MapEntry<int, int>> var352 = {
-  [true, false, true]: MapEntry<int, int>(8, 39),
-  [true, false]: new MapEntry<int, int>(49, 22)
-};
-Map<List<bool>, MapEntry<int, String>> var353 = {
-  [false, false, true, false, true]: MapEntry<int, String>(21, 'xFRNS)'),
-  [true, false]: MapEntry<int, String>(10, 'QI6EIS'),
-  [true, false, false, true]: MapEntry<int, String>(17, 'Bg\u{1f600}'),
-  [false, true, false]: MapEntry<int, String>(9, '#t\u{1f600}\u2665 ')
-};
-Map<List<bool>, MapEntry<String, bool>> var354 = {
-  [false]: MapEntry<String, bool>('keI', true),
-  [false, true, false]: new MapEntry<String, bool>('b', true),
-  [true]: new MapEntry<String, bool>('Sc', false)
-};
-Map<List<bool>, MapEntry<String, int>> var355 = {
-  [true, true, true]: new MapEntry<String, int>('K8i', 48),
-  [true]: MapEntry<String, int>('7W', 4),
-  [false, false]: MapEntry<String, int>('2S)V#6', 21),
-  [true, false, false, false]: MapEntry<String, int>('', 9)
-};
-Map<List<bool>, MapEntry<String, String>> var356 = {
-  [false, true, false, false]: MapEntry<String, String>('', '&i8Kd\u{1f600}'),
-  [false, false, true, true]: MapEntry<String, String>('BDT0u2y', 'bu'),
-  [true, false, false, false]: MapEntry<String, String>('', 'Fpe1am'),
-  [false, false, false]: MapEntry<String, String>('0-t', ''),
-  [false, true, true]: MapEntry<String, String>('m!(00', '5W(HW')
-};
-Map<List<int>, bool> var357 = {
-  Uint8List.fromList(Uint64List.fromList(Int16List.fromList(Int8List(24)))):
-      true,
-  Int16List.fromList(Int8List(39)): false,
-  Uint64List.fromList(Int16List(5)): true,
-  Uint32List(21): false,
-  [-43, -9223372034707292161]: true
-};
-Map<List<int>, int> var358 = {
-  Uint16List(0): 23,
-  Uint64List.fromList(Int32List.fromList(Int8List(42))): 31,
-  Uint64List.fromList(Uint8ClampedList.fromList(Uint8ClampedList(30))): -8
-};
-Map<List<int>, String> var359 = {
-  Int16List.fromList([13, -53, 12]): '2Hkp',
-  Int64List.fromList(Int32List(48)): 'pE 0&Kb',
-  [-42, -49, 2147483649]: '34dma'
-};
-Map<List<int>, Expando<bool>> var360 = {
-  new Uint32List(39): new Expando<bool>('rA)\u2665b'),
-  [-3, 4, -61, -89, -51]: Expando<bool>('RLx)WgD'),
-  [-69, -50]: Expando<bool>(''),
-  Uint16List.fromList(Int64List.fromList(Uint8ClampedList(7))):
-      Expando<bool>('U'),
-  [1, 47]: Expando<bool>('EvNqpv')
-};
-Map<List<int>, Expando<int>> var361 = {
-  [40, -97, 47, 17]: Expando<int>(''),
-  [-9223372030412324863, -91, -9]: new Expando<int>('SjfAOV0')
-};
-Map<List<int>, Expando<String>> var362 = {
-  Uint64List.fromList(
-          Uint8ClampedList.fromList(Int8List.fromList(Uint16List(47)))):
-      new Expando<String>('rS(YMW')
-};
-Map<List<int>, List<bool>> var363 = {
-  Int64List.fromList([-68, 2]): [false, false, true, true],
-  Uint8ClampedList(7): [false, false, true, true, true],
-  Uint32List(11): [false, false, false],
-  Uint8ClampedList(39): [false, true, true, false, false],
-  Uint32List(32): [false, false]
-};
-Map<List<int>, List<int>> var364 = {
-  Uint16List.fromList(Int32List(30)): Int16List.fromList(Uint64List(41)),
-  Uint64List(5): Uint8ClampedList(15),
-  Uint8List.fromList(
-          Uint16List.fromList(Uint8ClampedList.fromList(Int8List(29)))):
-      Int8List(7),
-  Uint64List(16): Uint8List.fromList(
-      Uint8ClampedList.fromList(Int8List.fromList(new Uint32List(14)))),
-  [22, 49, 7, -22, 16]:
-      Int32List.fromList(Int64List.fromList(Uint8ClampedList(18)))
-};
-Map<List<int>, List<String>> var365 = {
-  Uint8ClampedList(35): ['', '!', '!', '5N9\u{1f600}', 'H'],
-  Uint64List.fromList(
-      Uint16List.fromList(Uint8ClampedList.fromList(Uint8List(5)))): [
-    'pe\u2665'
-  ],
-  [-55]: [')RLj']
-};
-Map<List<int>, Set<bool>> var366 = {
-  Uint16List.fromList(Int32List(15)): {false, true},
-  Uint16List(14): {true},
-  Int64List.fromList(new Uint32List(28)): {false},
-  Int16List.fromList(Int32List(8)): {true},
-  [-82]: {true, false, true},
-  [-30]: {false, false, false}
-};
-Map<List<int>, Set<int>> var367 = {
-  Uint16List.fromList(Int64List.fromList(Uint32List(4))): {-97, -37},
-  Uint8ClampedList.fromList(
-      Int32List.fromList(Uint32List.fromList(Int8List.fromList([16])))): {
-    -9223372032559808511,
-    -24,
-    45,
-    -58,
-    26
-  },
-  [-45, -48, -36, 25]: {24},
-  Uint32List(34): {6442450943, 5, -49, -14, 8589934591}
-};
-Map<List<int>, Set<String>> var368 = {
-  [5, -41, 4294967296, -65, -60]: {'uYO&&', '', 'diE#\u2665z'},
-  Uint32List(38): {'iO'}
-};
-Map<List<int>, Map<bool, bool>> var369 = {
-  Uint32List.fromList(Int8List.fromList(Uint16List(11))): {
-    false: false,
-    false: false,
-    false: false,
-    false: true
-  },
-  Int64List.fromList(Uint8ClampedList.fromList(Uint64List(36))): {false: true},
-  Int8List(0): {false: false, true: true, false: false},
-  Uint16List.fromList(Int64List.fromList(Int8List(28))): {
-    true: false,
-    false: true,
-    false: true
-  }
-};
-Map<List<int>, Map<bool, int>> var370 = {
-  Int8List(5): {true: 18, true: 4, false: 8589934591, false: 5, true: 19}
-};
-Map<List<int>, Map<bool, String>> var371 = {
-  Uint16List(25): {
-    true: 'xl\u{1f600}',
-    false: 'H3E',
-    true: 'NdHmw',
-    false: '0JtCw#t',
-    false: 'GX'
-  },
-  Uint32List(14): {false: 'W8', true: 'rGEg@2'},
-  Uint16List(12): {true: '\u{1f600}ga'},
-  Int16List.fromList(Uint16List.fromList(Int32List.fromList([34]))): {
-    true: 'p@sT7sZ',
-    true: '',
-    true: 'u\u{1f600}u',
-    false: '38',
-    true: '\u{1f600}&&Fg'
-  },
-  Int16List(36): {
-    false: 'dhOC2',
-    false: 'y\u2665@9',
-    false: 'HJIkR#',
-    true: '\u2665',
-    true: 't!Ab)'
-  }
-};
-Map<List<int>, Map<int, bool>> var372 = {
-  Int64List(3): {-88: false, 44: true},
-  [21, -15, 20, -6]: {-9223372030412324863: true, 29: false},
-  Int8List.fromList(Uint8List.fromList(
-      Int64List.fromList(Int8List.fromList(Uint16List(46))))): {
-    12: false,
-    31: false,
-    -55: false,
-    -34: true,
-    47: true
-  }
-};
-Map<List<int>, Map<int, int>> var373 = {
-  [24, -46, -51]: {-45: -0},
-  [-19, -26, 29, 6442450944, 38]: {-52: 7, -97: 8, -4294967296: 10, -74: -8},
-  Uint64List(34): {-9223372036854775808: 23, 4: -70}
-};
-Map<List<int>, Map<int, String>> var374 = {
-  Uint64List.fromList(Int64List.fromList([5])): {-70: '3dNyxO('},
-  Uint32List(30): {10: '6Y&R\u2665', 44: 'j', -26: 'Pd!V'},
-  new Uint8List(18): {16: '4&dmj', 45: 'J I&q', -64: '(z'},
-  [-56]: {-66: 'Ng\u{1f600}'},
-  Int64List(31): {-23: '0NtH 4c', -52: 'KLv\u2665', -99: '@n\u2665!'}
-};
-Map<List<int>, Map<String, bool>> var375 = {
-  Int64List.fromList(Int32List.fromList([-12])): {
-    'e': false,
-    '': true,
-    'JSA@': true
-  },
-  [33, 4, 10, -9223372034707292160, 19]: {
-    '8wi@': true,
-    'YFDjF': true,
-    'e)E5': false,
-    'I1j)&': false
-  }
-};
-Map<List<int>, Map<String, int>> var376 = {
-  [-2147483647, 32]: {'CIFeJNR': 42},
-  Int8List.fromList(Int32List.fromList(Uint8ClampedList.fromList([-4]))): {
-    '5': -4294967295
-  },
-  Uint16List(7): {'!b': -26}
-};
-Map<List<int>, Map<String, String>> var377 = {
-  Int32List(4): {
-    'DVp(eJ': 'fK9fvnK',
-    'jj6mCe': '\u2665',
-    '1\u{1f600}A3O\u{1f600}T': 'W!rZSWi',
-    '': ''
-  },
-  Int64List.fromList(Uint32List.fromList(Uint32List.fromList(Uint8List(25)))): {
-    'f5cA\u2665u': 'I4g',
-    'W\u2665kF&rC': 'HYP)V',
-    'vQ!r1': '(#iE\u2665gW'
-  }
-};
-Map<List<int>, MapEntry<bool, bool>> var378 = {
-  Int32List.fromList(Int64List(18)): MapEntry<bool, bool>(false, true),
-  new Uint8ClampedList(22): new MapEntry<bool, bool>(false, true),
-  Int64List.fromList(Int16List(2)): MapEntry<bool, bool>(false, true)
-};
-Map<List<int>, MapEntry<bool, int>> var379 = {
-  Uint64List.fromList(Uint8ClampedList(16)): MapEntry<bool, int>(false, 14)
-};
-Map<List<int>, MapEntry<bool, String>> var380 = {
-  Uint8ClampedList.fromList(Uint16List(12)): MapEntry<bool, String>(true, 'TH'),
-  Uint8ClampedList(26): MapEntry<bool, String>(false, ''),
-  Uint8List.fromList(Int8List(42)): MapEntry<bool, String>(false, 'U9oyRh'),
-  [37, -36, 6]: MapEntry<bool, String>(true, 'Ksb'),
-  Int8List.fromList(Uint64List.fromList(Uint16List(34))):
-      MapEntry<bool, String>(true, 'yzSMbLS'),
-  Uint8List(19): MapEntry<bool, String>(true, 'k\u2665zos@g')
-};
-Map<List<int>, MapEntry<int, bool>> var381 = {
-  Int32List(38): MapEntry<int, bool>(35, false),
-  Uint8List.fromList(new Uint8ClampedList(41)): MapEntry<int, bool>(20, true)
-};
-Map<List<int>, MapEntry<int, int>> var382 = {
-  Int32List.fromList([40, 37]): MapEntry<int, int>(20, 21)
-};
-Map<List<int>, MapEntry<int, String>> var383 = {
-  Uint32List.fromList(new Uint8ClampedList(31)):
-      MapEntry<int, String>(16, 'zylth')
-};
-Map<List<int>, MapEntry<String, bool>> var384 = {
-  Uint8List.fromList(Uint16List(43)): MapEntry<String, bool>('\u2665d', true),
-  [-28, -9223372032559808512, -64]: MapEntry<String, bool>('@jw', false),
-  Uint16List.fromList([-3, 27, -15]): MapEntry<String, bool>('', false),
-  Uint32List.fromList(Int64List(13)): MapEntry<String, bool>('', true)
-};
-Map<List<int>, MapEntry<String, int>> var385 = {
-  Uint8List.fromList(Int16List(14)):
-      MapEntry<String, int>('9MFlDq\u{1f600}', 14),
-  Uint64List(21): MapEntry<String, int>('', 22),
-  Uint16List(47): MapEntry<String, int>('iX', 15),
-  Int32List.fromList(Uint8List(27)): MapEntry<String, int>(' R2vo', 37),
-  Uint8ClampedList.fromList(Uint32List(39)): MapEntry<String, int>('PsTRg7', 42)
-};
-Map<List<int>, MapEntry<String, String>> var386 = {
-  Uint16List(19): MapEntry<String, String>('H71c\u2665', ''),
-  Uint32List.fromList(Uint64List(4)): MapEntry<String, String>('', 'qr7'),
-  Int64List.fromList(Uint16List(34)):
-      MapEntry<String, String>('', 'BHR\u2665RSU'),
-  Uint8List.fromList(Uint64List(16)): MapEntry<String, String>('-', 'Bft'),
-  Int64List.fromList(Uint32List(21)):
-      MapEntry<String, String>('o', '\u{1f600}S')
-};
-Map<List<String>, bool> var387 = {
-  ['', '\u26659 @o', '(C9F', 'Jg', '']: false,
-  ['qg-Ck']: true,
-  ['', '7Ix9(T', 'lx', 'K(e0F)2']: true,
-  [' n&9vb', '\u{1f600}C', '\u2665x']: true
-};
-Map<List<String>, int> var388 = {
-  ['Qul1', '3Od7W@\u{1f600}', 'q7TH\u26654', '\u2665YTm\u2665', ' !7']: 23,
-  ['sv (', '5#VQ!h']: -14,
-  ['iBp', 'Ma\u26651A']: 46,
-  ['\u2665e7', '', 'cyw']: -87,
-  ['0 \u{1f600}v', 'N6 7', '3@@X)', 'W']: 7,
-  ['0', '6qv6']: 30
-};
-Map<List<String>, String> var389 = {
-  ['Gc3']: ''
-};
-Map<List<String>, Expando<bool>> var390 = {
-  ['\u{1f600}GO', 'K(bo', 'yAl']: Expando<bool>('f'),
-  ['ZYUB2', 'nA+P47', 'RUF)\u{1f600}rN']: Expando<bool>('px)h+\u2665 '),
-  ['']: Expando<bool>('9il'),
-  ['\u2665\u{1f600}K7H', 'IRwUlEp', 'U+\u2665']: new Expando<bool>('@TLIaC'),
-  ['A#', 'S6au\u{1f600}Y', 's', 'FOQo', '98arJ']: Expando<bool>('d')
-};
-Map<List<String>, Expando<int>> var391 = {
-  ['EX', 'a6PG', 'm']: Expando<int>(''),
-  ['PX', '@Dv', 'I5DP']: Expando<int>('4YK+Vu')
-};
-Map<List<String>, Expando<String>> var392 = {
-  ['P)w', '', 'qT5kxy']: Expando<String>('VA6gy\u2665k'),
-  ['+jw kW']: Expando<String>('rE'),
-  ['7', '+', 'bU9']: Expando<String>('ss\u{1f600})-+K'),
-  ['\u{1f600}\u{1f600}', '@iHXM2p', 'V', 'dwkpb']: new Expando<String>('g0T')
-};
-Map<List<String>, List<bool>> var393 = {
-  ['L3V7K7n', 'tqlHZ', 'pi', '&']: [false, false, true]
-};
-Map<List<String>, List<int>> var394 = {
-  ['j0', '']: Int32List.fromList(Uint32List(31)),
-  ['tl', 'v(CSK4\u{1f600}', 'FtI6K']: [4294967297, 17, 7, 2147483649],
-  ['\u2665d4\u2665LH', '3vgT(', 'mXPPZg6', '']: Uint16List(16),
-  ['', '']: Uint8ClampedList(40)
-};
-Map<List<String>, List<String>> var395 = {
-  ['']: ['hPAmx\u2665', 'ae+ n(', 'PJFm', 'IzE', 'L@'],
-  ['rChDXur', 'Z8(rO\u{1f600}']: ['ouTu+Fx'],
-  ['']: ['gYn', 'E(UwcT1', 'fQEd', 'GO'],
-  ['O\u{1f600}PA', 's\u2665p', 'M', 'BqQjkL\u2665']: ['c', '', ''],
-  ['N', '!7P+']: ['2P4v&n', 'LE\u{1f600}', ')a3']
-};
-Map<List<String>, Set<bool>> var396 = {
-  ['CCl2\u{1f600}r']: {true, false, true, true},
-  ['\u2665tFs', 'yv\u2665']: {true, true, true, false, false}
-};
-Map<List<String>, Set<int>> var397 = {
-  ['CUM9TQB', '', '-@7(p', 'wWp\u{1f600}e\u{1f600}F']: {32, -90, -66, -88, -16},
-  ['', 'Fn#JFM', 'L', 'KK', 'U']: {-42}
-};
-Map<List<String>, Set<String>> var398 = {
-  ['8oW6&', '\u{1f600}p']: {'LMq', '4arxN', ' \u{1f600}H2PpL'},
-  ['vC\u{1f600}B@', '-IgWaA', 'fgu', 'Fok', '2OE']: {'tFSTv', 'Fbs#c'},
-  ['( ']: {'+P', '@7', '\u2665m'}
-};
-Map<List<String>, Map<bool, bool>> var399 = {
-  ['&siYeL', '\u2665VdU+', 'VI+j0XW', '', 'd!Bw8F']: {false: true},
-  ['', '8jGF6@S']: {false: true},
-  ['!', 'z-87wVu']: {
-    true: true,
-    false: false,
-    true: false,
-    true: true,
-    true: false
-  },
-  ['ot', '', 'nsob\u{1f600}']: {
-    false: true,
-    true: true,
-    true: true,
-    true: false
-  }
-};
-Map<List<String>, Map<bool, int>> var400 = {
-  ['r0D75D', 'kyT ', 'pS\u2665X', 'WT', '1 Yqopl']: {false: -1},
-  ['RSNeAr', 'D2JK', '!Mcs4&Z', 'oto']: {
-    false: 9,
-    false: 0,
-    false: 18,
-    false: 4294967296,
-    true: -73
-  },
-  ['T', '  b', '', '9Njt']: {
-    false: -44,
-    false: -2,
-    false: -13,
-    true: -0,
-    false: -86
-  },
-  ['SON)', 'url96nh', '']: {true: 34, true: -54, false: -38, true: -43}
-};
-Map<List<String>, Map<bool, String>> var401 = {
-  ['qa']: {
-    false: '1c\u2665G+H',
-    true: 'jh',
-    false: 'DwdlPZE',
-    false: 'nGM4 U!'
-  },
-  ['8)QU!Bh']: {
-    false: '',
-    false: 'Wpv',
-    true: '8g',
-    false: '9IwQ',
-    true: 'aSBf2'
-  },
-  ['bR84E\u2665', '#3Jxk1', 'b ', '+aJSA!', '']: {
-    false: 'J\u{1f600}Iz1',
-    false: 'GqDyu',
-    true: '  wrEDJ'
-  },
-  ['', '5\u2665jaB', 'uX\u2665', 'zHZxxxw', 'UU\u{1f600}GL']: {true: '+'},
-  ['Ot6(b', 'd#N2-', 'a\u2665zZ6', 'iJgQvH']: {
-    false: '\u2665R',
-    true: 'O\u{1f600}b',
-    true: 's5',
-    false: ')'
-  }
-};
-Map<List<String>, Map<int, bool>> var402 = {
-  ['!M3 Z3g', 'kwi', '\u2665']: {-28: false, -91: true, -1: true},
-  ['Oh\u{1f600}', '']: {23: true},
-  ['\u{1f600}r)', '9@mO\u{1f600}\u2665', '', '']: {
-    -93: true,
-    16: true,
-    -7: false,
-    -40: true,
-    -9223372032559808513: false
-  },
-  ['A\u2665k', '\u2665Dn\u{1f600}', 'ZXj!', '', '']: {
-    4: false,
-    -21: true,
-    46: false
-  }
-};
-Map<List<String>, Map<int, int>> var403 = {
-  ['n\u2665\u2665K5E\u2665', '6&qMMK', '', 'x1R', '2#ch']: {
-    -75: 5,
-    45: 49,
-    13: 19,
-    0: 34,
-    -79: 10
-  }
-};
-Map<List<String>, Map<int, String>> var404 = {
-  ['&H1', 'U+#\u2665Yy', 'L2', '8a', 'F3V']: {-77: 'ic\u{1f600}k'}
-};
-Map<List<String>, Map<String, bool>> var405 = {
-  ['aCY', 'V9!Mx', 'iUPBi']: {'S9Q\u{1f600}FA1': true}
-};
-Map<List<String>, Map<String, int>> var406 = {
-  ['octfe', 'h\u2665', 'hXHQw1z']: {'1uYV': 41, '\u{1f600}\u{1f600}M': -37},
-  ['BHkU']: {'': -17},
-  ['0uSL']: {'ik\u{1f600}cv5': -45},
-  ['', '#9sX', 'Da', '', '80a+r']: {'!ds\u{1f600}': 6, '\u26654': 44},
-  ['DM\u2665', '\u{1f600}!ElAe', 'x7MU', 'I#\u26653', '@']: {
-    'H+p\u{1f600}': -45,
-    'DV40kpv': -69,
-    'ctAG': 2,
-    'G7': 0
-  }
-};
-Map<List<String>, Map<String, String>> var407 = {
-  ['t+Nypn', '']: {
-    '\u{1f600}llH': 'y',
-    'U3p4wh': '',
-    'pcnF': 'q\u2665 \u2665-W',
-    'NBt\u{1f600}': 'f+TJ',
-    'B1': 'JhGGc'
-  },
-  ['H', 'x\u2665s6sp']: {'DCZo': '', 'zc': 'f9Y', 'bM@A': '8hIff '},
-  ['', '6P@', 'xrd&4']: {
-    '&\u{1f600}RhWb': '',
-    'h\u2665\u{1f600}': '',
-    'w': '6iDTx\u{1f600}\u2665',
-    'ygLBC': 'h4uv+ko'
-  },
-  ['+V', 'ITX', 'W5', 'ZIp\u2665c', 'rW']: {
-    'IOJ': 'NNycdJ0',
-    'sqX(': '\u{1f600}',
-    'G': 'R'
-  },
-  ['s', 'kjg', 'kKMYx']: {
-    'b': 'qjN3',
-    'kg\u{1f600})g\u2665e': '\u266563\u{1f600}\u{1f600}k',
-    '': 'q\u{1f600}A3'
-  },
-  ['B', '', '+-Dv', 'Kli', '']: {
-    '\u{1f600}f-e\u2665': '1Nq3\u{1f600}n',
-    'A': '-'
-  }
-};
-Map<List<String>, MapEntry<bool, bool>> var408 = {
-  ['\u2665\u2665f', 'L&ELGj', 'Y#j', '3h', 'sdy\u26652']:
-      MapEntry<bool, bool>(true, true),
-  ['RYnkDU', 'P\u{1f600}JC\u2665', '']: MapEntry<bool, bool>(true, true),
-  ['S\u{1f600}z2\u2665y-', 'Cw']: MapEntry<bool, bool>(true, false),
-  ['0E(UY', 'xKtf\u2665', 'n0s6@D', 'pRm', '76FP']:
-      MapEntry<bool, bool>(true, false),
-  ['', '']: MapEntry<bool, bool>(true, false),
-  ['gzC3X', 'BIM']: MapEntry<bool, bool>(false, true)
-};
-Map<List<String>, MapEntry<bool, int>> var409 = {
-  ['1gt8f@7', '#Elli', '2r\u266554N8', 'Hno', '#P']:
-      MapEntry<bool, int>(true, 25),
-  ['\u{1f600}', '', '(A)k', 'O']: new MapEntry<bool, int>(false, 47),
-  ['1\u{1f600}EXakE', '2IMGfHh', 'h\u26655Uz S', '4']:
-      MapEntry<bool, int>(false, 25),
-  ['W\u{1f600}#Wnl', '\u{1f600}(-', 'v']: MapEntry<bool, int>(true, 21)
-};
-Map<List<String>, MapEntry<bool, String>> var410 = {
-  ['OU', '', '\u{1f600}o', '-D\u{1f600}7g', '']:
-      MapEntry<bool, String>(true, 't-s\u2665vm2'),
-  ['iaOWvBp', '\u{1f600}7cBY', 'zz\u{1f600}\u2665E', '', 'ic']:
-      MapEntry<bool, String>(true, 'gY'),
-  ['o', '04PLMK', 'EMVABxg', 'L']: MapEntry<bool, String>(false, '#'),
-  ['8yii pG']: MapEntry<bool, String>(true, ''),
-  ['Sj', 'W']: MapEntry<bool, String>(true, '')
-};
-Map<List<String>, MapEntry<int, bool>> var411 = {
-  ['z', '\u{1f600}pI6v']: MapEntry<int, bool>(46, true),
-  ['@xY\u2665', '\u{1f600}V']: new MapEntry<int, bool>(48, false),
-  ['g\u2665HbXp', '9qQb1V', 'J\u2665gX', 'A0Iv']: MapEntry<int, bool>(27, true),
-  ['SzF)HW', 'gMU', 'KmpP', '\u{1f600}ANrFnc', 'y\u2665']:
-      MapEntry<int, bool>(9, true),
-  ['BCb', 'ISGNZ4', '\u{1f600}i', '87\u266506']: MapEntry<int, bool>(46, false)
-};
-Map<List<String>, MapEntry<int, int>> var412 = {
-  ['dgu\u2665\u2665W-', '3p\u{1f600}Q', 'vWi', '7qg&', 'S']:
-      MapEntry<int, int>(43, 24)
-};
-Map<List<String>, MapEntry<int, String>> var413 = {
-  ['Q']: MapEntry<int, String>(10, '2b')
-};
-Map<List<String>, MapEntry<String, bool>> var414 = {
-  ['Gxf', 'wa', '']: MapEntry<String, bool>('wg9fUY+', false),
-  ['\u2665', 'Jc', 'RlR', 'hc\u2665P', 'DTDjB']:
-      MapEntry<String, bool>('T)(8', false),
-  ['9t']: MapEntry<String, bool>('Yd', true),
-  ['!JMe', '5R7N!', 'YPZa']: MapEntry<String, bool>('KP!y)A', true),
-  ['a@D9']: MapEntry<String, bool>('V', false)
-};
-Map<List<String>, MapEntry<String, int>> var415 = {
-  ['']: MapEntry<String, int>('', 27),
-  ['V@\u{1f600}1', 'AMaa', 'N@4N', '']: MapEntry<String, int>('Kl', 46),
-  ['I&', '5GH', 'h\u{1f600}', '!H7\u2665#']: MapEntry<String, int>('!BzB', 9),
-  ['']: MapEntry<String, int>('6\u{1f600}q', 13),
-  ['sad', ')\u{1f600}FrZh', 'hziw', 'BD)S)lu']:
-      MapEntry<String, int>(')\u{1f600})zt', 20),
-  ['S@B', '8ip1+G']: MapEntry<String, int>('mFLWz', 7)
-};
-Map<List<String>, MapEntry<String, String>> var416 = {
-  ['YchLPjp', '', 'aVqd', 'T\u{1f600}G']:
-      new MapEntry<String, String>('7Tu\u{1f600}', ''),
-  [' wZ)(im', 'fMQMT', '@mnmAPv']: MapEntry<String, String>('DiQkn-#', 's7B'),
-  ['', 'W0', 'Xu&69Yg', 'zl', 'w Tg t']:
-      MapEntry<String, String>('ExO', 'Gs1&\u2665e\u{1f600}'),
-  ['@LBWnOw', '4']: MapEntry<String, String>('E\u26659\u{1f600}d', 'grJ'),
-  ['RM', 'y3d#', '!']: MapEntry<String, String>('i7v1', 'i'),
-  ['ri4#f', '\u{1f600}CRFM ', '31T1X']: MapEntry<String, String>('2', 'xB#UJu')
-};
-Map<Set<bool>, bool> var417 = {
-  {true}: true
-};
-Map<Set<bool>, int> var418 = {
-  {true}: -26,
-  {true, false, true, true}: 21,
-  {true, true, true}: 6,
-  {true}: 45
-};
-Map<Set<bool>, String> var419 = {
-  {true, false, false, false, true}: '!fe9\u2665',
-  {false}: 'UDU',
-  {true, false, false, true, false}: 'iU',
-  {true, false, false, true, false}: 'qE'
-};
-Map<Set<bool>, Expando<bool>> var420 = {
-  {true, true, false, true}: Expando<bool>('S0V\u2665'),
-  {true, false, false}: Expando<bool>('oP@&5'),
-  {true, true, true, false}: Expando<bool>('n\u26658b3Y3'),
-  {true, false, false, false, false}: Expando<bool>('8 '),
-  {true, true, true, false, true}: Expando<bool>('NXHSv'),
-  {true, false, false}: Expando<bool>('3Y')
-};
-Map<Set<bool>, Expando<int>> var421 = {
-  {true}: Expando<int>('cX')
-};
-Map<Set<bool>, Expando<String>> var422 = {
-  {true, true}: Expando<String>('0EJ5-j'),
-  {true, false, true, true}: Expando<String>('svh\u2665'),
-  {false, true, true}: new Expando<String>('KoMNXn')
-};
-Map<Set<bool>, List<bool>> var423 = {
-  {true, false}: [true, true, true],
-  {true}: [true, false, false, true],
-  {false, false, false, false}: [true, false, false, false, true],
-  {true, true, false, false}: [true, false, true],
-  {false, false}: [false],
-  {false}: [true, true]
-};
-Map<Set<bool>, List<int>> var424 = {
-  {true, true, true}: Uint64List.fromList(Uint32List.fromList(
-      Uint32List.fromList(Uint8List.fromList(
-          Uint8List.fromList(Uint8List.fromList(Uint16List(26))))))),
-  {false}: new Int16List(30)
-};
-Map<Set<bool>, List<String>> var425 = {
-  {true, true}: ['sT', ' suhSy'],
-  {true, false, true, true, true}: ['dT', 'r\u2665\u{1f600}+W', '0@', '764@'],
-  {true, true}: ['Y', '))5gG', 'j', '7Kq+'],
-  {false, true, false}: ['\u2665J'],
-  {false, true, false}: ['b']
-};
-Map<Set<bool>, Set<bool>> var426 = {
-  {false, false, false, true}: {false, true, false}
-};
-Map<Set<bool>, Set<int>> var427 = {
-  {false, true, false}: {9223372034707292161, 8},
-  {true, false, true}: {14, 36, -87, 16, -3},
-  {true, false, false, false, false}: {-56, 43, -41, 4294967297, 21}
-};
-Map<Set<bool>, Set<String>> var428 = {
-  {true}: {'d\u2665MBnT', '', 'm6'},
-  {true, true, true, true, false}: {'-t)LStU', 'R\u26659o', 'pjWu'},
-  {false, true, false, true}: {'3\u2665X ', ''},
-  {false, true, false, true, false}: {'HiF', 'Q6MHc2m', 'SQat\u{1f600}', 'kl'},
-  {true, false, true, false}: {'(Y', 'wO', '', 'P9XqTUy', ''}
-};
-Map<Set<bool>, Map<bool, bool>> var429 = {
-  {false, false}: {false: true, false: true, false: false, true: true},
-  {true, true, false, true}: {
-    true: false,
-    false: true,
-    true: true,
-    false: false
-  },
-  {true}: {true: false, false: true, false: false, true: true, true: false},
-  {true}: {false: true, false: false, true: true},
-  {false, true}: {true: false, true: false, false: true},
-  {false}: {false: false, false: true, true: false, false: true, true: false}
-};
-Map<Set<bool>, Map<bool, int>> var430 = {
-  {false, false, false, true, false}: {
-    false: 13,
-    true: -16,
-    true: -10,
-    false: -44
-  },
-  {true, true}: {false: -63, false: -67},
-  {true, false, true}: {true: -39, true: 41, true: -65, false: -33, true: -76},
-  {false, false, false, true, false}: {
-    true: -9223372030412324863,
-    true: -9223372034707292159,
-    false: -8,
-    false: 33,
-    false: 48
-  }
-};
-Map<Set<bool>, Map<bool, String>> var431 = {
-  {false, true}: {false: 'zO', false: 'QJ', false: 'Nt', true: 'MWVebDw'}
-};
-Map<Set<bool>, Map<int, bool>> var432 = {
-  {false, false, true, true}: {28: false, 10: true, 32: false, 12: false},
-  {false, false, true}: {-50: true, -70: true, 7: false, 40: true, -50: false},
-  {true, true, false, true, false}: {
-    -12: true,
-    14: true,
-    -70: false,
-    -88: false
-  },
-  {true, false, false, true, false}: {
-    24: false,
-    44: false,
-    -31: false,
-    -0: true,
-    -29: true
-  },
-  {true, false, true}: {40: false, 8: false}
-};
-Map<Set<bool>, Map<int, int>> var433 = {
-  {false, true, false, false, true}: {39: 6442450945},
-  {true, true, true, true, false}: {
-    28: -22,
-    -43: 9223372032559808512,
-    -57: 22,
-    26: 14
-  },
-  {true, false, true}: {-67: 43, 14: 18},
-  {true}: {9: 16},
-  {false}: {-45: 26, -31: 5, -78: 18}
-};
-Map<Set<bool>, Map<int, String>> var434 = {
-  {true}: {40: '0yQ9a1', -69: ' i5l+P', 29: 'pK-q\u{1f600}h', -7: 'i!7'},
-  {true, false, false, false}: {
-    1: '&&kg\u2665Oz',
-    40: 'Sv-ukw',
-    40: 'LW7k+)',
-    -97: ''
-  },
-  {true, false, false, false, false}: {
-    -92: 'Rj',
-    -14: '',
-    -9223372028264841217: 'byJTu\u{1f600}l',
-    18: 'f\u2665iG0c',
-    -52: 'F\u{1f600}\u2665k\u2665'
-  },
-  {false, true, true, true, true}: {27: 'O(Lvs', -99: '4BGa', 47: 'FjQ'},
-  {false}: {27: 'X5xY', 25: 'BSX\u2665l', 1: 'HPYzh!', 19: ''}
-};
-Map<Set<bool>, Map<String, bool>> var435 = {
-  {false, true, false, true, false}: {
-    'eU4gRZe': true,
-    '3QIYghR': true,
-    'Fhzio\u{1f600}c': true,
-    'UKT)!Bo': true
-  },
-  {true, false}: {'&': true},
-  {true, true, true}: {'IUoOoP': false, 'W': true}
-};
-Map<Set<bool>, Map<String, int>> var436 = {
-  {false, false, false, true}: {
-    '\u{1f600}QaB': -55,
-    'L3\u2665vUo': -9223372034707292161,
-    '!bbEb': -24,
-    'T\u{1f600}6U': 20,
-    'HVHo@vH': -26
-  },
-  {true, true, false}: {'xtz X': 18}
-};
-Map<Set<bool>, Map<String, String>> var437 = {
-  {true, false, true}: {
-    'L-gB': '',
-    '4a': '\u{1f600}6QAQsT',
-    ')S': 'i-d',
-    'Nl\u2665MoO': 'a\u{1f600})a'
-  },
-  {true, true, false, true, true}: {
-    '#z5': '\u{1f600}K\u2665QAU\u{1f600}',
-    'KKg-\u{1f600}\u{1f600}a': 'yjBmNA\u2665',
-    'u!qP9k': '\u2665!W5K-',
-    'Iw\u{1f600}!V': '',
-    'f': 'nXOgaXC'
-  },
-  {false, true, true, false, true}: {
-    'j&f\u2665qp': 'sY8aa!G',
-    '': 'gkx',
-    'A2\u{1f600}IeRy': '7@B',
-    'nloh': '!aPuj\u2665I',
-    '\u{1f600})eLM8': 'P(6jm2'
-  }
-};
-Map<Set<bool>, MapEntry<bool, bool>> var438 = {
-  {false}: MapEntry<bool, bool>(true, true),
-  {false, false, false, false, true}: new MapEntry<bool, bool>(true, true),
-  {false, true}: new MapEntry<bool, bool>(false, false),
-  {true, true, true, false}: MapEntry<bool, bool>(true, false),
-  {false}: MapEntry<bool, bool>(false, true),
-  {false, false, true}: MapEntry<bool, bool>(true, true)
-};
-Map<Set<bool>, MapEntry<bool, int>> var439 = {
-  {true, false}: MapEntry<bool, int>(false, 5),
-  {false, true, true}: MapEntry<bool, int>(true, 11),
-  {true}: MapEntry<bool, int>(false, 25),
-  {false, false, true, false, false}: MapEntry<bool, int>(false, 19),
-  {true}: new MapEntry<bool, int>(true, 28),
-  {false, false, false}: MapEntry<bool, int>(true, 5)
-};
-Map<Set<bool>, MapEntry<bool, String>> var440 = {
-  {true, true, false, true}: MapEntry<bool, String>(false, 'T6DP1k)'),
-  {true, false, true, false}: MapEntry<bool, String>(false, 'ssg')
-};
-Map<Set<bool>, MapEntry<int, bool>> var441 = {
-  {false, false, true, true}: MapEntry<int, bool>(47, true)
-};
-Map<Set<bool>, MapEntry<int, int>> var442 = {
-  {true, true, true, false}: MapEntry<int, int>(9, 16),
-  {true, true, true, true}: MapEntry<int, int>(4, 25)
-};
-Map<Set<bool>, MapEntry<int, String>> var443 = {
-  {false, true, false, false, false}: MapEntry<int, String>(20, 'F'),
-  {false, true, true}: MapEntry<int, String>(16, 'nNZB'),
-  {true, false, true, true}: MapEntry<int, String>(46, 'O'),
-  {true}: MapEntry<int, String>(12, '7EdNa6g'),
-  {false, true, false, true}: MapEntry<int, String>(6, '-B\u{1f600}\u26654'),
-  {false, true}: new MapEntry<int, String>(0, 'f2x&W')
-};
-Map<Set<bool>, MapEntry<String, bool>> var444 = {
-  {true, true}: MapEntry<String, bool>('eIu+r', false)
-};
-Map<Set<bool>, MapEntry<String, int>> var445 = {
-  {false, true, true}: MapEntry<String, int>('IvBj0', 14),
-  {true, false}: MapEntry<String, int>('E\u2665J', 37),
-  {false, true}: MapEntry<String, int>('lZBF', 43),
-  {true, false, true, true}: MapEntry<String, int>('Y', 42),
-  {true, true, true, false, false}: MapEntry<String, int>('&yyiY', 14),
-  {false, true, false, true, true}: MapEntry<String, int>('9W', 16)
-};
-Map<Set<bool>, MapEntry<String, String>> var446 = {
-  {true}: MapEntry<String, String>('w', '\u2665'),
-  {true, true}: MapEntry<String, String>('bmoE\u{1f600}d\u2665', 'CO\u{1f600}')
-};
-Map<Set<int>, bool> var447 = {
-  {-9223372030412324865, -83, -58}: false,
-  {-47, -39, -95, 6442450943}: false,
-  {-9223372028264841217, 34}: false,
-  {-34}: true,
-  {-59}: false,
-  {2, -54, 11}: false
-};
-Map<Set<int>, int> var448 = {
-  {3, 37}: 33,
-  {16, -20, -83, -10}: -25
-};
-Map<Set<int>, String> var449 = {
-  {9223372032559808513, -51}: ' \u{1f600}',
-  {-66, -55, -9223372034707292161, -85}: '(PZNMHl',
-  {-32}: '',
-  {-33, -88, 35, 9223372032559808512}: 'lFnI927',
-  {2147483649, 16, -4294967295}: 'VVvfZ\u2665'
-};
-Map<Set<int>, Expando<bool>> var450 = {
-  {6442450945, 33}: Expando<bool>('')
-};
-Map<Set<int>, Expando<int>> var451 = {
-  {-33}: Expando<int>('cDG '),
-  {32, 32, -55}: Expando<int>('h'),
-  {-0, -70, -9, 36, 15}: new Expando<int>('S\u2665(9S')
-};
-Map<Set<int>, Expando<String>> var452 = {
-  {-9223372034707292161, -84, -15, 15}: Expando<String>('uSPXU\u2665'),
-  {8, 4294967297, -29, 33, -39}: new Expando<String>('ap'),
-  {-99, -13, 15}: Expando<String>('kAH'),
-  {-89, -9223372036854775807, 22, -19, -99}: Expando<String>('fJ\u26652')
-};
-Map<Set<int>, List<bool>> var453 = {
-  {-57, -11, -9223372036854775808}: [true, false, false],
-  {39}: [false, true, false],
-  {8, -14, -16, -50}: [false, false, true],
-  {42, 44}: [false, false]
-};
-Map<Set<int>, List<int>> var454 = {
-  {42, 48, -80, 12, -41}: Int32List.fromList([5, 40, 35]),
-  {9, 9223372036854775807, 37, -53}:
-      Int8List.fromList(Uint8List.fromList(Uint32List.fromList(Int8List(12)))),
-  {3, -86, -9223372036854775808, 41, -69}: new Uint8ClampedList(42),
-  {2147483648, -41, -25, -14, -71}: Uint8ClampedList(6),
-  {13, 6, -26, 17}: new Int32List(17),
-  {-59}: Int64List.fromList([3, -23])
-};
-Map<Set<int>, List<String>> var455 = {
-  {-9223372034707292161, -27, -20, -9223372032559808513}: [
-    'QPJp-e',
-    'eCAyFHS',
-    '\u{1f600}rMUp\u2665',
-    '',
-    'e!b'
-  ],
-  {-11, -11, 7, 43, 6442450945}: ['ELc', '2Cp(\u{1f600}e'],
-  {1, -9223372034707292159, -38}: ['6e', 'GotL', '', 'Wb)-&'],
-  {9223372034707292161, 26}: ['6NO', '\u2665h\u2665k'],
-  {-71}: ['#&\u{1f600}', '', 'BbNz3\u2665', '1pc'],
-  {-38, -58, 23, -81, 5}: ['Jw']
-};
-Map<Set<int>, Set<bool>> var456 = {
-  {-13, 48, 5}: {true, false, true, true},
-  {-97, 2, -20, 14, 27}: {true, true, false}
-};
-Map<Set<int>, Set<int>> var457 = {
-  {-4294967295, -70, -9}: {9223372034707292159, 30, 25, -32, -48}
-};
-Map<Set<int>, Set<String>> var458 = {
-  {7}: {'Q\u2665Lw', '', '1', '+TIXV\u2665'},
-  {7}: {'w', '&sw+U', 'cN\u{1f600}', '&iB\u{1f600}\u{1f600}vQ', 'g'}
-};
-Map<Set<int>, Map<bool, bool>> var459 = {
-  {-34, 24, 40, -32}: {false: false},
-  {20, 17, -74}: {false: true, false: false},
-  {-84, 6442450945}: {
-    true: true,
-    true: false,
-    true: true,
-    true: false,
-    true: true
-  },
-  {-52, -16, -90, 7, 24}: {false: true, true: false, true: true},
-  {-9223372036854775808, -29, 20}: {
-    true: false,
-    false: false,
-    false: false,
-    false: true,
-    true: true
-  },
-  {-84, -97, 2147483647}: {
-    true: false,
-    false: false,
-    true: true,
-    false: true,
-    false: false
-  }
-};
-Map<Set<int>, Map<bool, int>> var460 = {
-  {1, 6, -43}: {false: -4294967296, true: 22}
-};
-Map<Set<int>, Map<bool, String>> var461 = {
-  {11, 19}: {
-    true: '7IEzi',
-    false: 'G',
-    false: 'rT',
-    true: '(l8aYj',
-    false: 'nH\u2665\u2665'
-  },
-  {19, -93, -3, 39}: {
-    false: 'N)aI',
-    true: 'XW',
-    false: 'vQ\u2665O#',
-    false: '',
-    false: 'Mk'
-  },
-  {-68, -34, 47, 2147483649, -13}: {
-    true: '\u{1f600}7pSK ',
-    false: '\u{1f600}O\u2665',
-    false: 'N\u2665',
-    false: 'EYxbUE',
-    false: '\u{1f600}t'
-  },
-  {46, 29, -9223372036854775808, -90}: {
-    false: '9K',
-    false: '8G\u{1f600}3c#2',
-    false: 'X\u2665e'
-  },
-  {-12, 4}: {true: ''},
-  {-68, 14}: {true: 'un\u{1f600}9UN', true: '3', false: 'kxu-Db'}
-};
-Map<Set<int>, Map<int, bool>> var462 = {
-  {9223372034707292160, -97, 49, 0}: {-56: false, 27: true},
-  {30, 17, 4}: {-90: true}
-};
-Map<Set<int>, Map<int, int>> var463 = {
-  {27, -16, 9223372034707292159, -21}: {-55: -9223372030412324864},
-  {-83}: {-42: 47, 33: 7},
-  {-25, -92, 25, 42, -40}: {30: 9223372034707292161, 16: 31},
-  {17}: {31: 4294967296, 37: -4294967295, -66: -1, 9223372034707292161: 37}
-};
-Map<Set<int>, Map<int, String>> var464 = {
-  {15}: {48: 'fHJFZ', -99: 'lB\u2665Q-', -1: '8xF&1'},
-  {-76}: {23: ')G', -90: 'W\u{1f600}io\u2665@f', 20: 'Iwpd\u2665g'},
-  {-76, 9223372034707292161}: {-22: '\u{1f600}8D', 28: 'zIhgB', -58: ''},
-  {23}: {9223372032559808512: 'zhg', 1: 'J0'}
-};
-Map<Set<int>, Map<String, bool>> var465 = {
-  {-5, 9223372034707292161, 4294967295, 45, 45}: {
-    'gZ(\u{1f600}lcx': true,
-    'OE26!': true,
-    '': false,
-    '\u{1f600}g06Ds-': false
-  },
-  {44, 45}: {'VDF2': true},
-  {38, 15, 9223372034707292159}: {'3sUF': true},
-  {9, 13, -21, -19}: {'#': false},
-  {-8, 1, -5, 23, -36}: {'xU': false, '': false},
-  {45, -80}: {
-    'mVpNA': false,
-    'kdhkBX': false,
-    'O75cV': true,
-    '@mb\u2665DI': false
-  }
-};
-Map<Set<int>, Map<String, int>> var466 = {
-  {-9223372030412324865, 0, 37}: {
-    'Oea2bv': -52,
-    'A2NwG': -58,
-    'n': 25,
-    'bE': 38,
-    'xuYo': -22
-  },
-  {-26, 16}: {'31n&24&': -1, '5jQtv': -9223372034707292160, '': -45},
-  {-18, 22}: {
-    'v\u2665!aO': -46,
-    '2h(': -76,
-    'hakD0Vq': -9223372030412324863,
-    '': 28,
-    'Q+Xe\u{1f600}P': -79
-  },
-  {-18}: {'D!V&cI!': 35},
-  {26, 19, -14, -11, 9223372034707292159}: {'!': -33, 'm': 47}
-};
-Map<Set<int>, Map<String, String>> var467 = {
-  {-17, -40, 24, -23, 3}: {
-    '6': 'M8',
-    'wR': '\u{1f600}lWL\u{1f600}',
-    'v': '\u{1f600}\u2665',
-    'EuIH': '3\u{1f600}mFOz\u{1f600}',
-    '-XNBR\u26650': 'e&Oh'
-  },
-  {11}: {'ppB!': ' PUC+)D', 'Md': 'hiz', '92Yfv': 'e#8Qf', 'K': 'U', '': 'p'},
-  {-13, 48, 34, -69, -2147483647}: {'ym': 'JG)7t', 'IUPko': '', 'eH': ''},
-  {-68, -9223372032559808513}: {
-    'HqBu)ht': 'r\u2665c-\u2665m',
-    'w2\u{1f600}maJ': 'Tt',
-    'E': ''
-  },
-  {-9223372030412324864, 40, 2, -58, 41}: {
-    '': 'cL75OnB',
-    '': '1xOoPB\u2665',
-    '@i6p-': '2ebn'
-  },
-  {-69, 32}: {
-    'Pp': '5 &',
-    '\u2665\u2665': 'Weh',
-    '\u266558xdEv': 'Tj b',
-    'J8s': 'K '
-  }
-};
-Map<Set<int>, MapEntry<bool, bool>> var468 = {
-  {8}: MapEntry<bool, bool>(false, false)
-};
-Map<Set<int>, MapEntry<bool, int>> var469 = {
-  {-9223372032559808512, 15, 6}: MapEntry<bool, int>(true, 19),
-  {-94}: MapEntry<bool, int>(false, 8),
-  {45}: MapEntry<bool, int>(false, 49),
-  {-90}: MapEntry<bool, int>(true, 2),
-  {24, -10, 33}: MapEntry<bool, int>(false, 19)
-};
-Map<Set<int>, MapEntry<bool, String>> var470 = {
-  {-2147483649}: MapEntry<bool, String>(false, 'vgA '),
-  {15}: MapEntry<bool, String>(true, 'i\u2665(I')
-};
-Map<Set<int>, MapEntry<int, bool>> var471 = {
-  {-64, 9, 18, 9, -28}: MapEntry<int, bool>(3, false),
-  {-38, 4}: MapEntry<int, bool>(16, false),
-  {3, 11, 5}: MapEntry<int, bool>(5, false),
-  {11, -54, -86, 22}: MapEntry<int, bool>(9, true),
-  {9223372036854775807, -61, -80, 45}: MapEntry<int, bool>(47, false)
-};
-Map<Set<int>, MapEntry<int, int>> var472 = {
-  {-94, -57, -67, -87, 14}: MapEntry<int, int>(27, 11)
-};
-Map<Set<int>, MapEntry<int, String>> var473 = {
-  {30, -78, -75, -35, 4294967296}: MapEntry<int, String>(26, 'I\u2665!ZIF')
-};
-Map<Set<int>, MapEntry<String, bool>> var474 = {
-  {-67}: MapEntry<String, bool>('nX', false),
-  {4, -57, -21}: MapEntry<String, bool>('\u{1f600}w8l', false),
-  {-42, -83}: MapEntry<String, bool>('', true),
-  {-23, -93}: MapEntry<String, bool>('tZ', true),
-  {2147483649, 22}: MapEntry<String, bool>('FV3', true)
-};
-Map<Set<int>, MapEntry<String, int>> var475 = {
-  {33, 15, 0, -9223372036854775808}: MapEntry<String, int>('y', 19),
-  {24}: MapEntry<String, int>('j-G', 23),
-  {7, -9223372036854775808, 28}:
-      MapEntry<String, int>('D\u{1f600}55\u{1f600}x7', 6),
-  {39, -17, -43, -79}: MapEntry<String, int>('7', 4)
-};
-Map<Set<int>, MapEntry<String, String>> var476 = {
-  {9223372034707292161, 17, -90, 47}: MapEntry<String, String>('S!e', '6-v0g'),
-  {6442450943, 11, -73}: MapEntry<String, String>('s\u2665AWr', ''),
-  {-9223372036854775807, 22, 38, 4294967296, -51}:
-      MapEntry<String, String>('', ' d\u2665\u{1f600}FT\u2665'),
-  {-93, -44, 15, -52}: MapEntry<String, String>('6y', 's'),
-  {-97, -4294967295, -80, -86}: MapEntry<String, String>('\u{1f600}JFHNIQ', ''),
-  {-78, 9223372034707292161, -63, 30, -47}: MapEntry<String, String>('+', 'BJ+')
-};
-Map<Set<String>, bool> var477 = {
-  {'Edtt', '0', 'MX', 'Ax', 'Tf6V'}: false,
-  {'', 'V3tKVCc', '&', '&x1s'}: true,
-  {'', '1xTMi7'}: false
-};
-Map<Set<String>, int> var478 = {
-  {'7o\u{1f600}', '&AZ79G+', '', '\u2665W)I'}: 29
-};
-Map<Set<String>, String> var479 = {
-  {'i'}: '\u2665t1M@',
-  {'WpI ', '', '\u{1f600}wt5I', 'LKz0+@'}: '',
-  {'o#1\u{1f600}', '', '3', ''}: '&n9',
-  {'V4)', '\u{1f600}yQb', '', 'c\u2665kiV', 'c\u2665mrmc'}: '6XGKK',
-  {'', 'u'}: '\u2665(tE0'
-};
-Map<Set<String>, Expando<bool>> var480 = {
-  {'\u2665&-UOV'}: Expando<bool>('jlf0'),
-  {'VFnw', '3UXzVA', '', 'y', '('}: Expando<bool>('8hxqz'),
-  {'', 'O\u2665IF5'}: Expando<bool>('3C\u{1f600}\u{1f600}EA')
-};
-Map<Set<String>, Expando<int>> var481 = {
-  {'5'}: Expando<int>('B'),
-  {'R&K\u{1f600}mh', '-TQCjW', '-', 'j', 'B'}: Expando<int>(')V7\u2665NR')
-};
-Map<Set<String>, Expando<String>> var482 = {
-  {'b', 'm(BR\u{1f600}', '3l', '8#\u266509x', ''}:
-      Expando<String>('\u2665\u2665X\u2665f'),
-  {'gcp\u{1f600}j(l'}: Expando<String>('!\u{1f600}-sr'),
-  {'yiABp\u{1f600}', 'Eh\u2665#c\u{1f600}', 'FO\u2665qb5'}:
-      Expando<String>('Hc'),
-  {'V7yIx!', 'ST+)', ''}: Expando<String>('8NX4o\u{1f600}+'),
-  {'mVp6Qv)'}: Expando<String>('iJf5'),
-  {'', 'oP'}: Expando<String>('BM-\u2665')
-};
-Map<Set<String>, List<bool>> var483 = {
-  {'JKm\u26656'}: [false, false, true],
-  {'\u{1f600}DN'}: [true, true, true],
-  {'\u{1f600}I\u2665', 'vQkU!', 'B\u2665\u{1f600}l', 'y', '5XgcNC9'}: [
-    true,
-    false,
-    false,
-    false
-  ],
-  {'xh7!CE\u{1f600}'}: [false, true]
-};
-Map<Set<String>, List<int>> var484 = {
-  {'', '#)5Caw0', 'Or'}: Int64List(32),
-  {'!q\u26652fm', 'X'}: Int8List.fromList([14, 1, -9223372034707292160]),
-  {'q', 'VT3j', 'S1K', ''}: Int64List(40),
-  {'2twYk0', '&1', '5D', ')eSl'}: Int32List(49),
-  {'1ct0', '', 'joDmh', 'C)\u{1f600}U', 'H'}: Uint32List(36),
-  {'l', 'rwW\u{1f600}', 'o', 'Q\u26659D', 'ZoVc\u{1f600}'}:
-      Int64List.fromList(Uint16List(11))
-};
-Map<Set<String>, List<String>> var485 = {
-  {'F\u{1f600}F', 'ZR', 'uv2U'}: ['V@4i \u2665']
-};
-Map<Set<String>, Set<bool>> var486 = {
-  {'B9V', 'Ikg0\u2665RM', '(T4', '', ''}: {false, true},
-  {'iQh1', '7', '6o', 'nzVT'}: {false, false, false}
-};
-Map<Set<String>, Set<int>> var487 = {
-  {'G-', '-oE', ''}: {44, -97, 18, 8589934591},
-  {'Yry'}: {5},
-  {'\u26654\u2665x', 'G\u2665zGA3r', ''}: {-49, -51, -80, -72, -75},
-  {'W R7iN'}: {-29, -21},
-  {'o\u{1f600}', '', '\u{1f600}', 'R)0HOB'}: {
-    4294967295,
-    48,
-    40,
-    2147483649,
-    -76
-  },
-  {'dnQO', '\u{1f600}-xFcXs', 'DRD', '', '1-(jo9I'}: {
-    -91,
-    -3,
-    -41,
-    9223372034707292159,
-    -32
-  }
-};
-Map<Set<String>, Set<String>> var488 = {
-  {'Q', 'gyKurL\u{1f600}', '4ujk99'}: {'', 'p', '\u2665'},
-  {'A'}: {'LlrTj9', 'ehKmEUZ'},
-  {'-F\u2665tcXA', '!uc', 'GZETwM'}: {'Ek', 'p0', 'w\u{1f600}uOv'},
-  {'', 'nU-g', '9', 'bS', '\u2665(hs8q\u{1f600}'}: {'c0SC'},
-  {')b\u{1f600}&F4M', 'XM', 'uO', '@SYwAwx', 'kkxwsT'}: {'ixC'}
-};
-Map<Set<String>, Map<bool, bool>> var489 = {
-  {'OP0rJ22', 'Miycjk\u2665', 'u', 'XMC)'}: {false: false},
-  {'H\u{1f600}hO9 ', 'G+)\u2665\u2665U', '\u{1f600}a2R', 'ZW)'}: {
-    false: true,
-    true: false
-  },
-  {'a', 'bX0C', '8gp5 5', 'G', '3Xt0Ml'}: {true: true},
-  {'P3\u{1f600}', 'H', 'vlY'}: {
-    true: true,
-    true: true,
-    true: false,
-    true: false
-  },
-  {')k', '', 'N', 'Z(p4c'}: {
-    true: false,
-    false: true,
-    false: false,
-    false: true,
-    true: false
-  }
-};
-Map<Set<String>, Map<bool, int>> var490 = {
-  {'\u{1f600}g 8xOJ', ''}: {true: -27, false: 17},
-  {'F'}: {false: -90, true: -45, false: 13, false: -30},
-  {'H1FV\u2665', 'aV', '\u2665\u{1f600}j', 'oZib-mS', 'a6H'}: {
-    false: -1,
-    true: -59,
-    false: -19,
-    true: -6
-  },
-  {'', 'pdT1v', 'EtW5d', 'ff'}: {
-    true: 43,
-    true: -92,
-    false: -97,
-    true: -18,
-    false: 19
-  },
-  {'Mw\u{1f600}4Ib', '', '4W \u2665B', 'Qll', '+W&\u{1f600}Gc3'}: {
-    false: -9223372032559808511,
-    true: -97,
-    false: 14,
-    false: 6442450945,
-    true: 14
-  },
-  {'3-OYHTC'}: {true: -28, true: -11, true: 4294967297, false: 22}
-};
-Map<Set<String>, Map<bool, String>> var491 = {
-  {'\u2665', 'sy\u{1f600}', 'QZ6iw', ''}: {true: 'o', true: '0'},
-  {'O2))q-', '', '', 'sI', '+f'}: {
-    true: 'YA',
-    false: '1eZnR',
-    false: '\u2665ycv3',
-    false: 'ZS8y1'
-  }
-};
-Map<Set<String>, Map<int, bool>> var492 = {
-  {'e\u{1f600}2dIWT', '', 'JP8\u{1f600}7zI', '', 'bF1rA(\u2665'}: {43: true},
-  {'Xx\u2665F', 'MH3uf', 'gQ8', '5'}: {
-    32: true,
-    6442450943: true,
-    9223372034707292159: false,
-    -69: false,
-    11: true
-  },
-  {'oU\u{1f600}aj', ''}: {
-    -29: true,
-    -26: false,
-    49: false,
-    -9223372030412324863: true
-  },
-  {'hwo&0', 'D9jJL', 'R', ')Nr\u2665si\u2665'}: {9223372032559808513: true},
-  {'VSYI', '+ovoyrV', 'tq\u{1f600}', '\u2665\u2665XGZ'}: {-61: false}
-};
-Map<Set<String>, Map<int, int>> var493 = {
-  {'HoA\u26654ir', 'a5Wt', 'FD', ''}: {-59: -17},
-  {'p', 'dfZ', 'r'}: {44: -45, 43: -72, -80: -54},
-  {'+CW', 'YZcEA', 'l+K#\u{1f600}', 'Az', 'j84u'}: {44: 44},
-  {'pNpn\u2665\u2665', 'swWBQII', 'v\u26655yMm9', 'u3o'}: {38: 18}
-};
-Map<Set<String>, Map<int, String>> var494 = {
-  {'\u{1f600}un', 'Qi', 'R'}: {-4: 'cL3B#\u{1f600}'},
-  {'Fi+8o5M', 'C', 'E', 'F4T19IA'}: {
-    -77: '',
-    35: '\u{1f600}\u2665Y',
-    4: 'H4',
-    11: 'oYr6'
-  },
-  {'', 'u\u2665yx7'}: {43: '4\u2665zLTI', -47: '\u2665\u{1f600}Zp1H'}
-};
-Map<Set<String>, Map<String, bool>> var495 = {
-  {'EMY\u{1f600}bm'}: {
-    '\u{1f600}xE\u{1f600}Z': false,
-    '': false,
-    '': false,
-    'h&a': false
-  },
-  {'Sq', 'h', '', 'RkAh)#E'}: {'6E1Xp': true, '0S': false},
-  {'Erl\u{1f600}'}: {
-    'I#j': false,
-    '!AnQn': false,
-    'kM#': false,
-    '': true,
-    '\u{1f600}\u2665': true
-  }
-};
-Map<Set<String>, Map<String, int>> var496 = {
-  {'\u{1f600}tk', ''}: {'': -85, '': 48, 'sq+N': -46},
-  {'', 'S\u{1f600}\u{1f600}5&h', '0CDc\u{1f600}Lt', 'SXX#', '\u{1f600}'}: {
-    'hSI2Kt2': 37,
-    'v\u2665LdqET': 2147483648,
-    '\u2665': -40,
-    'RfjRMgP': 19
-  },
-  {'', 'F(', '2', 'ZnZ4y&', 'rA'}: {'': -44},
-  {'y0kM\u{1f600}p', 'S8jM!', 'Mv', '\u26657A@x', '\u2665QKB\u{1f600}'}: {
-    'wd\u{1f600}Lr\u{1f600}7': -14
-  },
-  {'IVbFum', 'aL\u{1f600}a', 'F\u{1f600}Frco', 'I3'}: {
-    'jsQd': 12,
-    '7hwW': -83,
-    'LTB\u2665Z': -31
-  },
-  {'FPEVB#S', 'u'}: {'!EtZ\u2665': -71}
-};
-Map<Set<String>, Map<String, String>> var497 = {
-  {'', 'O'}: {'z 80-G': 'ksEMLjw', 'e\u2665@ol': 'LjHz2', 'Rbl)U6B': 'y##G'},
-  {'15', 'sF', '\u266597y', 'px(RU'}: {
-    'OEq': 'ebie!',
-    '@fbrIu': 'g',
-    'WTv': 'bm\u{1f600}\u2665U',
-    'U': 'Qu2',
-    'w+0\u2665FM': '2'
-  },
-  {'&N'}: {
-    '': '+',
-    '': 'M#u))S!',
-    'CY\u{1f600}U': '\u2665Jne6P',
-    'Imn\u{1f600}10\u{1f600}': '1N\u2665V'
-  }
-};
-Map<Set<String>, MapEntry<bool, bool>> var498 = {
-  {'D4L', 'nd'}: new MapEntry<bool, bool>(true, false),
-  {'BPeS'}: MapEntry<bool, bool>(false, false)
-};
-Map<Set<String>, MapEntry<bool, int>> var499 = {
-  {'e0fLZ', 'Xg'}: MapEntry<bool, int>(true, 38),
-  {'\u2665', '-MPkh\u2665y', 'fwp7', 'dekk'}: MapEntry<bool, int>(false, 15),
-  {'', 'JC7byk&', '5@q\u{1f600}', '2Y1t@Z'}: MapEntry<bool, int>(true, 13),
-  {'\u2665!K\u2665 vw'}: MapEntry<bool, int>(true, 38),
-  {'nk(duko', '1iMo', '6#L', 'dxB\u2665 H'}: MapEntry<bool, int>(false, 25)
-};
-Map<Set<String>, MapEntry<bool, String>> var500 = {
-  {'p\u2665c4', 'HIunA'}: MapEntry<bool, String>(true, 'S\u2665hiuG'),
-  {'O4j\u26655', 'pnl'}: new MapEntry<bool, String>(false, '#oyGV7M'),
-  {'xS', '', 's\u{1f600}xn\u{1f600}#'}: MapEntry<bool, String>(true, 'DW'),
-  {'mWntxmj', 'tF8(\u2665d'}: MapEntry<bool, String>(true, 'X\u2665s&JF'),
-  {' Oj', '#5ioq'}: new MapEntry<bool, String>(false, 'L\u{1f600}E6'),
-  {'\u2665z@#', '2', 'OA0kWi', 'iX&\u{1f600}', 'I4-u'}:
-      MapEntry<bool, String>(false, 'GX7')
-};
+@pragma('vm:prefer-inline')
+bool lessThan(int x, int y) => x < y;
 
-void foo0_0() {
-  [-63].removeRange(30, 9223372034707292161);
+@pragma('vm:prefer-inline')
+int accessArray(List<int> arr, int i) => arr[i];
+
+void problem(List<int> arr, int n, bool f) {
+  final C = 0x7000000000000000;
+  for (var i = C, j = 0; lessThan(i, n); i++, j++) {
+    if (f) {
+      // Produce CheckSmi against C. This CheckSmi will be
+      // hoisted out of the loop turning phi for j into a Smi
+      // Phi.
+      checkSmi(C);
+      accessArray(arr, j); // Produce array access with bounds check for arr.
+    }
+  }
 }
 
-main() {
-  try {
-    foo0_0();
-  } catch (e, st) {
-    print('foo0_0 throws');
-  }
-  try {
-    print(
-        '$var0\n$var1\n$var2\n$var3\n$var4\n$var5\n$var6\n$var7\n$var8\n$var9\n$var10\n$var11\n$var12\n$var13\n$var14\n$var15\n$var16\n$var17\n$var18\n$var19\n$var20\n$var21\n$var22\n$var23\n$var24\n$var25\n$var26\n$var27\n$var28\n$var29\n$var30\n$var31\n$var32\n$var33\n$var34\n$var35\n$var36\n$var37\n$var38\n$var39\n$var40\n$var41\n$var42\n$var43\n$var44\n$var45\n$var46\n$var47\n$var48\n$var49\n$var50\n$var51\n$var52\n$var53\n$var54\n$var55\n$var56\n$var57\n$var58\n$var59\n$var60\n$var61\n$var62\n$var63\n$var64\n$var65\n$var66\n$var67\n$var68\n$var69\n$var70\n$var71\n$var72\n$var73\n$var74\n$var75\n$var76\n$var77\n$var78\n$var79\n$var80\n$var81\n$var82\n$var83\n$var84\n$var85\n$var86\n$var87\n$var88\n$var89\n$var90\n$var91\n$var92\n$var93\n$var94\n$var95\n$var96\n$var97\n$var98\n$var99\n$var100\n$var101\n$var102\n$var103\n$var104\n$var105\n$var106\n$var107\n$var108\n$var109\n$var110\n$var111\n$var112\n$var113\n$var114\n$var115\n$var116\n$var117\n$var118\n$var119\n$var120\n$var121\n$var122\n$var123\n$var124\n$var125\n$var126\n$var127\n$var128\n$var129\n$var130\n$var131\n$var132\n$var133\n$var134\n$var135\n$var136\n$var137\n$var138\n$var139\n$var140\n$var141\n$var142\n$var143\n$var144\n$var145\n$var146\n$var147\n$var148\n$var149\n$var150\n$var151\n$var152\n$var153\n$var154\n$var155\n$var156\n$var157\n$var158\n$var159\n$var160\n$var161\n$var162\n$var163\n$var164\n$var165\n$var166\n$var167\n$var168\n$var169\n$var170\n$var171\n$var172\n$var173\n$var174\n$var175\n$var176\n$var177\n$var178\n$var179\n$var180\n$var181\n$var182\n$var183\n$var184\n$var185\n$var186\n$var187\n$var188\n$var189\n$var190\n$var191\n$var192\n$var193\n$var194\n$var195\n$var196\n$var197\n$var198\n$var199\n$var200\n$var201\n$var202\n$var203\n$var204\n$var205\n$var206\n$var207\n$var208\n$var209\n$var210\n$var211\n$var212\n$var213\n$var214\n$var215\n$var216\n$var217\n$var218\n$var219\n$var220\n$var221\n$var222\n$var223\n$var224\n$var225\n$var226\n$var227\n$var228\n$var229\n$var230\n$var231\n$var232\n$var233\n$var234\n$var235\n$var236\n$var237\n$var238\n$var239\n$var240\n$var241\n$var242\n$var243\n$var244\n$var245\n$var246\n$var247\n$var248\n$var249\n$var250\n$var251\n$var252\n$var253\n$var254\n$var255\n$var256\n$var257\n$var258\n$var259\n$var260\n$var261\n$var262\n$var263\n$var264\n$var265\n$var266\n$var267\n$var268\n$var269\n$var270\n$var271\n$var272\n$var273\n$var274\n$var275\n$var276\n$var277\n$var278\n$var279\n$var280\n$var281\n$var282\n$var283\n$var284\n$var285\n$var286\n$var287\n$var288\n$var289\n$var290\n$var291\n$var292\n$var293\n$var294\n$var295\n$var296\n$var297\n$var298\n$var299\n$var300\n$var301\n$var302\n$var303\n$var304\n$var305\n$var306\n$var307\n$var308\n$var309\n$var310\n$var311\n$var312\n$var313\n$var314\n$var315\n$var316\n$var317\n$var318\n$var319\n$var320\n$var321\n$var322\n$var323\n$var324\n$var325\n$var326\n$var327\n$var328\n$var329\n$var330\n$var331\n$var332\n$var333\n$var334\n$var335\n$var336\n$var337\n$var338\n$var339\n$var340\n$var341\n$var342\n$var343\n$var344\n$var345\n$var346\n$var347\n$var348\n$var349\n$var350\n$var351\n$var352\n$var353\n$var354\n$var355\n$var356\n$var357\n$var358\n$var359\n$var360\n$var361\n$var362\n$var363\n$var364\n$var365\n$var366\n$var367\n$var368\n$var369\n$var370\n$var371\n$var372\n$var373\n$var374\n$var375\n$var376\n$var377\n$var378\n$var379\n$var380\n$var381\n$var382\n$var383\n$var384\n$var385\n$var386\n$var387\n$var388\n$var389\n$var390\n$var391\n$var392\n$var393\n$var394\n$var395\n$var396\n$var397\n$var398\n$var399\n$var400\n$var401\n$var402\n$var403\n$var404\n$var405\n$var406\n$var407\n$var408\n$var409\n$var410\n$var411\n$var412\n$var413\n$var414\n$var415\n$var416\n$var417\n$var418\n$var419\n$var420\n$var421\n$var422\n$var423\n$var424\n$var425\n$var426\n$var427\n$var428\n$var429\n$var430\n$var431\n$var432\n$var433\n$var434\n$var435\n$var436\n$var437\n$var438\n$var439\n$var440\n$var441\n$var442\n$var443\n$var444\n$var445\n$var446\n$var447\n$var448\n$var449\n$var450\n$var451\n$var452\n$var453\n$var454\n$var455\n$var456\n$var457\n$var458\n$var459\n$var460\n$var461\n$var462\n$var463\n$var464\n$var465\n$var466\n$var467\n$var468\n$var469\n$var470\n$var471\n$var472\n$var473\n$var474\n$var475\n$var476\n$var477\n$var478\n$var479\n$var480\n$var481\n$var482\n$var483\n$var484\n$var485\n$var486\n$var487\n$var488\n$var489\n$var490\n$var491\n$var492\n$var493\n$var494\n$var495\n$var496\n$var497\n$var498\n$var499\n$var500\n');
-  } catch (e, st) {
-    print('print() throws');
-  }
+void main() {
+  // Prime type feedback in checkSmi and accessArray helpers.
+  // Note: we need these to be in separate helpers because we need
+  // problematic code to appear on a never executed code path.
+  // (It would trigger throw/deopt if it is ever executed).
+  checkSmi(0);
+  accessArray([1], 0);
+  lessThan(1, 1);
+
+  // Trigger the issue.
+  problem([], 1, false);
 }
diff --git a/runtime/tests/vm/dart/unboxed_param_args_descriptor_test.dart b/runtime/tests/vm/dart/unboxed_param_args_descriptor_test.dart
new file mode 100644
index 0000000..6606fc4
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_param_args_descriptor_test.dart
@@ -0,0 +1,23 @@
+// 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.
+//
+// SharedObjects=ffi_test_functions
+
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+
+@pragma('vm:never-inline')
+int foo<T>(int i, T j, Type t) {
+  triggerGc();
+  Expect.equals(T, t);
+  return i + 2;
+}
+
+main() {
+  final x = foo(1, 0.0, double);
+  final y = foo(2, 0, int);
+  Expect.equals(3, x);
+  Expect.equals(4, y);
+}
diff --git a/runtime/tests/vm/dart/unboxed_param_tear_off_test.dart b/runtime/tests/vm/dart/unboxed_param_tear_off_test.dart
new file mode 100644
index 0000000..4ef1f7f
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_param_tear_off_test.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.
+//
+// SharedObjects=ffi_test_functions
+
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+import 'unboxed_parameter_helper.dart';
+
+class Foo {
+  int val;
+  Foo(this.val);
+}
+
+var globalFoo;
+
+@pragma('vm:never-inline')
+int bar(int i, Foo foo, double j) {
+  triggerGc();
+  globalFoo.val = 0;
+  return i + 2 + j.toInt() - j.toInt() + foo.val;
+}
+
+@pragma('vm:never-inline')
+createFoo() {
+  globalFoo = Foo(1);
+}
+
+final bool kTrue = int.parse('1') == 1;
+
+@pragma('vm:never-inline')
+testExecution(func, double param) {
+  Expect.equals(3, func(kTrue ? 1 : 2, globalFoo, kTrue ? param : 1.0));
+}
+
+main() {
+  createFoo();
+  final dbl = getDoubleWithHeapObjectTag();
+  testExecution(bar, dbl);
+}
diff --git a/runtime/tests/vm/dart/unboxed_param_test.dart b/runtime/tests/vm/dart/unboxed_param_test.dart
new file mode 100644
index 0000000..0ce12da
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_param_test.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.
+//
+// SharedObjects=ffi_test_functions
+
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+import 'unboxed_parameter_helper.dart';
+
+class Foo {
+  int val;
+  Foo(this.val);
+}
+
+var globalFoo;
+
+final dbl2 = getDoubleWithHeapObjectTag();
+
+@pragma('vm:never-inline')
+double bar(int i, double k, Foo foo, double j, [int optional = 1]) {
+  triggerGc();
+  globalFoo.val = 0;
+  return (i + 2 + j.toInt() - j.toInt() + globalFoo.val + optional).toDouble();
+}
+
+@pragma('vm:never-inline')
+createFoo() {
+  globalFoo = Foo(1);
+}
+
+final bool kTrue = int.parse('1') == 1;
+
+main() {
+  createFoo();
+  final dbl = getDoubleWithHeapObjectTag();
+  Expect.equals(4.0,
+      bar(kTrue ? 1 : 2, kTrue ? 2 * dbl : 0.0, globalFoo, kTrue ? dbl : 1.0));
+  Expect.equals(
+      3.0,
+      bar(kTrue ? 1 : 2, kTrue ? 2 * dbl : 0.0, globalFoo, kTrue ? dbl : 1.0,
+          0));
+}
diff --git a/runtime/tests/vm/dart/unboxed_parameter_helper.dart b/runtime/tests/vm/dart/unboxed_parameter_helper.dart
new file mode 100644
index 0000000..b0ee815
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_parameter_helper.dart
@@ -0,0 +1,13 @@
+// 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:typed_data';
+
+@pragma('vm:never-inline')
+double getDoubleWithHeapObjectTag() {
+  final bd = ByteData(8);
+  bd.setUint64(0, 0x8000000180000001, Endian.host);
+  final double v = bd.getFloat64(0, Endian.host);
+  return v;
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index bb2029b..a464e6b 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -238,6 +238,11 @@
 [ $compiler == dart2analyzer || $compiler == dart2js ]
 dart/data_uri*test: Skip # Data uri's not supported by dart2js or the analyzer.
 
+[ $arch == simarm || $arch == simarm64 ]
+dart/unboxed_param_args_descriptor_test: SkipByDesign # FFI helper not supported on simulator
+dart/unboxed_param_tear_off_test: SkipByDesign # FFI helper not supported on simulator
+dart/unboxed_param_test: SkipByDesign # FFI helper not supported on simulator
+
 [ $compiler == dartk || $compiler == dartkb ]
 cc/DartAPI_New: Fail # Issue #33041
 cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 0fc808c..b6a759f 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -642,6 +642,7 @@
         func->ptr()->end_token_pos_ = d->ReadTokenPosition();
         func->ptr()->binary_declaration_ = d->Read<uint32_t>();
       }
+      func->ptr()->unboxed_parameters_info_.Reset();
 #endif
       func->ptr()->packed_fields_ = d->Read<uint32_t>();
       func->ptr()->kind_tag_ = d->Read<uint32_t>();
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 051a503..de240e2 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -35,8 +35,8 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
-  const Array& args_descriptor = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
+  const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
+      kTypeArgsLen, kNumArgs, Object::null_array()));
   const ICData& ic_data = ICData::ZoneHandle(ICData::New(
       function, target_name, args_descriptor, 15, 1, ICData::kInstance));
   const Code& stub = StubCode::OneArgCheckInlineCache();
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 9463dae..2e31dc8 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -35,8 +35,8 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
-  const Array& args_descriptor = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
+  const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
+      kTypeArgsLen, kNumArgs, Object::null_array()));
   const ICData& ic_data = ICData::ZoneHandle(ICData::New(
       function, target_name, args_descriptor, 15, 1, ICData::kInstance));
 
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 19e4563..8aa1cd6 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -35,8 +35,8 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
-  const Array& args_descriptor = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
+  const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
+      kTypeArgsLen, kNumArgs, Object::null_array()));
   const ICData& ic_data = ICData::ZoneHandle(ICData::New(
       function, target_name, args_descriptor, 15, 1, ICData::kInstance));
 
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index d6ac021..e838880 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -35,8 +35,8 @@
   const String& target_name = String::Handle(String::New("targetFunction"));
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
-  const Array& args_descriptor = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
+  const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
+      kTypeArgsLen, kNumArgs, Object::null_array()));
   const ICData& ic_data = ICData::ZoneHandle(ICData::New(
       function, target_name, args_descriptor, 15, 1, ICData::kInstance));
 
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 8a61638..28ad54a 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -119,7 +119,10 @@
   Function& dispatcher = Function::Handle(zone_);
   for (intptr_t argc = 1; argc <= 4; argc++) {
     const intptr_t kTypeArgsLen = 0;
-    arguments_descriptor = ArgumentsDescriptor::New(kTypeArgsLen, argc);
+
+    // TODO(dartbug.com/33549): Update this code to use the size of the
+    // parameters when supporting calls to closures with unboxed parameters.
+    arguments_descriptor = ArgumentsDescriptor::NewBoxed(kTypeArgsLen, argc);
     dispatcher = closure_class.GetInvocationDispatcher(
         Symbols::Call(), arguments_descriptor,
         RawFunction::kInvokeFieldDispatcher, true /* create_if_absent */);
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index c175f3d..78e6edd 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -124,6 +124,9 @@
     RedefinitionInstr* redefinition = new (Z)
         RedefinitionInstr(new (Z) Value(call->ArgumentAt(receiver_index)));
     redefinition->set_ssa_temp_index(flow_graph()->alloc_ssa_temp_index());
+    if (FlowGraph::NeedsPairLocation(redefinition->representation())) {
+      flow_graph()->alloc_ssa_temp_index();
+    }
     redefinition->InsertAfter(call);
     // Replace all uses of the receiver dominated by this call.
     FlowGraph::RenameDominatedUses(call->ArgumentAt(receiver_index),
@@ -220,6 +223,13 @@
 
 static bool HasLikelySmiOperand(InstanceCallInstr* instr) {
   ASSERT(instr->type_args_len() == 0);
+
+  // If Smi is not assignable to the interface target of the call, the receiver
+  // is definitely not a Smi.
+  if (instr->HasNonSmiAssignableInterface(Thread::Current()->zone())) {
+    return false;
+  }
+
   // Phis with at least one known smi are // guessed to be likely smi as well.
   for (intptr_t i = 0; i < instr->ArgumentCount(); ++i) {
     PhiInstr* phi = instr->ArgumentAt(i)->AsPhi();
@@ -472,9 +482,15 @@
     CompileType* right_type = right_value->Type();
 
     const bool is_equality_op = Token::IsEqualityOperator(op_kind);
-    const bool has_nullable_int_args =
+    bool has_nullable_int_args =
         left_type->IsNullableInt() && right_type->IsNullableInt();
 
+    if (auto* call = instr->AsInstanceCall()) {
+      if (call->HasNonSmiAssignableInterface(zone())) {
+        has_nullable_int_args = false;
+      }
+    }
+
     // NOTE: We cannot use strict comparisons if the receiver has an overridden
     // == operator or if either side can be a double, since 1.0 == 1.
     const bool can_use_strict_compare =
@@ -1103,7 +1119,8 @@
   }
 
   const Array& args_desc_array = Array::Handle(
-      Z, ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/1));
+      Z,
+      ArgumentsDescriptor::NewBoxed(/*type_args_len=*/0, /*num_arguments=*/1));
   ArgumentsDescriptor args_desc(args_desc_array);
   target = Resolver::ResolveDynamicForReceiverClass(
       receiver_class, getter_name, args_desc, /*allow_add=*/false);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index f0cbab4..ae17d44 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -614,8 +614,13 @@
         if (FLAG_trace_precompiler) {
           THR_Print("Found callback field %s\n", field_name.ToCString());
         }
-        args_desc = ArgumentsDescriptor::New(0,  // No type argument vector.
-                                             function.num_fixed_parameters());
+
+        // TODO(dartbug.com/33549): Update this code to use the size of the
+        // parameters when supporting calls to non-static methods with
+        // unboxed parameters.
+        args_desc =
+            ArgumentsDescriptor::NewBoxed(0,  // No type argument vector.
+                                          function.num_fixed_parameters());
         cids.Clear();
         if (CHA::ConcreteSubclasses(cls, &cids)) {
           for (intptr_t j = 0; j < cids.length(); ++j) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index b19f66b..a6ba5bd 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -3679,10 +3679,12 @@
                                              bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
+                                             bool index_unboxed,
                                              Register array,
                                              Register index) {
-  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
-  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  // If unboxed, index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t boxing_shift = index_unboxed ? 0 : -kSmiTagShift;
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) + boxing_shift;
   int32_t offset =
       is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   const OperandSize size = Address::OperandSizeFor(cid);
@@ -3720,10 +3722,12 @@
                                               bool is_external,
                                               intptr_t cid,
                                               intptr_t index_scale,
+                                              bool index_unboxed,
                                               Register array,
                                               Register index) {
-  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
-  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  // If unboxed, index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t boxing_shift = index_unboxed ? 0 : -kSmiTagShift;
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) + boxing_shift;
   int32_t offset =
       is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   if (shift < 0) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 83784e2..94ec07e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -1145,6 +1145,7 @@
                                     bool is_external,
                                     intptr_t cid,
                                     intptr_t index_scale,
+                                    bool index_unboxed,
                                     Register array,
                                     Register index);
 
@@ -1153,6 +1154,7 @@
                                      bool is_external,
                                      intptr_t cid,
                                      intptr_t index_scale,
+                                     bool index_unboxed,
                                      Register array,
                                      Register index);
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index e369909..ddfa229 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1762,23 +1762,26 @@
 Address Assembler::ElementAddressForRegIndex(bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
+                                             bool index_unboxed,
                                              Register array,
                                              Register index,
                                              Register temp) {
-  return ElementAddressForRegIndexWithSize(is_external, cid,
-                                           Address::OperandSizeFor(cid),
-                                           index_scale, array, index, temp);
+  return ElementAddressForRegIndexWithSize(
+      is_external, cid, Address::OperandSizeFor(cid), index_scale,
+      index_unboxed, array, index, temp);
 }
 
 Address Assembler::ElementAddressForRegIndexWithSize(bool is_external,
                                                      intptr_t cid,
                                                      OperandSize size,
                                                      intptr_t index_scale,
+                                                     bool index_unboxed,
                                                      Register array,
                                                      Register index,
                                                      Register temp) {
-  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
-  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  // If unboxed, index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t boxing_shift = index_unboxed ? 0 : -kSmiTagShift;
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) + boxing_shift;
   const int32_t offset = HeapDataOffset(is_external, cid);
   ASSERT(array != temp);
   ASSERT(index != temp);
@@ -1798,10 +1801,12 @@
                                                  bool is_external,
                                                  intptr_t cid,
                                                  intptr_t index_scale,
+                                                 bool index_unboxed,
                                                  Register array,
                                                  Register index) {
-  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
-  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  // If unboxed, index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t boxing_shift = index_unboxed ? 0 : -kSmiTagShift;
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) + boxing_shift;
   const int32_t offset = HeapDataOffset(is_external, cid);
   if (shift == 0) {
     add(address, array, Operand(index));
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 4322594..985f77a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1676,6 +1676,7 @@
   Address ElementAddressForRegIndex(bool is_external,
                                     intptr_t cid,
                                     intptr_t index_scale,
+                                    bool index_unboxed,
                                     Register array,
                                     Register index,
                                     Register temp);
@@ -1687,6 +1688,7 @@
                                             intptr_t cid,
                                             OperandSize size,
                                             intptr_t index_scale,
+                                            bool index_unboxed,
                                             Register array,
                                             Register index,
                                             Register temp);
@@ -1695,6 +1697,7 @@
                                         bool is_external,
                                         intptr_t cid,
                                         intptr_t index_scale,
+                                        bool index_unboxed,
                                         Register array,
                                         Register index);
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 3424ea1..335494b 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2735,38 +2735,58 @@
   }
 }
 
-static ScaleFactor ToScaleFactor(intptr_t index_scale) {
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
-  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
-  // expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale) {
-    case 1:
-      return TIMES_1;
-    case 2:
-      return TIMES_1;
-    case 4:
-      return TIMES_2;
-    case 8:
-      return TIMES_4;
-    case 16:
-      return TIMES_8;
-    default:
-      UNREACHABLE();
-      return TIMES_1;
+static ScaleFactor ToScaleFactor(intptr_t index_scale, bool index_unboxed) {
+  if (index_unboxed) {
+    switch (index_scale) {
+      case 1:
+        return TIMES_1;
+      case 2:
+        return TIMES_2;
+      case 4:
+        return TIMES_4;
+      case 8:
+        return TIMES_8;
+      case 16:
+        return TIMES_16;
+      default:
+        UNREACHABLE();
+        return TIMES_1;
+    }
+  } else {
+    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+    // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+    // index is expected to be untagged before accessing.
+    ASSERT(kSmiTagShift == 1);
+    switch (index_scale) {
+      case 1:
+        return TIMES_1;
+      case 2:
+        return TIMES_1;
+      case 4:
+        return TIMES_2;
+      case 8:
+        return TIMES_4;
+      case 16:
+        return TIMES_8;
+      default:
+        UNREACHABLE();
+        return TIMES_1;
+    }
   }
 }
 
 Address Assembler::ElementAddressForRegIndex(bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
+                                             bool index_unboxed,
                                              Register array,
                                              Register index,
                                              intptr_t extra_disp) {
   if (is_external) {
-    return Address(array, index, ToScaleFactor(index_scale), extra_disp);
+    return Address(array, index, ToScaleFactor(index_scale, index_unboxed),
+                   extra_disp);
   } else {
-    return FieldAddress(array, index, ToScaleFactor(index_scale),
+    return FieldAddress(array, index, ToScaleFactor(index_scale, index_unboxed),
                         target::Instance::DataOffsetFor(cid) + extra_disp);
   }
 }
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index da01d67..3ed40e3 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -153,6 +153,7 @@
 
   Address(Register index, ScaleFactor scale, int32_t disp) {
     ASSERT(index != ESP);  // Illegal addressing mode.
+    ASSERT(scale != TIMES_16);  // Unsupported scale factor.
     SetModRM(0, ESP);
     SetSIB(scale, index, EBP);
     SetDisp32(disp);
@@ -163,6 +164,7 @@
 
   Address(Register base, Register index, ScaleFactor scale, int32_t disp) {
     ASSERT(index != ESP);  // Illegal addressing mode.
+    ASSERT(scale != TIMES_16);  // Unsupported scale factor.
     if (disp == 0 && base != EBP) {
       SetModRM(0, ESP);
       SetSIB(scale, index, base);
@@ -732,6 +734,7 @@
   static Address ElementAddressForRegIndex(bool is_external,
                                            intptr_t cid,
                                            intptr_t index_scale,
+                                           bool index_unboxed,
                                            Register array,
                                            Register index,
                                            intptr_t extra_disp = 0);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index c8732bf..604fcc3 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -2229,37 +2229,56 @@
   }
 }
 
-static ScaleFactor ToScaleFactor(intptr_t index_scale) {
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
-  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
-  // expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale) {
-    case 1:
-      return TIMES_1;
-    case 2:
-      return TIMES_1;
-    case 4:
-      return TIMES_2;
-    case 8:
-      return TIMES_4;
-    case 16:
-      return TIMES_8;
-    default:
-      UNREACHABLE();
-      return TIMES_1;
+static ScaleFactor ToScaleFactor(intptr_t index_scale, bool index_unboxed) {
+  if (index_unboxed) {
+    switch (index_scale) {
+      case 1:
+        return TIMES_1;
+      case 2:
+        return TIMES_2;
+      case 4:
+        return TIMES_4;
+      case 8:
+        return TIMES_8;
+      case 16:
+        return TIMES_16;
+      default:
+        UNREACHABLE();
+        return TIMES_1;
+    }
+  } else {
+    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+    // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+    // index is expected to be untagged before accessing.
+    ASSERT(kSmiTagShift == 1);
+    switch (index_scale) {
+      case 1:
+        return TIMES_1;
+      case 2:
+        return TIMES_1;
+      case 4:
+        return TIMES_2;
+      case 8:
+        return TIMES_4;
+      case 16:
+        return TIMES_8;
+      default:
+        UNREACHABLE();
+        return TIMES_1;
+    }
   }
 }
 
 Address Assembler::ElementAddressForRegIndex(bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
+                                             bool index_unboxed,
                                              Register array,
                                              Register index) {
   if (is_external) {
-    return Address(array, index, ToScaleFactor(index_scale), 0);
+    return Address(array, index, ToScaleFactor(index_scale, index_unboxed), 0);
   } else {
-    return FieldAddress(array, index, ToScaleFactor(index_scale),
+    return FieldAddress(array, index, ToScaleFactor(index_scale, index_unboxed),
                         target::Instance::DataOffsetFor(cid));
   }
 }
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 6253c48..7960806 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -192,6 +192,7 @@
 
   Address(Register index, ScaleFactor scale, int32_t disp) {
     ASSERT(index != RSP);  // Illegal addressing mode.
+    ASSERT(scale != TIMES_16);  // Unsupported scale factor.
     SetModRM(0, RSP);
     SetSIB(scale, index, RBP);
     SetDisp32(disp);
@@ -202,6 +203,7 @@
 
   Address(Register base, Register index, ScaleFactor scale, int32_t disp) {
     ASSERT(index != RSP);  // Illegal addressing mode.
+    ASSERT(scale != TIMES_16);  // Unsupported scale factor.
     if ((disp == 0) && ((base & 7) != RBP)) {
       SetModRM(0, RSP);
       SetSIB(scale, index, base);
@@ -962,6 +964,7 @@
   static Address ElementAddressForRegIndex(bool is_external,
                                            intptr_t cid,
                                            intptr_t index_scale,
+                                           bool index_unboxed,
                                            Register array,
                                            Register index);
 
diff --git a/runtime/vm/compiler/backend/block_builder.h b/runtime/vm/compiler/backend/block_builder.h
index 28c5d1e..afca0e8 100644
--- a/runtime/vm/compiler/backend/block_builder.h
+++ b/runtime/vm/compiler/backend/block_builder.h
@@ -23,6 +23,9 @@
 
   Definition* AddToInitialDefinitions(Definition* def) {
     def->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+    if (FlowGraph::NeedsPairLocation(def->representation())) {
+      flow_graph_->alloc_ssa_temp_index();
+    }
     auto normal_entry = flow_graph_->graph_entry()->normal_entry();
     flow_graph_->AddToInitialDefinitions(normal_entry, def);
     return def;
@@ -46,17 +49,35 @@
     return instr;
   }
 
+  const Function& function() const { return flow_graph_->function(); }
+
   void AddReturn(Value* value) {
+    const auto& function = flow_graph_->function();
+    const auto representation = FlowGraph::ReturnRepresentationOf(function);
+
     ReturnInstr* instr = new ReturnInstr(
-        TokenPos(), value, CompilerState::Current().GetNextDeoptId());
+        TokenPos(), value, CompilerState::Current().GetNextDeoptId(),
+        RawPcDescriptors::kInvalidYieldIndex, representation);
     AddInstruction(instr);
     entry_->set_last_instruction(instr);
   }
 
   Definition* AddParameter(intptr_t index, bool with_frame) {
+    const auto& function = flow_graph_->function();
+    const intptr_t param_offset = FlowGraph::ParameterOffsetAt(function, index);
+    const auto representation =
+        FlowGraph::ParameterRepresentationAt(function, index);
+    return AddParameter(index, param_offset, with_frame, representation);
+  }
+
+  Definition* AddParameter(intptr_t index,
+                           intptr_t param_offset,
+                           bool with_frame,
+                           Representation representation) {
     auto normal_entry = flow_graph_->graph_entry()->normal_entry();
     return AddToInitialDefinitions(
-        new ParameterInstr(index, normal_entry, with_frame ? FPREG : SPREG));
+        new ParameterInstr(index, param_offset, normal_entry, representation,
+                           with_frame ? FPREG : SPREG));
   }
 
   TokenPosition TokenPos() { return flow_graph_->function().token_pos(); }
@@ -100,6 +121,9 @@
 
   void AddPhi(PhiInstr* phi) {
     phi->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+    if (FlowGraph::NeedsPairLocation(phi->representation())) {
+      flow_graph_->alloc_ssa_temp_index();
+    }
     phi->mark_alive();
     entry_->AsJoinEntry()->InsertPhi(phi);
   }
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 6d11d0c..084a67d 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -43,6 +43,7 @@
       num_direct_parameters_(parsed_function.function().HasOptionalParameters()
                                  ? 0
                                  : parsed_function.function().NumParameters()),
+      direct_parameters_size_(0),
       graph_entry_(graph_entry),
       preorder_(),
       postorder_(),
@@ -57,6 +58,8 @@
       captured_parameters_(new (zone()) BitVector(zone(), variable_count())),
       inlining_id_(-1),
       should_print_(FlowGraphPrinter::ShouldPrint(parsed_function.function())) {
+  direct_parameters_size_ = ParameterOffsetAt(
+      function(), num_direct_parameters_, /*last_slot*/ false);
   DiscoverBlocks();
 }
 
@@ -66,6 +69,67 @@
   }
 }
 
+intptr_t FlowGraph::ParameterOffsetAt(const Function& function,
+                                      intptr_t index,
+                                      bool last_slot /*=true*/) {
+  ASSERT(index <= function.NumParameters());
+  intptr_t param_offset = 0;
+  for (intptr_t i = 0; i < index; i++) {
+    if (function.is_unboxed_integer_parameter_at(i)) {
+      param_offset += compiler::target::kIntSpillFactor;
+    } else if (function.is_unboxed_double_parameter_at(i)) {
+      param_offset += compiler::target::kDoubleSpillFactor;
+    } else {
+      ASSERT(!function.is_unboxed_parameter_at(i));
+      // Unboxed parameters always occupy one word
+      param_offset++;
+    }
+  }
+  if (last_slot) {
+    ASSERT(index < function.NumParameters());
+    if (function.is_unboxed_double_parameter_at(index) &&
+        compiler::target::kDoubleSpillFactor > 1) {
+      ASSERT(compiler::target::kDoubleSpillFactor == 2);
+      param_offset++;
+    } else if (function.is_unboxed_integer_parameter_at(index) &&
+               compiler::target::kIntSpillFactor > 1) {
+      ASSERT(compiler::target::kIntSpillFactor == 2);
+      param_offset++;
+    }
+  }
+  return param_offset;
+}
+
+Representation FlowGraph::ParameterRepresentationAt(const Function& function,
+                                                    intptr_t index) {
+  if (function.IsNull()) {
+    return kTagged;
+  }
+  ASSERT(index < function.NumParameters());
+  if (function.is_unboxed_integer_parameter_at(index)) {
+    return kUnboxedInt64;
+  } else if (function.is_unboxed_double_parameter_at(index)) {
+    return kUnboxedDouble;
+  } else {
+    ASSERT(!function.is_unboxed_parameter_at(index));
+    return kTagged;
+  }
+}
+
+Representation FlowGraph::ReturnRepresentationOf(const Function& function) {
+  if (function.IsNull()) {
+    return kTagged;
+  }
+  if (function.has_unboxed_integer_return()) {
+    return kUnboxedInt64;
+  } else if (function.has_unboxed_double_return()) {
+    return kUnboxedDouble;
+  } else {
+    ASSERT(!function.has_unboxed_return());
+    return kTagged;
+  }
+}
+
 void FlowGraph::ReplaceCurrentInstruction(ForwardInstructionIterator* iterator,
                                           Instruction* current,
                                           Instruction* replacement) {
@@ -118,6 +182,9 @@
     constant =
         new (zone()) ConstantInstr(Object::ZoneHandle(zone(), object.raw()));
     constant->set_ssa_temp_index(alloc_ssa_temp_index());
+    if (NeedsPairLocation(constant->representation())) {
+      alloc_ssa_temp_index();
+    }
     AddToGraphInitialDefinitions(constant);
     constant_instr_pool_.Insert(constant);
   }
@@ -1038,9 +1105,31 @@
 
   ASSERT(variable_count() == env->length());
   ASSERT(direct_parameter_count <= env->length());
+  intptr_t param_offset = 0;
   for (intptr_t i = 0; i < direct_parameter_count; i++) {
-    ParameterInstr* param = new (zone()) ParameterInstr(i, function_entry);
+    ASSERT(FLAG_precompiled_mode || !function().is_unboxed_parameter_at(i));
+    ParameterInstr* param;
+
+    const intptr_t index = (function().IsFactory() ? (i - 1) : i);
+
+    if (index >= 0 && function().is_unboxed_integer_parameter_at(index)) {
+      constexpr intptr_t kCorrection = compiler::target::kIntSpillFactor - 1;
+      param = new (zone()) ParameterInstr(i, param_offset + kCorrection,
+                                          function_entry, kUnboxedInt64);
+      param_offset += compiler::target::kIntSpillFactor;
+    } else if (index >= 0 && function().is_unboxed_double_parameter_at(index)) {
+      constexpr intptr_t kCorrection = compiler::target::kDoubleSpillFactor - 1;
+      param = new (zone()) ParameterInstr(i, param_offset + kCorrection,
+                                          function_entry, kUnboxedDouble);
+      param_offset += compiler::target::kDoubleSpillFactor;
+    } else {
+      ASSERT(index < 0 || !function().is_unboxed_parameter_at(index));
+      param =
+          new (zone()) ParameterInstr(i, param_offset, function_entry, kTagged);
+      param_offset++;
+    }
     param->set_ssa_temp_index(alloc_ssa_temp_index());
+    if (NeedsPairLocation(param->representation())) alloc_ssa_temp_index();
     AddToInitialDefinitions(function_entry, param);
     (*env)[i] = param;
   }
@@ -1101,7 +1190,8 @@
   const intptr_t parameter_count = osr_variable_count();
   ASSERT(parameter_count == env->length());
   for (intptr_t i = 0; i < parameter_count; i++) {
-    ParameterInstr* param = new (zone()) ParameterInstr(i, osr_entry);
+    ParameterInstr* param =
+        new (zone()) ParameterInstr(i, i, osr_entry, kTagged);
     param->set_ssa_temp_index(alloc_ssa_temp_index());
     AddToInitialDefinitions(osr_entry, param);
     (*env)[i] = param;
@@ -1133,7 +1223,7 @@
       param = new (Z) SpecialParameterInstr(SpecialParameterInstr::kStackTrace,
                                             DeoptId::kNone, catch_entry);
     } else {
-      param = new (Z) ParameterInstr(i, catch_entry);
+      param = new (Z) ParameterInstr(i, i, catch_entry, kTagged);
     }
 
     param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
@@ -2582,8 +2672,8 @@
           new (Z) PushArgumentsArray(zone(), arg_count);
       for (intptr_t i = 0; i < arg_count; ++i) {
         Value* arg = instruction->ArgumentValueAt(i);
-        PushArgumentInstr* push_arg =
-            new (Z) PushArgumentInstr(arg->CopyWithType(Z));
+        PushArgumentInstr* push_arg = new (Z) PushArgumentInstr(
+            arg->CopyWithType(Z), instruction->RequiredInputRepresentation(i));
         arguments->Add(push_arg);
         // Insert all PushArgument instructions immediately before call.
         // PushArgumentInstr::EmitNativeCode may generate more efficient
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index b6ff531..03a2239 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -112,6 +112,9 @@
   // the arguments descriptor.
   intptr_t num_direct_parameters() const { return num_direct_parameters_; }
 
+  // The number of words on the stack used by the direct parameters.
+  intptr_t direct_parameters_size() const { return direct_parameters_size_; }
+
   // The number of variables (or boxes) which code can load from / store to.
   // The SSA renaming will insert phi's for them (and only them - i.e. there
   // will be no phi insertion for [LocalVariable]s pointing to the expression
@@ -127,6 +130,19 @@
     return variable_count() + graph_entry()->osr_entry()->stack_depth();
   }
 
+  // This function returns the offset (in words) of the [index]th
+  // parameter, relative to the first parameter.
+  // If [last_slot] is true it gives the offset of the last slot of that
+  // location, otherwise it returns the first one.
+  static intptr_t ParameterOffsetAt(const Function& function,
+                                    intptr_t index,
+                                    bool last_slot = true);
+
+  static Representation ParameterRepresentationAt(const Function& function,
+                                                  intptr_t index);
+
+  static Representation ReturnRepresentationOf(const Function& function);
+
   // The number of variables (or boxes) inside the functions frame - meaning
   // below the frame pointer.  This does not include the expression stack.
   intptr_t num_stack_locals() const {
@@ -161,6 +177,11 @@
     return num_direct_parameters_ - variable->index().value();
   }
 
+  static bool NeedsPairLocation(Representation representation) {
+    return representation == kUnboxedInt64 &&
+           compiler::target::kIntSpillFactor == 2;
+  }
+
   // Flow graph orders.
   const GrowableArray<BlockEntryInstr*>& preorder() const { return preorder_; }
   const GrowableArray<BlockEntryInstr*>& postorder() const {
@@ -516,6 +537,7 @@
   // Flow graph fields.
   const ParsedFunction& parsed_function_;
   intptr_t num_direct_parameters_;
+  intptr_t direct_parameters_size_;
   GraphEntryInstr* graph_entry_;
   GrowableArray<BlockEntryInstr*> preorder_;
   GrowableArray<BlockEntryInstr*> postorder_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 79b5fda9..a12c9a0 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -579,9 +579,11 @@
     BeginCodeSourceRange();
     ASSERT(pending_deoptimization_env_ == NULL);
     pending_deoptimization_env_ = entry->env();
+    set_current_instruction(entry);
     StatsBegin(entry);
     entry->EmitNativeCode(this);
     StatsEnd(entry);
+    set_current_instruction(nullptr);
     pending_deoptimization_env_ = NULL;
     EndCodeSourceRange(entry->token_pos());
 
@@ -593,7 +595,9 @@
     // Compile all successors until an exit, branch, or a block entry.
     for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
       Instruction* instr = it.Current();
+      set_current_instruction(instr);
       StatsBegin(instr);
+
       // Compose intervals.
       code_source_map_builder_->StartInliningInterval(assembler()->CodeSize(),
                                                       instr->inlining_id());
@@ -628,6 +632,7 @@
       }
 #endif
       StatsEnd(instr);
+      set_current_instruction(nullptr);
 
       if (auto indirect_goto = instr->AsIndirectGoto()) {
         indirect_gotos_.Add(indirect_goto);
@@ -700,11 +705,13 @@
     const CombinedCodeStatistics::EntryCounter stats_tag =
         CombinedCodeStatistics::SlowPathCounterFor(
             slow_path->instruction()->tag());
+    set_current_instruction(slow_path->instruction());
     SpecialStatsBegin(stats_tag);
     BeginCodeSourceRange();
     slow_path->GenerateCode(this);
     EndCodeSourceRange(slow_path->instruction()->token_pos());
     SpecialStatsEnd(stats_tag);
+    set_current_instruction(nullptr);
   }
   for (intptr_t i = 0; i < deopt_infos_.length(); i++) {
     BeginCodeSourceRange();
@@ -863,14 +870,58 @@
     // registers to the bitmap. This is why the second call to RecordSafepoint
     // with the same instruction (and same location summary) sees a bitmap that
     // is larger that StackSize(). It will never be larger than StackSize() +
-    // live_registers_size.
+    // unboxed_arg_bits_count + live_registers_size.
     // The first safepoint will grow the bitmap to be the size of
     // spill_area_size but the second safepoint will truncate the bitmap and
-    // append the live registers to it again. The bitmap produced by both calls
-    // will be the same.
-    ASSERT(bitmap->Length() <= (spill_area_size + saved_registers_size));
+    // append the bits for arguments and live registers to it again.
+    const intptr_t bitmap_previous_length = bitmap->Length();
     bitmap->SetLength(spill_area_size);
 
+    intptr_t unboxed_arg_bits_count = 0;
+
+    auto instr = current_instruction();
+    const intptr_t args_count = instr->ArgumentCount();
+    bool pushed_unboxed = false;
+
+    for (intptr_t i = 0; i < args_count; i++) {
+      auto push_arg =
+          instr->ArgumentValueAt(i)->instruction()->AsPushArgument();
+      switch (push_arg->representation()) {
+        case kUnboxedInt64:
+          bitmap->SetRange(
+              bitmap->Length(),
+              bitmap->Length() + compiler::target::kIntSpillFactor - 1, false);
+          unboxed_arg_bits_count += compiler::target::kIntSpillFactor;
+          pushed_unboxed = true;
+          break;
+        case kUnboxedDouble:
+          bitmap->SetRange(
+              bitmap->Length(),
+              bitmap->Length() + compiler::target::kDoubleSpillFactor - 1,
+              false);
+          unboxed_arg_bits_count += compiler::target::kDoubleSpillFactor;
+          pushed_unboxed = true;
+          break;
+        case kTagged:
+          if (!pushed_unboxed) {
+            // GC considers everything to be tagged between prefix of stack
+            // frame (spill area size) and postfix of stack frame (e.g. slow
+            // path arguments, shared pushed registers).
+            // From the first unboxed argument on we will include bits in the
+            // postfix.
+            continue;
+          }
+          bitmap->Set(bitmap->Length(), true);
+          unboxed_arg_bits_count++;
+          break;
+        default:
+          UNREACHABLE();
+          break;
+      }
+    }
+    ASSERT(bitmap_previous_length <=
+           (spill_area_size + unboxed_arg_bits_count + saved_registers_size));
+
     ASSERT(slow_path_argument_count == 0 || !using_shared_stub);
 
     // Mark the bits in the stack map in the same order we push registers in
@@ -1389,11 +1440,15 @@
                                : ic_data.arguments_descriptor());
   ASSERT(ArgumentsDescriptor(arguments_descriptor).TypeArgsLen() ==
          args_info.type_args_len);
+  ASSERT(ArgumentsDescriptor(arguments_descriptor).Count() ==
+         args_info.count_without_type_args);
+  ASSERT(ArgumentsDescriptor(arguments_descriptor).Size() ==
+         args_info.size_without_type_args);
   // Force-optimized functions lack the deopt info which allows patching of
   // optimized static calls.
   if (is_optimizing() && (!ForcedOptimization() || FLAG_precompiled_mode)) {
     EmitOptimizedStaticCall(function, arguments_descriptor,
-                            args_info.count_with_type_args, deopt_id, token_pos,
+                            args_info.size_with_type_args, deopt_id, token_pos,
                             locs, entry_kind);
   } else {
     ICData& call_ic_data = ICData::ZoneHandle(zone(), ic_data.raw());
@@ -1406,7 +1461,7 @@
       call_ic_data = call_ic_data.Original();
     }
     AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id, token_pos);
-    EmitUnoptimizedStaticCall(args_info.count_with_type_args, deopt_id,
+    EmitUnoptimizedStaticCall(args_info.size_with_type_args, deopt_id,
                               token_pos, locs, call_ic_data, entry_kind);
   }
 }
@@ -2136,7 +2191,7 @@
     const Function& function = *targets.TargetAt(smi_case)->target;
     GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
                            locs, function, entry_kind);
-    __ Drop(args_info.count_with_type_args);
+    __ Drop(args_info.size_with_type_args);
     if (match_found != NULL) {
       __ Jump(match_found);
     }
@@ -2186,7 +2241,7 @@
     const Function& function = *targets.TargetAt(i)->target;
     GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
                            locs, function, entry_kind);
-    __ Drop(args_info.count_with_type_args);
+    __ Drop(args_info.size_with_type_args);
     if (!is_last_check || add_megamorphic_call) {
       __ Jump(match_found);
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 0c2519d..fc573cc 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -973,14 +973,14 @@
   void EmitOptimizedStaticCall(
       const Function& function,
       const Array& arguments_descriptor,
-      intptr_t count_with_type_args,
+      intptr_t size_with_type_args,
       intptr_t deopt_id,
       TokenPosition token_pos,
       LocationSummary* locs,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void EmitUnoptimizedStaticCall(
-      intptr_t count_with_type_args,
+      intptr_t size_with_type_args,
       intptr_t deopt_id,
       TokenPosition token_pos,
       LocationSummary* locs,
@@ -1085,6 +1085,12 @@
     return block_order_.length() - index - 1;
   }
 
+  void set_current_instruction(Instruction* current_instruction) {
+    current_instruction_ = current_instruction;
+  }
+
+  Instruction* current_instruction() { return current_instruction_; }
+
   void CompactBlock(BlockEntryInstr* block);
   void CompactBlocks();
 
@@ -1208,6 +1214,9 @@
   ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_;
   Array& edge_counters_array_;
 
+  // Instruction currently running EmitNativeCode().
+  Instruction* current_instruction_ = nullptr;
+
   DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
 };
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 4c049a6..5aad6fd 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -1071,11 +1071,11 @@
 
   __ LoadObject(R8, parsed_function().function());
   __ LoadFromOffset(kWord, R0, SP,
-                    (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
+                    (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(R9, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
                    entry_kind);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallJIT(const Code& stub,
@@ -1088,7 +1088,7 @@
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadFromOffset(kWord, R0, SP,
-                    (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
+                    (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(R9, ic_data);
   __ LoadUniqueObject(CODE_REG, stub);
   const intptr_t entry_point_offset =
@@ -1098,7 +1098,7 @@
   __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blx(LR);
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitMegamorphicInstanceCall(
@@ -1147,7 +1147,7 @@
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
-  __ Drop(args_desc.CountWithTypeArgs());
+  __ Drop(args_desc.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallAOT(const ICData& ic_data,
@@ -1171,7 +1171,7 @@
   __ Comment("InstanceCallAOT (%s)", switchable_call_mode);
   __ LoadFromOffset(
       kWord, R0, SP,
-      (ic_data.CountWithoutTypeArgs() - 1) * compiler::target::kWordSize);
+      (ic_data.SizeWithoutTypeArgs() - 1) * compiler::target::kWordSize);
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
@@ -1191,10 +1191,10 @@
 
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
                        locs);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t count_with_type_args,
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
@@ -1205,13 +1205,13 @@
   __ LoadObject(R9, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitOptimizedStaticCall(
     const Function& function,
     const Array& arguments_descriptor,
-    intptr_t count_with_type_args,
+    intptr_t size_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
@@ -1228,7 +1228,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
                          function, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitDispatchTableCall(
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 4eed614..2958722 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -1032,11 +1032,11 @@
   // Pass the function explicitly, it is used in IC stub.
 
   __ LoadObject(R6, parsed_function().function());
-  __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
+  __ LoadFromOffset(R0, SP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
   __ LoadUniqueObject(R5, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
                    entry_kind);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallJIT(const Code& stub,
@@ -1048,7 +1048,7 @@
   ASSERT(entry_kind == Code::EntryKind::kNormal ||
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
-  __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
+  __ LoadFromOffset(R0, SP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
 
   compiler::ObjectPoolBuilder& op = __ object_pool_builder();
   const intptr_t ic_data_index =
@@ -1065,7 +1065,7 @@
   __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blr(LR);
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitMegamorphicInstanceCall(
@@ -1111,7 +1111,7 @@
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
-  __ Drop(args_desc.CountWithTypeArgs());
+  __ Drop(args_desc.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallAOT(const ICData& ic_data,
@@ -1133,7 +1133,7 @@
   compiler::ObjectPoolBuilder& op = __ object_pool_builder();
 
   __ Comment("InstanceCallAOT (%s)", switchable_call_mode);
-  __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
+  __ LoadFromOffset(R0, SP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize);
 
   const intptr_t data_index =
       op.AddObject(data, ObjectPool::Patchability::kPatchable);
@@ -1161,10 +1161,10 @@
 
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
                        locs);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t count_with_type_args,
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
@@ -1175,13 +1175,13 @@
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitOptimizedStaticCall(
     const Function& function,
     const Array& arguments_descriptor,
-    intptr_t count_with_type_args,
+    intptr_t size_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
@@ -1198,7 +1198,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
                          function, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitDispatchTableCall(
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 19d13b9..673e253 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -886,7 +886,7 @@
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
 }
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t count_with_type_args,
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
@@ -897,7 +897,7 @@
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitEdgeCounter(intptr_t edge_id) {
@@ -929,11 +929,11 @@
   __ LoadObject(EAX, parsed_function().function());
   // Load receiver into EBX.
   __ movl(EBX, compiler::Address(
-                   ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+                   ESP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
                    entry_kind);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallJIT(const Code& stub,
@@ -947,7 +947,7 @@
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Load receiver into EBX.
   __ movl(EBX, compiler::Address(
-                   ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+                   ESP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadObject(ECX, ic_data, true);
   __ LoadObject(CODE_REG, stub, true);
   const intptr_t entry_point_offset =
@@ -956,7 +956,7 @@
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
-  __ Drop(ic_data.CountWithTypeArgs());
+  __ Drop(ic_data.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitMegamorphicInstanceCall(
@@ -993,7 +993,7 @@
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
-  __ Drop(args_desc.CountWithTypeArgs());
+  __ Drop(args_desc.SizeWithTypeArgs());
 }
 
 void FlowGraphCompiler::EmitInstanceCallAOT(const ICData& ic_data,
@@ -1009,7 +1009,7 @@
 void FlowGraphCompiler::EmitOptimizedStaticCall(
     const Function& function,
     const Array& arguments_descriptor,
-    intptr_t count_with_type_args,
+    intptr_t size_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
@@ -1023,7 +1023,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
                          function, entry_kind);
-  __ Drop(count_with_type_args);
+  __ Drop(size_with_type_args);
 }
 
 void FlowGraphCompiler::EmitDispatchTableCall(
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index ff151c8..1a6d288 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -1013,7 +1013,7 @@
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
 }
 
-void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t count_with_type_args,
+void FlowGraphCompiler::EmitUnoptimizedStaticCall(intptr_t size_with_type_args,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
@@ -1024,7 +1024,7 @@
   __ LoadObject(RBX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs, entry_kind);
-  __ Drop(count_with_type_args, RCX);
+  __ Drop(size_with_type_args, RCX);
 }
 
 void FlowGraphCompiler::EmitEdgeCounter(intptr_t edge_id) {
@@ -1057,11 +1057,11 @@
   __ LoadObject(RDI, parsed_function().function());
   // Load receiver into RDX.
   __ movq(RDX, compiler::Address(
-                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+                   RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(RBX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
                    entry_kind);
-  __ Drop(ic_data.CountWithTypeArgs(), RCX);
+  __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
 void FlowGraphCompiler::EmitInstanceCallJIT(const Code& stub,
@@ -1075,7 +1075,7 @@
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Load receiver into RDX.
   __ movq(RDX, compiler::Address(
-                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+                   RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(RBX, ic_data);
   __ LoadUniqueObject(CODE_REG, stub);
   const intptr_t entry_point_offset =
@@ -1084,7 +1084,7 @@
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
   __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
-  __ Drop(ic_data.CountWithTypeArgs(), RCX);
+  __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
 void FlowGraphCompiler::EmitMegamorphicInstanceCall(
@@ -1127,7 +1127,7 @@
     AddCurrentDescriptor(RawPcDescriptors::kDeopt, deopt_id_after, token_pos);
   }
   RecordCatchEntryMoves(pending_deoptimization_env_, try_index);
-  __ Drop(args_desc.CountWithTypeArgs(), RCX);
+  __ Drop(args_desc.SizeWithTypeArgs(), RCX);
 }
 
 void FlowGraphCompiler::EmitInstanceCallAOT(const ICData& ic_data,
@@ -1150,7 +1150,7 @@
 
   __ Comment("InstanceCallAOT (%s)", switchable_call_mode);
   __ movq(RDX, compiler::Address(
-                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+                   RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
@@ -1167,13 +1167,13 @@
   __ call(RCX);
 
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
-  __ Drop(ic_data.CountWithTypeArgs(), RCX);
+  __ Drop(ic_data.SizeWithTypeArgs(), RCX);
 }
 
 void FlowGraphCompiler::EmitOptimizedStaticCall(
     const Function& function,
     const Array& arguments_descriptor,
-    intptr_t count_with_type_args,
+    intptr_t size_with_type_args,
     intptr_t deopt_id,
     TokenPosition token_pos,
     LocationSummary* locs,
@@ -1190,7 +1190,7 @@
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
                          function, entry_kind);
-  __ Drop(count_with_type_args, RCX);
+  __ Drop(size_with_type_args, RCX);
 }
 
 void FlowGraphCompiler::EmitDispatchTableCall(
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index b64697b..bf06f01 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2605,8 +2605,8 @@
     case Slot::Kind::kArgumentsDescriptor_type_args_len:
     case Slot::Kind::kArgumentsDescriptor_positional_count:
     case Slot::Kind::kArgumentsDescriptor_count:
+    case Slot::Kind::kArgumentsDescriptor_size:
     case Slot::Kind::kTypeArguments:
-    case Slot::Kind::kTypedDataBase_data_field:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
     case Slot::Kind::kTypedDataView_data:
     case Slot::Kind::kGrowableObjectArray_data:
@@ -2619,7 +2619,7 @@
     case Slot::Kind::kClosure_hash:
     case Slot::Kind::kCapturedVariable:
     case Slot::Kind::kDartField:
-    case Slot::Kind::kPointer_c_memory_address:
+    case Slot::Kind::kPointerBase_data_field:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
       return false;
@@ -3024,6 +3024,9 @@
   // Find a more precise box instruction.
   if (auto conv = value()->definition()->AsIntConverter()) {
     Definition* replacement;
+    if (conv->from() == kUntagged) {
+      return this;
+    }
     switch (conv->from()) {
       case kUnboxedInt32:
         replacement = new BoxInt32Instr(conv->value()->CopyWithType());
@@ -3169,6 +3172,14 @@
       return this;
     }
 
+#if defined(TARGET_ARCH_IS_32_BIT)
+    // Do not erase extending conversions from 32-bit untagged to 64-bit values
+    // because untagged does not specify whether it is signed or not.
+    if ((box_defn->from() == kUntagged) && to() == kUnboxedInt64) {
+      return this;
+    }
+#endif
+
     if (box_defn->from() == to()) {
       return box_defn->value()->definition();
     }
@@ -4257,7 +4268,7 @@
 
 LocationSummary* InstanceCallInstr::MakeLocationSummary(Zone* zone,
                                                         bool optimizing) const {
-  return MakeCallSummary(zone);
+  return MakeCallSummary(zone, this);
 }
 
 static RawCode* TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
@@ -4276,6 +4287,45 @@
   }
 }
 
+bool InstanceCallBaseInstr::HasNonSmiAssignableInterface(Zone* zone) const {
+  if (!interface_target().IsNull()) {
+    const AbstractType& target_type = AbstractType::Handle(
+        zone, Class::Handle(zone, interface_target().Owner()).RareType());
+    if (!CompileType::Smi().IsAssignableTo(target_type)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+Representation InstanceCallBaseInstr::RequiredInputRepresentation(
+    intptr_t idx) const {
+  // The first input is the array of types
+  // for generic functions
+  if (type_args_len() > 0) {
+    if (idx == 0) {
+      return kTagged;
+    }
+    idx--;
+  }
+  return FlowGraph::ParameterRepresentationAt(interface_target(), idx);
+}
+
+intptr_t InstanceCallBaseInstr::ArgumentsSize() const {
+  if (interface_target().IsNull()) {
+    return ArgumentCountWithoutTypeArgs() + ((type_args_len() > 0) ? 1 : 0);
+  }
+
+  return FlowGraph::ParameterOffsetAt(interface_target(),
+                                      ArgumentCountWithoutTypeArgs(),
+                                      /*last_slot=*/false) +
+         ((type_args_len() > 0) ? 1 : 0);
+}
+
+Representation InstanceCallBaseInstr::representation() const {
+  return FlowGraph::ReturnRepresentationOf(interface_target());
+}
+
 void InstanceCallBaseInstr::UpdateReceiverSminess(Zone* zone) {
   if (FLAG_precompiled_mode && !receiver_is_not_smi()) {
     if (Receiver()->Type()->IsNotSmi()) {
@@ -4283,12 +4333,8 @@
       return;
     }
 
-    if (!interface_target().IsNull()) {
-      const AbstractType& target_type = AbstractType::Handle(
-          zone, Class::Handle(zone, interface_target().Owner()).RareType());
-      if (!CompileType::Smi().IsAssignableTo(target_type)) {
-        set_receiver_is_not_smi(true);
-      }
+    if (HasNonSmiAssignableInterface(zone)) {
+      set_receiver_is_not_smi(true);
     }
   }
 }
@@ -4392,6 +4438,38 @@
   return *binary_;
 }
 
+Representation DispatchTableCallInstr::RequiredInputRepresentation(
+    intptr_t idx) const {
+  if (idx == (InputCount() - 1)) {
+    return kUntagged;
+  }
+
+  // The first input is the array of types
+  // for generic functions
+  if (type_args_len() > 0) {
+    if (idx == 0) {
+      return kTagged;
+    }
+    idx--;
+  }
+  return FlowGraph::ParameterRepresentationAt(interface_target(), idx);
+}
+
+intptr_t DispatchTableCallInstr::ArgumentsSize() const {
+  if (interface_target().IsNull()) {
+    return ArgumentCountWithoutTypeArgs() + ((type_args_len() > 0) ? 1 : 0);
+  }
+
+  return FlowGraph::ParameterOffsetAt(interface_target(),
+                                      ArgumentCountWithoutTypeArgs(),
+                                      /*last_slot=*/false) +
+         ((type_args_len() > 0) ? 1 : 0);
+}
+
+Representation DispatchTableCallInstr::representation() const {
+  return FlowGraph::ReturnRepresentationOf(interface_target());
+}
+
 DispatchTableCallInstr* DispatchTableCallInstr::FromCall(
     Zone* zone,
     const InstanceCallBaseInstr* call,
@@ -4414,7 +4492,8 @@
 void DispatchTableCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Array& arguments_descriptor = Array::ZoneHandle();
   if (selector()->requires_args_descriptor) {
-    ArgumentsInfo args_info(type_args_len(), ArgumentCount(), argument_names());
+    ArgumentsInfo args_info(type_args_len(), ArgumentCount(), ArgumentsSize(),
+                            argument_names());
     arguments_descriptor = args_info.ToArgumentsDescriptor();
   }
   const Register cid_reg = locs()->in(0).reg();
@@ -4430,11 +4509,35 @@
       compiler->AddNullCheck(token_pos(), function_name);
     }
   }
-  __ Drop(ArgumentCount());
+  __ Drop(ArgumentsSize());
 
   compiler->AddDispatchTableCallTarget(selector());
 }
 
+Representation StaticCallInstr::RequiredInputRepresentation(
+    intptr_t idx) const {
+  // The first input is the array of types
+  // for generic functions
+  if (type_args_len() > 0 || function().IsFactory()) {
+    if (idx == 0) {
+      return kTagged;
+    }
+    idx--;
+  }
+  return FlowGraph::ParameterRepresentationAt(function(), idx);
+}
+
+intptr_t StaticCallInstr::ArgumentsSize() const {
+  return FlowGraph::ParameterOffsetAt(function(),
+                                      ArgumentCountWithoutTypeArgs(),
+                                      /*last_slot=*/false) +
+         ((type_args_len() > 0) ? 1 : 0);
+}
+
+Representation StaticCallInstr::representation() const {
+  return FlowGraph::ReturnRepresentationOf(function());
+}
+
 const CallTargets& StaticCallInstr::Targets() {
   if (targets_ == nullptr) {
     Zone* zone = Thread::Current()->zone();
@@ -4516,11 +4619,12 @@
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Zone* zone,
     bool optimizing) const {
-  return MakeCallSummary(zone);
+  return MakeCallSummary(zone, this);
 }
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ArgumentsInfo args_info(type_args_len(), ArgumentCount(), argument_names());
+  ArgumentsInfo args_info(type_args_len(), ArgumentCount(), ArgumentsSize(),
+                          argument_names());
   UpdateReceiverSminess(compiler->zone());
   compiler->EmitPolymorphicInstanceCall(
       this, targets(), args_info, deopt_id(), token_pos(), locs(), complete(),
@@ -4656,7 +4760,7 @@
 
 LocationSummary* StaticCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool optimizing) const {
-  return MakeCallSummary(zone);
+  return MakeCallSummary(zone, this);
 }
 
 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -4674,8 +4778,8 @@
   } else {
     call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
   }
-
-  ArgumentsInfo args_info(type_args_len(), ArgumentCount(), argument_names());
+  ArgumentsInfo args_info(type_args_len(), ArgumentCount(), ArgumentsSize(),
+                          argument_names());
   compiler->GenerateStaticCall(deopt_id(), token_pos(), function(), args_info,
                                locs(), *call_ic_data, rebind_rule_,
                                entry_kind());
@@ -5251,6 +5355,7 @@
 
 LoadIndexedInstr::LoadIndexedInstr(Value* array,
                                    Value* index,
+                                   bool index_unboxed,
                                    intptr_t index_scale,
                                    intptr_t class_id,
                                    AlignmentType alignment,
@@ -5258,6 +5363,7 @@
                                    TokenPosition token_pos,
                                    CompileType* result_type)
     : TemplateDefinition(deopt_id),
+      index_unboxed_(index_unboxed),
       index_scale_(index_scale),
       class_id_(class_id),
       alignment_(StrengthenAlignment(class_id, alignment)),
@@ -5271,6 +5377,7 @@
                                      Value* index,
                                      Value* value,
                                      StoreBarrierType emit_store_barrier,
+                                     bool index_unboxed,
                                      intptr_t index_scale,
                                      intptr_t class_id,
                                      AlignmentType alignment,
@@ -5279,6 +5386,7 @@
                                      SpeculativeMode speculative_mode)
     : TemplateInstruction(deopt_id),
       emit_store_barrier_(emit_store_barrier),
+      index_unboxed_(index_unboxed),
       index_scale_(index_scale),
       class_id_(class_id),
       alignment_(StrengthenAlignment(class_id, alignment)),
@@ -5400,7 +5508,7 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
                                                       bool optimizing) const {
-  return MakeCallSummary(zone);
+  return MakeCallSummary(zone, this);
 }
 
 void NativeCallInstr::SetupNative() {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 6477f496..80c224c 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -61,7 +61,7 @@
 namespace compiler {
 class BlockBuilder;
 struct TableSelector;
-}
+}  // namespace compiler
 
 class Value : public ZoneAllocated {
  public:
@@ -239,9 +239,7 @@
     thread->set_hierarchy_info(this);
   }
 
-  ~HierarchyInfo() {
-    thread()->set_hierarchy_info(NULL);
-  }
+  ~HierarchyInfo() { thread()->set_hierarchy_info(NULL); }
 
   const CidRangeVector& SubtypeRangesForClass(const Class& klass,
                                               bool include_abstract,
@@ -951,7 +949,11 @@
     locs_ = MakeLocationSummary(zone, optimizing);
   }
 
-  static LocationSummary* MakeCallSummary(Zone* zone);
+  // Makes a new call location summary (or uses `locs`) and initializes the
+  // output register constraints depending on the representation of [instr].
+  static LocationSummary* MakeCallSummary(Zone* zone,
+                                          const Instruction* instr,
+                                          LocationSummary* locs = nullptr);
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
 
@@ -2434,13 +2436,20 @@
 class ParameterInstr : public Definition {
  public:
   ParameterInstr(intptr_t index,
+                 intptr_t param_offset,
                  BlockEntryInstr* block,
+                 Representation representation,
                  Register base_reg = FPREG)
-      : index_(index), base_reg_(base_reg), block_(block) {}
+      : index_(index),
+        param_offset_(param_offset),
+        base_reg_(base_reg),
+        representation_(representation),
+        block_(block) {}
 
   DECLARE_INSTRUCTION(Parameter)
 
   intptr_t index() const { return index_; }
+  intptr_t param_offset() const { return param_offset_; }
   Register base_reg() const { return base_reg_; }
 
   // Get the block entry for that instruction.
@@ -2453,6 +2462,13 @@
     return NULL;
   }
 
+  virtual Representation representation() const { return representation_; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return representation();
+  }
+
   virtual bool ComputeCanDeoptimize() const { return false; }
 
   virtual bool HasUnknownSideEffects() const { return false; }
@@ -2473,7 +2489,14 @@
   virtual void RawSetInputAt(intptr_t i, Value* value) { UNREACHABLE(); }
 
   const intptr_t index_;
+
+  // The offset (in words) of the last slot of the parameter, relative
+  // to the first parameter.
+  // It is used in the FlowGraphAllocator when it sets the assigned location
+  // and spill slot for the parameter definition.
+  const intptr_t param_offset_;
   const Register base_reg_;
+  const Representation representation_;
   BlockEntryInstr* block_;
 
   DISALLOW_COPY_AND_ASSIGN(ParameterInstr);
@@ -2577,7 +2600,7 @@
   DISALLOW_COPY_AND_ASSIGN(StoreIndexedUnsafeInstr);
 };
 
-// Loads a tagged pointer from slot accessable from a fixed register.  It has
+// Loads a value from slot accessable from a fixed register.  It has
 // the form:
 //
 //     base_reg[index + #constant]
@@ -2613,6 +2636,8 @@
     return other->AsLoadIndexedUnsafe()->offset() == offset();
   }
 
+  virtual Representation representation() const { return representation_; }
+
   Value* index() const { return InputAt(0); }
   Register base_reg() const { return FPREG; }
   intptr_t offset() const { return offset_; }
@@ -2679,7 +2704,10 @@
 
 class PushArgumentInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  explicit PushArgumentInstr(Value* value) { SetInputAt(0, value); }
+  explicit PushArgumentInstr(Value* value, Representation representation)
+      : representation_(representation) {
+    SetInputAt(0, value);
+  }
 
   DECLARE_INSTRUCTION(PushArgument)
 
@@ -2695,9 +2723,18 @@
     return TokenPosition::kPushArgument;
   }
 
+  virtual Representation representation() const { return representation_; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return representation();
+  }
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
+  const Representation representation_;
+
   DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr);
 };
 
@@ -2718,10 +2755,12 @@
   ReturnInstr(TokenPosition token_pos,
               Value* value,
               intptr_t deopt_id,
-              intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex)
+              intptr_t yield_index = RawPcDescriptors::kInvalidYieldIndex,
+              Representation representation = kTagged)
       : TemplateInstruction(deopt_id),
         token_pos_(token_pos),
-        yield_index_(yield_index) {
+        yield_index_(yield_index),
+        representation_(representation) {
     SetInputAt(0, value);
   }
 
@@ -2747,11 +2786,26 @@
            yield_index() == other_return->yield_index();
   }
 
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t index) const {
+    ASSERT(index == 0);
+    return kNotSpeculative;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const { return DeoptId::kNone; }
+
+  virtual Representation representation() const { return representation_; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return representation_;
+  }
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
   const TokenPosition token_pos_;
   const intptr_t yield_index_;
+  const Representation representation_;
 
   DISALLOW_COPY_AND_ASSIGN(ReturnInstr);
 };
@@ -3552,21 +3606,27 @@
 struct ArgumentsInfo {
   ArgumentsInfo(intptr_t type_args_len,
                 intptr_t count_with_type_args,
+                intptr_t size_with_type_args,
                 const Array& argument_names)
       : type_args_len(type_args_len),
         count_with_type_args(count_with_type_args),
+        size_with_type_args(size_with_type_args),
         count_without_type_args(count_with_type_args -
                                 (type_args_len > 0 ? 1 : 0)),
+        size_without_type_args(size_with_type_args -
+                               (type_args_len > 0 ? 1 : 0)),
         argument_names(argument_names) {}
 
   RawArray* ToArgumentsDescriptor() const {
     return ArgumentsDescriptor::New(type_args_len, count_without_type_args,
-                                    argument_names);
+                                    size_without_type_args, argument_names);
   }
 
   const intptr_t type_args_len;
   const intptr_t count_with_type_args;
+  const intptr_t size_with_type_args;
   const intptr_t count_without_type_args;
+  const intptr_t size_without_type_args;
   const Array& argument_names;
 };
 
@@ -3610,12 +3670,17 @@
   intptr_t ArgumentCountWithoutTypeArgs() const {
     return ArgumentCount() - FirstArgIndex();
   }
+  intptr_t ArgumentsSizeWithoutTypeArgs() const {
+    return ArgumentsSize() - FirstArgIndex();
+  }
   // ArgumentCount() includes the type argument vector if any.
   // Caution: Must override Instruction::ArgumentCount().
-  virtual intptr_t ArgumentCount() const {
+  intptr_t ArgumentCount() const {
     return push_arguments_ != nullptr ? push_arguments_->length()
                                       : inputs_->length() - kExtraInputs;
   }
+  virtual intptr_t ArgumentsSize() const { return ArgumentCount(); }
+
   virtual void SetPushArguments(PushArgumentsArray* push_arguments) {
     ASSERT(push_arguments_ == nullptr);
     push_arguments_ = push_arguments;
@@ -3643,7 +3708,8 @@
   virtual TokenPosition token_pos() const { return token_pos_; }
   RawArray* GetArgumentsDescriptor() const {
     return ArgumentsDescriptor::New(
-        type_args_len(), ArgumentCountWithoutTypeArgs(), argument_names());
+        type_args_len(), ArgumentCountWithoutTypeArgs(),
+        ArgumentsSizeWithoutTypeArgs(), argument_names());
   }
 
   ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
@@ -3790,6 +3856,27 @@
   // interface target, CompileType and hints from TFA.
   void UpdateReceiverSminess(Zone* zone);
 
+  bool HasNonSmiAssignableInterface(Zone* zone) const;
+
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t idx) const {
+    if (type_args_len() > 0) {
+      if (idx == 0) {
+        return kGuardInputs;
+      }
+      idx--;
+    }
+    return interface_target_.is_unboxed_parameter_at(idx) ? kNotSpeculative
+                                                          : kGuardInputs;
+  }
+
+  virtual intptr_t ArgumentsSize() const;
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const;
+
+  virtual intptr_t DeoptimizationTarget() const { return DeoptId::kNone; }
+
+  virtual Representation representation() const;
+
  protected:
   friend class CallSpecializer;
   void set_ic_data(ICData* value) { ic_data_ = value; }
@@ -4021,10 +4108,6 @@
 
   Value* class_id() const { return InputAt(InputCount() - 1); }
 
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    return (idx == (InputCount() - 1)) ? kUntagged : kTagged;
-  }
-
   virtual CompileType ComputeType() const;
 
   virtual bool ComputeCanDeoptimize() const { return false; }
@@ -4037,6 +4120,23 @@
 
   virtual bool HasUnknownSideEffects() const { return true; }
 
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t idx) const {
+    if (type_args_len() > 0) {
+      if (idx == 0) {
+        return kGuardInputs;
+      }
+      idx--;
+    }
+    return interface_target_.is_unboxed_parameter_at(idx) ? kNotSpeculative
+                                                          : kGuardInputs;
+  }
+
+  virtual intptr_t ArgumentsSize() const;
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const;
+
+  virtual Representation representation() const;
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -4469,6 +4569,25 @@
 
   bool IsRecognizedFactory() const { return is_known_list_constructor(); }
 
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t idx) const {
+    if (type_args_len() > 0 || function().IsFactory()) {
+      if (idx == 0) {
+        return kGuardInputs;
+      }
+      idx--;
+    }
+    return function_.is_unboxed_parameter_at(idx) ? kNotSpeculative
+                                                  : kGuardInputs;
+  }
+
+  virtual intptr_t ArgumentsSize() const;
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const;
+
+  virtual intptr_t DeoptimizationTarget() const { return DeoptId::kNone; }
+
+  virtual Representation representation() const;
+
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
@@ -5121,6 +5240,7 @@
  public:
   LoadIndexedInstr(Value* array,
                    Value* index,
+                   bool index_unboxed,
                    intptr_t index_scale,
                    intptr_t class_id,
                    AlignmentType alignment,
@@ -5137,7 +5257,16 @@
     ASSERT(idx == 0 || idx == 1);
     // The array may be tagged or untagged (for external arrays).
     if (idx == 0) return kNoRepresentation;
-    return kTagged;
+
+    if (index_unboxed_) {
+#if defined(TARGET_ARCH_IS_64_BIT)
+      return kUnboxedInt64;
+#else
+      return kUnboxedUint32;
+#endif
+    } else {
+      return kTagged;  // Index is a smi.
+    }
   }
 
   bool IsExternal() const {
@@ -5162,6 +5291,7 @@
   ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
+  const bool index_unboxed_;
   const intptr_t index_scale_;
   const intptr_t class_id_;
   const AlignmentType alignment_;
@@ -5326,6 +5456,7 @@
                     Value* index,
                     Value* value,
                     StoreBarrierType emit_store_barrier,
+                    bool index_unboxed,
                     intptr_t index_scale,
                     intptr_t class_id,
                     AlignmentType alignment,
@@ -5386,6 +5517,7 @@
   }
 
   const StoreBarrierType emit_store_barrier_;
+  const bool index_unboxed_;
   const intptr_t index_scale_;
   const intptr_t class_id_;
   const AlignmentType alignment_;
@@ -6263,6 +6395,10 @@
 
   virtual TokenPosition token_pos() const { return TokenPosition::kBox; }
 
+  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t index) const {
+    return kNotSpeculative;
+  }
+
  protected:
   BoxInstr(Representation from_representation, Value* value)
       : from_representation_(from_representation) {
@@ -6288,10 +6424,6 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  virtual SpeculativeMode SpeculativeModeOfInput(intptr_t index) const {
-    return kNotSpeculative;
-  }
-
   virtual CompileType ComputeType() const;
   virtual bool RecomputeType();
 
@@ -6951,6 +7083,10 @@
                     TemplateDartCall<0>* call)
       : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
     ASSERT(call->type_args_len() == 0);
+    ASSERT(!call->IsInstanceCallBase() ||
+           !call->AsInstanceCallBase()->HasNonSmiAssignableInterface(
+               Thread::Current()->zone()));
+
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
@@ -6990,6 +7126,10 @@
         call_(call),
         is_negated_(false) {
     ASSERT(call->type_args_len() == 0);
+    ASSERT(!call->IsInstanceCallBase() ||
+           !call->AsInstanceCallBase()->HasNonSmiAssignableInterface(
+               Thread::Current()->zone()));
+
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index b3aafaa..e47f315 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -32,21 +32,102 @@
 namespace dart {
 
 // Generic summary for call instructions that have all arguments pushed
-// on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+// on the stack and return the result in a fixed location depending on
+// the return value (R0, Location::Pair(R0, R1) or Q0).
+LocationSummary* Instruction::MakeCallSummary(Zone* zone,
+                                              const Instruction* instr,
+                                              LocationSummary* locs) {
+  ASSERT(locs == nullptr || locs->always_calls());
   LocationSummary* result =
-      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
-  result->set_out(0, Location::RegisterLocation(R0));
+      ((locs == nullptr)
+           ? (new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall))
+           : locs);
+  const auto representation = instr->representation();
+  switch (representation) {
+    case kTagged:
+      result->set_out(
+          0, Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedInt64:
+      result->set_out(
+          0, Location::Pair(
+                 Location::RegisterLocation(CallingConventions::kReturnReg),
+                 Location::RegisterLocation(
+                     CallingConventions::kSecondReturnReg)));
+      break;
+    case kUnboxedDouble:
+      result->set_out(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return result;
 }
 
-DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
-  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ add(out, instr->base_reg(), compiler::Operand(index, LSL, 1));
-  __ ldr(out, compiler::Address(out, instr->offset()));
+LocationSummary* LoadIndexedUnsafeInstr::MakeLocationSummary(Zone* zone,
+                                                             bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = ((representation() == kUnboxedDouble) ? 1 : 0);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
+  locs->set_in(0, Location::RequiresRegister());
+  switch (representation()) {
+    case kTagged:
+      locs->set_out(0, Location::RequiresRegister());
+      break;
+    case kUnboxedInt64:
+      locs->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+      break;
+    case kUnboxedDouble:
+      locs->set_temp(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresFpuRegister());
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return locs;
+}
+
+void LoadIndexedUnsafeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
+
+  const Register index = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kTagged: {
+      const auto out = locs()->out(0).reg();
+      __ add(out, base_reg(), compiler::Operand(index, LSL, 1));
+      __ ldr(out, compiler::Address(out, offset()));
+      break;
+    }
+    case kUnboxedInt64: {
+      const auto out_lo = locs()->out(0).AsPairLocation()->At(0).reg();
+      const auto out_hi = locs()->out(0).AsPairLocation()->At(1).reg();
+
+      __ add(out_hi, base_reg(), compiler::Operand(index, LSL, 1));
+      __ ldr(out_lo, compiler::Address(out_hi, offset()));
+      __ ldr(out_hi,
+             compiler::Address(out_hi, offset() + compiler::target::kWordSize));
+      break;
+    }
+    case kUnboxedDouble: {
+      const auto tmp = locs()->temp(0).reg();
+      const auto out = EvenDRegisterOf(locs()->out(0).fpu_reg());
+      __ add(tmp, base_reg(), compiler::Operand(index, LSL, 1));
+      __ LoadDFromOffset(out, tmp, offset());
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 DEFINE_BACKEND(StoreIndexedUnsafe,
@@ -82,7 +163,14 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, LocationAnyOrConstant(value()));
+  if (representation() == kUnboxedDouble) {
+    locs->set_in(0, Location::RequiresFpuRegister());
+  } else if (representation() == kUnboxedInt64) {
+    locs->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
+  } else {
+    locs->set_in(0, LocationAnyOrConstant(value()));
+  }
   return locs;
 }
 
@@ -137,15 +225,24 @@
       ASSERT(instr != nullptr);
       if (ParallelMoveInstr* parallel_move = instr->AsParallelMove()) {
         for (intptr_t i = 0, n = parallel_move->NumMoves(); i < n; ++i) {
-          if (parallel_move->MoveOperandsAt(i)->src().IsRegister()) {
-            busy |= (1 << parallel_move->MoveOperandsAt(i)->src().reg());
+          const auto src_loc = parallel_move->MoveOperandsAt(i)->src();
+          if (src_loc.IsRegister()) {
+            busy |= (1 << src_loc.reg());
+          } else if (src_loc.IsPairLocation()) {
+            busy |= (1 << src_loc.AsPairLocation()->At(0).reg());
+            busy |= (1 << src_loc.AsPairLocation()->At(1).reg());
           }
         }
       } else {
         ASSERT(instr->IsPushArgument() || (instr->ArgumentCount() > 0));
         for (intptr_t i = 0, n = instr->locs()->input_count(); i < n; ++i) {
-          if (instr->locs()->in(i).IsRegister()) {
-            busy |= (1 << instr->locs()->in(i).reg());
+          const auto in_loc = instr->locs()->in(i);
+          if (in_loc.IsRegister()) {
+            busy |= (1 << in_loc.reg());
+          } else if (in_loc.IsPairLocation()) {
+            const auto pair_location = in_loc.AsPairLocation();
+            busy |= (1 << pair_location->At(0).reg());
+            busy |= (1 << pair_location->At(1).reg());
           }
         }
         if (instr->ArgumentCount() > 0) {
@@ -199,6 +296,12 @@
       const Location value = push_arg->locs()->in(0);
       if (value.IsRegister()) {
         pusher.PushRegister(compiler, value.reg());
+      } else if (value.IsPairLocation()) {
+        pusher.PushRegister(compiler, value.AsPairLocation()->At(1).reg());
+        pusher.PushRegister(compiler, value.AsPairLocation()->At(0).reg());
+      } else if (value.IsFpuRegister()) {
+        pusher.Flush(compiler);
+        __ vstmd(DB_W, SP, EvenDRegisterOf(value.fpu_reg()), 1);
       } else {
         const Register reg = pusher.FindFreeRegister(compiler, push_arg);
         ASSERT(reg != kNoRegister);
@@ -221,7 +324,26 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterLocation(R0));
+  switch (representation()) {
+    case kTagged:
+      locs->set_in(0,
+                   Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedInt64:
+      locs->set_in(
+          0, Location::Pair(
+                 Location::RegisterLocation(CallingConventions::kReturnReg),
+                 Location::RegisterLocation(
+                     CallingConventions::kSecondReturnReg)));
+      break;
+    case kUnboxedDouble:
+      locs->set_in(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return locs;
 }
 
@@ -229,8 +351,19 @@
 // The entry needs to be patchable, no inlined objects are allowed in the area
 // that will be overwritten by the patch instructions: a branch macro sequence.
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register result = locs()->in(0).reg();
-  ASSERT(result == R0);
+  if (locs()->in(0).IsRegister()) {
+    const Register result = locs()->in(0).reg();
+    ASSERT(result == CallingConventions::kReturnReg);
+  } else if (locs()->in(0).IsPairLocation()) {
+    const Register result_lo = locs()->in(0).AsPairLocation()->At(0).reg();
+    const Register result_hi = locs()->in(0).AsPairLocation()->At(1).reg();
+    ASSERT(result_lo == CallingConventions::kReturnReg);
+    ASSERT(result_hi == CallingConventions::kSecondReturnReg);
+  } else {
+    ASSERT(locs()->in(0).IsFpuRegister());
+    const FpuRegister result = locs()->in(0).fpu_reg();
+    ASSERT(result == CallingConventions::kReturnFpuReg);
+  }
 
   if (compiler->intrinsic_mode()) {
     // Intrinsics don't have a frame.
@@ -368,8 +501,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // ClassId
-  summary->set_out(0, Location::RegisterLocation(R0));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
@@ -379,8 +511,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
-  summary->set_out(0, Location::RegisterLocation(R0));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -1464,8 +1595,10 @@
   __ Push(array);
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -1636,23 +1769,24 @@
 
   compiler::Address element_address(kNoRegister);
   if (directly_addressable) {
-    element_address = index.IsRegister()
-                          ? __ ElementAddressForRegIndex(
-                                true,  // Load.
-                                IsExternal(), class_id(), index_scale(), array,
-                                index.reg())
-                          : __ ElementAddressForIntIndex(
-                                true,  // Load.
-                                IsExternal(), class_id(), index_scale(), array,
-                                compiler::target::SmiValue(index.constant()),
-                                IP);  // Temp register.
+    element_address =
+        index.IsRegister()
+            ? __ ElementAddressForRegIndex(true,  // Load.
+                                           IsExternal(), class_id(),
+                                           index_scale(), index_unboxed_, array,
+                                           index.reg())
+            : __ ElementAddressForIntIndex(
+                  true,  // Load.
+                  IsExternal(), class_id(), index_scale(), array,
+                  compiler::target::SmiValue(index.constant()),
+                  IP);  // Temp register.
     // Warning: element_address may use register IP as base.
   } else {
     if (index.IsRegister()) {
       __ LoadElementAddressForRegIndex(address,
                                        true,  // Load.
                                        IsExternal(), class_id(), index_scale(),
-                                       array, index.reg());
+                                       index_unboxed_, array, index.reg());
     } else {
       __ LoadElementAddressForIntIndex(
           address,
@@ -1803,7 +1937,14 @@
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
   if (idx == 0) return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;            // Index is a smi.
+  if (idx == 1) {
+    if (index_unboxed_) {
+      // TODO(dartbug.com/39432): kUnboxedInt32 || kUnboxedUint32.
+      return kNoRepresentation;
+    } else {
+      return kTagged;  // Index is a smi.
+    }
+  }
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1941,7 +2082,7 @@
         index.IsRegister()
             ? __ ElementAddressForRegIndex(false,  // Store.
                                            IsExternal(), class_id(),
-                                           index_scale(), array,
+                                           index_scale(), index_unboxed_, array,
                                            index.reg())
             : __ ElementAddressForIntIndex(
                   false,  // Store.
@@ -1952,7 +2093,7 @@
       __ LoadElementAddressForRegIndex(temp,
                                        false,  // Store.
                                        IsExternal(), class_id(), index_scale(),
-                                       array, index.reg());
+                                       index_unboxed_, array, index.reg());
     } else {
       __ LoadElementAddressForIntIndex(
           temp,
@@ -2447,7 +2588,8 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address = __ ElementAddressForRegIndex(
-      true, IsExternal(), class_id(), index_scale(), str, index.reg());
+      true, IsExternal(), class_id(), index_scale(), /*index_unboxed=*/false,
+      str, index.reg());
   // Warning: element_address may use register IP as base.
 
   if (representation() == kUnboxedInt64) {
@@ -3772,8 +3914,9 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
@@ -3920,8 +4063,9 @@
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
@@ -5901,8 +6045,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 8cdadfc..4486d3c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -30,21 +30,84 @@
 namespace dart {
 
 // Generic summary for call instructions that have all arguments pushed
-// on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+// on the stack and return the result in a fixed register R0 (or V0 if
+// the return type is double).
+LocationSummary* Instruction::MakeCallSummary(Zone* zone,
+                                              const Instruction* instr,
+                                              LocationSummary* locs) {
+  ASSERT(locs == nullptr || locs->always_calls());
   LocationSummary* result =
-      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
-  result->set_out(0, Location::RegisterLocation(R0));
+      ((locs == nullptr)
+           ? (new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall))
+           : locs);
+  const auto representation = instr->representation();
+  switch (representation) {
+    case kTagged:
+    case kUnboxedInt64:
+      result->set_out(
+          0, Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedDouble:
+      result->set_out(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return result;
 }
 
-DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
-  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ add(out, instr->base_reg(), compiler::Operand(index, LSL, 2));
-  __ ldr(out, compiler::Address(out, instr->offset()));
+LocationSummary* LoadIndexedUnsafeInstr::MakeLocationSummary(Zone* zone,
+                                                             bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = ((representation() == kUnboxedDouble) ? 1 : 0);
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
+  locs->set_in(0, Location::RequiresRegister());
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64:
+      locs->set_out(0, Location::RequiresRegister());
+      break;
+    case kUnboxedDouble:
+      locs->set_temp(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresFpuRegister());
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return locs;
+}
+
+void LoadIndexedUnsafeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
+
+  const Register index = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64: {
+      const auto out = locs()->out(0).reg();
+      __ add(out, base_reg(), compiler::Operand(index, LSL, 2));
+      __ ldr(out, compiler::Address(out, offset()));
+      break;
+    }
+    case kUnboxedDouble: {
+      const auto tmp = locs()->temp(0).reg();
+      const auto out = locs()->out(0).fpu_reg();
+      __ add(tmp, base_reg(), compiler::Operand(index, LSL, 2));
+      __ LoadDFromOffset(out, tmp, offset());
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 DEFINE_BACKEND(StoreIndexedUnsafe,
@@ -80,7 +143,13 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, LocationAnyOrConstant(value()));
+  if (representation() == kUnboxedDouble) {
+    locs->set_in(0, Location::RequiresFpuRegister());
+  } else if (representation() == kUnboxedInt64) {
+    locs->set_in(0, Location::RequiresRegister());
+  } else {
+    locs->set_in(0, LocationAnyOrConstant(value()));
+  }
   return locs;
 }
 
@@ -145,6 +214,10 @@
           reg = pusher.GetFreeTempRegister();
           __ LoadObject(reg, value.constant());
         }
+      } else if (value.IsFpuRegister()) {
+        pusher.Flush(compiler);
+        __ PushDouble(value.fpu_reg());
+        continue;
       } else {
         ASSERT(value.IsStackSlot());
         const intptr_t value_offset = value.ToStackSlotOffset();
@@ -162,7 +235,20 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterLocation(R0));
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64:
+      locs->set_in(0,
+                   Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedDouble:
+      locs->set_in(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return locs;
 }
 
@@ -170,8 +256,14 @@
 // The entry needs to be patchable, no inlined objects are allowed in the area
 // that will be overwritten by the patch instructions: a branch macro sequence.
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register result = locs()->in(0).reg();
-  ASSERT(result == R0);
+  if (locs()->in(0).IsRegister()) {
+    const Register result = locs()->in(0).reg();
+    ASSERT(result == CallingConventions::kReturnReg);
+  } else {
+    ASSERT(locs()->in(0).IsFpuRegister());
+    const FpuRegister result = locs()->in(0).fpu_reg();
+    ASSERT(result == CallingConventions::kReturnFpuReg);
+  }
 
   if (compiler->intrinsic_mode()) {
     // Intrinsics don't have a frame.
@@ -306,8 +398,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // ClassId
-  summary->set_out(0, Location::RegisterLocation(R0));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
@@ -317,8 +408,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
-  summary->set_out(0, Location::RegisterLocation(R0));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -1325,8 +1415,10 @@
   __ Push(array);
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -1441,13 +1533,13 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address(TMP);  // Bad address.
-  element_address =
-      index.IsRegister()
-          ? __ ElementAddressForRegIndex(IsExternal(), class_id(),
-                                         index_scale(), array, index.reg(), TMP)
-          : __ ElementAddressForIntIndex(IsExternal(), class_id(),
-                                         index_scale(), array,
-                                         Smi::Cast(index.constant()).Value());
+  element_address = index.IsRegister()
+                        ? __ ElementAddressForRegIndex(
+                              IsExternal(), class_id(), index_scale(),
+                              index_unboxed_, array, index.reg(), TMP)
+                        : __ ElementAddressForIntIndex(
+                              IsExternal(), class_id(), index_scale(), array,
+                              Smi::Cast(index.constant()).Value());
   if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4) ||
@@ -1576,7 +1668,8 @@
   }
   // Warning: element_address may use register TMP as base.
   compiler::Address element_address = __ ElementAddressForRegIndexWithSize(
-      IsExternal(), class_id(), sz, index_scale(), str, index.reg(), TMP);
+      IsExternal(), class_id(), sz, index_scale(), /*index_unboxed=*/false, str,
+      index.reg(), TMP);
   __ ldr(result, element_address, sz);
 
   __ SmiTag(result);
@@ -1586,7 +1679,13 @@
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
   if (idx == 0) return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;            // Index is a smi.
+  if (idx == 1) {
+    if (index_unboxed_) {
+      return kNoRepresentation;  // Index can be any unboxed representation.
+    } else {
+      return kTagged;  // Index is a smi.
+    }
+  }
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1687,7 +1786,8 @@
   if (class_id() == kArrayCid && ShouldEmitStoreBarrier()) {
     if (index.IsRegister()) {
       __ ComputeElementAddressForRegIndex(temp, IsExternal(), class_id(),
-                                          index_scale(), array, index.reg());
+                                          index_scale(), index_unboxed_, array,
+                                          index.reg());
     } else {
       __ ComputeElementAddressForIntIndex(temp, IsExternal(), class_id(),
                                           index_scale(), array,
@@ -1699,14 +1799,13 @@
     return;
   }
 
-  element_address =
-      index.IsRegister()
-          ? __ ElementAddressForRegIndex(IsExternal(), class_id(),
-                                         index_scale(), array,
-                                         index.reg(), temp)
-          : __ ElementAddressForIntIndex(IsExternal(), class_id(),
-                                         index_scale(), array,
-                                         Smi::Cast(index.constant()).Value());
+  element_address = index.IsRegister()
+                        ? __ ElementAddressForRegIndex(
+                              IsExternal(), class_id(), index_scale(),
+                              index_unboxed_, array, index.reg(), temp)
+                        : __ ElementAddressForIntIndex(
+                              IsExternal(), class_id(), index_scale(), array,
+                              Smi::Cast(index.constant()).Value());
 
   switch (class_id()) {
     case kArrayCid:
@@ -3288,8 +3387,9 @@
     }
     __ PushPair(locs->in(1).reg(), locs->in(0).reg());
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
@@ -3435,8 +3535,9 @@
     }
     __ PushPair(locs->in(1).reg(), locs->in(0).reg());
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
@@ -4962,8 +5063,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -6317,9 +6420,7 @@
     }
   } else if (to() == kUnboxedInt64) {
     if (from() == kUnboxedUint32) {
-      if (out != value) {
-        __ mov(out, value);
-      }
+      __ uxtw(out, value);
     } else {
       ASSERT(from() == kUnboxedInt32);
       __ sxtw(out, value);  // Signed extension 32->64.
diff --git a/runtime/vm/compiler/backend/il_deserializer.cc b/runtime/vm/compiler/backend/il_deserializer.cc
index 9fd98ac..9901da4 100644
--- a/runtime/vm/compiler/backend/il_deserializer.cc
+++ b/runtime/vm/compiler/backend/il_deserializer.cc
@@ -222,8 +222,20 @@
        block_it.Advance()) {
     auto const entry = block_it.Current();
     if (!IsHandledInstruction(entry)) unhandled->Add(entry);
-    // Don't check the Phi definitions in JoinEntrys, as those are now handled
-    // and also parsed differently from other definitions.
+    // Check that the Phi instructions in JoinEntrys do not have pair
+    // representation.
+    if (auto const join_block = entry->AsJoinEntry()) {
+      auto const phis = join_block->phis();
+      auto const length = ((phis == nullptr) ? 0 : phis->length());
+      for (intptr_t i = 0; i < length; i++) {
+        auto const current = phis->At(i);
+        for (intptr_t j = 0; j < current->InputCount(); j++) {
+          if (current->InputAt(j)->definition()->HasPairRepresentation()) {
+            unhandled->Add(current);
+          }
+        }
+      }
+    }
     if (auto const def_block = entry->AsBlockEntryWithInitialDefs()) {
       auto const defs = def_block->initial_definitions();
       for (intptr_t i = 0; i < defs->length(); i++) {
@@ -1134,7 +1146,19 @@
     const InstrInfo& info) {
   ASSERT(current_block_ != nullptr);
   if (auto const index_sexp = CheckInteger(Retrieve(sexp, 1))) {
-    return new (zone()) ParameterInstr(index_sexp->value(), current_block_);
+    const auto param_offset_sexp =
+        CheckInteger(sexp->ExtraLookupValue("param_offset"));
+    ASSERT(param_offset_sexp != nullptr);
+    const auto representation_sexp =
+        CheckSymbol(sexp->ExtraLookupValue("representation"));
+    Representation representation;
+    if (!Location::ParseRepresentation(representation_sexp->value(),
+                                       &representation)) {
+      StoreError(representation_sexp, "unknown parameter representation");
+    }
+    return new (zone())
+        ParameterInstr(index_sexp->value(), param_offset_sexp->value(),
+                       current_block_, representation);
   }
   return nullptr;
 }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 80796f1..d9c0348b 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -31,7 +31,11 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
-LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+LocationSummary* Instruction::MakeCallSummary(Zone* zone,
+                                              const Instruction* instr,
+                                              LocationSummary* locs) {
+  // This is unused on ia32.
+  ASSERT(locs == nullptr);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
   LocationSummary* result = new (zone)
@@ -42,6 +46,7 @@
 
 DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
   ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
+  ASSERT(instr->representation() == kTagged);
   __ movl(out, compiler::Address(instr->base_reg(), index, TIMES_2,
                                  instr->offset()));
 
@@ -76,6 +81,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  ASSERT(representation() == kTagged);
   locs->set_in(0, LocationAnyOrConstant(value()));
   return locs;
 }
@@ -101,6 +107,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  ASSERT(representation() == kTagged);
   locs->set_in(0, Location::RegisterLocation(EAX));
   return locs;
 }
@@ -1176,8 +1183,10 @@
   __ pushl(array);
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -1283,14 +1292,14 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address =
-      index.IsRegister()
-          ? compiler::Assembler::ElementAddressForRegIndex(
-                IsExternal(), class_id(), index_scale(), array, index.reg())
-          : compiler::Assembler::ElementAddressForIntIndex(
-                IsExternal(), class_id(), index_scale(), array,
-                Smi::Cast(index.constant()).Value());
+      index.IsRegister() ? compiler::Assembler::ElementAddressForRegIndex(
+                               IsExternal(), class_id(), index_scale(),
+                               index_unboxed_, array, index.reg())
+                         : compiler::Assembler::ElementAddressForIntIndex(
+                               IsExternal(), class_id(), index_scale(), array,
+                               Smi::Cast(index.constant()).Value());
 
-  if (index_scale() == 1) {
+  if (index_scale() == 1 && !index_unboxed_) {
     if (index.IsRegister()) {
       __ SmiUntag(index.reg());
     } else {
@@ -1347,8 +1356,8 @@
       element_address =
           index.IsRegister()
               ? compiler::Assembler::ElementAddressForRegIndex(
-                    IsExternal(), class_id(), index_scale(), array, index.reg(),
-                    kWordSize)
+                    IsExternal(), class_id(), index_scale(), index_unboxed_,
+                    array, index.reg(), kWordSize)
               : compiler::Assembler::ElementAddressForIntIndex(
                     IsExternal(), class_id(), index_scale(), array,
                     Smi::Cast(index.constant()).Value(), kWordSize);
@@ -1402,7 +1411,14 @@
     intptr_t idx) const {
   // Array can be a Dart object or a pointer to external data.
   if (idx == 0) return kNoRepresentation;  // Flexible input representation.
-  if (idx == 1) return kTagged;            // Index is a smi.
+  if (idx == 1) {
+    if (index_unboxed_) {
+      // TODO(dartbug.com/39432): kUnboxedInt32 || kUnboxedUint32.
+      return kNoRepresentation;
+    } else {
+      return kTagged;  // Index is a smi.
+    }
+  }
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1512,14 +1528,14 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address =
-      index.IsRegister()
-          ? compiler::Assembler::ElementAddressForRegIndex(
-                IsExternal(), class_id(), index_scale(), array, index.reg())
-          : compiler::Assembler::ElementAddressForIntIndex(
-                IsExternal(), class_id(), index_scale(), array,
-                Smi::Cast(index.constant()).Value());
+      index.IsRegister() ? compiler::Assembler::ElementAddressForRegIndex(
+                               IsExternal(), class_id(), index_scale(),
+                               index_unboxed_, array, index.reg())
+                         : compiler::Assembler::ElementAddressForIntIndex(
+                               IsExternal(), class_id(), index_scale(), array,
+                               Smi::Cast(index.constant()).Value());
 
-  if ((index_scale() == 1) && index.IsRegister()) {
+  if ((index_scale() == 1) && index.IsRegister() && !index_unboxed_) {
     __ SmiUntag(index.reg());
   }
   switch (class_id()) {
@@ -1602,8 +1618,8 @@
       element_address =
           index.IsRegister()
               ? compiler::Assembler::ElementAddressForRegIndex(
-                    IsExternal(), class_id(), index_scale(), array, index.reg(),
-                    kWordSize)
+                    IsExternal(), class_id(), index_scale(), index_unboxed_,
+                    array, index.reg(), kWordSize)
               : compiler::Assembler::ElementAddressForIntIndex(
                     IsExternal(), class_id(), index_scale(), array,
                     Smi::Cast(index.constant()).Value(), kWordSize);
@@ -4000,7 +4016,8 @@
 
   compiler::Address element_address =
       compiler::Assembler::ElementAddressForRegIndex(
-          IsExternal(), class_id(), index_scale(), str, index.reg());
+          IsExternal(), class_id(), index_scale(), /*index_unboxed=*/false, str,
+          index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -4890,8 +4907,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index 45b7a03..f2e5cf9 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -931,6 +931,9 @@
 void ParameterInstr::AddOperandsToSExpression(SExpList* sexp,
                                               FlowGraphSerializer* s) const {
   s->AddInteger(sexp, index());
+  s->AddExtraInteger(sexp, "param_offset", param_offset());
+  s->AddExtraSymbol(sexp, "representation",
+                    Location::RepresentationToCString(representation()));
 }
 
 void SpecialParameterInstr::AddOperandsToSExpression(
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 5625a0c..c031db4 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -30,21 +30,80 @@
 namespace dart {
 
 // Generic summary for call instructions that have all arguments pushed
-// on the stack and return the result in a fixed register RAX.
-LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
+// on the stack and return the result in a fixed register RAX (or XMM0 if
+// the return type is double).
+LocationSummary* Instruction::MakeCallSummary(Zone* zone,
+                                              const Instruction* instr,
+                                              LocationSummary* locs) {
+  ASSERT(locs == nullptr || locs->always_calls());
   LocationSummary* result =
-      new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
-  result->set_out(0, Location::RegisterLocation(RAX));
+      ((locs == nullptr)
+           ? (new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall))
+           : locs);
+  const auto representation = instr->representation();
+  switch (representation) {
+    case kTagged:
+    case kUnboxedInt64:
+      result->set_out(
+          0, Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedDouble:
+      result->set_out(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return result;
 }
 
-DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
-  ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ movq(out, compiler::Address(instr->base_reg(), index, TIMES_4,
-                                 instr->offset()));
+LocationSummary* LoadIndexedUnsafeInstr::MakeLocationSummary(Zone* zone,
+                                                             bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
+  locs->set_in(0, Location::RequiresRegister());
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64:
+      locs->set_out(0, Location::RequiresRegister());
+      break;
+    case kUnboxedDouble:
+      locs->set_out(0, Location::RequiresFpuRegister());
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return locs;
+}
+
+void LoadIndexedUnsafeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
+
+  const Register index = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64: {
+      const auto out = locs()->out(0).reg();
+      __ movq(out, compiler::Address(base_reg(), index, TIMES_4, offset()));
+      break;
+    }
+    case kUnboxedDouble: {
+      const auto out = locs()->out(0).fpu_reg();
+      __ movsd(out, compiler::Address(base_reg(), index, TIMES_4, offset()));
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 DEFINE_BACKEND(StoreIndexedUnsafe,
@@ -76,7 +135,13 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, LocationAnyOrConstant(value()));
+  if (representation() == kUnboxedDouble) {
+    locs->set_in(0, Location::RequiresFpuRegister());
+  } else if (representation() == kUnboxedInt64) {
+    locs->set_in(0, Location::RequiresRegister());
+  } else {
+    locs->set_in(0, LocationAnyOrConstant(value()));
+  }
   return locs;
 }
 
@@ -89,6 +154,9 @@
       __ pushq(value.reg());
     } else if (value.IsConstant()) {
       __ PushObject(value.constant());
+    } else if (value.IsFpuRegister()) {
+      __ AddImmediate(RSP, compiler::Immediate(-kDoubleSize));
+      __ movsd(compiler::Address(RSP, 0), value.fpu_reg());
     } else {
       ASSERT(value.IsStackSlot());
       __ pushq(LocationToStackSlotAddress(value));
@@ -101,7 +169,20 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterLocation(RAX));
+  switch (representation()) {
+    case kTagged:
+    case kUnboxedInt64:
+      locs->set_in(0,
+                   Location::RegisterLocation(CallingConventions::kReturnReg));
+      break;
+    case kUnboxedDouble:
+      locs->set_in(
+          0, Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg));
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
   return locs;
 }
 
@@ -109,8 +190,14 @@
 // The entry needs to be patchable, no inlined objects are allowed in the area
 // that will be overwritten by the patch instruction: a jump).
 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register result = locs()->in(0).reg();
-  ASSERT(result == RAX);
+  if (locs()->in(0).IsRegister()) {
+    const Register result = locs()->in(0).reg();
+    ASSERT(result == CallingConventions::kReturnReg);
+  } else {
+    ASSERT(locs()->in(0).IsFpuRegister());
+    const FpuRegister result = locs()->in(0).fpu_reg();
+    ASSERT(result == CallingConventions::kReturnFpuReg);
+  }
 
   if (compiler->intrinsic_mode()) {
     // Intrinsics don't have a frame.
@@ -1240,8 +1327,10 @@
   __ pushq(array);
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), token_pos(), CallFunction(),
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -1398,14 +1487,14 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address =
-      index.IsRegister()
-          ? compiler::Assembler::ElementAddressForRegIndex(
-                IsExternal(), class_id(), index_scale(), array, index.reg())
-          : compiler::Assembler::ElementAddressForIntIndex(
-                IsExternal(), class_id(), index_scale(), array,
-                Smi::Cast(index.constant()).Value());
+      index.IsRegister() ? compiler::Assembler::ElementAddressForRegIndex(
+                               IsExternal(), class_id(), index_scale(),
+                               index_unboxed_, array, index.reg())
+                         : compiler::Assembler::ElementAddressForIntIndex(
+                               IsExternal(), class_id(), index_scale(), array,
+                               Smi::Cast(index.constant()).Value());
 
-  if (index_scale() == 1) {
+  if (index_scale() == 1 && !index_unboxed_) {
     if (index.IsRegister()) {
       __ SmiUntag(index.reg());
     } else {
@@ -1500,7 +1589,8 @@
 
   compiler::Address element_address =
       compiler::Assembler::ElementAddressForRegIndex(
-          IsExternal(), class_id(), index_scale(), str, index.reg());
+          IsExternal(), class_id(), index_scale(), /*index_unboxed=*/false, str,
+          index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -1547,7 +1637,13 @@
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   if (idx == 0) return kNoRepresentation;
-  if (idx == 1) return kTagged;
+  if (idx == 1) {
+    if (index_unboxed_) {
+      return kUnboxedInt64;
+    } else {
+      return kTagged;  // Index is a smi.
+    }
+  }
   ASSERT(idx == 2);
   switch (class_id_) {
     case kArrayCid:
@@ -1658,14 +1754,14 @@
   const Location index = locs()->in(1);
 
   compiler::Address element_address =
-      index.IsRegister()
-          ? compiler::Assembler::ElementAddressForRegIndex(
-                IsExternal(), class_id(), index_scale(), array, index.reg())
-          : compiler::Assembler::ElementAddressForIntIndex(
-                IsExternal(), class_id(), index_scale(), array,
-                Smi::Cast(index.constant()).Value());
+      index.IsRegister() ? compiler::Assembler::ElementAddressForRegIndex(
+                               IsExternal(), class_id(), index_scale(),
+                               index_unboxed_, array, index.reg())
+                         : compiler::Assembler::ElementAddressForIntIndex(
+                               IsExternal(), class_id(), index_scale(), array,
+                               Smi::Cast(index.constant()).Value());
 
-  if ((index_scale() == 1) && index.IsRegister()) {
+  if ((index_scale() == 1) && index.IsRegister() && !index_unboxed_) {
     __ SmiUntag(index.reg());
   }
   switch (class_id()) {
@@ -3293,8 +3389,9 @@
     __ pushq(locs->in(0).reg());
     __ pushq(locs->in(1).reg());
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
@@ -3466,8 +3563,9 @@
     __ pushq(locs->in(1).reg());
 
     const auto& selector = String::Handle(instruction()->call()->Selector());
-    const auto& arguments_descriptor = Array::Handle(
-        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+    const auto& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::NewBoxed(
+            /*type_args_len=*/0, /*num_arguments=*/2));
 
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
@@ -5055,8 +5153,10 @@
   const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0));
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
+  constexpr int kSizeOfArguments = 1;
   const Array& kNoArgumentNames = Object::null_array();
-  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kNoArgumentNames);
+  ArgumentsInfo args_info(kTypeArgsLen, kNumberOfArguments, kSizeOfArguments,
+                          kNoArgumentNames);
   compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), target,
                                args_info, locs(), ICData::Handle(),
                                ICData::kStatic);
@@ -6739,8 +6839,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RCX));  // ClassId
-  summary->set_out(0, Location::RegisterLocation(RAX));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
@@ -6750,8 +6849,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Function.
-  summary->set_out(0, Location::RegisterLocation(RAX));
-  return summary;
+  return MakeCallSummary(zone, this, summary);
 }
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 77a65b7..139e73d 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -659,6 +659,9 @@
       RedefinitionInstr* redefinition =
           new (zone) RedefinitionInstr(actual->Copy(zone));
       redefinition->set_ssa_temp_index(caller_graph->alloc_ssa_temp_index());
+      if (FlowGraph::NeedsPairLocation(redefinition->representation())) {
+        caller_graph->alloc_ssa_temp_index();
+      }
       if (target_info->IsSingleCid()) {
         redefinition->UpdateType(CompileType::FromCid(target_info->cid_start));
       }
@@ -707,6 +710,9 @@
               Slot::Closure_context(), call_data->call->token_pos());
           context_load->set_ssa_temp_index(
               caller_graph->alloc_ssa_temp_index());
+          if (FlowGraph::NeedsPairLocation(context_load->representation())) {
+            caller_graph->alloc_ssa_temp_index();
+          }
           context_load->InsertBefore(callee_entry->next());
           param->ReplaceUsesWith(context_load);
           break;
@@ -875,7 +881,8 @@
     if (constant != NULL) {
       return new (Z) ConstantInstr(constant->value());
     } else {
-      ParameterInstr* param = new (Z) ParameterInstr(i, graph->graph_entry());
+      ParameterInstr* param = new (Z)
+          ParameterInstr(i, -1, graph->graph_entry(), kNoRepresentation);
       param->UpdateType(*argument->Type());
       return param;
     }
@@ -1799,6 +1806,9 @@
       new (Z) RedefinitionInstr(new (Z) Value(receiver));
   redefinition->set_ssa_temp_index(
       owner_->caller_graph()->alloc_ssa_temp_index());
+  if (FlowGraph::NeedsPairLocation(redefinition->representation())) {
+    owner_->caller_graph()->alloc_ssa_temp_index();
+  }
   if (FlowGraphInliner::TryInlineRecognizedMethod(
           owner_->caller_graph(), receiver_cid, target, call_, redefinition,
           call_->token_pos(), call_->ic_data(), graph_entry, &entry, &last,
@@ -2060,6 +2070,9 @@
                                                call_->complete());
     fallback_call->set_ssa_temp_index(
         owner_->caller_graph()->alloc_ssa_temp_index());
+    if (FlowGraph::NeedsPairLocation(fallback_call->representation())) {
+      owner_->caller_graph()->alloc_ssa_temp_index();
+    }
     fallback_call->InheritDeoptTarget(zone(), call_);
     fallback_call->set_total_call_count(call_->CallCount());
     ReturnInstr* fallback_return = new ReturnInstr(
@@ -2453,8 +2466,9 @@
   // Array load and return.
   intptr_t index_scale = compiler::target::Instance::ElementSizeFor(array_cid);
   LoadIndexedInstr* load = new (Z) LoadIndexedInstr(
-      new (Z) Value(array), new (Z) Value(index), index_scale, array_cid,
-      kAlignedAccess, deopt_id, call->token_pos(), ResultType(call));
+      new (Z) Value(array), new (Z) Value(index), /*index_unboxed=*/false,
+      index_scale, array_cid, kAlignedAccess, deopt_id, call->token_pos(),
+      ResultType(call));
 
   *last = load;
   cursor = flow_graph->AppendTo(cursor, load,
@@ -2675,8 +2689,8 @@
       compiler::target::Instance::ElementSizeFor(array_cid);
   *last = new (Z) StoreIndexedInstr(
       new (Z) Value(array), new (Z) Value(index), new (Z) Value(stored_value),
-      needs_store_barrier, index_scale, array_cid, kAlignedAccess,
-      call->deopt_id(), call->token_pos());
+      needs_store_barrier, /*index_unboxed=*/false, index_scale, array_cid,
+      kAlignedAccess, call->deopt_id(), call->token_pos());
   flow_graph->AppendTo(cursor, *last, call->env(), FlowGraph::kEffect);
   // We need a return value to replace uses of the original definition. However,
   // the final instruction is a use of 'void operator[]=()', so we use null.
@@ -2940,11 +2954,10 @@
 
   // Fill out the generated template with loads.
   // Load from either external or internal.
-  LoadIndexedInstr* load =
-      new (Z) LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index),
-                               1,  // Index scale
-                               view_cid, kUnalignedAccess, DeoptId::kNone,
-                               call->token_pos(), ResultType(call));
+  LoadIndexedInstr* load = new (Z) LoadIndexedInstr(
+      new (Z) Value(array), new (Z) Value(index),
+      /*index_unboxed=*/false, /*index_scale=*/1, view_cid, kUnalignedAccess,
+      DeoptId::kNone, call->token_pos(), ResultType(call));
   flow_graph->AppendTo(
       cursor, load, call->deopt_id() != DeoptId::kNone ? call->env() : nullptr,
       FlowGraph::kValue);
@@ -2967,8 +2980,9 @@
                                    intptr_t view_cid) {
   return new (Z) StoreIndexedInstr(
       new (Z) Value(array), new (Z) Value(index), new (Z) Value(stored_value),
-      kNoStoreBarrier, 1,  // Index scale
-      view_cid, kUnalignedAccess, call->deopt_id(), call->token_pos());
+      kNoStoreBarrier, /*index_unboxed=*/false,
+      /*index_scale=*/1, view_cid, kUnalignedAccess, call->deopt_id(),
+      call->token_pos());
 }
 
 static bool InlineByteArrayBaseStore(FlowGraph* flow_graph,
@@ -3215,10 +3229,10 @@
     cursor = flow_graph->AppendTo(cursor, str, NULL, FlowGraph::kValue);
   }
 
-  LoadIndexedInstr* load_indexed = new (Z)
-      LoadIndexedInstr(new (Z) Value(str), new (Z) Value(index),
-                       compiler::target::Instance::ElementSizeFor(cid), cid,
-                       kAlignedAccess, DeoptId::kNone, call->token_pos());
+  LoadIndexedInstr* load_indexed = new (Z) LoadIndexedInstr(
+      new (Z) Value(str), new (Z) Value(index), /*index_unboxed=*/false,
+      compiler::target::Instance::ElementSizeFor(cid), cid, kAlignedAccess,
+      DeoptId::kNone, call->token_pos());
   cursor = flow_graph->AppendTo(cursor, load_indexed, NULL, FlowGraph::kValue);
 
   auto box = BoxInstr::Create(kUnboxedIntPtr, new Value(load_indexed));
@@ -4231,12 +4245,11 @@
       value->AsUnboxInteger()->mark_truncating();
       flow_graph->AppendTo(*entry, value, env, FlowGraph::kValue);
 
-      *last =
-          new (Z) StoreIndexedInstr(new (Z) Value(str), new (Z) Value(index),
-                                    new (Z) Value(value), kNoStoreBarrier,
-                                    1,  // Index scale
-                                    kOneByteStringCid, kAlignedAccess,
-                                    call->deopt_id(), call->token_pos());
+      *last = new (Z) StoreIndexedInstr(
+          new (Z) Value(str), new (Z) Value(index), new (Z) Value(value),
+          kNoStoreBarrier, /*index_unboxed=*/false,
+          /*index_scale=*/1, kOneByteStringCid, kAlignedAccess,
+          call->deopt_id(), call->token_pos());
       flow_graph->AppendTo(value, *last, env, FlowGraph::kEffect);
 
       // We need a return value to replace uses of the original definition.
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index 7635384..402954d 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -617,7 +617,15 @@
       auto& initial_definitions = *entry->initial_definitions();
       for (intptr_t i = 0; i < initial_definitions.length(); i++) {
         Definition* defn = initial_definitions[i];
-        ASSERT(!defn->HasPairRepresentation());
+        if (defn->HasPairRepresentation()) {
+          // The lower bits are pushed after the higher bits
+          LiveRange* range =
+              GetLiveRange(ToSecondPairVreg(defn->ssa_temp_index()));
+          range->AddUseInterval(entry->start_pos(), entry->start_pos() + 2);
+          range->DefineAt(entry->start_pos());
+          ProcessInitialDefinition(defn, range, entry,
+                                   /*second_location_for_definition=*/true);
+        }
         LiveRange* range = GetLiveRange(defn->ssa_temp_index());
         range->AddUseInterval(entry->start_pos(), entry->start_pos() + 2);
         range->DefineAt(entry->start_pos());
@@ -647,9 +655,11 @@
   }
 }
 
-void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn,
-                                                  LiveRange* range,
-                                                  BlockEntryInstr* block) {
+void FlowGraphAllocator::ProcessInitialDefinition(
+    Definition* defn,
+    LiveRange* range,
+    BlockEntryInstr* block,
+    bool second_location_for_definition) {
   // Save the range end because it may change below.
   const intptr_t range_end = range->End();
 
@@ -687,17 +697,24 @@
   }
 
   if (defn->IsParameter()) {
+    // Only function entries may have unboxed parameters, possibly making the
+    // parameters size different from the number of parameters on 32-bit
+    // architectures.
+    const intptr_t parameters_size = block->IsFunctionEntry()
+                                         ? flow_graph_.direct_parameters_size()
+                                         : flow_graph_.num_direct_parameters();
     ParameterInstr* param = defn->AsParameter();
-    intptr_t slot_index = param->index();
+    intptr_t slot_index =
+        param->param_offset() + (second_location_for_definition ? -1 : 0);
     ASSERT(slot_index >= 0);
     if (param->base_reg() == FPREG) {
       // Slot index for the rightmost fixed parameter is -1.
-      slot_index -= flow_graph_.num_direct_parameters();
+      slot_index -= parameters_size;
     } else {
       // Slot index for a "frameless" parameter is reversed.
       ASSERT(param->base_reg() == SPREG);
-      ASSERT(slot_index < flow_graph_.num_direct_parameters());
-      slot_index = flow_graph_.num_direct_parameters() - 1 - slot_index;
+      ASSERT(slot_index < parameters_size);
+      slot_index = parameters_size - 1 - slot_index;
     }
 
     if (param->base_reg() == FPREG) {
@@ -707,9 +724,19 @@
       ASSERT(param->base_reg() == SPREG);
       slot_index += compiler::target::frame_layout.last_param_from_entry_sp;
     }
-    range->set_assigned_location(
-        Location::StackSlot(slot_index, param->base_reg()));
-    range->set_spill_slot(Location::StackSlot(slot_index, param->base_reg()));
+
+    if (param->representation() == kUnboxedInt64 ||
+        param->representation() == kTagged) {
+      const auto location = Location::StackSlot(slot_index, param->base_reg());
+      range->set_assigned_location(location);
+      range->set_spill_slot(location);
+    } else {
+      ASSERT(param->representation() == kUnboxedDouble);
+      const auto location =
+          Location::DoubleStackSlot(slot_index, param->base_reg());
+      range->set_assigned_location(location);
+      range->set_spill_slot(location);
+    }
   } else if (defn->IsSpecialParameter()) {
     SpecialParameterInstr* param = defn->AsSpecialParameter();
     ASSERT(param->kind() == SpecialParameterInstr::kArgDescriptor);
@@ -738,8 +765,7 @@
       range->finger()->FirstRegisterBeneficialUse(block->start_pos());
   if (use != NULL) {
     LiveRange* tail = SplitBetween(range, block->start_pos(), use->pos());
-    // Parameters and constants are tagged, so allocated to CPU registers.
-    CompleteRange(tail, Location::kRegister);
+    CompleteRange(tail, defn->RegisterKindForResult());
   }
   ConvertAllUses(range);
   Location spill_slot = range->spill_slot();
@@ -2854,9 +2880,12 @@
       initial_definitions = entry->initial_definitions();
       for (intptr_t i = 0; i < initial_definitions->length(); ++i) {
         Definition* def = (*initial_definitions)[i];
-        ASSERT(!def->HasPairRepresentation());
         value_representations_[def->ssa_temp_index()] =
             RepresentationForRange(def->representation());
+        if (def->HasPairRepresentation()) {
+          value_representations_[ToSecondPairVreg(def->ssa_temp_index())] =
+              RepresentationForRange(def->representation());
+        }
       }
     } else if (auto join = block->AsJoinEntry()) {
       for (PhiIterator it(join); !it.Done(); it.Advance()) {
diff --git a/runtime/vm/compiler/backend/linearscan.h b/runtime/vm/compiler/backend/linearscan.h
index 8b774cc..541bd2c 100644
--- a/runtime/vm/compiler/backend/linearscan.h
+++ b/runtime/vm/compiler/backend/linearscan.h
@@ -128,7 +128,8 @@
 
   void ProcessInitialDefinition(Definition* defn,
                                 LiveRange* range,
-                                BlockEntryInstr* block);
+                                BlockEntryInstr* block,
+                                bool second_location_for_definition = false);
   void ConnectIncomingPhiMoves(JoinEntryInstr* join);
   void BlockLocation(Location loc, intptr_t from, intptr_t to);
   void BlockRegisterLocation(Location loc,
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 6cc94cf..2153fac 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -13,6 +13,31 @@
 
 namespace dart {
 
+const char* Location::RepresentationToCString(Representation repr) {
+  switch (repr) {
+#define REPR_CASE(Name)                                                        \
+  case k##Name:                                                                \
+    return #Name;
+    FOR_EACH_REPRESENTATION_KIND(REPR_CASE)
+#undef KIND_CASE
+    default:
+      UNREACHABLE();
+  }
+  return nullptr;
+}
+
+bool Location::ParseRepresentation(const char* str, Representation* out) {
+  ASSERT(str != nullptr && out != nullptr);
+#define KIND_CASE(Name)                                                        \
+  if (strcmp(str, #Name) == 0) {                                               \
+    *out = k##Name;                                                            \
+    return true;                                                               \
+  }
+  FOR_EACH_REPRESENTATION_KIND(KIND_CASE)
+#undef KIND_CASE
+  return false;
+}
+
 intptr_t RegisterSet::RegisterCount(intptr_t registers) {
   // Brian Kernighan's algorithm for counting the bits set.
   intptr_t count = 0;
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index da9cc2b..117092a 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -20,20 +20,25 @@
 class PairLocation;
 class Value;
 
+#define FOR_EACH_REPRESENTATION_KIND(M)                                        \
+  M(NoRepresentation)                                                          \
+  M(Tagged)                                                                    \
+  M(Untagged)                                                                  \
+  M(UnboxedDouble)                                                             \
+  M(UnboxedFloat)                                                              \
+  M(UnboxedInt32)                                                              \
+  M(UnboxedUint32)                                                             \
+  M(UnboxedInt64)                                                              \
+  M(UnboxedFloat32x4)                                                          \
+  M(UnboxedInt32x4)                                                            \
+  M(UnboxedFloat64x2)                                                          \
+  M(PairOfTagged)
+
 enum Representation {
-  kNoRepresentation,
-  kTagged,
-  kUntagged,
-  kUnboxedDouble,
-  kUnboxedFloat,
-  kUnboxedInt32,
-  kUnboxedUint32,
-  kUnboxedInt64,
-  kUnboxedFloat32x4,
-  kUnboxedInt32x4,
-  kUnboxedFloat64x2,
-  kPairOfTagged,
-  kNumRepresentations
+#define DECLARE_REPRESENTATION(name) k##name,
+  FOR_EACH_REPRESENTATION_KIND(DECLARE_REPRESENTATION)
+#undef DECLARE_REPRESENTATION
+      kNumRepresentations
 };
 
 // 'UnboxedFfiIntPtr' should be able to hold a pointer of the target word-size.
@@ -79,6 +84,9 @@
   static const uword kLocationTagMask = 0x3;
 
  public:
+  static bool ParseRepresentation(const char* str, Representation* out);
+  static const char* RepresentationToCString(Representation repr);
+
   // Constant payload can overlap with kind field so Kind values
   // have to be chosen in a way that their last 2 bits are never
   // the same as kConstantTag or kPairLocationTag.
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 6f4700f..8a81d68 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2703,8 +2703,7 @@
     case Slot::Kind::kClosure_function:
     case Slot::Kind::kClosure_function_type_arguments:
     case Slot::Kind::kClosure_instantiator_type_arguments:
-    case Slot::Kind::kPointer_c_memory_address:
-    case Slot::Kind::kTypedDataBase_data_field:
+    case Slot::Kind::kPointerBase_data_field:
     case Slot::Kind::kTypedDataView_data:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
@@ -2722,6 +2721,7 @@
     case Slot::Kind::kArgumentsDescriptor_type_args_len:
     case Slot::Kind::kArgumentsDescriptor_positional_count:
     case Slot::Kind::kArgumentsDescriptor_count:
+    case Slot::Kind::kArgumentsDescriptor_size:
       *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
       break;
   }
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index d887101..b8ca816 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -3586,6 +3586,9 @@
         ConstantInstr* copy =
             new (flow_graph_->zone()) ConstantInstr(orig->value());
         copy->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
+        if (FlowGraph::NeedsPairLocation(copy->representation())) {
+          flow_graph_->alloc_ssa_temp_index();
+        }
         old->ReplaceUsesWith(copy);
         copy->set_previous(old->previous());  // partial link
         (*idefs)[j] = copy;
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index ffa2de3..8010098 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -642,21 +642,23 @@
 
     //   v1 <- LoadIndexed(array)
     v1 = builder.AddDefinition(new LoadIndexedInstr(
-        new Value(array), new Value(vc0), 1, kTypedDataUint32ArrayCid,
-        kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource));
+        new Value(array), new Value(vc0), /*index_unboxed=*/false, 1,
+        kTypedDataUint32ArrayCid, kAlignedAccess, DeoptId::kNone,
+        TokenPosition::kNoSource));
 
     //   v2 <- LoadUntagged(array)
     //   StoreIndexed(v2, index=0, value=42)
     v2 = builder.AddDefinition(new LoadUntaggedInstr(new Value(array), 0));
     store = builder.AddInstruction(new StoreIndexedInstr(
-        new Value(v2), new Value(vc0), new Value(vc42), kNoStoreBarrier, 1,
-        kTypedDataUint32ArrayCid, kAlignedAccess, DeoptId::kNone,
-        TokenPosition::kNoSource));
+        new Value(v2), new Value(vc0), new Value(vc42), kNoStoreBarrier,
+        /*index_unboxed=*/false, 1, kTypedDataUint32ArrayCid, kAlignedAccess,
+        DeoptId::kNone, TokenPosition::kNoSource));
 
     //   v3 <- LoadIndexed(array)
     v3 = builder.AddDefinition(new LoadIndexedInstr(
-        new Value(array), new Value(vc0), 1, kTypedDataUint32ArrayCid,
-        kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource));
+        new Value(array), new Value(vc0), /*index_unboxed=*/false, 1,
+        kTypedDataUint32ArrayCid, kAlignedAccess, DeoptId::kNone,
+        TokenPosition::kNoSource));
 
     //   return v3
     ret = builder.AddInstruction(new ReturnInstr(
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index f310041..83f819a 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -58,7 +58,6 @@
   V(Closure, hash, Context, VAR)                                               \
   V(GrowableObjectArray, length, Smi, VAR)                                     \
   V(GrowableObjectArray, data, Array, VAR)                                     \
-  V(TypedDataBase, data_field, Dynamic, FINAL)                                 \
   V(TypedDataBase, length, Smi, FINAL)                                         \
   V(TypedDataView, offset_in_bytes, Smi, FINAL)                                \
   V(TypedDataView, data, Dynamic, FINAL)                                       \
@@ -71,7 +70,8 @@
   V(ArgumentsDescriptor, type_args_len, Smi, FINAL)                            \
   V(ArgumentsDescriptor, positional_count, Smi, FINAL)                         \
   V(ArgumentsDescriptor, count, Smi, FINAL)                                    \
-  V(Pointer, c_memory_address, Dynamic, FINAL)                                 \
+  V(ArgumentsDescriptor, size, Smi, FINAL)                                     \
+  V(PointerBase, data_field, Dynamic, FINAL)                                   \
   V(Type, arguments, TypeArguments, FINAL)
 
 // Slot is an abstraction that describes an readable (and possibly writeable)
diff --git a/runtime/vm/compiler/backend/type_propagator_test.cc b/runtime/vm/compiler/backend/type_propagator_test.cc
index 02a82c8..33fa26d 100644
--- a/runtime/vm/compiler/backend/type_propagator_test.cc
+++ b/runtime/vm/compiler/backend/type_propagator_test.cc
@@ -58,7 +58,7 @@
 
   {
     BlockBuilder builder(H.flow_graph(), normal_entry);
-    v0 = builder.AddParameter(0, /*with_frame=*/true);
+    v0 = builder.AddParameter(0, 0, /*with_frame=*/true, kTagged);
     builder.AddBranch(
         new StrictCompareInstr(
             TokenPosition::kNoSource, Token::kEQ_STRICT, new Value(v0),
@@ -124,7 +124,7 @@
 
   {
     BlockBuilder builder(H.flow_graph(), b1);
-    v0 = builder.AddParameter(0, /*with_frame=*/true);
+    v0 = builder.AddParameter(0, 0, /*with_frame=*/true, kTagged);
     auto load_cid = builder.AddDefinition(new LoadClassIdInstr(new Value(v0)));
     builder.AddBranch(
         new StrictCompareInstr(
@@ -216,7 +216,7 @@
 
   {
     BlockBuilder builder(H.flow_graph(), b1);
-    v0 = builder.AddParameter(0, /*with_frame=*/true);
+    v0 = builder.AddParameter(0, 0, /*with_frame=*/true, kTagged);
     builder.AddBranch(new StrictCompareInstr(
                           TokenPosition::kNoSource, Token::kEQ_STRICT,
                           new Value(v0), new Value(H.IntConstant(1)),
@@ -306,7 +306,7 @@
 
   {
     BlockBuilder builder(H.flow_graph(), b1);
-    v0 = builder.AddParameter(0, /*with_frame=*/true);
+    v0 = builder.AddParameter(0, 0, /*with_frame=*/true, kTagged);
     builder.AddBranch(new StrictCompareInstr(
                           TokenPosition::kNoSource, Token::kEQ_STRICT,
                           new Value(v0), new Value(H.IntConstant(1)),
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 2508edf..70b5134 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -125,13 +125,16 @@
         Token::IsEqualityOperator(op_kind) ||
         Token::IsBinaryOperator(op_kind)) {
       // Guess cid: if one of the inputs is a number assume that the other
-      // is a number of same type.
-      const intptr_t cid_0 = class_ids[0];
-      const intptr_t cid_1 = class_ids[1];
-      if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) {
-        class_ids[0] = cid_1;
-      } else if (IsNumberCid(cid_0) && (cid_1 == kDynamicCid)) {
-        class_ids[1] = cid_0;
+      // is a number of same type, unless the interface target tells us this
+      // is impossible.
+      if (!call->HasNonSmiAssignableInterface(zone())) {
+        const intptr_t cid_0 = class_ids[0];
+        const intptr_t cid_1 = class_ids[1];
+        if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) {
+          class_ids[0] = cid_1;
+        } else if (IsNumberCid(cid_0) && (cid_1 == kDynamicCid)) {
+          class_ids[1] = cid_0;
+        }
       }
     }
   }
@@ -1696,9 +1699,9 @@
                         compiler::target::TypedDataBase::data_field_offset());
   flow_graph_->InsertBefore(call, data, call->env(), FlowGraph::kValue);
 
-  Definition* load = new (Z)
-      LoadIndexedInstr(new (Z) Value(data), new (Z) Value(index), index_scale,
-                       cid, kAlignedAccess, DeoptId::kNone, call->token_pos());
+  Definition* load = new (Z) LoadIndexedInstr(
+      new (Z) Value(data), new (Z) Value(index), /*index_unboxed=*/false,
+      index_scale, cid, kAlignedAccess, DeoptId::kNone, call->token_pos());
   flow_graph_->InsertBefore(call, load, call->env(), FlowGraph::kValue);
 
   if (cid == kTypedDataFloat32ArrayCid) {
@@ -1776,8 +1779,9 @@
 
   auto store = new (Z) StoreIndexedInstr(
       new (Z) Value(data), new (Z) Value(index), new (Z) Value(value),
-      kNoStoreBarrier, index_scale, cid, kAlignedAccess, DeoptId::kNone,
-      call->token_pos(), Instruction::kNotSpeculative);
+      kNoStoreBarrier, /*index_unboxed=*/false, index_scale, cid,
+      kAlignedAccess, DeoptId::kNone, call->token_pos(),
+      Instruction::kNotSpeculative);
   flow_graph_->InsertBefore(call, store, call->env(), FlowGraph::kEffect);
 }
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index ea37001..6ee4ead 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -193,9 +193,18 @@
 
   Value* value = Pop();
   ASSERT(stack_ == nullptr);
-
-  ReturnInstr* return_instr =
-      new (Z) ReturnInstr(position, value, GetNextDeoptId(), yield_index);
+  const Function& function = parsed_function_->function();
+  Representation representation;
+  if (function.has_unboxed_integer_return()) {
+    representation = kUnboxedInt64;
+  } else if (function.has_unboxed_double_return()) {
+    representation = kUnboxedDouble;
+  } else {
+    ASSERT(!function.has_unboxed_return());
+    representation = kTagged;
+  }
+  ReturnInstr* return_instr = new (Z) ReturnInstr(
+      position, value, GetNextDeoptId(), yield_index, representation);
   if (exit_collector_ != nullptr) exit_collector_->AddExit(return_instr);
 
   instructions <<= return_instr;
@@ -320,23 +329,24 @@
 Fragment BaseFlowGraphBuilder::LoadIndexed(intptr_t index_scale) {
   Value* index = Pop();
   Value* array = Pop();
-  LoadIndexedInstr* instr = new (Z)
-      LoadIndexedInstr(array, index, index_scale, kArrayCid, kAlignedAccess,
-                       DeoptId::kNone, TokenPosition::kNoSource);
+  LoadIndexedInstr* instr = new (Z) LoadIndexedInstr(
+      array, index, /*index_unboxed=*/false, index_scale, kArrayCid,
+      kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource);
   Push(instr);
   return Fragment(instr);
 }
 
-Fragment BaseFlowGraphBuilder::LoadIndexedTypedData(classid_t class_id) {
+Fragment BaseFlowGraphBuilder::LoadIndexedTypedData(classid_t class_id,
+                                                    intptr_t index_scale,
+                                                    bool index_unboxed) {
   // We use C behavior when dereferencing pointers, we assume alignment.
   const AlignmentType alignment = kAlignedAccess;
-  const intptr_t scale = compiler::target::Instance::ElementSizeFor(class_id);
 
   Value* index = Pop();
   Value* c_pointer = Pop();
-  LoadIndexedInstr* instr =
-      new (Z) LoadIndexedInstr(c_pointer, index, scale, class_id, alignment,
-                               DeoptId::kNone, TokenPosition::kNoSource);
+  LoadIndexedInstr* instr = new (Z)
+      LoadIndexedInstr(c_pointer, index, index_unboxed, index_scale, class_id,
+                       alignment, DeoptId::kNone, TokenPosition::kNoSource);
   Push(instr);
   return Fragment(instr);
 }
@@ -355,19 +365,25 @@
   return Fragment(store);
 }
 
-Fragment BaseFlowGraphBuilder::ConvertUntaggedToIntptr() {
+Fragment BaseFlowGraphBuilder::ConvertUntaggedToUnboxed(
+    Representation to_representation) {
+  ASSERT(to_representation == kUnboxedIntPtr ||
+         to_representation == kUnboxedFfiIntPtr);
   Value* value = Pop();
   auto converted = new (Z)
-      IntConverterInstr(kUntagged, kUnboxedIntPtr, value, DeoptId::kNone);
+      IntConverterInstr(kUntagged, to_representation, value, DeoptId::kNone);
   converted->mark_truncating();
   Push(converted);
   return Fragment(converted);
 }
 
-Fragment BaseFlowGraphBuilder::ConvertIntptrToUntagged() {
+Fragment BaseFlowGraphBuilder::ConvertUnboxedToUntagged(
+    Representation from_representation) {
+  ASSERT(from_representation == kUnboxedIntPtr ||
+         from_representation == kUnboxedFfiIntPtr);
   Value* value = Pop();
   auto converted = new (Z)
-      IntConverterInstr(kUnboxedIntPtr, kUntagged, value, DeoptId::kNone);
+      IntConverterInstr(from_representation, kUntagged, value, DeoptId::kNone);
   converted->mark_truncating();
   Push(converted);
   return Fragment(converted);
@@ -552,23 +568,25 @@
       value->BindsToConstant() ? kNoStoreBarrier : kEmitStoreBarrier;
   StoreIndexedInstr* store = new (Z) StoreIndexedInstr(
       Pop(),  // Array.
-      index, value, emit_store_barrier,
+      index, value, emit_store_barrier, /*index_unboxed=*/false,
+
       compiler::target::Instance::ElementSizeFor(class_id), class_id,
       kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource);
   return Fragment(store);
 }
 
-Fragment BaseFlowGraphBuilder::StoreIndexedTypedData(classid_t class_id) {
+Fragment BaseFlowGraphBuilder::StoreIndexedTypedData(classid_t class_id,
+                                                     intptr_t index_scale,
+                                                     bool index_unboxed) {
   // We use C behavior when dereferencing pointers, we assume alignment.
   const AlignmentType alignment = kAlignedAccess;
-  const intptr_t scale = compiler::target::Instance::ElementSizeFor(class_id);
 
   Value* value = Pop();
   Value* index = Pop();
   Value* c_pointer = Pop();
   StoreIndexedInstr* instr = new (Z) StoreIndexedInstr(
-      c_pointer, index, value, kNoStoreBarrier, scale, class_id, alignment,
-      DeoptId::kNone, TokenPosition::kNoSource,
+      c_pointer, index, value, kNoStoreBarrier, index_unboxed, index_scale,
+      class_id, alignment, DeoptId::kNone, TokenPosition::kNoSource,
       Instruction::SpeculativeMode::kNotSpeculative);
   return Fragment(instr);
 }
@@ -777,10 +795,12 @@
   return Fragment(instr);
 }
 
-Fragment BaseFlowGraphBuilder::LoadFpRelativeSlot(intptr_t offset,
-                                                  CompileType result_type) {
-  LoadIndexedUnsafeInstr* instr =
-      new (Z) LoadIndexedUnsafeInstr(Pop(), offset, result_type);
+Fragment BaseFlowGraphBuilder::LoadFpRelativeSlot(
+    intptr_t offset,
+    CompileType result_type,
+    Representation representation) {
+  LoadIndexedUnsafeInstr* instr = new (Z)
+      LoadIndexedUnsafeInstr(Pop(), offset, result_type, representation);
   Push(instr);
   return Fragment(instr);
 }
@@ -888,6 +908,12 @@
   return Fragment(allocate);
 }
 
+Fragment BaseFlowGraphBuilder::Box(Representation from) {
+  BoxInstr* box = BoxInstr::Create(from, Pop());
+  Push(box);
+  return Fragment(box);
+}
+
 Fragment BaseFlowGraphBuilder::BuildFfiAsFunctionInternalCall(
     const TypeArguments& signatures) {
   ASSERT(signatures.IsInstantiated());
@@ -903,8 +929,9 @@
           Function::Handle(Z, Type::Cast(native_type).signature())));
 
   Fragment code;
-  code += LoadNativeField(Slot::Pointer_c_memory_address());
-  LocalVariable* address = MakeTemporary();
+  // Store the pointer in the context, we cannot load the untagged address
+  // here as these can be unoptimized call sites.
+  LocalVariable* pointer = MakeTemporary();
 
   auto& context_slots = CompilerState::Current().GetDummyContextSlots(
       /*context_id=*/0, /*num_variables=*/1);
@@ -912,7 +939,7 @@
   LocalVariable* context = MakeTemporary();
 
   code += LoadLocal(context);
-  code += LoadLocal(address);
+  code += LoadLocal(pointer);
   code += StoreInstanceField(TokenPosition::kNoSource, *context_slots[0]);
 
   code += AllocateClosure(TokenPosition::kNoSource, target);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index d0612ea..4046087 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -159,12 +159,14 @@
   Fragment LoadNativeField(const Slot& native_field);
   Fragment LoadIndexed(intptr_t index_scale);
   // Takes a [class_id] valid for StoreIndexed.
-  Fragment LoadIndexedTypedData(classid_t class_id);
+  Fragment LoadIndexedTypedData(classid_t class_id,
+                                intptr_t index_scale,
+                                bool index_unboxed);
 
   Fragment LoadUntagged(intptr_t offset);
   Fragment StoreUntagged(intptr_t offset);
-  Fragment ConvertUntaggedToIntptr();
-  Fragment ConvertIntptrToUntagged();
+  Fragment ConvertUntaggedToUnboxed(Representation to);
+  Fragment ConvertUnboxedToUntagged(Representation from);
   Fragment UnboxSmiToIntptr();
   Fragment FloatToDouble();
   Fragment DoubleToFloat();
@@ -199,7 +201,12 @@
   Fragment StoreStaticField(TokenPosition position, const Field& field);
   Fragment StoreIndexed(classid_t class_id);
   // Takes a [class_id] valid for StoreIndexed.
-  Fragment StoreIndexedTypedData(classid_t class_id);
+  Fragment StoreIndexedTypedData(classid_t class_id,
+                                 intptr_t index_scale,
+                                 bool index_unboxed);
+
+  // Sign-extends kUnboxedInt32 and zero-extends kUnboxedUint32.
+  Fragment Box(Representation from);
 
   void Push(Definition* definition);
   Definition* Peek(intptr_t depth = 0);
@@ -252,7 +259,9 @@
   Fragment BinaryIntegerOp(Token::Kind op,
                            Representation representation,
                            bool is_truncating = false);
-  Fragment LoadFpRelativeSlot(intptr_t offset, CompileType result_type);
+  Fragment LoadFpRelativeSlot(intptr_t offset,
+                              CompileType result_type,
+                              Representation representation = kTagged);
   Fragment StoreFpRelativeSlot(intptr_t offset);
   Fragment BranchIfTrue(TargetEntryInstr** then_entry,
                         TargetEntryInstr** otherwise_entry,
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index bde75d5..dda878c 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -1498,7 +1498,7 @@
       const intptr_t num_type_args =
           ((flags & kFlagHasTypeArgs) != 0) ? reader_.ReadUInt() : 0;
       if ((flags & kFlagHasNamedArgs) == 0) {
-        return ArgumentsDescriptor::New(num_type_args, num_arguments);
+        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments);
       } else {
         const intptr_t num_arg_names = reader_.ReadListLength();
         const Array& array = Array::Handle(Z, Array::New(num_arg_names));
@@ -1507,7 +1507,8 @@
           name ^= ReadObject();
           array.SetAt(i, name);
         }
-        return ArgumentsDescriptor::New(num_type_args, num_arguments, array);
+        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments,
+                                             array);
       }
     }
     case kScript: {
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 9706b1a..bcdb962 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -182,7 +182,7 @@
       const auto& list_class =
           Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true,
+      TypeTranslator type_translator(&reader, this, active_class_, true,
                                      active_class_->RequireLegacyErasure());
       auto& type_arguments =
           TypeArguments::Handle(Z, TypeArguments::New(1, Heap::kOld));
@@ -224,7 +224,7 @@
       ASSERT(klass.is_const());
       instance = Instance::New(klass, Heap::kOld);
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true,
+      TypeTranslator type_translator(&reader, this, active_class_, true,
                                      active_class_->RequireLegacyErasure());
       const intptr_t number_of_type_arguments = reader.ReadUInt();
       if (klass.NumTypeArguments() > 0) {
@@ -267,7 +267,7 @@
       ASSERT(!constant.IsNull());
 
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true,
+      TypeTranslator type_translator(&reader, this, active_class_, true,
                                      active_class_->RequireLegacyErasure());
       const intptr_t number_of_type_arguments = reader.ReadUInt();
       ASSERT(number_of_type_arguments > 0);
@@ -301,7 +301,7 @@
     }
     case kTypeLiteralConstant: {
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, active_class_, true,
+      TypeTranslator type_translator(&reader, this, active_class_, true,
                                      active_class_->RequireLegacyErasure());
       instance = type_translator.BuildType().raw();
       break;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 9d7e9e8..54c2e4b 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -314,9 +314,11 @@
         field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
         const Tag initializer_tag = ReadTag();
         if (class_field.is_late()) {
-          instructions +=
-              BuildLateFieldInitializer(Field::ZoneHandle(Z, class_field.raw()),
-                                        initializer_tag == kSomething);
+          if (!is_constructor_initialized) {
+            instructions += BuildLateFieldInitializer(
+                Field::ZoneHandle(Z, class_field.raw()),
+                initializer_tag == kSomething);
+          }
         } else if (initializer_tag == kSomething) {
           EnterScope(field_offset);
           // If this field is initialized in constructor then we can ignore the
@@ -2481,8 +2483,8 @@
 
   //   - the arguments descriptor.
   const Array& args_descriptor =
-      Array::Handle(Z, ArgumentsDescriptor::New(num_type_arguments,
-                                                num_arguments, argument_names));
+      Array::Handle(Z, ArgumentsDescriptor::NewBoxed(
+                           num_type_arguments, num_arguments, argument_names));
   instructions += Constant(Array::ZoneHandle(Z, args_descriptor.raw()));
 
   //   - an array containing the actual arguments.
@@ -5108,6 +5110,8 @@
                                                false,  // is_method
                                                true,   // is_closure
                                                &function_node_helper);
+      // type_translator_.SetupUnboxingInfoMetadata is not called here at the
+      // moment because closures do not have unboxed parameters and return value
       function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
 
       // Finalize function type.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index ec67dc0..d782e5d 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -34,8 +34,11 @@
             data_program_offset),
         flow_graph_builder_(flow_graph_builder),
         active_class_(&flow_graph_builder->active_class_),
-        type_translator_(this, active_class_, /* finalize= */ true),
         constant_reader_(this, active_class_),
+        type_translator_(this,
+                         &constant_reader_,
+                         active_class_,
+                         /* finalize= */ true),
         bytecode_metadata_helper_(this, active_class_),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this, &constant_reader_),
@@ -362,8 +365,8 @@
 
   FlowGraphBuilder* flow_graph_builder_;
   ActiveClass* const active_class_;
-  TypeTranslator type_translator_;
   ConstantReader constant_reader_;
+  TypeTranslator type_translator_;
   BytecodeMetadataHelper bytecode_metadata_helper_;
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 4712a7b..dadcf40 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -566,8 +566,7 @@
   if (is_static) {
     instructions += StoreStaticField(position, field);
   } else {
-    instructions += StoreInstanceFieldGuarded(
-        field, StoreInstanceFieldInstr::Kind::kInitializing);
+    instructions += StoreInstanceFieldGuarded(field);
   }
 
   return instructions;
@@ -1215,20 +1214,20 @@
       LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
       LocalVariable* arg_offset = parsed_function_->RawParameterVariable(1);
 
-      body += LoadLocal(arg_pointer);
-      body += CheckNullOptimized(TokenPosition::kNoSource,
-                                 String::ZoneHandle(Z, function.name()));
-      body += LoadNativeField(Slot::Pointer_c_memory_address());
-      body += UnboxTruncate(kUnboxedFfiIntPtr);
       body += LoadLocal(arg_offset);
       body += CheckNullOptimized(TokenPosition::kNoSource,
                                  String::ZoneHandle(Z, function.name()));
+      LocalVariable* arg_offset_not_null = MakeTemporary();
+
+      body += LoadLocal(arg_pointer);
+      body += CheckNullOptimized(TokenPosition::kNoSource,
+                                 String::ZoneHandle(Z, function.name()));
+      // No GC from here til LoadIndexed.
+      body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
+      body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body +=
-          BinaryIntegerOp(Token::kADD, kUnboxedFfiIntPtr, /* truncate= */ true);
-      body += ConvertIntptrToUntagged();
-      body += IntConstant(0);
-      body += LoadIndexedTypedData(typed_data_cid);
+      body += LoadIndexedTypedData(typed_data_cid, /*index_scale=*/1,
+                                   /*index_unboxed=*/true);
       if (kind == MethodRecognizer::kFfiLoadFloat ||
           kind == MethodRecognizer::kFfiLoadDouble) {
         if (kind == MethodRecognizer::kFfiLoadFloat) {
@@ -1265,11 +1264,13 @@
           LocalVariable* pointer = MakeTemporary();
           body += LoadLocal(pointer);
           body += LoadLocal(address);
-          body += StoreInstanceField(TokenPosition::kNoSource,
-                                     Slot::Pointer_c_memory_address());
+          body += UnboxTruncate(kUnboxedFfiIntPtr);
+          body += ConvertUnboxedToUntagged(kUnboxedFfiIntPtr);
+          body += StoreUntagged(compiler::target::Pointer::data_field_offset());
           body += DropTempsPreserveTop(1);  // Drop [address] keep [pointer].
         }
       }
+      body += DropTempsPreserveTop(1);  // Drop [arg_offset].
     } break;
     case MethodRecognizer::kFfiStoreInt8:
     case MethodRecognizer::kFfiStoreInt16:
@@ -1329,24 +1330,27 @@
       }
 
       ASSERT(function.NumParameters() == 3);
+      body += LoadLocal(arg_offset);
+      body += CheckNullOptimized(TokenPosition::kNoSource,
+                                 String::ZoneHandle(Z, function.name()));
+      LocalVariable* arg_offset_not_null = MakeTemporary();
+      body += LoadLocal(arg_value);
+      body += CheckNullOptimized(TokenPosition::kNoSource,
+                                 String::ZoneHandle(Z, function.name()));
+      LocalVariable* arg_value_not_null = MakeTemporary();
+
       body += LoadLocal(arg_pointer);  // Pointer.
       body += CheckNullOptimized(TokenPosition::kNoSource,
                                  String::ZoneHandle(Z, function.name()));
-      body += LoadNativeField(Slot::Pointer_c_memory_address());
+      // No GC from here til StoreIndexed.
+      body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
+      body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body += LoadLocal(arg_offset);  // Offset.
-      body += CheckNullOptimized(TokenPosition::kNoSource,
-                                 String::ZoneHandle(Z, function.name()));
-      body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body +=
-          BinaryIntegerOp(Token::kADD, kUnboxedFfiIntPtr, /* truncate= */ true);
-      body += ConvertIntptrToUntagged();
-      body += IntConstant(0);
-      body += LoadLocal(arg_value);  // Value.
-      body += CheckNullOptimized(TokenPosition::kNoSource,
-                                 String::ZoneHandle(Z, function.name()));
+      body += LoadLocal(arg_value_not_null);
       if (kind == MethodRecognizer::kFfiStorePointer) {
-        body += LoadNativeField(Slot::Pointer_c_memory_address());
+        // This can only be Pointer, so it is always safe to LoadUntagged.
+        body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+        body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
       } else if (kind == MethodRecognizer::kFfiStoreFloat ||
                  kind == MethodRecognizer::kFfiStoreDouble) {
         body += UnboxTruncate(kUnboxedDouble);
@@ -1356,7 +1360,10 @@
       } else {
         body += UnboxTruncate(native_rep.AsRepresentationOverApprox(zone_));
       }
-      body += StoreIndexedTypedData(typed_data_cid);
+      body += StoreIndexedTypedData(typed_data_cid, /*index_scale=*/1,
+                                    /*index_unboxed=*/true);
+      body += Drop();  // Drop [arg_value].
+      body += Drop();  // Drop [arg_offset].
       body += NullConstant();
     } break;
     case MethodRecognizer::kFfiFromAddress: {
@@ -1373,21 +1380,19 @@
       body += LoadLocal(parsed_function_->RawParameterVariable(0));  // Address.
       body += CheckNullOptimized(TokenPosition::kNoSource,
                                  String::ZoneHandle(Z, function.name()));
-#if defined(TARGET_ARCH_IS_32_BIT)
-      // Truncate to 32 bits on 32 bit architecture.
       body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body += Box(kUnboxedFfiIntPtr);
-#endif  // defined(TARGET_ARCH_IS_32_BIT)
-      body += StoreInstanceField(TokenPosition::kNoSource,
-                                 Slot::Pointer_c_memory_address(),
-                                 StoreInstanceFieldInstr::Kind::kInitializing);
+      body += ConvertUnboxedToUntagged(kUnboxedFfiIntPtr);
+      body += StoreUntagged(compiler::target::Pointer::data_field_offset());
     } break;
     case MethodRecognizer::kFfiGetAddress: {
       ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));  // Pointer.
       body += CheckNullOptimized(TokenPosition::kNoSource,
                                  String::ZoneHandle(Z, function.name()));
-      body += LoadNativeField(Slot::Pointer_c_memory_address());
+      // This can only be Pointer, so it is always safe to LoadUntagged.
+      body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+      body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
+      body += Box(kUnboxedFfiIntPtr);
     } break;
     default: {
       UNREACHABLE();
@@ -1444,11 +1449,11 @@
   body += LoadLocal(view_object);
   body += LoadLocal(typed_data);
   body += LoadUntagged(compiler::target::TypedDataBase::data_field_offset());
-  body += ConvertUntaggedToIntptr();
+  body += ConvertUntaggedToUnboxed(kUnboxedIntPtr);
   body += LoadLocal(offset_in_bytes);
   body += UnboxSmiToIntptr();
   body += AddIntptrIntegers();
-  body += ConvertIntptrToUntagged();
+  body += ConvertUnboxedToUntagged(kUnboxedIntPtr);
   body += StoreUntagged(compiler::target::TypedDataBase::data_field_offset());
 
   return body;
@@ -1791,12 +1796,28 @@
   return names.raw();
 }
 
-Fragment FlowGraphBuilder::PushExplicitParameters(const Function& function) {
+Fragment FlowGraphBuilder::PushExplicitParameters(
+    const Function& function,
+    const Function& target /* = Function::null_function()*/) {
   Fragment instructions;
   for (intptr_t i = function.NumImplicitParameters(),
                 n = function.NumParameters();
        i < n; ++i) {
-    instructions += LoadLocal(parsed_function_->ParameterVariable(i));
+    Fragment push_param = LoadLocal(parsed_function_->ParameterVariable(i));
+    if (!target.IsNull() && target.is_unboxed_parameter_at(i)) {
+      Representation to;
+      if (target.is_unboxed_integer_parameter_at(i)) {
+        to = kUnboxedInt64;
+      } else {
+        ASSERT(target.is_unboxed_double_parameter_at(i));
+        to = kUnboxedDouble;
+      }
+      const auto unbox = UnboxInstr::Create(to, Pop(), DeoptId::kNone,
+                                            Instruction::kNotSpeculative);
+      Push(unbox);
+      push_param += Fragment(unbox);
+    }
+    instructions += push_param;
   }
   return instructions;
 }
@@ -1871,7 +1892,7 @@
   // it in.
   const intptr_t receiver_index = descriptor.TypeArgsLen() > 0 ? 1 : 0;
   body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null()));
-  body += IntConstant(receiver_index + descriptor.Count());
+  body += IntConstant(receiver_index + descriptor.Size());
   body += CreateArray();
   LocalVariable* array = MakeTemporary();
   if (receiver_index > 0) {
@@ -1914,7 +1935,7 @@
 
   const int kTypeArgsLen = 0;
   ArgumentsDescriptor two_arguments(
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, 2)));
+      Array::Handle(Z, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, 2)));
   Function& no_such_method =
       Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
                                   Class::Handle(Z, function.Owner()),
@@ -2056,7 +2077,7 @@
   if (is_implicit_closure_function && !function.is_static()) {
     if (parsed_function_->has_arg_desc_var()) {
       body += LoadArgDescriptor();
-      body += LoadNativeField(Slot::ArgumentsDescriptor_count());
+      body += LoadNativeField(Slot::ArgumentsDescriptor_size());
       body += LoadLocal(parsed_function_->current_context_var());
       body += LoadNativeField(Slot::GetContextVariableSlotFor(
           thread_, *parsed_function_->receiver_var()));
@@ -2096,7 +2117,7 @@
 
   if (function.HasOptionalParameters()) {
     body += LoadArgDescriptor();
-    body += LoadNativeField(Slot::ArgumentsDescriptor_count());
+    body += LoadNativeField(Slot::ArgumentsDescriptor_size());
   } else {
     body += IntConstant(function.NumParameters());
   }
@@ -2214,7 +2235,7 @@
     // If there is no variable for the arguments descriptor (this function's
     // signature doesn't require it), then we need to create one.
     Array& args_desc = Array::ZoneHandle(
-        Z, ArgumentsDescriptor::New(0, function.NumParameters()));
+        Z, ArgumentsDescriptor::NewBoxed(0, function.NumParameters()));
     body += Constant(args_desc);
   } else {
     body += LoadArgDescriptor();
@@ -2715,8 +2736,7 @@
   // Push receiver.
   ASSERT(function.NumImplicitParameters() == 1);
   body += LoadLocal(parsed_function_->receiver_var());
-
-  body += PushExplicitParameters(function);
+  body += PushExplicitParameters(function, target);
 
   const intptr_t argument_count = function.NumParameters();
   const auto& argument_names =
@@ -2725,6 +2745,12 @@
   body += StaticCall(TokenPosition::kNoSource, target, argument_count,
                      argument_names, ICData::kNoRebind, nullptr, type_args_len);
 
+  if (target.has_unboxed_integer_return()) {
+    body += Box(kUnboxedInt64);
+  } else if (target.has_unboxed_double_return()) {
+    body += Box(kUnboxedDouble);
+  }
+
   // Later optimization passes assume that result of a x.[]=(...) call is not
   // used. We must guarantee this invariant because violation will lead to an
   // illegal IL once we replace x.[]=(...) with a sequence that does not
@@ -2756,12 +2782,6 @@
   return Fragment(unbox);
 }
 
-Fragment FlowGraphBuilder::Box(Representation from) {
-  BoxInstr* box = BoxInstr::Create(from, Pop());
-  Push(box);
-  return Fragment(box);
-}
-
 Fragment FlowGraphBuilder::NativeReturn(
     const compiler::ffi::CallbackMarshaller& marshaller) {
   auto* instr = new (Z) NativeReturnInstr(TokenPosition::kNoSource, Pop(),
@@ -2791,9 +2811,9 @@
   LocalVariable* pointer = MakeTemporary();
   code += LoadLocal(pointer);
   code += LoadLocal(address);
-  code += StoreInstanceField(TokenPosition::kNoSource,
-                             Slot::Pointer_c_memory_address(),
-                             StoreInstanceFieldInstr::Kind::kInitializing);
+  code += UnboxTruncate(kUnboxedFfiIntPtr);
+  code += ConvertUnboxedToUntagged(kUnboxedFfiIntPtr);
+  code += StoreUntagged(compiler::target::Pointer::data_field_offset());
   code += StoreLocal(TokenPosition::kNoSource, result);
   code += Drop();  // StoreLocal^
   code += Drop();  // address
@@ -2841,11 +2861,13 @@
                              String::ZoneHandle(Z, marshaller.function_name()));
 
   if (marshaller.IsPointer(arg_index)) {
-    body += LoadNativeField(Slot::Pointer_c_memory_address());
+    // This can only be Pointer, so it is always safe to LoadUntagged.
+    body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+    body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
+  } else {
+    body += UnboxTruncate(marshaller.RepInDart(arg_index));
   }
 
-  body += UnboxTruncate(marshaller.RepInDart(arg_index));
-
   if (marshaller.RequiresBitCast(arg_index)) {
     body += BitCast(marshaller.RepInDart(arg_index),
                     marshaller.RepInFfiCall(arg_index));
@@ -2889,15 +2911,18 @@
     body += FfiConvertArgumentToNative(marshaller, i);
   }
 
-  // Push the function pointer, which is stored (boxed) in the first slot of the
-  // context.
+  // Push the function pointer, which is stored (as Pointer object) in the
+  // first slot of the context.
   body += LoadLocal(parsed_function_->ParameterVariable(0));
   body += LoadNativeField(Slot::Closure_context());
   body += LoadNativeField(Slot::GetContextVariableSlotFor(
       thread_, *MakeImplicitClosureScope(
                     Z, Class::Handle(I->object_store()->ffi_pointer_class()))
                     ->context_variables()[0]));
-  body += UnboxTruncate(kUnboxedFfiIntPtr);
+
+  // This can only be Pointer, so it is always safe to LoadUntagged.
+  body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+  body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
   body += FfiCall(marshaller);
 
   body += FfiConvertArgumentToDart(marshaller, compiler::ffi::kResultIndex);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 564fb8f..a61c5b1 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -71,7 +71,9 @@
   RawArray* GetOptionalParameterNames(const Function& function);
 
   // Generate fragment which pushes all explicit parameters of [function].
-  Fragment PushExplicitParameters(const Function& function);
+  Fragment PushExplicitParameters(
+      const Function& function,
+      const Function& target = Function::null_function());
 
   FlowGraph* BuildGraphOfMethodExtractor(const Function& method);
   FlowGraph* BuildGraphOfNoSuchMethodDispatcher(const Function& function);
@@ -190,9 +192,6 @@
   // target representation.
   Fragment UnboxTruncate(Representation to);
 
-  // Sign-extends kUnboxedInt32 and zero-extends kUnboxedUint32.
-  Fragment Box(Representation from);
-
   // Creates an ffi.Pointer holding a given address (TOS).
   Fragment FfiPointerFromAddress(const Type& result_type);
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 90fb260..6a8b7cd 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -6,6 +6,7 @@
 
 #include "vm/class_finalizer.h"
 #include "vm/compiler/aot/precompiler.h"
+#include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/log.h"
 #include "vm/object_store.h"
@@ -1690,7 +1691,8 @@
       constant_reader_(constant_reader) {}
 
 InferredTypeMetadata InferredTypeMetadataHelper::GetInferredType(
-    intptr_t node_offset) {
+    intptr_t node_offset,
+    bool read_constant) {
   const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
   if (md_offset < 0) {
     return InferredTypeMetadata(kDynamicCid,
@@ -1706,8 +1708,10 @@
   const Object* constant_value = &Object::null_object();
   if ((flags & InferredTypeMetadata::kFlagConstant) != 0) {
     const intptr_t constant_offset = helper_->ReadUInt();
-    constant_value = &Object::ZoneHandle(
-        H.zone(), constant_reader_->ReadConstant(constant_offset));
+    if (read_constant) {
+      constant_value = &Object::ZoneHandle(
+          H.zone(), constant_reader_->ReadConstant(constant_offset));
+    }
   }
 
   if (H.IsRoot(kernel_name)) {
@@ -1854,6 +1858,39 @@
   info->called_on_null = helper_->ReadByte() != 0;
 }
 
+UnboxingInfoMetadataHelper::UnboxingInfoMetadataHelper(
+    KernelReaderHelper* helper)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
+
+UnboxingInfoMetadata* UnboxingInfoMetadataHelper::GetUnboxingInfoMetadata(
+    intptr_t node_offset) {
+  const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+
+  if (md_offset < 0) {
+    return nullptr;
+  }
+
+  AlternativeReadingScopeWithNewData alt(&helper_->reader_,
+                                         &H.metadata_payloads(), md_offset);
+
+  const intptr_t num_args = helper_->ReadUInt();
+  const auto info = new (helper_->zone_) UnboxingInfoMetadata();
+  info->SetArgsCount(num_args);
+  for (intptr_t i = 0; i < num_args; i++) {
+    const auto arg_info = helper_->ReadByte();
+    assert(arg_info >= UnboxingInfoMetadata::kBoxed &&
+           arg_info < UnboxingInfoMetadata::kUnboxingCandidate);
+    info->unboxed_args_info[i] =
+        static_cast<UnboxingInfoMetadata::UnboxingInfoTag>(arg_info);
+  }
+  const auto return_info = helper_->ReadByte();
+  assert(return_info >= UnboxingInfoMetadata::kBoxed &&
+         return_info < UnboxingInfoMetadata::kUnboxingCandidate);
+  info->return_info =
+      static_cast<UnboxingInfoMetadata::UnboxingInfoTag>(return_info);
+  return info;
+}
+
 intptr_t KernelReaderHelper::ReaderOffset() const {
   return reader_.offset();
 }
@@ -2777,13 +2814,17 @@
 }
 
 TypeTranslator::TypeTranslator(KernelReaderHelper* helper,
+                               ConstantReader* constant_reader,
                                ActiveClass* active_class,
                                bool finalize,
                                bool apply_legacy_erasure)
     : helper_(helper),
+      constant_reader_(constant_reader),
       translation_helper_(helper->translation_helper_),
       active_class_(active_class),
       type_parameter_scope_(NULL),
+      inferred_type_metadata_helper_(helper_, constant_reader_),
+      unboxing_info_metadata_helper_(helper_),
       zone_(translation_helper_.zone()),
       result_(AbstractType::Handle(translation_helper_.zone())),
       finalize_(finalize),
@@ -3278,6 +3319,75 @@
   return type;
 }
 
+static void SetupUnboxingInfoOfParameter(const Function& function,
+                                         intptr_t param_index,
+                                         const UnboxingInfoMetadata* metadata) {
+  const intptr_t param_pos =
+      param_index + (function.HasThisParameter() ? 1 : 0);
+
+  if (param_pos < function.maximum_unboxed_parameter_count()) {
+    switch (metadata->unboxed_args_info[param_index]) {
+      case UnboxingInfoMetadata::kUnboxedIntCandidate:
+        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
+          function.set_unboxed_integer_parameter_at(param_pos);
+        }
+        break;
+      case UnboxingInfoMetadata::kUnboxedDoubleCandidate:
+        if (FlowGraphCompiler::SupportsUnboxedDoubles()) {
+          function.set_unboxed_double_parameter_at(param_pos);
+        }
+        break;
+      case UnboxingInfoMetadata::kUnboxingCandidate:
+        UNREACHABLE();
+        break;
+      case UnboxingInfoMetadata::kBoxed:
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+  }
+}
+
+void TypeTranslator::SetupUnboxingInfoMetadata(const Function& function,
+                                               intptr_t library_kernel_offset) {
+  const intptr_t kernel_offset =
+      function.kernel_offset() + library_kernel_offset;
+
+  const auto unboxing_info =
+      unboxing_info_metadata_helper_.GetUnboxingInfoMetadata(kernel_offset);
+
+  // TODO(dartbug.com/32292): accept unboxed parameters and return value
+  // when FLAG_use_table_dispatch == false.
+  if (FLAG_precompiled_mode && unboxing_info != nullptr &&
+      FLAG_use_table_dispatch && FLAG_use_bare_instructions) {
+    for (intptr_t i = 0; i < unboxing_info->unboxed_args_info.length(); i++) {
+      SetupUnboxingInfoOfParameter(function, i, unboxing_info);
+    }
+
+    switch (unboxing_info->return_info) {
+      case UnboxingInfoMetadata::kUnboxedIntCandidate:
+        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
+          function.set_unboxed_integer_return();
+        }
+        break;
+      case UnboxingInfoMetadata::kUnboxedDoubleCandidate:
+        if (FlowGraphCompiler::SupportsUnboxedDoubles()) {
+          function.set_unboxed_double_return();
+        }
+        break;
+      case UnboxingInfoMetadata::kUnboxingCandidate:
+        UNREACHABLE();
+        break;
+      case UnboxingInfoMetadata::kBoxed:
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+  }
+}
+
 void TypeTranslator::SetupFunctionParameters(
     const Class& klass,
     const Function& function,
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 2ece5ec..e5f6221 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -877,6 +877,8 @@
   TranslationHelper& translation_helper_;
 
  private:
+  MetadataHelper();
+
   void SetMetadataMappings(intptr_t mappings_offset, intptr_t mappings_num);
   void ScanMetadataMappings();
 
@@ -940,13 +942,15 @@
     return (cid == kDynamicCid) && (flags == kFlagNullable);
   }
   bool IsNullable() const { return (flags & kFlagNullable) != 0; }
-  bool IsInt() const { return (flags & kFlagInt) != 0; }
+  bool IsInt() const {
+    return (flags & kFlagInt) != 0 || cid == kMintCid || cid == kSmiCid;
+  }
   bool IsSkipCheck() const { return (flags & kFlagSkipCheck) != 0; }
   bool IsConstant() const { return (flags & kFlagConstant) != 0; }
   bool ReceiverNotInt() const { return (flags & kFlagReceiverNotInt) != 0; }
 
   CompileType ToCompileType(Zone* zone) const {
-    if (IsInt()) {
+    if (IsInt() && cid == kDynamicCid) {
       return CompileType::FromAbstractType(
           Type::ZoneHandle(zone, Type::IntType()), IsNullable());
     } else {
@@ -963,7 +967,8 @@
   explicit InferredTypeMetadataHelper(KernelReaderHelper* helper,
                                       ConstantReader* constant_reader);
 
-  InferredTypeMetadata GetInferredType(intptr_t node_offset);
+  InferredTypeMetadata GetInferredType(intptr_t node_offset,
+                                       bool read_constant = true);
 
  private:
   ConstantReader* constant_reader_;
@@ -1074,6 +1079,42 @@
   DISALLOW_COPY_AND_ASSIGN(TableSelectorMetadataHelper);
 };
 
+// Information about a function regarding unboxed parameters and return value.
+class UnboxingInfoMetadata : public ZoneAllocated {
+ public:
+  enum UnboxingInfoTag {
+    kBoxed = 0,
+    kUnboxedIntCandidate = 1 << 0,
+    kUnboxedDoubleCandidate = 1 << 1,
+    kUnboxingCandidate = kUnboxedIntCandidate | kUnboxedDoubleCandidate,
+  };
+
+  UnboxingInfoMetadata() : unboxed_args_info(0) { return_info = kBoxed; }
+
+  void SetArgsCount(intptr_t num_args) {
+    ASSERT(unboxed_args_info.is_empty());
+    unboxed_args_info.SetLength(num_args);
+    unboxed_args_info.FillWith(kBoxed, 0, num_args);
+  }
+
+  GrowableArray<UnboxingInfoTag> unboxed_args_info;
+  UnboxingInfoTag return_info;
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxingInfoMetadata);
+};
+
+// Helper class which provides access to unboxing information metadata.
+class UnboxingInfoMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.unboxing-info.metadata"; }
+
+  explicit UnboxingInfoMetadataHelper(KernelReaderHelper* helper);
+
+  UnboxingInfoMetadata* GetUnboxingInfoMetadata(intptr_t node_offset);
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxingInfoMetadataHelper);
+};
+
 class KernelReaderHelper {
  public:
   KernelReaderHelper(Zone* zone,
@@ -1212,6 +1253,7 @@
   friend class TableSelectorMetadataHelper;
   friend class TypeParameterHelper;
   friend class TypeTranslator;
+  friend class UnboxingInfoMetadataHelper;
   friend class VariableDeclarationHelper;
   friend class ObfuscationProhibitionsMetadataHelper;
   friend bool NeedsDynamicInvocationForwarder(const Function& function);
@@ -1371,6 +1413,7 @@
 class TypeTranslator {
  public:
   TypeTranslator(KernelReaderHelper* helper,
+                 ConstantReader* constant_reader,
                  ActiveClass* active_class,
                  bool finalize = false,
                  bool apply_legacy_erasure = false);
@@ -1398,6 +1441,9 @@
                                FunctionNodeHelper* function_node_helper);
 
  private:
+  void SetupUnboxingInfoMetadata(const Function& function,
+                                 intptr_t library_kernel_offset);
+
   void BuildTypeInternal();
   void BuildInterfaceType(bool simple);
   void BuildFunctionType(bool simple);
@@ -1430,9 +1476,12 @@
   };
 
   KernelReaderHelper* helper_;
+  ConstantReader* constant_reader_;
   TranslationHelper& translation_helper_;
   ActiveClass* const active_class_;
   TypeParameterScope* type_parameter_scope_;
+  InferredTypeMetadataHelper inferred_type_metadata_helper_;
+  UnboxingInfoMetadataHelper unboxing_info_metadata_helper_;
   Zone* zone_;
   AbstractType& result_;
   bool finalize_;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index ee1f4ee..d3367e4 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -23,10 +23,14 @@
 
 // Returns static type of the parameter if it can be trusted (was type checked
 // by caller) and dynamic otherwise.
-static CompileType ParameterType(LocalVariable* param) {
+static CompileType ParameterType(LocalVariable* param,
+                                 Representation representation = kTagged) {
   return param->was_type_checked_by_caller()
-             ? CompileType::FromAbstractType(param->type())
-             : CompileType::Dynamic();
+             ? CompileType::FromAbstractType(param->type(),
+                                             representation == kTagged)
+             : ((representation == kTagged)
+                    ? CompileType::Dynamic()
+                    : CompileType::FromCid(kDynamicCid).CopyNonNullable());
 }
 
 bool PrologueBuilder::PrologueSkippableOnUncheckedEntry(
@@ -145,6 +149,9 @@
   const int num_params =
       num_fixed_params + num_opt_pos_params + num_opt_named_params;
   ASSERT(function_.NumParameters() == num_params);
+  const intptr_t fixed_params_size =
+      FlowGraph::ParameterOffsetAt(function_, num_params, /*last_slot=*/false) -
+      num_opt_named_params - num_opt_pos_params;
 
   // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
   // where num_pos_args is the number of positional arguments passed in.
@@ -187,13 +194,44 @@
 
   // Copy mandatory parameters down.
   intptr_t param = 0;
+  intptr_t param_offset = -1;
+
+  const auto update_param_offset = [&param_offset](const Function& function,
+                                                   intptr_t param_id) {
+    if (param_id < 0) {
+      // Type arguments of Factory constructor is processed with parameters
+      param_offset++;
+      return;
+    }
+
+    // update parameter offset
+    if (function.is_unboxed_integer_parameter_at(param_id)) {
+      param_offset += compiler::target::kIntSpillFactor;
+    } else if (function.is_unboxed_double_parameter_at(param_id)) {
+      param_offset += compiler::target::kDoubleSpillFactor;
+    } else {
+      ASSERT(!function.is_unboxed_parameter_at(param_id));
+      // Tagged parameters always occupy one word
+      param_offset++;
+    }
+  };
+
   for (; param < num_fixed_params; ++param) {
+    const intptr_t param_index = param - (function_.IsFactory() ? 1 : 0);
+    update_param_offset(function_, param_index);
+
+    const auto representation =
+        ((param_index >= 0)
+             ? FlowGraph::ParameterRepresentationAt(function_, param_index)
+             : kTagged);
+
     copy_args_prologue += LoadLocal(optional_count_var);
     copy_args_prologue += LoadFpRelativeSlot(
         compiler::target::kWordSize *
             (compiler::target::frame_layout.param_end_from_fp +
-             num_fixed_params - param),
-        ParameterType(ParameterVariable(param)));
+             fixed_params_size - param_offset),
+        ParameterType(ParameterVariable(param), representation),
+        representation);
     copy_args_prologue +=
         StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
     copy_args_prologue += Drop();
@@ -203,6 +241,9 @@
   if (num_opt_pos_params > 0) {
     JoinEntryInstr* next_missing = NULL;
     for (intptr_t opt_param = 1; param < num_params; ++param, ++opt_param) {
+      const intptr_t param_index = param - (function_.IsFactory() ? 1 : 0);
+      update_param_offset(function_, param_index);
+
       TargetEntryInstr *supplied, *missing;
       copy_args_prologue += IntConstant(opt_param);
       copy_args_prologue += LoadLocal(optional_count_var);
@@ -214,7 +255,7 @@
       good += LoadFpRelativeSlot(
           compiler::target::kWordSize *
               (compiler::target::frame_layout.param_end_from_fp +
-               num_fixed_params - param),
+               fixed_params_size - param_offset),
           ParameterType(ParameterVariable(param)));
       good += StoreLocalRaw(TokenPosition::kNoSource, ParameterVariable(param));
       good += Drop();
@@ -340,9 +381,12 @@
         good += Goto(join);
       }
 
-      // We had no match, let's just load the default constant.
+      // We had no match. If the param is required, throw a NoSuchMethod error.
+      // Otherwise just load the default constant.
       Fragment not_good(missing);
-      {
+      if (FLAG_null_safety && function_.IsRequiredAt(opt_param_position[i])) {
+        not_good += Goto(nsm);
+      } else {
         not_good += Constant(
             DefaultParameterValueAt(opt_param_position[i] - num_fixed_params));
 
@@ -426,7 +470,7 @@
 
   Fragment store_type_args;
   store_type_args += LoadArgDescriptor();
-  store_type_args += LoadNativeField(Slot::ArgumentsDescriptor_count());
+  store_type_args += LoadNativeField(Slot::ArgumentsDescriptor_size());
   store_type_args += LoadFpRelativeSlot(
       compiler::target::kWordSize *
           (1 + compiler::target::frame_layout.param_end_from_fp),
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 23885c3..260c822 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -66,6 +66,7 @@
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
       procedure_attributes_metadata_helper_(&helper_),
       type_translator_(&helper_,
+                       &constant_reader_,
                        &active_class_,
                        /*finalize=*/true) {
   H.InitFromScript(helper_.script());
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 771c086..af792ff 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -154,6 +154,29 @@
   return safe_index;
 }
 
+static Definition* CreateBoxedResultIfNeeded(BlockBuilder* builder,
+                                             Definition* value,
+                                             Representation representation) {
+  const auto& function = builder->function();
+  if (function.has_unboxed_return()) {
+    return value;
+  } else {
+    return builder->AddDefinition(
+        BoxInstr::Create(representation, new Value(value)));
+  }
+}
+
+static Definition* CreateUnboxedResultIfNeeded(BlockBuilder* builder,
+                                               Definition* value) {
+  const auto& function = builder->function();
+  if (function.has_unboxed_return() && value->representation() == kTagged) {
+    return builder->AddUnboxInstr(FlowGraph::ReturnRepresentationOf(function),
+                                  new Value(value), /* is_checked = */ true);
+  } else {
+    return value;
+  }
+}
+
 static bool IntrinsifyArrayGetIndexed(FlowGraph* flow_graph,
                                       intptr_t array_cid) {
   GraphEntryInstr* graph_entry = flow_graph->graph_entry();
@@ -172,9 +195,9 @@
   }
 
   Definition* result = builder.AddDefinition(new LoadIndexedInstr(
-      new Value(array), new Value(index),
-      target::Instance::ElementSizeFor(array_cid),  // index scale
-      array_cid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      new Value(array), new Value(index), /*index_unboxed=*/false,
+      /*index_scale=*/target::Instance::ElementSizeFor(array_cid), array_cid,
+      kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
 
   // We don't perform [RangeAnalysis] for graph intrinsics. To inform the
   // following boxing instruction about a more precise range we attach it here
@@ -204,33 +227,27 @@
   switch (array_cid) {
     case kTypedDataInt32ArrayCid:
     case kExternalTypedDataInt32ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedInt32, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedInt32);
       break;
     case kTypedDataUint32ArrayCid:
     case kExternalTypedDataUint32ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedUint32, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedUint32);
       break;
     case kTypedDataFloat32ArrayCid:
       result = builder.AddDefinition(
           new FloatToDoubleInstr(new Value(result), DeoptId::kNone));
       FALL_THROUGH;
     case kTypedDataFloat64ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedDouble, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedDouble);
       break;
     case kTypedDataFloat32x4ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedFloat32x4, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedFloat32x4);
       break;
     case kTypedDataInt32x4ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedInt32x4, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedInt32x4);
       break;
     case kTypedDataFloat64x2ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedFloat64x2, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedFloat64x2);
       break;
     case kArrayCid:
     case kImmutableArrayCid:
@@ -243,21 +260,20 @@
     case kTypedDataUint16ArrayCid:
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedIntPtr, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedIntPtr);
       break;
     case kTypedDataInt64ArrayCid:
     case kTypedDataUint64ArrayCid:
-      result = builder.AddDefinition(
-          BoxInstr::Create(kUnboxedInt64, new Value(result)));
+      result = CreateBoxedResultIfNeeded(&builder, result, kUnboxedInt64);
       break;
     default:
       UNREACHABLE();
       break;
   }
-  if (clear_environment) {
+  if (result->IsBoxInteger() && clear_environment) {
     result->AsBoxInteger()->ClearEnv();
   }
+  result = CreateUnboxedResultIfNeeded(&builder, result);
   builder.AddReturn(new Value(result));
   return true;
 }
@@ -362,8 +378,9 @@
          RawObject::IsTypedDataClassId(array_cid));
   builder.AddInstruction(new StoreIndexedInstr(
       new Value(array), new Value(index), new Value(value), kNoStoreBarrier,
-      target::Instance::ElementSizeFor(array_cid),  // index scale
-      array_cid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      /*index_unboxed=*/false,
+      /*index_scale=*/target::Instance::ElementSizeFor(array_cid), array_cid,
+      kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddReturn(new Value(null_def));
@@ -497,8 +514,9 @@
   }
 
   Definition* load = builder.AddDefinition(new LoadIndexedInstr(
-      new Value(str), new Value(index), target::Instance::ElementSizeFor(cid),
-      cid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      new Value(str), new Value(index), /*index_unboxed=*/false,
+      target::Instance::ElementSizeFor(cid), cid, kAlignedAccess,
+      DeoptId::kNone, builder.TokenPos()));
 
   // We don't perform [RangeAnalysis] for graph intrinsics. To inform the
   // following boxing instruction about a more precise range we attach it here
@@ -509,8 +527,11 @@
   load->set_range(range);
 
   Definition* result =
-      builder.AddDefinition(BoxInstr::Create(kUnboxedIntPtr, new Value(load)));
-  result->AsBoxInteger()->ClearEnv();
+      CreateBoxedResultIfNeeded(&builder, load, kUnboxedIntPtr);
+
+  if (result->IsBoxInteger()) {
+    result->AsBoxInteger()->ClearEnv();
+  }
 
   builder.AddReturn(new Value(result));
   return true;
@@ -560,8 +581,8 @@
   Definition* unboxed_result = builder.AddDefinition(SimdOpInstr::Create(
       SimdOpInstr::KindForOperator(cid, kind), new Value(left_simd),
       new Value(right_simd), DeoptId::kNone));
-  Definition* result =
-      builder.AddDefinition(BoxInstr::Create(rep, new Value(unboxed_result)));
+  Definition* result = CreateBoxedResultIfNeeded(&builder, unboxed_result, rep);
+
   builder.AddReturn(new Value(result));
   return true;
 }
@@ -610,15 +631,19 @@
 
   Definition* receiver = builder.AddParameter(0, /*with_frame=*/false);
 
+  const auto& function = flow_graph->function();
   Definition* unboxed_receiver =
-      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(receiver),
-                            /* is_checked = */ true);
+      !function.is_unboxed_parameter_at(0)
+          ? builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(receiver),
+                                  /* is_checked = */ true)
+          : receiver;
 
   Definition* unboxed_result = builder.AddDefinition(
       SimdOpInstr::Create(kind, new Value(unboxed_receiver), DeoptId::kNone));
 
-  Definition* result = builder.AddDefinition(
-      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
+  Definition* result =
+      CreateBoxedResultIfNeeded(&builder, unboxed_result, kUnboxedDouble);
+
   builder.AddReturn(new Value(result));
   return true;
 }
@@ -652,6 +677,8 @@
 
   Definition* length = builder.AddDefinition(
       new LoadFieldInstr(new Value(array), field, builder.TokenPos()));
+
+  length = CreateUnboxedResultIfNeeded(&builder, length);
   builder.AddReturn(new Value(length));
   return true;
 }
@@ -695,6 +722,7 @@
       new Value(array), Slot::GrowableObjectArray_data(), builder.TokenPos()));
   Definition* capacity = builder.AddDefinition(new LoadFieldInstr(
       new Value(backing_store), Slot::Array_length(), builder.TokenPos()));
+  capacity = CreateUnboxedResultIfNeeded(&builder, capacity);
   builder.AddReturn(new Value(capacity));
   return true;
 }
@@ -714,9 +742,10 @@
       new LoadFieldInstr(new Value(growable_array),
                          Slot::GrowableObjectArray_data(), builder.TokenPos()));
   Definition* result = builder.AddDefinition(new LoadIndexedInstr(
-      new Value(backing_store), new Value(index),
-      target::Instance::ElementSizeFor(kArrayCid),  // index scale
-      kArrayCid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      new Value(backing_store), new Value(index), /*index_unboxed=*/false,
+      /*index_scale=*/target::Instance::ElementSizeFor(kArrayCid), kArrayCid,
+      kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+  result = CreateUnboxedResultIfNeeded(&builder, result);
   builder.AddReturn(new Value(result));
   return true;
 }
@@ -744,8 +773,9 @@
 
   builder.AddInstruction(new StoreIndexedInstr(
       new Value(array), new Value(index), new Value(value), kEmitStoreBarrier,
-      target::Instance::ElementSizeFor(kArrayCid),  // index scale
-      kArrayCid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      /*index_unboxed=*/false,
+      /*index_scale=*/target::Instance::ElementSizeFor(kArrayCid), kArrayCid,
+      kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddReturn(new Value(null_def));
@@ -778,9 +808,9 @@
 
   builder.AddInstruction(new StoreIndexedInstr(
       new Value(backing_store), new Value(index), new Value(value),
-      kEmitStoreBarrier,
-      target::Instance::ElementSizeFor(kArrayCid),  // index scale
-      kArrayCid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+      kEmitStoreBarrier, /*index_unboxed=*/false,
+      /*index_scale=*/target::Instance::ElementSizeFor(kArrayCid), kArrayCid,
+      kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
   builder.AddReturn(new Value(null_def));
@@ -827,6 +857,26 @@
   return true;
 }
 
+static Definition* ConvertOrUnboxDoubleParameter(BlockBuilder* builder,
+                                                 Definition* value,
+                                                 intptr_t index,
+                                                 bool is_checked) {
+  const auto& function = builder->function();
+  if (function.is_unboxed_double_parameter_at(index)) {
+    return value;
+  } else if (function.is_unboxed_integer_parameter_at(index)) {
+    if (compiler::target::kWordSize == 4) {
+      // Int64ToDoubleInstr is not implemented in 32-bit platforms
+      return nullptr;
+    }
+    auto to_double = new Int64ToDoubleInstr(new Value(value), DeoptId::kNone);
+    return builder->AddDefinition(to_double);
+  } else {
+    ASSERT(!function.is_unboxed_parameter_at(index));
+    return builder->AddUnboxInstr(kUnboxedDouble, value, is_checked);
+  }
+}
+
 bool GraphIntrinsifier::Build_DoubleFlipSignBit(FlowGraph* flow_graph) {
   if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {
     return false;
@@ -836,19 +886,22 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   Definition* receiver = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* unboxed_value =
-      builder.AddUnboxInstr(kUnboxedDouble, new Value(receiver),
-                            /* is_checked = */ true);
+  Definition* unboxed_value = ConvertOrUnboxDoubleParameter(
+      &builder, receiver, 0, /* is_checked = */ true);
+  if (unboxed_value == nullptr) {
+    return false;
+  }
   Definition* unboxed_result = builder.AddDefinition(new UnaryDoubleOpInstr(
       Token::kNEGATE, new Value(unboxed_value), DeoptId::kNone));
-  Definition* result = builder.AddDefinition(
-      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
+  Definition* result =
+      CreateBoxedResultIfNeeded(&builder, unboxed_result, kUnboxedDouble);
   builder.AddReturn(new Value(result));
   return true;
 }
 
 static bool BuildInvokeMathCFunction(BlockBuilder* builder,
                                      MethodRecognizer::Kind kind,
+                                     FlowGraph* flow_graph,
                                      intptr_t num_parameters = 1) {
   if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {
     return false;
@@ -858,17 +911,19 @@
 
   for (intptr_t i = 0; i < num_parameters; i++) {
     Definition* value = builder->AddParameter(i, /*with_frame=*/false);
-    Definition* unboxed_value =
-        builder->AddUnboxInstr(kUnboxedDouble, value, /* is_checked = */ false);
+    Definition* unboxed_value = ConvertOrUnboxDoubleParameter(
+        builder, value, i, /* is_checked = */ false);
+    if (unboxed_value == nullptr) {
+      return false;
+    }
     args->Add(new Value(unboxed_value));
   }
 
   Definition* unboxed_result =
       builder->AddDefinition(new InvokeMathCFunctionInstr(
           args, DeoptId::kNone, kind, builder->TokenPos()));
-  Definition* result = builder->AddDefinition(
-      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
-
+  Definition* result =
+      CreateBoxedResultIfNeeded(builder, unboxed_result, kUnboxedDouble);
   builder->AddReturn(new Value(result));
 
   return true;
@@ -881,7 +936,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathSin);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathSin,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathCos(FlowGraph* flow_graph) {
@@ -891,7 +947,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathCos);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathCos,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathTan(FlowGraph* flow_graph) {
@@ -901,7 +958,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathTan);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathTan,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathAsin(FlowGraph* flow_graph) {
@@ -911,7 +969,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAsin);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAsin,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathAcos(FlowGraph* flow_graph) {
@@ -921,7 +980,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAcos);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAcos,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathAtan(FlowGraph* flow_graph) {
@@ -931,7 +991,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAtan);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAtan,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_MathAtan2(FlowGraph* flow_graph) {
@@ -942,6 +1003,7 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   return BuildInvokeMathCFunction(&builder, MethodRecognizer::kMathAtan2,
+                                  flow_graph,
                                   /* num_parameters = */ 2);
 }
 
@@ -953,6 +1015,7 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleMod,
+                                  flow_graph,
                                   /* num_parameters = */ 2);
 }
 
@@ -966,7 +1029,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleCeil);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleCeil,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_DoubleFloor(FlowGraph* flow_graph) {
@@ -979,7 +1043,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleFloor);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleFloor,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_DoubleTruncate(FlowGraph* flow_graph) {
@@ -992,7 +1057,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleTruncate);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleTruncate,
+                                  flow_graph);
 }
 
 bool GraphIntrinsifier::Build_DoubleRound(FlowGraph* flow_graph) {
@@ -1002,7 +1068,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleRound);
+  return BuildInvokeMathCFunction(&builder, MethodRecognizer::kDoubleRound,
+                                  flow_graph);
 }
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index 89995fb..99d186f 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -210,6 +210,16 @@
                          recognized_methods[i].enum_name,
                          recognized_methods[i].fp);
       func.set_recognized_kind(kind);
+      switch (kind) {
+#define RECOGNIZE_METHOD(class_name, function_name, enum_name, fp)             \
+  case MethodRecognizer::k##enum_name:                                         \
+    func.reset_unboxed_parameters_and_return();                                \
+    break;
+        ALL_INTRINSICS_LIST(RECOGNIZE_METHOD)
+#undef RECOGNIZE_METHOD
+        default:
+          break;
+      }
     } else if (!FLAG_precompiled_mode) {
       FATAL2("Missing %s::%s\n", recognized_methods[i].class_name,
              recognized_methods[i].function_name);
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 072fcf4..781c353 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -300,6 +300,9 @@
 // Information about frame_layout that compiler should be targeting.
 extern FrameLayout frame_layout;
 
+constexpr intptr_t kIntSpillFactor = sizeof(int64_t) / kWordSize;
+constexpr intptr_t kDoubleSpillFactor = sizeof(double) / kWordSize;
+
 // Returns the FP-relative index where [variable] can be found (assumes
 // [variable] is not captured), in bytes.
 inline int FrameOffsetInBytesForVariable(const LocalVariable* variable) {
@@ -514,9 +517,13 @@
   static word NextFieldOffset();
 };
 
-class TypedDataBase : public AllStatic {
+class PointerBase : public AllStatic {
  public:
   static word data_field_offset();
+};
+
+class TypedDataBase : public PointerBase {
+ public:
   static word length_offset();
   static word InstanceSize();
   static word NextFieldOffset();
@@ -570,13 +577,13 @@
   static word position_offset();
   static word name_offset();
   static word count_offset();
+  static word size_offset();
   static word type_args_len_offset();
   static word positional_count_offset();
 };
 
-class Pointer : public AllStatic {
+class Pointer : public PointerBase {
  public:
-  static word c_memory_address_offset();
   static word type_arguments_offset();
   static word InstanceSize();
   static word NextFieldOffset();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 128aa14..c7b17d0 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -55,8 +55,10 @@
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     16;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    20;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 24;
+    ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -64,7 +66,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 20;
+    ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word Array_data_offset = 12;
@@ -173,9 +175,8 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     140;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
-    8;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -350,8 +351,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    4;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -410,7 +409,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 88;
+static constexpr dart::compiler::target::word Function_InstanceSize = 96;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 8;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     16;
@@ -520,8 +519,10 @@
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     32;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    40;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 48;
+    ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -529,7 +530,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 40;
+    ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word Array_data_offset = 24;
@@ -638,9 +639,9 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     280;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -817,8 +818,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    8;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -878,7 +877,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 112;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 144;
+static constexpr dart::compiler::target::word Function_InstanceSize = 152;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -987,8 +986,10 @@
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     16;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    20;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 24;
+    ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -996,7 +997,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 20;
+    ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word Array_data_offset = 12;
@@ -1105,9 +1106,8 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     140;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
-    8;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -1282,8 +1282,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    4;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -1339,7 +1337,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 88;
+static constexpr dart::compiler::target::word Function_InstanceSize = 96;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 8;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     16;
@@ -1449,8 +1447,10 @@
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     32;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    40;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 48;
+    ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -1458,7 +1458,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 40;
+    ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word Array_data_offset = 24;
@@ -1567,9 +1567,9 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     280;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -1746,8 +1746,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    8;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -1808,7 +1806,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 112;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 144;
+static constexpr dart::compiler::target::word Function_InstanceSize = 152;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -1919,8 +1917,10 @@
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     16;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    20;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 24;
+    ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -1928,7 +1928,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 20;
+    ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word Array_data_offset = 12;
@@ -2034,9 +2034,8 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     140;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
-    8;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -2211,8 +2210,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    4;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -2268,7 +2265,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 88;
+static constexpr dart::compiler::target::word Function_InstanceSize = 96;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 8;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     16;
@@ -2378,8 +2375,10 @@
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     32;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    40;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 48;
+    ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -2387,7 +2386,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 40;
+    ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word Array_data_offset = 24;
@@ -2493,9 +2492,9 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     280;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -2672,8 +2671,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    8;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -2730,7 +2727,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 112;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 144;
+static constexpr dart::compiler::target::word Function_InstanceSize = 152;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -2839,8 +2836,10 @@
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     16;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    20;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 24;
+    ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -2848,7 +2847,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 20;
+    ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word Array_data_offset = 12;
@@ -2954,9 +2953,8 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     140;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
-    8;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -3131,8 +3129,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    4;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
 static constexpr dart::compiler::target::word
@@ -3185,7 +3181,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 64;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 88;
+static constexpr dart::compiler::target::word Function_InstanceSize = 96;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 8;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     16;
@@ -3295,8 +3291,10 @@
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
     32;
+static constexpr dart::compiler::target::word ArgumentsDescriptor_size_offset =
+    40;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_first_named_entry_offset = 48;
+    ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_name_offset =
@@ -3304,7 +3302,7 @@
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    ArgumentsDescriptor_positional_count_offset = 40;
+    ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word Array_data_offset = 24;
@@ -3410,9 +3408,9 @@
 static constexpr dart::compiler::target::word ObjectStore_string_type_offset =
     280;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word Pointer_c_memory_address_offset =
+static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
-static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -3589,8 +3587,6 @@
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word TypedDataBase_data_field_offset =
-    8;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
 static constexpr dart::compiler::target::word
@@ -3648,7 +3644,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 112;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 144;
+static constexpr dart::compiler::target::word Function_InstanceSize = 152;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -3766,7 +3762,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 24;
+    AOT_ArgumentsDescriptor_size_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word
@@ -3774,7 +3772,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 20;
+    AOT_ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 12;
@@ -3888,9 +3886,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 8;
+    AOT_PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 4;
+    AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -4077,8 +4075,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
@@ -4274,7 +4270,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 48;
+    AOT_ArgumentsDescriptor_size_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word
@@ -4282,7 +4280,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 40;
+    AOT_ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 24;
@@ -4396,9 +4394,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 16;
+    AOT_PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 8;
+    AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -4586,8 +4584,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
@@ -4788,7 +4784,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 48;
+    AOT_ArgumentsDescriptor_size_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word
@@ -4796,7 +4794,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 40;
+    AOT_ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 24;
@@ -4910,9 +4908,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 16;
+    AOT_PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 8;
+    AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -5100,8 +5098,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
@@ -5302,7 +5298,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 24;
+    AOT_ArgumentsDescriptor_size_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 28;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 8;
 static constexpr dart::compiler::target::word
@@ -5310,7 +5308,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 20;
+    AOT_ArgumentsDescriptor_positional_count_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 12;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 12;
@@ -5420,9 +5418,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 8;
+    AOT_PointerBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 4;
+    AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -5609,8 +5607,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
@@ -5803,7 +5799,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 48;
+    AOT_ArgumentsDescriptor_size_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word
@@ -5811,7 +5809,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 40;
+    AOT_ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 24;
@@ -5921,9 +5919,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 16;
+    AOT_PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 8;
+    AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -6111,8 +6109,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
@@ -6310,7 +6306,9 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_count_offset = 32;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_first_named_entry_offset = 48;
+    AOT_ArgumentsDescriptor_size_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ArgumentsDescriptor_first_named_entry_offset = 56;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_named_entry_size = 16;
 static constexpr dart::compiler::target::word
@@ -6318,7 +6316,7 @@
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_position_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_ArgumentsDescriptor_positional_count_offset = 40;
+    AOT_ArgumentsDescriptor_positional_count_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_ArgumentsDescriptor_type_args_len_offset = 24;
 static constexpr dart::compiler::target::word AOT_Array_data_offset = 24;
@@ -6428,9 +6426,9 @@
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_c_memory_address_offset = 16;
+    AOT_PointerBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Pointer_type_arguments_offset = 8;
+    AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_SingleTargetCache_entry_point_offset = 16;
 static constexpr dart::compiler::target::word
@@ -6618,8 +6616,6 @@
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_TypedDataBase_data_field_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
 static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index a8b30c3..b582be9 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -51,6 +51,7 @@
   CONSTANT(SubtypeTestCache, kTestResult)                                      \
   FIELD(AbstractType, type_test_stub_entry_point_offset)                       \
   FIELD(ArgumentsDescriptor, count_offset)                                     \
+  FIELD(ArgumentsDescriptor, size_offset)                                      \
   FIELD(ArgumentsDescriptor, first_named_entry_offset)                         \
   FIELD(ArgumentsDescriptor, named_entry_size)                                 \
   FIELD(ArgumentsDescriptor, name_offset)                                      \
@@ -132,7 +133,7 @@
   FIELD(ObjectStore, int_type_offset)                                          \
   FIELD(ObjectStore, string_type_offset)                                       \
   FIELD(OneByteString, data_offset)                                            \
-  FIELD(Pointer, c_memory_address_offset)                                      \
+  FIELD(PointerBase, data_field_offset)                                        \
   FIELD(Pointer, type_arguments_offset)                                        \
   FIELD(SingleTargetCache, entry_point_offset)                                 \
   FIELD(SingleTargetCache, lower_limit_offset)                                 \
@@ -236,7 +237,6 @@
   FIELD(Type, nullability_offset)                                              \
   FIELD(TypeArguments, instantiations_offset)                                  \
   FIELD(TypeRef, type_offset)                                                  \
-  FIELD(TypedDataBase, data_field_offset)                                      \
   FIELD(TypedDataBase, length_offset)                                          \
   FIELD(TypedDataView, data_offset)                                            \
   FIELD(TypedDataView, offset_in_bytes_offset)                                 \
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 289ae62..956ddd6 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -441,6 +441,7 @@
                  /*external=*/false,
                  /*array_cid=*/kArrayCid,
                  /*index_scale, smi-tagged=*/compiler::target::kWordSize * 2,
+                 /*index_unboxed=*/false,
                  /*array=*/R5,
                  /*index=*/R4));
   __ LoadFieldFromOffset(kWord, R5, R5,
@@ -972,7 +973,7 @@
   __ b(call_target_function, NE);
   __ EnterStubFrame();
   // Load the receiver.
-  __ ldr(R2, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
+  __ ldr(R2, FieldAddress(R4, target::ArgumentsDescriptor::size_offset()));
   __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
   __ ldr(R8, Address(IP, target::frame_layout.param_end_from_fp *
                              target::kWordSize));
@@ -1003,7 +1004,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ ldr(R2, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
+  __ ldr(R2, FieldAddress(R4, target::ArgumentsDescriptor::size_offset()));
   __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
   __ ldr(R8, Address(IP, target::frame_layout.param_end_from_fp *
                              target::kWordSize));
@@ -1045,106 +1046,106 @@
 //   R2: array length as Smi (must be preserved).
 // The newly allocated object is returned in R0.
 void StubCodeCompiler::GenerateAllocateArrayStub(Assembler* assembler) {
-  Label slow_case;
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize(
-  //     (array_length * kwordSize) + target::Array::header_size()).
-  __ mov(R3, Operand(R2));  // Array length.
-  // Check that length is a positive Smi.
-  __ tst(R3, Operand(kSmiTagMask));
-  if (FLAG_use_slow_path) {
-    __ b(&slow_case);
-  } else {
+  if (!FLAG_use_slow_path) {
+    Label slow_case;
+    // Compute the size to be allocated, it is based on the array length
+    // and is computed as:
+    // RoundedAllocationSize(
+    //     (array_length * kwordSize) + target::Array::header_size()).
+    __ mov(R3, Operand(R2));  // Array length.
+    // Check that length is a positive Smi.
+    __ tst(R3, Operand(kSmiTagMask));
     __ b(&slow_case, NE);
+
+    __ cmp(R3, Operand(0));
+    __ b(&slow_case, LT);
+
+    // Check for maximum allowed length.
+    const intptr_t max_len =
+        target::ToRawSmi(target::Array::kMaxNewSpaceElements);
+    __ CompareImmediate(R3, max_len);
+    __ b(&slow_case, GT);
+
+    const intptr_t cid = kArrayCid;
+    NOT_IN_PRODUCT(__ LoadAllocationStatsAddress(R4, cid));
+    NOT_IN_PRODUCT(__ MaybeTraceAllocation(R4, &slow_case));
+
+    const intptr_t fixed_size_plus_alignment_padding =
+        target::Array::header_size() +
+        target::ObjectAlignment::kObjectAlignment - 1;
+    __ LoadImmediate(R9, fixed_size_plus_alignment_padding);
+    __ add(R9, R9, Operand(R3, LSL, 1));  // R3 is a Smi.
+    ASSERT(kSmiTagShift == 1);
+    __ bic(R9, R9, Operand(target::ObjectAlignment::kObjectAlignment - 1));
+
+    // R9: Allocation size.
+    // Potential new object start.
+    __ ldr(R0, Address(THR, target::Thread::top_offset()));
+    __ adds(R3, R0, Operand(R9));  // Potential next object start.
+    __ b(&slow_case, CS);          // Branch if unsigned overflow.
+
+    // Check if the allocation fits into the remaining space.
+    // R0: potential new object start.
+    // R3: potential next object start.
+    // R9: allocation size.
+    __ ldr(TMP, Address(THR, target::Thread::end_offset()));
+    __ cmp(R3, Operand(TMP));
+    __ b(&slow_case, CS);
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    __ str(R3, Address(THR, target::Thread::top_offset()));
+    __ add(R0, R0, Operand(kHeapObjectTag));
+
+    // Initialize the tags.
+    // R0: new object start as a tagged pointer.
+    // R3: new object end address.
+    // R9: allocation size.
+    {
+      const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+                             target::ObjectAlignment::kObjectAlignmentLog2;
+
+      __ CompareImmediate(R9, target::RawObject::kSizeTagMaxSizeTag);
+      __ mov(R8, Operand(R9, LSL, shift), LS);
+      __ mov(R8, Operand(0), HI);
+
+      // Get the class index and insert it into the tags.
+      // R8: size and bit tags.
+      const uint32_t tags =
+          target::MakeTagWordForNewSpaceObject(cid, /*instance_size=*/0);
+      __ LoadImmediate(TMP, tags);
+      __ orr(R8, R8, Operand(TMP));
+      __ str(R8,
+             FieldAddress(R0, target::Array::tags_offset()));  // Store tags.
+    }
+
+    // R0: new object start as a tagged pointer.
+    // R3: new object end address.
+    // Store the type argument field.
+    __ StoreIntoObjectNoBarrier(
+        R0, FieldAddress(R0, target::Array::type_arguments_offset()), R1);
+
+    // Set the length field.
+    __ StoreIntoObjectNoBarrier(
+        R0, FieldAddress(R0, target::Array::length_offset()), R2);
+
+    // Initialize all array elements to raw_null.
+    // R0: new object start as a tagged pointer.
+    // R8, R9: null
+    // R4: iterator which initially points to the start of the variable
+    // data area to be initialized.
+    // R3: new object end address.
+    // R9: allocation size.
+
+    __ LoadObject(R8, NullObject());
+    __ mov(R9, Operand(R8));
+    __ AddImmediate(R4, R0, target::Array::header_size() - kHeapObjectTag);
+    __ InitializeFieldsNoBarrier(R0, R4, R3, R8, R9);
+    __ Ret();  // Returns the newly allocated object in R0.
+    // Unable to allocate the array using the fast inline code, just call
+    // into the runtime.
+    __ Bind(&slow_case);
   }
-  __ cmp(R3, Operand(0));
-  __ b(&slow_case, LT);
-
-  // Check for maximum allowed length.
-  const intptr_t max_len =
-      target::ToRawSmi(target::Array::kMaxNewSpaceElements);
-  __ CompareImmediate(R3, max_len);
-  __ b(&slow_case, GT);
-
-  const intptr_t cid = kArrayCid;
-  NOT_IN_PRODUCT(__ LoadAllocationStatsAddress(R4, cid));
-  NOT_IN_PRODUCT(__ MaybeTraceAllocation(R4, &slow_case));
-
-  const intptr_t fixed_size_plus_alignment_padding =
-      target::Array::header_size() + target::ObjectAlignment::kObjectAlignment -
-      1;
-  __ LoadImmediate(R9, fixed_size_plus_alignment_padding);
-  __ add(R9, R9, Operand(R3, LSL, 1));  // R3 is a Smi.
-  ASSERT(kSmiTagShift == 1);
-  __ bic(R9, R9, Operand(target::ObjectAlignment::kObjectAlignment - 1));
-
-  // R9: Allocation size.
-  // Potential new object start.
-  __ ldr(R0, Address(THR, target::Thread::top_offset()));
-  __ adds(R3, R0, Operand(R9));     // Potential next object start.
-  __ b(&slow_case, CS);             // Branch if unsigned overflow.
-
-  // Check if the allocation fits into the remaining space.
-  // R0: potential new object start.
-  // R3: potential next object start.
-  // R9: allocation size.
-  __ ldr(TMP, Address(THR, target::Thread::end_offset()));
-  __ cmp(R3, Operand(TMP));
-  __ b(&slow_case, CS);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ str(R3, Address(THR, target::Thread::top_offset()));
-  __ add(R0, R0, Operand(kHeapObjectTag));
-
-  // Initialize the tags.
-  // R0: new object start as a tagged pointer.
-  // R3: new object end address.
-  // R9: allocation size.
-  {
-    const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
-                           target::ObjectAlignment::kObjectAlignmentLog2;
-
-    __ CompareImmediate(R9, target::RawObject::kSizeTagMaxSizeTag);
-    __ mov(R8, Operand(R9, LSL, shift), LS);
-    __ mov(R8, Operand(0), HI);
-
-    // Get the class index and insert it into the tags.
-    // R8: size and bit tags.
-    const uint32_t tags =
-        target::MakeTagWordForNewSpaceObject(cid, /*instance_size=*/0);
-    __ LoadImmediate(TMP, tags);
-    __ orr(R8, R8, Operand(TMP));
-    __ str(R8, FieldAddress(R0, target::Array::tags_offset()));  // Store tags.
-  }
-
-  // R0: new object start as a tagged pointer.
-  // R3: new object end address.
-  // Store the type argument field.
-  __ StoreIntoObjectNoBarrier(
-      R0, FieldAddress(R0, target::Array::type_arguments_offset()), R1);
-
-  // Set the length field.
-  __ StoreIntoObjectNoBarrier(
-      R0, FieldAddress(R0, target::Array::length_offset()), R2);
-
-  // Initialize all array elements to raw_null.
-  // R0: new object start as a tagged pointer.
-  // R8, R9: null
-  // R4: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  // R3: new object end address.
-  // R9: allocation size.
-
-  __ LoadObject(R8, NullObject());
-  __ mov(R9, Operand(R8));
-  __ AddImmediate(R4, R0, target::Array::header_size() - kHeapObjectTag);
-  __ InitializeFieldsNoBarrier(R0, R4, R3, R8, R9);
-  __ Ret();  // Returns the newly allocated object in R0.
-  // Unable to allocate the array using the fast inline code, just call
-  // into the runtime.
-  __ Bind(&slow_case);
 
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
@@ -1512,11 +1513,7 @@
   // R3: potential next object start.
   __ ldr(IP, Address(THR, target::Thread::end_offset()));
   __ cmp(R3, Operand(IP));
-  if (FLAG_use_slow_path) {
-    __ b(slow_case);
-  } else {
-    __ b(slow_case, CS);  // Branch if unsigned higher or equal.
-  }
+  __ b(slow_case, CS);  // Branch if unsigned higher or equal.
 
   // Successfully allocated the object, now update top to point to
   // next object start and initialize the object.
@@ -1564,7 +1561,7 @@
 // Clobbered:
 //   Potentially any since is can go to runtime.
 void StubCodeCompiler::GenerateAllocateContextStub(Assembler* assembler) {
-  if (FLAG_inline_alloc) {
+  if (!FLAG_use_slow_path && FLAG_inline_alloc) {
     Label slow_case;
 
     GenerateAllocateContext(assembler, &slow_case);
@@ -1916,7 +1913,7 @@
   ASSERT(instance_size % target::ObjectAlignment::kObjectAlignment == 0);
 
   __ LoadObject(kNullReg, NullObject());
-  if (FLAG_inline_alloc &&
+  if (!FLAG_use_slow_path && FLAG_inline_alloc &&
       target::Heap::IsAllocatableInNewSpace(instance_size) &&
       !target::Class::TraceAllocation(cls)) {
     Label slow_case;
@@ -1929,11 +1926,8 @@
     __ ldrd(kInstanceReg, kEndReg, THR, target::Thread::top_offset());
     __ AddImmediate(kEndOfInstanceReg, kInstanceReg, instance_size);
     __ cmp(kEndOfInstanceReg, Operand(kEndReg));
-    if (FLAG_use_slow_path) {
-      __ b(&slow_case);
-    } else {
-      __ b(&slow_case, CS);  // Unsigned higher or equal.
-    }
+    __ b(&slow_case, CS);  // Unsigned higher or equal.
+
     __ str(kEndOfInstanceReg, Address(THR, target::Thread::top_offset()));
 
     // Set the tags.
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 70fc396..de4c47a 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -409,6 +409,7 @@
                  /*external=*/false,
                  /*array_cid=*/kArrayCid,
                  /*index, smi-tagged=*/compiler::target::kWordSize * 2,
+                 /*index_unboxed=*/false,
                  /*array=*/R9,
                  /*index=*/R8,
                  /*temp=*/TMP));
@@ -1036,7 +1037,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::size_offset());
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
   __ LoadFromOffset(R6, TMP,
                     target::frame_layout.param_end_from_fp * target::kWordSize);
@@ -1066,7 +1067,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::size_offset());
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
   __ LoadFromOffset(R6, TMP,
                     target::frame_layout.param_end_from_fp * target::kWordSize);
@@ -1115,124 +1116,124 @@
 // NOTE: R2 cannot be clobbered here as the caller relies on it being saved.
 // The newly allocated object is returned in R0.
 void StubCodeCompiler::GenerateAllocateArrayStub(Assembler* assembler) {
-  Label slow_case;
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize(
-  //     (array_length * kwordSize) + target::Array::header_size()).
-  // Assert that length is a Smi.
-  __ tsti(R2, Immediate(kSmiTagMask));
-  if (FLAG_use_slow_path) {
-    __ b(&slow_case);
-  } else {
+  if (!FLAG_use_slow_path) {
+    Label slow_case;
+    // Compute the size to be allocated, it is based on the array length
+    // and is computed as:
+    // RoundedAllocationSize(
+    //     (array_length * kwordSize) + target::Array::header_size()).
+    // Assert that length is a Smi.
+    __ tsti(R2, Immediate(kSmiTagMask));
     __ b(&slow_case, NE);
+
+    __ cmp(R2, Operand(0));
+    __ b(&slow_case, LT);
+
+    // Check for maximum allowed length.
+    const intptr_t max_len =
+        target::ToRawSmi(target::Array::kMaxNewSpaceElements);
+    __ CompareImmediate(R2, max_len);
+    __ b(&slow_case, GT);
+
+    const intptr_t cid = kArrayCid;
+    NOT_IN_PRODUCT(__ MaybeTraceAllocation(kArrayCid, R4, &slow_case));
+
+    // Calculate and align allocation size.
+    // Load new object start and calculate next object start.
+    // R1: array element type.
+    // R2: array length as Smi.
+    __ ldr(R0, Address(THR, target::Thread::top_offset()));
+    intptr_t fixed_size_plus_alignment_padding =
+        target::Array::header_size() +
+        target::ObjectAlignment::kObjectAlignment - 1;
+    __ LoadImmediate(R3, fixed_size_plus_alignment_padding);
+    __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
+    ASSERT(kSmiTagShift == 1);
+    __ andi(R3, R3,
+            Immediate(~(target::ObjectAlignment::kObjectAlignment - 1)));
+    // R0: potential new object start.
+    // R3: object size in bytes.
+    __ adds(R7, R3, Operand(R0));
+    __ b(&slow_case, CS);  // Branch if unsigned overflow.
+
+    // Check if the allocation fits into the remaining space.
+    // R0: potential new object start.
+    // R1: array element type.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: potential next object start.
+    __ LoadFromOffset(TMP, THR, target::Thread::end_offset());
+    __ CompareRegisters(R7, TMP);
+    __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    // R0: potential new object start.
+    // R3: array size.
+    // R7: potential next object start.
+    __ str(R7, Address(THR, target::Thread::top_offset()));
+    __ add(R0, R0, Operand(kHeapObjectTag));
+
+    // R0: new object start as a tagged pointer.
+    // R1: array element type.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: new object end address.
+
+    // Store the type argument field.
+    __ StoreIntoObjectOffsetNoBarrier(
+        R0, target::Array::type_arguments_offset(), R1);
+
+    // Set the length field.
+    __ StoreIntoObjectOffsetNoBarrier(R0, target::Array::length_offset(), R2);
+
+    // Calculate the size tag.
+    // R0: new object start as a tagged pointer.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: new object end address.
+    const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
+                           target::ObjectAlignment::kObjectAlignmentLog2;
+    __ CompareImmediate(R3, target::RawObject::kSizeTagMaxSizeTag);
+    // If no size tag overflow, shift R1 left, else set R1 to zero.
+    __ LslImmediate(TMP, R3, shift);
+    __ csel(R1, TMP, R1, LS);
+    __ csel(R1, ZR, R1, HI);
+
+    // Get the class index and insert it into the tags.
+    const uint32_t tags =
+        target::MakeTagWordForNewSpaceObject(cid, /*instance_size=*/0);
+
+    __ LoadImmediate(TMP, tags);
+    __ orr(R1, R1, Operand(TMP));
+    __ StoreFieldToOffset(R1, R0, target::Array::tags_offset());
+
+    // Initialize all array elements to raw_null.
+    // R0: new object start as a tagged pointer.
+    // R7: new object end address.
+    // R2: array length as Smi.
+    __ AddImmediate(R1, R0, target::Array::data_offset() - kHeapObjectTag);
+    // R1: iterator which initially points to the start of the variable
+    // data area to be initialized.
+    Label loop, done;
+    __ Bind(&loop);
+    // TODO(cshapiro): StoreIntoObjectNoBarrier
+    __ CompareRegisters(R1, R7);
+    __ b(&done, CS);
+    __ str(NULL_REG, Address(R1));  // Store if unsigned lower.
+    __ AddImmediate(R1, target::kWordSize);
+    __ b(&loop);  // Loop until R1 == R7.
+    __ Bind(&done);
+
+    // Done allocating and initializing the array.
+    // R0: new object.
+    // R2: array length as Smi (preserved for the caller.)
+    __ ret();
+
+    // Unable to allocate the array using the fast inline code, just call
+    // into the runtime.
+    __ Bind(&slow_case);
   }
-  __ cmp(R2, Operand(0));
-  __ b(&slow_case, LT);
-
-  // Check for maximum allowed length.
-  const intptr_t max_len =
-      target::ToRawSmi(target::Array::kMaxNewSpaceElements);
-  __ CompareImmediate(R2, max_len);
-  __ b(&slow_case, GT);
-
-  const intptr_t cid = kArrayCid;
-  NOT_IN_PRODUCT(__ MaybeTraceAllocation(kArrayCid, R4, &slow_case));
-
-  // Calculate and align allocation size.
-  // Load new object start and calculate next object start.
-  // R1: array element type.
-  // R2: array length as Smi.
-  __ ldr(R0, Address(THR, target::Thread::top_offset()));
-  intptr_t fixed_size_plus_alignment_padding =
-      target::Array::header_size() + target::ObjectAlignment::kObjectAlignment -
-      1;
-  __ LoadImmediate(R3, fixed_size_plus_alignment_padding);
-  __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
-  ASSERT(kSmiTagShift == 1);
-  __ andi(R3, R3, Immediate(~(target::ObjectAlignment::kObjectAlignment - 1)));
-  // R0: potential new object start.
-  // R3: object size in bytes.
-  __ adds(R7, R3, Operand(R0));
-  __ b(&slow_case, CS);  // Branch if unsigned overflow.
-
-  // Check if the allocation fits into the remaining space.
-  // R0: potential new object start.
-  // R1: array element type.
-  // R2: array length as Smi.
-  // R3: array size.
-  // R7: potential next object start.
-  __ LoadFromOffset(TMP, THR, target::Thread::end_offset());
-  __ CompareRegisters(R7, TMP);
-  __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  // R0: potential new object start.
-  // R3: array size.
-  // R7: potential next object start.
-  __ str(R7, Address(THR, target::Thread::top_offset()));
-  __ add(R0, R0, Operand(kHeapObjectTag));
-
-  // R0: new object start as a tagged pointer.
-  // R1: array element type.
-  // R2: array length as Smi.
-  // R3: array size.
-  // R7: new object end address.
-
-  // Store the type argument field.
-  __ StoreIntoObjectOffsetNoBarrier(R0, target::Array::type_arguments_offset(),
-                                    R1);
-
-  // Set the length field.
-  __ StoreIntoObjectOffsetNoBarrier(R0, target::Array::length_offset(), R2);
-
-  // Calculate the size tag.
-  // R0: new object start as a tagged pointer.
-  // R2: array length as Smi.
-  // R3: array size.
-  // R7: new object end address.
-  const intptr_t shift = target::RawObject::kTagBitsSizeTagPos -
-                         target::ObjectAlignment::kObjectAlignmentLog2;
-  __ CompareImmediate(R3, target::RawObject::kSizeTagMaxSizeTag);
-  // If no size tag overflow, shift R1 left, else set R1 to zero.
-  __ LslImmediate(TMP, R3, shift);
-  __ csel(R1, TMP, R1, LS);
-  __ csel(R1, ZR, R1, HI);
-
-  // Get the class index and insert it into the tags.
-  const uint32_t tags =
-      target::MakeTagWordForNewSpaceObject(cid, /*instance_size=*/0);
-
-  __ LoadImmediate(TMP, tags);
-  __ orr(R1, R1, Operand(TMP));
-  __ StoreFieldToOffset(R1, R0, target::Array::tags_offset());
-
-  // Initialize all array elements to raw_null.
-  // R0: new object start as a tagged pointer.
-  // R7: new object end address.
-  // R2: array length as Smi.
-  __ AddImmediate(R1, R0, target::Array::data_offset() - kHeapObjectTag);
-  // R1: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  Label loop, done;
-  __ Bind(&loop);
-  // TODO(cshapiro): StoreIntoObjectNoBarrier
-  __ CompareRegisters(R1, R7);
-  __ b(&done, CS);
-  __ str(NULL_REG, Address(R1));  // Store if unsigned lower.
-  __ AddImmediate(R1, target::kWordSize);
-  __ b(&loop);  // Loop until R1 == R7.
-  __ Bind(&done);
-
-  // Done allocating and initializing the array.
-  // R0: new object.
-  // R2: array length as Smi (preserved for the caller.)
-  __ ret();
-
-  // Unable to allocate the array using the fast inline code, just call
-  // into the runtime.
-  __ Bind(&slow_case);
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -1612,11 +1613,7 @@
   // R3: potential next object start.
   __ ldr(TMP, Address(THR, target::Thread::end_offset()));
   __ CompareRegisters(R3, TMP);
-  if (FLAG_use_slow_path) {
-    __ b(slow_case);
-  } else {
-    __ b(slow_case, CS);  // Branch if unsigned higher or equal.
-  }
+  __ b(slow_case, CS);  // Branch if unsigned higher or equal.
 
   // Successfully allocated the object, now update top to point to
   // next object start and initialize the object.
@@ -1662,7 +1659,7 @@
 // Clobbered:
 //   R2, R3, R4, TMP
 void StubCodeCompiler::GenerateAllocateContextStub(Assembler* assembler) {
-  if (FLAG_inline_alloc) {
+  if (!FLAG_use_slow_path && FLAG_inline_alloc) {
     Label slow_case;
 
     GenerateAllocateContextSpaceStub(assembler, &slow_case);
@@ -2105,7 +2102,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
+  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::size_offset());
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
   __ LoadFromOffset(R6, TMP,
                     target::frame_layout.param_end_from_fp * target::kWordSize);
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 92fd2ca..fbf88cc 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -258,6 +258,7 @@
                    /*external=*/false,
                    /*array_cid=*/kArrayCid,
                    /*index, smi-tagged=*/compiler::target::kWordSize * 2,
+                   /*index_unboxed=*/false,
                    /*array=*/ECX,
                    /*index=*/EAX));
   __ movl(ECX, compiler::FieldAddress(
@@ -710,7 +711,7 @@
   __ j(NOT_EQUAL, call_target_function);
   __ EnterStubFrame();
   // Load the receiver.
-  __ movl(EDI, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
+  __ movl(EDI, FieldAddress(EDX, target::ArgumentsDescriptor::size_offset()));
   __ movl(EAX,
           Address(EBP, EDI, TIMES_HALF_WORD_SIZE,
                   target::frame_layout.param_end_from_fp * target::kWordSize));
@@ -743,7 +744,7 @@
   __ EnterStubFrame();
   // Load the receiver into EAX.  The argument count in the arguments
   // descriptor in EDX is a smi.
-  __ movl(EAX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
+  __ movl(EAX, FieldAddress(EDX, target::ArgumentsDescriptor::size_offset()));
   // Two words (saved fp, stub's pc marker) in the stack above the return
   // address.
   __ movl(EAX, Address(ESP, EAX, TIMES_2, 2 * target::kWordSize));
@@ -789,114 +790,113 @@
   // Assert that length is a Smi.
   __ testl(EDX, Immediate(kSmiTagMask));
 
-  if (FLAG_use_slow_path) {
-    __ jmp(&slow_case);
-  } else {
+  if (!FLAG_use_slow_path) {
     __ j(NOT_ZERO, &slow_case);
-  }
-  __ cmpl(EDX, Immediate(0));
-  __ j(LESS, &slow_case);
 
-  // Check for maximum allowed length.
-  const Immediate& max_len =
-      Immediate(target::ToRawSmi(target::Array::kMaxNewSpaceElements));
-  __ cmpl(EDX, max_len);
-  __ j(GREATER, &slow_case);
+    __ cmpl(EDX, Immediate(0));
+    __ j(LESS, &slow_case);
 
-  NOT_IN_PRODUCT(
-      __ MaybeTraceAllocation(kArrayCid, EAX, &slow_case, Assembler::kFarJump));
+    // Check for maximum allowed length.
+    const Immediate& max_len =
+        Immediate(target::ToRawSmi(target::Array::kMaxNewSpaceElements));
+    __ cmpl(EDX, max_len);
+    __ j(GREATER, &slow_case);
 
-  const intptr_t fixed_size_plus_alignment_padding =
-      target::Array::header_size() + target::ObjectAlignment::kObjectAlignment -
-      1;
-  // EDX is Smi.
-  __ leal(EBX, Address(EDX, TIMES_2, fixed_size_plus_alignment_padding));
-  ASSERT(kSmiTagShift == 1);
-  __ andl(EBX, Immediate(-target::ObjectAlignment::kObjectAlignment));
+    NOT_IN_PRODUCT(__ MaybeTraceAllocation(kArrayCid, EAX, &slow_case,
+                                           Assembler::kFarJump));
 
-  // ECX: array element type.
-  // EDX: array length as Smi.
-  // EBX: allocation size.
+    const intptr_t fixed_size_plus_alignment_padding =
+        target::Array::header_size() +
+        target::ObjectAlignment::kObjectAlignment - 1;
+    // EDX is Smi.
+    __ leal(EBX, Address(EDX, TIMES_2, fixed_size_plus_alignment_padding));
+    ASSERT(kSmiTagShift == 1);
+    __ andl(EBX, Immediate(-target::ObjectAlignment::kObjectAlignment));
 
-  const intptr_t cid = kArrayCid;
-  __ movl(EAX, Address(THR, target::Thread::top_offset()));
-  __ addl(EBX, EAX);
-  __ j(CARRY, &slow_case);
+    // ECX: array element type.
+    // EDX: array length as Smi.
+    // EBX: allocation size.
 
-  // Check if the allocation fits into the remaining space.
-  // EAX: potential new object start.
-  // EBX: potential next object start.
-  // ECX: array element type.
-  // EDX: array length as Smi).
-  __ cmpl(EBX, Address(THR, target::Thread::end_offset()));
-  __ j(ABOVE_EQUAL, &slow_case);
+    const intptr_t cid = kArrayCid;
+    __ movl(EAX, Address(THR, target::Thread::top_offset()));
+    __ addl(EBX, EAX);
+    __ j(CARRY, &slow_case);
 
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ movl(Address(THR, target::Thread::top_offset()), EBX);
-  __ subl(EBX, EAX);
-  __ addl(EAX, Immediate(kHeapObjectTag));
+    // Check if the allocation fits into the remaining space.
+    // EAX: potential new object start.
+    // EBX: potential next object start.
+    // ECX: array element type.
+    // EDX: array length as Smi).
+    __ cmpl(EBX, Address(THR, target::Thread::end_offset()));
+    __ j(ABOVE_EQUAL, &slow_case);
 
-  // Initialize the tags.
-  // EAX: new object start as a tagged pointer.
-  // EBX: allocation size.
-  // ECX: array element type.
-  // EDX: array length as Smi.
-  {
-    Label size_tag_overflow, done;
-    __ movl(EDI, EBX);
-    __ cmpl(EDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
-    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
-                           target::ObjectAlignment::kObjectAlignmentLog2));
-    __ jmp(&done, Assembler::kNearJump);
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    __ movl(Address(THR, target::Thread::top_offset()), EBX);
+    __ subl(EBX, EAX);
+    __ addl(EAX, Immediate(kHeapObjectTag));
 
-    __ Bind(&size_tag_overflow);
-    __ movl(EDI, Immediate(0));
+    // Initialize the tags.
+    // EAX: new object start as a tagged pointer.
+    // EBX: allocation size.
+    // ECX: array element type.
+    // EDX: array length as Smi.
+    {
+      Label size_tag_overflow, done;
+      __ movl(EDI, EBX);
+      __ cmpl(EDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+      __ shll(EDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+                             target::ObjectAlignment::kObjectAlignmentLog2));
+      __ jmp(&done, Assembler::kNearJump);
+
+      __ Bind(&size_tag_overflow);
+      __ movl(EDI, Immediate(0));
+      __ Bind(&done);
+
+      // Get the class index and insert it into the tags.
+      uint32_t tags = target::MakeTagWordForNewSpaceObject(cid, 0);
+      __ orl(EDI, Immediate(tags));
+      __ movl(FieldAddress(EAX, target::Object::tags_offset()), EDI);  // Tags.
+    }
+    // EAX: new object start as a tagged pointer.
+    // EBX: allocation size.
+    // ECX: array element type.
+    // EDX: Array length as Smi (preserved).
+    // Store the type argument field.
+    // No generational barrier needed, since we store into a new object.
+    __ StoreIntoObjectNoBarrier(
+        EAX, FieldAddress(EAX, target::Array::type_arguments_offset()), ECX);
+
+    // Set the length field.
+    __ StoreIntoObjectNoBarrier(
+        EAX, FieldAddress(EAX, target::Array::length_offset()), EDX);
+
+    // Initialize all array elements to raw_null.
+    // EAX: new object start as a tagged pointer.
+    // EBX: allocation size.
+    // EDI: iterator which initially points to the start of the variable
+    // data area to be initialized.
+    // ECX: array element type.
+    // EDX: array length as Smi.
+    __ leal(EBX, FieldAddress(EAX, EBX, TIMES_1, 0));
+    __ leal(EDI, FieldAddress(EAX, target::Array::header_size()));
+    Label done;
+    Label init_loop;
+    __ Bind(&init_loop);
+    __ cmpl(EDI, EBX);
+    __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
+    // No generational barrier needed, since we are storing null.
+    __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), NullObject());
+    __ addl(EDI, Immediate(target::kWordSize));
+    __ jmp(&init_loop, Assembler::kNearJump);
     __ Bind(&done);
+    __ ret();  // returns the newly allocated object in EAX.
 
-    // Get the class index and insert it into the tags.
-    uint32_t tags = target::MakeTagWordForNewSpaceObject(cid, 0);
-    __ orl(EDI, Immediate(tags));
-    __ movl(FieldAddress(EAX, target::Object::tags_offset()), EDI);  // Tags.
+    // Unable to allocate the array using the fast inline code, just call
+    // into the runtime.
+    __ Bind(&slow_case);
   }
-  // EAX: new object start as a tagged pointer.
-  // EBX: allocation size.
-  // ECX: array element type.
-  // EDX: Array length as Smi (preserved).
-  // Store the type argument field.
-  // No generational barrier needed, since we store into a new object.
-  __ StoreIntoObjectNoBarrier(
-      EAX, FieldAddress(EAX, target::Array::type_arguments_offset()), ECX);
-
-  // Set the length field.
-  __ StoreIntoObjectNoBarrier(
-      EAX, FieldAddress(EAX, target::Array::length_offset()), EDX);
-
-  // Initialize all array elements to raw_null.
-  // EAX: new object start as a tagged pointer.
-  // EBX: allocation size.
-  // EDI: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  // ECX: array element type.
-  // EDX: array length as Smi.
-  __ leal(EBX, FieldAddress(EAX, EBX, TIMES_1, 0));
-  __ leal(EDI, FieldAddress(EAX, target::Array::header_size()));
-  Label done;
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ cmpl(EDI, EBX);
-  __ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
-  // No generational barrier needed, since we are storing null.
-  __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), NullObject());
-  __ addl(EDI, Immediate(target::kWordSize));
-  __ jmp(&init_loop, Assembler::kNearJump);
-  __ Bind(&done);
-  __ ret();  // returns the newly allocated object in EAX.
-
-  // Unable to allocate the array using the fast inline code, just call
-  // into the runtime.
-  __ Bind(&slow_case);
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -1197,53 +1197,49 @@
   // EBX: potential next object start.
   // EDX: number of context variables.
   __ cmpl(EBX, Address(THR, target::Thread::end_offset()));
-  if (FLAG_use_slow_path) {
-    __ jmp(slow_case);
-  } else {
 #if defined(DEBUG)
     static const bool kJumpLength = Assembler::kFarJump;
 #else
     static const bool kJumpLength = Assembler::kNearJump;
 #endif  // DEBUG
     __ j(ABOVE_EQUAL, slow_case, kJumpLength);
-  }
 
-  // Successfully allocated the object, now update top to point to
-  // next object start and initialize the object.
-  // EAX: new object.
-  // EBX: next object start.
-  // EDX: number of context variables.
-  __ movl(Address(THR, target::Thread::top_offset()), EBX);
-  // EBX: Size of allocation in bytes.
-  __ subl(EBX, EAX);
-  __ addl(EAX, Immediate(kHeapObjectTag));
-  // Generate isolate-independent code to allow sharing between isolates.
+    // Successfully allocated the object, now update top to point to
+    // next object start and initialize the object.
+    // EAX: new object.
+    // EBX: next object start.
+    // EDX: number of context variables.
+    __ movl(Address(THR, target::Thread::top_offset()), EBX);
+    // EBX: Size of allocation in bytes.
+    __ subl(EBX, EAX);
+    __ addl(EAX, Immediate(kHeapObjectTag));
+    // Generate isolate-independent code to allow sharing between isolates.
 
-  // Calculate the size tag.
-  // EAX: new object.
-  // EDX: number of context variables.
-  {
-    Label size_tag_overflow, done;
-    __ leal(EBX, Address(EDX, TIMES_4, fixed_size_plus_alignment_padding));
-    __ andl(EBX, Immediate(-target::ObjectAlignment::kObjectAlignment));
-    __ cmpl(EBX, Immediate(target::RawObject::kSizeTagMaxSizeTag));
-    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EBX, Immediate(target::RawObject::kTagBitsSizeTagPos -
-                           target::ObjectAlignment::kObjectAlignmentLog2));
-    __ jmp(&done);
-
-    __ Bind(&size_tag_overflow);
-    // Set overflow size tag value.
-    __ movl(EBX, Immediate(0));
-
-    __ Bind(&done);
+    // Calculate the size tag.
     // EAX: new object.
     // EDX: number of context variables.
-    // EBX: size and bit tags.
-    uint32_t tags = target::MakeTagWordForNewSpaceObject(kContextCid, 0);
-    __ orl(EBX, Immediate(tags));
-    __ movl(FieldAddress(EAX, target::Object::tags_offset()), EBX);  // Tags.
-  }
+    {
+      Label size_tag_overflow, done;
+      __ leal(EBX, Address(EDX, TIMES_4, fixed_size_plus_alignment_padding));
+      __ andl(EBX, Immediate(-target::ObjectAlignment::kObjectAlignment));
+      __ cmpl(EBX, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+      __ shll(EBX, Immediate(target::RawObject::kTagBitsSizeTagPos -
+                             target::ObjectAlignment::kObjectAlignmentLog2));
+      __ jmp(&done);
+
+      __ Bind(&size_tag_overflow);
+      // Set overflow size tag value.
+      __ movl(EBX, Immediate(0));
+
+      __ Bind(&done);
+      // EAX: new object.
+      // EDX: number of context variables.
+      // EBX: size and bit tags.
+      uint32_t tags = target::MakeTagWordForNewSpaceObject(kContextCid, 0);
+      __ orl(EBX, Immediate(tags));
+      __ movl(FieldAddress(EAX, target::Object::tags_offset()), EBX);  // Tags.
+    }
 
   // Setup up number of context variables field.
   // EAX: new object.
@@ -1259,7 +1255,7 @@
 // Clobbered:
 // EBX, EDX
 void StubCodeCompiler::GenerateAllocateContextStub(Assembler* assembler) {
-  if (FLAG_inline_alloc) {
+  if (!FLAG_use_slow_path && FLAG_inline_alloc) {
     Label slow_case;
 
     GenerateAllocateContextSpaceStub(assembler, &slow_case);
@@ -1558,7 +1554,7 @@
   static_assert(kAllocationStubTypeArgumentsReg == EDX,
                 "Adjust register allocation in the AllocationStub");
 
-  if (FLAG_inline_alloc &&
+  if (!FLAG_use_slow_path && FLAG_inline_alloc &&
       target::Heap::IsAllocatableInNewSpace(instance_size) &&
       !target::Class::TraceAllocation(cls)) {
     Label slow_case;
@@ -1571,11 +1567,7 @@
     // EAX: potential new object start.
     // EBX: potential next object start.
     __ cmpl(EBX, Address(THR, target::Thread::end_offset()));
-    if (FLAG_use_slow_path) {
-      __ jmp(&slow_case);
-    } else {
-      __ j(ABOVE_EQUAL, &slow_case);
-    }
+    __ j(ABOVE_EQUAL, &slow_case);
     __ movl(Address(THR, target::Thread::top_offset()), EBX);
 
     // EAX: new object start (untagged).
@@ -1678,7 +1670,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ movl(EDI, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
+  __ movl(EDI, FieldAddress(EDX, target::ArgumentsDescriptor::size_offset()));
   __ movl(EAX,
           Address(EBP, EDI, TIMES_2,
                   target::frame_layout.param_end_from_fp * target::kWordSize));
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 78a14c5..64f9f0d 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -342,6 +342,7 @@
                    /*external=*/false,
                    /*array_cid=*/kArrayCid,
                    /*index, smi-tagged=*/compiler::target::kWordSize * 2,
+                   /*index_unboxed=*/false,
                    /*array=*/TMP,
                    /*index=*/RAX));
   __ movq(TMP, compiler::FieldAddress(
@@ -954,7 +955,7 @@
   __ j(NOT_EQUAL, call_target_function);
   __ EnterStubFrame();
   // Load the receiver.
-  __ movq(RDI, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
+  __ movq(RDI, FieldAddress(R10, target::ArgumentsDescriptor::size_offset()));
   __ movq(RAX,
           Address(RBP, RDI, TIMES_HALF_WORD_SIZE,
                   target::frame_layout.param_end_from_fp * target::kWordSize));
@@ -987,7 +988,7 @@
   __ EnterStubFrame();
   // Load the receiver into RAX.  The argument count in the arguments
   // descriptor in R10 is a smi.
-  __ movq(RAX, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
+  __ movq(RAX, FieldAddress(R10, target::ArgumentsDescriptor::size_offset()));
   // Three words (saved pp, saved fp, stub's pc marker)
   // in the stack above the return address.
   __ movq(RAX,
@@ -1029,117 +1030,116 @@
 // NOTE: R10 cannot be clobbered here as the caller relies on it being saved.
 // The newly allocated object is returned in RAX.
 void StubCodeCompiler::GenerateAllocateArrayStub(Assembler* assembler) {
-  Label slow_case;
-  // Compute the size to be allocated, it is based on the array length
-  // and is computed as:
-  // RoundedAllocationSize(
-  //     (array_length * target::kwordSize) + target::Array::header_size()).
-  __ movq(RDI, R10);  // Array Length.
-  // Check that length is a positive Smi.
-  __ testq(RDI, Immediate(kSmiTagMask));
-  if (FLAG_use_slow_path) {
-    __ jmp(&slow_case);
-  } else {
+  if (!FLAG_use_slow_path) {
+    Label slow_case;
+    // Compute the size to be allocated, it is based on the array length
+    // and is computed as:
+    // RoundedAllocationSize(
+    //     (array_length * target::kwordSize) + target::Array::header_size()).
+    __ movq(RDI, R10);  // Array Length.
+    // Check that length is a positive Smi.
+    __ testq(RDI, Immediate(kSmiTagMask));
     __ j(NOT_ZERO, &slow_case);
-  }
-  __ cmpq(RDI, Immediate(0));
-  __ j(LESS, &slow_case);
-  // Check for maximum allowed length.
-  const Immediate& max_len =
-      Immediate(target::ToRawSmi(target::Array::kMaxNewSpaceElements));
-  __ cmpq(RDI, max_len);
-  __ j(GREATER, &slow_case);
 
-  // Check for allocation tracing.
-  NOT_IN_PRODUCT(
-      __ MaybeTraceAllocation(kArrayCid, &slow_case, Assembler::kFarJump));
+    __ cmpq(RDI, Immediate(0));
+    __ j(LESS, &slow_case);
+    // Check for maximum allowed length.
+    const Immediate& max_len =
+        Immediate(target::ToRawSmi(target::Array::kMaxNewSpaceElements));
+    __ cmpq(RDI, max_len);
+    __ j(GREATER, &slow_case);
 
-  const intptr_t fixed_size_plus_alignment_padding =
-      target::Array::header_size() + target::ObjectAlignment::kObjectAlignment -
-      1;
-  // RDI is a Smi.
-  __ leaq(RDI, Address(RDI, TIMES_4, fixed_size_plus_alignment_padding));
-  ASSERT(kSmiTagShift == 1);
-  __ andq(RDI, Immediate(-target::ObjectAlignment::kObjectAlignment));
+    // Check for allocation tracing.
+    NOT_IN_PRODUCT(
+        __ MaybeTraceAllocation(kArrayCid, &slow_case, Assembler::kFarJump));
 
-  const intptr_t cid = kArrayCid;
-  __ movq(RAX, Address(THR, target::Thread::top_offset()));
+    const intptr_t fixed_size_plus_alignment_padding =
+        target::Array::header_size() +
+        target::ObjectAlignment::kObjectAlignment - 1;
+    // RDI is a Smi.
+    __ leaq(RDI, Address(RDI, TIMES_4, fixed_size_plus_alignment_padding));
+    ASSERT(kSmiTagShift == 1);
+    __ andq(RDI, Immediate(-target::ObjectAlignment::kObjectAlignment));
 
-  // RDI: allocation size.
-  __ movq(RCX, RAX);
-  __ addq(RCX, RDI);
-  __ j(CARRY, &slow_case);
+    const intptr_t cid = kArrayCid;
+    __ movq(RAX, Address(THR, target::Thread::top_offset()));
 
-  // Check if the allocation fits into the remaining space.
-  // RAX: potential new object start.
-  // RCX: potential next object start.
-  // RDI: allocation size.
-  __ cmpq(RCX, Address(THR, target::Thread::end_offset()));
-  __ j(ABOVE_EQUAL, &slow_case);
+    // RDI: allocation size.
+    __ movq(RCX, RAX);
+    __ addq(RCX, RDI);
+    __ j(CARRY, &slow_case);
 
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ movq(Address(THR, target::Thread::top_offset()), RCX);
-  __ addq(RAX, Immediate(kHeapObjectTag));
+    // Check if the allocation fits into the remaining space.
+    // RAX: potential new object start.
+    // RCX: potential next object start.
+    // RDI: allocation size.
+    __ cmpq(RCX, Address(THR, target::Thread::end_offset()));
+    __ j(ABOVE_EQUAL, &slow_case);
 
-  // Initialize the tags.
-  // RAX: new object start as a tagged pointer.
-  // RDI: allocation size.
-  {
-    Label size_tag_overflow, done;
-    __ cmpq(RDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
-    __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(RDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
-                           target::ObjectAlignment::kObjectAlignmentLog2));
-    __ jmp(&done, Assembler::kNearJump);
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    __ movq(Address(THR, target::Thread::top_offset()), RCX);
+    __ addq(RAX, Immediate(kHeapObjectTag));
 
-    __ Bind(&size_tag_overflow);
-    __ LoadImmediate(RDI, Immediate(0));
-    __ Bind(&done);
+    // Initialize the tags.
+    // RAX: new object start as a tagged pointer.
+    // RDI: allocation size.
+    {
+      Label size_tag_overflow, done;
+      __ cmpq(RDI, Immediate(target::RawObject::kSizeTagMaxSizeTag));
+      __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
+      __ shlq(RDI, Immediate(target::RawObject::kTagBitsSizeTagPos -
+                             target::ObjectAlignment::kObjectAlignmentLog2));
+      __ jmp(&done, Assembler::kNearJump);
 
-    // Get the class index and insert it into the tags.
-    uint32_t tags = target::MakeTagWordForNewSpaceObject(cid, 0);
-    __ orq(RDI, Immediate(tags));
-    __ movq(FieldAddress(RAX, target::Array::tags_offset()), RDI);  // Tags.
-  }
+      __ Bind(&size_tag_overflow);
+      __ LoadImmediate(RDI, Immediate(0));
+      __ Bind(&done);
 
-  // RAX: new object start as a tagged pointer.
-  // Store the type argument field.
-  // No generational barrier needed, since we store into a new object.
-  __ StoreIntoObjectNoBarrier(
-      RAX, FieldAddress(RAX, target::Array::type_arguments_offset()), RBX);
+      // Get the class index and insert it into the tags.
+      uint32_t tags = target::MakeTagWordForNewSpaceObject(cid, 0);
+      __ orq(RDI, Immediate(tags));
+      __ movq(FieldAddress(RAX, target::Array::tags_offset()), RDI);  // Tags.
+    }
 
-  // Set the length field.
-  __ StoreIntoObjectNoBarrier(
-      RAX, FieldAddress(RAX, target::Array::length_offset()), R10);
+    // RAX: new object start as a tagged pointer.
+    // Store the type argument field.
+    // No generational barrier needed, since we store into a new object.
+    __ StoreIntoObjectNoBarrier(
+        RAX, FieldAddress(RAX, target::Array::type_arguments_offset()), RBX);
 
-  // Initialize all array elements to raw_null.
-  // RAX: new object start as a tagged pointer.
-  // RCX: new object end address.
-  // RDI: iterator which initially points to the start of the variable
-  // data area to be initialized.
-  __ LoadObject(R12, NullObject());
-  __ leaq(RDI, FieldAddress(RAX, target::Array::header_size()));
-  Label done;
-  Label init_loop;
-  __ Bind(&init_loop);
-  __ cmpq(RDI, RCX);
+    // Set the length field.
+    __ StoreIntoObjectNoBarrier(
+        RAX, FieldAddress(RAX, target::Array::length_offset()), R10);
+
+    // Initialize all array elements to raw_null.
+    // RAX: new object start as a tagged pointer.
+    // RCX: new object end address.
+    // RDI: iterator which initially points to the start of the variable
+    // data area to be initialized.
+    __ LoadObject(R12, NullObject());
+    __ leaq(RDI, FieldAddress(RAX, target::Array::header_size()));
+    Label done;
+    Label init_loop;
+    __ Bind(&init_loop);
+    __ cmpq(RDI, RCX);
 #if defined(DEBUG)
-  static const bool kJumpLength = Assembler::kFarJump;
+    static const bool kJumpLength = Assembler::kFarJump;
 #else
-  static const bool kJumpLength = Assembler::kNearJump;
+    static const bool kJumpLength = Assembler::kNearJump;
 #endif  // DEBUG
-  __ j(ABOVE_EQUAL, &done, kJumpLength);
-  // No generational barrier needed, since we are storing null.
-  __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
-  __ addq(RDI, Immediate(target::kWordSize));
-  __ jmp(&init_loop, kJumpLength);
-  __ Bind(&done);
-  __ ret();  // returns the newly allocated object in RAX.
+    __ j(ABOVE_EQUAL, &done, kJumpLength);
+    // No generational barrier needed, since we are storing null.
+    __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
+    __ addq(RDI, Immediate(target::kWordSize));
+    __ jmp(&init_loop, kJumpLength);
+    __ Bind(&done);
+    __ ret();  // returns the newly allocated object in RAX.
 
-  // Unable to allocate the array using the fast inline code, just call
-  // into the runtime.
-  __ Bind(&slow_case);
+    // Unable to allocate the array using the fast inline code, just call
+    // into the runtime.
+    __ Bind(&slow_case);
+  }
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -1505,11 +1505,7 @@
   // R13: potential next object start.
   // R10: number of context variables.
   __ cmpq(R13, Address(THR, target::Thread::end_offset()));
-  if (FLAG_use_slow_path) {
-    __ jmp(slow_case);
-  } else {
-    __ j(ABOVE_EQUAL, slow_case);
-  }
+  __ j(ABOVE_EQUAL, slow_case);
 
   // Successfully allocated the object, now update top to point to
   // next object start and initialize the object.
@@ -1563,7 +1559,7 @@
 //   R9, R13
 void StubCodeCompiler::GenerateAllocateContextStub(Assembler* assembler) {
   __ LoadObject(R9, NullObject());
-  if (FLAG_inline_alloc) {
+  if (!FLAG_use_slow_path && FLAG_inline_alloc) {
     Label slow_case;
 
     GenerateAllocateContextSpaceStub(assembler, &slow_case);
@@ -1907,7 +1903,7 @@
   static_assert(kAllocationStubTypeArgumentsReg == RDX,
                 "Adjust register allocation in the AllocationStub");
 
-  if (FLAG_inline_alloc &&
+  if (!FLAG_use_slow_path && FLAG_inline_alloc &&
       target::Heap::IsAllocatableInNewSpace(instance_size) &&
       !target::Class::TraceAllocation(cls)) {
     Label slow_case;
@@ -1920,11 +1916,8 @@
     // RAX: potential new object start.
     // RBX: potential next object start.
     __ cmpq(RBX, Address(THR, target::Thread::end_offset()));
-    if (FLAG_use_slow_path) {
-      __ jmp(&slow_case);
-    } else {
-      __ j(ABOVE_EQUAL, &slow_case);
-    }
+    __ j(ABOVE_EQUAL, &slow_case);
+
     __ movq(Address(THR, target::Thread::top_offset()), RBX);
 
     // RAX: new object start (untagged).
@@ -2031,7 +2024,7 @@
   __ EnterStubFrame();
 
   // Load the receiver.
-  __ movq(R13, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
+  __ movq(R13, FieldAddress(R10, target::ArgumentsDescriptor::size_offset()));
   __ movq(RAX,
           Address(RBP, R13, TIMES_4,
                   target::frame_layout.param_end_from_fp * target::kWordSize));
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 4457370..992075f 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -151,6 +151,11 @@
   TIMES_2 = 1,
   TIMES_4 = 2,
   TIMES_8 = 3,
+  // Note that Intel addressing does not support this addressing.
+  // > Scale factor — A value of 2, 4, or 8 that is multiplied by the index
+  // > value.
+  // https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4
+  // 3.7.5 Specifying an Offset
   TIMES_16 = 4,
   TIMES_HALF_WORD_SIZE = kWordSizeLog2 - 1
 };
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 3ee28fd..498e600 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -295,7 +295,7 @@
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
   ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+      Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
   const Function& function =
       Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc));
   if (function.IsNull()) {
@@ -312,7 +312,7 @@
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 2;
   ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+      Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
   const Function& function =
       Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc));
   if (function.IsNull()) {
@@ -430,6 +430,10 @@
   return reinterpret_cast<Dart_Isolate>(isolate);
 }
 
+Dart_IsolateGroup Api::CastIsolateGroup(IsolateGroup* isolate_group) {
+  return reinterpret_cast<Dart_IsolateGroup>(isolate_group);
+}
+
 Dart_Handle Api::NewError(const char* format, ...) {
   Thread* T = Thread::Current();
   CHECK_API_SCOPE(T);
@@ -994,11 +998,12 @@
 }
 
 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
+  IsolateGroup* isolate_group = IsolateGroup::Current();
+  CHECK_ISOLATE_GROUP(isolate_group);
   NoSafepointScope no_safepoint_scope;
-  ApiState* state = isolate->group()->api_state();
+  ApiState* state = isolate_group->api_state();
   ASSERT(state != NULL);
+  ASSERT(state->IsActivePersistentHandle(object));
   PersistentHandle* ref = PersistentHandle::Cast(object);
   ASSERT(!state->IsProtectedHandle(ref));
   if (!state->IsProtectedHandle(ref)) {
@@ -1007,16 +1012,15 @@
 }
 
 DART_EXPORT void Dart_DeleteWeakPersistentHandle(
-    Dart_Isolate current_isolate,
     Dart_WeakPersistentHandle object) {
-  Isolate* isolate = reinterpret_cast<Isolate*>(current_isolate);
-  CHECK_ISOLATE(isolate);
+  IsolateGroup* isolate_group = IsolateGroup::Current();
+  CHECK_ISOLATE_GROUP(isolate_group);
   NoSafepointScope no_safepoint_scope;
-  ASSERT(isolate == Isolate::Current());
-  ApiState* state = isolate->group()->api_state();
+  ApiState* state = isolate_group->api_state();
   ASSERT(state != NULL);
+  ASSERT(state->IsActiveWeakPersistentHandle(object));
   auto weak_ref = FinalizablePersistentHandle::Cast(object);
-  weak_ref->EnsureFreeExternal(isolate->group());
+  weak_ref->EnsureFreeExternal(isolate_group);
   state->FreeWeakPersistentHandle(weak_ref);
 }
 
@@ -1469,11 +1473,15 @@
   return reinterpret_cast<Isolate*>(isolate)->init_callback_data();
 }
 
+DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup() {
+  return Api::CastIsolateGroup(IsolateGroup::Current());
+}
+
 DART_EXPORT void* Dart_CurrentIsolateGroupData() {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
+  IsolateGroup* isolate_group = IsolateGroup::Current();
+  CHECK_ISOLATE_GROUP(isolate_group);
   NoSafepointScope no_safepoint_scope;
-  return isolate->group()->embedder_data();
+  return isolate_group->embedder_data();
 }
 
 DART_EXPORT void* Dart_IsolateGroupData(Dart_Isolate isolate) {
@@ -3111,7 +3119,7 @@
   const int kTypeArgsLen = 0;
   const int kNumArgs = 1;
   ArgumentsDescriptor args_desc(
-      Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+      Array::Handle(Z, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
   const Function& function =
       Function::Handle(Z, Resolver::ResolveDynamic(instance, name, args_desc));
   if (function.IsNull()) {
@@ -3204,7 +3212,7 @@
       const intptr_t kTypeArgsLen = 0;
       const intptr_t kNumArgs = 2;
       ArgumentsDescriptor args_desc(
-          Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+          Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
       const Function& function = Function::Handle(
           Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
                                       args_desc));
@@ -3262,7 +3270,7 @@
       const intptr_t kTypeArgsLen = 0;
       const intptr_t kNumArgs = 3;
       ArgumentsDescriptor args_desc(
-          Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+          Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
       const Function& function = Function::Handle(
           Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
                                       args_desc));
@@ -3447,7 +3455,7 @@
     const int kTypeArgsLen = 0;
     const int kNumArgs = 2;
     ArgumentsDescriptor args_desc(
-        Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+        Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
     const Function& function = Function::Handle(
         Z,
         Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc));
@@ -3533,8 +3541,8 @@
   if (!instance.IsNull()) {
     const int kTypeArgsLen = 0;
     const int kNumArgs = 3;
-    ArgumentsDescriptor args_desc(
-        Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)));
+    ArgumentsDescriptor args_desc(Array::Handle(
+        Z, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArgs)));
     const Function& function = Function::Handle(
         Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(),
                                     args_desc));
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index b9221a3..65ed764 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -28,6 +28,17 @@
 
 #define CURRENT_FUNC CanonicalFunction(__FUNCTION__)
 
+// Checks that the current isolate group is not NULL.
+#define CHECK_ISOLATE_GROUP(isolate_group)                                     \
+  do {                                                                         \
+    if ((isolate_group) == NULL) {                                             \
+      FATAL1(                                                                  \
+          "%s expects there to be a current isolate group. Did you "           \
+          "forget to call Dart_CreateIsolateGroup or Dart_EnterIsolate?",      \
+          CURRENT_FUNC);                                                       \
+    }                                                                          \
+  } while (0)
+
 // Checks that the current isolate is not NULL.
 #define CHECK_ISOLATE(isolate)                                                 \
   do {                                                                         \
@@ -173,6 +184,10 @@
   // Casts the internal Isolate* type to the external Dart_Isolate type.
   static Dart_Isolate CastIsolate(Isolate* isolate);
 
+  // Casts the internal IsolateGroup* type to the external Dart_IsolateGroup
+  // type.
+  static Dart_IsolateGroup CastIsolateGroup(IsolateGroup* isolate);
+
   // Gets the handle used to designate successful return.
   static Dart_Handle Success() { return Api::True(); }
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 0bcdb74..a756343 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -3234,6 +3234,52 @@
   Dart_ExitScope();
 }
 
+static Dart_PersistentHandle persistent_handle1;
+static Dart_WeakPersistentHandle weak_persistent_handle2;
+static Dart_WeakPersistentHandle weak_persistent_handle3;
+
+static void WeakPersistentHandlePeerCleanupFinalizer(
+    void* isolate_callback_data,
+    Dart_WeakPersistentHandle handle,
+    void* peer) {
+  Dart_DeletePersistentHandle(persistent_handle1);
+  Dart_DeleteWeakPersistentHandle(weak_persistent_handle2);
+  *static_cast<int*>(peer) = 42;
+}
+
+static void WeakPersistentHandleNoopCallback(void* isolate_callback_data,
+                                             Dart_WeakPersistentHandle handle,
+                                             void* peer) {}
+
+TEST_CASE(DartAPI_WeakPersistentHandleCleanupFinalizer) {
+  Heap* heap = Isolate::Current()->heap();
+
+  const char* kTestString1 = "Test String1";
+  Dart_EnterScope();
+  CHECK_API_SCOPE(thread);
+  Dart_Handle ref1 = Dart_NewStringFromCString(kTestString1);
+  persistent_handle1 = Dart_NewPersistentHandle(ref1);
+  Dart_Handle ref2 = Dart_NewStringFromCString(kTestString1);
+  int peer2 = 0;
+  weak_persistent_handle2 = Dart_NewWeakPersistentHandle(
+      ref2, &peer2, 0, WeakPersistentHandleNoopCallback);
+  int peer3 = 0;
+  {
+    Dart_EnterScope();
+    Dart_Handle ref3 = Dart_NewStringFromCString(kTestString1);
+    weak_persistent_handle3 = Dart_NewWeakPersistentHandle(
+        ref3, &peer3, 0, WeakPersistentHandlePeerCleanupFinalizer);
+    Dart_ExitScope();
+  }
+  {
+    TransitionNativeToVM transition(thread);
+    GCTestHelper::CollectAllGarbage();
+    EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+    EXPECT(peer3 == 42);
+  }
+  Dart_ExitScope();
+}
+
 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data,
                                               Dart_WeakPersistentHandle handle,
                                               void* peer) {
@@ -3275,8 +3321,7 @@
   }
   // A finalizer is not invoked on a deleted handle.  Therefore, the
   // peer value should not change after the referent is collected.
-  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
-  Dart_DeleteWeakPersistentHandle(isolate, weak_ref);
+  Dart_DeleteWeakPersistentHandle(weak_ref);
   EXPECT(peer == 0);
   {
     TransitionNativeToVM transition(thread);
@@ -3338,9 +3383,6 @@
     EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
     EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak2ExternalSize / kWordSize);
   }
-  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
-  Dart_DeleteWeakPersistentHandle(isolate, weak1);
-  Dart_DeleteWeakPersistentHandle(isolate, weak2);
   Dart_DeletePersistentHandle(strong_ref);
   {
     TransitionNativeToVM transition(thread);
@@ -3350,7 +3392,6 @@
 }
 
 TEST_CASE(DartAPI_WeakPersistentHandleExternalAllocationSizeNewspaceGC) {
-  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
   Heap* heap = Isolate::Current()->heap();
   Dart_WeakPersistentHandle weak1 = NULL;
   // Large enough to exceed any new space limit. Not actually allocated.
@@ -3369,7 +3410,7 @@
     Dart_WeakPersistentHandle trigger =
         Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
     EXPECT_VALID(AsHandle(trigger));
-    Dart_DeleteWeakPersistentHandle(isolate, trigger);
+    Dart_DeleteWeakPersistentHandle(trigger);
     // After the two scavenges above, 'obj' should now be promoted, hence its
     // external size charged to old space.
     {
@@ -3384,7 +3425,7 @@
     EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak1ExternalSize / kWordSize);
     Dart_ExitScope();
   }
-  Dart_DeleteWeakPersistentHandle(isolate, weak1);
+  Dart_DeleteWeakPersistentHandle(weak1);
   {
     TransitionNativeToVM transition(thread);
     GCTestHelper::CollectOldSpace();
@@ -3457,9 +3498,8 @@
            (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize);
     Dart_ExitScope();
   }
-  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
-  Dart_DeleteWeakPersistentHandle(isolate, weak1);
-  Dart_DeleteWeakPersistentHandle(isolate, weak2);
+  Dart_DeleteWeakPersistentHandle(weak1);
+  Dart_DeleteWeakPersistentHandle(weak2);
   EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
   {
     TransitionNativeToVM transition(thread);
@@ -3468,50 +3508,6 @@
   }
 }
 
-static void AssertingFinalizer(void* isolate_callback_data,
-                               Dart_WeakPersistentHandle handle,
-                               void* peer) {
-  Dart_Isolate expected_isolate = reinterpret_cast<Dart_Isolate>(peer);
-  EXPECT_EQ(expected_isolate, Dart_CurrentIsolate());
-}
-
-// TODO(https://github.com/dart-lang/sdk/issues/40836): Remove.
-TEST_CASE(DartAPI_WeakPersistentHandleFinalizerCurrentIsolate) {
-  {
-    Dart_EnterScope();
-
-    Dart_Handle obj = AllocateNewString("ABC");
-    void* peer = Dart_CurrentIsolate();
-    EXPECT_NOTNULL(peer);
-    intptr_t external_size = 0;
-    Dart_NewWeakPersistentHandle(obj, peer, external_size, AssertingFinalizer);
-
-    Dart_ExitScope();
-  }
-
-  {
-    TransitionNativeToVM transition(thread);
-    GCTestHelper::CollectAllGarbage();
-  }
-
-  {
-    Dart_EnterScope();
-
-    Dart_Handle obj = AllocateOldString("ABC");
-    void* peer = Dart_CurrentIsolate();
-    EXPECT_NOTNULL(peer);
-    intptr_t external_size = 0;
-    Dart_NewWeakPersistentHandle(obj, peer, external_size, AssertingFinalizer);
-
-    Dart_ExitScope();
-  }
-
-  {
-    TransitionNativeToVM transition(thread);
-    GCTestHelper::CollectAllGarbage();
-  }
-}
-
 static Dart_WeakPersistentHandle weak1 = NULL;
 static Dart_WeakPersistentHandle weak2 = NULL;
 static Dart_WeakPersistentHandle weak3 = NULL;
@@ -3778,19 +3774,38 @@
   Dart_Isolate isolate = Dart_CurrentIsolate();
   EXPECT_EQ(iso_1, isolate);
   Dart_ExitIsolate();
-  EXPECT(NULL == Dart_CurrentIsolate());
+  EXPECT_NULLPTR(Dart_CurrentIsolate());
   Dart_Isolate iso_2 = TestCase::CreateTestIsolate();
   EXPECT_EQ(iso_2, Dart_CurrentIsolate());
   Dart_ExitIsolate();
-  EXPECT(NULL == Dart_CurrentIsolate());
+  EXPECT_NULLPTR(Dart_CurrentIsolate());
   Dart_EnterIsolate(iso_2);
   EXPECT_EQ(iso_2, Dart_CurrentIsolate());
   Dart_ShutdownIsolate();
-  EXPECT(NULL == Dart_CurrentIsolate());
+  EXPECT_NULLPTR(Dart_CurrentIsolate());
   Dart_EnterIsolate(iso_1);
   EXPECT_EQ(iso_1, Dart_CurrentIsolate());
   Dart_ShutdownIsolate();
-  EXPECT(NULL == Dart_CurrentIsolate());
+  EXPECT_NULLPTR(Dart_CurrentIsolate());
+}
+
+VM_UNIT_TEST_CASE(DartAPI_IsolateGroups) {
+  Dart_Isolate iso_1 = TestCase::CreateTestIsolate();
+  EXPECT_NOTNULL(Dart_CurrentIsolateGroup());
+  Dart_ExitIsolate();
+  EXPECT_NULLPTR(Dart_CurrentIsolateGroup());
+  Dart_Isolate iso_2 = TestCase::CreateTestIsolate();
+  EXPECT_NOTNULL(Dart_CurrentIsolateGroup());
+  Dart_ExitIsolate();
+  EXPECT_NULLPTR(Dart_CurrentIsolateGroup());
+  Dart_EnterIsolate(iso_2);
+  EXPECT_NOTNULL(Dart_CurrentIsolateGroup());
+  Dart_ShutdownIsolate();
+  EXPECT_NULLPTR(Dart_CurrentIsolateGroup());
+  Dart_EnterIsolate(iso_1);
+  EXPECT_NOTNULL(Dart_CurrentIsolateGroup());
+  Dart_ShutdownIsolate();
+  EXPECT_NULLPTR(Dart_CurrentIsolateGroup());
 }
 
 VM_UNIT_TEST_CASE(DartAPI_CurrentIsolateData) {
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index ab11b0c..5d24012 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -31,8 +31,8 @@
                                      const Array& arguments) {
   ASSERT(Thread::Current()->IsMutatorThread());
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
-  const Array& arguments_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length()));
+  const Array& arguments_descriptor = Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, arguments.Length()));
   return InvokeFunction(function, arguments, arguments_descriptor);
 }
 
@@ -185,8 +185,10 @@
 
 RawObject* DartEntry::InvokeClosure(const Array& arguments) {
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
-  const Array& arguments_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length()));
+
+  // Closures always have boxed parameters
+  const Array& arguments_descriptor = Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, arguments.Length()));
   return InvokeClosure(arguments, arguments_descriptor);
 }
 
@@ -289,8 +291,8 @@
   // Now use the invocation mirror object and invoke NoSuchMethod.
   const int kTypeArgsLen = 0;
   const int kNumArguments = 2;
-  ArgumentsDescriptor nsm_args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor nsm_args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   Function& function = Function::Handle(Resolver::ResolveDynamic(
       receiver, Symbols::NoSuchMethod(), nsm_args_desc));
   if (function.IsNull()) {
@@ -319,6 +321,10 @@
   return Smi::Value(Smi::RawCast(array_.At(kCountIndex)));
 }
 
+intptr_t ArgumentsDescriptor::Size() const {
+  return Smi::Value(Smi::RawCast(array_.At(kSizeIndex)));
+}
+
 intptr_t ArgumentsDescriptor::PositionalCount() const {
   return Smi::Value(Smi::RawCast(array_.At(kPositionalCountIndex)));
 }
@@ -364,12 +370,14 @@
 
 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
                                    intptr_t num_arguments,
+                                   intptr_t size_arguments,
                                    const Array& optional_arguments_names,
                                    Heap::Space space) {
   const intptr_t num_named_args =
       optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length();
   if (num_named_args == 0) {
-    return ArgumentsDescriptor::New(type_args_len, num_arguments, space);
+    return ArgumentsDescriptor::New(type_args_len, num_arguments,
+                                    size_arguments, space);
   }
   ASSERT(type_args_len >= 0);
   ASSERT(num_arguments >= 0);
@@ -389,6 +397,8 @@
   descriptor.SetAt(kTypeArgsLenIndex, Smi::Handle(Smi::New(type_args_len)));
   // Set total number of passed arguments.
   descriptor.SetAt(kCountIndex, Smi::Handle(Smi::New(num_arguments)));
+  // Set total number of passed arguments.
+  descriptor.SetAt(kSizeIndex, Smi::Handle(Smi::New(size_arguments)));
 
   // Set number of positional arguments.
   descriptor.SetAt(kPositionalCountIndex, Smi::Handle(Smi::New(num_pos_args)));
@@ -434,18 +444,22 @@
 
 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
                                    intptr_t num_arguments,
+                                   intptr_t size_arguments,
                                    Heap::Space space) {
   ASSERT(type_args_len >= 0);
   ASSERT(num_arguments >= 0);
 
-  if ((type_args_len == 0) && (num_arguments < kCachedDescriptorCount)) {
+  if ((type_args_len == 0) && (num_arguments < kCachedDescriptorCount) &&
+      (num_arguments == size_arguments)) {
     return cached_args_descriptors_[num_arguments];
   }
-  return NewNonCached(type_args_len, num_arguments, true, space);
+  return NewNonCached(type_args_len, num_arguments, size_arguments, true,
+                      space);
 }
 
 RawArray* ArgumentsDescriptor::NewNonCached(intptr_t type_args_len,
                                             intptr_t num_arguments,
+                                            intptr_t size_arguments,
                                             bool canonicalize,
                                             Heap::Space space) {
   // Build the arguments descriptor array, which consists of the length of the
@@ -456,6 +470,7 @@
   const intptr_t descriptor_len = LengthFor(0);
   Array& descriptor = Array::Handle(zone, Array::New(descriptor_len, space));
   const Smi& arg_count = Smi::Handle(zone, Smi::New(num_arguments));
+  const Smi& arg_size = Smi::Handle(zone, Smi::New(size_arguments));
 
   // Set type argument vector length.
   descriptor.SetAt(kTypeArgsLenIndex,
@@ -464,6 +479,9 @@
   // Set total number of passed arguments.
   descriptor.SetAt(kCountIndex, arg_count);
 
+  // Set total size of passed arguments.
+  descriptor.SetAt(kSizeIndex, arg_size);
+
   // Set number of positional arguments.
   descriptor.SetAt(kPositionalCountIndex, arg_count);
 
@@ -486,7 +504,7 @@
 void ArgumentsDescriptor::Init() {
   for (int i = 0; i < kCachedDescriptorCount; i++) {
     cached_args_descriptors_[i] =
-        NewNonCached(/*type_args_len=*/0, i, false, Heap::kOld);
+        NewNonCached(/*type_args_len=*/0, i, i, false, Heap::kOld);
   }
 }
 
@@ -532,8 +550,8 @@
 RawObject* DartLibraryCalls::ToString(const Instance& receiver) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;  // Receiver.
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& function = Function::Handle(
       Resolver::ResolveDynamic(receiver, Symbols::toString(), args_desc));
   ASSERT(!function.IsNull());
@@ -548,8 +566,8 @@
 RawObject* DartLibraryCalls::HashCode(const Instance& receiver) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;  // Receiver.
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& function = Function::Handle(
       Resolver::ResolveDynamic(receiver, Symbols::hashCode(), args_desc));
   ASSERT(!function.IsNull());
@@ -565,8 +583,8 @@
                                     const Instance& right) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 2;
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& function = Function::Handle(
       Resolver::ResolveDynamic(left, Symbols::EqualOperator(), args_desc));
   ASSERT(!function.IsNull());
@@ -696,8 +714,8 @@
                                       const Instance& value) {
   const int kTypeArgsLen = 0;
   const int kNumArguments = 3;
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& function = Function::Handle(
       Resolver::ResolveDynamic(map, Symbols::AssignIndexToken(), args_desc));
   ASSERT(!function.IsNull());
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 980fcfc..11411de 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -27,10 +27,11 @@
 class String;
 
 // An arguments descriptor array consists of the type argument vector length (0
-// if none); total argument count (not counting type argument vector); the
-// positional argument count; a sequence of (name, position) pairs, sorted
-// by name, for each named optional argument; and a terminating null to
-// simplify iterating in generated code.
+// if none); total argument count (not counting type argument vector); total
+// arguments size (not counting type argument vector); the positional argument
+// count; a sequence of (name, position) pairs, sorted by name, for each named
+// optional argument; and a terminating null to simplify iterating in generated
+// code.
 class ArgumentsDescriptor : public ValueObject {
  public:
   explicit ArgumentsDescriptor(const Array& array);
@@ -40,6 +41,8 @@
   intptr_t FirstArgIndex() const { return TypeArgsLen() > 0 ? 1 : 0; }
   intptr_t CountWithTypeArgs() const { return FirstArgIndex() + Count(); }
   intptr_t Count() const;            // Excluding type arguments vector.
+  intptr_t Size() const;             // Excluding type arguments vector.
+  intptr_t SizeWithTypeArgs() const { return FirstArgIndex() + Size(); }
   intptr_t PositionalCount() const;  // Excluding type arguments vector.
   intptr_t NamedCount() const { return Count() - PositionalCount(); }
   RawString* NameAt(intptr_t i) const;
@@ -55,6 +58,8 @@
 
   static intptr_t count_offset() { return Array::element_offset(kCountIndex); }
 
+  static intptr_t size_offset() { return Array::element_offset(kSizeIndex); }
+
   static intptr_t positional_count_offset() {
     return Array::element_offset(kPositionalCountIndex);
   }
@@ -67,6 +72,20 @@
   static intptr_t position_offset() { return kPositionOffset * kWordSize; }
   static intptr_t named_entry_size() { return kNamedEntrySize * kWordSize; }
 
+  // Constructs an argument descriptor where all arguments are boxed and
+  // therefore number of parameters equals parameter size.
+  //
+  // Right now this is for example the case for all closure functions.
+  // Functions marked as entry-points may also be created by NewUnboxed because
+  // we rely that TFA will mark the arguments as nullable for such cases.
+  static RawArray* NewBoxed(intptr_t type_args_len,
+                            intptr_t num_arguments,
+                            const Array& optional_arguments_names,
+                            Heap::Space space = Heap::kOld) {
+    return New(type_args_len, num_arguments, num_arguments,
+               optional_arguments_names, space);
+  }
+
   // Allocate and return an arguments descriptor.  The first
   // (num_arguments - optional_arguments_names.Length()) arguments are
   // positional and the remaining ones are named optional arguments.
@@ -74,15 +93,27 @@
   // num_arguments) is indicated by a non-zero type_args_len.
   static RawArray* New(intptr_t type_args_len,
                        intptr_t num_arguments,
+                       intptr_t size_arguments,
                        const Array& optional_arguments_names,
                        Heap::Space space = Heap::kOld);
 
+  // Constructs an argument descriptor where all arguments are boxed and
+  // therefore number of parameters equals parameter size.
+  //
+  // Right now this is for example the case for all closure functions.
+  static RawArray* NewBoxed(intptr_t type_args_len,
+                            intptr_t num_arguments,
+                            Heap::Space space = Heap::kOld) {
+    return New(type_args_len, num_arguments, num_arguments, space);
+  }
+
   // Allocate and return an arguments descriptor that has no optional
   // arguments. All arguments are positional. The presence of a type argument
   // vector as first argument (not counted in num_arguments) is indicated
   // by a non-zero type_args_len.
   static RawArray* New(intptr_t type_args_len,
                        intptr_t num_arguments,
+                       intptr_t size_arguments,
                        Heap::Space space = Heap::kOld);
 
   // Initialize the preallocated fixed length arguments descriptors cache.
@@ -99,6 +130,7 @@
   enum {
     kTypeArgsLenIndex,
     kCountIndex,
+    kSizeIndex,
     kPositionalCountIndex,
     kFirstNamedEntryIndex,
   };
@@ -122,6 +154,7 @@
 
   static RawArray* NewNonCached(intptr_t type_args_len,
                                 intptr_t num_arguments,
+                                intptr_t size_arguments,
                                 bool canonicalize,
                                 Heap::Space space);
 
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 6ce5c85..40bc68a 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -157,12 +157,12 @@
 
   intptr_t src_lo_slot() const {
     ASSERT(source_kind() == SourceKind::kInt64PairSlot);
-    return LoSourceSlot::decode(src_);
+    return index_to_pair_slot(LoSourceSlot::decode(src_));
   }
 
   intptr_t src_hi_slot() const {
     ASSERT(source_kind() == SourceKind::kInt64PairSlot);
-    return HiSourceSlot::decode(src_);
+    return index_to_pair_slot(HiSourceSlot::decode(src_));
   }
 
   intptr_t dest_slot() const {
@@ -182,8 +182,8 @@
   }
 
   static intptr_t EncodePairSource(intptr_t src_lo_slot, intptr_t src_hi_slot) {
-    return LoSourceSlot::encode(src_lo_slot) |
-           HiSourceSlot::encode(src_hi_slot);
+    return LoSourceSlot::encode(pair_slot_to_index(src_lo_slot)) |
+           HiSourceSlot::encode(pair_slot_to_index(src_hi_slot));
   }
 
   bool IsRedundant() const {
@@ -206,6 +206,15 @@
 #endif
 
  private:
+  static intptr_t pair_slot_to_index(intptr_t slot) {
+    return (slot < 0) ? -2 * slot : 2 * slot + 1;
+  }
+
+  static intptr_t index_to_pair_slot(intptr_t index) {
+    ASSERT(index >= 0);
+    return ((index & 1) != 0) ? (index >> 1) : -(index >> 1);
+  }
+
   CatchEntryMove(int32_t src, int32_t dest_and_kind)
       : src_(src), dest_and_kind_(dest_and_kind) {}
 
diff --git a/runtime/vm/handles_test.cc b/runtime/vm/handles_test.cc
index 142e147..0e6486f 100644
--- a/runtime/vm/handles_test.cc
+++ b/runtime/vm/handles_test.cc
@@ -116,7 +116,6 @@
   EXPECT(!Api::IsValid(handle));
 
   // Check validity using persistent handle.
-  Isolate* isolate = Isolate::Current();
   Dart_Handle scoped_handle;
   {
     TransitionNativeToVM transition(thread);
@@ -137,7 +136,6 @@
   EXPECT_VALID(handle);
 
   Dart_DeleteWeakPersistentHandle(
-      reinterpret_cast<Dart_Isolate>(isolate),
       reinterpret_cast<Dart_WeakPersistentHandle>(handle));
   EXPECT(!Api::IsValid(handle));
 }
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index a04108b..59abade 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -52,24 +52,6 @@
   Isolate* saved_isolate_;
 };
 
-RunFinalizersScope::RunFinalizersScope(Thread* thread) : thread_(thread) {
-  if (!FLAG_enable_isolate_groups) {
-    ASSERT(thread->IsAtSafepoint() ||
-           (thread->task_kind() == Thread::kMarkerTask));
-    IsolateGroup* isolate_group = thread->isolate_group();
-    Isolate* isolate = isolate_group->isolates_.First();
-    ASSERT(isolate == isolate_group->isolates_.Last());
-    saved_isolate_ = thread->isolate_;
-    thread->isolate_ = isolate;
-  }
-}
-
-RunFinalizersScope::~RunFinalizersScope() {
-  if (!FLAG_enable_isolate_groups) {
-    thread_->isolate_ = saved_isolate_;
-  }
-}
-
 Heap::Heap(IsolateGroup* isolate_group,
            intptr_t max_new_gen_semi_words,
            intptr_t max_old_gen_words)
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index f72472e..34ab784 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -30,20 +30,6 @@
 class TimelineEventScope;
 class VirtualMemory;
 
-// Temporarily enter the only isolate in the group before running weak handle
-// finalizers to keep existing embedder code working. Remove once embedders
-// are updated to think in terms of isolate groups.
-// TODO(https://github.com/dart-lang/sdk/issues/40836): Remove.
-class RunFinalizersScope {
- public:
-  explicit RunFinalizersScope(Thread* thread);
-  ~RunFinalizersScope();
-
- private:
-  Thread* thread_;
-  Isolate* saved_isolate_;
-};
-
 class Heap {
  public:
   enum Space {
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 75bc357..d353296 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -465,12 +465,9 @@
 
 void GCMarker::ProcessWeakHandles(Thread* thread) {
   TIMELINE_FUNCTION_GC_DURATION(thread, "ProcessWeakHandles");
-
   MarkingWeakVisitor visitor(thread);
   ApiState* state = isolate_group_->api_state();
   ASSERT(state != NULL);
-
-  RunFinalizersScope tcis(thread);
   isolate_group_->VisitWeakPersistentHandles(&visitor);
 }
 
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index aef253f..0461261 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -1038,8 +1038,10 @@
   const int64_t pre_wait_for_sweepers = OS::GetCurrentMonotonicMicros();
 
   // Wait for pending tasks to complete and then account for the driver task.
+  Phase waited_for;
   {
     MonitorLocker locker(tasks_lock());
+    waited_for = phase();
     if (!finalize &&
         (phase() == kMarking || phase() == kAwaitingFinalization)) {
       // Concurrent mark is already running.
@@ -1054,6 +1056,16 @@
   }
 
   const int64_t pre_safe_point = OS::GetCurrentMonotonicMicros();
+  if (FLAG_verbose_gc) {
+    const int64_t wait = pre_safe_point - pre_wait_for_sweepers;
+    if (waited_for == kMarking) {
+      THR_Print("Waited %" Pd64 " us for concurrent marking to finish.\n",
+                wait);
+    } else if (waited_for == kSweepingRegular || waited_for == kSweepingLarge) {
+      THR_Print("Waited %" Pd64 " us for concurrent sweeping to finish.\n",
+                wait);
+    }
+  }
 
   // Ensure that all threads for this isolate are at a safepoint (either
   // stopped or in native code). We have guards around Newgen GC and oldgen GC
@@ -1483,9 +1495,8 @@
       heap_growth_max_(heap_growth_max),
       garbage_collection_time_ratio_(garbage_collection_time_ratio),
       idle_gc_threshold_in_words_(0) {
-  intptr_t grow_heap = heap_growth_max / 2;
-  gc_threshold_in_words_ =
-      last_usage_.capacity_in_words + (kPageSizeInWords * grow_heap);
+  const intptr_t growth_in_pages = heap_growth_max / 2;
+  RecordUpdate(last_usage_, last_usage_, growth_in_pages, "initial");
 }
 
 PageSpaceController::~PageSpaceController() {}
@@ -1497,12 +1508,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-#if defined(TARGET_ARCH_IA32)
-  intptr_t headroom = 0;
-#else
-  intptr_t headroom = heap_->new_space()->CapacityInWords();
-#endif
-  return after.CombinedUsedInWords() > (gc_threshold_in_words_ + headroom);
+  return after.CombinedUsedInWords() > hard_gc_threshold_in_words_;
 }
 
 bool PageSpaceController::AlmostNeedsGarbageCollection(SpaceUsage after) const {
@@ -1512,7 +1518,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  return after.CombinedUsedInWords() > gc_threshold_in_words_;
+  return after.CombinedUsedInWords() > soft_gc_threshold_in_words_;
 }
 
 bool PageSpaceController::NeedsIdleGarbageCollection(SpaceUsage current) const {
@@ -1613,15 +1619,7 @@
   heap_->RecordData(PageSpace::kAllowedGrowth, grow_heap);
   last_usage_ = after;
 
-  // Save final threshold compared before growing.
-  gc_threshold_in_words_ =
-      after.CombinedUsedInWords() + (kPageSizeInWords * grow_heap);
-
-  // Set a tight idle threshold.
-  idle_gc_threshold_in_words_ =
-      after.CombinedUsedInWords() + (2 * kPageSizeInWords);
-
-  RecordUpdate(before, after, "gc");
+  RecordUpdate(before, after, grow_heap, "gc");
 }
 
 void PageSpaceController::EvaluateAfterLoading(SpaceUsage after) {
@@ -1637,38 +1635,57 @@
   growth_in_pages =
       Utils::Minimum(static_cast<intptr_t>(heap_growth_max_), growth_in_pages);
 
+  RecordUpdate(after, after, growth_in_pages, "loaded");
+}
+
+void PageSpaceController::RecordUpdate(SpaceUsage before,
+                                       SpaceUsage after,
+                                       intptr_t growth_in_pages,
+                                       const char* reason) {
   // Save final threshold compared before growing.
-  gc_threshold_in_words_ =
+  hard_gc_threshold_in_words_ =
       after.CombinedUsedInWords() + (kPageSizeInWords * growth_in_pages);
 
+  // Start concurrent marking when old-space has less than half of new-space
+  // available or less than 5% available.
+#if defined(TARGET_ARCH_IA32)
+  const intptr_t headroom = 0;  // No concurrent marking.
+#else
+  // Note that heap_ can be null in some unit tests.
+  const intptr_t new_space =
+      heap_ == nullptr ? 0 : heap_->new_space()->CapacityInWords();
+  const intptr_t headroom =
+      Utils::Maximum(new_space / 2, hard_gc_threshold_in_words_ / 20);
+#endif
+  soft_gc_threshold_in_words_ = hard_gc_threshold_in_words_ - headroom;
+
   // Set a tight idle threshold.
   idle_gc_threshold_in_words_ =
       after.CombinedUsedInWords() + (2 * kPageSizeInWords);
 
-  RecordUpdate(after, after, "loaded");
-}
-
-void PageSpaceController::RecordUpdate(SpaceUsage before,
-                                       SpaceUsage after,
-                                       const char* reason) {
 #if defined(SUPPORT_TIMELINE)
-  TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "UpdateGrowthLimit");
-  tbes.SetNumArguments(5);
-  tbes.CopyArgument(0, "Reason", reason);
-  tbes.FormatArgument(1, "Before.CombinedUsed (kB)", "%" Pd "",
-                      RoundWordsToKB(before.CombinedUsedInWords()));
-  tbes.FormatArgument(2, "After.CombinedUsed (kB)", "%" Pd "",
-                      RoundWordsToKB(after.CombinedUsedInWords()));
-  tbes.FormatArgument(3, "Threshold (kB)", "%" Pd "",
-                      RoundWordsToKB(gc_threshold_in_words_));
-  tbes.FormatArgument(4, "Idle Threshold (kB)", "%" Pd "",
-                      RoundWordsToKB(idle_gc_threshold_in_words_));
+  Thread* thread = Thread::Current();
+  if (thread != nullptr) {
+    TIMELINE_FUNCTION_GC_DURATION(thread, "UpdateGrowthLimit");
+    tbes.SetNumArguments(6);
+    tbes.CopyArgument(0, "Reason", reason);
+    tbes.FormatArgument(1, "Before.CombinedUsed (kB)", "%" Pd "",
+                        RoundWordsToKB(before.CombinedUsedInWords()));
+    tbes.FormatArgument(2, "After.CombinedUsed (kB)", "%" Pd "",
+                        RoundWordsToKB(after.CombinedUsedInWords()));
+    tbes.FormatArgument(3, "Hard Threshold (kB)", "%" Pd "",
+                        RoundWordsToKB(hard_gc_threshold_in_words_));
+    tbes.FormatArgument(4, "Soft Threshold (kB)", "%" Pd "",
+                        RoundWordsToKB(soft_gc_threshold_in_words_));
+    tbes.FormatArgument(5, "Idle Threshold (kB)", "%" Pd "",
+                        RoundWordsToKB(idle_gc_threshold_in_words_));
+  }
 #endif
 
   if (FLAG_log_growth) {
     THR_Print("%s: threshold=%" Pd "kB, idle_threshold=%" Pd "kB, reason=%s\n",
               heap_->isolate_group()->source()->name,
-              gc_threshold_in_words_ / KBInWords,
+              hard_gc_threshold_in_words_ / KBInWords,
               idle_gc_threshold_in_words_ / KBInWords, reason);
   }
 }
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index a8ef135..d51e697 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -242,6 +242,11 @@
   void RecordUpdate(SpaceUsage before, SpaceUsage after, const char* reason);
   void MergeOtherPageSpaceController(PageSpaceController* other);
 
+  void RecordUpdate(SpaceUsage before,
+                    SpaceUsage after,
+                    intptr_t growth_in_pages,
+                    const char* reason);
+
   Heap* heap_;
 
   bool is_enabled_;
@@ -264,10 +269,13 @@
   // we grow the heap more aggressively.
   const int garbage_collection_time_ratio_;
 
-  // Perform a GC when capacity exceeds this amount.
-  intptr_t gc_threshold_in_words_;
+  // Perform a stop-the-world GC when usage exceeds this amount.
+  intptr_t hard_gc_threshold_in_words_;
 
-  // Start considering idle GC when capacity exceeds this amount.
+  // Begin concurrent marking when usage exceeds this amount.
+  intptr_t soft_gc_threshold_in_words_;
+
+  // Run idle GC if time permits when usage exceeds this amount.
   intptr_t idle_gc_threshold_in_words_;
 
   PageSpaceGarbageCollectionHistory history_;
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index f1d4b2a..d3c20b2 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -772,7 +772,6 @@
 
 void Scavenger::IterateWeakRoots(IsolateGroup* isolate_group,
                                  HandleVisitor* visitor) {
-  RunFinalizersScope tcis(Thread::Current());
   isolate_group->VisitWeakPersistentHandles(visitor);
 }
 
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 3c99bbb..cb8c0e3 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -167,6 +167,12 @@
         Array::element_offset(ArgumentsDescriptor::kCountIndex)));
   }
 
+  DART_FORCE_INLINE static intptr_t ArgDescArgSize(RawArray* argdesc) {
+    return Smi::Value(*reinterpret_cast<RawSmi**>(
+        reinterpret_cast<uword>(argdesc->ptr()) +
+        Array::element_offset(ArgumentsDescriptor::kSizeIndex)));
+  }
+
   DART_FORCE_INLINE static intptr_t ArgDescPosCount(RawArray* argdesc) {
     return Smi::Value(*reinterpret_cast<RawSmi**>(
         reinterpret_cast<uword>(argdesc->ptr()) +
@@ -2122,7 +2128,7 @@
           SP[0] = Smi::New(0);  // Patch null length with zero length.
           SP[1] = thread->isolate()->object_store()->growable_list_factory();
           // Change the ArgumentsDescriptor of the call with a new cached one.
-          argdesc_ = ArgumentsDescriptor::New(
+          argdesc_ = ArgumentsDescriptor::NewBoxed(
               0, KernelBytecode::kNativeCallToGrowableListArgc);
           // Replace PC to the return trampoline so ReturnTOS would see
           // a call bytecode at return address and will be able to get argc
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 4b3e5e5..84927d1 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2407,6 +2407,12 @@
   visitor->VisitPointer(
       reinterpret_cast<RawObject**>(&deoptimized_code_array_));
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_));
+  if (isolate_group_ != nullptr) {
+    if (isolate_group_->source()->hot_reload_blobs_ != nullptr) {
+      visitor->VisitPointer(reinterpret_cast<RawObject**>(
+          &(isolate_group_->source()->hot_reload_blobs_)));
+    }
+  }
 #if !defined(PRODUCT)
   visitor->VisitPointer(
       reinterpret_cast<RawObject**>(&pending_service_extension_calls_));
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index f2389bb..5ee8098 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -198,7 +198,9 @@
         kernel_buffer_size(kernel_buffer_size),
         flags(flags),
         script_kernel_buffer(nullptr),
-        script_kernel_size(-1) {}
+        script_kernel_size(-1),
+        hot_reload_blobs_(nullptr),
+        num_hot_reloads_(0) {}
   ~IsolateGroupSource() { free(name); }
 
   // The arguments used for spawning in
@@ -219,6 +221,10 @@
   // invoking the "main" script.
   // Any newly spawned isolates need to use this permutation map.
   std::unique_ptr<intptr_t[]> cid_permutation_map;
+
+  // List of weak pointers to external typed data for hot reload blobs.
+  RawArray* hot_reload_blobs_;
+  intptr_t num_hot_reloads_;
 };
 
 // Tracks idle time and notifies heap when idle time expired.
@@ -476,7 +482,6 @@
  private:
   friend class Heap;
   friend class StackFrame;  // For `[isolates_].First()`.
-  friend class RunFinalizersScope;  // For `[isolates_].First()`.
 
 #define ISOLATE_GROUP_FLAG_BITS(V) V(CompactionInProgress)
 
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 700154e..5652c1a 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -628,6 +628,62 @@
       kernel_program = kernel::Program::ReadFromTypedData(typed_data);
     }
 
+    ExternalTypedData& external_typed_data =
+        ExternalTypedData::Handle(Z, kernel_program.get()->typed_data()->raw());
+    IsolateGroupSource* source = Isolate::Current()->source();
+    Array& hot_reload_blobs = Array::Handle();
+    bool saved_external_typed_data = false;
+    if (source->hot_reload_blobs_ != nullptr) {
+      hot_reload_blobs = source->hot_reload_blobs_;
+
+      // Walk the array, and (if stuff was removed) compact and reuse the space.
+      // Note that the space has to be compacted as the ordering is important.
+      WeakProperty& weak_property = WeakProperty::Handle();
+      WeakProperty& weak_property_tmp = WeakProperty::Handle();
+      ExternalTypedData& existing_entry = ExternalTypedData::Handle(Z);
+      intptr_t next_entry_index = 0;
+      for (intptr_t i = 0; i < hot_reload_blobs.Length(); i++) {
+        weak_property ^= hot_reload_blobs.At(i);
+        if (weak_property.key() != ExternalTypedData::null()) {
+          if (i != next_entry_index) {
+            existing_entry = ExternalTypedData::RawCast(weak_property.key());
+            weak_property_tmp ^= hot_reload_blobs.At(next_entry_index);
+            weak_property_tmp.set_key(existing_entry);
+          }
+          next_entry_index++;
+        }
+      }
+      if (next_entry_index < hot_reload_blobs.Length()) {
+        // There's now space to re-use.
+        weak_property ^= hot_reload_blobs.At(next_entry_index);
+        weak_property.set_key(external_typed_data);
+        next_entry_index++;
+        saved_external_typed_data = true;
+      }
+      if (next_entry_index < hot_reload_blobs.Length()) {
+        ExternalTypedData& nullExternalTypedData = ExternalTypedData::Handle(Z);
+        while (next_entry_index < hot_reload_blobs.Length()) {
+          // Null out any extra spaces.
+          weak_property ^= hot_reload_blobs.At(next_entry_index);
+          weak_property.set_key(nullExternalTypedData);
+          next_entry_index++;
+        }
+      }
+    }
+    if (!saved_external_typed_data) {
+      const WeakProperty& weak_property =
+          WeakProperty::Handle(WeakProperty::New(Heap::kOld));
+      weak_property.set_key(external_typed_data);
+
+      intptr_t length =
+          hot_reload_blobs.IsNull() ? 0 : hot_reload_blobs.Length();
+      Array& new_array =
+          Array::Handle(Array::Grow(hot_reload_blobs, length + 1, Heap::kOld));
+      new_array.SetAt(length, weak_property);
+      source->hot_reload_blobs_ = new_array.raw();
+    }
+    source->num_hot_reloads_++;
+
     modified_libs_ = new (Z) BitVector(Z, num_old_libs_);
     kernel::KernelLoader::FindModifiedLibraries(
         kernel_program.get(), first_isolate_, modified_libs_, force_reload,
@@ -888,23 +944,18 @@
     success = false;
   }
 
-  // Once we --enable-isolate-groups in JIT again, we have to ensure unwind
-  // errors will be propagated to all isolates.
-  if (result.IsUnwindError()) {
-    const auto& error = Error::Cast(result);
-    if (thread->top_exit_frame_info() == 0) {
-      // We can only propagate errors when there are Dart frames on the stack.
-      // In this case there are no Dart frames on the stack and we set the
-      // thread's sticky error. This error will be returned to the message
-      // handler.
-      thread->set_sticky_error(error);
-    } else {
-      // If the tag handler returns with an UnwindError error, propagate it and
-      // give up.
-      Exceptions::PropagateError(error);
-      UNREACHABLE();
+  // Re-queue any shutdown requests so they can inform each isolate's own thread
+  // to shut down.
+  isolateIndex = 0;
+  ForEachIsolate([&](Isolate* isolate) {
+    tmp = results.At(isolateIndex);
+    if (tmp.IsUnwindError()) {
+      Isolate::KillIfExists(isolate, UnwindError::Cast(tmp).is_user_initiated()
+                                         ? Isolate::kKillMsg
+                                         : Isolate::kInternalKillMsg);
     }
-  }
+    isolateIndex++;
+  });
 
   return success;
 }
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index c1103d1..fe02d0b 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -181,29 +181,16 @@
   const String& uri = String::Handle(String::New(script_uri));
   const Object& ret = Object::Handle(
       isolate->CallTagHandler(Dart_kKernelTag, Object::null_object(), uri));
-  Api::Scope api_scope(thread);
-  Dart_Handle retval = Api::NewHandle(thread, ret.raw());
-  {
-    TransitionVMToNative transition(thread);
-    if (!Dart_IsError(retval)) {
-      Dart_TypedData_Type data_type;
-      uint8_t* data;
-      ASSERT(Dart_IsTypedData(retval));
-
-      uint8_t* kernel_buffer;
-      intptr_t kernel_buffer_size;
-      Dart_Handle val = Dart_TypedDataAcquireData(
-          retval, &data_type, reinterpret_cast<void**>(&data),
-          &kernel_buffer_size);
-      ASSERT(!Dart_IsError(val));
-      ASSERT(data_type == Dart_TypedData_kUint8);
-      kernel_buffer = reinterpret_cast<uint8_t*>(malloc(kernel_buffer_size));
-      memmove(kernel_buffer, data, kernel_buffer_size);
-      Dart_TypedDataReleaseData(retval);
-
-      kernel_program = kernel::Program::ReadFromBuffer(
-          kernel_buffer, kernel_buffer_size, error);
-    } else if (error != nullptr) {
+  if (ret.IsExternalTypedData()) {
+    const auto& typed_data = ExternalTypedData::Handle(
+        thread->zone(), ExternalTypedData::RawCast(ret.raw()));
+    kernel_program = kernel::Program::ReadFromTypedData(typed_data);
+    return kernel_program;
+  } else if (error != nullptr) {
+    Api::Scope api_scope(thread);
+    Dart_Handle retval = Api::NewHandle(thread, ret.raw());
+    {
+      TransitionVMToNative transition(thread);
       *error = Dart_GetError(retval);
     }
   }
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 46e3efc..845d10e 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -439,6 +439,27 @@
     Dart_CloseNativePort(port_);
   }
 
+  intptr_t setDillData(Dart_CObject** dills_array,
+                       intptr_t dill_num,
+                       const uint8_t* buffer,
+                       intptr_t buffer_size) {
+    if (buffer != nullptr) {
+      dills_array[dill_num] = new Dart_CObject;
+      dills_array[dill_num]->type = Dart_CObject_kExternalTypedData;
+      dills_array[dill_num]->value.as_external_typed_data.type =
+          Dart_TypedData_kUint8;
+      dills_array[dill_num]->value.as_external_typed_data.length = buffer_size;
+      dills_array[dill_num]->value.as_external_typed_data.data =
+          const_cast<uint8_t*>(buffer);
+      dills_array[dill_num]->value.as_external_typed_data.peer =
+          const_cast<uint8_t*>(buffer);
+      dills_array[dill_num]->value.as_external_typed_data.callback =
+          PassThroughFinalizer;
+      dill_num++;
+    }
+    return dill_num;
+  }
+
   Dart_KernelCompilationResult SendAndWaitForResponse(
       Dart_Port kernel_port,
       const char* expression,
@@ -517,6 +538,86 @@
     isolate_id.value.as_int64 =
         isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0;
 
+    IsolateGroupSource* source = Isolate::Current()->source();
+    intptr_t num_dills = 0;
+    if (source->kernel_buffer != nullptr) {
+      num_dills++;
+    }
+    if (source->script_kernel_buffer != nullptr) {
+      num_dills++;
+    }
+    Array& hot_reload_blobs = Array::Handle();
+    if (source->hot_reload_blobs_ != nullptr) {
+      hot_reload_blobs = source->hot_reload_blobs_;
+      WeakProperty& weak_property = WeakProperty::Handle();
+      for (intptr_t i = 0; i < hot_reload_blobs.Length(); i++) {
+        weak_property ^= hot_reload_blobs.At(i);
+        if (weak_property.key() != ExternalTypedData::null()) {
+          num_dills++;
+        }
+      }
+    }
+    // TODO(jensj): Get the platform somehow. Currently the dart side simply
+    // loads the dill from file.
+
+    Dart_CObject dills_object;
+    dills_object.type = Dart_CObject_kArray;
+    dills_object.value.as_array.length = num_dills;
+
+    Dart_CObject** dills_array = new Dart_CObject*[num_dills];
+    intptr_t dill_num = 0;
+    dill_num = setDillData(dills_array, dill_num, source->kernel_buffer,
+                           source->kernel_buffer_size);
+    dill_num = setDillData(dills_array, dill_num, source->script_kernel_buffer,
+                           source->script_kernel_size);
+    if (!hot_reload_blobs.IsNull()) {
+      WeakProperty& weak_property = WeakProperty::Handle();
+      for (intptr_t i = 0; i < hot_reload_blobs.Length(); i++) {
+        weak_property ^= hot_reload_blobs.At(i);
+        if (weak_property.key() != ExternalTypedData::null()) {
+          ExternalTypedData& externalTypedData = ExternalTypedData::Handle(
+              thread->zone(), ExternalTypedData::RawCast(weak_property.key()));
+          NoSafepointScope no_safepoint(thread);
+          const uint8_t* data = const_cast<uint8_t*>(
+              reinterpret_cast<uint8_t*>(externalTypedData.DataAddr(0)));
+          dill_num = setDillData(dills_array, dill_num, data,
+                                 externalTypedData.Length());
+        }
+      }
+    }
+    dills_object.value.as_array.values = dills_array;
+
+    Dart_CObject hot_reload_count;
+    hot_reload_count.type = Dart_CObject_kInt64;
+    hot_reload_count.value.as_int64 = source->num_hot_reloads_;
+
+    Dart_CObject suppress_warnings;
+    suppress_warnings.type = Dart_CObject_kBool;
+    suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
+
+    Dart_CObject enable_asserts;
+    enable_asserts.type = Dart_CObject_kBool;
+    enable_asserts.value.as_bool =
+        isolate != NULL ? isolate->asserts() : FLAG_enable_asserts;
+
+    intptr_t num_experimental_flags = experimental_flags->length();
+    Dart_CObject** experimental_flags_array =
+        new Dart_CObject*[num_experimental_flags];
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      experimental_flags_array[i] = new Dart_CObject;
+      experimental_flags_array[i]->type = Dart_CObject_kString;
+      experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
+    }
+    Dart_CObject experimental_flags_object;
+    experimental_flags_object.type = Dart_CObject_kArray;
+    experimental_flags_object.value.as_array.values = experimental_flags_array;
+    experimental_flags_object.value.as_array.length = num_experimental_flags;
+
+    Dart_CObject bytecode;
+    bytecode.type = Dart_CObject_kBool;
+    bytecode.value.as_bool =
+        FLAG_enable_interpreter || FLAG_use_bytecode_compiler;
+
     Dart_CObject message;
     message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
@@ -527,7 +628,13 @@
                                    &type_definitions_object,
                                    &library_uri_object,
                                    &class_object,
-                                   &is_static_object};
+                                   &is_static_object,
+                                   &dills_object,
+                                   &hot_reload_count,
+                                   &suppress_warnings,
+                                   &enable_asserts,
+                                   &experimental_flags_object,
+                                   &bytecode};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
 
@@ -555,6 +662,16 @@
     }
     delete[] type_definitions_array;
 
+    for (intptr_t i = 0; i < num_dills; ++i) {
+      delete dills_array[i];
+    }
+    delete[] dills_array;
+
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      delete experimental_flags_array[i];
+    }
+    delete[] experimental_flags_array;
+
     return result_;
   }
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index eedc433..88bed84 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -204,8 +204,11 @@
               program_->kernel_data(),
               program_->kernel_data_size(),
               0),
-      type_translator_(&helper_, &active_class_, /* finalize= */ false),
       constant_reader_(&helper_, &active_class_),
+      type_translator_(&helper_,
+                       &constant_reader_,
+                       &active_class_,
+                       /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
       bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
@@ -453,8 +456,11 @@
           KernelProgramInfo::ZoneHandle(zone_, script.kernel_program_info())),
       translation_helper_(this, thread_, Heap::kOld),
       helper_(zone_, &translation_helper_, script, kernel_data, 0),
-      type_translator_(&helper_, &active_class_, /* finalize= */ false),
       constant_reader_(&helper_, &active_class_),
+      type_translator_(&helper_,
+                       &constant_reader_,
+                       &active_class_,
+                       /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
       bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
@@ -942,7 +948,8 @@
 void KernelLoader::ReadInferredType(const Field& field,
                                     intptr_t kernel_offset) {
   const InferredTypeMetadata type =
-      inferred_type_metadata_helper_.GetInferredType(kernel_offset);
+      inferred_type_metadata_helper_.GetInferredType(kernel_offset,
+                                                     /*read_constant=*/false);
   if (type.IsTrivial()) {
     return;
   }
@@ -1021,8 +1028,22 @@
   if (library.Loaded()) return library.raw();
 
   library.set_is_nnbd(library_helper.IsNonNullableByDefault());
-  library.set_nnbd_compiled_mode(
-      library_helper.GetNonNullableByDefaultCompiledMode());
+  const NNBDCompiledMode mode =
+      library_helper.GetNonNullableByDefaultCompiledMode();
+  if (!FLAG_null_safety && mode == NNBDCompiledMode::kStrong) {
+    H.ReportError(
+        "Library '%s' was compiled with null safety (in strong mode) and it "
+        "requires --null-safety option at runtime",
+        String::Handle(library.url()).ToCString());
+  }
+  if (FLAG_null_safety && (mode == NNBDCompiledMode::kWeak ||
+                           mode == NNBDCompiledMode::kDisabled)) {
+    H.ReportError(
+        "Library '%s' was compiled without null safety (in weak mode) and it "
+        "cannot be used with --null-safety at runtime",
+        String::Handle(library.url()).ToCString());
+  }
+  library.set_nnbd_compiled_mode(mode);
 
   library_kernel_data_ = helper_.reader_.ExternalDataFromTo(
       library_kernel_offset_, library_kernel_offset_ + library_size);
@@ -1660,6 +1681,7 @@
                               true,   // is_method
                               false,  // is_closure
                               &function_node_helper);
+    T.SetupUnboxingInfoMetadata(function, library_kernel_offset_);
 
     if (library.is_dart_scheme() &&
         H.IsPrivate(constructor_helper.canonical_name_)) {
@@ -2004,6 +2026,7 @@
   T.SetupFunctionParameters(owner, function, is_method,
                             false,  // is_closure
                             &function_node_helper);
+  T.SetupUnboxingInfoMetadata(function, library_kernel_offset_);
 
   // Everything else is skipped implicitly, and procedure_helper and
   // function_node_helper are no longer used.
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index b3b42a1..3298101 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -406,8 +406,8 @@
   KernelProgramInfo& kernel_program_info_;
   BuildingTranslationHelper translation_helper_;
   KernelReaderHelper helper_;
-  TypeTranslator type_translator_;
   ConstantReader constant_reader_;
+  TypeTranslator type_translator_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   BytecodeMetadataHelper bytecode_metadata_helper_;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 8cb7b81..d15e41e 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -3593,6 +3593,8 @@
   Function& forwarder = Function::Handle(zone);
   forwarder ^= Object::Clone(*this, Heap::kOld);
 
+  forwarder.reset_unboxed_parameters_and_return();
+
   forwarder.set_name(mangled_name);
   forwarder.set_is_native(false);
   // TODO(dartbug.com/37737): Currently, we intentionally keep the recognized
@@ -4037,15 +4039,15 @@
       }
       call_args.SetAt(0, getter_result);
       const Array& call_args_descriptor_array = Array::Handle(
-          zone, ArgumentsDescriptor::New(kTypeArgsLen, call_args.Length(),
-                                         arg_names, Heap::kNew));
+          zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, call_args.Length(),
+                                              arg_names, Heap::kNew));
       // Call the closure.
       return DartEntry::InvokeClosure(call_args, call_args_descriptor_array);
     }
   }
-  const Array& args_descriptor_array =
-      Array::Handle(zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(),
-                                                   arg_names, Heap::kNew));
+  const Array& args_descriptor_array = Array::Handle(
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(),
+                                          arg_names, Heap::kNew));
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   const TypeArguments& type_args = Object::null_type_arguments();
   if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
@@ -7405,7 +7407,7 @@
                                  intptr_t num_arguments,
                                  const Array& argument_names,
                                  String* error_message) const {
-  const Array& args_desc_array = Array::Handle(ArgumentsDescriptor::New(
+  const Array& args_desc_array = Array::Handle(ArgumentsDescriptor::NewBoxed(
       num_type_arguments, num_arguments, argument_names, Heap::kNew));
   ArgumentsDescriptor args_desc(args_desc_array);
   return AreValidArguments(args_desc, error_message);
@@ -8000,6 +8002,7 @@
   result.set_is_optimizable(is_native ? false : true);
   result.set_is_background_optimizable(is_native ? false : true);
   result.set_is_inlinable(true);
+  result.reset_unboxed_parameters_and_return();
   result.SetInstructionsSafe(StubCode::LazyCompile());
   if (kind == RawFunction::kClosureFunction ||
       kind == RawFunction::kImplicitClosureFunction) {
@@ -12133,15 +12136,16 @@
       }
       call_args.SetAt(0, getter_result);
       const Array& call_args_descriptor_array =
-          Array::Handle(ArgumentsDescriptor::New(
+          Array::Handle(ArgumentsDescriptor::NewBoxed(
               kTypeArgsLen, call_args.Length(), arg_names, Heap::kNew));
       // Call closure.
       return DartEntry::InvokeClosure(call_args, call_args_descriptor_array);
     }
   }
 
-  const Array& args_descriptor_array = Array::Handle(ArgumentsDescriptor::New(
-      kTypeArgsLen, args.Length(), arg_names, Heap::kNew));
+  const Array& args_descriptor_array =
+      Array::Handle(ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(),
+                                                  arg_names, Heap::kNew));
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   const TypeArguments& type_args = Object::null_type_arguments();
   if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
@@ -12270,7 +12274,7 @@
     }
 
     const Array& args_desc =
-        Array::Handle(zone, ArgumentsDescriptor::New(
+        Array::Handle(zone, ArgumentsDescriptor::NewBoxed(
                                 num_type_args, arguments.Length(), Heap::kNew));
     result = DartEntry::InvokeFunction(callee, real_arguments, args_desc);
   }
@@ -14145,6 +14149,16 @@
   return args_desc.Count();
 }
 
+intptr_t ICData::SizeWithoutTypeArgs() const {
+  ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
+  return args_desc.Size();
+}
+
+intptr_t ICData::SizeWithTypeArgs() const {
+  ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
+  return args_desc.SizeWithTypeArgs();
+}
+
 uint32_t ICData::DeoptReasons() const {
   return DeoptReasonBits::decode(raw_ptr()->state_bits_);
 }
@@ -17039,7 +17053,8 @@
   const Array& args = Array::Handle(zone, Array::New(kNumArgs));
   args.SetAt(0, *this);
   const Array& args_descriptor = Array::Handle(
-      zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), Heap::kNew));
+      zone,
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), Heap::kNew));
 
   return InvokeInstanceFunction(*this, function, internal_getter_name, args,
                                 args_descriptor, respect_reflectable,
@@ -17085,7 +17100,8 @@
   args.SetAt(0, *this);
   args.SetAt(1, value);
   const Array& args_descriptor = Array::Handle(
-      zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), Heap::kNew));
+      zone,
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), Heap::kNew));
 
   return InvokeInstanceFunction(*this, setter, internal_setter_name, args,
                                 args_descriptor, respect_reflectable,
@@ -17110,9 +17126,9 @@
 
   // TODO(regis): Support invocation of generic functions with type arguments.
   const int kTypeArgsLen = 0;
-  const Array& args_descriptor =
-      Array::Handle(zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(),
-                                                   arg_names, Heap::kNew));
+  const Array& args_descriptor = Array::Handle(
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(),
+                                          arg_names, Heap::kNew));
 
   TypeArguments& type_args = TypeArguments::Handle(zone);
   if (klass.NumTypeArguments() > 0) {
@@ -17134,8 +17150,8 @@
       const Array& getter_args = Array::Handle(zone, Array::New(kNumArgs));
       getter_args.SetAt(0, *this);
       const Array& getter_args_descriptor = Array::Handle(
-          zone, ArgumentsDescriptor::New(kTypeArgsLen, getter_args.Length(),
-                                         Heap::kNew));
+          zone, ArgumentsDescriptor::NewBoxed(
+                    kTypeArgsLen, getter_args.Length(), Heap::kNew));
       const Object& getter_result = Object::Handle(
           zone, InvokeInstanceFunction(*this, function, getter_name,
                                        getter_args, getter_args_descriptor,
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index d5cde96..bed47a7 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1951,6 +1951,10 @@
 
   intptr_t CountWithoutTypeArgs() const;
 
+  intptr_t SizeWithoutTypeArgs() const;
+
+  intptr_t SizeWithTypeArgs() const;
+
   intptr_t deopt_id() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
@@ -2756,7 +2760,8 @@
   }
 
   bool HasThisParameter() const {
-    return IsDynamicFunction() || IsGenerativeConstructor();
+    return IsDynamicFunction(/*allow_abstract=*/true) ||
+           IsGenerativeConstructor();
   }
 
   bool IsDynamicFunction(bool allow_abstract = false) const {
@@ -3072,6 +3077,118 @@
 
   const char* ToQualifiedCString() const;
 
+  static constexpr intptr_t maximum_unboxed_parameter_count() {
+    // Subtracts one that represents the return value
+    return RawFunction::UnboxedParameterBitmap::kCapacity - 1;
+  }
+
+  void reset_unboxed_parameters_and_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    StoreNonPointer(&raw_ptr()->unboxed_parameters_info_,
+                    RawFunction::UnboxedParameterBitmap());
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  void set_unboxed_integer_parameter_at(intptr_t index) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(index >= 0 && index < maximum_unboxed_parameter_count());
+    index++;  // position 0 is reserved for the return value
+    const_cast<RawFunction::UnboxedParameterBitmap*>(
+        &raw_ptr()->unboxed_parameters_info_)
+        ->SetUnboxedInteger(index);
+#else
+    UNREACHABLE();
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  void set_unboxed_double_parameter_at(intptr_t index) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(index >= 0 && index < maximum_unboxed_parameter_count());
+    index++;  // position 0 is reserved for the return value
+    const_cast<RawFunction::UnboxedParameterBitmap*>(
+        &raw_ptr()->unboxed_parameters_info_)
+        ->SetUnboxedDouble(index);
+
+#else
+    UNREACHABLE();
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  void set_unboxed_integer_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    const_cast<RawFunction::UnboxedParameterBitmap*>(
+        &raw_ptr()->unboxed_parameters_info_)
+        ->SetUnboxedInteger(0);
+#else
+    UNREACHABLE();
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  void set_unboxed_double_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    const_cast<RawFunction::UnboxedParameterBitmap*>(
+        &raw_ptr()->unboxed_parameters_info_)
+        ->SetUnboxedDouble(0);
+
+#else
+    UNREACHABLE();
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool is_unboxed_parameter_at(intptr_t index) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(index >= 0);
+    index++;  // position 0 is reserved for the return value
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxed(index);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool is_unboxed_integer_parameter_at(intptr_t index) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(index >= 0);
+    index++;  // position 0 is reserved for the return value
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxedInteger(index);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool is_unboxed_double_parameter_at(intptr_t index) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(index >= 0);
+    index++;  // position 0 is reserved for the return value
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxedDouble(index);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool has_unboxed_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxed(0);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool has_unboxed_integer_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxedInteger(0);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  bool has_unboxed_double_return() const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return raw_ptr()->unboxed_parameters_info_.IsUnboxedDouble(0);
+#else
+    return false;
+#endif  //  !defined(DART_PRECOMPILED_RUNTIME)
+  }
+
   // Returns true if the type of this function is a subtype of the type of
   // the other function.
   bool IsSubtypeOf(const Function& other, Heap::Space space) const;
@@ -9376,16 +9493,19 @@
   friend class Class;
 };
 
-class TypedDataBase : public Instance {
+class PointerBase : public Instance {
+ public:
+  static intptr_t data_field_offset() {
+    return OFFSET_OF(RawPointerBase, data_);
+  }
+};
+
+class TypedDataBase : public PointerBase {
  public:
   static intptr_t length_offset() {
     return OFFSET_OF(RawTypedDataBase, length_);
   }
 
-  static intptr_t data_field_offset() {
-    return OFFSET_OF(RawTypedDataBase, data_);
-  }
-
   RawSmi* length() const { return raw_ptr()->length_; }
 
   intptr_t Length() const {
@@ -9457,7 +9577,7 @@
       (kTypedDataFloat64x2ArrayCid - kTypedDataInt8ArrayCid) / 3 + 1;
   static const intptr_t element_size_table[kNumElementSizes];
 
-  HEAP_OBJECT_IMPLEMENTATION(TypedDataBase, Instance);
+  HEAP_OBJECT_IMPLEMENTATION(TypedDataBase, PointerBase);
 };
 
 class TypedData : public TypedDataBase {
@@ -9790,23 +9910,18 @@
   static bool IsPointer(const Instance& obj);
 
   size_t NativeAddress() const {
-    return Integer::Handle(raw_ptr()->c_memory_address_).AsInt64Value();
+    return reinterpret_cast<size_t>(raw_ptr()->data_);
   }
 
   void SetNativeAddress(size_t address) const {
-    const auto& address_boxed = Integer::Handle(Integer::New(address));
-    NoSafepointScope no_safepoint_scope;
-    StorePointer(&raw_ptr()->c_memory_address_, address_boxed.raw());
+    uint8_t* value = reinterpret_cast<uint8_t*>(address);
+    StoreNonPointer(&raw_ptr()->data_, value);
   }
 
   static intptr_t type_arguments_offset() {
     return OFFSET_OF(RawPointer, type_arguments_);
   }
 
-  static intptr_t c_memory_address_offset() {
-    return OFFSET_OF(RawPointer, c_memory_address_);
-  }
-
   static intptr_t NextFieldOffset() { return sizeof(RawPointer); }
 
   static const intptr_t kNativeTypeArgPos = 0;
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index c5b6f67..b371eb6 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -186,8 +186,7 @@
   // Delete the weak persistent handle. GC root should now be local handle.
   {
     TransitionVMToNative transition(thread);
-    Dart_DeleteWeakPersistentHandle(Api::CastIsolate(thread->isolate()),
-                                    weak_persistent_handle);
+    Dart_DeleteWeakPersistentHandle(weak_persistent_handle);
     weak_persistent_handle = NULL;
   }
   result = graph.RetainingPath(&path, path);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index a1359fe..8834c9e 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2903,8 +2903,8 @@
   const String& target_name = String::Handle(Symbols::New(thread, "Thun"));
   const intptr_t kTypeArgsLen = 0;
   const intptr_t kNumArgs = 1;
-  const Array& args_descriptor = Array::Handle(
-      ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
+  const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
+      kTypeArgsLen, kNumArgs, Object::null_array()));
   ICData& o1 = ICData::Handle();
   o1 = ICData::New(function, target_name, args_descriptor, id, num_args_tested,
                    ICData::kInstance);
@@ -3706,7 +3706,7 @@
   // Add invocation dispatcher.
   const String& invocation_dispatcher_name =
       String::Handle(Symbols::New(thread, "myMethod"));
-  const Array& args_desc = Array::Handle(ArgumentsDescriptor::New(0, 1));
+  const Array& args_desc = Array::Handle(ArgumentsDescriptor::NewBoxed(0, 1));
   Function& invocation_dispatcher = Function::Handle();
   invocation_dispatcher ^= cls.GetInvocationDispatcher(
       invocation_dispatcher_name, args_desc,
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 4092129..93ac60e 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1008,6 +1008,63 @@
     kAsyncGen = kAsyncBit | kGeneratorBit,
   };
 
+  // Wraps a 64-bit integer to represent the bitmap for unboxed parameters and
+  // return value. Two bits are used for each of them - the first one indicates
+  // whether this value is unboxed or not, and the second one says whether it is
+  // an integer or a double. It includes the two bits for the receiver, even
+  // though currently we do not have information from TFA that allows the
+  // receiver to be unboxed.
+  class UnboxedParameterBitmap {
+   public:
+    static constexpr intptr_t kBitsPerParameter = 2;
+    static constexpr intptr_t kCapacity =
+        (kBitsPerByte * sizeof(uint64_t)) / kBitsPerParameter;
+
+    UnboxedParameterBitmap() : bitmap_(0) {}
+    explicit UnboxedParameterBitmap(uint64_t bitmap) : bitmap_(bitmap) {}
+    UnboxedParameterBitmap(const UnboxedParameterBitmap&) = default;
+    UnboxedParameterBitmap& operator=(const UnboxedParameterBitmap&) = default;
+
+    DART_FORCE_INLINE bool IsUnboxed(intptr_t position) const {
+      if (position >= kCapacity) {
+        return false;
+      }
+      ASSERT(Utils::TestBit(bitmap_, 2 * position) ||
+             !Utils::TestBit(bitmap_, 2 * position + 1));
+      return Utils::TestBit(bitmap_, 2 * position);
+    }
+    DART_FORCE_INLINE bool IsUnboxedInteger(intptr_t position) const {
+      if (position >= kCapacity) {
+        return false;
+      }
+      return Utils::TestBit(bitmap_, 2 * position) &&
+             !Utils::TestBit(bitmap_, 2 * position + 1);
+    }
+    DART_FORCE_INLINE bool IsUnboxedDouble(intptr_t position) const {
+      if (position >= kCapacity) {
+        return false;
+      }
+      return Utils::TestBit(bitmap_, 2 * position) &&
+             Utils::TestBit(bitmap_, 2 * position + 1);
+    }
+    DART_FORCE_INLINE void SetUnboxedInteger(intptr_t position) {
+      ASSERT(position < kCapacity);
+      bitmap_ |= Utils::Bit<decltype(bitmap_)>(2 * position);
+      ASSERT(!Utils::TestBit(bitmap_, 2 * position + 1));
+    }
+    DART_FORCE_INLINE void SetUnboxedDouble(intptr_t position) {
+      ASSERT(position < kCapacity);
+      bitmap_ |= Utils::Bit<decltype(bitmap_)>(2 * position);
+      bitmap_ |= Utils::Bit<decltype(bitmap_)>(2 * position + 1);
+    }
+    DART_FORCE_INLINE uint64_t Value() const { return bitmap_; }
+    DART_FORCE_INLINE bool IsEmpty() const { return bitmap_ == 0; }
+    DART_FORCE_INLINE void Reset() { bitmap_ = 0; }
+
+   private:
+    uint64_t bitmap_;
+  };
+
   static constexpr intptr_t kMaxFixedParametersBits = 15;
   static constexpr intptr_t kMaxOptionalParametersBits = 14;
 
@@ -1102,6 +1159,8 @@
 #undef DECLARE
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
+  NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
 };
 
 class RawClosureData : public RawObject {
@@ -2392,8 +2451,12 @@
   friend class String;
 };
 
-// Abstract base class for RawTypedData/RawExternalTypedData/RawTypedDataView.
-class RawTypedDataBase : public RawInstance {
+// Abstract base class for RawTypedData/RawExternalTypedData/RawTypedDataView/
+// Pointer.
+//
+// TypedData extends this with a length field, while Pointer extends this with
+// TypeArguments field.
+class RawPointerBase : public RawInstance {
  protected:
   // The contents of [data_] depends on what concrete subclass is used:
   //
@@ -2401,12 +2464,20 @@
   //  - RawExternalTypedData: Start of the C-heap payload.
   //  - RawTypedDataView: The [data_] field of the backing store for the view
   //    plus the [offset_in_bytes_] the view has.
+  //  - RawPointer: Pointer into C memory (no length specified).
   //
   // During allocation or snapshot reading the [data_] can be temporarily
   // nullptr (which is the case for views which just got created but haven't
   // gotten the backing store set).
   uint8_t* data_;
 
+ private:
+  RAW_HEAP_OBJECT_IMPLEMENTATION(PointerBase);
+};
+
+// Abstract base class for RawTypedData/RawExternalTypedData/RawTypedDataView.
+class RawTypedDataBase : public RawPointerBase {
+ protected:
   // The length of the view in element sizes (obtainable via
   // [TypedDataBase::ElementSizeInBytes]).
   RawSmi* length_;
@@ -2671,12 +2742,12 @@
   friend class RawBytecode;
 };
 
-class RawPointer : public RawInstance {
+class RawPointer : public RawPointerBase {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
+
   VISIT_FROM(RawCompressed, type_arguments_)
   RawTypeArguments* type_arguments_;
-  RawInteger* c_memory_address_;
-  VISIT_TO(RawCompressed, c_memory_address_)
+  VISIT_TO(RawCompressed, type_arguments_)
 
   friend class Pointer;
 };
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 178152b..7c8cb2d 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -193,14 +193,13 @@
   F(WeakProperty, value_)                                                      \
   F(MirrorReference, referent_)                                                \
   F(UserTag, label_)                                                           \
+  F(PointerBase, data_)                                                        \
   F(Pointer, type_arguments_)                                                  \
-  F(Pointer, c_memory_address_)                                                \
   F(DynamicLibrary, handle_)                                                   \
   F(FfiTrampolineData, signature_type_)                                        \
   F(FfiTrampolineData, c_signature_)                                           \
   F(FfiTrampolineData, callback_target_)                                       \
   F(FfiTrampolineData, callback_exceptional_return_)                           \
-  F(TypedDataBase, data_)                                                      \
   F(TypedDataBase, length_)                                                    \
   F(TypedDataView, typed_data_)                                                \
   F(TypedDataView, offset_in_bytes_)                                           \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 63b0aca..e9c7db7 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -509,7 +509,7 @@
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;
   ArgumentsDescriptor args_desc(Array::Handle(
-      zone, ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& getter =
       Function::Handle(zone, Resolver::ResolveDynamicForReceiverClass(
                                  receiver_class, getter_name, args_desc));
@@ -1055,8 +1055,8 @@
   const String& getter_name = String::Handle(Field::GetterName(target_name));
   const int kTypeArgsLen = 0;
   const int kNumArguments = 1;
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
+  ArgumentsDescriptor args_desc(Array::Handle(
+      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
   const Function& getter =
       Function::Handle(Resolver::ResolveDynamicForReceiverClass(
           receiver_class, getter_name, args_desc));
@@ -1323,6 +1323,7 @@
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg, 2) {
   const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(1));
+  RELEASE_ASSERT(!FLAG_precompiled_mode);
   GrowableArray<const Instance*> args(1);
   args.Add(&receiver);
   const Function& result =
@@ -1340,6 +1341,7 @@
   const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   const Instance& other = Instance::CheckedHandle(zone, arguments.ArgAt(1));
   const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(2));
+  RELEASE_ASSERT(!FLAG_precompiled_mode);
   GrowableArray<const Instance*> args(2);
   args.Add(&receiver);
   args.Add(&other);
@@ -1456,8 +1458,10 @@
   ASSERT(!old_target.HasOptionalParameters());
   ASSERT(!old_target.IsGeneric());
   const int kTypeArgsLen = 0;
+  // TODO(dartbug.com/33549): Update this code to use the size of the parameters
+  // when supporting calls to non-static methods with unboxed parameters.
   const Array& descriptor =
-      Array::Handle(zone, ArgumentsDescriptor::New(
+      Array::Handle(zone, ArgumentsDescriptor::NewBoxed(
                               kTypeArgsLen, old_target.num_fixed_parameters()));
   const ICData& ic_data =
       ICData::Handle(zone, ICData::New(caller_function, name, descriptor,
@@ -1775,8 +1779,11 @@
 
     const int kTypeArgsLen = 0;
     name = old_target.name();
-    descriptor = ArgumentsDescriptor::New(kTypeArgsLen,
-                                          old_target.num_fixed_parameters());
+    // TODO(dartbug.com/33549): Update this code to use the size of the
+    // parameters when supporting calls to non-static methods with
+    // unboxed parameters.
+    descriptor = ArgumentsDescriptor::NewBoxed(
+        kTypeArgsLen, old_target.num_fixed_parameters());
   }
 
   const ICData& ic_data =
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 2a129ba..72ce179 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -2808,7 +2808,7 @@
     return true;
   }
 
-  if (!KernelIsolate::IsRunning()) {
+  if (!KernelIsolate::IsRunning() && !KernelIsolate::Start()) {
     // Assume we are in dart1 mode where separate compilation is not required.
     // 0-length kernelBytes signals that we should evaluate expression in dart1
     // mode.
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 7ba614a..47f6060 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -547,8 +547,7 @@
   {
     TransitionVMToNative transition(thread);
     Dart_DeletePersistentHandle(persistent_handle);
-    Dart_DeleteWeakPersistentHandle(Dart_CurrentIsolate(),
-                                    weak_persistent_handle);
+    Dart_DeleteWeakPersistentHandle(weak_persistent_handle);
   }
 
   // Get persistent handles (again).
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 70fde68..cf563c4 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -1036,7 +1036,6 @@
   friend Isolate* CreateWithinExistingIsolateGroup(IsolateGroup*,
                                                    const char*,
                                                    char**);
-  friend class RunFinalizersScope;
   DISALLOW_COPY_AND_ASSIGN(Thread);
 };
 
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 748103e..70a4da9 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -488,7 +488,7 @@
   Function& owner = *CreateFunction("DummyFunction");
   String& name = String::Handle(String::New("foo"));
   const Array& args_desc =
-      Array::Handle(ArgumentsDescriptor::New(0, 0, Object::empty_array()));
+      Array::Handle(ArgumentsDescriptor::NewBoxed(0, 0, Object::empty_array()));
   for (intptr_t i = 0; i < kNumICData; i++) {
     ic_data = ICData::New(owner, name, args_desc, /*deopt_id=*/0,
                           /*num_args_tested=*/1, ICData::kInstance,
diff --git a/samples/ffi/async/sample_async_callback.dart b/samples/ffi/async/sample_async_callback.dart
index 697693b..f9d8ea4 100644
--- a/samples/ffi/async/sample_async_callback.dart
+++ b/samples/ffi/async/sample_async_callback.dart
@@ -26,7 +26,7 @@
   print("C T2 = Some C thread executing C.");
   print("C    = C T1 or C T2.");
   print("Dart: Setup.");
-  registerDart_PostCObject(NativeApi.nativeApiPostCObject);
+  registerDart_PostCObject(NativeApi.postCObject);
 
   final interactiveCppRequests = ReceivePort()..listen(requestExecuteCallback);
   final int nativePort = interactiveCppRequests.sendPort.nativePort;
diff --git a/samples/ffi/async/sample_native_port_call.dart b/samples/ffi/async/sample_native_port_call.dart
index 661d509..1e654ef 100644
--- a/samples/ffi/async/sample_native_port_call.dart
+++ b/samples/ffi/async/sample_native_port_call.dart
@@ -35,9 +35,9 @@
   print("C T2 = Some C thread executing C.");
   print("C    = C T1 or C T2.");
   print("Dart: Setup.");
-  registerDart_PostCObject(NativeApi.nativeApiPostCObject);
-  registerDart_NewNativePort(NativeApi.nativeApiNewNativePort);
-  registerDart_CloseNativePort(NativeApi.nativeApiCloseNativePort);
+  registerDart_PostCObject(NativeApi.postCObject);
+  registerDart_NewNativePort(NativeApi.newNativePort);
+  registerDart_CloseNativePort(NativeApi.closeNativePort);
 
   final interactiveCppRequests = ReceivePort()..listen(handleCppRequests);
   final int nativePort = interactiveCppRequests.sendPort.nativePort;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 9bec143..862dd7e 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -287,11 +287,6 @@
   if (setters != null) {
     var type = JS('', '#[#]', setters, name);
     if (type != null) {
-      if (JS('!', '# instanceof Array', type)) {
-        // The type has metadata attached.  Pull out just the type.
-        // TODO(jmesserly): remove when we remove mirrors
-        return JS('', '#[0]', type);
-      }
       return type;
     }
   }
@@ -556,6 +551,11 @@
       cast);
 }
 
+/// Pre-initializes types with empty type caches.
+///
+/// Required for the null-safe SDK. Stubbed here.
+addTypeCaches(type) => null;
+
 // TODO(jmesserly): should we do this for all interfaces?
 
 /// The well known symbol for testing `is Future`
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index f057e90..2bd044b 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -282,10 +282,6 @@
     return $f.apply($obj, $args);
   }
 
-  // TODO(vsm): Remove when we no longer need mirrors metadata.
-  // An array is used to encode annotations attached to the type.
-  if ($ftype instanceof Array) $ftype = $ftype[0];
-
   // Apply type arguments
   if ($ftype instanceof $GenericFunctionType) {
     let formalCount = $ftype.formalCount;
@@ -701,7 +697,7 @@
 Future loadLibrary() => Future.value();
 
 /// Defines lazy statics.
-void defineLazy(to, from) {
+void defineLazy(to, from, bool checkCycles) {
   for (var name in getOwnNamesAndSymbols(from)) {
     defineLazyField(to, name, getOwnPropertyDescriptor(from, name));
   }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
index c691cfd..5d5a251 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
@@ -53,9 +53,13 @@
   return JS('', '#.concat(#)', names, symbols);
 }
 
+/// Returns the value of field `name` on `obj`.
+///
+/// We use this instead of obj[name] since obj[name] checks the entire
+/// prototype chain instead of just `obj`.
 safeGetOwnProperty(obj, name) {
-  var desc = getOwnPropertyDescriptor(obj, name);
-  if (desc != null) return JS('', '#.value', desc);
+  if (JS<bool>('!', '#.hasOwnProperty(#)', obj, name))
+    return JS<Object>('', '#[#]', obj, name);
 }
 
 /// Defines a lazy static field.
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 5a80b9b..2148886 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -106,7 +106,7 @@
   Expando([String name])
       : this.name = name,
         _jsWeakMapOrKey = JS('bool', 'typeof WeakMap == "function"')
-            ? JS('=Object|Null', 'new WeakMap()')
+            ? JS('=Object', 'new WeakMap()')
             : _createKey();
 
   @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 548286b..113d7c9 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -8,6 +8,7 @@
 
 import 'dart:_js_embedded_names'
     show
+        ARRAY_RTI_PROPERTY,
         CURRENT_SCRIPT,
         DEFERRED_LIBRARY_PARTS,
         DEFERRED_PART_URIS,
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 056e267..1ab9ce3 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -98,12 +98,15 @@
 Object setRuntimeTypeInfo(Object target, var rti) {
   if (JS_GET_FLAG('USE_NEW_RTI')) {
     assert(rti != null);
+    var rtiProperty = JS_EMBEDDED_GLOBAL('', ARRAY_RTI_PROPERTY);
+    JS('var', r'#[#] = #', target, rtiProperty, rti);
+    return target;
   } else {
     assert(rti == null || isJsArray(rti));
+    String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
+    JS('var', r'#[#] = #', target, rtiName, rti);
+    return target;
   }
-  String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
-  JS('var', r'#[#] = #', target, rtiName, rti);
-  return target;
 }
 
 /// Returns the runtime type information of [target]. The returned value is a
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index 8a77b19..c9a52ea 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -313,8 +313,7 @@
 class NativeTypedData implements TypedData {
   /// Returns the byte buffer associated with this object.
   @Creates('NativeByteBuffer')
-  // May be Null for IE's CanvasPixelArray.
-  @Returns('NativeByteBuffer|Null')
+  @Returns('NativeByteBuffer')
   final ByteBuffer buffer;
 
   /// Returns the length of this view, in bytes.
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index a0ee070..3676147 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -30,6 +30,7 @@
         JsBuiltin,
         JsGetName,
         RtiUniverseFieldNames,
+        ARRAY_RTI_PROPERTY,
         CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME,
         RTI_UNIVERSE,
         TYPES;
@@ -685,7 +686,7 @@
   // IE11 we would have to synthesise a String property-name with almost zero
   // chance of conflict.
 
-  var rti = JS('', r'#[#]', object, JS_GET_NAME(JsGetName.RTI_NAME));
+  var rti = JS('', r'#[#]', object, JS_EMBEDDED_GLOBAL('', ARRAY_RTI_PROPERTY));
   var defaultRti = getJSArrayInteropRti();
 
   // Case 3.
@@ -770,12 +771,19 @@
 Type createRuntimeType(Rti rti) {
   _Type type = Rti._getCachedRuntimeType(rti);
   if (type != null) return type;
-  // TODO(fishythefish, https://github.com/dart-lang/language/issues/428) For
-  // NNBD transition, canonicalization may be needed. It might be possible to
-  // generate a star-free recipe from the canonical recipe and evaluate that.
-  type = _Type(rti);
-  Rti._setCachedRuntimeType(rti, type);
-  return type;
+  if (JS_GET_FLAG('PRINT_LEGACY_STARS')) {
+    return _Type(rti);
+  } else {
+    String recipe = Rti._getCanonicalRecipe(rti);
+    String starErasedRecipe = JS('String', '#.replace(/\\*/g, "")', recipe);
+    if (starErasedRecipe == recipe) {
+      return _Type(rti);
+    }
+    Rti starErasedRti = _Universe.eval(_theUniverse(), starErasedRecipe, true);
+    type = Rti._getCachedRuntimeType(starErasedRti) ?? _Type(starErasedRti);
+    Rti._setCachedRuntimeType(rti, type);
+    return type;
+  }
 }
 
 /// Called from generated code in the constant pool.
@@ -786,15 +794,9 @@
 /// Implementation of [Type] based on Rti.
 class _Type implements Type {
   final Rti _rti;
-  int _hashCode;
 
-  _Type(this._rti);
-
-  int get hashCode => _hashCode ??= Rti._getCanonicalRecipe(_rti).hashCode;
-
-  @pragma('dart2js:noInline')
-  bool operator ==(other) {
-    return (other is _Type) && identical(_rti, other._rti);
+  _Type(this._rti) : assert(Rti._getCachedRuntimeType(_rti) == null) {
+    Rti._setCachedRuntimeType(_rti, this);
   }
 
   @override
@@ -818,38 +820,36 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  int kind = Rti._getKind(testRti);
 
   var isFn = RAW_DART_FUNCTION_REF(_generalIsTestImplementation);
 
-  if (isTopType(testRti)) {
+  if (isObjectType(testRti)) {
+    isFn = RAW_DART_FUNCTION_REF(_isObject);
+    Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
+    Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
+  } else if (isTopType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isTop);
     var asFn = RAW_DART_FUNCTION_REF(_asTop);
     Rti._setAsCheckFunction(testRti, asFn);
     Rti._setTypeCheckFunction(testRti, asFn);
-  } else if (kind == Rti.kindInterface) {
-    String key = Rti._getCanonicalRecipe(testRti);
-
-    if (JS_GET_NAME(JsGetName.INT_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isInt);
-    } else if (JS_GET_NAME(JsGetName.DOUBLE_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isNum);
-    } else if (JS_GET_NAME(JsGetName.NUM_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isNum);
-    } else if (JS_GET_NAME(JsGetName.STRING_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isString);
-    } else if (JS_GET_NAME(JsGetName.BOOL_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isBool);
-    } else {
-      String name = Rti._getInterfaceName(testRti);
-      var arguments = Rti._getInterfaceTypeArguments(testRti);
-      if (JS(
-          'bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
-        String propertyName =
-            '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
-        Rti._setSpecializedTestResource(testRti, propertyName);
-        isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
-      }
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isInt);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isNum);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<num>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isNum);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<String>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isString);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<bool>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isBool);
+  } else if (Rti._getKind(testRti) == Rti.kindInterface) {
+    String name = Rti._getInterfaceName(testRti);
+    var arguments = Rti._getInterfaceTypeArguments(testRti);
+    if (JS('bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
+      String propertyName =
+          '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
+      Rti._setSpecializedTestResource(testRti, propertyName);
+      isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
     }
   }
 
@@ -857,11 +857,23 @@
   return Rti._isCheck(testRti, object);
 }
 
+bool _nullIs(Rti testRti) {
+  int kind = Rti._getKind(testRti);
+  return isTopType(testRti) ||
+      kind == Rti.kindStar &&
+          Rti._getKind(Rti._getStarArgument(testRti)) == Rti.kindNever ||
+      kind == Rti.kindQuestion ||
+      isNullType(testRti);
+}
+
 /// Called from generated code.
 bool _generalIsTestImplementation(object) {
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
+  if (JS_GET_FLAG('NNBD') && object == null) {
+    return _nullIs(testRti);
+  }
   Rti objectRti = instanceOrFunctionType(object, testRti);
   return isSubtype(_theUniverse(), objectRti, testRti);
 }
@@ -871,6 +883,9 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
+  if (JS_GET_FLAG('NNBD') && object == null) {
+    return _nullIs(testRti);
+  }
   var tag = Rti._getSpecializedTestResource(testRti);
 
   // This test is redundant with getInterceptor below, but getInterceptor does
@@ -886,11 +901,14 @@
 
 /// Called from generated code.
 _generalAsCheckImplementation(object) {
-  if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  if (Rti._isCheck(testRti, object)) return object;
+  if (object == null) {
+    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
+  } else {
+    if (Rti._isCheck(testRti, object)) return object;
+  }
 
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
@@ -900,11 +918,14 @@
 
 /// Called from generated code.
 _generalTypeCheckImplementation(object) {
-  if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  if (Rti._isCheck(testRti, object)) return object;
+  if (object == null) {
+    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
+  } else {
+    if (Rti._isCheck(testRti, object)) return object;
+  }
 
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
@@ -963,6 +984,26 @@
 // Specializations can be placed on Rti objects as the _as, _check and _is
 // 'methods'. They can also be called directly called from generated code.
 
+/// Specialization for 'is Object'.
+/// Called from generated code via Rti `_is` method.
+bool _isObject(object) {
+  return !JS_GET_FLAG('NNBD') || object != null;
+}
+
+/// Specialization for 'as Object'.
+/// Called from generated code via Rti `_as` method.
+dynamic _asObject(object) {
+  if (JS_GET_FLAG('LEGACY') || object != null) return object;
+  throw _CastError.forType(object, 'Object');
+}
+
+/// Specialization for check on 'Object'.
+/// Called from generated code via Rti `_check` method.
+dynamic _checkObject(object) {
+  if (JS_GET_FLAG('LEGACY') || object != null) return object;
+  throw _TypeError.forType(object, 'Object');
+}
+
 /// Specialization for 'is dynamic' and other top types.
 /// Called from generated code via Rti `_is` method.
 bool _isTop(object) {
@@ -1196,12 +1237,16 @@
   if (kind == Rti.kindStar) {
     Rti starArgument = Rti._getStarArgument(rti);
     String s = _rtiToString(starArgument, genericContext);
-    int argumentKind = Rti._getKind(starArgument);
-    if (argumentKind == Rti.kindFunction ||
-        argumentKind == Rti.kindGenericFunction) {
-      s = '(' + s + ')';
+    if (JS_GET_FLAG('PRINT_LEGACY_STARS')) {
+      int argumentKind = Rti._getKind(starArgument);
+      if (argumentKind == Rti.kindFunction ||
+          argumentKind == Rti.kindGenericFunction) {
+        s = '(' + s + ')';
+      }
+      return s + '*';
+    } else {
+      return s;
     }
-    return s + '*';
   }
 
   if (kind == Rti.kindQuestion) {
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index d93006b..24c2a08 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -123,6 +123,11 @@
 //    [INTERCEPTORS_BY_TAG] and [LEAF_TAGS].
 const ISOLATE_TAG = 'isolateTag';
 
+/// An embedded global that contains the property used to store type information
+/// on JavaScript Array instances. This is a Symbol (except for IE11, where is
+/// is a String).
+const ARRAY_RTI_PROPERTY = 'arrayRti';
+
 /// This embedded global (a function) returns the isolate-specific dispatch-tag
 /// that is used to accelerate interceptor calls.
 const DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
@@ -335,21 +340,6 @@
   /// String representation of the type of the JavaScriptFunction class.
   JS_FUNCTION_CLASS_TYPE_NAME,
 
-  /// String recipe for the [bool] type.
-  BOOL_RECIPE,
-
-  /// String recipe for the [double] type.
-  DOUBLE_RECIPE,
-
-  /// String recipe for the [int] type.
-  INT_RECIPE,
-
-  /// String recipe for the [num] type.
-  NUM_RECIPE,
-
-  /// String recipe for the [String] type.
-  STRING_RECIPE,
-
   /// Property name for Rti._is field.
   RTI_FIELD_IS,
 }
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index 4d21fb2..726f619 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -456,10 +456,10 @@
 int _nativeApiFunctionPointer(String symbol) native "NativeApiFunctionPointer";
 
 @patch
-class NativeApi {
+abstract class NativeApi {
   @patch
   static Pointer<NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>>
-      get nativeApiPostCObject =>
+      get postCObject =>
           Pointer.fromAddress(_nativeApiFunctionPointer("Dart_PostCObject"));
 
   @patch
@@ -468,11 +468,10 @@
           Int64 Function(
               Pointer<Uint8>,
               Pointer<NativeFunction<Dart_NativeMessageHandler>>,
-              Int8)>> get nativeApiNewNativePort =>
+              Int8)>> get newNativePort =>
       Pointer.fromAddress(_nativeApiFunctionPointer("Dart_NewNativePort"));
 
   @patch
-  static Pointer<NativeFunction<Int8 Function(Int64)>>
-      get nativeApiCloseNativePort => Pointer.fromAddress(
-          _nativeApiFunctionPointer("Dart_CloseNativePort"));
+  static Pointer<NativeFunction<Int8 Function(Int64)>> get closeNativePort =>
+      Pointer.fromAddress(_nativeApiFunctionPointer("Dart_CloseNativePort"));
 }
diff --git a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
index 05d0d81..cfa7a6d 100644
--- a/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
+++ b/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart
@@ -35,8 +35,9 @@
   // ArgumentsDescriptor layout. Keep in sync with enum in dart_entry.h.
   static const int _TYPE_ARGS_LEN = 0;
   static const int _COUNT = 1;
-  static const int _POSITIONAL_COUNT = 2;
-  static const int _FIRST_NAMED_ENTRY = 3;
+  static const int _SIZE = 2;
+  static const int _POSITIONAL_COUNT = 3;
+  static const int _FIRST_NAMED_ENTRY = 4;
 
   // Internal representation of the invocation mirror.
   String _functionName;
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index cdb8211..ed95a05 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -689,7 +689,7 @@
   }
 
   /**
-   * Applies  [streamTransformer] to this stream.
+   * Applies [streamTransformer] to this stream.
    *
    * Returns the transformed stream,
    * that is, the result of `streamTransformer.bind(this)`.
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index a834a9e..1fa356d 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -181,6 +181,9 @@
 }
 
 /// This class converts JSON objects to strings.
+///
+/// When used as a [StreamTransformer], this converter does not promise
+/// that the input object is emitted as a single string event.
 class JsonEncoder extends Converter<Object, String> {
   /// The string used for indention.
   ///
@@ -470,7 +473,14 @@
   }
 }
 
-/// This class parses JSON strings and builds the corresponding objects.
+/// This class parses JSON strings and builds the corresponding value.
+///
+/// A JSON input must be the JSON encoding of a single JSON value,
+/// which can be a list or map containing other values.
+///
+/// When used as a [StreamTransformer], the input stream may emit
+/// multiple strings. The concatenation of all of these strings must
+/// be a valid JSON encoding of a single JSON value.
 class JsonDecoder extends Converter<String, Object> {
   final Function(Object key, Object value) _reviver;
 
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index dedc8d4..89f5fb5 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -361,8 +361,8 @@
    *     1.toStringAsFixed(3);  // 1.000
    *     (4321.12345678).toStringAsFixed(3);  // 4321.123
    *     (4321.12345678).toStringAsFixed(5);  // 4321.12346
-   *     123456789012345678901.toStringAsFixed(3);  // 123456789012345683968.000
-   *     1000000000000000000000.toStringAsFixed(3); // 1e+21
+   *     123456789012345.toStringAsFixed(3);  // 123456789012345.000
+   *     10000000000000000.toStringAsFixed(4); // 10000000000000000.0000
    *     5.25.toStringAsFixed(0); // 5
    */
   String toStringAsFixed(int fractionDigits);
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index 26f5ff6..f9f0f63 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -629,13 +629,13 @@
 typedef Dart_NativeMessageHandler = Void Function(Int64, Pointer<Dart_CObject>);
 
 /// Exposes function pointers to functions in `dart_native_api.h`.
-class NativeApi {
+abstract class NativeApi {
   /// A function pointer to
   /// `bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message)`
   /// in `dart_native_api.h`.
   external static Pointer<
           NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>>
-      get nativeApiPostCObject;
+      get postCObject;
 
   /// A function pointer to
   /// ```
@@ -649,11 +649,11 @@
           Int64 Function(
               Pointer<Uint8>,
               Pointer<NativeFunction<Dart_NativeMessageHandler>>,
-              Int8)>> get nativeApiNewNativePort;
+              Int8)>> get newNativePort;
 
   /// A function pointer to
   /// `bool Dart_CloseNativePort(Dart_Port native_port_id)`
   /// in `dart_native_api.h`.
   external static Pointer<NativeFunction<Int8 Function(Int64)>>
-      get nativeApiCloseNativePort;
+      get closeNativePort;
 }
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 273c38d..9b20059 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -563,6 +563,17 @@
   }
 
   @patch
+  factory List.generate(int length, E generator(int index),
+      {bool growable = true}) {
+    final result = JSArray<E>.of(JS('', 'new Array(#)', length));
+    if (!growable) JSArray.markFixedList(result);
+    for (int i = 0; i < length; i++) {
+      result[i] = generator(i);
+    }
+    return result;
+  }
+
+  @patch
   factory List.unmodifiable(Iterable elements) {
     var list = List<E>.from(elements);
     JSArray.markUnmodifiableList(list);
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 36fb157..86c0b65 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -142,17 +142,17 @@
 
     // FutureOr<dynamic|void|Object?|Object*> --> dynamic|void|Object?|Object*
     if (_isTop(typeArg) ||
-        (_isLegacy(typeArg) &&
+        (_jsInstanceOf(typeArg, LegacyType) &&
             JS<bool>('!', '#.type === #', typeArg, Object))) {
       return typeArg;
     }
 
     // FutureOr<Never> --> Future<Never>
-    if (typeArg == never_) {
+    if (_equalType(typeArg, Never)) {
       return JS('!', '#(#)', getGenericClass(Future), typeArg);
     }
     // FutureOr<Null> --> Future<Null>?
-    if (typeArg == unwrapType(Null)) {
+    if (_equalType(typeArg, Null)) {
       return nullable(JS('!', '#(#)', getGenericClass(Future), typeArg));
     }
     // Otherwise, create the FutureOr<T> type as a normal generic type.
@@ -161,6 +161,7 @@
     // this method. This ensures that the we can test a type value returned here
     // as a FutureOr because it is equal to 'async.FutureOr` (in the JS).
     JS('!', '#[#] = #', genericType, _originalDeclaration, normalize);
+    JS('!', '#(#)', addTypeCaches, genericType);
     return genericType;
   }
 
@@ -216,6 +217,7 @@
     return value;
   }
   makeGenericType[$_genericTypeCtor] = $typeConstructor;
+  $addTypeCaches(makeGenericType);
   return makeGenericType;
 })()''');
 
@@ -284,7 +286,7 @@
   // Note that it is still possible to call typed JS interop methods on
   // extension types but the calls must be statically typed.
   if (JS('!', '#[#] != null', obj, _extensionType)) return false;
-  return JS('!', '!($obj instanceof $Object)');
+  return !_jsInstanceOf(obj, Object);
 }
 
 /// Get the type of a method from a type using the stored signature
@@ -299,11 +301,6 @@
   if (setters != null) {
     var type = JS('', '#[#]', setters, name);
     if (type != null) {
-      if (JS('!', '# instanceof Array', type)) {
-        // The type has metadata attached.  Pull out just the type.
-        // TODO(jmesserly): remove when we remove mirrors
-        return JS('', '#[0]', type);
-      }
       return type;
     }
   }
@@ -568,6 +565,16 @@
       cast);
 }
 
+/// Pre-initializes types with empty type caches.
+///
+/// Allows us to perform faster lookups on local caches without having to
+/// filter out the prototype chain. Also allows types to remain relatively
+/// monomorphic, which results in faster execution in V8.
+addTypeCaches(type) {
+  JS('', '#[#] = void 0', type, _cachedLegacy);
+  JS('', '#[#] = void 0', type, _cachedNullable);
+}
+
 // TODO(jmesserly): should we do this for all interfaces?
 
 /// The well known symbol for testing `is Future`
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index ca682cf..12a41a0 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -300,12 +300,8 @@
     return $f.apply($obj, $args);
   }
 
-  // TODO(vsm): Remove when we no longer need mirrors metadata.
-  // An array is used to encode annotations attached to the type.
-  if ($ftype instanceof Array) $ftype = $ftype[0];
-
   // Apply type arguments
-  if ($ftype instanceof $GenericFunctionType) {
+  if (${_jsInstanceOf(ftype, GenericFunctionType)}) {
     let formalCount = $ftype.formalCount;
 
     if ($typeArgs == null) {
@@ -409,39 +405,40 @@
 dsetindex(obj, index, value) =>
     callMethod(obj, '_set', null, [index, value], null, '[]=');
 
+/// General implementation of the Dart `is` operator.
+///
+/// Some basic cases are handled directly by the `.is` methods that are attached
+/// directly on types, but any query that requires checking subtyping relations
+/// is handled here.
 @notNull
 @JSExportName('is')
 bool instanceOf(obj, type) {
   if (obj == null) {
-    return identical(type, unwrapType(Null)) ||
+    return _equalType(type, Null) ||
         _isTop(type) ||
-        _isNullable(type);
+        _jsInstanceOf(type, NullableType);
   }
   return isSubtypeOf(getReifiedType(obj), type);
 }
 
+/// General implementation of the Dart `as` operator.
+///
+/// Some basic cases are handled directly by the `.as` methods that are attached
+/// directly on types, but any query that requires checking subtyping relations
+/// is handled here.
 @JSExportName('as')
 cast(obj, type, @notNull bool isImplicit) {
   // We hoist the common case where null is checked against another type here
   // for better performance.
-  if (obj == null) {
-    if (_isLegacy(type) ||
-        _isNullType(type) ||
-        _isTop(type) ||
-        _isNullable(type)) {
-      return obj;
-    }
-    if (_strictSubtypeChecks) {
-      return castError(obj, type, isImplicit);
-    }
+  if (obj == null && !_strictSubtypeChecks) {
     // Check the null comparison cache to avoid emitting repeated warnings.
     _nullWarnOnType(type);
     return obj;
+  } else {
+    var actual = getReifiedType(obj);
+    if (isSubtypeOf(actual, type)) return obj;
   }
-  var actual = getReifiedType(obj);
-  if (isSubtypeOf(actual, type)) {
-    return obj;
-  }
+
   return castError(obj, type, isImplicit);
 }
 
@@ -754,8 +751,89 @@
 Future loadLibrary() => Future.value();
 
 /// Defines lazy statics.
-void defineLazy(to, from) {
+///
+/// TODO: Remove useOldSemantics when non-null-safe late static field behavior is
+/// deprecated.
+void defineLazy(to, from, bool useOldSemantics) {
   for (var name in getOwnNamesAndSymbols(from)) {
-    defineLazyField(to, name, getOwnPropertyDescriptor(from, name));
+    if (useOldSemantics) {
+      defineLazyFieldOld(to, name, getOwnPropertyDescriptor(from, name));
+    } else {
+      defineLazyField(to, name, getOwnPropertyDescriptor(from, name));
+    }
   }
 }
+
+/// Defines a lazy static field.
+/// After initial get or set, it will replace itself with a value property.
+// TODO(jmesserly): reusing descriptor objects has been shown to improve
+// performance in other projects (e.g. webcomponents.js ShadowDOM polyfill).
+defineLazyField(to, name, desc) => JS('', '''(() => {
+  const initializer = $desc.get;
+  let init = initializer;
+  let value = null;
+  let executed = false;
+  $desc.get = function() {
+    if (init == null) return value;
+    if (!executed) {
+      // Record the field on first execution so we can reset it later if
+      // needed (hot restart).
+      $_resetFields.push(() => {
+        init = initializer;
+        value = null;
+      });
+      executed = true;
+    }
+    value = init();
+    init = null;
+    return value;
+  };
+  $desc.configurable = true;
+  if ($desc.set != null) {
+    $desc.set = function(x) {
+      init = null;
+      value = x;
+    };
+  }
+  return ${defineProperty(to, name, desc)};
+})()''');
+
+/// Defines a lazy static field with pre-null-safety semantics.
+defineLazyFieldOld(to, name, desc) => JS('', '''(() => {
+  const initializer = $desc.get;
+  let init = initializer;
+  let value = null;
+  $desc.get = function() {
+    if (init == null) return value;
+    let f = init;
+    init = $throwCyclicInitializationError;
+    if (f === init) f($name); // throw cycle error
+
+    // On the first (non-cyclic) execution, record the field so we can reset it
+    // later if needed (hot restart).
+    $_resetFields.push(() => {
+      init = initializer;
+      value = null;
+    });
+
+    // Try to evaluate the field, using try+catch to ensure we implement the
+    // correct Dart error semantics.
+    try {
+      value = f();
+      init = null;
+      return value;
+    } catch (e) {
+      init = null;
+      value = null;
+      throw e;
+    }
+  };
+  $desc.configurable = true;
+  if ($desc.set != null) {
+    $desc.set = function(x) {
+      init = null;
+      value = x;
+    };
+  }
+  return ${defineProperty(to, name, desc)};
+})()''');
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
index 0e86859..1f362a8 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
@@ -88,7 +88,7 @@
   switch (JS<String>('!', 'typeof #', obj)) {
     case "object":
       if (obj == null) return JS('', '#', Null);
-      if (JS('!', '# instanceof #', obj, Object)) {
+      if (_jsInstanceOf(obj, Object)) {
         return JS('', '#.constructor', obj);
       }
       var result = JS('', '#[#]', obj, _extensionType);
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
index 45efd17..4867462 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
@@ -170,7 +170,7 @@
 ///
 /// This is used by [hotRestart] to ensure we don't leak types from previous
 /// libraries.
-/// Results made against Null are cached in _nullComparisonMap and must be
+/// Results made against Null are cached in _nullComparisonSet and must be
 /// cleared separately.
 @notNull
 final List<Object> _cacheMaps = JS('!', '[]');
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 54253e1..4f5a6e2 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -5,6 +5,7 @@
 /// This library defines the representation of runtime types.
 part of dart._runtime;
 
+@notNull
 bool _strictSubtypeChecks = false;
 
 /// Sets the mode of the runtime subtype checks.
@@ -74,19 +75,25 @@
 
   @JSExportName('_check')
   check_T(object) => cast(object, this, true);
+
+  DartType() {
+    // Every instance of a DartType requires a set of type caches.
+    JS('', '#(this)', addTypeCaches);
+  }
 }
 
 class DynamicType extends DartType {
   toString() => 'dynamic';
 
+  @notNull
   @JSExportName('is')
   bool is_T(object) => true;
 
   @JSExportName('as')
-  as_T(object) => object;
+  Object? as_T(Object? object) => object;
 
   @JSExportName('_check')
-  check_T(object) => object;
+  Object? check_T(Object? object) => object;
 }
 
 @notNull
@@ -273,28 +280,37 @@
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
 Object nullable(type) {
-  if (_isNullable(type) ||
-      _isTop(type) ||
-      _isNullType(type) ||
-      // Normalize FutureOr<T?>? --> FutureOr<T?>
-      // All other runtime FutureOr normalization is in `normalizeFutureOr()`.
-      (_isFutureOr(type)) &&
-          _isNullable(JS<Object>('!', '#[0]', getGenericArgs(type)))) {
-    return type;
-  }
-  if (type == never_) return unwrapType(Null);
-  if (_isLegacy(type)) type = JS<Object>('', '#.type', type);
-
   // Check if a nullable version of this type has already been created.
-  if (JS<bool>('!', '#.hasOwnProperty(#)', type, _cachedNullable)) {
-    return JS<NullableType>('!', '#[#]', type, _cachedNullable);
+  var cached = JS<Object>('', '#[#]', type, _cachedNullable);
+  if (JS<bool>('!', '# !== void 0', cached)) {
+    return cached;
   }
+
   // Cache a canonical nullable version of this type on this type.
-  var cachedType = NullableType(JS<Type>('!', '#', type));
+  Object cachedType = _computeNullable(type);
   JS('', '#[#] = #', type, _cachedNullable, cachedType);
   return cachedType;
 }
 
+Object _computeNullable(type) {
+  // *? normalizes to ?.
+  if (_jsInstanceOf(type, LegacyType)) {
+    return nullable(JS<Object>('!', '#.type', type));
+  }
+  if (_jsInstanceOf(type, NullableType) ||
+      _isTop(type) ||
+      _equalType(type, Null) ||
+      // Normalize FutureOr<T?>? --> FutureOr<T?>
+      // All other runtime FutureOr normalization is in `normalizeFutureOr()`.
+      ((_isFutureOr(type)) &&
+          _jsInstanceOf(
+              JS<Object>('!', '#[0]', getGenericArgs(type)), NullableType))) {
+    return type;
+  }
+  if (_equalType(type, Never)) return unwrapType(Null);
+  return NullableType(type);
+}
+
 /// Returns a legacy (star, *) version of [type].
 ///
 /// The resulting type returned in a normalized form based on the rules from the
@@ -302,19 +318,29 @@
 /// https://github.com/dart-lang/language/blob/master/resources/type-system/normalization.md
 @notNull
 Object legacy(type) {
-  if (_isLegacy(type) || _isNullable(type) || _isTop(type) || _isNullType(type))
-    return type;
-
   // Check if a legacy version of this type has already been created.
-  if (JS<bool>('!', '#.hasOwnProperty(#)', type, _cachedLegacy)) {
-    return JS<LegacyType>('!', '#[#]', type, _cachedLegacy);
+  var cached = JS<Object>('', '#[#]', type, _cachedLegacy);
+  if (JS<bool>('!', '# !== void 0', cached)) {
+    return cached;
   }
+
   // Cache a canonical legacy version of this type on this type.
-  var cachedType = LegacyType(JS<Type>('!', '#', type));
+  Object cachedType = _computeLegacy(type);
   JS('', '#[#] = #', type, _cachedLegacy, cachedType);
   return cachedType;
 }
 
+Object _computeLegacy(type) {
+  // Note: ?* normalizes to ?, so we cache type? at type?[_cachedLegacy].
+  if (_jsInstanceOf(type, LegacyType) ||
+      _jsInstanceOf(type, NullableType) ||
+      _isTop(type) ||
+      _equalType(type, Null)) {
+    return type;
+  }
+  return LegacyType(JS<Type>('!', '#', type));
+}
+
 /// A wrapper to identify a nullable (question, ?) type of the form [type]?.
 class NullableType extends DartType {
   final Type type;
@@ -358,7 +384,7 @@
     if (obj == null) {
       // Object and Never are the only legacy types that should return true if
       // obj is `null`.
-      return JS<bool>('!', '# === # || # === #', type, Object, type, never_);
+      return _equalType(type, Object) || _equalType(type, Never);
     }
     return JS<bool>('!', '#.is(#)', type, obj);
   }
@@ -388,6 +414,16 @@
 
 class VoidType extends DartType {
   toString() => 'void';
+
+  @notNull
+  @JSExportName('is')
+  bool is_T(object) => true;
+
+  @JSExportName('as')
+  Object? as_T(Object? object) => object;
+
+  @JSExportName('_check')
+  Object? check_T(Object? object) => object;
 }
 
 @JSExportName('void')
@@ -427,7 +463,7 @@
 ///
 /// [isNormalized] is true when [type] is known to be in a canonicalized
 /// normal form, so the algorithm can directly wrap and return the value.
-Type wrapType(type, {isNormalized = false}) {
+Type wrapType(type, [@notNull bool isNormalized = false]) {
   // If we've already wrapped this type once, use the previous wrapper. This
   // way, multiple references to the same type return an identical Type.
   if (JS('!', '#.hasOwnProperty(#)', type, _typeObject)) {
@@ -435,8 +471,8 @@
   }
   var result = isNormalized
       ? _Type(type)
-      : (_isLegacy(type)
-          ? wrapType(type.type)
+      : (_jsInstanceOf(type, LegacyType)
+          ? wrapType(JS<Object>('!', '#.type', type))
           : _canonicalizeNormalizedTypeObject(type));
   JS('', '#[#] = #', type, _typeObject, result);
   return result;
@@ -447,7 +483,7 @@
 /// Used for type object identity. Normalization requires us to return a
 /// canonicalized version of the input with all legacy wrappers removed.
 Type _canonicalizeNormalizedTypeObject(type) {
-  assert(!_isLegacy(type));
+  assert(!_jsInstanceOf(type, LegacyType));
   // We don't call _canonicalizeNormalizedTypeObject recursively but call wrap
   // + unwrap to handle legacy types automatically and force caching the
   // canonicalized type under the _typeObject cache property directly. This
@@ -456,10 +492,10 @@
   Object normalizeHelper(a) => unwrapType(wrapType(a));
 
   // GenericFunctionTypeIdentifiers are implicitly normalized.
-  if (JS<bool>('!', '# instanceof #', type, GenericFunctionTypeIdentifier)) {
-    return wrapType(type, isNormalized: true);
+  if (_jsInstanceOf(type, GenericFunctionTypeIdentifier)) {
+    return wrapType(type, true);
   }
-  if (JS<bool>('!', '# instanceof #', type, FunctionType)) {
+  if (_jsInstanceOf(type, FunctionType)) {
     var normReturnType = normalizeHelper(type.returnType);
     var normArgs = type.args.map(normalizeHelper).toList();
     if (JS<bool>('!', '#.Object.keys(#).length === 0', global_, type.named) &&
@@ -467,11 +503,11 @@
             type.requiredNamed)) {
       if (type.optionals.isEmpty) {
         var normType = fnType(normReturnType, normArgs);
-        return wrapType(normType, isNormalized: true);
+        return wrapType(normType, true);
       }
       var normOptionals = type.optionals.map(normalizeHelper).toList();
       var normType = fnType(normReturnType, normArgs, normOptionals);
-      return wrapType(normType, isNormalized: true);
+      return wrapType(normType, true);
     }
     var normNamed = JS('', '{}');
     _transformJSObject(type.named, normNamed, normalizeHelper);
@@ -479,9 +515,9 @@
     _transformJSObject(type.requiredNamed, normRequiredNamed, normalizeHelper);
     var normType =
         fnType(normReturnType, normArgs, normNamed, normRequiredNamed);
-    return wrapType(normType, isNormalized: true);
+    return wrapType(normType, true);
   }
-  if (JS<bool>('!', '# instanceof #', type, GenericFunctionType)) {
+  if (_jsInstanceOf(type, GenericFunctionType)) {
     var formals = _getCanonicalTypeFormals(type.typeFormals.length);
     var normBounds =
         type.instantiateTypeBounds(formals).map(normalizeHelper).toList();
@@ -492,7 +528,7 @@
     JS('', '#.push(#)', typeObjectIdKey, normFunc);
     var memoizedId = _memoizeArray(_gFnTypeTypeMap, typeObjectIdKey,
         () => GenericFunctionTypeIdentifier(formals, normBounds, normFunc));
-    return wrapType(memoizedId, isNormalized: true);
+    return wrapType(memoizedId, true);
   }
   var args = getGenericArgs(type);
   var normType;
@@ -503,7 +539,7 @@
     var normArgs = args.map(normalizeHelper).toList();
     normType = JS('!', '#(...#)', genericClass, normArgs);
   }
-  return wrapType(normType, isNormalized: true);
+  return wrapType(normType, true);
 }
 
 /// Generates new values by applying [transform] to the values of [srcObject],
@@ -947,8 +983,8 @@
 
     bool hasFreeFormal(t) {
       // Ignore nullability wrappers.
-      if (_isLegacy(t) || _isNullable(t)) {
-        return hasFreeFormal(JS<Type>('', '#.type', t));
+      if (_jsInstanceOf(t, LegacyType) || _jsInstanceOf(t, NullableType)) {
+        return hasFreeFormal(JS<Object>('!', '#.type', t));
       }
       if (partials.containsKey(t)) return true;
       // Generic classes and typedefs.
@@ -1076,7 +1112,7 @@
   if ($type === void 0) return "undefined type";
   if ($type === null) return "null type";
   // Non-instance types
-  if ($type instanceof $DartType) {
+  if (${_jsInstanceOf(type, DartType)}) {
     return $type.toString();
   }
 
@@ -1210,8 +1246,8 @@
     bool result = JS('', '#.get(#)', map, t2);
     if (JS('!', '# !== void 0', result)) return result;
   }
-  var validSubtype = _isSubtype(t1, t2, true);
 
+  var validSubtype = _isSubtype(t1, t2, true);
   if (!validSubtype && !_strictSubtypeChecks) {
     validSubtype = _isSubtype(t1, t2, false);
     if (validSubtype) {
@@ -1228,27 +1264,39 @@
 final _subtypeCache = JS('', 'Symbol("_subtypeCache")');
 
 @notNull
-bool _isBottom(type, strictMode) => JS(
-    '!', '# === # || (!# && # === #)', type, never_, strictMode, type, bottom);
+bool _isBottom(type, @notNull bool strictMode) =>
+    _equalType(type, Never) || (!strictMode && _equalType(type, Null));
 
 @notNull
 bool _isTop(type) {
-  if (_isNullable(type)) return JS('!', '# === #', type.type, Object);
+  if (_jsInstanceOf(type, NullableType))
+    return JS('!', '#.type === #', type, Object);
 
-  return JS('!', '# === # || # === #', type, dynamic, type, void_);
+  return _equalType(type, dynamic) || JS('!', '# === #', type, void_);
 }
 
-/// Returns `true` if [type] represents a nullable (question, ?) type.
+/// Wraps the JavaScript `instanceof` operator returning  `true` if [type] is an
+/// instance of [cls].
+///
+/// This method is equivalent to:
+///
+///    JS<bool>('!', '# instanceof #', type, cls);
+///
+/// but the code is generated by the compiler directly (a low-tech way of
+/// inlining).
 @notNull
-bool _isNullable(type) => JS<bool>('!', '# instanceof #', type, NullableType);
+external bool _jsInstanceOf(type, cls);
 
-/// Returns `true` if [type] represents a legacy (star, *) type.
+/// Returns `true` if [type] is [cls].
+///
+/// This method is equivalent to:
+///
+///    JS<bool>('!', '# === #', type, unwrapType(cls));
+///
+/// but the code is generated by the compiler directly (a low-tech way of
+/// inlining).
 @notNull
-bool _isLegacy(type) => JS<bool>('!', '# instanceof #', type, LegacyType);
-
-/// Returns `true` if [type] is the [Null] type.
-@notNull
-bool _isNullType(type) => JS<bool>('!', '# === #', type, unwrapType(Null));
+external bool _equalType(type, cls);
 
 @notNull
 bool _isFutureOr(type) {
@@ -1257,14 +1305,15 @@
       getGenericClass(FutureOr));
 }
 
-bool _isSubtype(t1, t2, bool strictMode) => JS('bool', '''(() => {
+@notNull
+bool _isSubtype(t1, t2, bool strictMode) => JS<bool>('!', '''(() => {
   if (!$strictMode) {
     // Strip nullable types when performing check in weak mode.
     // TODO(nshahan) Investigate stripping off legacy types as well.
-    if (${_isNullable(t1)}) {
+    if (${_jsInstanceOf(t1, NullableType)}) {
       t1 = t1.type;
     }
-    if (${_isNullable(t2)}) {
+    if (${_jsInstanceOf(t2, NullableType)}) {
       t2 = t2.type;
     }
   }
@@ -1278,12 +1327,12 @@
   }
 
   // "Left Top".
-  if ($t1 == $dynamic || $t1 == $void_) {
+  if (${_equalType(t1, dynamic)} || $t1 === $void_) {
     return $_isSubtype($nullable($Object), $t2, $strictMode);
   }
 
   // "Right Object".
-  if ($t2 == $Object) {
+  if (${_equalType(t2, Object)}) {
     // TODO(nshahan) Need to handle type variables.
     // https://github.com/dart-lang/sdk/issues/38816
     if (${_isFutureOr(t1)}) {
@@ -1291,11 +1340,11 @@
       return $_isSubtype(t1TypeArg, $Object, $strictMode);
     }
 
-    if (${_isLegacy(t1)}) {
+    if (${_jsInstanceOf(t1, LegacyType)}) {
       return $_isSubtype(t1.type, t2, $strictMode);
     }
 
-    if (${_isNullType(t1)} || ${_isNullable(t1)}) {
+    if (${_equalType(t1, Null)} || ${_jsInstanceOf(t1, NullableType)}) {
       // Checks for t1 is dynamic or void already performed in "Left Top" test.
       return false;
     }
@@ -1303,7 +1352,7 @@
   }
 
   // "Left Null".
-  if ($t1 == $Null) {
+  if (${_equalType(t1, Null)}) {
     // TODO(nshahan) Need to handle type variables.
     // https://github.com/dart-lang/sdk/issues/38816
     if (${_isFutureOr(t2)}) {
@@ -1311,16 +1360,17 @@
       return $_isSubtype($Null, t2TypeArg, $strictMode);
     }
 
-    return $t2 == $Null || ${_isLegacy(t2)} || ${_isNullable(t2)};
+    return ${_equalType(t2, Null)} || ${_jsInstanceOf(t2, LegacyType)} ||
+        ${_jsInstanceOf(t2, NullableType)};
   }
 
   // "Left Legacy".
-  if (${_isLegacy(t1)}) {
+  if (${_jsInstanceOf(t1, LegacyType)}) {
     return $_isSubtype(t1.type, t2, $strictMode);
   }
 
   // "Right Legacy".
-  if (${_isLegacy(t2)}) {
+  if (${_jsInstanceOf(t2, LegacyType)}) {
     return $_isSubtype(t1, $nullable(t2.type), $strictMode);
   }
 
@@ -1339,11 +1389,12 @@
     // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
     let t1Future = ${getGenericClass(Future)}(t1TypeArg);
     // Known to handle the case FutureOr<Null> <: Future<Null>.
-    return $_isSubtype(t1Future, $t2, $strictMode) && $_isSubtype(t1TypeArg, $t2, $strictMode);
+    return $_isSubtype(t1Future, $t2, $strictMode) &&
+        $_isSubtype(t1TypeArg, $t2, $strictMode);
   }
 
   // "Left Nullable".
-  if (${_isNullable(t1)}) {
+  if (${_jsInstanceOf(t1, NullableType)}) {
     // TODO(nshahan) Need to handle type variables.
     // https://github.com/dart-lang/sdk/issues/38816
     return $_isSubtype(t1.type, t2, $strictMode) && $_isSubtype($Null, t2, $strictMode);
@@ -1360,7 +1411,7 @@
   }
 
   // "Right Nullable".
-  if (${_isNullable(t2)}) {
+  if (${_jsInstanceOf(t2, NullableType)}) {
     // TODO(nshahan) Need to handle type variables.
     // https://github.com/dart-lang/sdk/issues/38816
     return $_isSubtype(t1, t2.type, $strictMode) || $_isSubtype(t1, $Null, $strictMode);
@@ -1369,17 +1420,17 @@
   // "Traditional" name-based subtype check.  Avoid passing
   // function types to the class subtype checks, since we don't
   // currently distinguish between generic typedefs and classes.
-  if (!($t2 instanceof $AbstractFunctionType)) {
+  if (!${_jsInstanceOf(t2, AbstractFunctionType)}) {
     // t2 is an interface type.
 
-    if ($t1 instanceof $AbstractFunctionType) {
+    if (${_jsInstanceOf(t1, AbstractFunctionType)}) {
       // Function types are only subtypes of interface types `Function` (and top
       // types, handled already above).
-      return $t2 === $Function;
+      return ${_equalType(t2, Function)};
     }
 
     // All JS types are subtypes of anonymous JS types.
-    if ($t1 === $jsobject && $t2 instanceof $AnonymousJSType) {
+    if ($t1 === $jsobject && ${_jsInstanceOf(t2, AnonymousJSType)}) {
       return true;
     }
 
@@ -1388,13 +1439,13 @@
   }
 
   // Function subtyping.
-  if (!($t1 instanceof $AbstractFunctionType)) {
+  if (!${_jsInstanceOf(t1, AbstractFunctionType)}) {
     return false;
   }
 
   // Handle generic functions.
-  if ($t1 instanceof $GenericFunctionType) {
-    if (!($t2 instanceof $GenericFunctionType)) {
+  if (${_jsInstanceOf(t1, GenericFunctionType)}) {
+    if (!${_jsInstanceOf(t2, GenericFunctionType)}) {
       return false;
     }
 
@@ -1438,7 +1489,7 @@
 
     $t1 = $t1.instantiate(fresh);
     $t2 = $t2.instantiate(fresh);
-  } else if ($t2 instanceof $GenericFunctionType) {
+  } else if (${_jsInstanceOf(t2, GenericFunctionType)}) {
     return false;
   }
 
@@ -1449,24 +1500,24 @@
 bool _isInterfaceSubtype(t1, t2, strictMode) => JS('', '''(() => {
   // If we have lazy JS types, unwrap them.  This will effectively
   // reduce to a prototype check below.
-  if ($t1 instanceof $LazyJSType) $t1 = $t1.rawJSTypeForCheck();
-  if ($t2 instanceof $LazyJSType) $t2 = $t2.rawJSTypeForCheck();
+  if (${_jsInstanceOf(t1, LazyJSType)}) $t1 = $t1.rawJSTypeForCheck();
+  if (${_jsInstanceOf(t2, LazyJSType)}) $t2 = $t2.rawJSTypeForCheck();
 
   if ($t1 === $t2) {
     return true;
   }
-  if ($t1 === $Object) {
+  if (${_equalType(t1, Object)}) {
     return false;
   }
 
   // Classes cannot subtype `Function` or vice versa.
-  if ($t1 === $Function || $t2 === $Function) {
+  if (${_equalType(t1, Function)} || ${_equalType(t2, Function)}) {
     return false;
   }
 
   // If t1 is a JS Object, we may not hit core.Object.
   if ($t1 == null) {
-    return $t2 == $Object || $t2 == $dynamic;
+    return ${_equalType(t2, Object)} || ${_equalType(t2, dynamic)};
   }
 
   // Check if t1 and t2 have the same raw type.  If so, check covariance on
@@ -1733,7 +1784,7 @@
     if (_isTop(supertype)) return true;
     // `Null` is a subtype match for any type `Q` under no constraints.
     // Note that nullable types will change this.
-    if (_isNullType(subtype)) return true;
+    if (_equalType(subtype, Null)) return true;
 
     // Handle FutureOr<T> union type.
     if (_isFutureOr(subtype)) {
@@ -1840,8 +1891,7 @@
     // TODO(paulberry): implement this case.
     if (subtype is FunctionType) {
       if (supertype is! FunctionType) {
-        if (identical(supertype, unwrapType(Function)) ||
-            identical(supertype, unwrapType(Object))) {
+        if (_equalType(supertype, Function) || _equalType(supertype, Object)) {
           return true;
         } else {
           return false;
@@ -1857,7 +1907,7 @@
   bool _isTop(Object type) =>
       identical(type, _dynamic) ||
       identical(type, void_) ||
-      identical(type, unwrapType(Object));
+      _equalType(type, Object);
 }
 
 /// A constraint on a type parameter that we're inferring.
@@ -1907,7 +1957,7 @@
 /// contain different generic type arguments.
 Object? _getMatchingSupertype(Object? subtype, Object supertype) {
   if (identical(subtype, supertype)) return supertype;
-  if (subtype == null || subtype == unwrapType(Object)) return null;
+  if (subtype == null || _equalType(subtype, Object)) return null;
 
   var subclass = getGenericClass(subtype);
   var superclass = getGenericClass(supertype);
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
index c763ada..07a2faa 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
@@ -51,54 +51,15 @@
   return JS('', '#.concat(#)', names, symbols);
 }
 
+/// Returns the value of field `name` on `obj`.
+///
+/// We use this instead of obj[name] since obj[name] checks the entire
+/// prototype chain instead of just `obj`.
 safeGetOwnProperty(obj, name) {
-  var desc = getOwnPropertyDescriptor(obj, name);
-  if (desc != null) return JS('', '#.value', desc);
+  if (JS<bool>('!', '#.hasOwnProperty(#)', obj, name))
+    return JS<Object>('', '#[#]', obj, name);
 }
 
-/// Defines a lazy static field.
-/// After initial get or set, it will replace itself with a value property.
-// TODO(jmesserly): reusing descriptor objects has been shown to improve
-// performance in other projects (e.g. webcomponents.js ShadowDOM polyfill).
-defineLazyField(to, name, desc) => JS('', '''(() => {
-  const initializer = $desc.get;
-  let init = initializer;
-  let value = null;
-  $desc.get = function() {
-    if (init == null) return value;
-    let f = init;
-    init = $throwCyclicInitializationError;
-    if (f === init) f($name); // throw cycle error
-
-    // On the first (non-cyclic) execution, record the field so we can reset it
-    // later if needed (hot restart).
-    $_resetFields.push(() => {
-      init = initializer;
-      value = null;
-    });
-
-    // Try to evaluate the field, using try+catch to ensure we implement the
-    // correct Dart error semantics.
-    try {
-      value = f();
-      init = null;
-      return value;
-    } catch (e) {
-      init = null;
-      value = null;
-      throw e;
-    }
-  };
-  $desc.configurable = true;
-  if ($desc.set != null) {
-    $desc.set = function(x) {
-      init = null;
-      value = x;
-    };
-  }
-  return ${defineProperty(to, name, desc)};
-})()''');
-
 copyTheseProperties(to, from, names) {
   for (int i = 0, n = JS('!', '#.length', names); i < n; ++i) {
     var name = JS('', '#[#]', names, i);
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/native_typed_data.dart
index 3e28657..3a7f409 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/native_typed_data.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/native_typed_data.dart
@@ -311,8 +311,7 @@
 class NativeTypedData implements TypedData {
   /// Returns the byte buffer associated with this object.
   @Creates('NativeByteBuffer')
-  // May be Null for IE's CanvasPixelArray.
-  @Returns('NativeByteBuffer|Null')
+  @Returns('NativeByteBuffer')
   external ByteBuffer get buffer;
 
   /// Returns the length of this view, in bytes.
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
index 9076ef2..347b20b 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
@@ -194,7 +194,7 @@
   // We cannot create the backing map on creation since hashCode interceptors
   // have not been defined when constants are created.
   Map<K, V> _getMap() {
-    LinkedHashMap<K, V> backingMap = JS('LinkedHashMap|Null', r'#.$map', this);
+    LinkedHashMap<K, V>? backingMap = JS('LinkedHashMap|Null', r'#.$map', this);
     if (backingMap == null) {
       backingMap = new JsLinkedHashMap<K, V>();
       fillLiteralMap(_jsData, backingMap);
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
index fa12afb..10418cf 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/core_patch.dart
@@ -45,7 +45,7 @@
 }
 
 @patch
-int identityHashCode(Object object) => objectHashCode(object);
+int identityHashCode(Object? object) => objectHashCode(object);
 
 // Patch for Object implementation.
 @patch
@@ -105,7 +105,7 @@
   Expando([String? name])
       : this.name = name,
         _jsWeakMapOrKey = JS('bool', 'typeof WeakMap == "function"')
-            ? JS('=Object|Null', 'new WeakMap()')
+            ? JS('=Object', 'new WeakMap()')
             : _createKey();
 
   @patch
@@ -451,6 +451,18 @@
   }
 
   @patch
+  factory List.generate(int length, E generator(int index),
+      {bool growable = true}) {
+    final result = growable
+        ? new JSArray<E>.growable(length)
+        : new JSArray<E>.fixed(length);
+    for (int i = 0; i < length; i++) {
+      result[i] = generator(i);
+    }
+    return result;
+  }
+
+  @patch
   factory List.unmodifiable(Iterable elements) {
     var result = List<E>.from(elements, growable: false);
     return makeFixedListUnmodifiable(result);
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/interceptors.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/interceptors.dart
index 70ca49e..808be98 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/interceptors.dart
@@ -110,7 +110,7 @@
 dispatchRecordInterceptor(record) => JS('', '#.i', record);
 dispatchRecordProto(record) => JS('', '#.p', record);
 dispatchRecordExtension(record) => JS('', '#.e', record);
-dispatchRecordIndexability(record) => JS('bool|Null', '#.x', record);
+bool? dispatchRecordIndexability(record) => JS('bool|Null', '#.x', record);
 
 /// Returns the interceptor for a native class instance. Used by
 /// [getInterceptor].
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
index ca5caab..8c81b95 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
@@ -6,6 +6,7 @@
 
 import 'dart:_js_embedded_names'
     show
+        ARRAY_RTI_PROPERTY,
         CURRENT_SCRIPT,
         DEFERRED_LIBRARY_PARTS,
         DEFERRED_PART_URIS,
@@ -128,8 +129,8 @@
 /// Given a raw constructor name, return the unminified name, if available,
 /// otherwise tag the name with `minified:`.
 String unminifyOrTag(String rawClassName) {
-  String preserved = unmangleGlobalNameIfPreservedAnyways(rawClassName);
-  if (preserved is String) return preserved;
+  String? preserved = unmangleGlobalNameIfPreservedAnyways(rawClassName);
+  if (preserved != null) return preserved;
   if (JS_GET_FLAG('MINIFIED')) return 'minified:${rawClassName}';
   return rawClassName;
 }
@@ -398,7 +399,7 @@
 
 class Primitives {
   static int objectHashCode(object) {
-    int hash = JS('int|Null', r'#.$identityHash', object);
+    int? hash = JS('int|Null', r'#.$identityHash', object);
     if (hash == null) {
       hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
       JS('void', r'#.$identityHash = #', object, hash);
@@ -786,7 +787,7 @@
     // Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
     // We extract this name using a regexp.
     var d = lazyAsJsDate(receiver);
-    List match = JS('JSArray|Null', r'/\((.*)\)/.exec(#.toString())', d);
+    List? match = JS('JSArray|Null', r'/\((.*)\)/.exec(#.toString())', d);
     if (match != null) return match[1];
 
     // Internet Explorer 10+ emits the zone name without parenthesis:
@@ -1575,7 +1576,7 @@
     // Look for the special pattern \$camelCase\$ (all the $ symbols
     // have been escaped already), as we will soon be inserting
     // regular expression syntax that we want interpreted by RegExp.
-    List<String> match =
+    List<String>? match =
         JS('JSExtendableArray|Null', r'#.match(/\\\$[a-zA-Z]+\\\$/g)', message);
     if (match == null) match = [];
 
@@ -1926,7 +1927,7 @@
   return ex;
 }
 
-String tryStringifyException(ex) {
+String? tryStringifyException(ex) {
   // Since this function is called from [unwrapException] which is called from
   // code injected into a catch-clause, use JavaScript try-catch to avoid a
   // potential loop if stringifying crashes.
@@ -1950,7 +1951,7 @@
     return exception.stackTrace;
   }
   if (exception == null) return new _StackTrace(exception);
-  _StackTrace trace = JS('_StackTrace|Null', r'#.$cachedTrace', exception);
+  _StackTrace? trace = JS('_StackTrace|Null', r'#.$cachedTrace', exception);
   if (trace != null) return trace;
   trace = new _StackTrace(exception);
   return JS('_StackTrace', r'#.$cachedTrace = #', exception, trace);
@@ -2095,7 +2096,7 @@
   static fromTearOff(
     receiver,
     List functions,
-    int applyTrampolineIndex,
+    int? applyTrampolineIndex,
     var reflectionInfo,
     bool isStatic,
     bool isIntercepted,
@@ -2116,8 +2117,8 @@
     // TODO(ahe): All the place below using \$ should be rewritten to go
     // through the namer.
     var function = JS('', '#[#]', functions, 0);
-    String name = JS('String|Null', '#.\$stubName', function);
-    String callName = JS('String|Null', '#[#]', function,
+    String? name = JS('String|Null', '#.\$stubName', function);
+    String? callName = JS('String|Null', '#[#]', function,
         JS_GET_NAME(JsGetName.CALL_NAME_PROPERTY));
 
     // This variable holds either an index into the types-table, or a function
@@ -2301,7 +2302,7 @@
   }
 
   static cspForwardCall(
-      int arity, bool isSuperCall, String stubName, function) {
+      int arity, bool isSuperCall, String? stubName, function) {
     var getSelf = RAW_DART_FUNCTION_REF(BoundClosure.selfOf);
     // Handle intercepted stub-names with the default slow case.
     if (isSuperCall) arity = -1;
@@ -2383,7 +2384,7 @@
 
   static forwardCallTo(receiver, function, bool isIntercepted) {
     if (isIntercepted) return forwardInterceptedCallTo(receiver, function);
-    String stubName = JS('String|Null', '#.\$stubName', function);
+    String? stubName = JS('String|Null', '#.\$stubName', function);
     int arity = JS('int', '#.length', function);
     var lookedUpFunction = JS('', '#[#]', receiver, stubName);
     // The receiver[stubName] may not be equal to the function if we try to
@@ -2420,7 +2421,7 @@
   }
 
   static cspForwardInterceptedCall(
-      int arity, bool isSuperCall, String name, function) {
+      int arity, bool isSuperCall, String? name, function) {
     var getSelf = RAW_DART_FUNCTION_REF(BoundClosure.selfOf);
     var getReceiver = RAW_DART_FUNCTION_REF(BoundClosure.receiverOf);
     // Handle intercepted stub-names with the default slow case.
@@ -2515,7 +2516,7 @@
   static forwardInterceptedCallTo(receiver, function) {
     String selfField = BoundClosure.selfFieldName();
     String receiverField = BoundClosure.receiverFieldName();
-    String stubName = JS('String|Null', '#.\$stubName', function);
+    String? stubName = JS('String|Null', '#.\$stubName', function);
     int arity = JS('int', '#.length', function);
     bool isCsp = JS_GET_FLAG('USE_CONTENT_SECURITY_POLICY');
     var lookedUpFunction = JS('', '#[#]', receiver, stubName);
@@ -2587,7 +2588,7 @@
 
 class StaticClosure extends TearOffClosure {
   String toString() {
-    String name =
+    String? name =
         JS('String|Null', '#[#]', this, STATIC_FUNCTION_NAME_PROPERTY_NAME);
     if (name == null) return 'Closure of unknown static method';
     return "Closure '${unminifyOrTag(name)}'";
@@ -3241,7 +3242,7 @@
   // by an index. There are two arrays, one that maps the index into a Uri and
   // another that maps the index to a hash.
   var partsMap = JS_EMBEDDED_GLOBAL('', DEFERRED_LIBRARY_PARTS);
-  List indexes = JS('JSExtendableArray|Null', '#[#]', partsMap, loadId);
+  List? indexes = JS('JSExtendableArray|Null', '#[#]', partsMap, loadId);
   if (indexes == null) return new Future.value(null);
   List<String> uris = <String>[];
   List<String> hashes = <String>[];
@@ -3323,7 +3324,7 @@
 String? _computeCspNonce() {
   var currentScript = JS_EMBEDDED_GLOBAL('', CURRENT_SCRIPT);
   if (currentScript == null) return null;
-  String nonce = JS('String|Null', '#.nonce', currentScript);
+  String? nonce = JS('String|Null', '#.nonce', currentScript);
   return (nonce != null && nonce != '')
       ? nonce
       : JS('String|Null', '#.getAttribute("nonce")', currentScript);
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_names.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_names.dart
index 0342836..10efacf 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_names.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_names.dart
@@ -148,7 +148,7 @@
 /// This is used, for example, to return unmangled names from TypeImpl.toString
 /// *if* names are being preserved for other reasons (use of dart:mirrors, for
 /// example).
-String unmangleGlobalNameIfPreservedAnyways(String name) {
+String? unmangleGlobalNameIfPreservedAnyways(String name) {
   var names = JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES);
   return JS('String|Null', '#', JsCache.fetch(names, name));
 }
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_rti.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_rti.dart
index 1af8d71..d484342 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_rti.dart
@@ -96,12 +96,15 @@
 Object setRuntimeTypeInfo(Object target, var rti) {
   if (JS_GET_FLAG('USE_NEW_RTI')) {
     assert(rti != null);
+    var rtiProperty = JS_EMBEDDED_GLOBAL('', ARRAY_RTI_PROPERTY);
+    JS('var', r'#[#] = #', target, rtiProperty, rti);
+    return target;
   } else {
     assert(rti == null || isJsArray(rti));
+    String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
+    JS('var', r'#[#] = #', target, rtiName, rti);
+    return target;
   }
-  String rtiName = JS_GET_NAME(JsGetName.RTI_NAME);
-  JS('var', r'#[#] = #', target, rtiName, rti);
-  return target;
 }
 
 /// Returns the runtime type information of [target]. The returned value is a
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/native_typed_data.dart
index e73a040..39d527b 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -311,8 +311,7 @@
 class NativeTypedData implements TypedData {
   /// Returns the byte buffer associated with this object.
   @Creates('NativeByteBuffer')
-  // May be Null for IE's CanvasPixelArray.
-  @Returns('NativeByteBuffer|Null')
+  @Returns('NativeByteBuffer')
   ByteBuffer get buffer native;
 
   /// Returns the length of this view, in bytes.
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/regexp_helper.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/regexp_helper.dart
index af0611b..9560250 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/regexp_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/regexp_helper.dart
@@ -110,7 +110,7 @@
   }
 
   RegExpMatch? firstMatch(String string) {
-    JSArray m = JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp,
+    JSArray? m = JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp,
         checkString(string));
     if (m == null) return null;
     return new _MatchImplementation(this, m);
@@ -138,7 +138,7 @@
   RegExpMatch? _execGlobal(String string, int start) {
     Object regexp = _nativeGlobalVersion;
     JS('void', '#.lastIndex = #', regexp, start);
-    JSArray match = JS('JSExtendableArray|Null', '#.exec(#)', regexp, string);
+    JSArray? match = JS('JSExtendableArray|Null', '#.exec(#)', regexp, string);
     if (match == null) return null;
     return new _MatchImplementation(this, match);
   }
@@ -146,7 +146,7 @@
   RegExpMatch? _execAnchored(String string, int start) {
     Object regexp = _nativeAnchoredVersion;
     JS('void', '#.lastIndex = #', regexp, start);
-    JSArray match = JS('JSExtendableArray|Null', '#.exec(#)', regexp, string);
+    JSArray? match = JS('JSExtendableArray|Null', '#.exec(#)', regexp, string);
     if (match == null) return null;
     // If the last capture group participated, the original regexp did not
     // match at the start position.
@@ -194,14 +194,14 @@
 
   // The JS below changes the static type to avoid an implicit cast.
   // TODO(sra): Find a nicer way to do this, e.g. unsafeCast.
-  String group(int index) => JS('String|Null', '#', _match[index]);
+  String? group(int index) => JS('String|Null', '#', _match[index]);
 
-  String operator [](int index) => group(index);
+  String? operator [](int index) => group(index);
 
   int get groupCount => _match.length - 1;
 
-  List<String> groups(List<int> groups) {
-    List<String> out = [];
+  List<String?> groups(List<int> groups) {
+    List<String?> out = [];
     for (int i in groups) {
       out.add(group(i));
     }
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
index 67f8325..ddbade4 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
@@ -28,6 +28,7 @@
         JsBuiltin,
         JsGetName,
         RtiUniverseFieldNames,
+        ARRAY_RTI_PROPERTY,
         CONSTRUCTOR_RTI_CACHE_PROPERTY_NAME,
         RTI_UNIVERSE,
         TYPES;
@@ -110,7 +111,7 @@
   @pragma('dart2js:noElision')
   dynamic _precomputed1;
 
-  static Object _getPrecomputed1(Rti rti) => rti._precomputed1;
+  static Object? _getPrecomputed1(Rti rti) => rti._precomputed1;
 
   static void _setPrecomputed1(Rti rti, precomputed) {
     rti._precomputed1 = precomputed;
@@ -118,7 +119,7 @@
 
   static Rti _getQuestionFromStar(universe, Rti rti) {
     assert(_getKind(rti) == kindStar);
-    Rti question = _castToRtiOrNull(_getPrecomputed1(rti));
+    Rti? question = _castToRtiOrNull(_getPrecomputed1(rti));
     if (question == null) {
       question =
           _Universe._lookupQuestionRti(universe, _getStarArgument(rti), true);
@@ -129,7 +130,7 @@
 
   static Rti _getFutureFromFutureOr(universe, Rti rti) {
     assert(_getKind(rti) == kindFutureOr);
-    Rti future = _castToRtiOrNull(_getPrecomputed1(rti));
+    Rti? future = _castToRtiOrNull(_getPrecomputed1(rti));
     if (future == null) {
       future = _Universe._lookupFutureRti(universe, _getFutureOrArgument(rti));
       Rti._setPrecomputed1(rti, future);
@@ -155,7 +156,7 @@
 
   // The Type object corresponding to this Rti.
   Object? _cachedRuntimeType;
-  static _Type _getCachedRuntimeType(Rti rti) =>
+  static _Type? _getCachedRuntimeType(Rti rti) =>
       JS('_Type|Null', '#', rti._cachedRuntimeType);
   static void _setCachedRuntimeType(Rti rti, _Type type) {
     rti._cachedRuntimeType = type;
@@ -426,7 +427,7 @@
 /// Called from generated code.
 @pragma('dart2js:noInline')
 Rti? instantiatedGenericFunctionType(
-    Rti genericFunctionRti, Rti instantiationRti) {
+    Rti? genericFunctionRti, Rti instantiationRti) {
   // If --lax-runtime-type-to-string is enabled and we never check the function
   // type, then the function won't have a signature, so its RTI will be null. In
   // this case, there is nothing to instantiate, so we return `null` and the
@@ -444,7 +445,7 @@
   String key = Rti._getCanonicalRecipe(instantiationRti);
   var probe = _Utils.mapGet(cache, key);
   if (probe != null) return _castToRti(probe);
-  Rti? rti = _instantiate(_theUniverse(),
+  Rti rti = _instantiate(_theUniverse(),
       Rti._getGenericFunctionBase(genericFunctionRti), typeArguments, 0);
   _Utils.mapSet(cache, key, rti);
   return rti;
@@ -458,7 +459,7 @@
 /// [depth] is the number of subsequent generic function parameters that are in
 /// scope. This is subtracted off the de Bruijn index for the type parameter to
 /// arrive at an potential index into [typeArguments].
-Rti? _instantiate(universe, Rti rti, Object typeArguments, int depth) {
+Rti _instantiate(universe, Rti rti, Object typeArguments, int depth) {
   int kind = Rti._getKind(rti);
   switch (kind) {
     case Rti.kindErased:
@@ -470,19 +471,19 @@
     case Rti.kindStar:
       Rti baseType = _castToRti(Rti._getPrimary(rti));
       Rti instantiatedBaseType =
-          _instantiate(universe, baseType, typeArguments, depth)!;
+          _instantiate(universe, baseType, typeArguments, depth);
       if (_Utils.isIdentical(instantiatedBaseType, baseType)) return rti;
       return _Universe._lookupStarRti(universe, instantiatedBaseType, true);
     case Rti.kindQuestion:
       Rti baseType = _castToRti(Rti._getPrimary(rti));
       Rti instantiatedBaseType =
-          _instantiate(universe, baseType, typeArguments, depth)!;
+          _instantiate(universe, baseType, typeArguments, depth);
       if (_Utils.isIdentical(instantiatedBaseType, baseType)) return rti;
       return _Universe._lookupQuestionRti(universe, instantiatedBaseType, true);
     case Rti.kindFutureOr:
       Rti baseType = _castToRti(Rti._getPrimary(rti));
       Rti instantiatedBaseType =
-          _instantiate(universe, baseType, typeArguments, depth)!;
+          _instantiate(universe, baseType, typeArguments, depth);
       if (_Utils.isIdentical(instantiatedBaseType, baseType)) return rti;
       return _Universe._lookupFutureOrRti(universe, instantiatedBaseType, true);
     case Rti.kindInterface:
@@ -496,8 +497,7 @@
           instantiatedInterfaceTypeArguments);
     case Rti.kindBinding:
       Rti base = Rti._getBindingBase(rti);
-      Rti instantiatedBase =
-          _instantiate(universe, base, typeArguments, depth)!;
+      Rti instantiatedBase = _instantiate(universe, base, typeArguments, depth);
       Object arguments = Rti._getBindingArguments(rti);
       Object instantiatedArguments =
           _instantiateArray(universe, arguments, typeArguments, depth);
@@ -508,7 +508,7 @@
     case Rti.kindFunction:
       Rti returnType = Rti._getReturnType(rti);
       Rti instantiatedReturnType =
-          _instantiate(universe, returnType, typeArguments, depth)!;
+          _instantiate(universe, returnType, typeArguments, depth);
       _FunctionParameters functionParameters = Rti._getFunctionParameters(rti);
       _FunctionParameters instantiatedFunctionParameters =
           _instantiateFunctionParameters(
@@ -524,15 +524,17 @@
       Object instantiatedBounds =
           _instantiateArray(universe, bounds, typeArguments, depth);
       Rti base = Rti._getGenericFunctionBase(rti);
-      Rti instantiatedBase =
-          _instantiate(universe, base, typeArguments, depth)!;
+      Rti instantiatedBase = _instantiate(universe, base, typeArguments, depth);
       if (_Utils.isIdentical(instantiatedBounds, bounds) &&
           _Utils.isIdentical(instantiatedBase, base)) return rti;
       return _Universe._lookupGenericFunctionRti(
           universe, instantiatedBase, instantiatedBounds);
     case Rti.kindGenericFunctionParameter:
       int index = Rti._getGenericFunctionParameterIndex(rti);
-      if (index < depth) return null;
+      if (index < depth) {
+        throw AssertionError(
+            'Unexpected index $index at instantiation depth $depth');
+      }
       return _castToRti(_Utils.arrayAt(typeArguments, index - depth));
     default:
       throw AssertionError(
@@ -547,7 +549,7 @@
   Object result = JS('', '[]');
   for (int i = 0; i < length; i++) {
     Rti rti = _castToRti(_Utils.arrayAt(rtiArray, i));
-    Rti instantiatedRti = _instantiate(universe, rti, typeArguments, depth)!;
+    Rti instantiatedRti = _instantiate(universe, rti, typeArguments, depth);
     if (_Utils.isNotIdentical(instantiatedRti, rti)) {
       changed = true;
     }
@@ -565,7 +567,7 @@
   for (int i = 0; i < length; i += 2) {
     String name = _Utils.asString(_Utils.arrayAt(namedArray, i));
     Rti rti = _castToRti(_Utils.arrayAt(namedArray, i + 1));
-    Rti? instantiatedRti = _instantiate(universe, rti, typeArguments, depth);
+    Rti instantiatedRti = _instantiate(universe, rti, typeArguments, depth);
     if (_Utils.isNotIdentical(instantiatedRti, rti)) {
       changed = true;
     }
@@ -685,7 +687,7 @@
   // IE11 we would have to synthesise a String property-name with almost zero
   // chance of conflict.
 
-  var rti = JS('', r'#[#]', object, JS_GET_NAME(JsGetName.RTI_NAME));
+  var rti = JS('', r'#[#]', object, JS_EMBEDDED_GLOBAL('', ARRAY_RTI_PROPERTY));
   var defaultRti = getJSArrayInteropRti();
 
   // Case 3.
@@ -768,14 +770,21 @@
 
 /// Called from generated code.
 Type createRuntimeType(Rti rti) {
-  _Type type = Rti._getCachedRuntimeType(rti);
+  _Type? type = Rti._getCachedRuntimeType(rti);
   if (type != null) return type;
-  // TODO(fishythefish, https://github.com/dart-lang/language/issues/428) For
-  // NNBD transition, canonicalization may be needed. It might be possible to
-  // generate a star-free recipe from the canonical recipe and evaluate that.
-  type = _Type(rti);
-  Rti._setCachedRuntimeType(rti, type);
-  return type;
+  if (JS_GET_FLAG('PRINT_LEGACY_STARS')) {
+    return _Type(rti);
+  } else {
+    String recipe = Rti._getCanonicalRecipe(rti);
+    String starErasedRecipe = JS('String', '#.replace(/\\*/g, "")', recipe);
+    if (starErasedRecipe == recipe) {
+      return _Type(rti);
+    }
+    Rti starErasedRti = _Universe.eval(_theUniverse(), starErasedRecipe, true);
+    type = Rti._getCachedRuntimeType(starErasedRti) ?? _Type(starErasedRti);
+    Rti._setCachedRuntimeType(rti, type);
+    return type;
+  }
 }
 
 /// Called from generated code in the constant pool.
@@ -786,15 +795,9 @@
 /// Implementation of [Type] based on Rti.
 class _Type implements Type {
   final Rti _rti;
-  int? _hashCode;
 
-  _Type(this._rti);
-
-  int get hashCode => _hashCode ??= Rti._getCanonicalRecipe(_rti).hashCode;
-
-  @pragma('dart2js:noInline')
-  bool operator ==(other) {
-    return (other is _Type) && identical(_rti, other._rti);
+  _Type(this._rti) : assert(Rti._getCachedRuntimeType(_rti) == null) {
+    Rti._setCachedRuntimeType(_rti, this);
   }
 
   @override
@@ -818,38 +821,36 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  int kind = Rti._getKind(testRti);
 
   var isFn = RAW_DART_FUNCTION_REF(_generalIsTestImplementation);
 
-  if (isTopType(testRti)) {
+  if (isObjectType(testRti)) {
+    isFn = RAW_DART_FUNCTION_REF(_isObject);
+    Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
+    Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
+  } else if (isTopType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isTop);
     var asFn = RAW_DART_FUNCTION_REF(_asTop);
     Rti._setAsCheckFunction(testRti, asFn);
     Rti._setTypeCheckFunction(testRti, asFn);
-  } else if (kind == Rti.kindInterface) {
-    String key = Rti._getCanonicalRecipe(testRti);
-
-    if (JS_GET_NAME(JsGetName.INT_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isInt);
-    } else if (JS_GET_NAME(JsGetName.DOUBLE_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isNum);
-    } else if (JS_GET_NAME(JsGetName.NUM_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isNum);
-    } else if (JS_GET_NAME(JsGetName.STRING_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isString);
-    } else if (JS_GET_NAME(JsGetName.BOOL_RECIPE) == key) {
-      isFn = RAW_DART_FUNCTION_REF(_isBool);
-    } else {
-      String name = Rti._getInterfaceName(testRti);
-      var arguments = Rti._getInterfaceTypeArguments(testRti);
-      if (JS(
-          'bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
-        String propertyName =
-            '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
-        Rti._setSpecializedTestResource(testRti, propertyName);
-        isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
-      }
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isInt);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isNum);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<num>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isNum);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<String>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isString);
+  } else if (_Utils.isIdentical(testRti, TYPE_REF<bool>())) {
+    isFn = RAW_DART_FUNCTION_REF(_isBool);
+  } else if (Rti._getKind(testRti) == Rti.kindInterface) {
+    String name = Rti._getInterfaceName(testRti);
+    var arguments = Rti._getInterfaceTypeArguments(testRti);
+    if (JS('bool', '#.every(#)', arguments, RAW_DART_FUNCTION_REF(isTopType))) {
+      String propertyName =
+          '${JS_GET_NAME(JsGetName.OPERATOR_IS_PREFIX)}${name}';
+      Rti._setSpecializedTestResource(testRti, propertyName);
+      isFn = RAW_DART_FUNCTION_REF(_isTestViaProperty);
     }
   }
 
@@ -857,11 +858,22 @@
   return Rti._isCheck(testRti, object);
 }
 
+bool _nullIs(Rti testRti) {
+  int kind = Rti._getKind(testRti);
+  return isTopType(testRti) ||
+      _Utils.isIdentical(testRti, LEGACY_TYPE_REF<Never>()) ||
+      kind == Rti.kindQuestion ||
+      isNullType(testRti);
+}
+
 /// Called from generated code.
 bool _generalIsTestImplementation(object) {
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
+  if (JS_GET_FLAG('NNBD') && object == null) {
+    return _nullIs(testRti);
+  }
   Rti objectRti = instanceOrFunctionType(object, testRti);
   return isSubtype(_theUniverse(), objectRti, testRti);
 }
@@ -871,6 +883,9 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
+  if (JS_GET_FLAG('NNBD') && object == null) {
+    return _nullIs(testRti);
+  }
   var tag = Rti._getSpecializedTestResource(testRti);
 
   // This test is redundant with getInterceptor below, but getInterceptor does
@@ -886,11 +901,14 @@
 
 /// Called from generated code.
 _generalAsCheckImplementation(object) {
-  if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  if (Rti._isCheck(testRti, object)) return object;
+  if (object == null) {
+    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
+  } else {
+    if (Rti._isCheck(testRti, object)) return object;
+  }
 
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
@@ -900,11 +918,14 @@
 
 /// Called from generated code.
 _generalTypeCheckImplementation(object) {
-  if (object == null) return object;
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  if (Rti._isCheck(testRti, object)) return object;
+  if (object == null) {
+    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
+  } else {
+    if (Rti._isCheck(testRti, object)) return object;
+  }
 
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
@@ -963,6 +984,26 @@
 // Specializations can be placed on Rti objects as the _as, _check and _is
 // 'methods'. They can also be called directly called from generated code.
 
+/// Specialization for 'is Object'.
+/// Called from generated code via Rti `_is` method.
+bool _isObject(object) {
+  return !JS_GET_FLAG('NNBD') || object != null;
+}
+
+/// Specialization for 'as Object'.
+/// Called from generated code via Rti `_as` method.
+dynamic _asObject(object) {
+  if (JS_GET_FLAG('LEGACY') || object != null) return object;
+  throw _CastError.forType(object, 'Object');
+}
+
+/// Specialization for check on 'Object'.
+/// Called from generated code via Rti `_check` method.
+dynamic _checkObject(object) {
+  if (JS_GET_FLAG('LEGACY') || object != null) return object;
+  throw _TypeError.forType(object, 'Object');
+}
+
 /// Specialization for 'is dynamic' and other top types.
 /// Called from generated code via Rti `_is` method.
 bool _isTop(object) {
@@ -983,7 +1024,7 @@
 
 /// Specialization for 'as bool?'.
 /// Called from generated code.
-bool /*?*/ _asBoolNullable(object) {
+bool? _asBoolNullable(object) {
   if (_isBool(object)) return _Utils.asBool(object);
   if (object == null) return object;
   throw _CastError.forType(object, 'bool');
@@ -991,7 +1032,7 @@
 
 /// Specialization for check on 'bool?'.
 /// Called from generated code.
-bool /*?*/ _checkBoolNullable(object) {
+bool? _checkBoolNullable(object) {
   if (_isBool(object)) return _Utils.asBool(object);
   if (object == null) return object;
   throw _TypeError.forType(object, 'bool');
@@ -999,7 +1040,7 @@
 
 /// Specialization for 'as double?'.
 /// Called from generated code.
-double /*?*/ _asDoubleNullable(object) {
+double? _asDoubleNullable(object) {
   if (_isNum(object)) return _Utils.asDouble(object);
   if (object == null) return object;
   throw _CastError.forType(object, 'double');
@@ -1007,7 +1048,7 @@
 
 /// Specialization for check on 'double?'.
 /// Called from generated code.
-double /*?*/ _checkDoubleNullable(object) {
+double? _checkDoubleNullable(object) {
   if (_isNum(object)) return _Utils.asDouble(object);
   if (object == null) return object;
   throw _TypeError.forType(object, 'double');
@@ -1022,7 +1063,7 @@
 
 /// Specialization for 'as int?'.
 /// Called from generated code.
-int /*?*/ _asIntNullable(object) {
+int? _asIntNullable(object) {
   if (_isInt(object)) return _Utils.asInt(object);
   if (object == null) return object;
   throw _CastError.forType(object, 'int');
@@ -1030,7 +1071,7 @@
 
 /// Specialization for check on 'int?'.
 /// Called from generated code.
-int /*?*/ _checkIntNullable(object) {
+int? _checkIntNullable(object) {
   if (_isInt(object)) return _Utils.asInt(object);
   if (object == null) return object;
   throw _TypeError.forType(object, 'int');
@@ -1044,7 +1085,7 @@
 
 /// Specialization for 'as num?'.
 /// Called from generated code.
-num /*?*/ _asNumNullable(object) {
+num? _asNumNullable(object) {
   if (_isNum(object)) return _Utils.asNum(object);
   if (object == null) return object;
   throw _CastError.forType(object, 'num');
@@ -1052,7 +1093,7 @@
 
 /// Specialization for check on 'num?'.
 /// Called from generated code.
-num /*?*/ _checkNumNullable(object) {
+num? _checkNumNullable(object) {
   if (_isNum(object)) return _Utils.asNum(object);
   if (object == null) return object;
   throw _TypeError.forType(object, 'num');
@@ -1066,7 +1107,7 @@
 
 /// Specialization for 'as String?'.
 /// Called from generated code.
-String /*?*/ _asStringNullable(object) {
+String? _asStringNullable(object) {
   if (_isString(object)) return _Utils.asString(object);
   if (object == null) return object;
   throw _CastError.forType(object, 'String');
@@ -1074,7 +1115,7 @@
 
 /// Specialization for check on 'String?'.
 /// Called from generated code.
-String /*?*/ _checkStringNullable(object) {
+String? _checkStringNullable(object) {
   if (_isString(object)) return _Utils.asString(object);
   if (object == null) return object;
   throw _TypeError.forType(object, 'String');
@@ -1174,7 +1215,7 @@
 
   if (outerContextLength != null) {
     // Pop all of the generic type parameters.
-    JS('', '#.length = #', genericContext, outerContextLength);
+    JS('', '#.length = #', genericContext!, outerContextLength);
   }
 
   // TODO(fishythefish): Below is the same format as the VM. Change to:
@@ -1196,12 +1237,16 @@
   if (kind == Rti.kindStar) {
     Rti starArgument = Rti._getStarArgument(rti);
     String s = _rtiToString(starArgument, genericContext);
-    int argumentKind = Rti._getKind(starArgument);
-    if (argumentKind == Rti.kindFunction ||
-        argumentKind == Rti.kindGenericFunction) {
-      s = '(' + s + ')';
+    if (JS_GET_FLAG('PRINT_LEGACY_STARS')) {
+      int argumentKind = Rti._getKind(starArgument);
+      if (argumentKind == Rti.kindFunction ||
+          argumentKind == Rti.kindGenericFunction) {
+        s = '(' + s + ')';
+      }
+      return s + '*';
+    } else {
+      return s;
     }
-    return s + '*';
   }
 
   if (kind == Rti.kindQuestion) {
@@ -1251,7 +1296,7 @@
 }
 
 String _unminifyOrTag(String rawClassName) {
-  String preserved = unmangleGlobalNameIfPreservedAnyways(rawClassName);
+  String? preserved = unmangleGlobalNameIfPreservedAnyways(rawClassName);
   if (preserved != null) return preserved;
   return JS_GET_FLAG('MINIFIED') ? 'minified:$rawClassName' : rawClassName;
 }
@@ -1416,11 +1461,11 @@
   static Object typeParameterVariances(universe) =>
       JS('', '#.#', universe, RtiUniverseFieldNames.typeParameterVariances);
 
-  static Object _findRule(universe, String targetType) =>
+  static Object? _findRule(universe, String targetType) =>
       JS('', '#.#', typeRules(universe), targetType);
 
-  static Object findRule(universe, String targetType) {
-    Object rule = _findRule(universe, targetType);
+  static Object? findRule(universe, String targetType) {
+    Object? rule = _findRule(universe, targetType);
     while (_Utils.isString(rule)) {
       rule = _findRule(universe, _Utils.asString(rule));
     }
@@ -1447,7 +1492,7 @@
     }
   }
 
-  static Object findTypeParameterVariances(universe, String cls) =>
+  static Object? findTypeParameterVariances(universe, String cls) =>
       JS('', '#.#', typeParameterVariances(universe), cls);
 
   static void addRules(universe, rules) =>
@@ -1517,9 +1562,9 @@
     }
 
     String interfaceName = Rti._getInterfaceName(environment);
-    Object rule = _Universe.findRule(universe, interfaceName);
+    Object? rule = _Universe.findRule(universe, interfaceName);
     assert(rule != null);
-    String recipe = TypeRule.lookupTypeVariable(rule, name);
+    String? recipe = TypeRule.lookupTypeVariable(rule, name);
     if (recipe == null) {
       throw 'No "$name" in "${Rti._getCanonicalRecipe(environment)}"';
     }
@@ -2426,10 +2471,10 @@
     throw UnimplementedError("TypeRule is static methods only.");
   }
 
-  static String lookupTypeVariable(rule, String typeVariable) =>
+  static String? lookupTypeVariable(rule, String typeVariable) =>
       JS('', '#.#', rule, typeVariable);
 
-  static JSArray lookupSupertype(rule, String supertype) =>
+  static JSArray? lookupSupertype(rule, String supertype) =>
       JS('', '#.#', rule, supertype);
 }
 
@@ -2781,7 +2826,7 @@
   // interface, so rather than iterating over the Ci, we can instead look up
   // [t] in our ruleset.
   // TODO(fishythefish): Handle variance correctly.
-  Object rule = _Universe.findRule(universe, sName);
+  Object? rule = _Universe.findRule(universe, sName);
   if (rule == null) return false;
   var supertypeArgs = TypeRule.lookupSupertype(rule, tName);
   if (supertypeArgs == null) return false;
@@ -2831,19 +2876,19 @@
 
 /// Unchecked cast to Rti.
 Rti _castToRti(s) => JS('Rti', '#', s);
-Rti /*?*/ _castToRtiOrNull(s) => JS('Rti|Null', '#', s);
+Rti? _castToRtiOrNull(s) => JS('Rti|Null', '#', s);
 
 class _Utils {
-  static bool asBool(Object o) => JS('bool', '#', o);
-  static double asDouble(Object o) => JS('double', '#', o);
-  static int asInt(Object o) => JS('int', '#', o);
-  static num asNum(Object o) => JS('num', '#', o);
-  static String asString(Object o) => JS('String', '#', o);
+  static bool asBool(o) => JS('bool', '#', o);
+  static double asDouble(o) => JS('double', '#', o);
+  static int asInt(o) => JS('int', '#', o);
+  static num asNum(o) => JS('num', '#', o);
+  static String asString(o) => JS('String', '#', o);
 
-  static bool isString(Object o) => JS('bool', 'typeof # == "string"', o);
-  static bool isNum(Object o) => JS('bool', 'typeof # == "number"', o);
+  static bool isString(o) => JS('bool', 'typeof # == "string"', o);
+  static bool isNum(o) => JS('bool', 'typeof # == "number"', o);
 
-  static bool instanceOf(Object o, Object constructor) =>
+  static bool instanceOf(o, Object constructor) =>
       JS('bool', '# instanceof #', o, constructor);
 
   static bool isIdentical(s, t) => JS('bool', '# === #', s, t);
@@ -2862,13 +2907,13 @@
     }
   }
 
-  static bool isArray(Object o) => JS('bool', 'Array.isArray(#)', o);
+  static bool isArray(o) => JS('bool', 'Array.isArray(#)', o);
 
   static int arrayLength(Object array) => JS('int', '#.length', array);
 
   static Object arrayAt(Object array, int i) => JS('', '#[#]', array, i);
 
-  static void arraySetAt(Object array, int i, Object value) {
+  static void arraySetAt(Object array, int i, value) {
     JS('', '#[#] = #', array, i, value);
   }
 
@@ -2881,7 +2926,7 @@
   static JSArray arrayConcat(Object a1, Object a2) =>
       JS('JSArray', '#.concat(#)', a1, a2);
 
-  static void arrayPush(Object array, Object? value) {
+  static void arrayPush(Object array, value) {
     JS('', '#.push(#)', array, value);
   }
 
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index e3c5f3e..4ec4fc2 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -121,6 +121,11 @@
 //    [INTERCEPTORS_BY_TAG] and [LEAF_TAGS].
 const ISOLATE_TAG = 'isolateTag';
 
+/// An embedded global that contains the property used to store type information
+/// on JavaScript Array instances. This is a Symbol (except for IE11, where is
+/// is a String).
+const ARRAY_RTI_PROPERTY = 'arrayRti';
+
 /// This embedded global (a function) returns the isolate-specific dispatch-tag
 /// that is used to accelerate interceptor calls.
 const DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
@@ -333,21 +338,6 @@
   /// String representation of the type of the JavaScriptFunction class.
   JS_FUNCTION_CLASS_TYPE_NAME,
 
-  /// String recipe for the [bool] type.
-  BOOL_RECIPE,
-
-  /// String recipe for the [double] type.
-  DOUBLE_RECIPE,
-
-  /// String recipe for the [int] type.
-  INT_RECIPE,
-
-  /// String recipe for the [num] type.
-  NUM_RECIPE,
-
-  /// String recipe for the [String] type.
-  STRING_RECIPE,
-
   /// Property name for Rti._is field.
   RTI_FIELD_IS,
 }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/array.dart b/sdk_nnbd/lib/_internal/vm/lib/array.dart
index 73e1237..1922173 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/array.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/array.dart
@@ -250,7 +250,10 @@
     assert(array is _List<E> || array is _ImmutableList<E>);
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 
   @pragma("vm:prefer-inline")
   bool moveNext() {
diff --git a/sdk_nnbd/lib/_internal/vm/lib/array_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/array_patch.dart
index db69321..ff6009b 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/array_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/array_patch.dart
@@ -69,6 +69,17 @@
   }
 
   @patch
+  factory List.generate(int length, E generator(int index),
+      {bool growable = true}) {
+    final List<E> result =
+        growable ? new _GrowableList<E>(length) : new _List<E>(length);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = generator(i);
+    }
+    return result;
+  }
+
+  @patch
   factory List.unmodifiable(Iterable elements) {
     final result = new List<E>.from(elements, growable: false);
     return makeFixedListUnmodifiable(result);
diff --git a/sdk_nnbd/lib/_internal/vm/lib/collection_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/collection_patch.dart
index 2feba14..dcb8fa1 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/collection_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/collection_patch.dart
@@ -841,7 +841,10 @@
     return false;
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 /**
diff --git a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
index 3a8c7cf..7f3984d 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
@@ -464,7 +464,10 @@
     }
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 // Set implementation, analogous to _CompactLinkedHashMap.
diff --git a/sdk_nnbd/lib/_internal/vm/lib/core_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/core_patch.dart
index ea3f461..0366017 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/core_patch.dart
@@ -125,14 +125,18 @@
 
   T get current {
     final iterator = _yieldEachIterator;
-    return iterator != null ? iterator.current : _current as T;
+    if (iterator != null) {
+      return iterator.current;
+    } else {
+      final cur = _current;
+      return (cur != null) ? cur : cur as T;
+    }
   }
 
   _SyncIterator(this._moveNextFn);
 
   bool moveNext() {
-    final moveNextFn = _moveNextFn;
-    if (moveNextFn == null) {
+    if (_moveNextFn == null) {
       return false;
     }
     while (true) {
@@ -145,7 +149,7 @@
       }
       // _moveNextFn() will update the values of _yieldEachIterable
       //  and _current.
-      if (!moveNextFn(this)) {
+      if (!_moveNextFn!(this)) {
         _moveNextFn = null;
         _current = null;
         return false;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/ffi_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/ffi_patch.dart
index 00134bd..d5749b0 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/ffi_patch.dart
@@ -454,10 +454,10 @@
 int _nativeApiFunctionPointer(String symbol) native "NativeApiFunctionPointer";
 
 @patch
-class NativeApi {
+abstract class NativeApi {
   @patch
   static Pointer<NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>>
-      get nativeApiPostCObject =>
+      get postCObject =>
           Pointer.fromAddress(_nativeApiFunctionPointer("Dart_PostCObject"));
 
   @patch
@@ -466,11 +466,10 @@
           Int64 Function(
               Pointer<Uint8>,
               Pointer<NativeFunction<Dart_NativeMessageHandler>>,
-              Int8)>> get nativeApiNewNativePort =>
+              Int8)>> get newNativePort =>
       Pointer.fromAddress(_nativeApiFunctionPointer("Dart_NewNativePort"));
 
   @patch
-  static Pointer<NativeFunction<Int8 Function(Int64)>>
-      get nativeApiCloseNativePort => Pointer.fromAddress(
-          _nativeApiFunctionPointer("Dart_CloseNativePort"));
+  static Pointer<NativeFunction<Int8 Function(Int64)>> get closeNativePort =>
+      Pointer.fromAddress(_nativeApiFunctionPointer("Dart_CloseNativePort"));
 }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/immutable_map.dart b/sdk_nnbd/lib/_internal/vm/lib/immutable_map.dart
index 2f653f5..7be9890 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/immutable_map.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/immutable_map.dart
@@ -173,7 +173,10 @@
     return false;
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 class _ImmutableMapValueIterator<E> implements Iterator<E> {
@@ -194,7 +197,10 @@
     return false;
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 class _ImmutableMapEntryIterator<K, V> implements Iterator<MapEntry<K, V>> {
@@ -216,5 +222,8 @@
     return false;
   }
 
-  MapEntry<K, V> get current => _current as MapEntry<K, V>;
+  MapEntry<K, V> get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as MapEntry<K, V>;
+  }
 }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
index 48712f5..e4000a4 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
@@ -34,8 +34,9 @@
   // ArgumentsDescriptor layout. Keep in sync with enum in dart_entry.h.
   static const int _TYPE_ARGS_LEN = 0;
   static const int _COUNT = 1;
-  static const int _POSITIONAL_COUNT = 2;
-  static const int _FIRST_NAMED_ENTRY = 3;
+  static const int _SIZE = 2;
+  static const int _POSITIONAL_COUNT = 3;
+  static const int _FIRST_NAMED_ENTRY = 4;
 
   // Internal representation of the invocation mirror.
   String? _functionName;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/string_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/string_patch.dart
index e9d094f..1d896ba 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/string_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/string_patch.dart
@@ -1388,5 +1388,8 @@
     return true;
   }
 
-  Match get current => _current as Match;
+  Match get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as Match;
+  }
 }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/typed_data_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/typed_data_patch.dart
index ef294e0..6d0cc5a 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/typed_data_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/typed_data_patch.dart
@@ -3861,7 +3861,10 @@
     return false;
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 abstract class _TypedListView extends _TypedListBase implements TypedData {
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index c4ee2f2..565b9f4 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -668,7 +668,7 @@
   }
 
   /**
-   * Applies  [streamTransformer] to this stream.
+   * Applies [streamTransformer] to this stream.
    *
    * Returns the transformed stream,
    * that is, the result of `streamTransformer.bind(this)`.
diff --git a/sdk_nnbd/lib/collection/linked_list.dart b/sdk_nnbd/lib/collection/linked_list.dart
index 71e0226..843eedd 100644
--- a/sdk_nnbd/lib/collection/linked_list.dart
+++ b/sdk_nnbd/lib/collection/linked_list.dart
@@ -181,7 +181,10 @@
         _next = list._first,
         _visitedFirst = false;
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 
   bool moveNext() {
     if (_modificationCount != _list._modificationCount) {
diff --git a/sdk_nnbd/lib/collection/maps.dart b/sdk_nnbd/lib/collection/maps.dart
index 90ecb6a..85a3155 100644
--- a/sdk_nnbd/lib/collection/maps.dart
+++ b/sdk_nnbd/lib/collection/maps.dart
@@ -258,7 +258,10 @@
     return false;
   }
 
-  V get current => _current as V;
+  V get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as V;
+  }
 }
 
 /// Mixin that overrides mutating map operations with implementations that
diff --git a/sdk_nnbd/lib/collection/queue.dart b/sdk_nnbd/lib/collection/queue.dart
index c238840..26abbfe 100644
--- a/sdk_nnbd/lib/collection/queue.dart
+++ b/sdk_nnbd/lib/collection/queue.dart
@@ -518,7 +518,10 @@
     return true;
   }
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 }
 
 /// List based [Queue].
@@ -898,7 +901,10 @@
         _modificationCount = queue._modificationCount,
         _position = queue._head;
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 
   bool moveNext() {
     _queue._checkModification(_modificationCount);
diff --git a/sdk_nnbd/lib/convert/json.dart b/sdk_nnbd/lib/convert/json.dart
index a75dbb5..9528602 100644
--- a/sdk_nnbd/lib/convert/json.dart
+++ b/sdk_nnbd/lib/convert/json.dart
@@ -473,6 +473,13 @@
 }
 
 /// This class parses JSON strings and builds the corresponding objects.
+///
+/// A JSON input must be the JSON encoding of a single JSON value,
+/// which can be a list or map containing other values.
+///
+/// When used as a [StreamTransformer], the input stream may emit
+/// multiple strings. The concatenation of all of these strings must
+/// be a valid JSON encoding of a single JSON value.
 class JsonDecoder extends Converter<String, Object?> {
   final Object? Function(Object? key, Object? value)? _reviver;
 
diff --git a/sdk_nnbd/lib/core/list.dart b/sdk_nnbd/lib/core/list.dart
index c934195..afd7f11 100644
--- a/sdk_nnbd/lib/core/list.dart
+++ b/sdk_nnbd/lib/core/list.dart
@@ -180,16 +180,8 @@
    *
    * The [length] must be non-negative.
    */
-  factory List.generate(int length, E generator(int index),
-      {bool growable = true}) {
-    if (length < 0) throw RangeError.index(length, 0, null, "length");
-    if (length == 0) return List<E>.empty(growable: growable);
-    List<E> result = List<E>.filled(length, generator(0), growable: growable);
-    for (int i = 1; i < length; i++) {
-      result[i] = generator(i);
-    }
-    return result;
-  }
+  external factory List.generate(int length, E generator(int index),
+      {bool growable = true});
 
   /**
    * Creates an unmodifiable list containing all [elements].
diff --git a/sdk_nnbd/lib/core/num.dart b/sdk_nnbd/lib/core/num.dart
index f63dc68..55bb910 100644
--- a/sdk_nnbd/lib/core/num.dart
+++ b/sdk_nnbd/lib/core/num.dart
@@ -359,8 +359,8 @@
    *     1.toStringAsFixed(3);  // 1.000
    *     (4321.12345678).toStringAsFixed(3);  // 4321.123
    *     (4321.12345678).toStringAsFixed(5);  // 4321.12346
-   *     123456789012345678901.toStringAsFixed(3);  // 123456789012345683968.000
-   *     1000000000000000000000.toStringAsFixed(3); // 1e+21
+   *     123456789012345.toStringAsFixed(3);  // 123456789012345.000
+   *     10000000000000000.toStringAsFixed(4); // 10000000000000000.0000
    *     5.25.toStringAsFixed(0); // 5
    */
   String toStringAsFixed(int fractionDigits);
diff --git a/sdk_nnbd/lib/ffi/ffi.dart b/sdk_nnbd/lib/ffi/ffi.dart
index c7ded4d..202f4f6 100644
--- a/sdk_nnbd/lib/ffi/ffi.dart
+++ b/sdk_nnbd/lib/ffi/ffi.dart
@@ -628,13 +628,13 @@
 typedef Dart_NativeMessageHandler = Void Function(Int64, Pointer<Dart_CObject>);
 
 /// Exposes function pointers to functions in `dart_native_api.h`.
-class NativeApi {
+abstract class NativeApi {
   /// A function pointer to
   /// `bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message)`
   /// in `dart_native_api.h`.
   external static Pointer<
           NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>>
-      get nativeApiPostCObject;
+      get postCObject;
 
   /// A function pointer to
   /// ```
@@ -648,11 +648,11 @@
           Int64 Function(
               Pointer<Uint8>,
               Pointer<NativeFunction<Dart_NativeMessageHandler>>,
-              Int8)>> get nativeApiNewNativePort;
+              Int8)>> get newNativePort;
 
   /// A function pointer to
   /// `bool Dart_CloseNativePort(Dart_Port native_port_id)`
   /// in `dart_native_api.h`.
   external static Pointer<NativeFunction<Int8 Function(Int64)>>
-      get nativeApiCloseNativePort;
+      get closeNativePort;
 }
diff --git a/sdk_nnbd/lib/internal/iterable.dart b/sdk_nnbd/lib/internal/iterable.dart
index 55134af..2817132 100644
--- a/sdk_nnbd/lib/internal/iterable.dart
+++ b/sdk_nnbd/lib/internal/iterable.dart
@@ -325,7 +325,10 @@
         _length = iterable.length,
         _index = 0;
 
-  E get current => _current as E;
+  E get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as E;
+  }
 
   @pragma("vm:prefer-inline")
   bool moveNext() {
@@ -393,7 +396,10 @@
     return false;
   }
 
-  T get current => _current as T;
+  T get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as T;
+  }
 }
 
 /**
@@ -465,7 +471,10 @@
 
   ExpandIterator(this._iterator, this._f);
 
-  T get current => _current as T;
+  T get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as T;
+  }
 
   bool moveNext() {
     if (_currentExpansion == null) return false;
diff --git a/sdk_nnbd/lib/internal/linked_list.dart b/sdk_nnbd/lib/internal/linked_list.dart
index e11cd7d..b5e5275 100644
--- a/sdk_nnbd/lib/internal/linked_list.dart
+++ b/sdk_nnbd/lib/internal/linked_list.dart
@@ -98,7 +98,11 @@
 class _LinkedListIterator<T extends LinkedListEntry<T>> implements Iterator<T> {
   /// The current element of the iterator.
   T? _current;
-  T get current => _current as T;
+
+  T get current {
+    final cur = _current;
+    return (cur != null) ? cur : cur as T;
+  }
 
   /// The list the iterator iterates over.
   ///
diff --git a/tests/compiler/dart2js/analyses/api_allowed.json b/tests/compiler/dart2js/analyses/api_allowed.json
index 737f757..fec741e 100644
--- a/tests/compiler/dart2js/analyses/api_allowed.json
+++ b/tests/compiler/dart2js/analyses/api_allowed.json
@@ -9,13 +9,13 @@
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart": {
     "Dynamic invocation of '[]'.": 3,
     "Dynamic access of 'isNaN'.": 3,
-    "Dynamic invocation of '<='.": 4,
-    "Dynamic invocation of '-'.": 4,
-    "Dynamic invocation of '>>'.": 2,
-    "Dynamic invocation of '&'.": 3,
-    "Dynamic invocation of '<'.": 3,
-    "Dynamic invocation of '>'.": 2,
+    "Dynamic invocation of '<='.": 2,
+    "Dynamic invocation of '-'.": 3,
+    "Dynamic invocation of '&'.": 1,
+    "Dynamic invocation of '>>'.": 1,
+    "Dynamic invocation of '<'.": 2,
     "Dynamic invocation of '+'.": 1,
+    "Dynamic invocation of '>'.": 1,
     "Dynamic access of 'length'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart": {
@@ -23,7 +23,7 @@
     "Dynamic invocation of '+'.": 1,
     "Dynamic invocation of '>='.": 1,
     "Dynamic invocation of 'substring'.": 7,
-    "Dynamic invocation of 'allMatches'.": 4,
+    "Dynamic invocation of 'allMatches'.": 3,
     "Dynamic access of 'isNotEmpty'.": 1,
     "Dynamic invocation of '_js_helper::_execGlobal'.": 1,
     "Dynamic access of 'start'.": 1,
diff --git a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
index 64062ed..92ea4ef 100644
--- a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
@@ -30,7 +30,7 @@
     var options = new CompilerOptions()
       ..target = new Dart2jsTarget("dart2js", new TargetFlags())
       ..packagesFileUri = Uri.base.resolve('.packages')
-      ..linkedDependencies = <Uri>[
+      ..additionalDills = <Uri>[
         computePlatformBinariesLocation().resolve("dart2js_platform.dill"),
       ]
       ..setExitCodeOnProblem = true
diff --git a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
index 3b3cd0b..1f79ed0 100644
--- a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
@@ -70,14 +70,14 @@
       entity.writeAsBytesSync(data);
     }
   });
-  List<Uri> linkedDependencies = [
+  List<Uri> additionalDills = [
     computePlatformBinariesLocation().resolve("dart2js_platform.dill"),
   ]..addAll(deps.map(toTestUri));
   fs.entityForUri(toTestUri('.packages')).writeAsStringSync('');
   var options = new CompilerOptions()
     ..target = new Dart2jsTarget("dart2js", new TargetFlags())
     ..fileSystem = new TestFileSystem(fs)
-    ..linkedDependencies = linkedDependencies
+    ..additionalDills = additionalDills
     ..packagesFileUri = toTestUri('.packages');
   var inputUris = inputs.map(toTestUri).toList();
   var inputUriSet = inputUris.toSet();
diff --git a/tests/compiler/dart2js/end_to_end/no_platform_test.dart b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
index 968507b..cf6766d 100644
--- a/tests/compiler/dart2js/end_to_end/no_platform_test.dart
+++ b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
@@ -19,7 +19,7 @@
             new Dart2jsTarget('dart2js', new TargetFlags()),
             Uri.base
                 .resolve('sdk/lib/libraries.json'), // librariesSpecificationUri
-            [], // linkedDependencies
+            [], // additionalDills
             Uri.base.resolve('.packages'), // packagesFileUri
             experimentalFlags: experimentalFlags,
             verify: true);
diff --git a/tests/compiler/dart2js/impact/data/as.dart b/tests/compiler/dart2js/impact/data/as.dart
index 45a687f..80bbc69f 100644
--- a/tests/compiler/dart2js/impact/data/as.dart
+++ b/tests/compiler/dart2js/impact/data/as.dart
@@ -9,14 +9,14 @@
   promoted(null);
 }
 
-/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
 explicitAs(String i) {
   i.length;
   // ignore: unnecessary_cast
   return i as String;
 }
 
-/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
 String implicitAs(String i) {
   dynamic j = i;
   i.length;
@@ -24,7 +24,7 @@
   return j;
 }
 
-/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
+/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
 String promoted(dynamic i) {
   if (i is! String) return null;
   i.length;
diff --git a/tests/compiler/dart2js/impact/data/async.dart b/tests/compiler/dart2js/impact/data/async.dart
index 541c67f..41172c1 100644
--- a/tests/compiler/dart2js/impact/data/async.dart
+++ b/tests/compiler/dart2js/impact/data/async.dart
@@ -217,13 +217,13 @@
   return () async* {};
 }
 
-/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testAsyncForIn(o) async {
   // ignore: UNUSED_LOCAL_VARIABLE
   await for (var e in o) {}
 }
 
-/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testAsyncForInTyped(o) async {
   // ignore: UNUSED_LOCAL_VARIABLE
   await for (int e in o) {}
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index bb334a7..925f979 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -137,7 +137,7 @@
 testForwardingConstructor() => new ForwardingConstructorClass(null);
 
 class ForwardingConstructorTypedSuperClass {
-  /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+  /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
   ForwardingConstructorTypedSuperClass(int arg);
 }
 
@@ -151,7 +151,7 @@
 testForwardingConstructorTyped() => new ForwardingConstructorTypedClass(null);
 
 class ForwardingConstructorGenericSuperClass<T> {
-  /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
+  /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
   ForwardingConstructorGenericSuperClass(T arg);
 }
 
@@ -181,7 +181,7 @@
 */
 testEnum() => Enum.A;
 
-/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
+/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
 List<T> staticGenericMethod<T>(T arg) => [arg];
 
 /*member: testStaticGenericMethod:
@@ -228,7 +228,7 @@
 class GenericClass<X, Y> {
   const GenericClass.generative();
 
-  /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
+  /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
   Map<X, T> genericMethod<T>(T arg) => {null: arg};
 }
 
diff --git a/tests/compiler/dart2js/impact/data/constants/lib.dart b/tests/compiler/dart2js/impact/data/constants/lib.dart
index a896863..5e0bb96 100644
--- a/tests/compiler/dart2js/impact/data/constants/lib.dart
+++ b/tests/compiler/dart2js/impact/data/constants/lib.dart
@@ -42,7 +42,7 @@
 
 const typeLiteralField = String;
 
-/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
+/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
 T id<T>(T t) => t;
 
 const int Function(int) _instantiation = id;
diff --git a/tests/compiler/dart2js/impact/data/constructors.dart b/tests/compiler/dart2js/impact/data/constructors.dart
index 2d6b991..a56a258 100644
--- a/tests/compiler/dart2js/impact/data/constructors.dart
+++ b/tests/compiler/dart2js/impact/data/constructors.dart
@@ -152,7 +152,7 @@
   /*member: GenericClass.generative:static=[Object.(0)]*/
   const GenericClass.generative();
 
-  /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
+  /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
   factory GenericClass.fact() => null;
 
   const factory GenericClass.redirect() = GenericClass<X, Y>.generative;
diff --git a/tests/compiler/dart2js/impact/data/effectively_final.dart b/tests/compiler/dart2js/impact/data/effectively_final.dart
index 2b5f3cd..281b098 100644
--- a/tests/compiler/dart2js/impact/data/effectively_final.dart
+++ b/tests/compiler/dart2js/impact/data/effectively_final.dart
@@ -67,7 +67,7 @@
 /*member: _method1:type=[inst:JSNull]*/
 num _method1() => null;
 
-/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
 effectivelyFinalPromoted() {
   dynamic c = _method1();
   c + 0;
@@ -79,7 +79,7 @@
 /*member: _method2:type=[inst:JSNull]*/
 String _method2() => null;
 
-/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
 effectivelyFinalPromotedInvalid() {
   dynamic c = _method2();
   c + '';
diff --git a/tests/compiler/dart2js/impact/data/expressions.dart b/tests/compiler/dart2js/impact/data/expressions.dart
index ef74e94..3976aee 100644
--- a/tests/compiler/dart2js/impact/data/expressions.dart
+++ b/tests/compiler/dart2js/impact/data/expressions.dart
@@ -105,58 +105,58 @@
 */
 testPreDec(o) => --o;
 
-/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
 testIs() => null is Class;
 
-/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
 testIsGeneric() => null is GenericClass<int, String>;
 
-/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsGenericRaw() => null is GenericClass;
 
-/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsGenericDynamic() => null is GenericClass<dynamic, dynamic>;
 
-/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
 testIsNot() => null is! Class;
 
-/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
 testIsNotGeneric() => null is! GenericClass<int, String>;
 
-/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsNotGenericRaw() => null is! GenericClass;
 
-/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsNotGenericDynamic() => null is! GenericClass<dynamic, dynamic>;
 
-/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
+/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
 testIsTypedef() => null is Typedef;
 
-/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
+/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
 testIsTypedefGeneric() => null is GenericTypedef<int, String>;
 
-/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
 testIsTypedefGenericRaw() => null is GenericTypedef;
 
-/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
 testIsTypedefGenericDynamic() => null is GenericTypedef<dynamic, dynamic>;
 
-/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
+/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
 testIsTypedefDeep() => null is List<GenericTypedef<int, GenericTypedef>>;
 
-/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
+/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAs(dynamic o) => o as Class;
 
-/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
+/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
 // ignore: UNNECESSARY_CAST
 testAsGeneric(dynamic o) => o as GenericClass<int, String>;
 
-/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAsGenericRaw(dynamic o) => o as GenericClass;
 
-/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAsGenericDynamic(dynamic o) => o as GenericClass<dynamic, dynamic>;
 
@@ -168,7 +168,7 @@
 /*member: testIfNotNull:dynamic=[Object.==,foo],type=[inst:JSNull]*/
 testIfNotNull(o) => o?.foo;
 
-/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
+/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
 testTypedIfNotNull(Class o) => o?.field;
 
 /*member: testIfNotNullSet:dynamic=[Object.==,foo=],type=[inst:JSBool,inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
index ef75dc8..d498017 100644
--- a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
+++ b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
@@ -12,10 +12,10 @@
 /*member: C.:static=[Object.(0)]*/
 class C implements A<int>, B<String, bool> {}
 
-/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
+/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
 testA(c, f) => extractTypeArguments<A>(c, f);
 
-/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
+/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
 testB(c, f) => extractTypeArguments<B>(c, f);
 
 /*member: main:static=[C.(0),testA(2),testB(2)],type=[inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/initializers.dart b/tests/compiler/dart2js/impact/data/initializers.dart
index c083e9d..778c065 100644
--- a/tests/compiler/dart2js/impact/data/initializers.dart
+++ b/tests/compiler/dart2js/impact/data/initializers.dart
@@ -28,10 +28,10 @@
   testGenericClass();
 }
 
-/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
 testDefaultValuesPositional([bool value = false]) {}
 
-/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
 testDefaultValuesNamed({bool value: false}) {}
 
 class ClassFieldInitializer1 {
@@ -84,7 +84,7 @@
 
 /*member: ClassInstanceFieldWithInitializer.:static=[Object.(0)]*/
 class ClassInstanceFieldWithInitializer {
-  /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+  /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
   var field = false;
 }
 
@@ -93,7 +93,7 @@
 
 /*member: ClassInstanceFieldTyped.:static=[Object.(0)]*/
 class ClassInstanceFieldTyped {
-  /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+  /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
   int field;
 }
 
@@ -120,7 +120,7 @@
 testSuperInitializer() => new ClassSuperInitializer();
 
 class ClassGeneric<T> {
-  /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
+  /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
   ClassGeneric(T arg);
 }
 
diff --git a/tests/compiler/dart2js/impact/data/injected_cast.dart b/tests/compiler/dart2js/impact/data/injected_cast.dart
index 92ea4a3..7ff1527 100644
--- a/tests/compiler/dart2js/impact/data/injected_cast.dart
+++ b/tests/compiler/dart2js/impact/data/injected_cast.dart
@@ -14,11 +14,11 @@
 
 /*member: Class1.:static=[Object.(0)]*/
 class Class1 {
-  /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
+  /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
   A field1;
 }
 
-/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
+/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
 method1(dynamic o, dynamic value) {
   if (o is! Class1) return;
   o.field1 = value;
@@ -48,11 +48,11 @@
 
 /*member: Class3.:static=[Object.(0)]*/
 class Class3 {
-  /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+  /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
   method3(A a, [B b, C c]) {}
 }
 
-/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
+/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
 method3(dynamic o, dynamic a, B b, dynamic c) {
   if (o is! Class3) return;
   o.method3(a, b, c);
@@ -60,11 +60,11 @@
 
 /*member: Class4.:static=[Object.(0)]*/
 class Class4 {
-  /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+  /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
   method4(A a, {B b, C c}) {}
 }
 
-/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
+/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
 method4(dynamic o, dynamic a, B b, dynamic c) {
   if (o is! Class4) return;
   o.method4(a, c: c, b: b);
@@ -142,7 +142,7 @@
   A Function(A) get f => null;
 }
 
-/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
+/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
 method7(dynamic o, dynamic a) {
   if (o is! Class7) return;
   o.f(a);
@@ -170,7 +170,7 @@
   return g.method(iterable);
 }
 
-/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
+/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
 method9(dynamic g, num value) {
   if (g is! G) return null;
   return g.field = value;
diff --git a/tests/compiler/dart2js/impact/data/invokes.dart b/tests/compiler/dart2js/impact/data/invokes.dart
index 77f827d..ec1ce07 100644
--- a/tests/compiler/dart2js/impact/data/invokes.dart
+++ b/tests/compiler/dart2js/impact/data/invokes.dart
@@ -115,13 +115,13 @@
   topLevelFunction3(15, c: 16, b: 17);
 }
 
-/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
 void topLevelFunction1Typed(int a) {}
 
-/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
+/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
 int topLevelFunction2Typed(String a, [num b, double c]) => null;
 
-/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
+/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
 double topLevelFunction3Typed(bool a, {List<int> b, Map<String, bool> c}) {
   return null;
 }
@@ -162,16 +162,16 @@
   topLevelFunction3Typed(false, c: {'16': false}, b: [17]);
 }
 
-/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
+/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
 topLevelFunctionTyped1(void a(num b)) {}
 
-/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
+/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
 topLevelFunctionTyped2(void a(num b, [String c])) {}
 
-/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
+/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
 topLevelFunctionTyped3(void a(num b, {String c, int d})) {}
 
-/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
+/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
 topLevelFunctionTyped4(void a(num b, {String d, int c})) {}
 
 /*member: testTopLevelFunctionTyped:
@@ -210,7 +210,7 @@
 /*member: testTopLevelSetterSet:static=[set:topLevelSetter],type=[inst:JSNull]*/
 testTopLevelSetterSet() => topLevelSetter = null;
 
-/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
 void set topLevelSetterTyped(int value) {}
 
 /*member: testTopLevelSetterSetTyped:static=[set:topLevelSetterTyped],type=[inst:JSNull]*/
@@ -239,25 +239,25 @@
 /*member: testTopLevelFieldFinal:static=[topLevelFieldFinal]*/
 testTopLevelFieldFinal() => topLevelFieldFinal;
 
-/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
 int topLevelFieldTyped;
 
 /*member: testTopLevelFieldTyped:static=[topLevelFieldTyped]*/
 testTopLevelFieldTyped() => topLevelFieldTyped;
 
-/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass topLevelFieldGeneric1;
 
 /*member: testTopLevelFieldGeneric1:static=[topLevelFieldGeneric1]*/
 testTopLevelFieldGeneric1() => topLevelFieldGeneric1;
 
-/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass<dynamic, dynamic> topLevelFieldGeneric2;
 
 /*member: testTopLevelFieldGeneric2:static=[topLevelFieldGeneric2]*/
 testTopLevelFieldGeneric2() => topLevelFieldGeneric2;
 
-/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
+/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
 GenericClass<int, String> topLevelFieldGeneric3;
 
 /*member: testTopLevelFieldGeneric3:static=[topLevelFieldGeneric3]*/
@@ -382,7 +382,7 @@
   localFunction() {}
 }
 
-/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
+/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
 testLocalFunctionTyped() {
   // ignore: UNUSED_ELEMENT
   int localFunction(String a) => null;
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index 703c91c..6dce2cd 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -59,7 +59,7 @@
 /*member: GenericClass.:static=[JavaScriptObject.(0)]*/
 @JS()
 class GenericClass<T> {
-  /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
+  /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
   external GenericClass method([Callback<T> callback]);
 }
 
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
index 24dd87c..379e8e9 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
@@ -9,11 +9,11 @@
 
 import 'package:js/js.dart';
 
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
 @JS()
 external set foo(Function f);
 
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
 void _doStuff(String name, File file) {
   if (file == null) {
     print('OK');
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
index 5cc18d3..4fdac09 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
@@ -9,11 +9,11 @@
 
 import 'package:js/js.dart';
 
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
 @JS()
 external set foo(void Function(String, File) f);
 
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
 void _doStuff(String name, File file) {
   if (file == null) {
     print('OK');
diff --git a/tests/compiler/dart2js/impact/data/native.dart b/tests/compiler/dart2js/impact/data/native.dart
index 9d6abb5..a759f7f 100644
--- a/tests/compiler/dart2js/impact/data/native.dart
+++ b/tests/compiler/dart2js/impact/data/native.dart
@@ -56,7 +56,7 @@
 
 @Native("NativeClass")
 class NativeClass {
-  /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
+  /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
   @annotation_Creates_SerializedScriptValue
   final Object field;
 
@@ -65,5 +65,5 @@
   }
 }
 
-/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
+/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
 testNativeField(NativeClass c) => c.field;
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
index fb8f608..e0513e7 100644
--- a/tests/compiler/dart2js/impact/data/promotion.dart
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -37,17 +37,17 @@
   dynamicToNoSuchMethodTearOff(null);
 }
 
-/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
+/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
 positiveTyped(Class cls) {
   if (cls is SubClass) cls.method();
 }
 
-/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
 positiveDynamic(dynamic cls) {
   if (cls is SubClass) cls.method();
 }
 
-/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
 negativeDynamic(dynamic cls) {
   if (cls is! SubClass) return;
   cls.method();
diff --git a/tests/compiler/dart2js/impact/data/runtime_type.dart b/tests/compiler/dart2js/impact/data/runtime_type.dart
index 77a187c..7b1ca18 100644
--- a/tests/compiler/dart2js/impact/data/runtime_type.dart
+++ b/tests/compiler/dart2js/impact/data/runtime_type.dart
@@ -60,88 +60,88 @@
 /*member: Class4.:static=[Object.(0)]*/
 class Class4 {}
 
-/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString1(Class2<int> c) => '${c.runtimeType}';
 
-/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString2(Class2<int> c) => '${c?.runtimeType}';
 
-/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString3(Class2<int> c) => c.runtimeType.toString();
 
-/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString4(Class2<int> c) => c.runtimeType?.toString();
 
-/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString5(Class2<int> c) => c?.runtimeType?.toString();
 
-/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString6(Class2<int> c) => c?.runtimeType.toString();
 
-/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 unknown(Class2<int> c) => c.runtimeType;
 
-/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
+/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
 equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
 
-/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals1(Class3 a) => a.runtimeType == null;
 
-/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals2(Class3 a) => a?.runtimeType == null;
 
-/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals3(Class3 a) => null == a.runtimeType;
 
-/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals4(Class3 a) => null == a?.runtimeType;
 
-/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostEquals5(Class3 a) => a.runtimeType == a.field;
 
-/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals6(Class3 a) => a?.runtimeType == a.field;
 
-/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals7(Class3 a) => a.runtimeType == a?.field;
 
-/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals8(Class3 a) => a?.runtimeType == a?.field;
 
-/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostEquals9(Class3 a) => a.field == a.runtimeType;
 
-/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals10(Class3 a) => a?.field == a.runtimeType;
 
-/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals11(Class3 a) => a.field == a?.runtimeType;
 
-/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals12(Class3 a) => a?.field == a?.runtimeType;
 
-/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostToString1(Class3 a) => a.runtimeType.toString;
 
-/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString2(Class3 a) => a?.runtimeType?.toString;
 
-/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
 
-/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
 
-/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
+/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
 notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
 
-/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
 
-/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
 
-/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
 
 /*member: main:dynamic=[exact:Class1a.==],static=[Class1a.(0),Class1b.(0),Class1c.(0),Class1d.(0),Class2.(0),Class3.(0),Class4.(0),almostEquals1(1),almostEquals10(1),almostEquals11(1),almostEquals12(1),almostEquals2(1),almostEquals3(1),almostEquals4(1),almostEquals5(1),almostEquals6(1),almostEquals7(1),almostEquals8(1),almostEquals9(1),almostToString1(1),almostToString2(1),almostToString3(1),almostToString4(1),checkTypeBound(4),equals1(2),notEquals1(2),notEquals2(2),notEquals3(2),notEquals4(2),print(1),throwTypeError(1),toString1(1),toString2(1),toString3(1),toString4(1),toString5(1),toString6(1),unknown(1)]*/
diff --git a/tests/compiler/dart2js/impact/data/statements.dart b/tests/compiler/dart2js/impact/data/statements.dart
index 4eb9ab4..15a28cf 100644
--- a/tests/compiler/dart2js/impact/data/statements.dart
+++ b/tests/compiler/dart2js/impact/data/statements.dart
@@ -65,13 +65,13 @@
     return 1;
 }
 
-/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testForIn(o) {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (var e in o) {}
 }
 
-/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testForInTyped(o) {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (int e in o) {}
@@ -87,7 +87,7 @@
   try {} catch (e) {}
 }
 
-/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
+/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
 testTryCatchOn() {
   // ignore: UNUSED_CATCH_CLAUSE
   try {} on String catch (e) {}
diff --git a/tests/compiler/dart2js/js/js_spec_string_test.dart b/tests/compiler/dart2js/js/js_spec_string_test.dart
index bcc11b8..a3245e4 100644
--- a/tests/compiler/dart2js/js/js_spec_string_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_string_test.dart
@@ -34,7 +34,7 @@
   DiagnosticMessage createMessage(spannable, messageKind,
       [arguments = const {}]) {
     return new DiagnosticMessage(null, spannable,
-        MessageTemplate.TEMPLATES[messageKind].message(arguments));
+        MessageTemplate.TEMPLATES[messageKind].message(arguments, null));
   }
 
   @override
diff --git a/tests/compiler/dart2js/jsinterop/declaration_test.dart b/tests/compiler/dart2js/jsinterop/declaration_test.dart
index 2239c40..6c94aab 100644
--- a/tests/compiler/dart2js/jsinterop/declaration_test.dart
+++ b/tests/compiler/dart2js/jsinterop/declaration_test.dart
@@ -264,7 +264,7 @@
 
 @JS()
 class A {
-  A();
+  external A();
 }
 
 main() => new A();
@@ -303,7 +303,7 @@
 @JS()
 @anonymous
 class A {
-  A();
+  external A();
 }
 
 main() => new A();
diff --git a/tests/compiler/dart2js/model/native_test.dart b/tests/compiler/dart2js/model/native_test.dart
index 6ae4e32..b0b227a 100644
--- a/tests/compiler/dart2js/model/native_test.dart
+++ b/tests/compiler/dart2js/model/native_test.dart
@@ -68,9 +68,7 @@
       '46',
       '51',
       // TODO(33834): Non-external constructors should not be allowed.
-      '34',
       '35',
-      '36',
       '37',
       // TODO(34345): Non-external static members should not be allowed.
       '43',
@@ -127,9 +125,7 @@
       '46',
       '51',
       // TODO(33834): Non-external constructors should not be allowed.
-      '34',
       '35',
-      '36',
       '37',
       // TODO(34345): Non-external static members should not be allowed.
       '43',
diff --git a/tests/compiler/dart2js_extra/40902_test.dart b/tests/compiler/dart2js_extra/40902_test.dart
new file mode 100644
index 0000000..d62c769
--- /dev/null
+++ b/tests/compiler/dart2js_extra/40902_test.dart
@@ -0,0 +1,19 @@
+// 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";
+
+class Foo {
+  int f() => 42;
+}
+
+class Bar extends Foo {
+  void test() {
+    Expect.isFalse(super.f is int);
+  }
+}
+
+void main() {
+  Bar().test();
+}
diff --git a/tests/compiler/dart2js_extra/jsinterop_test.dart b/tests/compiler/dart2js_extra/jsinterop_test.dart
index f689269..07798e5 100644
--- a/tests/compiler/dart2js_extra/jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/jsinterop_test.dart
@@ -143,7 +143,7 @@
 
 @JS('d')
 class JsInteropClass {
-  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 34: compile-time error
+  // GENERIC //# 34: compile-time error
   JsInteropClass.generative(); //# 34: continued
 
   // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 35: compile-time error
@@ -152,7 +152,7 @@
   external JsInteropClass.externalGenerative();
   external factory JsInteropClass.externalFact();
 
-  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 36: compile-time error
+  @JS('a') // GENERIC //# 36: compile-time error
   JsInteropClass.jsInteropGenerative(); //# 36: continued
 
   @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 37: compile-time error
diff --git a/tests/compiler/dart2js_extra/non_jsinterop_test.dart b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
index d4cd22c..e66c5d5 100644
--- a/tests/compiler/dart2js_extra/non_jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
@@ -145,7 +145,7 @@
 
 @JS('d')
 class JsInteropClass {
-  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 34: compile-time error
+  // GENERIC //# 34: compile-time error
   JsInteropClass.generative(); //# 34: continued
 
   // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 35: compile-time error
@@ -154,7 +154,7 @@
   external JsInteropClass.externalGenerative();
   external factory JsInteropClass.externalFact();
 
-  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 36: compile-time error
+  @JS('a') // GENERIC //# 36: compile-time error
   JsInteropClass.jsInteropGenerative(); //# 36: continued
 
   @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 37: compile-time error
diff --git a/tests/kernel/unsorted/regression_flutter51828_test.dart b/tests/kernel/unsorted/regression_flutter51828_test.dart
new file mode 100644
index 0000000..3d161f3
--- /dev/null
+++ b/tests/kernel/unsorted/regression_flutter51828_test.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// This is a regression test for https://github.com/flutter/flutter/issues/51828
+// which failed due bad reuse/typing of temp. vars. in the async transform.
+
+class A {
+  Future<void> foo(x) async {}
+}
+
+class B {
+  Future<void> bar(x) async {}
+}
+
+main() async => [A().foo(await null), B().bar(await null)];
diff --git a/tests/language/await/and_ifnull_test.dart b/tests/language/await/and_ifnull_test.dart
new file mode 100644
index 0000000..16d3fe5
--- /dev/null
+++ b/tests/language/await/and_ifnull_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+Future<String?> foo(bool x) async => x ? "foo" : null;
+
+Future<String> bar(bool x) async {
+  return ((await foo(x)) ?? "bar").toUpperCase();
+}
+
+main() async {
+  Expect.equals(await bar(true), "FOO");
+  Expect.equals(await bar(false), "BAR");
+}
diff --git a/tests/language/await/await_test.dart b/tests/language/await/await_test.dart
new file mode 100644
index 0000000..2938a57
--- /dev/null
+++ b/tests/language/await/await_test.dart
@@ -0,0 +1,240 @@
+// 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.
+
+// VMOptions=---optimization-counter-threshold=10
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+import 'dart:async';
+
+int globalVariable = 1;
+int topLevelFoo(int param) => 1;
+int get topLevelGetter => globalVariable;
+void set topLevelSetter(val) {
+  globalVariable = val;
+}
+
+class C {
+  static int staticField = 1;
+  static int get staticGetter => staticField;
+  static void set staticSetter(val) {
+    staticField = val;
+  }
+
+  static int staticFoo(int param) => param;
+
+  int field = 1;
+  int get getter => field;
+  void set setter(val) {
+    field = val;
+  }
+
+  int foo(int param) => param;
+}
+
+dummy() => 1;
+
+staticMembers() async {
+  var a = C.staticField + await dummy();
+  Expect.equals(a, 2);
+  var f = (C.staticField = 1) + await dummy();
+  Expect.equals(f, 2);
+  var b = C.staticGetter + await dummy();
+  Expect.equals(b, 2);
+  var c = (C.staticSetter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = C.staticFoo(2) + await dummy();
+  Expect.equals(d, 3);
+  var e = C.staticField +
+      C.staticGetter +
+      (C.staticSetter = 1) +
+      C.staticFoo(1) +
+      await dummy();
+  Expect.equals(e, 5);
+}
+
+topLevelMembers() async {
+  var a = globalVariable + await dummy();
+  Expect.equals(a, 2);
+  var b = topLevelGetter + await dummy();
+  Expect.equals(b, 2);
+  var c = (topLevelSetter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = topLevelFoo(1) + await dummy();
+  Expect.equals(d, 2);
+  var e = globalVariable +
+      topLevelGetter +
+      (topLevelSetter = 1) +
+      topLevelFoo(1) +
+      await dummy();
+  Expect.equals(e, 5);
+}
+
+instanceMembers() async {
+  var inst = new C();
+  var a = inst.field + await dummy();
+  Expect.equals(a, 2);
+  var b = inst.getter + await dummy();
+  Expect.equals(b, 2);
+  var c = (inst.setter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = inst.foo(1) + await dummy();
+  Expect.equals(d, 2);
+  var e = inst.field +
+      inst.getter +
+      (inst.setter = 1) +
+      inst.foo(1) +
+      await dummy();
+  Expect.equals(e, 5);
+}
+
+others() async {
+  var a = "${globalVariable} ${await dummy()} " + await "someString";
+  Expect.equals(a, "1 1 someString");
+  var c = new C();
+  var d = c.field + await dummy();
+  var cnt = 2;
+  var b = [1, 2, 3];
+  b[cnt] = await dummy();
+  Expect.equals(b[cnt], 1);
+  var e = b[0] + await dummy();
+  Expect.equals(e, 2);
+}
+
+conditionals() async {
+  var a = false;
+  var b = true;
+  var c = (a || b) || await dummy();
+  Expect.isTrue(c);
+  var d = (a || b) ? a : await dummy();
+  Expect.isFalse(d);
+  var e = (a is int) ? await dummy() : 2;
+  Expect.equals(e, 2);
+  try {
+    var f = (a is int) ? await dummy() : 2;
+  } catch (e) {}
+}
+
+asserts() async {
+  for (final FutureOr<T> Function<T>(T) func in <dynamic>[id, future]) {
+    assert(await func(true));
+    assert(id(true) as bool, await func("message"));
+    assert(await func(true), await (func("message")));
+    bool success = true;
+    try {
+      assert(await func(false), await (func("message")));
+      if (assertStatementsEnabled) Expect.fail("Didn't throw");
+    } on AssertionError catch (e) {
+      Expect.equals("message", e.message);
+    }
+  }
+}
+
+controlFlow() async {
+  for (final FutureOr<T> Function<T>(T) func in <dynamic>[id, future]) {
+    // For.
+    var c = 0;
+    for (var i = await (func(0)); await func(i < 5); await func(i++)) {
+      c++;
+    }
+    Expect.equals(5, c);
+    // While.
+    c = 0;
+    while (await func(c < 5)) c++;
+    Expect.equals(5, c);
+    // Do-while.
+    c = 0;
+    do {
+      c++;
+    } while (await func(c < 5));
+    Expect.equals(5, c);
+    // If.
+    if (await func(c == 5)) {
+      Expect.equals(5, c);
+    } else {
+      Expect.fail("unreachable");
+    }
+    // Throw.
+    try {
+      throw await func("string");
+    } on String {
+      // OK.
+    }
+
+    try {
+      await (throw "string");
+    } on String {
+      // OK.
+    }
+    // Try/catch/finally
+    try {
+      try {
+        throw "string";
+      } catch (e) {
+        Expect.equals("string", e);
+        Expect.equals(0, await func(0));
+        rethrow;
+      } finally {
+        Expect.equals(0, await func(0));
+      }
+    } catch (e) {
+      Expect.equals(0, await func(0));
+      Expect.equals("string", e);
+    } finally {
+      Expect.equals(0, await func(0));
+    }
+    // Switch
+    switch (await func(2)) {
+      case 2:
+        break;
+      default:
+        Expect.fail("unreachable");
+    }
+    // Return.
+    Expect.equals(
+        42,
+        await () async {
+          return await func(42);
+        }());
+    Expect.equals(
+        42,
+        await () async {
+          return func(42);
+        }());
+    // Yield.
+    Stream<int> testStream1() async* {
+      yield await func(42);
+    }
+
+    Expect.listEquals([42], await testStream1().toList());
+    // Yield*
+    Stream<int> testStream2() async* {
+      yield* await func(intStream());
+    }
+
+    Expect.listEquals([42], await testStream2().toList());
+  }
+}
+
+FutureOr<T> future<T>(T value) async => value;
+FutureOr<T> id<T>(T value) => value;
+
+Stream<int> intStream() async* {
+  yield 42;
+}
+
+main() {
+  asyncStart();
+  for (int i = 0; i < 11; i++) {
+    asyncTest(staticMembers);
+    asyncTest(topLevelMembers);
+    asyncTest(instanceMembers);
+    asyncTest(conditionals);
+    asyncTest(others);
+    asyncTest(asserts);
+    asyncTest(controlFlow);
+  }
+  asyncEnd();
+}
diff --git a/tests/language/await/backwards_compatibility_runtime_test.dart b/tests/language/await/backwards_compatibility_runtime_test.dart
new file mode 100644
index 0000000..e257558
--- /dev/null
+++ b/tests/language/await/backwards_compatibility_runtime_test.dart
@@ -0,0 +1,49 @@
+// 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.
+
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+
+get await => 4;
+
+// For functions that are declared with the async modifier we treat await as
+// keyword.
+
+test0() async {
+  var x = await 7;
+  Expect.equals(7, x);
+
+}
+
+test1() async {
+  var x = await 9;
+  Expect.equals(9, x);
+
+}
+
+// For functions that are not declared with the async modifier we allow await to
+// be used as an identifier.
+
+test2() {
+  var y = await;
+  Expect.equals(4, y);
+
+}
+
+test3() {
+  var await = 3;
+  Expect.equals(3, await);
+
+}
+
+main() {
+  test0();
+  test1();
+  test2();
+  test3();
+}
diff --git a/tests/language/await/backwards_compatibility_test.dart b/tests/language/await/backwards_compatibility_test.dart
new file mode 100644
index 0000000..ea6084c
--- /dev/null
+++ b/tests/language/await/backwards_compatibility_test.dart
@@ -0,0 +1,58 @@
+// 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.
+
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+
+get await => 4;
+
+// For functions that are declared with the async modifier we treat await as
+// keyword.
+
+test0() async {
+  var x = await 7;
+  Expect.equals(7, x);
+  var await = 1;
+  //  ^^^^^
+  // [analyzer] SYNTACTIC_ERROR.ASYNC_KEYWORD_USED_AS_IDENTIFIER
+  // [cfe] 'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.
+}
+
+test1() async {
+  var x = await 9;
+  Expect.equals(9, x);
+  var y = await;
+  //           ^
+  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
+  // [cfe] Expected an identifier, but got ';'.
+}
+
+// For functions that are not declared with the async modifier we allow await to
+// be used as an identifier.
+
+test2() {
+  var y = await;
+  Expect.equals(4, y);
+  var x = await 1;
+  //      ^^^^^
+  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+  // [cfe] Expected ';' after this.
+}
+
+test3() {
+  var await = 3;
+  Expect.equals(3, await);
+  var x = await 1;
+  //      ^^^^^
+  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+  // [cfe] Expected ';' after this.
+}
+
+main() {
+  test0();
+  test1();
+  test2();
+  test3();
+}
diff --git a/tests/language/await/exceptions_test.dart b/tests/language/await/exceptions_test.dart
new file mode 100644
index 0000000..c141edc
--- /dev/null
+++ b/tests/language/await/exceptions_test.dart
@@ -0,0 +1,98 @@
+// 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.
+
+// VMOptions=--optimization-counter-threshold=5
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+
+import 'dart:async';
+
+// It does not matter where a future is generated.
+bar(p) async => p;
+baz(p) => new Future(() => p);
+
+test0_1() async {
+  throw 1;
+}
+
+test0() async {
+  try {
+    await test0_1();
+  } catch (e) {
+    Expect.equals(1, e);
+  }
+}
+
+test1_1() async {
+  throw 1;
+}
+
+test1_2() async {
+  try {
+    await test1_1();
+  } catch (e) {
+    throw e + 1;
+  }
+}
+
+test1() async {
+  try {
+    await test1_2();
+  } catch (e) {
+    Expect.equals(2, e);
+  }
+}
+
+test2() async {
+  var x;
+  var test2_1 = () async {
+    try {
+      throw 'a';
+    } catch (e) {
+      throw e + 'b';
+    }
+  };
+  try {
+    try {
+      await test2_1();
+    } catch (e) {
+      var y = await bar(e + 'c');
+      throw y;
+    }
+  } catch (e) {
+    x = e + 'd';
+    return '?';
+  } finally {
+    return x;
+  }
+  return '!';
+}
+
+test() async {
+  var result;
+  for (int i = 0; i < 10; i++) {
+    await test0();
+    await test1();
+    result = await test2();
+    Expect.equals('abcd', result);
+  }
+  await 1;
+}
+
+foo() {
+  throw "Error";
+}
+
+awaitFoo() async {
+  await foo();
+}
+
+main() {
+  asyncStart();
+  test()
+      .then((_) => awaitFoo().then((_) => Expect.fail("Should have thrown"),
+          onError: (error) => Expect.equals("Error", error)))
+      .whenComplete(asyncEnd);
+}
diff --git a/tests/language/await/for_cancel_test.dart b/tests/language/await/for_cancel_test.dart
new file mode 100644
index 0000000..308b2a9
--- /dev/null
+++ b/tests/language/await/for_cancel_test.dart
@@ -0,0 +1,93 @@
+// 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.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+late bool canceled;
+
+test1() async {
+  canceled = false;
+  try {
+    StreamController controller = infiniteStreamController();
+    outer:
+    while (true) {
+      await for (var x in controller.stream) {
+        for (int j = 0; j < 10; j++) {
+          if (j == 5) break outer;
+        }
+      }
+    }
+  } finally {
+    Expect.isTrue(canceled);
+  }
+}
+
+test2() async {
+  canceled = false;
+  try {
+    StreamController controller = infiniteStreamController();
+    bool first = true;
+    outer:
+    while (true) {
+      if (first) {
+        first = false;
+      } else {
+        break;
+      }
+      await for (var x in controller.stream) {
+        for (int j = 0; j < 10; j++) {
+          if (j == 5) continue outer;
+        }
+      }
+    }
+  } finally {
+    Expect.isTrue(canceled);
+  }
+}
+
+test() async {
+  await test1();
+  await test2();
+}
+
+main() {
+  asyncStart();
+  test().then((_) {
+    asyncEnd();
+  });
+}
+
+// Create a stream that produces numbers [1, 2, ... ]
+StreamController infiniteStreamController() {
+  late StreamController controller;
+  Timer timer;
+  int counter = 0;
+
+  void tick() {
+    if (controller.isPaused) {
+      return;
+    }
+    if (canceled) {
+      return;
+    }
+    counter++;
+    controller.add(counter); // Ask stream to send counter values as event.
+    Timer.run(tick);
+  }
+
+  void startTimer() {
+    Timer.run(tick);
+  }
+
+  controller = new StreamController(
+      onListen: startTimer,
+      onResume: startTimer,
+      onCancel: () {
+        canceled = true;
+      });
+
+  return controller;
+}
diff --git a/tests/language/await/for_test.dart b/tests/language/await/for_test.dart
new file mode 100644
index 0000000..0c72a4d
--- /dev/null
+++ b/tests/language/await/for_test.dart
@@ -0,0 +1,152 @@
+// 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.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+class Trace {
+  String trace = "";
+  record(x) {
+    trace += x.toString();
+  }
+
+  toString() => trace;
+}
+
+Stream makeMeAStream() {
+  return timedCounter(5);
+}
+
+Trace t1 = new Trace();
+
+Future consumeOne() async {
+  // Equivalent to await for (x in makeMeAStream()) { ... }
+  var s = makeMeAStream();
+  var it = new StreamIterator(s);
+  while (await it.moveNext()) {
+    var x = it.current;
+    t1.record(x);
+  }
+  t1.record("X");
+}
+
+Trace t2 = new Trace();
+
+Future consumeTwo() async {
+  await for (var x in makeMeAStream()) {
+    t2.record(x);
+  }
+  t2.record("Y");
+}
+
+Trace t3 = new Trace();
+
+Future consumeNested() async {
+  await for (var x in makeMeAStream()) {
+    t3.record(x);
+    await for (var y in makeMeAStream()) {
+      t3.record(y);
+    }
+    t3.record("|");
+  }
+  t3.record("Z");
+}
+
+Trace t4 = new Trace();
+
+Future consumeSomeOfInfinite() async {
+  int i = 0;
+  await for (var x in infiniteStream()) {
+    i++;
+    if (i > 10) break;
+    t4.record(x);
+  }
+  t4.record("U");
+}
+
+main() {
+  var f1 = consumeOne();
+  t1.record("T1:");
+
+  var f2 = consumeTwo();
+  t2.record("T2:");
+
+  var f3 = consumeNested();
+  t3.record("T3:");
+
+  var f4 = consumeSomeOfInfinite();
+  t4.record("T4:");
+
+  asyncStart();
+  Future.wait([f1, f2, f3, f4]).then((_) {
+    Expect.equals("T1:12345X", t1.toString());
+    Expect.equals("T2:12345Y", t2.toString());
+    Expect.equals("T3:112345|212345|312345|412345|512345|Z", t3.toString());
+    Expect.equals("T4:12345678910U", t4.toString());
+    asyncEnd();
+  });
+}
+
+// Create a stream that produces numbers [1, 2, ... maxCount]
+Stream timedCounter(int maxCount) {
+  late StreamController controller;
+  Timer? timer;
+  int counter = 0;
+
+  void tick(_) {
+    counter++;
+    controller.add(counter); // Ask stream to send counter values as event.
+    if (counter >= maxCount) {
+      timer!.cancel();
+      controller.close(); //    Ask stream to shut down and tell listeners.
+    }
+  }
+
+  void startTimer() {
+    timer = new Timer.periodic(const Duration(milliseconds: 10), tick);
+  }
+
+  void stopTimer() {
+    timer?.cancel();
+    timer = null;
+  }
+
+  controller = new StreamController(
+      onListen: startTimer,
+      onPause: stopTimer,
+      onResume: startTimer,
+      onCancel: stopTimer);
+
+  return controller.stream;
+}
+
+// Create a stream that produces numbers [1, 2, ... ]
+Stream infiniteStream() {
+  late StreamController controller;
+  Timer? timer;
+  int counter = 0;
+
+  void tick(_) {
+    counter++;
+    controller.add(counter); // Ask stream to send counter values as event.
+  }
+
+  void startTimer() {
+    timer = new Timer.periodic(const Duration(milliseconds: 10), tick);
+  }
+
+  void stopTimer() {
+    timer?.cancel();
+    timer = null;
+  }
+
+  controller = new StreamController(
+      onListen: startTimer,
+      onPause: stopTimer,
+      onResume: startTimer,
+      onCancel: stopTimer);
+
+  return controller.stream;
+}
diff --git a/tests/language/await/for_use_local_test.dart b/tests/language/await/for_use_local_test.dart
new file mode 100644
index 0000000..7ebe7e6
--- /dev/null
+++ b/tests/language/await/for_use_local_test.dart
@@ -0,0 +1,39 @@
+// 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:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+sumStream(Stream<int> s) async {
+  int accum = 0;
+  await for (var v in s) {
+    accum += v;
+  }
+  return accum;
+}
+
+test() async {
+  var countStreamController;
+  int i = 0;
+  void tick() {
+    if (i < 10) {
+      countStreamController.add(i);
+      i++;
+      scheduleMicrotask(tick);
+    } else {
+      countStreamController.close();
+    }
+  }
+
+  countStreamController = new StreamController<int>(onListen: () {
+    scheduleMicrotask(tick);
+  });
+  Expect.equals(45, await sumStream(countStreamController.stream));
+}
+
+void main() {
+  asyncStart();
+  test().then((_) => asyncEnd());
+}
diff --git a/tests/language/await/future_test.dart b/tests/language/await/future_test.dart
new file mode 100644
index 0000000..bfd11e6
--- /dev/null
+++ b/tests/language/await/future_test.dart
@@ -0,0 +1,236 @@
+// 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.
+
+// VMOptions=--optimization-counter-threshold=5
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+
+import 'dart:async';
+
+// It does not matter where a future is generated.
+bar(p) async => p;
+baz(p) => new Future(() => p);
+
+foo() async {
+  var b = 0;
+  for (int i = 0; i < 10; i++) {
+    b += ((await bar(1)) + (await baz(2))) as int;
+  }
+  return b;
+}
+
+faa() async => (await bar('faa')).length;
+
+quaz(p) async {
+  var x = 0;
+  try {
+    for (var j = 0; j < 10; j++) {
+      x += (await baz(j)) as int;
+    }
+    return x;
+  } finally {
+    Expect.equals(x, 45);
+    return p;
+  }
+}
+
+quazz() async {
+  var x = 0;
+  try {
+    try {
+      x = await bar(1);
+      throw x;
+    } catch (e1) {
+      var y = await baz(e1 + 1);
+      throw y;
+    }
+  } catch (e2) {
+    return e2;
+  }
+}
+
+nesting() async {
+  try {
+    try {
+      var x = 1;
+      var y = () async {
+        try {
+          var z = (await bar(3)) + x;
+          throw z;
+        } catch (e1) {
+          return e1;
+        }
+      };
+      var a = await y();
+      throw a;
+    } catch (e2) {
+      throw e2 + 1;
+    }
+  } catch (e3) {
+    return e3;
+  }
+}
+
+awaitAsUnary(a, b) async {
+  return await a + await b;
+}
+
+awaitIf(p) async {
+  if (p < (await bar(5))) {
+    return "p<5";
+  } else {
+    return "p>=5";
+  }
+}
+
+awaitNestedIf(p, q) async {
+  if (p == (await bar(5))) {
+    if (q < (await bar(7))) {
+      return "q<7";
+    } else {
+      return "q>=7";
+    }
+  } else {
+    return "p!=5";
+  }
+  return "!";
+}
+
+awaitElseIf(p) async {
+  if (p > (await bar(5))) {
+    return "p>5";
+  } else if (p < (await bar(5))) {
+    return "p<5";
+  } else {
+    return "p==5";
+  }
+  return "!";
+}
+
+awaitReturn() async {
+  return await bar(17);
+}
+
+awaitSwitch() async {
+  switch (await bar(3)) {
+    case 1:
+      return 1;
+      break;
+    case 3:
+      return 3;
+      break;
+    default:
+      return -1;
+  }
+}
+
+awaitNestedWhile(int i, int j) async {
+  int savedJ = j;
+  var decI = () async {
+    return i--;
+  };
+  var decJ = () async {
+    return j--;
+  };
+  var k = 0;
+  while ((await decI()) > 0) {
+    j = savedJ;
+    while (0 < (await decJ())) {
+      k++;
+    }
+  }
+  return k;
+}
+
+awaitNestedDoWhile(int i, int j) async {
+  int savedJ = j;
+  var decI = () async {
+    return i--;
+  };
+  var decJ = () async {
+    return j--;
+  };
+  var k = 0;
+  do {
+    do {
+      k++;
+    } while (0 < (await decI()));
+  } while ((await decJ()) > 0);
+  return k;
+}
+
+awaitFor() async {
+  var asyncInc = (p) async => p + 1;
+  var k = 0;
+  for (int j = (await bar(0)), i = (await bar(1));
+      j < (await bar(5));
+      j = (await asyncInc(j)), i = (await asyncInc(i))) {
+    k += i;
+    k += j;
+  }
+  return k;
+}
+
+awaitForIn() async {
+  var list = ['a', 'b', 'c'];
+  var k = '';
+  for (var c in (await bar(list))) {
+    k += c;
+  }
+  return k;
+}
+
+test() async {
+  var result;
+  for (int i = 0; i < 10; i++) {
+    result = await foo();
+    Expect.equals(30, result);
+    result = await faa();
+    Expect.equals(3, result);
+    result = await quaz(17);
+    Expect.equals(17, result);
+    result = await quazz();
+    Expect.equals(2, result);
+    result = await nesting();
+    Expect.equals(5, result);
+    result = await awaitIf(3);
+    Expect.equals("p<5", result);
+    result = await awaitIf(5);
+    Expect.equals("p>=5", result);
+    result = await awaitNestedIf(5, 3);
+    Expect.equals("q<7", result);
+    result = await awaitNestedIf(5, 8);
+    Expect.equals("q>=7", result);
+    result = await awaitNestedIf(3, 8);
+    Expect.equals("p!=5", result);
+    result = await awaitReturn();
+    Expect.equals(17, result);
+    result = await awaitSwitch();
+    Expect.equals(3, result);
+    result = await awaitElseIf(6);
+    Expect.equals("p>5", result);
+    result = await awaitElseIf(4);
+    Expect.equals("p<5", result);
+    result = await awaitElseIf(5);
+    Expect.equals("p==5", result);
+    result = await awaitNestedWhile(5, 3);
+    Expect.equals(15, result);
+    result = await awaitNestedWhile(4, 6);
+    Expect.equals(24, result);
+    result = await awaitAsUnary(bar(1), bar(2));
+    Expect.equals(3, result);
+    result = await awaitFor();
+    Expect.equals(25, result);
+    result = await awaitForIn();
+    Expect.equals('abc', result);
+  }
+}
+
+main() {
+  asyncStart();
+  test().then((_) {
+    asyncEnd();
+  });
+}
diff --git a/tests/language/await/in_cascade_test.dart b/tests/language/await/in_cascade_test.dart
new file mode 100644
index 0000000..7049e73
--- /dev/null
+++ b/tests/language/await/in_cascade_test.dart
@@ -0,0 +1,15 @@
+// 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 'dart:async';
+import 'package:expect/expect.dart';
+
+class C {
+  Future<List<int>> m() async => []..add(await _m());
+  Future<int> _m() async => 42;
+}
+
+main() async {
+  Expect.equals((await new C().m()).first, 42);
+}
diff --git a/tests/language/await/nonfuture_test.dart b/tests/language/await/nonfuture_test.dart
new file mode 100644
index 0000000..1aa6855
--- /dev/null
+++ b/tests/language/await/nonfuture_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// VMOptions=--optimization-counter-threshold=5
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+var X = 0;
+
+foo() async {
+  Expect.equals(X, 0);
+  await 5;
+  Expect.equals(X, 10);
+  return await 499;
+}
+
+main() {
+  asyncStart();
+  var f = foo();
+  f.then((res) {
+    Expect.equals(499, res);
+    asyncEnd();
+  });
+  X = 10;
+}
diff --git a/tests/language/await/null_aware_test.dart b/tests/language/await/null_aware_test.dart
new file mode 100644
index 0000000..819de12
--- /dev/null
+++ b/tests/language/await/null_aware_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// Regression test for issue dartbug.com/24392
+
+import 'package:expect/expect.dart';
+import 'dart:async';
+
+Future<int?> f() async {
+  // Unreachable.
+  Expect.isTrue(false);
+}
+
+main() async {
+  int? x = 1;
+  x ??= await f();
+  Expect.equals(1, x);
+
+  int? y = 1;
+  y = y ?? await f();
+  Expect.equals(1, y);
+}
diff --git a/tests/language/await/postfix_expr_test.dart b/tests/language/await/postfix_expr_test.dart
new file mode 100644
index 0000000..9295844
--- /dev/null
+++ b/tests/language/await/postfix_expr_test.dart
@@ -0,0 +1,58 @@
+// 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:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+post0(a) async {
+  return await a++;
+}
+
+post1(a) async {
+  return await a++ + await a++;
+}
+
+pref0(a) async {
+  return await ++a;
+}
+
+pref1(a) async {
+  return await ++a + await ++a;
+}
+
+sum(List<int> a) async {
+  var s = 0;
+  for (int i = 0; i < a.length; /* nothing */) {
+    s += a[await i++];
+  }
+  return s;
+}
+
+// Adapted from repro case for issue 22875.
+sum2(n) async {
+  int i, s = 0;
+  for (i = 1; i <= n; await i++) {
+    // The loop-local variable j was necessary for the crash in 22785.
+    var j = await i;
+    s += j;
+  }
+  return s;
+}
+
+test() async {
+  Expect.equals(10, await post0(10));
+  Expect.equals(21, await post1(10));
+  Expect.equals(11, await pref0(10));
+  Expect.equals(23, await pref1(10));
+  Expect.equals(10, await sum([1, 2, 3, 4]));
+  Expect.equals(10, await sum2(4));
+}
+
+main() {
+  asyncStart();
+  test().then((_) {
+    asyncEnd();
+  });
+}
diff --git a/tests/language/await/regression_test.dart b/tests/language/await/regression_test.dart
new file mode 100644
index 0000000..44031d8
--- /dev/null
+++ b/tests/language/await/regression_test.dart
@@ -0,0 +1,48 @@
+// 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.
+//
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+later(vodka) => new Future.value(vodka);
+
+manana(tequila) async => tequila;
+
+// Regression test for issue 21536.
+testNestedFunctions() async {
+  var a = await later('Asterix').then((tonic) {
+    return later(tonic);
+  });
+  var o = await manana('Obelix').then(manana);
+  Expect.equals("$a and $o", "Asterix and Obelix");
+}
+
+addLater({a, b}) => new Future.value(a + b);
+
+// Regression test for issue 21480.
+testNamedArguments() async {
+  var sum = await addLater(a: 5, b: 10);
+  Expect.equals(sum, 15);
+  sum = await addLater(b: 11, a: -11);
+  Expect.equals(sum, 0);
+}
+
+testSideEffects() async {
+  Future foo(int a1, int a2) {
+    Expect.equals(10, a1);
+    Expect.equals(11, a2);
+    return new Future.value();
+  }
+
+  int a = 10;
+  await foo(a++, a++);
+  Expect.equals(12, a);
+}
+
+main() async {
+  testNestedFunctions();
+  testNamedArguments();
+  testSideEffects();
+}
diff --git a/tests/language/await/started_immediately_test.dart b/tests/language/await/started_immediately_test.dart
new file mode 100644
index 0000000..c21591f
--- /dev/null
+++ b/tests/language/await/started_immediately_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// Test that an async function does start immediately.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+var x = 0;
+
+foo() async {
+  x++;
+  await 1;
+  x++;
+}
+
+void main() {
+  asyncStart();
+  foo().then((_) => Expect.equals(2, x)).whenComplete(asyncEnd);
+  Expect.equals(1, x);
+}
diff --git a/tests/language/bool/bool_test.dart b/tests/language/bool/bool_test.dart
new file mode 100644
index 0000000..51d4d9f
--- /dev/null
+++ b/tests/language/bool/bool_test.dart
@@ -0,0 +1,210 @@
+// 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 BoolTest {
+  static void testEquality() {
+    Expect.equals(true, true);
+    Expect.equals(false, false);
+    Expect.isTrue(identical(true, true));
+    Expect.isFalse(identical(true, false));
+    Expect.isTrue(identical(false, false));
+    Expect.isFalse(identical(false, true));
+    Expect.isFalse(!identical(true, true));
+    Expect.isTrue(!identical(true, false));
+    Expect.isFalse(!identical(false, false));
+    Expect.isTrue(!identical(false, true));
+    Expect.isTrue(true == true);
+    Expect.isFalse(true == false);
+    Expect.isTrue(false == false);
+    Expect.isFalse(false == true);
+    Expect.isFalse(true != true);
+    Expect.isTrue(true != false);
+    Expect.isFalse(false != false);
+    Expect.isTrue(false != true);
+    Expect.isTrue(identical(true, (true == true)));
+    Expect.isTrue(identical(false, (true == false)));
+    Expect.isTrue(identical(true, (false == false)));
+    Expect.isTrue(identical(false, (false == true)));
+    Expect.isFalse(!identical(true, (true == true)));
+    Expect.isFalse(!identical(false, (true == false)));
+    Expect.isFalse(!identical(true, (false == false)));
+    Expect.isFalse(!identical(false, (false == true)));
+    Expect.isFalse(identical(false, (true == true)));
+    Expect.isFalse(identical(true, (true == false)));
+    Expect.isFalse(identical(false, (false == false)));
+    Expect.isFalse(identical(true, (false == true)));
+    Expect.isTrue(!identical(false, (true == true)));
+    Expect.isTrue(!identical(true, (true == false)));
+    Expect.isTrue(!identical(false, (false == false)));
+    Expect.isTrue(!identical(true, (false == true)));
+    // Expect.equals could rely on a broken boolean equality.
+    if (true == false) {
+      throw "Expect.equals broken";
+    }
+    if (false == true) {
+      throw "Expect.equals broken";
+    }
+    if (identical(true, false)) {
+      throw "Expect.equals broken";
+    }
+    if (identical(false, true)) {
+      throw "Expect.equals broken";
+    }
+    if (true == true) {} else {
+      throw "Expect.equals broken";
+    }
+    if (false == false) {} else {
+      throw "Expect.equals broken";
+    }
+    if (identical(true, true)) {} else {
+      throw "Expect.equals broken";
+    }
+    if (identical(false, false)) {} else {
+      throw "Expect.equals broken";
+    }
+    if (true != false) {} else {
+      throw "Expect.equals broken";
+    }
+    if (false != true) {} else {
+      throw "Expect.equals broken";
+    }
+    if (!identical(true, false)) {} else {
+      throw "Expect.equals broken";
+    }
+    if (!identical(false, true)) {} else {
+      throw "Expect.equals broken";
+    }
+    if (true != true) {
+      throw "Expect.equals broken";
+    }
+    if (false != false) {
+      throw "Expect.equals broken";
+    }
+    if (!identical(true, true)) {
+      throw "Expect.equals broken";
+    }
+    if (!identical(false, false)) {
+      throw "Expect.equals broken";
+    }
+  }
+
+  static void testToString() {
+    Expect.equals("true", true.toString());
+    Expect.equals("false", false.toString());
+  }
+
+  static void testNegate(isTrue, isFalse) {
+    Expect.equals(true, !false);
+    Expect.equals(false, !true);
+    Expect.equals(true, !isFalse);
+    Expect.equals(false, !isTrue);
+  }
+
+  static void testLogicalOp() {
+    testOr(a, b, onTypeError) {
+      try {
+        return a || b;
+      } on TypeError catch (t) {
+        return onTypeError;
+      }
+    }
+
+    testAnd(a, b, onTypeError) {
+      try {
+        return a && b;
+      } on TypeError catch (t) {
+        return onTypeError;
+      }
+    }
+
+    var isTrue = true;
+    var isFalse = false;
+    Expect.equals(true, testAnd(isTrue, isTrue, false));
+    Expect.equals(false, testAnd(isTrue, 0, false));
+    Expect.equals(false, testAnd(isTrue, 1, false));
+    Expect.equals(false, testAnd(isTrue, "true", false));
+    Expect.equals(false, testAnd(0, isTrue, false));
+    Expect.equals(false, testAnd(1, isTrue, false));
+
+    Expect.equals(true, testOr(isTrue, isTrue, false));
+    Expect.equals(true, testOr(isFalse, isTrue, false));
+    Expect.equals(true, testOr(isTrue, isFalse, false));
+    Expect.equals(true, testOr(isTrue, 0, true));
+    Expect.equals(true, testOr(isTrue, 1, true));
+    Expect.equals(false, testOr(isFalse, 0, false));
+    Expect.equals(false, testOr(isFalse, 1, false));
+    Expect.equals(true, testOr(0, isTrue, true));
+    Expect.equals(true, testOr(1, isTrue, true));
+    Expect.equals(false, testOr(0, isFalse, false));
+    Expect.equals(false, testOr(1, isFalse, false));
+
+    // Test side effects.
+    int trueCount = 0, falseCount = 0;
+
+    trueFunc() {
+      trueCount++;
+      return true;
+    }
+
+    falseFunc() {
+      falseCount++;
+      return false;
+    }
+
+    Expect.equals(0, trueCount);
+    Expect.equals(0, falseCount);
+
+    trueFunc() && trueFunc();
+    Expect.equals(2, trueCount);
+    Expect.equals(0, falseCount);
+
+    trueCount = falseCount = 0;
+    falseFunc() && trueFunc();
+    Expect.equals(0, trueCount);
+    Expect.equals(1, falseCount);
+
+    trueCount = falseCount = 0;
+    trueFunc() && falseFunc();
+    Expect.equals(1, trueCount);
+    Expect.equals(1, falseCount);
+
+    trueCount = falseCount = 0;
+    falseFunc() && falseFunc();
+    Expect.equals(0, trueCount);
+    Expect.equals(1, falseCount);
+
+    trueCount = falseCount = 0;
+    trueFunc() || trueFunc();
+    Expect.equals(1, trueCount);
+    Expect.equals(0, falseCount);
+
+    trueCount = falseCount = 0;
+    falseFunc() || trueFunc();
+    Expect.equals(1, trueCount);
+    Expect.equals(1, falseCount);
+
+    trueCount = falseCount = 0;
+    trueFunc() || falseFunc();
+    Expect.equals(1, trueCount);
+    Expect.equals(0, falseCount);
+
+    trueCount = falseCount = 0;
+    falseFunc() || falseFunc();
+    Expect.equals(0, trueCount);
+    Expect.equals(2, falseCount);
+  }
+
+  static void testMain() {
+    testEquality();
+    testNegate(true, false);
+    testToString();
+    testLogicalOp();
+  }
+}
+
+main() {
+  BoolTest.testMain();
+}
diff --git a/tests/language/bool/check_test.dart b/tests/language/bool/check_test.dart
new file mode 100644
index 0000000..b26eba7
--- /dev/null
+++ b/tests/language/bool/check_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+main() {
+  Expect.throwsTypeError(() {
+    if (null as dynamic) {}
+  });
+
+  Expect.throwsTypeError(() {
+    if ("true" as dynamic) {}
+  });
+}
diff --git a/tests/language/bool/condition_check_test.dart b/tests/language/bool/condition_check_test.dart
new file mode 100644
index 0000000..dd648c7
--- /dev/null
+++ b/tests/language/bool/condition_check_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// Check that passing `null` for a boolean typed parameter will still cause
+// a boolean conversion error when used in a condition.
+
+import 'package:expect/expect.dart';
+
+@pragma('dart2js:noInline')
+String check({bool? a, bool? b}) {
+  String aString = (a as dynamic) ? 'a' : '';
+  String bString = (b as dynamic) ? 'b' : '';
+  return '$aString$bString';
+}
+
+class Class {
+  final String field;
+  Class({bool? a: false, bool? b: true}) : this.field = check(a: a, b: b);
+}
+
+main() {
+  Expect.throwsTypeError(() => new Class(a: null, b: null).field);
+}
diff --git a/tests/language/call/argument_inference_test.dart b/tests/language/call/argument_inference_test.dart
new file mode 100644
index 0000000..0af5537
--- /dev/null
+++ b/tests/language/call/argument_inference_test.dart
@@ -0,0 +1,14 @@
+// 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 "package:expect/expect.dart";
+
+class A {
+  call(a) => a is num;
+}
+
+main() {
+  Expect.isTrue(new A().call(42));
+  Expect.isFalse(new A()('foo'));
+}
diff --git a/tests/language/call/call_test.dart b/tests/language/call/call_test.dart
new file mode 100644
index 0000000..882eeb4
--- /dev/null
+++ b/tests/language/call/call_test.dart
@@ -0,0 +1,43 @@
+// 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.
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
+
+import "package:expect/expect.dart";
+
+main() {
+  bar(a) {
+    return a is String;
+  }
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(bar(1));
+    Expect.isTrue(bar.call('foo'));
+  }
+
+  opt_arg([a = "a"]) => a is String;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(opt_arg(1));
+    Expect.isFalse(opt_arg.call(1));
+    Expect.isTrue(opt_arg());
+    Expect.isTrue(opt_arg.call());
+    Expect.isTrue(opt_arg("b"));
+    Expect.isTrue(opt_arg.call("b"));
+  }
+
+  named_arg({x: 11, y: 22}) => "$x$y";
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals("1122", named_arg());
+    Expect.equals("1122", named_arg.call());
+    Expect.equals("4455", named_arg(y: 55, x: 44));
+    Expect.equals("4455", named_arg.call(y: 55, x: 44));
+    Expect.equals("4455", named_arg(x: 44, y: 55));
+    Expect.equals("4455", named_arg.call(x: 44, y: 55));
+  }
+
+  Expect.throwsNoSuchMethodError(() => (bar as dynamic).call());
+  Expect.throwsNoSuchMethodError(() => (opt_arg as dynamic).call(x: "p"));
+  Expect.throwsNoSuchMethodError(() => (named_arg as dynamic).call("p", "q"));
+}
diff --git a/tests/language/call/closurization_test.dart b/tests/language/call/closurization_test.dart
new file mode 100644
index 0000000..683c229
--- /dev/null
+++ b/tests/language/call/closurization_test.dart
@@ -0,0 +1,54 @@
+// 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.
+// VMOptions=--optimization_counter_threshold=10 --no-background_compilation
+
+import "package:expect/expect.dart";
+
+main() {
+  bar(a) {
+    return a is String;
+  }
+
+  var bar_tearOff = bar.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(bar_tearOff(1));
+    Expect.isTrue(bar_tearOff.call('foo'));
+    Expect.isFalse(bar_tearOff.call(1));
+    Expect.isTrue(bar_tearOff('foo'));
+  }
+
+  opt_arg([a = "a"]) => a is String;
+  var opt_arg_tearOff = opt_arg.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(opt_arg_tearOff(1));
+    Expect.isFalse(opt_arg_tearOff.call(1));
+    Expect.isTrue(opt_arg_tearOff());
+    Expect.isTrue(opt_arg_tearOff.call());
+    Expect.isTrue(opt_arg_tearOff("b"));
+    Expect.isTrue(opt_arg_tearOff.call("b"));
+  }
+
+  named_arg({x: 11, y: 22}) => "$x$y";
+  var named_arg_tearOff = named_arg.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals("1122", named_arg_tearOff());
+    Expect.equals("1122", named_arg_tearOff.call());
+    Expect.equals("4455", named_arg_tearOff(y: 55, x: 44));
+    Expect.equals("4455", named_arg_tearOff.call(y: 55, x: 44));
+    Expect.equals("4455", named_arg_tearOff(x: 44, y: 55));
+    Expect.equals("4455", named_arg_tearOff.call(x: 44, y: 55));
+  }
+
+  // In order to test runtime behavior of calling with invalid arguments,
+  // we cast to dynamic to make the type system forget about the actual types.
+  dynamic bar_tearOff_d = bar_tearOff;
+  dynamic opt_arg_tearOff_d = opt_arg_tearOff;
+  dynamic named_arg_tearOff_d = named_arg_tearOff;
+  Expect.throws(() => bar_tearOff_d.call());
+  Expect.throwsNoSuchMethodError(() => opt_arg_tearOff_d.call(x: "p"));
+  Expect.throwsNoSuchMethodError(() => named_arg_tearOff_d.call("p", "q"));
+}
diff --git a/tests/language/call/constructor_on_unresolvable_class_runtime_test.dart b/tests/language/call/constructor_on_unresolvable_class_runtime_test.dart
new file mode 100644
index 0000000..0c30e8b
--- /dev/null
+++ b/tests/language/call/constructor_on_unresolvable_class_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.
+
+// Check that calling a constructor of a class that cannot be resolved causes
+// compile error.
+
+import "package:expect/expect.dart";
+import 'dart:math';
+
+main() {
+
+
+
+}
diff --git a/tests/language/call/constructor_on_unresolvable_class_test.dart b/tests/language/call/constructor_on_unresolvable_class_test.dart
new file mode 100644
index 0000000..d068b53
--- /dev/null
+++ b/tests/language/call/constructor_on_unresolvable_class_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 calling a constructor of a class that cannot be resolved causes
+// compile error.
+
+import "package:expect/expect.dart";
+import 'dart:math';
+
+main() {
+  new A();
+  //  ^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [cfe] Method not found: 'A'.
+  new A.foo();
+  //  ^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [cfe] Method not found: 'A.foo'.
+  new lib.A();
+  //  ^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_CLASS
+  // [cfe] Method not found: 'lib.A'.
+}
diff --git a/tests/language/call/function2_test.dart b/tests/language/call/function2_test.dart
new file mode 100644
index 0000000..31c98b1
--- /dev/null
+++ b/tests/language/call/function2_test.dart
@@ -0,0 +1,28 @@
+// 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";
+
+typedef Object Func(Object x);
+
+class Bar {
+  int x = 42;
+
+  Object call(Object x) {
+    return 'Bar $x';
+  }
+}
+
+Object baz(Object x) => x;
+
+var map = <String, Func>{'baz': baz, 'bar': new Bar()};
+
+Object test(String str, Object arg) {
+  return map[str]!.call(arg);
+}
+
+void main() {
+  Expect.equals(42, test('baz', 42));
+  Expect.equals('Bar 42', test('bar', 42));
+}
diff --git a/tests/language/call/function_apply_test.dart b/tests/language/call/function_apply_test.dart
new file mode 100644
index 0000000..935cfaf
--- /dev/null
+++ b/tests/language/call/function_apply_test.dart
@@ -0,0 +1,15 @@
+// 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";
+
+class A {
+  call({a: 42}) {
+    return 499 + a;
+  }
+}
+
+main() {
+  Expect.equals(497, Function.apply(new A(), [], {#a: -2}));
+}
diff --git a/tests/language/call/function_test.dart b/tests/language/call/function_test.dart
new file mode 100644
index 0000000..49d8b7c
--- /dev/null
+++ b/tests/language/call/function_test.dart
@@ -0,0 +1,49 @@
+// 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";
+
+Object bar(Object x) {
+  return x;
+}
+
+Function baz = bar;
+
+dynamic dyn = bar;
+
+class Foo {
+  Object call(Object x) {
+    return 'Foo$x';
+  }
+}
+
+typedef Object FooType(Object x);
+FooType foo = bar;
+
+void main() {
+  Expect.equals(42, bar.call(42));
+  Expect.equals(42, baz.call(42));
+  Expect.equals(42, foo.call(42));
+  Expect.equals(42, dyn.call(42));
+  Expect.equals(42, bar(42));
+  Expect.equals(42, baz(42));
+  Expect.equals(42, foo(42));
+  Expect.equals(42, dyn(42));
+
+  baz = new Foo();
+  foo = new Foo();
+  dyn = new Foo();
+  Expect.equals('Foo42', baz.call(42));
+  Expect.equals('Foo42', foo.call(42));
+  Expect.equals('Foo42', dyn.call(42));
+  Expect.equals('Foo42', baz(42));
+  Expect.equals('Foo42', foo(42));
+  Expect.equals('Foo42', dyn(42));
+
+  var s = (FooType).toString();
+  var minified = s != 'FooType'; // dart2js --minify has minified names.
+  dynamic d = null;
+  Expect.throws(() => d(),
+      (e) => e is NoSuchMethodError && (minified || '$e'.contains('call')));
+}
diff --git a/tests/language/call/method_as_cast_test.dart b/tests/language/call/method_as_cast_test.dart
new file mode 100644
index 0000000..f0718a3
--- /dev/null
+++ b/tests/language/call/method_as_cast_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class B {}
+
+class C {
+  B call(B b) => b;
+}
+
+class D implements Function {
+  B call(B b) => b;
+}
+
+typedef B BToB(B x);
+
+typedef Object NullToObject(Null x);
+
+main() {
+  // The presence of a `.call` method does not cause class `C` to become a
+  // subtype of any function type.
+  C c = new C();
+  Expect.throwsCastError(() => c as BToB); //# 01: ok
+  Expect.throwsCastError(() => c as NullToObject); //# 02: ok
+  Expect.throwsCastError(() => c as Function); //# 03: ok
+
+  // The same goes for class `D`: `implements Function` is ignored in Dart 2.
+  D d = new D();
+  Expect.throwsCastError(() => d as BToB); //# 04: ok
+  Expect.throwsCastError(() => d as NullToObject); //# 05: ok
+  Expect.throwsCastError(() => d as Function); //# 06: ok
+}
diff --git a/tests/language/call/method_function_typed_value_test.dart b/tests/language/call/method_function_typed_value_test.dart
new file mode 100644
index 0000000..7aa9ed8
--- /dev/null
+++ b/tests/language/call/method_function_typed_value_test.dart
@@ -0,0 +1,27 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+int f(int i) => 2 * i;
+
+typedef int IntToInt(int x);
+
+main() {
+  // It is possible to use `.call` on a function-typed value (even though it is
+  // redundant).  Similarly, it is possible to tear off `.call` on a
+  // function-typed value (but it is a no-op).
+  Expect.equals(f.call(1), 2); //# 01: ok
+  Expect.identical(f.call, f); //# 02: ok
+  IntToInt f2 = f;
+  Expect.equals(f2.call(1), 2); //# 03: ok
+  Expect.identical(f2.call, f); //# 04: ok
+  Function f3 = f;
+  Expect.equals(f3.call(1), 2); //# 05: ok
+  Expect.identical(f3.call, f); //# 06: ok
+  dynamic d = f;
+  Expect.equals(d.call(1), 2); //# 07: ok
+  Expect.identical(d.call, f); //# 08: ok
+}
diff --git a/tests/language/call/method_implicit_invoke_instance_test.dart b/tests/language/call/method_implicit_invoke_instance_test.dart
new file mode 100644
index 0000000..fdcb12b
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_instance_test.dart
@@ -0,0 +1,53 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+class D {
+  C1 c1 = new C1();
+  dynamic d1 = new C1();
+  C2 c2 = new C2();
+  dynamic d2 = new C2();
+
+  void test() {
+    // Implicitly invokes c1.call(1)
+    Expect.equals(c1(1), 2); //# 01: ok
+    // Implicitly invokes d1.call(1)
+    Expect.equals(d1(1), 2); //# 02: ok
+    // Implicitly invokes c2.call(1)
+    Expect.equals(c2(1), 2); //# 03: ok
+    // Implicitly invokes d2.call(1)
+    Expect.equals(d2(1), 2); //# 04: ok
+  }
+}
+
+main() {
+  new D().test();
+  // Implicitly invokes D.c1.call(1)
+  Expect.equals(new D().c1(1), 2); //# 05: ok
+  // Implicitly invokes D.d1.call(1)
+  Expect.equals(new D().d1(1), 2); //# 06: ok
+  // Implicitly invokes D.c2.call(1)
+  Expect.equals(new D().c2(1), 2); //# 07: ok
+  // Implicitly invokes D.d2.call(1)
+  Expect.equals(new D().d2(1), 2); //# 08: ok
+  D d = new D();
+  // Implicitly invokes d.c1.call(1)
+  Expect.equals(d.c1(1), 2); //# 09: ok
+  // Implicitly invokes d.d1.call(1)
+  Expect.equals(d.d1(1), 2); //# 10: ok
+  // Implicitly invokes d.c2.call(1)
+  Expect.equals(d.c2(1), 2); //# 11: ok
+  // Implicitly invokes d.d2.call(1)
+  Expect.equals(d.d2(1), 2); //# 12: ok
+}
diff --git a/tests/language/call/method_implicit_invoke_local_runtime_1_test.dart b/tests/language/call/method_implicit_invoke_local_runtime_1_test.dart
new file mode 100644
index 0000000..5df9be0
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_runtime_1_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+  Expect.equals(c1(1), 2);
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+
+  // Cannot invoke with the wrong signature.
+
+
+}
diff --git a/tests/language/call/method_implicit_invoke_local_runtime_2_test.dart b/tests/language/call/method_implicit_invoke_local_runtime_2_test.dart
new file mode 100644
index 0000000..b4b00f4
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_runtime_2_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+  Expect.equals(d1(1), 2);
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+
+  // Cannot invoke with the wrong signature.
+
+
+}
diff --git a/tests/language/call/method_implicit_invoke_local_runtime_3_test.dart b/tests/language/call/method_implicit_invoke_local_runtime_3_test.dart
new file mode 100644
index 0000000..215d998
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_runtime_3_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+  Expect.equals(c2(1), 2);
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+
+  // Cannot invoke with the wrong signature.
+
+
+}
diff --git a/tests/language/call/method_implicit_invoke_local_runtime_4_test.dart b/tests/language/call/method_implicit_invoke_local_runtime_4_test.dart
new file mode 100644
index 0000000..01a364c
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_runtime_4_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+  Expect.equals(d2(1), 2);
+  // Cannot invoke with the wrong signature.
+
+
+}
diff --git a/tests/language/call/method_implicit_invoke_local_runtime_test.dart b/tests/language/call/method_implicit_invoke_local_runtime_test.dart
new file mode 100644
index 0000000..f06206f
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_runtime_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+
+  // Cannot invoke with the wrong signature.
+
+
+}
diff --git a/tests/language/call/method_implicit_invoke_local_test.dart b/tests/language/call/method_implicit_invoke_local_test.dart
new file mode 100644
index 0000000..1e58c47
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_local_test.dart
@@ -0,0 +1,38 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+main() {
+  C1 c1 = new C1();
+  // Implicitly invokes c1.call(1)
+  Expect.equals(c1(1), 2);
+  dynamic d1 = c1;
+  // Implicitly invokes d1.call(1)
+  Expect.equals(d1(1), 2);
+  C2 c2 = new C2();
+  // Implicitly invokes c2.call(1)
+  Expect.equals(c2(1), 2);
+  dynamic d2 = c2;
+  // Implicitly invokes d2.call(1)
+  Expect.equals(d2(1), 2);
+  // Cannot invoke with the wrong signature.
+  c2();
+  //^^
+  // [analyzer] COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS
+  // [cfe] Too few positional arguments: 1 required, 0 given.
+  c2(3, 4);
+  //^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
+  // [cfe] Too many positional arguments: 1 allowed, but 2 found.
+}
diff --git a/tests/language/call/method_implicit_invoke_static_test.dart b/tests/language/call/method_implicit_invoke_static_test.dart
new file mode 100644
index 0000000..17f868d
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_static_test.dart
@@ -0,0 +1,56 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+class D {
+  static C1 c1 = new C1();
+  static dynamic d1 = new C1();
+  static C2 c2 = new C2();
+  static dynamic d2 = new C2();
+
+  void test1() {
+    // Implicitly invokes c1.call(1)
+    Expect.equals(c1(1), 2); //# 01: ok
+    // Implicitly invokes d1.call(1)
+    Expect.equals(d1(1), 2); //# 02: ok
+    // Implicitly invokes c2.call(1)
+    Expect.equals(c2(1), 2); //# 03: ok
+    // Implicitly invokes d2.call(1)
+    Expect.equals(d2(1), 2); //# 04: ok
+  }
+
+  static void test2() {
+    // Implicitly invokes c1.call(1)
+    Expect.equals(c1(1), 2); //# 05: ok
+    // Implicitly invokes d1.call(1)
+    Expect.equals(d1(1), 2); //# 06: ok
+    // Implicitly invokes c2.call(1)
+    Expect.equals(c2(1), 2); //# 07: ok
+    // Implicitly invokes d2.call(1)
+    Expect.equals(d2(1), 2); //# 08: ok
+  }
+}
+
+main() {
+  new D().test1();
+  D.test2();
+  // Implicitly invokes D.c1.call(1)
+  Expect.equals(D.c1(1), 2); //# 09: ok
+  // Implicitly invokes D.d1.call(1)
+  Expect.equals(D.d1(1), 2); //# 10: ok
+  // Implicitly invokes D.c2.call(1)
+  Expect.equals(D.c2(1), 2); //# 11: ok
+  // Implicitly invokes D.d2.call(1)
+  Expect.equals(D.d2(1), 2); //# 12: ok
+}
diff --git a/tests/language/call/method_implicit_invoke_top_level_test.dart b/tests/language/call/method_implicit_invoke_top_level_test.dart
new file mode 100644
index 0000000..eaed546
--- /dev/null
+++ b/tests/language/call/method_implicit_invoke_top_level_test.dart
@@ -0,0 +1,30 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C1 {
+  int call(int i) => 2 * i;
+}
+
+class C2 implements Function {
+  int call(int i) => 2 * i;
+}
+
+C1 c1 = new C1();
+dynamic d1 = new C1();
+C2 c2 = new C2();
+dynamic d2 = new C2();
+
+main() {
+  // Implicitly invokes c1.call(1)
+  Expect.equals(c1(1), 2); //# 01: ok
+  // Implicitly invokes d1.call(1)
+  Expect.equals(d1(1), 2); //# 02: ok
+  // Implicitly invokes c2.call(1)
+  Expect.equals(c2(1), 2); //# 03: ok
+  // Implicitly invokes d2.call(1)
+  Expect.equals(d2(1), 2); //# 04: ok
+}
diff --git a/tests/language/call/method_implicit_tear_off_assignable_test.dart b/tests/language/call/method_implicit_tear_off_assignable_test.dart
new file mode 100644
index 0000000..791b083
--- /dev/null
+++ b/tests/language/call/method_implicit_tear_off_assignable_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+abstract class I {
+  void call();
+}
+
+class C implements I {
+  void call([int x = 0]) {}
+}
+
+main() {
+  I i = new C();
+  // The tear off is attempting to tear off a call method whose type is a
+  // supertype of the target type. Since we no longer allow implicit downcasts,
+  // this is a static error.
+  void Function([int]) f = i;
+  //                       ^
+  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [cfe] unspecified
+}
diff --git a/tests/language/call/method_implicit_tear_off_nullable_test.dart b/tests/language/call/method_implicit_tear_off_nullable_test.dart
new file mode 100644
index 0000000..da2fbce
--- /dev/null
+++ b/tests/language/call/method_implicit_tear_off_nullable_test.dart
@@ -0,0 +1,24 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+class B {}
+
+class C {
+  B call(B b) => b;
+}
+
+typedef B BToB(B x);
+
+C? c = null;
+
+void check(BToB f) {}
+
+main() {
+  // Nullable types cannot have their `.call` method implicitly torn off.
+  check(c);
+  //    ^
+  // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [cfe] unspecified
+}
diff --git a/tests/language/call/method_implicit_tear_off_test.dart b/tests/language/call/method_implicit_tear_off_test.dart
new file mode 100644
index 0000000..24446cb
--- /dev/null
+++ b/tests/language/call/method_implicit_tear_off_test.dart
@@ -0,0 +1,115 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "dart:async";
+import "package:expect/expect.dart";
+
+class B {}
+
+class C {
+  B? call(B? b) => b;
+}
+
+typedef B? BToB(B? x);
+
+typedef Object? NullToObject(Null x);
+
+C c = new C();
+
+void check1(BToB f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  B b = new B();
+  Expect.identical(f(b), b);
+}
+
+void check2(FutureOr<BToB> f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  BToB f2 = f as BToB;
+  Expect.identical(f, f2);
+  B b = new B();
+  Expect.identical(f2(b), b);
+}
+
+void check3(NullToObject f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  Expect.isNull(f(null));
+}
+
+void check4(FutureOr<NullToObject> f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  NullToObject f2 = f as NullToObject;
+  Expect.identical(f, f2);
+  Expect.isNull(f2(null));
+}
+
+void check5(Function f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  B b = new B();
+  Expect.identical(f(b), b);
+}
+
+void check6(FutureOr<Function> f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  Function f2 = f as Function;
+  Expect.identical(f, f2);
+  B b = new B();
+  Expect.identical(f2(b), b);
+}
+
+void check7(C x) {
+  Expect.identical(c, x);
+}
+
+void check8(FutureOr<C> x) {
+  Expect.identical(c, x);
+}
+
+void check9(Object o) {
+  Expect.identical(c, o);
+}
+
+void check10(FutureOr<Object> o) {
+  Expect.identical(c, o);
+}
+
+void check11(dynamic d) {
+  Expect.identical(c, d);
+}
+
+void check12(FutureOr<dynamic> d) {
+  Expect.identical(c, d);
+}
+
+void checkNullableFunction(BToB? f) {
+  Expect.isFalse(identical(c, f));
+  Expect.equals(c.call, f);
+  B b = new B();
+  Expect.identical(f!(b), b);
+}
+
+main() {
+  // Implicitly tears off c.call
+  check1(c); //# 01: ok
+  check2(c); //# 02: ok
+  check3(c); //# 03: ok
+  check4(c); //# 04: ok
+  check5(c); //# 05: ok
+  check6(c); //# 06: ok
+  // Does not tear off c.call
+  check7(c); //# 07: ok
+  check8(c); //# 08: ok
+  check9(c); //# 09: ok
+  check10(c); //# 10: ok
+  check11(c); //# 11: ok
+  check12(c); //# 12: ok
+  // Implicitly tears off c.call even when the context type is nullable.
+  checkNullableFunction(c); //# 13: ok
+}
diff --git a/tests/language/call/method_is_check_test.dart b/tests/language/call/method_is_check_test.dart
new file mode 100644
index 0000000..9c705a3
--- /dev/null
+++ b/tests/language/call/method_is_check_test.dart
@@ -0,0 +1,35 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class B {}
+
+class C {
+  B call(B b) => b;
+}
+
+class D implements Function {
+  B call(B b) => b;
+}
+
+typedef B BToB(B x);
+
+typedef Object NullToObject(Null x);
+
+main() {
+  // The presence of a `.call` method does not cause class `C` to become a
+  // subtype of any function type.
+  C c = new C();
+  Expect.isFalse(c is BToB); //# 01: ok
+  Expect.isFalse(c is NullToObject); //# 02: ok
+  Expect.isFalse(c is Function); //# 03: ok
+
+  // The same goes for class `D`: `implements Function` is ignored in Dart 2.
+  D d = new D();
+  Expect.isFalse(d is BToB); //# 04: ok
+  Expect.isFalse(d is NullToObject); //# 05: ok
+  Expect.isFalse(d is Function); //# 06: ok
+}
diff --git a/tests/language/call/method_must_not_be_field_test.dart b/tests/language/call/method_must_not_be_field_test.dart
new file mode 100644
index 0000000..05cbce9
--- /dev/null
+++ b/tests/language/call/method_must_not_be_field_test.dart
@@ -0,0 +1,29 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C {
+  void Function() call = () {};
+}
+
+main() {
+  C c = new C();
+  dynamic d = c;
+
+  // The presence of a field named `call` does not permit the class `C` to be
+  // implicitly called.
+  c(); //# 01: compile-time error
+  // Nor does it permit an implicit tear-off of `call`.
+  void Function() f = c; //# 02: compile-time error
+  // Nor does it permit a dynamic invocation of `call`.
+  Expect.throws(() => d()); //# 03: ok
+
+  // However, all these things are possible if `call` is mentioned explicitly.
+  c.call(); //# 04: ok
+  void Function() f = c.call; //# 05: ok
+  d.call(); //# 06: ok
+  (d.call)(); //# 07: ok
+}
diff --git a/tests/language/call/method_must_not_be_getter_test.dart b/tests/language/call/method_must_not_be_getter_test.dart
new file mode 100644
index 0000000..ac070dd
--- /dev/null
+++ b/tests/language/call/method_must_not_be_getter_test.dart
@@ -0,0 +1,41 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+import "package:expect/expect.dart";
+
+class C {
+  void Function() get call => () {};
+}
+
+class D {
+  get call => this;
+}
+
+// Recurs outside the try-block to avoid disabling inlining.
+callD() {
+  dynamic d = new D();
+  d();
+}
+
+main() {
+  C c = new C();
+  dynamic d = c;
+
+  // The presence of a getter named `call` does not permit the class `C` to be
+  // implicitly called.
+  c(); //# 01: compile-time error
+  // Nor does it permit an implicit tear-off of `call`.
+  void Function() f = c; //# 02: compile-time error
+  // Nor does it permit a dynamic invocation of `call`.
+  Expect.throws(() => d()); //# 03: ok
+  // Same as previous line, but with a getter that can stack overflow if
+  // incorrect behavior is present. Merged from issue21159_test.
+  Expect.throwsNoSuchMethodError(() => callD()); //# 03: ok
+
+  // However, all these things are possible if `call` is mentioned explicitly.
+  c.call(); //# 04: ok
+  void Function() f = c.call; //# 05: ok
+  d.call(); //# 06: ok
+}
diff --git a/tests/language/call/method_override_runtime_test.dart b/tests/language/call/method_override_runtime_test.dart
new file mode 100644
index 0000000..d69e720
--- /dev/null
+++ b/tests/language/call/method_override_runtime_test.dart
@@ -0,0 +1,32 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+class B {}
+
+class C {
+  B call(B b) => b;
+}
+
+typedef B BToB(B x);
+
+class D {
+  BToB f() => ((B x) => x);
+  void g(C x) {}
+}
+
+class E extends D {
+  // This override is illegal because C is not a subtype of BToB.
+
+
+  // This override is illegal because BToB is not a supertype of C.
+
+}
+
+main() {
+  new E();
+}
diff --git a/tests/language/call/method_override_test.dart b/tests/language/call/method_override_test.dart
new file mode 100644
index 0000000..eaba802
--- /dev/null
+++ b/tests/language/call/method_override_test.dart
@@ -0,0 +1,36 @@
+// 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.
+// Dart test program to test arithmetic operations.
+
+class B {}
+
+class C {
+  B call(B b) => b;
+}
+
+typedef B BToB(B x);
+
+class D {
+  BToB f() => ((B x) => x);
+  void g(C x) {}
+}
+
+class E extends D {
+  // This override is illegal because C is not a subtype of BToB.
+  C f() => C();
+  //^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
+  // [cfe] The return type of the method 'E.f' is 'C', which does not match the return type, 'B Function(B)', of the overridden method, 'D.f'.
+
+  // This override is illegal because BToB is not a supertype of C.
+  void g(BToB x) {}
+  //   ^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
+  //          ^
+  // [cfe] The parameter 'x' of the method 'E.g' has type 'B Function(B)', which does not match the corresponding type, 'C', in the overridden method, 'D.g'.
+}
+
+main() {
+  new E();
+}
diff --git a/tests/language/call/non_method_field_runtime_test.dart b/tests/language/call/non_method_field_runtime_test.dart
new file mode 100644
index 0000000..0510151
--- /dev/null
+++ b/tests/language/call/non_method_field_runtime_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// Tests calling an object's field which is not a method.
+
+class Fisk {
+  int i = 0;
+}
+
+class Hest extends Fisk {}
+
+main() {
+  Fisk x1 = new Fisk();
+
+
+  Hest x2 = new Hest();
+
+}
diff --git a/tests/language/call/non_method_field_test.dart b/tests/language/call/non_method_field_test.dart
new file mode 100644
index 0000000..83a022d
--- /dev/null
+++ b/tests/language/call/non_method_field_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.
+
+// Tests calling an object's field which is not a method.
+
+class Fisk {
+  int i = 0;
+}
+
+class Hest extends Fisk {}
+
+main() {
+  Fisk x1 = new Fisk();
+  x1.i();
+//^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+//   ^
+// [cfe] 'i' isn't a function or method and can't be invoked.
+
+  Hest x2 = new Hest();
+  x2.i();
+//^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+//   ^
+// [cfe] 'i' isn't a function or method and can't be invoked.
+}
diff --git a/tests/language/call/nonexistent_constructor_runtime_test.dart b/tests/language/call/nonexistent_constructor_runtime_test.dart
new file mode 100644
index 0000000..92e4b19
--- /dev/null
+++ b/tests/language/call/nonexistent_constructor_runtime_test.dart
@@ -0,0 +1,25 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// When attempting to call a nonexistent constructor, check that a
+// compile error is reported.
+
+foo() {
+  throw 'hest';
+}
+
+class A {
+  A.foo(var x) {}
+}
+
+main() {
+  new A.foo(42);
+
+
+}
diff --git a/tests/language/call/nonexistent_constructor_test.dart b/tests/language/call/nonexistent_constructor_test.dart
new file mode 100644
index 0000000..4649f37
--- /dev/null
+++ b/tests/language/call/nonexistent_constructor_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.
+
+import "package:expect/expect.dart";
+
+// When attempting to call a nonexistent constructor, check that a
+// compile error is reported.
+
+foo() {
+  throw 'hest';
+}
+
+class A {
+  A.foo(var x) {}
+}
+
+main() {
+  new A.foo(42);
+  new A.bar(foo());
+  //    ^^^
+  // [analyzer] STATIC_WARNING.NEW_WITH_UNDEFINED_CONSTRUCTOR
+  // [cfe] Method not found: 'A.bar'.
+  new A();
+  //  ^
+  // [analyzer] STATIC_WARNING.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
+  // [cfe] Method not found: 'A'.
+}
diff --git a/tests/language/call/nonexistent_static_test.dart b/tests/language/call/nonexistent_static_test.dart
new file mode 100644
index 0000000..603bdde
--- /dev/null
+++ b/tests/language/call/nonexistent_static_test.dart
@@ -0,0 +1,32 @@
+// 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";
+
+// When attempting to call a nonexistent static method, getter or setter, check
+// that a compile error is reported.
+
+class C {}
+
+class D {
+  get hest => 1; //# 04: continued
+  set hest(val) {} //# 05: continued
+}
+
+get fisk => 2; //# 09: continued
+set fisk(val) {} //# 10: continued
+
+main() {
+  C.hest = 1; //# 01: compile-time error
+  C.hest; //# 02: compile-time error
+  C.hest(); //# 03: compile-time error
+
+  D.hest = 1; //# 04: compile-time error
+  D.hest; //# 05: compile-time error
+  fisk = 1; //# 06: compile-time error
+  fisk; //# 07: compile-time error
+  fisk(); //# 08: compile-time error
+  fisk = 1; //# 09: compile-time error
+  fisk; //# 10: compile-time error
+}
diff --git a/tests/language/call/object_has_no_call_method_test.dart b/tests/language/call/object_has_no_call_method_test.dart
new file mode 100644
index 0000000..dcb2a5c
--- /dev/null
+++ b/tests/language/call/object_has_no_call_method_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+void test(dynamic d, Object o, Function f) {
+  d();
+  o();
+//^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// ^
+// [cfe] The method 'call' isn't defined for the class 'Object'.
+  f();
+  d.call;
+  o.call;
+  //^^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [cfe] The getter 'call' isn't defined for the class 'Object'.
+  f.call;
+  d.call();
+  o.call();
+  //^^^^
+  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [cfe] The method 'call' isn't defined for the class 'Object'.
+  f.call();
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_1_test.dart b/tests/language/call/object_has_no_call_runtime_1_test.dart
new file mode 100644
index 0000000..3bb0108
--- /dev/null
+++ b/tests/language/call/object_has_no_call_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) 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.
+
+void test(dynamic d, Object o, Function f) {
+  d();
+
+
+
+
+
+
+
+
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_2_test.dart b/tests/language/call/object_has_no_call_runtime_2_test.dart
new file mode 100644
index 0000000..8c209c5
--- /dev/null
+++ b/tests/language/call/object_has_no_call_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) 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+  f();
+
+
+
+
+
+
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_3_test.dart b/tests/language/call/object_has_no_call_runtime_3_test.dart
new file mode 100644
index 0000000..6507f06
--- /dev/null
+++ b/tests/language/call/object_has_no_call_runtime_3_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+
+  d.call;
+
+
+
+
+
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_4_test.dart b/tests/language/call/object_has_no_call_runtime_4_test.dart
new file mode 100644
index 0000000..a64f242
--- /dev/null
+++ b/tests/language/call/object_has_no_call_runtime_4_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+
+
+
+  f.call;
+
+
+
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_5_test.dart b/tests/language/call/object_has_no_call_runtime_5_test.dart
new file mode 100644
index 0000000..ef58c84
--- /dev/null
+++ b/tests/language/call/object_has_no_call_runtime_5_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+
+
+
+
+  d.call();
+
+
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_6_test.dart b/tests/language/call/object_has_no_call_runtime_6_test.dart
new file mode 100644
index 0000000..2dcd453
--- /dev/null
+++ b/tests/language/call/object_has_no_call_runtime_6_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+
+
+
+
+
+
+  f.call();
+}
+
+main() {}
diff --git a/tests/language/call/object_has_no_call_runtime_test.dart b/tests/language/call/object_has_no_call_runtime_test.dart
new file mode 100644
index 0000000..c0ec957
--- /dev/null
+++ b/tests/language/call/object_has_no_call_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) 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.
+
+void test(dynamic d, Object o, Function f) {
+
+
+
+
+
+
+
+
+
+}
+
+main() {}
diff --git a/tests/language/call/operator_test.dart b/tests/language/call/operator_test.dart
new file mode 100644
index 0000000..8513bcb
--- /dev/null
+++ b/tests/language/call/operator_test.dart
@@ -0,0 +1,80 @@
+// 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";
+
+// simple test with no types in signature
+class A1 {
+  call() => 42;
+}
+
+// same test, include return type
+class A2 {
+  int call() => 35;
+}
+
+class B {
+  call() => 28;
+}
+
+// A call() operator can have any arity
+class C {
+  call(arg) => 7 * arg;
+}
+
+// Test named arguments
+class D {
+  call([arg = 6]) => 7 * arg;
+}
+
+// Non-trivial method body combination of positional and named.
+class E {
+  String call(String str, {int count: 1}) {
+    StringBuffer buffer = new StringBuffer();
+    for (var i = 0; i < count; i++) {
+      buffer.write(str);
+      if (i < count - 1) {
+        buffer.write(":");
+      }
+    }
+    return buffer.toString();
+  }
+}
+
+main() {
+  var a1 = new A1();
+  Expect.equals(42, a1());
+  Expect.equals(42, a1.call());
+
+  var a2 = new A2();
+  Expect.equals(35, a2());
+  Expect.equals(35, a2.call());
+
+  var b = new B();
+  Expect.equals(28, b());
+  Expect.equals(28, b.call());
+
+  var c = new C();
+  Expect.equals(42, c(6));
+  Expect.equals(42, c.call(6));
+
+  var d = new D();
+  Expect.equals(42, d());
+  Expect.equals(7, d(1));
+  Expect.equals(14, d(2));
+  Expect.equals(42, d.call());
+  Expect.equals(7, d.call(1));
+  Expect.equals(14, d.call(2));
+
+  var e = new E();
+  Expect.equals("foo", e("foo"));
+  Expect.equals("foo:foo", e("foo", count: 2));
+  Expect.equals("foo:foo:foo", e("foo", count: 3));
+  Expect.equals("foo", e.call("foo"));
+  Expect.equals("foo:foo", e.call("foo", count: 2));
+  Expect.equals("foo:foo:foo", e.call("foo", count: 3));
+
+  Expect.isFalse(a1 is Function); //# 01: ok
+  Expect.isFalse(e is Function); //# 02: ok
+}
diff --git a/tests/language/call/property_test.dart b/tests/language/call/property_test.dart
new file mode 100644
index 0000000..87407c3
--- /dev/null
+++ b/tests/language/call/property_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.
+
+// Test that a class with a [call] property does not implement [Function] or
+// a typedef of function type.
+
+import 'package:expect/expect.dart';
+
+class Call {
+  int get call => 0;
+}
+
+typedef void F();
+
+main() {
+  Expect.isFalse(new Call() is Function);
+  Expect.isFalse(new Call() is F);
+}
diff --git a/tests/language/call/through_getter_runtime_test.dart b/tests/language/call/through_getter_runtime_test.dart
new file mode 100644
index 0000000..4737aa6
--- /dev/null
+++ b/tests/language/call/through_getter_runtime_test.dart
@@ -0,0 +1,179 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Tests that we can call functions through getters.
+
+const TOP_LEVEL_CONST = 1;
+const TOP_LEVEL_CONST_REF = TOP_LEVEL_CONST;
+const TOP_LEVEL_NULL = null;
+
+var topLevel;
+
+class CallThroughGetterTest {
+  static void testMain() {
+    testTopLevel();
+    testField();
+    testGetter();
+    testMethod();
+    testEvaluationOrder();
+  }
+
+  static void testTopLevel() {
+    topLevel = () {
+      return 2;
+    };
+    Expect.equals(1, TOP_LEVEL_CONST);
+    Expect.equals(1, TOP_LEVEL_CONST_REF);
+    Expect.equals(2, topLevel());
+
+
+
+  }
+
+  static void testField() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(42, a.field());
+    Expect.equals(42, (a.field)());
+
+    a.field = () => 87;
+    Expect.equals(87, a.field());
+    Expect.equals(87, (a.field)());
+
+    a.field = 99;
+    Expect.throwsNoSuchMethodError(() => a.field());
+    Expect.throwsNoSuchMethodError(() => (a.field)());
+  }
+
+  static void testGetter() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(42, a.getter());
+    Expect.equals(42, (a.getter)());
+
+    a.field = () => 87;
+    Expect.equals(87, a.getter());
+    Expect.equals(87, (a.getter)());
+
+    a.field = 99;
+    Expect.throwsNoSuchMethodError(() => a.getter());
+    Expect.throwsNoSuchMethodError(() => (a.getter)());
+  }
+
+  static void testMethod() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(true, a.method() is Function);
+    Expect.equals(42, a.method()());
+
+    a.field = () => 87;
+    Expect.equals(true, a.method() is Function);
+    Expect.equals(87, a.method()());
+
+    a.field = null;
+    Expect.equals(null, a.method());
+  }
+
+  static void testEvaluationOrder() {
+    B b = new B();
+    Expect.equals("gf", b.g0());
+    b = new B();
+    Expect.equals("gf", (b.g0)());
+
+    b = new B();
+    Expect.equals("xgf", b.g1(b.x));
+    b = new B();
+    Expect.equals("gxf", (b.g1)(b.x));
+
+    b = new B();
+    Expect.equals("xygf", b.g2(b.x, b.y));
+    b = new B();
+    Expect.equals("gxyf", (b.g2)(b.x, b.y));
+
+    b = new B();
+    Expect.equals("xyzgf", b.g3(b.x, b.y, b.z));
+    b = new B();
+    Expect.equals("gxyzf", (b.g3)(b.x, b.y, b.z));
+
+    b = new B();
+    Expect.equals("yzxgf", b.g3(b.y, b.z, b.x));
+    b = new B();
+    Expect.equals("gyzxf", (b.g3)(b.y, b.z, b.x));
+  }
+}
+
+class A {
+  A() {}
+  var field;
+  get getter {
+    return field;
+  }
+
+  method() {
+    return field;
+  }
+}
+
+class B {
+  B() : _order = new StringBuffer("") {}
+
+  get g0 {
+    _mark('g');
+    return () {
+      return _mark('f');
+    };
+  }
+
+  get g1 {
+    _mark('g');
+    return (x) {
+      return _mark('f');
+    };
+  }
+
+  get g2 {
+    _mark('g');
+    return (x, y) {
+      return _mark('f');
+    };
+  }
+
+  get g3 {
+    _mark('g');
+    return (x, y, z) {
+      return _mark('f');
+    };
+  }
+
+  get x {
+    _mark('x');
+    return 0;
+  }
+
+  get y {
+    _mark('y');
+    return 1;
+  }
+
+  get z {
+    _mark('z');
+    return 2;
+  }
+
+  _mark(m) {
+    _order.write(m);
+    return _order.toString();
+  }
+
+  StringBuffer _order;
+}
+
+main() {
+  CallThroughGetterTest.testMain();
+}
diff --git a/tests/language/call/through_getter_test.dart b/tests/language/call/through_getter_test.dart
new file mode 100644
index 0000000..2169e8c6
--- /dev/null
+++ b/tests/language/call/through_getter_test.dart
@@ -0,0 +1,184 @@
+// 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";
+
+// Tests that we can call functions through getters.
+
+const TOP_LEVEL_CONST = 1;
+const TOP_LEVEL_CONST_REF = TOP_LEVEL_CONST;
+const TOP_LEVEL_NULL = null;
+
+var topLevel;
+
+class CallThroughGetterTest {
+  static void testMain() {
+    testTopLevel();
+    testField();
+    testGetter();
+    testMethod();
+    testEvaluationOrder();
+  }
+
+  static void testTopLevel() {
+    topLevel = () {
+      return 2;
+    };
+    Expect.equals(1, TOP_LEVEL_CONST);
+    Expect.equals(1, TOP_LEVEL_CONST_REF);
+    Expect.equals(2, topLevel());
+
+    TOP_LEVEL_CONST();
+//  ^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+//                 ^
+// [cfe] The method 'call' isn't defined for the class 'int'.
+    (TOP_LEVEL_CONST)();
+//  ^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+//                   ^
+// [cfe] The method 'call' isn't defined for the class 'int'.
+  }
+
+  static void testField() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(42, a.field());
+    Expect.equals(42, (a.field)());
+
+    a.field = () => 87;
+    Expect.equals(87, a.field());
+    Expect.equals(87, (a.field)());
+
+    a.field = 99;
+    Expect.throwsNoSuchMethodError(() => a.field());
+    Expect.throwsNoSuchMethodError(() => (a.field)());
+  }
+
+  static void testGetter() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(42, a.getter());
+    Expect.equals(42, (a.getter)());
+
+    a.field = () => 87;
+    Expect.equals(87, a.getter());
+    Expect.equals(87, (a.getter)());
+
+    a.field = 99;
+    Expect.throwsNoSuchMethodError(() => a.getter());
+    Expect.throwsNoSuchMethodError(() => (a.getter)());
+  }
+
+  static void testMethod() {
+    A a = new A();
+    a.field = () => 42;
+    Expect.equals(true, a.method() is Function);
+    Expect.equals(42, a.method()());
+
+    a.field = () => 87;
+    Expect.equals(true, a.method() is Function);
+    Expect.equals(87, a.method()());
+
+    a.field = null;
+    Expect.equals(null, a.method());
+  }
+
+  static void testEvaluationOrder() {
+    B b = new B();
+    Expect.equals("gf", b.g0());
+    b = new B();
+    Expect.equals("gf", (b.g0)());
+
+    b = new B();
+    Expect.equals("xgf", b.g1(b.x));
+    b = new B();
+    Expect.equals("gxf", (b.g1)(b.x));
+
+    b = new B();
+    Expect.equals("xygf", b.g2(b.x, b.y));
+    b = new B();
+    Expect.equals("gxyf", (b.g2)(b.x, b.y));
+
+    b = new B();
+    Expect.equals("xyzgf", b.g3(b.x, b.y, b.z));
+    b = new B();
+    Expect.equals("gxyzf", (b.g3)(b.x, b.y, b.z));
+
+    b = new B();
+    Expect.equals("yzxgf", b.g3(b.y, b.z, b.x));
+    b = new B();
+    Expect.equals("gyzxf", (b.g3)(b.y, b.z, b.x));
+  }
+}
+
+class A {
+  A() {}
+  var field;
+  get getter {
+    return field;
+  }
+
+  method() {
+    return field;
+  }
+}
+
+class B {
+  B() : _order = new StringBuffer("") {}
+
+  get g0 {
+    _mark('g');
+    return () {
+      return _mark('f');
+    };
+  }
+
+  get g1 {
+    _mark('g');
+    return (x) {
+      return _mark('f');
+    };
+  }
+
+  get g2 {
+    _mark('g');
+    return (x, y) {
+      return _mark('f');
+    };
+  }
+
+  get g3 {
+    _mark('g');
+    return (x, y, z) {
+      return _mark('f');
+    };
+  }
+
+  get x {
+    _mark('x');
+    return 0;
+  }
+
+  get y {
+    _mark('y');
+    return 1;
+  }
+
+  get z {
+    _mark('z');
+    return 2;
+  }
+
+  _mark(m) {
+    _order.write(m);
+    return _order.toString();
+  }
+
+  StringBuffer _order;
+}
+
+main() {
+  CallThroughGetterTest.testMain();
+}
diff --git a/tests/language/call/through_null_getter_test.dart b/tests/language/call/through_null_getter_test.dart
new file mode 100644
index 0000000..3076029
--- /dev/null
+++ b/tests/language/call/through_null_getter_test.dart
@@ -0,0 +1,67 @@
+// 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";
+
+// Tests that we can call functions through getters which return null.
+
+const dynamic TOP_LEVEL_NULL = null;
+
+var topLevel;
+
+class CallThroughNullGetterTest {
+  static void testMain() {
+    testTopLevel();
+    testField();
+    testGetter();
+    testMethod();
+  }
+
+  static void testTopLevel() {
+    topLevel = null;
+    Expect.throwsNoSuchMethodError(() => topLevel());
+    Expect.throwsNoSuchMethodError(() => (topLevel)());
+    Expect.throwsNoSuchMethodError(() => TOP_LEVEL_NULL());
+    Expect.throwsNoSuchMethodError(() => (TOP_LEVEL_NULL)());
+  }
+
+  static void testField() {
+    A a = new A();
+
+    a.field = null;
+    Expect.throwsNoSuchMethodError(() => a.field());
+    Expect.throwsNoSuchMethodError(() => (a.field)());
+  }
+
+  static void testGetter() {
+    A a = new A();
+
+    a.field = null;
+    Expect.throwsNoSuchMethodError(() => a.getter());
+    Expect.throwsNoSuchMethodError(() => (a.getter)());
+  }
+
+  static void testMethod() {
+    A a = new A();
+
+    a.field = null;
+    Expect.throwsNoSuchMethodError(() => a.method()());
+  }
+}
+
+class A {
+  A() {}
+  var field;
+  get getter {
+    return field;
+  }
+
+  method() {
+    return field;
+  }
+}
+
+main() {
+  CallThroughNullGetterTest.testMain();
+}
diff --git a/tests/language/call/type_literal_test.dart b/tests/language/call/type_literal_test.dart
new file mode 100644
index 0000000..9e09bbe
--- /dev/null
+++ b/tests/language/call/type_literal_test.dart
@@ -0,0 +1,11 @@
+// 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.
+
+class C {
+  void a() {}
+}
+
+void main() {
+  C().a();
+}
diff --git a/tests/language/call/with_no_such_method_test.dart b/tests/language/call/with_no_such_method_test.dart
new file mode 100644
index 0000000..95c27d5
--- /dev/null
+++ b/tests/language/call/with_no_such_method_test.dart
@@ -0,0 +1,30 @@
+// 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 "package:expect/expect.dart";
+
+class F {
+  final int value;
+  F(this.value);
+  call() => value;
+  noSuchMethod(Invocation i) {
+    if (i.memberName == #call && i.isMethod) {
+      return i.positionalArguments[0];
+    }
+    return super.noSuchMethod(i);
+  }
+}
+
+main() {
+  F f = new F(42);
+  // Tears off f.call, fails with nSM (wrong number of arguments).
+  Expect.throwsNoSuchMethodError(() => Function.apply(f, ['a', 'b', 'c', 'd']));
+
+  dynamic d = f;
+  var result = d('a', 'b', 'c', 'd'); // calls F.noSuchMethod
+  Expect.equals('a', result);
+
+  // Tears off f.call, call succeeds
+  Expect.equals(42, Function.apply(f, []));
+}
diff --git a/tests/language/nnbd/resolution/issue40931_test.dart b/tests/language/nnbd/resolution/issue40931_test.dart
new file mode 100644
index 0000000..0ea944d
--- /dev/null
+++ b/tests/language/nnbd/resolution/issue40931_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+main() {}
+
+extension E<T> on T? {
+  T foo() => throw 0;
+}
+
+void f(int? a) {
+  a.foo();
+}
diff --git a/tests/language/nnbd/resolution/question_question_lub_test.dart b/tests/language/nnbd/resolution/question_question_lub_test.dart
index 830c848..b050b2a 100644
--- a/tests/language/nnbd/resolution/question_question_lub_test.dart
+++ b/tests/language/nnbd/resolution/question_question_lub_test.dart
@@ -16,13 +16,13 @@
   (nullableInt ?? nonNullInt) + 1;
   (nullableInt ?? nullableInt) + 1;
 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_WARNING.UNCHECKED_USE_OF_NULLABLE_VALUE
+// [analyzer] STATIC_WARNING.USE_OF_NULLABLE_VALUE
 // [cfe] unspecified
   (nonNullInt ?? nullableInt) + 1;
 //               ^^^^^^^^^^^
 // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
 //^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_WARNING.UNCHECKED_USE_OF_NULLABLE_VALUE
+// [analyzer] STATIC_WARNING.USE_OF_NULLABLE_VALUE
 // [cfe] unspecified
   (nonNullInt ?? nonNullInt) + 1;
 //               ^^^^^^^^^^
diff --git a/tests/language/nnbd/syntax/late_modifier_non_final_field_test.dart b/tests/language/nnbd/syntax/late_modifier_non_final_field_test.dart
index 0447025..bd7e91c 100644
--- a/tests/language/nnbd/syntax/late_modifier_non_final_field_test.dart
+++ b/tests/language/nnbd/syntax/late_modifier_non_final_field_test.dart
@@ -17,6 +17,12 @@
   late int fieldWithTrivialInit = 123;
   late int? fieldWithNullInit = null;
   late int fieldWithNoInit;
+  late int? nullableFieldWithNoInit;
+  late int? fieldWithOnlyCtorInit;
+  late int? fieldWithOnlyBothInitAndCtorInit = 123;
+  A()
+      : fieldWithOnlyCtorInit = null,
+        fieldWithOnlyBothInitAndCtorInit = null;
 }
 
 main() {
@@ -29,22 +35,36 @@
     Expect.equals(null, a.fieldWithNullInit);
     Expect.throws(
         () => a.fieldWithNoInit, (error) => error is LateInitializationError);
+    Expect.throws(() => a.nullableFieldWithNoInit,
+        (error) => error is LateInitializationError);
+    Expect.equals(null, a.fieldWithOnlyCtorInit);
+    Expect.equals(null, a.fieldWithOnlyBothInitAndCtorInit);
     Expect.equals(1, initCalls);
     Expect.equals(123, a.fieldWithInit);
     Expect.equals(123, a.fieldWithTrivialInit);
     Expect.equals(null, a.fieldWithNullInit);
     Expect.throws(
         () => a.fieldWithNoInit, (error) => error is LateInitializationError);
+    Expect.throws(() => a.nullableFieldWithNoInit,
+        (error) => error is LateInitializationError);
+    Expect.equals(null, a.fieldWithOnlyCtorInit);
+    Expect.equals(null, a.fieldWithOnlyBothInitAndCtorInit);
     Expect.equals(1, initCalls);
     a.fieldWithInit = 456;
     a.fieldWithTrivialInit = 456;
     a.fieldWithNullInit = 456;
     a.fieldWithNoInit = 456;
+    a.nullableFieldWithNoInit = null;
+    a.fieldWithOnlyCtorInit = 456;
+    a.fieldWithOnlyBothInitAndCtorInit = 456;
     Expect.equals(1, initCalls);
     Expect.equals(456, a.fieldWithInit);
     Expect.equals(456, a.fieldWithTrivialInit);
     Expect.equals(456, a.fieldWithNullInit);
     Expect.equals(456, a.fieldWithNoInit);
+    Expect.equals(null, a.nullableFieldWithNoInit);
+    Expect.equals(456, a.fieldWithOnlyCtorInit);
+    Expect.equals(456, a.fieldWithOnlyBothInitAndCtorInit);
     Expect.equals(1, initCalls);
     initCalls = 0;
 
diff --git a/tests/language/nnbd/syntax/required_modifier_dynamic_error_test.dart b/tests/language/nnbd/syntax/required_modifier_dynamic_error_test.dart
index 38c7c39..b9dee57 100644
--- a/tests/language/nnbd/syntax/required_modifier_dynamic_error_test.dart
+++ b/tests/language/nnbd/syntax/required_modifier_dynamic_error_test.dart
@@ -15,10 +15,30 @@
   }
 }
 
+int baz(
+    {required String a,
+    required String b,
+    required String c,
+    required String d}) {
+  return a.length + b.length + c.length + d.length;
+}
+
 main() {
   Expect.equals(8, Foo().foo(a: "aa", b: "bb", c: "cc", d: "dd"));
 
   // Test that we throw a NoSuchMethodError, not a TypeError due to c.length.
   dynamic f = Foo();
   Expect.throwsNoSuchMethodError(() => f.foo(a: "aa", b: "bb", d: "dd"));
+
+  dynamic tearOff = baz;
+  Expect.throwsNoSuchMethodError(() => tearOff(a: "aa", c: "cc", d: "dd"));
+
+  dynamic closure = (
+      {required String a,
+      required String b,
+      required String c,
+      required String d}) {
+    return a.length + b.length + c.length + d.length;
+  };
+  Expect.throwsNoSuchMethodError(() => closure(a: "aa", c: "cc", d: "dd"));
 }
diff --git a/tests/language/nnbd/type_promotion/function_expression_is_type_mutated_in_closure_test.dart b/tests/language/nnbd/type_promotion/function_expression_is_type_mutated_in_closure_test.dart
index 5f67881..058855e 100644
--- a/tests/language/nnbd/type_promotion/function_expression_is_type_mutated_in_closure_test.dart
+++ b/tests/language/nnbd/type_promotion/function_expression_is_type_mutated_in_closure_test.dart
@@ -7,12 +7,16 @@
 void f() {
   void g(Object x) {
     if (x is String) {
-      x.length; //# none: compile-time error
+      x.length; //# 01: ok
     }
 
     void h() {
       x = 42;
     }
+
+    if (x is String) {
+      x.length; //# 02: compile-time error
+    }
   }
 }
 
diff --git a/tests/legacy_status_dart2js.csv b/tests/legacy_status_dart2js.csv
index 903bfb6..e7f8343 100644
--- a/tests/legacy_status_dart2js.csv
+++ b/tests/legacy_status_dart2js.csv
@@ -18,9 +18,7 @@
 $compiler == dart2js,jsinterop_test/02,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,jsinterop_test/03,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,jsinterop_test/04,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
-$compiler == dart2js,jsinterop_test/34,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,jsinterop_test/35,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
-$compiler == dart2js,jsinterop_test/36,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,jsinterop_test/37,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,jsinterop_test/38,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,jsinterop_test/42,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
@@ -38,9 +36,7 @@
 $compiler == dart2js,non_jsinterop_test/02,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,non_jsinterop_test/03,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,non_jsinterop_test/04,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
-$compiler == dart2js,non_jsinterop_test/34,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,non_jsinterop_test/35,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
-$compiler == dart2js,non_jsinterop_test/36,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,non_jsinterop_test/37,MissingCompileTimeError,Issue 33834,https://dartbug.com/33834,open
 $compiler == dart2js,non_jsinterop_test/38,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
 $compiler == dart2js,non_jsinterop_test/42,MissingCompileTimeError,Issue 34174,https://dartbug.com/34174,open
diff --git a/tests/lib/mirrors/field_metadata2_test.dart b/tests/lib/mirrors/field_metadata2_test.dart
deleted file mode 100644
index 60e1b6c..0000000
--- a/tests/lib/mirrors/field_metadata2_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// compile options: --emit-metadata
-// 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.
-
-// Run essentially the same test, but with emit-metadata compile option,
-// which allows us to reflect on the fields.
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-import 'field_metadata_test.dart' as field_metadata_test;
-import 'field_metadata_test.dart' show Foo, Bar;
-
-void main() {
-  // Make sure the other test still works.
-  field_metadata_test.main();
-
-  // Check that we can now reflect on the annotations.
-  dynamic f = new Foo();
-  var members = reflect(f).type.declarations;
-  var x = members[#x] as VariableMirror;
-  var bar = x.metadata.first.reflectee as Bar;
-  Expect.equals(bar.name, 'bar');
-
-  var y = members[#y] as VariableMirror;
-  var baz = y.metadata.first.reflectee as Bar;
-  Expect.equals(baz.name, 'baz');
-}
diff --git a/tests/lib/mirrors/metadata_constructed_constant_test.dart b/tests/lib/mirrors/metadata_constructed_constant_test.dart
index 16746a0..fc72601 100644
--- a/tests/lib/mirrors/metadata_constructed_constant_test.dart
+++ b/tests/lib/mirrors/metadata_constructed_constant_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/lib/mirrors/metadata_constructor_arguments_test.dart b/tests/lib/mirrors/metadata_constructor_arguments_test.dart
index bc459e9..361d067 100644
--- a/tests/lib/mirrors/metadata_constructor_arguments_test.dart
+++ b/tests/lib/mirrors/metadata_constructor_arguments_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/lib/mirrors/metadata_nested_constructor_call_test.dart b/tests/lib/mirrors/metadata_nested_constructor_call_test.dart
index d2edccc..bb26dcf 100644
--- a/tests/lib/mirrors/metadata_nested_constructor_call_test.dart
+++ b/tests/lib/mirrors/metadata_nested_constructor_call_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/lib_2/html/custom/document_register_basic_test.dart b/tests/lib_2/html/custom/document_register_basic_test.dart
index c295b7f7..6bec727 100644
--- a/tests/lib_2/html/custom/document_register_basic_test.dart
+++ b/tests/lib_2/html/custom/document_register_basic_test.dart
@@ -7,7 +7,6 @@
 import 'dart:html';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
 
 import 'utils.dart';
 
@@ -42,8 +41,6 @@
 }
 
 main() {
-  useHtmlConfiguration();
-
   // Adapted from Blink's fast/dom/custom/document-register-basic test.
 
   setUp(() => customElementsReady);
diff --git a/tests/lib_2/html/custom/document_register_type_extensions_test.dart b/tests/lib_2/html/custom/document_register_type_extensions_test.dart
index 2e652c4..964d80d 100644
--- a/tests/lib_2/html/custom/document_register_type_extensions_test.dart
+++ b/tests/lib_2/html/custom/document_register_type_extensions_test.dart
@@ -4,7 +4,6 @@
 
 import 'dart:html';
 
-import 'package:unittest/html_individual_config.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
@@ -78,8 +77,6 @@
 }
 
 main() {
-  useHtmlIndividualConfiguration();
-
   // Adapted from Blink's fast/dom/custom/document-register-type-extension test.
 
   var testForm = new FormElement()..id = 'testForm';
diff --git a/tests/lib_2/html/custom/element_upgrade_failure_test.dart b/tests/lib_2/html/custom/element_upgrade_failure_test.dart
index 16bb949..a255162 100644
--- a/tests/lib_2/html/custom/element_upgrade_failure_test.dart
+++ b/tests/lib_2/html/custom/element_upgrade_failure_test.dart
@@ -6,7 +6,6 @@
 import 'dart:html';
 import 'dart:js' as js;
 
-import 'package:unittest/html_individual_config.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/tests/lib_2/html/custom/element_upgrade_test.dart b/tests/lib_2/html/custom/element_upgrade_test.dart
index 15a9f85..135cf3d 100644
--- a/tests/lib_2/html/custom/element_upgrade_test.dart
+++ b/tests/lib_2/html/custom/element_upgrade_test.dart
@@ -6,7 +6,6 @@
 import 'dart:html';
 import 'dart:js' as js;
 
-import 'package:unittest/html_individual_config.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/tests/lib_2/html/element_test.dart b/tests/lib_2/html/element_test.dart
index b6eeb2b..e6e3e9a 100644
--- a/tests/lib_2/html/element_test.dart
+++ b/tests/lib_2/html/element_test.dart
@@ -5,7 +5,6 @@
 library ElementTest;
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'package:unittest/src/expected_function.dart' show ExpectedFunction;
 import 'dart:async';
 import 'dart:html';
@@ -32,8 +31,6 @@
 }
 
 main() {
-  useHtmlIndividualConfiguration();
-
   var isHRElement = predicate((x) => x is HRElement, 'is a HRElement');
   var isBRElement = predicate((x) => x is BRElement, 'is a BRElement');
   var isInputElement =
diff --git a/tests/lib_2/html/fileapi_supported_test.dart b/tests/lib_2/html/fileapi_supported_test.dart
index 45cf32d..0de1f85 100644
--- a/tests/lib_2/html/fileapi_supported_test.dart
+++ b/tests/lib_2/html/fileapi_supported_test.dart
@@ -5,7 +5,6 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:async_helper/async_minitest.dart';
-import 'package:expect/minitest.dart' as minitest;
 
 
 Future<FileSystem> _fileSystem;
@@ -30,8 +29,8 @@
   });
 
   test('requestFileSystem', () async {
-    var expectation = FileSystem.supported ? minitest.returnsNormally : throws;
-    minitest.expect(() async {
+    var expectation = FileSystem.supported ? returnsNormally : throws;
+    expect(() async {
       var fs = await fileSystem;
       expect(fs.root != null, true);
     }, expectation);
diff --git a/tests/lib_2/html/fileapi_supported_throws_test.dart b/tests/lib_2/html/fileapi_supported_throws_test.dart
index e6c2d7e..892ba50 100644
--- a/tests/lib_2/html/fileapi_supported_throws_test.dart
+++ b/tests/lib_2/html/fileapi_supported_throws_test.dart
@@ -5,12 +5,11 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:async_helper/async_minitest.dart';
-import 'package:expect/minitest.dart' as minitest;
 
 main() {
   test('requestFileSystem', () async {
-    var expectation = FileSystem.supported ? minitest.returnsNormally : throws;
-    minitest.expect(() async {
+    var expectation = FileSystem.supported ? returnsNormally : throws;
+    expect(() async {
       await window.requestFileSystem(100);
     }, expectation);
   });
diff --git a/tests/lib_2/html/history_history_test.dart b/tests/lib_2/html/history_history_test.dart
deleted file mode 100644
index e60f97c..0000000
--- a/tests/lib_2/html/history_history_test.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-library HistoryTest;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-import 'dart:html';
-import 'dart:async';
-
-main() {
-  useHtmlIndividualConfiguration();
-
-  var expectation = History.supportsState ? returnsNormally : throws;
-
-  test('pushState', () {
-    expect(() {
-      window.history.pushState(null, document.title, '?dummy');
-      var length = window.history.length;
-
-      window.history.pushState(null, document.title, '?foo=bar');
-
-      expect(window.location.href.endsWith('foo=bar'), isTrue);
-    }, expectation);
-  });
-
-  test('pushState with data', () {
-    expect(() {
-      window.history.pushState({'one': 1}, document.title, '?dummy');
-      expect(window.history.state, equals({'one': 1}));
-      window.history.pushState(null, document.title, '?foo=bar');
-
-      expect(window.location.href.endsWith('foo=bar'), isTrue);
-    }, expectation);
-  });
-
-  test('back', () {
-    expect(() {
-      window.history.pushState(null, document.title, '?dummy1');
-      window.history.pushState(null, document.title, '?dummy2');
-      var length = window.history.length;
-
-      expect(window.location.href.endsWith('dummy2'), isTrue);
-
-      // Need to wait a frame or two to let the pushState events occur.
-      new Timer(const Duration(milliseconds: 100), expectAsync(() {
-        window.onPopState.first.then(expectAsync((_) {
-          expect(window.history.length, length);
-          expect(window.location.href.endsWith('dummy1'), isTrue);
-        }));
-
-        window.history.back();
-      }));
-    }, expectation);
-  });
-
-  test('replaceState', () {
-    expect(() {
-      var length = window.history.length;
-
-      window.history.replaceState(null, document.title, '?foo=baz');
-      expect(window.history.length, length);
-      expect(window.location.href.endsWith('foo=baz'), isTrue);
-    }, expectation);
-  });
-
-  test('popstatevent', () {
-    expect(() {
-      var event = new Event.eventType('PopStateEvent', 'popstate');
-      expect(event is PopStateEvent, true);
-    }, expectation);
-  });
-
-  test('hashchangeevent', () {
-    var expectation = HashChangeEvent.supported ? returnsNormally : throws;
-    expect(() {
-      var event = new HashChangeEvent('change', oldUrl: 'old', newUrl: 'new');
-      expect(event is HashChangeEvent, true);
-      expect(event.oldUrl, 'old');
-      expect(event.newUrl, 'new');
-    }, expectation);
-  });
-}
-
diff --git a/tests/lib_2/html/history_supported_test.dart b/tests/lib_2/html/history_supported_test.dart
new file mode 100644
index 0000000..1795e35
--- /dev/null
+++ b/tests/lib_2/html/history_supported_test.dart
@@ -0,0 +1,15 @@
+library HistoryTest;
+
+import 'package:unittest/unittest.dart';
+import 'dart:html';
+import 'dart:async';
+
+main() {
+  test('supports_state', () {
+    expect(History.supportsState, true);
+  });
+
+  test('supported_HashChangeEvent', () {
+    expect(HashChangeEvent.supported, true);
+  });
+}
diff --git a/tests/lib_2/html/history_supports_tests.dart b/tests/lib_2/html/history_supports_tests.dart
deleted file mode 100644
index 0459fae..0000000
--- a/tests/lib_2/html/history_supports_tests.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-library HistoryTest;
-
-import 'package:unittest/unittest.dart';
-import 'dart:html';
-import 'dart:async';
-
-main() {
-  test('supportsState', () {
-    expect(History.supportsState, true);
-  });
-}
-
diff --git a/tests/lib_2/html/history_test.dart b/tests/lib_2/html/history_test.dart
index 907fa7c..064c583 100644
--- a/tests/lib_2/html/history_test.dart
+++ b/tests/lib_2/html/history_test.dart
@@ -1,94 +1,77 @@
 library HistoryTest;
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'dart:html';
 import 'dart:async';
 
 main() {
-  useHtmlIndividualConfiguration();
-
-  group('supported_state', () {
-    test('supportsState', () {
-      expect(History.supportsState, true);
-    });
-  });
-
-  group('supported_HashChangeEvent', () {
-    test('supported', () {
-      expect(HashChangeEvent.supported, true);
-    });
-  });
-
   var expectation = History.supportsState ? returnsNormally : throws;
 
-  group('history', () {
-    test('pushState', () {
-      expect(() {
-        window.history.pushState(null, document.title, '?dummy');
-        var length = window.history.length;
+  test('pushState', () {
+    expect(() {
+      window.history.pushState(null, document.title, '?dummy');
+      var length = window.history.length;
 
-        window.history.pushState(null, document.title, '?foo=bar');
+      window.history.pushState(null, document.title, '?foo=bar');
 
-        expect(window.location.href.endsWith('foo=bar'), isTrue);
-      }, expectation);
-    });
+      expect(window.location.href.endsWith('foo=bar'), isTrue);
+    }, expectation);
+  });
 
-    test('pushState with data', () {
-      expect(() {
-        window.history.pushState({'one': 1}, document.title, '?dummy');
-        expect(window.history.state, equals({'one': 1}));
-        window.history.pushState(null, document.title, '?foo=bar');
+  test('pushState with data', () {
+    expect(() {
+      window.history.pushState({'one': 1}, document.title, '?dummy');
+      expect(window.history.state, equals({'one': 1}));
+      window.history.pushState(null, document.title, '?foo=bar');
 
-        expect(window.location.href.endsWith('foo=bar'), isTrue);
-      }, expectation);
-    });
+      expect(window.location.href.endsWith('foo=bar'), isTrue);
+    }, expectation);
+  });
 
-    test('back', () {
-      expect(() {
-        window.history.pushState(null, document.title, '?dummy1');
-        window.history.pushState(null, document.title, '?dummy2');
-        var length = window.history.length;
+  test('back', () {
+    expect(() {
+      window.history.pushState(null, document.title, '?dummy1');
+      window.history.pushState(null, document.title, '?dummy2');
+      var length = window.history.length;
 
-        expect(window.location.href.endsWith('dummy2'), isTrue);
+      expect(window.location.href.endsWith('dummy2'), isTrue);
 
-        // Need to wait a frame or two to let the pushState events occur.
-        new Timer(const Duration(milliseconds: 100), expectAsync(() {
-          window.onPopState.first.then(expectAsync((_) {
-            expect(window.history.length, length);
-            expect(window.location.href.endsWith('dummy1'), isTrue);
-          }));
-
-          window.history.back();
+      // Need to wait a frame or two to let the pushState events occur.
+      new Timer(const Duration(milliseconds: 100), expectAsync(() {
+        window.onPopState.first.then(expectAsync((_) {
+          expect(window.history.length, length);
+          expect(window.location.href.endsWith('dummy1'), isTrue);
         }));
-      }, expectation);
-    });
 
-    test('replaceState', () {
-      expect(() {
-        var length = window.history.length;
+        window.history.back();
+      }));
+    }, expectation);
+  });
 
-        window.history.replaceState(null, document.title, '?foo=baz');
-        expect(window.history.length, length);
-        expect(window.location.href.endsWith('foo=baz'), isTrue);
-      }, expectation);
-    });
+  test('replaceState', () {
+    expect(() {
+      var length = window.history.length;
 
-    test('popstatevent', () {
-      expect(() {
-        var event = new Event.eventType('PopStateEvent', 'popstate');
-        expect(event is PopStateEvent, true);
-      }, expectation);
-    });
+      window.history.replaceState(null, document.title, '?foo=baz');
+      expect(window.history.length, length);
+      expect(window.location.href.endsWith('foo=baz'), isTrue);
+    }, expectation);
+  });
 
-    test('hashchangeevent', () {
-      var expectation = HashChangeEvent.supported ? returnsNormally : throws;
-      expect(() {
-        var event = new HashChangeEvent('change', oldUrl: 'old', newUrl: 'new');
-        expect(event is HashChangeEvent, true);
-        expect(event.oldUrl, 'old');
-        expect(event.newUrl, 'new');
-      }, expectation);
-    });
+  test('popstatevent', () {
+    expect(() {
+      var event = new Event.eventType('PopStateEvent', 'popstate');
+      expect(event is PopStateEvent, true);
+    }, expectation);
+  });
+
+  test('hashchangeevent', () {
+    var expectation = HashChangeEvent.supported ? returnsNormally : throws;
+    expect(() {
+      var event = new HashChangeEvent('change', oldUrl: 'old', newUrl: 'new');
+      expect(event is HashChangeEvent, true);
+      expect(event.oldUrl, 'old');
+      expect(event.newUrl, 'new');
+    }, expectation);
   });
 }
diff --git a/tests/lib_2/html/indexeddb_1_test.dart b/tests/lib_2/html/indexeddb_1_test.dart
index 419b1c5..513c028 100644
--- a/tests/lib_2/html/indexeddb_1_test.dart
+++ b/tests/lib_2/html/indexeddb_1_test.dart
@@ -1,7 +1,6 @@
 library IndexedDB1Test;
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'dart:async';
 import 'dart:html' as html;
 import 'dart:math' as math;
@@ -154,8 +153,6 @@
 }
 
 main() {
-  useHtmlIndividualConfiguration();
-
   // Test that indexed_db is properly flagged as supported or not.
   // Note that the rest of the indexed_db tests assume that this has been
   // checked.
diff --git a/tests/lib_2/html/interactive_geolocation_test.dart b/tests/lib_2/html/interactive_geolocation_test.dart
index 9f0d6d7..11d34c3 100644
--- a/tests/lib_2/html/interactive_geolocation_test.dart
+++ b/tests/lib_2/html/interactive_geolocation_test.dart
@@ -7,12 +7,9 @@
 import 'dart:async';
 import 'dart:html';
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'utils.dart';
 
 main() {
-  useHtmlIndividualConfiguration();
-
   test('getCurrentPosition', () {
     return window.navigator.geolocation.getCurrentPosition().then((position) {
       expect(position.coords.latitude, isNotNull);
diff --git a/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
new file mode 100644
index 0000000..9cbbe1f
--- /dev/null
+++ b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
@@ -0,0 +1,52 @@
+// 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.
+
+// SharedOptions=--trust-type-annotations
+@JS()
+library js_function_getter_trust_types_test;
+
+import 'package:js/js.dart';
+import 'package:expect/expect.dart';
+
+import 'js_function_util.dart';
+
+main() {
+  injectJs();
+
+  foo.bar.nonFunctionStatic();
+//        ^
+// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
+//^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+
+  foo.bar.nonFunctionStatic(0);
+//        ^
+// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
+//^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+
+  foo.bar.nonFunctionStatic(0, 0);
+//        ^
+// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
+//^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+
+  foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0);
+//        ^
+// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
+//^^^^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+
+  foo.bar.add(4);
+  //         ^
+  // [cfe] Error: Too few positional arguments: 2 required, 1 given.
+  //         ^^^
+  // [analyzer] COMPILE_TIME_ERROR.NOT_ENOUGH_POSITIONAL_ARGUMENTS
+
+  foo.bar.add(4, 5, 10);
+  //         ^
+  // [cfe] Error: Too many positional arguments: 2 allowed, but 3 found.
+  //         ^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
+}
diff --git a/tests/lib_2/html/js_function_getter_trust_types/function_test.dart b/tests/lib_2/html/js_function_getter_trust_types/function_test.dart
new file mode 100644
index 0000000..5a49f47
--- /dev/null
+++ b/tests/lib_2/html/js_function_getter_trust_types/function_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// SharedOptions=--trust-type-annotations
+@JS()
+library js_function_getter_trust_types_test;
+
+import 'package:js/js.dart';
+import 'package:expect/expect.dart';
+
+import 'js_function_util.dart';
+
+main() {
+  injectJs();
+
+  Expect.equals(foo.bar.add(4, 5), 9);
+}
diff --git a/tests/lib_2/html/js_function_getter_trust_types/js_function_util.dart b/tests/lib_2/html/js_function_getter_trust_types/js_function_util.dart
new file mode 100644
index 0000000..b6afd8f
--- /dev/null
+++ b/tests/lib_2/html/js_function_getter_trust_types/js_function_util.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// SharedOptions=--trust-type-annotations
+@JS()
+library js_function_getter_trust_types_test;
+
+import 'dart:html';
+
+import 'package:js/js.dart';
+
+injectJs() {
+  document.body.append(new ScriptElement()
+    ..type = 'text/javascript'
+    ..innerHtml = r"""
+  var bar = { };
+
+  bar.nonFunctionStatic = function() {
+    return arguments.length * 2;
+  };
+
+  bar.add = function(a, b) {
+    return a + b;
+  };
+
+  var foo = { 'bar' : bar };
+""");
+}
+
+typedef int AddFn(int x, int y);
+
+@JS()
+class NotAFn {}
+
+@JS()
+abstract class Bar {
+  external AddFn get add;
+  external NotAFn get nonFunctionStatic;
+}
+
+@JS()
+abstract class Foo {
+  external Bar get bar;
+}
+
+@JS()
+external Foo get foo;
diff --git a/tests/lib_2/html/js_function_getter_trust_types_test.dart b/tests/lib_2/html/js_function_getter_trust_types_test.dart
deleted file mode 100644
index c91d6b3..0000000
--- a/tests/lib_2/html/js_function_getter_trust_types_test.dart
+++ /dev/null
@@ -1,70 +0,0 @@
-// 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.
-
-// SharedOptions=--trust-type-annotations
-@JS()
-library js_function_getter_trust_types_test;
-
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/html_individual_config.dart';
-
-_injectJs() {
-  document.body.append(new ScriptElement()
-    ..type = 'text/javascript'
-    ..innerHtml = r"""
-  var bar = { };
-
-  bar.nonFunctionStatic = function() {
-    return arguments.length * 2;
-  };
-
-  bar.add = function(a, b) {
-    return a + b;
-  };
-
-  var foo = { 'bar' : bar };
-""");
-}
-
-typedef int AddFn(int x, int y);
-
-@JS()
-class NotAFn {}
-
-@JS()
-abstract class Bar {
-  external AddFn get add;
-  external NotAFn get nonFunctionStatic;
-}
-
-@JS()
-abstract class Foo {
-  external Bar get bar;
-}
-
-@JS()
-external Foo get foo;
-
-main() {
-  _injectJs();
-
-  useHtmlIndividualConfiguration();
-
-  test('static nonFunctionStatic', () {
-    expect(() => foo.bar.nonFunctionStatic(), throws);
-    expect(() => foo.bar.nonFunctionStatic(0), throws);
-    expect(() => foo.bar.nonFunctionStatic(0, 0), throws);
-    expect(() => foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0), throws);
-  });
-
-  test('typedef function', () {
-    expect(() => foo.bar.add(4), throws);
-    expect(() => foo.bar.add(4, 5, 10), throws);
-    expect(foo.bar.add(4, 5), equals(9));
-  });
-}
diff --git a/tests/lib_2/html/js_interop_constructor_name_div_test.dart b/tests/lib_2/html/js_interop_constructor_name/div_test.dart
similarity index 90%
rename from tests/lib_2/html/js_interop_constructor_name_div_test.dart
rename to tests/lib_2/html/js_interop_constructor_name/div_test.dart
index 869ff73..f24cfe6 100644
--- a/tests/lib_2/html/js_interop_constructor_name_div_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/div_test.dart
@@ -10,7 +10,6 @@
 import 'package:js/js.dart';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'package:expect/expect.dart' show NoInline, AssumeDynamic;
 
 @JS()
@@ -26,8 +25,6 @@
 confuse(x) => x;
 
 main() {
-  useHtmlIndividualConfiguration();
-
   test('dom-is-dom', () {
     var e = confuse(new html.DivElement());
     expect(e is html.DivElement, isTrue);
diff --git a/tests/lib_2/html/js_interop_constructor_name_test.html b/tests/lib_2/html/js_interop_constructor_name/div_test.html
similarity index 73%
rename from tests/lib_2/html/js_interop_constructor_name_test.html
rename to tests/lib_2/html/js_interop_constructor_name/div_test.html
index 04399e4..31aad5e 100644
--- a/tests/lib_2/html/js_interop_constructor_name_test.html
+++ b/tests/lib_2/html/js_interop_constructor_name/div_test.html
@@ -3,7 +3,7 @@
 <head>
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="dart.unittest" content="full-stack-traces">
-  <title> js_interop_constructor_name_test </title>
+  <title> div_test </title>
   <style>
      .unittest-table { font-family:monospace; border:1px; }
      .unittest-pass { background: #6b3;}
@@ -12,9 +12,9 @@
   </style>
 </head>
 <body>
-  <h1> Running js_interop_constructor_name_test </h1>
+  <h1> Running div_test </h1>
   <script type="text/javascript"
-      src="/root_dart/tests/html/js_interop_constructor_name_test_js.js"></script>
+      src="/root_dart/tests/lib_2/html/js_interop_constructor_name/test_js.js"></script>
   <script type="text/javascript"
       src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/lib_2/html/js_interop_constructor_name_error1_test.dart b/tests/lib_2/html/js_interop_constructor_name/error1_test.dart
similarity index 90%
rename from tests/lib_2/html/js_interop_constructor_name_error1_test.dart
rename to tests/lib_2/html/js_interop_constructor_name/error1_test.dart
index 9057129..06323e7 100644
--- a/tests/lib_2/html/js_interop_constructor_name_error1_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/error1_test.dart
@@ -10,7 +10,6 @@
 import 'package:js/js.dart';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'package:expect/expect.dart' show NoInline, AssumeDynamic;
 
 @JS()
@@ -26,8 +25,6 @@
 confuse(x) => x;
 
 main() {
-  useHtmlIndividualConfiguration();
-
   test('dom-is-js', () {
     var e = confuse(new html.DivElement());
     // Currently, HTML types are not [JavaScriptObject]s. We could change that
diff --git a/tests/lib_2/html/js_interop_constructor_name_test.html b/tests/lib_2/html/js_interop_constructor_name/error1_test.html
similarity index 73%
copy from tests/lib_2/html/js_interop_constructor_name_test.html
copy to tests/lib_2/html/js_interop_constructor_name/error1_test.html
index 04399e4..9c6566e 100644
--- a/tests/lib_2/html/js_interop_constructor_name_test.html
+++ b/tests/lib_2/html/js_interop_constructor_name/error1_test.html
@@ -3,7 +3,7 @@
 <head>
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="dart.unittest" content="full-stack-traces">
-  <title> js_interop_constructor_name_test </title>
+  <title> error1_test </title>
   <style>
      .unittest-table { font-family:monospace; border:1px; }
      .unittest-pass { background: #6b3;}
@@ -12,9 +12,9 @@
   </style>
 </head>
 <body>
-  <h1> Running js_interop_constructor_name_test </h1>
+  <h1> Running error1_test </h1>
   <script type="text/javascript"
-      src="/root_dart/tests/html/js_interop_constructor_name_test_js.js"></script>
+      src="/root_dart/tests/lib_2/html/js_interop_constructor_name/test_js.js"></script>
   <script type="text/javascript"
       src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/lib_2/html/js_interop_constructor_name_error2_test.dart b/tests/lib_2/html/js_interop_constructor_name/error2_test.dart
similarity index 90%
rename from tests/lib_2/html/js_interop_constructor_name_error2_test.dart
rename to tests/lib_2/html/js_interop_constructor_name/error2_test.dart
index 6340f63..44c2226 100644
--- a/tests/lib_2/html/js_interop_constructor_name_error2_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/error2_test.dart
@@ -10,7 +10,6 @@
 import 'package:js/js.dart';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'package:expect/expect.dart' show NoInline, AssumeDynamic;
 
 @JS()
@@ -26,8 +25,6 @@
 confuse(x) => x;
 
 main() {
-  useHtmlIndividualConfiguration();
-
   test('String-is-not-js', () {
     var e = confuse('kombucha');
     // A String should not be a JS interop type. The type test flags are added
diff --git a/tests/lib_2/html/js_interop_constructor_name_test.html b/tests/lib_2/html/js_interop_constructor_name/error2_test.html
similarity index 73%
copy from tests/lib_2/html/js_interop_constructor_name_test.html
copy to tests/lib_2/html/js_interop_constructor_name/error2_test.html
index 04399e4..7e1b64f 100644
--- a/tests/lib_2/html/js_interop_constructor_name_test.html
+++ b/tests/lib_2/html/js_interop_constructor_name/error2_test.html
@@ -3,7 +3,7 @@
 <head>
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="dart.unittest" content="full-stack-traces">
-  <title> js_interop_constructor_name_test </title>
+  <title> error2_test </title>
   <style>
      .unittest-table { font-family:monospace; border:1px; }
      .unittest-pass { background: #6b3;}
@@ -12,9 +12,9 @@
   </style>
 </head>
 <body>
-  <h1> Running js_interop_constructor_name_test </h1>
+  <h1> Running error2_test </h1>
   <script type="text/javascript"
-      src="/root_dart/tests/html/js_interop_constructor_name_test_js.js"></script>
+      src="/root_dart/tests/lib_2/html/js_interop_constructor_name/test_js.js"></script>
   <script type="text/javascript"
       src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/lib_2/html/js_interop_constructor_name_method_test.dart b/tests/lib_2/html/js_interop_constructor_name/method_test.dart
similarity index 91%
rename from tests/lib_2/html/js_interop_constructor_name_method_test.dart
rename to tests/lib_2/html/js_interop_constructor_name/method_test.dart
index f96895a..4de6adf 100644
--- a/tests/lib_2/html/js_interop_constructor_name_method_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/method_test.dart
@@ -10,7 +10,6 @@
 import 'package:js/js.dart';
 
 import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
 import 'package:expect/expect.dart' show NoInline, AssumeDynamic;
 
 @JS()
@@ -26,8 +25,6 @@
 confuse(x) => x;
 
 main() {
-  useHtmlIndividualConfiguration();
-
   test('js-call-js-method', () {
     var e = confuse(makeDiv('hello'));
     expect(e.bar(), equals('hello'));
diff --git a/tests/lib_2/html/js_interop_constructor_name_test.html b/tests/lib_2/html/js_interop_constructor_name/method_test.html
similarity index 73%
copy from tests/lib_2/html/js_interop_constructor_name_test.html
copy to tests/lib_2/html/js_interop_constructor_name/method_test.html
index 04399e4..c38d07dd 100644
--- a/tests/lib_2/html/js_interop_constructor_name_test.html
+++ b/tests/lib_2/html/js_interop_constructor_name/method_test.html
@@ -3,7 +3,7 @@
 <head>
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="dart.unittest" content="full-stack-traces">
-  <title> js_interop_constructor_name_test </title>
+  <title> method_test </title>
   <style>
      .unittest-table { font-family:monospace; border:1px; }
      .unittest-pass { background: #6b3;}
@@ -12,9 +12,9 @@
   </style>
 </head>
 <body>
-  <h1> Running js_interop_constructor_name_test </h1>
+  <h1> Running method_test </h1>
   <script type="text/javascript"
-      src="/root_dart/tests/html/js_interop_constructor_name_test_js.js"></script>
+      src="/root_dart/tests/lib_2/html/js_interop_constructor_name/test_js.js"></script>
   <script type="text/javascript"
       src="/root_dart/pkg/test_runner/lib/src/test_controller.js"></script>
   %TEST_SCRIPTS%
diff --git a/tests/lib_2/html/js_interop_constructor_name/test_js.js b/tests/lib_2/html/js_interop_constructor_name/test_js.js
new file mode 100644
index 0000000..828cbc9
--- /dev/null
+++ b/tests/lib_2/html/js_interop_constructor_name/test_js.js
@@ -0,0 +1,20 @@
+(function() {
+
+  // A constructor function with the same name as a HTML element.
+  function HTMLDivElement(a) {
+    this.a = a;
+  }
+
+  HTMLDivElement.prototype.bar = function() {
+    return this.a;
+  }
+
+  HTMLDivElement.prototype.toString = function() {
+    return "HTMLDivElement(" + this.a + ")";
+  }
+
+  self.makeDiv = function(text) {
+    return new HTMLDivElement(text);
+  };
+
+})();
diff --git a/tests/lib_2/html/websocket_test.dart b/tests/lib_2/html/websocket_test.dart
index 4495850..2157e74 100644
--- a/tests/lib_2/html/websocket_test.dart
+++ b/tests/lib_2/html/websocket_test.dart
@@ -3,7 +3,6 @@
 import 'dart:html';
 
 import 'package:async_helper/async_minitest.dart';
-import 'package:expect/minitest.dart' as minitest;
 
 main() {
   group('supported', () {
@@ -13,15 +12,13 @@
   });
 
   group('websocket', () {
-    var isWebSocket =
-        minitest.predicate((x) => x is WebSocket, 'is a WebSocket');
-    var expectation = WebSocket.supported ? minitest.returnsNormally : throws;
+    var expectation = WebSocket.supported ? returnsNormally : throws;
 
     test('constructorTest', () {
-      minitest.expect(() {
+      expect(() {
         var socket = new WebSocket('ws://localhost/ws', 'chat');
         expect(socket, isNotNull);
-        minitest.expect(socket, isWebSocket);
+        expect(socket, isInstanceOf<WebSocket>());
       }, expectation);
     });
 
diff --git a/tests/lib_2/html/worker_functional_test.dart b/tests/lib_2/html/worker_functional_test.dart
new file mode 100644
index 0000000..497f808
--- /dev/null
+++ b/tests/lib_2/html/worker_functional_test.dart
@@ -0,0 +1,40 @@
+// 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 worker_test;
+
+import 'package:unittest/unittest.dart';
+import 'dart:html';
+
+main() {
+  var workerScript = '''postMessage('WorkerMessage');''';
+
+  test('unsupported', () {
+    if (!Worker.supported) {
+      expect(() => new Worker('worker.js'), throws);
+    } else {
+      new Worker('worker.js').onError.first.then(expectAsync((e) {
+        // This event is expected, "worker.js" doesn't exist.  But the event
+        // *sometimes* propagates to window.onerror in Firefox which causes
+        // this test to fail, so let's stop any further propagation:
+        e.preventDefault();
+        e.stopImmediatePropagation();
+      }));
+    }
+  });
+
+  if (!Worker.supported) return;
+
+  test('works', () {
+    // Use Blob to make a local URL so we don't have to have a separate file.
+    // This does not work on browsers using CSP (Content Security Policy).
+    var blob = new Blob([workerScript], 'text/javascript');
+    var url = Url.createObjectUrl(blob);
+    var worker = new Worker(url);
+    var test = expectAsync((e) {
+      expect(e.data, 'WorkerMessage');
+    });
+    worker.onMessage.first.then(test);
+  });
+}
diff --git a/tests/lib_2/html/worker_supported_test.dart b/tests/lib_2/html/worker_supported_test.dart
new file mode 100644
index 0000000..2196c02
--- /dev/null
+++ b/tests/lib_2/html/worker_supported_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+library worker_test;
+
+import 'package:unittest/unittest.dart';
+import 'dart:html';
+
+main() {
+  test('supported', () {
+    expect(Worker.supported, isTrue);
+  });
+}
diff --git a/tests/lib_2/html/worker_test.dart b/tests/lib_2/html/worker_test.dart
deleted file mode 100644
index dc21b3b..0000000
--- a/tests/lib_2/html/worker_test.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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 worker_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-import 'dart:html';
-
-main() {
-  useHtmlIndividualConfiguration();
-
-  group('supported', () {
-    test('supported', () {
-      expect(Worker.supported, isTrue);
-    });
-  });
-
-  var workerScript = '''postMessage('WorkerMessage');''';
-
-  group('functional', () {
-    test('unsupported', () {
-      if (!Worker.supported) {
-        expect(() => new Worker('worker.js'), throws);
-      } else {
-        new Worker('worker.js').onError.first.then(expectAsync((e) {
-          // This event is expected, "worker.js" doesn't exist.  But the event
-          // *sometimes* propagates to window.onerror in Firefox which causes
-          // this test to fail, so let's stop any further propagation:
-          e.preventDefault();
-          e.stopImmediatePropagation();
-        }));
-      }
-    });
-
-    if (!Worker.supported) {
-      return;
-    }
-
-    test('works', () {
-      // Use Blob to make a local URL so we don't have to have a separate file.
-      // This does not work on browsers using CSP (Content Security Policy).
-      var blob = new Blob([workerScript], 'text/javascript');
-      var url = Url.createObjectUrl(blob);
-      var worker = new Worker(url);
-      var test = expectAsync((e) {
-        expect(e.data, 'WorkerMessage');
-      });
-      worker.onMessage.first.then(test);
-    });
-  });
-}
diff --git a/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart b/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
index d0be07e..5866729 100644
--- a/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
+++ b/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart b/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
index 3e28d99..034881b 100644
--- a/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart b/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
index 22c65cca..9e5b603 100644
--- a/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/scenarios/short_package/short_package_test.dart b/tests/lib_2/isolate/scenarios/short_package/short_package_test.dart
index 88e98be..16ec032 100644
--- a/tests/lib_2/isolate/scenarios/short_package/short_package_test.dart
+++ b/tests/lib_2/isolate/scenarios/short_package/short_package_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
deleted file mode 100644
index 113c571..0000000
--- a/tests/lib_2/lib_2_analyzer.status
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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.
-
-[ $compiler == dart2analyzer ]
-html/js_function_getter_trust_types_test: Skip # dart2js specific flags.
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 4752dc0..14a0a1a 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -55,7 +55,7 @@
 html/file_sample_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on FireFox.
-html/history_test/history: Skip # Issue 22050
+html/history_test: Skip # Issue 22050
 html/request_animation_frame_test: Skip # Async test hangs.
 
 [ $compiler == dart2js && $runtime == safari ]
@@ -69,14 +69,14 @@
 
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Slow, Pass # Issue 12029.
-html/js_function_getter_trust_types_test: Skip # --trust-type-annotations incompatible with --checked
+html/js_function_getter_trust_types/function_test: Skip # --trust-type-annotations incompatible with --checked
 
 [ $compiler == dart2js && $csp && ($runtime == chrome || $runtime == chromeOnAndroid || $runtime == ff || $runtime == safari) ]
 html/event_customevent_test: SkipByDesign
 html/js_array_test: SkipByDesign
 html/js_dart_to_string_test: SkipByDesign
 html/js_function_getter_test: SkipByDesign
-html/js_function_getter_trust_types_test: SkipByDesign
+html/js_function_getter_trust_types/function_test: SkipByDesign
 html/js_interop_1_test: SkipByDesign
 html/js_typed_interop_bind_this_test: SkipByDesign
 html/js_typed_interop_callable_object_test: SkipByDesign
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index c203c9a..5e435c6 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -29,14 +29,7 @@
 html/custom/created_callback_test: Skip # Issue 31577
 html/custom/document_register_basic_test: Skip # Issue 31577
 html/custom/document_register_template_test: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/construction: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/constructors: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/createElement with type extension: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/functional: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/namespaces: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/parsing: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/registration: Skip # Issue 31577
-html/custom/document_register_type_extensions_test/single-parameter createElement: Skip # Issue 31577
+html/custom/document_register_type_extensions_test: Skip # Issue 31577
 html/custom/element_upgrade_test: Skip # Issue 31577
 html/custom/entered_left_view/.*: Skip # Issue 31577
 html/custom/mirrors_2_test: Skip # Issue 31577
diff --git a/tests/lib_2/mirrors/field_metadata2_test.dart b/tests/lib_2/mirrors/field_metadata2_test.dart
deleted file mode 100644
index 60e1b6c..0000000
--- a/tests/lib_2/mirrors/field_metadata2_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// compile options: --emit-metadata
-// 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.
-
-// Run essentially the same test, but with emit-metadata compile option,
-// which allows us to reflect on the fields.
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-import 'field_metadata_test.dart' as field_metadata_test;
-import 'field_metadata_test.dart' show Foo, Bar;
-
-void main() {
-  // Make sure the other test still works.
-  field_metadata_test.main();
-
-  // Check that we can now reflect on the annotations.
-  dynamic f = new Foo();
-  var members = reflect(f).type.declarations;
-  var x = members[#x] as VariableMirror;
-  var bar = x.metadata.first.reflectee as Bar;
-  Expect.equals(bar.name, 'bar');
-
-  var y = members[#y] as VariableMirror;
-  var baz = y.metadata.first.reflectee as Bar;
-  Expect.equals(baz.name, 'baz');
-}
diff --git a/tests/lib_2/mirrors/metadata_constructed_constant_test.dart b/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
index 16746a0..fc72601 100644
--- a/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
+++ b/tests/lib_2/mirrors/metadata_constructed_constant_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart b/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
index bc459e9..361d067 100644
--- a/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
+++ b/tests/lib_2/mirrors/metadata_constructor_arguments_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart b/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
index d2edccc..bb26dcf 100644
--- a/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
+++ b/tests/lib_2/mirrors/metadata_nested_constructor_call_test.dart
@@ -1,4 +1,3 @@
-// compile options: --emit-metadata
 // 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.
diff --git a/tests/standalone_2/package/package1_test.dart b/tests/standalone_2/package/package1_test.dart
index d038dd8..53c8828 100644
--- a/tests/standalone_2/package/package1_test.dart
+++ b/tests/standalone_2/package/package1_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library package1_test;
 
diff --git a/tests/standalone_2/package/package_test.dart b/tests/standalone_2/package/package_test.dart
index b606a23..4f7e52b 100644
--- a/tests/standalone_2/package/package_test.dart
+++ b/tests/standalone_2/package/package_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library package_test;
 
diff --git a/tests/standalone_2/package/scenarios/both_dir_and_file/both_dir_and_file_noimports_test.dart b/tests/standalone_2/package/scenarios/both_dir_and_file/both_dir_and_file_noimports_test.dart
index 166d803..53195a7 100644
--- a/tests/standalone_2/package/scenarios/both_dir_and_file/both_dir_and_file_noimports_test.dart
+++ b/tests/standalone_2/package/scenarios/both_dir_and_file/both_dir_and_file_noimports_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library both_dir_and_file_noimports_test;
 
diff --git a/tests/standalone_2/package/scenarios/both_dir_and_file/prefers_packages_file_test.dart b/tests/standalone_2/package/scenarios/both_dir_and_file/prefers_packages_file_test.dart
index 7a530a2..f06fc56 100644
--- a/tests/standalone_2/package/scenarios/both_dir_and_file/prefers_packages_file_test.dart
+++ b/tests/standalone_2/package/scenarios/both_dir_and_file/prefers_packages_file_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library prefers_packages_file_test;
 
diff --git a/tests/standalone_2/package/scenarios/empty_packages_file/empty_packages_file_discovery_test.dart b/tests/standalone_2/package/scenarios/empty_packages_file/empty_packages_file_discovery_test.dart
index f44e0de..5b5156e 100644
--- a/tests/standalone_2/package/scenarios/empty_packages_file/empty_packages_file_discovery_test.dart
+++ b/tests/standalone_2/package/scenarios/empty_packages_file/empty_packages_file_discovery_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library empty_packages_file_discovery_test;
 
diff --git a/tests/standalone_2/package/scenarios/packages_dir_only/packages/foo/foo.dart b/tests/standalone_2/package/scenarios/packages_dir_only/packages/foo/foo.dart
deleted file mode 100644
index fed9bd7..0000000
--- a/tests/standalone_2/package/scenarios/packages_dir_only/packages/foo/foo.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// 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.
-
-library foo;
-
-String bar = 'hello';
diff --git a/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_noimports_test.dart b/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_noimports_test.dart
deleted file mode 100644
index 230a8e9..0000000
--- a/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_noimports_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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.
-
-// PackageRoot=none
-
-library packages_dir_only_noimports_test;
-
-main() {}
diff --git a/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_test.dart b/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_test.dart
deleted file mode 100644
index afec5b5..0000000
--- a/tests/standalone_2/package/scenarios/packages_dir_only/packages_dir_only_test.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-// PackageRoot=none
-
-library packages_dir_only_test;
-
-import 'package:foo/foo.dart' as foo;
-
-main() {
-  if (foo.bar != 'hello') {
-    throw new Exception('package "foo" was not resolved correctly');
-  }
-}
diff --git a/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_noimports_test.dart b/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_noimports_test.dart
index c765fbe..d5194f1 100644
--- a/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_noimports_test.dart
+++ b/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_noimports_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library packages_file_in_parent_noimports_test;
 
diff --git a/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_test.dart b/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_test.dart
index 106b1af..0151f19 100644
--- a/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_test.dart
+++ b/tests/standalone_2/package/scenarios/packages_file_in_parent/sub/packages_file_in_parent_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library packages_file_in_parent_test;
 
diff --git a/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_noimports_test.dart b/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_noimports_test.dart
index 42b4c54..e495256 100644
--- a/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_noimports_test.dart
+++ b/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_noimports_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library packages_file_only_noimports_test;
 
diff --git a/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_test.dart b/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_test.dart
index 5339533..554f3b7 100644
--- a/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_test.dart
+++ b/tests/standalone_2/package/scenarios/packages_file_only/packages_file_only_test.dart
@@ -2,7 +2,7 @@
 // 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.
 
-// PackageRoot=none
+// Packages=none
 
 library packages_file_only_test;
 
diff --git a/tools/VERSION b/tools/VERSION
index 0ead456..62b6ed6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 8
 PATCH 0
-PRERELEASE 12
+PRERELEASE 13
 PRERELEASE_PATCH 0
 ABI_VERSION 29
 OLDEST_SUPPORTED_ABI_VERSION 29
diff --git a/tools/bots/apply_preapprovals.dart b/tools/bots/apply_preapprovals.dart
deleted file mode 100755
index 3b2bcef..0000000
--- a/tools/bots/apply_preapprovals.dart
+++ /dev/null
@@ -1,247 +0,0 @@
-#!/usr/bin/env dart
-// 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.
-
-// Applies pending pre-approvals for any changelists that have landed according
-// to the git history of HEAD.
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:args/args.dart';
-
-import 'results.dart';
-
-main(List<String> args) async {
-  final parser = new ArgParser();
-  parser.addFlag("dry",
-      abbr: "n",
-      help: "Don't write out the updated approvals.",
-      negatable: false);
-  parser.addMultiOption("apply-changelist",
-      abbr: "A",
-      help: "Apply this changelist even if it hasn't landed",
-      splitCommas: false);
-  parser.addFlag("help", help: "Show the program usage.", negatable: false);
-  parser.addOption("upload",
-      abbr: "u",
-      help: "Upload the updated results to this cloud storage location");
-
-  final options = parser.parse(args);
-  if (options["help"]) {
-    print("""
-Usage: apply_preapprovals.dart [OPTION]... APPROVALS
-Applies pending pre-approvals for any changelists that have landed according to
-the git history of HEAD.
-
-The options are as follows:
-
-${parser.usage}""");
-    return;
-  }
-
-  final parameters = options.rest;
-  if (parameters.length != 1) {
-    print("error: Expected one parameter");
-    exitCode = 2;
-    return;
-  }
-
-  // Locate gsutil.py.
-  gsutilPy = Platform.script
-      .resolve("../../third_party/gsutil/gsutil.py")
-      .toFilePath();
-
-  final approvalsPath = parameters[0];
-  final approvals = await loadResultsMap(approvalsPath);
-
-  // Find the changelists with pre-approvals.
-  final allChangelists = <String>{};
-  for (final key in approvals.keys) {
-    final record = approvals[key];
-    final preapprovals =
-        record.putIfAbsent("preapprovals", () => <String, dynamic>{});
-    allChangelists.addAll(preapprovals.keys);
-  }
-  if (allChangelists.isEmpty) {
-    print("No pre-approvals are pending");
-  }
-
-  // Find the order the pre-approved changelists landed in.
-  final joinedChangelistsPattern = allChangelists.join("\\|");
-  final pattern = "^Change-Id: \\($joinedChangelistsPattern\\)\$";
-  final arguments = [
-    "rev-list",
-    "--pretty=medium",
-    "--grep=$pattern",
-    "--reverse",
-    "HEAD"
-  ];
-  final processOutput = await Process.run("git", arguments, runInShell: true);
-  if (processOutput.exitCode != 0) {
-    throw new Exception("Failed to run git $arguments\n"
-        "exitCode: ${processOutput.exitCode}\n"
-        "stdout: ${processOutput.stdout}\n"
-        "stderr: ${processOutput.stderr}");
-  }
-  final landedChangelists = <String>[];
-  final commitOfChangelist = <String, String>{};
-  String currentCommit;
-  for (final line in LineSplitter.split(processOutput.stdout)) {
-    if (line.startsWith("commit ")) {
-      currentCommit = line.substring("commit ".length);
-    } else if (line.startsWith("    Change-Id: ")) {
-      final changeId = line.substring("    Change-Id: ".length);
-      if (allChangelists.contains(changeId)) {
-        landedChangelists.add(changeId);
-        commitOfChangelist[changeId] = currentCommit;
-      }
-    }
-  }
-  if (processOutput.stdout != "") {
-    print(processOutput.stdout);
-  }
-
-  // Report the status of each of the pre-approved changelists.
-  final unlandedChangelists =
-      allChangelists.difference(landedChangelists.toSet());
-  for (final changelist in unlandedChangelists) {
-    final changelistUrl = "https://dart-review.googlesource.com/q/$changelist";
-    print("Pending: Changelist $changelistUrl hasn't landed yet");
-  }
-  if (allChangelists.isNotEmpty && landedChangelists.isEmpty) {
-    print("No pre-approved changelists have landed.");
-  }
-  for (final changelist in landedChangelists) {
-    final changelistUrl = "https://dart-review.googlesource.com/q/$changelist";
-    final commit = commitOfChangelist[changelist];
-    print("Landed: Changelist $changelistUrl landed in commit $commit");
-  }
-  for (final changelist in options["apply-changelist"]) {
-    final changelistUrl = "https://dart-review.googlesource.com/q/$changelist";
-    print("Force applying: Pretending $changelistUrl has landed");
-    landedChangelists.add(changelist);
-  }
-
-  // Apply the pre-approvals for landed changes.
-  bool updated = false;
-  final conflictsForKey = <String, List<String>>{};
-  final changelistsWithMergeConflicts = <String>{};
-  int totalNumberOfPreapprovals = 0;
-  int totalNumberOfMergeConflicts = 0;
-  for (final changelist in landedChangelists) {
-    final changelistUrl = "https://dart-review.googlesource.com/q/$changelist";
-    final commit = commitOfChangelist[changelist];
-    print("\nApplying pre-approvals for changelist "
-        "$changelistUrl landed in commit $commit");
-    int numberOfPreapprovals = 0;
-    int numberOfMergeConflicts = 0;
-    for (final key in approvals.keys) {
-      final record = approvals[key];
-      final preapprovals = record["preapprovals"];
-      final preapproval = preapprovals.remove(changelist);
-      if (preapproval == null) continue;
-      updated = true;
-      final conflicts = conflictsForKey.putIfAbsent(key, () => <String>[]);
-      if (record["result"] == preapproval["from"]) {
-        print("$changelist: $key: "
-            "${record["result"]} -> ${preapproval["result"]}");
-        conflicts.add("$changelist/$commit had changed approval from "
-            "${record["result"]} to ${preapproval["result"]}");
-        record["result"] = preapproval["result"];
-        record["matches"] = preapproval["matches"];
-        record["expected"] = preapproval["expected"];
-        record["approver"] = preapproval["preapprover"];
-        record["approved_at"] = preapproval["preapproved_at"];
-        numberOfPreapprovals++;
-        totalNumberOfPreapprovals++;
-      } else {
-        print("$changelist: $key: MERGE CONFLICT:");
-        for (final conflict in conflicts) {
-          print(" * $conflict");
-        }
-        print(" * MERGE CONFLICT: Cannot change approval from "
-            "${preapproval["from"]} to ${preapproval["result"]} "
-            "because it's currently ${record["result"]}");
-        changelistsWithMergeConflicts.add(changelist);
-        numberOfMergeConflicts++;
-        totalNumberOfMergeConflicts++;
-      }
-    }
-    if (0 < numberOfPreapprovals) {
-      print("$numberOfPreapprovals "
-          "pre-approvals applied from $changelistUrl commit $commit");
-    }
-    if (0 < numberOfMergeConflicts) {
-      print("Warning: $numberOfMergeConflicts "
-          "merge conflicts in pre-approvals for $changelistUrl commit $commit");
-    }
-  }
-
-  // Expire old pre-approvals.
-  final now = new DateTime.now().toUtc();
-  final expiredChangelists = <String>{};
-  for (final record in approvals.values) {
-    final preapprovals = record["preapprovals"];
-    final changelists = preapprovals.keys.toList();
-    for (final changelist in changelists) {
-      final preapproval = preapprovals[changelist];
-      final expires = DateTime.parse(preapproval["expires"]);
-      if (expires.isBefore(now)) {
-        updated = true;
-        preapprovals.remove(changelist);
-        expiredChangelists.add(changelist);
-      }
-    }
-  }
-  if (expiredChangelists.isNotEmpty) {
-    print("");
-  }
-  for (final changelist in expiredChangelists) {
-    final changelistUrl = "https://dart-review.googlesource.com/q/$changelist";
-    print("Expired: Pre-approvals for changelist $changelistUrl have expired");
-  }
-
-  // Format a final report.
-  print("");
-  final landedChangelistsCount = landedChangelists.length;
-  if (0 < landedChangelistsCount) {
-    print("$landedChangelistsCount changelists have landed");
-  }
-  final expiredChangelistsCount = expiredChangelists.length;
-  if (0 < expiredChangelistsCount) {
-    print("$expiredChangelistsCount changelists have expired");
-  }
-  final unlandedChangelistsCount =
-      unlandedChangelists.length - expiredChangelistsCount;
-  if (0 < unlandedChangelistsCount) {
-    print("$unlandedChangelistsCount changelists are pending");
-  }
-  if (0 < totalNumberOfPreapprovals) {
-    print("$totalNumberOfPreapprovals pre-approvals applied");
-  }
-  if (0 < totalNumberOfPreapprovals) {
-    print("Warning: $totalNumberOfMergeConflicts "
-        "pre-approvals had merge conflicts");
-  }
-
-  // Save the updated approvals and upload them to cloud storage.
-  print("");
-  if (!updated) {
-    print("Approvals are unchanged");
-    return;
-  }
-  if (options["dry"]) {
-    print("Dry run, not saving the updated approvals");
-    return;
-  }
-  await new File(approvalsPath).writeAsString(
-      approvals.values.map((data) => jsonEncode(data) + "\n").join(""));
-  print("Wrote updated approvals to $approvalsPath");
-  if (options["upload"] != null) {
-    print("Uploading updated approvals to ${options["upload"]}...");
-    await cpGsutil(approvalsPath, options["upload"]);
-    print("Uploaded updated approvals to ${options["upload"]}");
-  }
-}
diff --git a/tools/bots/get_builder_status.dart b/tools/bots/get_builder_status.dart
index 9ec200e..cb0d3c4 100755
--- a/tools/bots/get_builder_status.dart
+++ b/tools/bots/get_builder_status.dart
@@ -16,12 +16,20 @@
 import 'package:http/http.dart' as http;
 
 const numAttempts = 20;
+const failuresPerConfiguration = 20;
 const queryUrl = 'https://firestore.googleapis.com/v1/'
     'projects/dart-ci/databases/(default)/documents:runQuery';
 String builder;
+String builderBase;
+int buildNumber;
 String token;
+List<String> configurations;
+Map<String, List<Map<String, dynamic>>> failures = {};
 http.Client client;
 
+String get buildTable => builder.endsWith('-try') ? 'try_builds' : 'builds';
+String get resultsTable => builder.endsWith('-try') ? 'try_results' : 'results';
+
 bool booleanFieldOrFalse(Map<String, dynamic> document, String field) {
   Map<String, dynamic> fieldObject = document['fields'][field];
   if (fieldObject == null) return false;
@@ -54,42 +62,15 @@
   }
 
   builder = options['builder'];
-  final buildNumber = options['build_number'];
-  final table = builder.endsWith('-try') ? 'try_builds' : 'builds';
+  buildNumber = int.parse(options['build_number']);
+  builderBase = builder.replaceFirst(RegExp('-try\$'), '');
   token = await File(options['auth_token']).readAsString();
   client = http.Client();
-  final query = {
-    'from': [
-      {'collectionId': table}
-    ],
-    'limit': 1,
-    'where': {
-      'compositeFilter': {
-        'op': 'AND',
-        'filters': [
-          {
-            'fieldFilter': {
-              'field': {'fieldPath': 'build_number'},
-              'op': 'EQUAL',
-              'value': {'integerValue': buildNumber}
-            }
-          },
-          {
-            'fieldFilter': {
-              'field': {'fieldPath': 'builder'},
-              'op': 'EQUAL',
-              'value': {'stringValue': builder}
-            }
-          }
-        ]
-      }
-    }
-  };
   for (int count = 0; count < numAttempts; ++count) {
     if (count > 0) {
       await Future.delayed(Duration(seconds: 10));
     }
-    final response = await runFirestoreQuery(query);
+    final response = await runFirestoreQuery(buildQuery());
     if (response.statusCode == HttpStatus.ok) {
       final documents = jsonDecode(response.body);
       final document = documents.first['document'];
@@ -102,11 +83,11 @@
             print('No unapproved new failures');
             if (activeFailures == true) {
               print('There are unapproved failures from previous builds');
-              await printResultsFeedLink();
+              await printResults();
             }
           } else {
             print('There are unapproved new failures on this build');
-            await printResultsFeedLink();
+            await printResults();
           }
           exit((success && (activeFailures != true)) ? 0 : 1);
         }
@@ -135,48 +116,198 @@
   exit(2);
 }
 
-void printResultsFeedLink() async {
+void printResults() async {
   if (builder.endsWith('-try')) return;
-  final query = {
-    'from': [
-      {'collectionId': 'configurations'}
-    ],
-    'where': {
-      'fieldFilter': {
-        'field': {'fieldPath': 'builder'},
-        'op': 'EQUAL',
-        'value': {'stringValue': builder}
-      }
-    }
-  };
-  final response = await runFirestoreQuery(query);
+  configurations = await getConfigurations();
+  await printActiveFailures();
+  await printResultsFeedLink();
+}
+
+Future<List<String>> getConfigurations() async {
+  final response = await runFirestoreQuery(configurationsQuery());
   if (response.statusCode == HttpStatus.ok) {
     final documents = jsonDecode(response.body);
     final groups = <String>{
       for (Map document in documents)
         if (document.containsKey('document'))
-          document['document']['name'].split('/').last.split('-').first
+          document['document']['name'].split('/').last
     };
-    String fragment = [
-      'showLatestFailures=true',
-      'showUnapprovedOnly=true',
-      if (groups.isNotEmpty) 'configurationGroups=${groups.join(',')}'
-    ].join('&');
-    final link = 'https://dart-ci.firebaseapp.com/#$fragment';
-    print('Failures link: $link');
-  } else {
-    print('HTTP status ${response.statusCode} received '
-        'when fetching configurations for results feed link');
-    print('HTTP response: ${response.body}');
+    return groups.toList();
+  }
+  print('Could not fetch configurations for $builderBase');
+  return [];
+}
+
+Map<int, Future<String>> commitHashes = {};
+Future<String> commitHash(int index) =>
+    commitHashes.putIfAbsent(index, () => fetchCommitHash(index));
+
+Future<String> fetchCommitHash(int index) async {
+  final response = await runFirestoreQuery(commitQuery(index));
+  if (response.statusCode == HttpStatus.ok) {
+    final document = jsonDecode(response.body).first['document'];
+    if (document != null) {
+      return document['name'].split('/').last;
+    }
+  }
+  print('Could not fetch commit with index $index');
+  return 'missing hash for commit $index';
+}
+
+Future<void> printActiveFailures() async {
+  for (final configuration in configurations) {
+    final response =
+        await runFirestoreQuery(unapprovedFailuresQuery(configuration));
+    if (response.statusCode == HttpStatus.ok) {
+      final documents = jsonDecode(response.body);
+      for (final documentItem in documents) {
+        final document = documentItem['document'];
+        if (document == null) continue;
+        final fields = document['fields'];
+        failures.putIfAbsent(configuration, () => []).add({
+          'name': fields['name']['stringValue'],
+          'start': int.parse(fields['blamelist_start_index']['integerValue']),
+          'end': int.parse(fields['blamelist_end_index']['integerValue']),
+          'result': fields['result']['stringValue'],
+          'expected': fields['expected']['stringValue'],
+          'previous': fields['previous_result']['stringValue'],
+        });
+      }
+    }
+  }
+  for (final configuration in failures.keys) {
+    print('($configuration):');
+    for (final failure in failures[configuration]) {
+      print([
+        '    ',
+        failure['name'],
+        '   (',
+        failure['previous'],
+        ' -> ',
+        failure['result'],
+        ', expected ',
+        failure['expected'],
+        ') at ',
+        (await commitHash(failure['start'])).substring(0, 6),
+        if (failure['start'] != failure['end']) ...[
+          '..',
+          (await commitHash(failure['end'])).substring(0, 6)
+        ]
+      ].join(''));
+    }
   }
 }
 
-Future<http.Response> runFirestoreQuery(Map<String, dynamic> query) {
-  final json = jsonEncode({'structuredQuery': query});
+void printResultsFeedLink() async {
+  if (builder.endsWith('-try')) return;
+  final groups = {
+    for (final configuration in configurations) configuration.split('-').first
+  };
+  String fragment = [
+    'showLatestFailures=true',
+    'showUnapprovedOnly=true',
+    if (groups.isNotEmpty) 'configurationGroups=${groups.join(',')}'
+  ].join('&');
+  final link = 'https://dart-ci.firebaseapp.com/#$fragment';
+  print('\nFailures link: $link');
+}
+
+Future<http.Response> runFirestoreQuery(String query) {
   final headers = {
     'Authorization': 'Bearer $token',
     'Accept': 'application/json',
     'Content-Type': 'application/json'
   };
-  return client.post(queryUrl, headers: headers, body: json);
+  return client.post(queryUrl, headers: headers, body: query);
 }
+
+String buildQuery() => jsonEncode({
+      'structuredQuery': {
+        'from': [
+          {'collectionId': buildTable}
+        ],
+        'limit': 1,
+        'where': {
+          'compositeFilter': {
+            'op': 'AND',
+            'filters': [
+              {
+                'fieldFilter': {
+                  'field': {'fieldPath': 'build_number'},
+                  'op': 'EQUAL',
+                  'value': {'integerValue': buildNumber}
+                }
+              },
+              {
+                'fieldFilter': {
+                  'field': {'fieldPath': 'builder'},
+                  'op': 'EQUAL',
+                  'value': {'stringValue': builder}
+                }
+              }
+            ]
+          }
+        }
+      }
+    });
+
+String configurationsQuery() => jsonEncode({
+      'structuredQuery': {
+        'from': [
+          {'collectionId': 'configurations'}
+        ],
+        'where': {
+          'fieldFilter': {
+            'field': {'fieldPath': 'builder'},
+            'op': 'EQUAL',
+            'value': {'stringValue': builderBase}
+          }
+        }
+      }
+    });
+
+String unapprovedFailuresQuery(String configuration) => jsonEncode({
+      'structuredQuery': {
+        'from': [
+          {'collectionId': resultsTable}
+        ],
+        'limit': failuresPerConfiguration,
+        'where': {
+          'compositeFilter': {
+            'op': 'AND',
+            'filters': [
+              {
+                'fieldFilter': {
+                  'field': {'fieldPath': 'active_configurations'},
+                  'op': 'ARRAY_CONTAINS',
+                  'value': {'stringValue': configuration}
+                }
+              },
+              {
+                'fieldFilter': {
+                  'field': {'fieldPath': 'approved'},
+                  'op': 'EQUAL',
+                  'value': {'booleanValue': false}
+                }
+              }
+            ]
+          }
+        }
+      }
+    });
+
+String commitQuery(int index) => jsonEncode({
+      'structuredQuery': {
+        'from': [
+          {'collectionId': 'commits'}
+        ],
+        'limit': 1,
+        'where': {
+          'fieldFilter': {
+            'field': {'fieldPath': 'index'},
+            'op': 'EQUAL',
+            'value': {'integerValue': index}
+          }
+        }
+      }
+    });
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index ae16586..f233f772 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -529,7 +529,7 @@
           "non-nullable"
         ],
         "dart2js-options": [
-          "--no-runtime-null-safety"
+          "--no-null-safety"
         ],
         "use-sdk": true
       }
@@ -582,14 +582,14 @@
         "host-checked": true
       }
     },
-    "dart2js-hostasserts-weak-(linux|mac|win)-x64-d8": {
+    "dart2js-hostasserts-weak-(linux|mac|win)-x64-(d8|chrome)": {
       "options": {
         "builder-tag": "dart2js-weak",
         "enable-experiment": [
           "non-nullable"
         ],
         "dart2js-options": [
-          "--no-runtime-null-safety"
+          "--no-null-safety"
         ],
         "host-checked": true
       }
@@ -1302,6 +1302,15 @@
           "shards": 6
         },
         {
+          "name": "vm co19_2 tests",
+          "arguments": [
+            "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel-nnbd",
+          "shards": 10
+        },
+        {
           "name": "vm weak tests with asserts",
           "arguments": [
             "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
@@ -1315,10 +1324,44 @@
     },
     {
       "builders": [
+        "vm-kernel-precomp-linux-release-x64"
+      ],
+      "meta": {
+        "description": "This configuration is used by the vm kernel precomp linux release builders. (includes co19_2 testing)"
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "runtime_kernel",
+            "dart_precompiled_runtime"
+          ]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "-ndartkp-${system}-${mode}-${arch}"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 6
+        },
+        {
+          "name": "vm co19_2 tests",
+          "arguments": [
+            "-ndartkp-${system}-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-kernel-precomp-linux-product-x64",
         "vm-kernel-precomp-linux-release-simarm",
         "vm-kernel-precomp-linux-release-simarm64",
-        "vm-kernel-precomp-linux-release-x64",
         "vm-kernel-precomp-mac-release-simarm64",
         "vm-kernel-precomp-win-release-x64"
       ],
@@ -2519,6 +2562,26 @@
           ],
           "shards": 6,
           "fileset": "dart2js_hostasserts_nnbd"
+        },
+        {
+          "name": "dart2js legacy weak lib tests",
+          "arguments": [
+            "-ndart2js-hostasserts-weak-linux-x64-chrome",
+            "--dart2js-batch",
+            "lib_2"
+          ],
+          "shards": 3,
+          "fileset": "dart2js_hostasserts_nnbd"
+        },
+        {
+          "name": "dart2js legacy weak co19 tests",
+          "arguments": [
+            "-ndart2js-hostasserts-weak-linux-x64-chrome",
+            "--dart2js-batch",
+            "co19_2"
+          ],
+          "shards": 6,
+          "fileset": "dart2js_hostasserts_nnbd"
         }
       ]
     },
@@ -2833,20 +2896,22 @@
           "name": "analyze nnbd strong tests enable-asserts",
           "arguments": [
             "-nanalyzer-asserts-strong-${system}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
-            "standalone/io"
+            "lib",
+            "standalone"
           ]
         },
         {
           "name": "analyze nnbd weak tests enable-asserts",
           "arguments": [
             "-nanalyzer-asserts-weak-${system}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
-            "standalone/io"
+            "lib",
+            "standalone"
           ]
         },
         {
diff --git a/tools/patches/flutter-engine/0299903f3e78ab6eb1d7d5ed1a70a039b3646913.patch b/tools/patches/flutter-engine/0299903f3e78ab6eb1d7d5ed1a70a039b3646913.patch
deleted file mode 100644
index d7249cf..0000000
--- a/tools/patches/flutter-engine/0299903f3e78ab6eb1d7d5ed1a70a039b3646913.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/DEPS b/DEPS
-index f2b3cc9..88557e8 100644
---- a/DEPS
-+++ b/DEPS
-@@ -72,6 +72,6 @@ vars = {
-   'dart_oauth2_tag': '1.2.1',
-   'dart_observatory_pub_packages_rev': '0894122173b0f98eb08863a7712e78407d4477bc',
--  'dart_package_config_tag': '2453cd2e78c2db56ee2669ced17ce70dd00bf576',
-+  'dart_package_config_tag': '3401e2897b3cf46e64966e2ba19ed7032501cf41',
-   'dart_package_resolver_tag': '1.0.10',
-   'dart_path_tag': '1.6.2',
-   'dart_pedantic_tag': 'v1.8.0',
- 
diff --git a/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch b/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch
deleted file mode 100644
index 3e47909..0000000
--- a/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch
+++ /dev/null
@@ -1,221 +0,0 @@
-diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc
-index 96ac6facd..b649ca834 100644
---- a/runtime/dart_isolate.cc
-+++ b/runtime/dart_isolate.cc
-@@ -163,7 +163,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
-   }
- 
-   auto* isolate_data = static_cast<std::shared_ptr<DartIsolate>*>(
--      Dart_IsolateData(dart_isolate));
-+      Dart_IsolateGroupData(dart_isolate));
-   if (isolate_data->get() != this) {
-     return false;
-   }
-@@ -174,7 +174,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
-   // We are entering a new scope (for the first time since initialization) and
-   // we want to restore the current scope to null when we exit out of this
-   // method. This balances the implicit Dart_EnterIsolate call made by
--  // Dart_CreateIsolate (which calls the Initialize).
-+  // Dart_CreateIsolateGroup (which calls the Initialize).
-   Dart_ExitIsolate();
- 
-   tonic::DartIsolateScope scope(isolate());
-@@ -636,8 +636,8 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate(
-   return service_isolate->isolate();
- }
- 
--// |Dart_IsolateCreateCallback|
--Dart_Isolate DartIsolate::DartIsolateCreateCallback(
-+// |Dart_IsolateGroupCreateCallback|
-+Dart_Isolate DartIsolate::DartIsolateGroupCreateCallback(
-     const char* advisory_script_uri,
-     const char* advisory_script_entrypoint,
-     const char* package_root,
-@@ -720,14 +720,16 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
-   }
- 
-   // Create the Dart VM isolate and give it the embedder object as the baton.
--  Dart_Isolate isolate = Dart_CreateIsolate(
-+  Dart_Isolate isolate = Dart_CreateIsolateGroup(
-       advisory_script_uri,         //
-       advisory_script_entrypoint,  //
-       (*embedder_isolate)->GetIsolateSnapshot()->GetDataMapping(),
-       (*embedder_isolate)->GetIsolateSnapshot()->GetInstructionsMapping(),
-       (*embedder_isolate)->GetSharedSnapshot()->GetDataMapping(),
-       (*embedder_isolate)->GetSharedSnapshot()->GetInstructionsMapping(), flags,
--      embedder_isolate.get(), error);
-+      embedder_isolate.get(),  // isolate_group_data
-+      embedder_isolate.get(),  // isolate_data
-+      error);
- 
-   if (isolate == nullptr) {
-     FML_DLOG(ERROR) << *error;
-@@ -775,10 +777,10 @@ void DartIsolate::DartIsolateShutdownCallback(
-   isolate_group_data->get()->OnShutdownCallback();
- }
- 
--// |Dart_IsolateCleanupCallback|
--void DartIsolate::DartIsolateCleanupCallback(
--    std::shared_ptr<DartIsolate>* isolate_data) {
--  delete isolate_data;
-+// |Dart_IsolateGroupCleanupCallback|
-+void DartIsolate::DartIsolateGroupCleanupCallback(
-+    std::shared_ptr<DartIsolate>* isolate_group_data) {
-+  delete isolate_group_data;
- }
- 
- fml::RefPtr<const DartSnapshot> DartIsolate::GetIsolateSnapshot() const {
-diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h
-index 60412972a..453810b1b 100644
---- a/runtime/dart_isolate.h
-+++ b/runtime/dart_isolate.h
-@@ -156,8 +156,8 @@ class DartIsolate : public UIDartState {
- 
-   void OnShutdownCallback();
- 
--  // |Dart_IsolateCreateCallback|
--  static Dart_Isolate DartIsolateCreateCallback(
-+  // |Dart_IsolateGroupCreateCallback|
-+  static Dart_Isolate DartIsolateGroupCreateCallback(
-       const char* advisory_script_uri,
-       const char* advisory_script_entrypoint,
-       const char* package_root,
-@@ -189,9 +189,9 @@ class DartIsolate : public UIDartState {
-       std::shared_ptr<DartIsolate>* isolate_group_data,
-       std::shared_ptr<DartIsolate>* isolate_data);
- 
--  // |Dart_IsolateCleanupCallback|
--  static void DartIsolateCleanupCallback(
--      std::shared_ptr<DartIsolate>* embedder_isolate);
-+  // |Dart_IsolateGroupCleanupCallback|
-+  static void DartIsolateGroupCleanupCallback(
-+      std::shared_ptr<DartIsolate>* isolate_group_data);
- 
-   FML_DISALLOW_COPY_AND_ASSIGN(DartIsolate);
- };
-diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc
-index 903e74b15..555d0c9ee 100644
---- a/runtime/dart_vm.cc
-+++ b/runtime/dart_vm.cc
-@@ -366,12 +366,13 @@ DartVM::DartVM(std::shared_ptr<const DartVMData> vm_data,
-     params.vm_snapshot_data = vm_data_->GetVMSnapshot().GetDataMapping();
-     params.vm_snapshot_instructions =
-         vm_data_->GetVMSnapshot().GetInstructionsMapping();
--    params.create = reinterpret_cast<decltype(params.create)>(
--        DartIsolate::DartIsolateCreateCallback);
--    params.shutdown = reinterpret_cast<decltype(params.shutdown)>(
--        DartIsolate::DartIsolateShutdownCallback);
--    params.cleanup = reinterpret_cast<decltype(params.cleanup)>(
--        DartIsolate::DartIsolateCleanupCallback);
-+    params.create_group = reinterpret_cast<decltype(params.create_group)>(
-+        DartIsolate::DartIsolateGroupCreateCallback);
-+    params.shutdown_isolate =
-+        reinterpret_cast<decltype(params.shutdown_isolate)>(
-+            DartIsolate::DartIsolateShutdownCallback);
-+    params.cleanup_group = reinterpret_cast<decltype(params.cleanup_group)>(
-+        DartIsolate::DartIsolateGroupCleanupCallback);
-     params.thread_exit = ThreadExitCallback;
-     params.get_service_assets = GetVMServiceAssetsArchiveCallback;
-     params.entropy_source = dart::bin::GetEntropy;
-diff --git a/shell/platform/fuchsia/dart/dart_component_controller.cc b/shell/platform/fuchsia/dart/dart_component_controller.cc
-index 1c4f71050..c8e7cc5ab 100644
---- a/shell/platform/fuchsia/dart/dart_component_controller.cc
-+++ b/shell/platform/fuchsia/dart/dart_component_controller.cc
-@@ -324,12 +324,13 @@ bool DartComponentController::CreateIsolate(
-   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState(
-       namespace_fd, [this](Dart_Handle result) { MessageEpilogue(result); }));
- 
--  isolate_ = Dart_CreateIsolate(
-+  isolate_ = Dart_CreateIsolateGroup(
-       url_.c_str(), label_.c_str(), isolate_snapshot_data,
-       isolate_snapshot_instructions, shared_snapshot_data,
--      shared_snapshot_instructions, nullptr /* flags */, state, &error);
-+      shared_snapshot_instructions, nullptr /* flags */,
-+      state /* isolate_group_data */, state /* isolate_data */, &error);
-   if (!isolate_) {
--    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", error);
-+    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", error);
-     return false;
-   }
- 
-diff --git a/shell/platform/fuchsia/dart/dart_runner.cc b/shell/platform/fuchsia/dart/dart_runner.cc
-index 200500d2c..b9ded3ac4 100644
---- a/shell/platform/fuchsia/dart/dart_runner.cc
-+++ b/shell/platform/fuchsia/dart/dart_runner.cc
-@@ -61,13 +61,13 @@ const char* kDartVMArgs[] = {
-     // clang-format on
- };
- 
--Dart_Isolate IsolateCreateCallback(const char* uri,
--                                   const char* name,
--                                   const char* package_root,
--                                   const char* package_config,
--                                   Dart_IsolateFlags* flags,
--                                   void* callback_data,
--                                   char** error) {
-+Dart_Isolate IsolateGroupCreateCallback(const char* uri,
-+                                        const char* name,
-+                                        const char* package_root,
-+                                        const char* package_config,
-+                                        Dart_IsolateFlags* flags,
-+                                        void* callback_data,
-+                                        char** error) {
-   if (std::string(uri) == DART_VM_SERVICE_ISOLATE_NAME) {
- #if defined(DART_PRODUCT)
-     *error = strdup("The service isolate is not implemented in product mode");
-@@ -81,7 +81,7 @@ Dart_Isolate IsolateCreateCallback(const char* uri,
-   return NULL;
- }
- 
--void IsolateShutdownCallback(void* callback_data) {
-+void IsolateShutdownCallback(void* isolate_group_data, void* isolate_data) {
-   // The service isolate (and maybe later the kernel isolate) doesn't have an
-   // async loop.
-   auto dispatcher = async_get_default_dispatcher();
-@@ -92,8 +92,8 @@ void IsolateShutdownCallback(void* callback_data) {
-   }
- }
- 
--void IsolateCleanupCallback(void* callback_data) {
--  delete static_cast<std::shared_ptr<tonic::DartState>*>(callback_data);
-+void IsolateGroupCleanupCallback(void* isolate_group_data) {
-+  delete static_cast<std::shared_ptr<tonic::DartState>*>(isolate_group_data);
- }
- 
- void RunApplication(
-@@ -167,9 +167,9 @@ DartRunner::DartRunner() : context_(sys::ComponentContext::Create()) {
-   params.vm_snapshot_data = vm_snapshot_data_.address();
-   params.vm_snapshot_instructions = vm_snapshot_instructions_.address();
- #endif
--  params.create = IsolateCreateCallback;
--  params.shutdown = IsolateShutdownCallback;
--  params.cleanup = IsolateCleanupCallback;
-+  params.create_group = IsolateGroupCreateCallback;
-+  params.shutdown_isolate = IsolateShutdownCallback;
-+  params.cleanup_group = IsolateGroupCleanupCallback;
-   params.entropy_source = EntropySource;
- #if !defined(DART_PRODUCT)
-   params.get_service_assets = GetVMServiceAssetsArchiveCallback;
-diff --git a/shell/platform/fuchsia/dart/service_isolate.cc b/shell/platform/fuchsia/dart/service_isolate.cc
-index 2e6eda265..5287d638f 100644
---- a/shell/platform/fuchsia/dart/service_isolate.cc
-+++ b/shell/platform/fuchsia/dart/service_isolate.cc
-@@ -123,14 +123,14 @@ Dart_Isolate CreateServiceIsolate(const char* uri,
- #endif
- 
-   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState());
--  Dart_Isolate isolate = Dart_CreateIsolate(
-+  Dart_Isolate isolate = Dart_CreateIsolateGroup(
-       uri, DART_VM_SERVICE_ISOLATE_NAME, mapped_isolate_snapshot_data.address(),
-       mapped_isolate_snapshot_instructions.address(),
-       mapped_shared_snapshot_data.address(),
--      mapped_shared_snapshot_instructions.address(), nullptr /* flags */, state,
--      error);
-+      mapped_shared_snapshot_instructions.address(), nullptr /* flags */,
-+      state /* isolate_group_data */, state /* isolate_data */, error);
-   if (!isolate) {
--    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", *error);
-+    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", *error);
-     return nullptr;
-   }
- 
diff --git a/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch b/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch
deleted file mode 100644
index bceade5..0000000
--- a/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-diff --git a/DEPS b/DEPS
-index c395874b2..36f4de34b 100644
---- a/DEPS
-+++ b/DEPS
-@@ -96,6 +96,7 @@ vars = {
-   'dart_term_glyph_tag': '1.0.1',
-   'dart_test_reflective_loader_tag': '0.1.8',
-   'dart_test_tag': 'test-v1.6.4',
-+  'dart_tflite_native_rev': '712b8a93fbb4caf83ffed37f154da88c2a517a91',
-   'dart_typed_data_tag': '1.1.6',
-   'dart_usage_tag': '3.4.0',
-   'dart_watcher_rev': '0.9.7+12-pub',
-@@ -343,6 +344,9 @@ deps = {
-   'src/third_party/dart/third_party/pkg/test':
-    Var('dart_git') + '/test.git' + '@' + Var('dart_test_tag'),
- 
-+  'src/third_party/dart/third_party/pkg/tflite_native':
-+   Var('dart_git') + '/tflite_native.git' + '@' + Var('dart_tflite_native_rev'),
-+
-   'src/third_party/dart/third_party/pkg/test_reflective_loader':
-    Var('dart_git') + '/test_reflective_loader.git' + '@' + Var('dart_test_reflective_loader_tag'),
- 
-@@ -491,6 +495,16 @@ deps = {
-      'dep_type': 'cipd',
-    },
- 
-+   'src/third_party/dart/pkg/analysis_server/language_model': {
-+     'packages': [
-+       {
-+        'package': 'dart/language_model',
-+        'version': 'gABkW8D_-f45it57vQ_ZTKFwev16RcCjvrdTCytEnQgC',
-+       }
-+     ],
-+     'dep_type': 'cipd',
-+   },
-+
-   'src/flutter/third_party/gn': {
-     'packages': [
-       {
diff --git a/tools/patches/flutter-engine/67ab3be10d35d994641da167cc806f20a7ffa679.patch b/tools/patches/flutter-engine/67ab3be10d35d994641da167cc806f20a7ffa679.patch
deleted file mode 100644
index d4fdc59..0000000
--- a/tools/patches/flutter-engine/67ab3be10d35d994641da167cc806f20a7ffa679.patch
+++ /dev/null
@@ -1,232 +0,0 @@
-diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc
-index b649ca834..e181dd55b 100644
---- a/runtime/dart_isolate.cc
-+++ b/runtime/dart_isolate.cc
-@@ -163,7 +163,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
-   }
- 
-   auto* isolate_data = static_cast<std::shared_ptr<DartIsolate>*>(
--      Dart_IsolateGroupData(dart_isolate));
-+      Dart_IsolateData(dart_isolate));
-   if (isolate_data->get() != this) {
-     return false;
-   }
-@@ -174,7 +174,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
-   // We are entering a new scope (for the first time since initialization) and
-   // we want to restore the current scope to null when we exit out of this
-   // method. This balances the implicit Dart_EnterIsolate call made by
--  // Dart_CreateIsolateGroup (which calls the Initialize).
-+  // Dart_CreateIsolate (which calls the Initialize).
-   Dart_ExitIsolate();
- 
-   tonic::DartIsolateScope scope(isolate());
-@@ -636,8 +636,8 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate(
-   return service_isolate->isolate();
- }
- 
--// |Dart_IsolateGroupCreateCallback|
--Dart_Isolate DartIsolate::DartIsolateGroupCreateCallback(
-+// |Dart_IsolateCreateCallback|
-+Dart_Isolate DartIsolate::DartIsolateCreateCallback(
-     const char* advisory_script_uri,
-     const char* advisory_script_entrypoint,
-     const char* package_root,
-@@ -720,16 +720,14 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
-   }
- 
-   // Create the Dart VM isolate and give it the embedder object as the baton.
--  Dart_Isolate isolate = Dart_CreateIsolateGroup(
-+  Dart_Isolate isolate = Dart_CreateIsolate(
-       advisory_script_uri,         //
-       advisory_script_entrypoint,  //
-       (*embedder_isolate)->GetIsolateSnapshot()->GetDataMapping(),
-       (*embedder_isolate)->GetIsolateSnapshot()->GetInstructionsMapping(),
-       (*embedder_isolate)->GetSharedSnapshot()->GetDataMapping(),
-       (*embedder_isolate)->GetSharedSnapshot()->GetInstructionsMapping(), flags,
--      embedder_isolate.get(),  // isolate_group_data
--      embedder_isolate.get(),  // isolate_data
--      error);
-+      embedder_isolate.get(), error);
- 
-   if (isolate == nullptr) {
-     FML_DLOG(ERROR) << *error;
-@@ -772,15 +770,14 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
- 
- // |Dart_IsolateShutdownCallback|
- void DartIsolate::DartIsolateShutdownCallback(
--    std::shared_ptr<DartIsolate>* isolate_group_data,
--    std::shared_ptr<DartIsolate>* isolate_data) {
--  isolate_group_data->get()->OnShutdownCallback();
-+    std::shared_ptr<DartIsolate>* embedder_isolate) {
-+  embedder_isolate->get()->OnShutdownCallback();
- }
- 
--// |Dart_IsolateGroupCleanupCallback|
--void DartIsolate::DartIsolateGroupCleanupCallback(
--    std::shared_ptr<DartIsolate>* isolate_group_data) {
--  delete isolate_group_data;
-+// |Dart_IsolateCleanupCallback|
-+void DartIsolate::DartIsolateCleanupCallback(
-+    std::shared_ptr<DartIsolate>* embedder_isolate) {
-+  delete embedder_isolate;
- }
- 
- fml::RefPtr<const DartSnapshot> DartIsolate::GetIsolateSnapshot() const {
-diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h
-index 453810b1b..407852dc2 100644
---- a/runtime/dart_isolate.h
-+++ b/runtime/dart_isolate.h
-@@ -156,8 +156,8 @@ class DartIsolate : public UIDartState {
- 
-   void OnShutdownCallback();
- 
--  // |Dart_IsolateGroupCreateCallback|
--  static Dart_Isolate DartIsolateGroupCreateCallback(
-+  // |Dart_IsolateCreateCallback|
-+  static Dart_Isolate DartIsolateCreateCallback(
-       const char* advisory_script_uri,
-       const char* advisory_script_entrypoint,
-       const char* package_root,
-@@ -186,12 +186,11 @@ class DartIsolate : public UIDartState {
- 
-   // |Dart_IsolateShutdownCallback|
-   static void DartIsolateShutdownCallback(
--      std::shared_ptr<DartIsolate>* isolate_group_data,
--      std::shared_ptr<DartIsolate>* isolate_data);
-+      std::shared_ptr<DartIsolate>* embedder_isolate);
- 
--  // |Dart_IsolateGroupCleanupCallback|
--  static void DartIsolateGroupCleanupCallback(
--      std::shared_ptr<DartIsolate>* isolate_group_data);
-+  // |Dart_IsolateCleanupCallback|
-+  static void DartIsolateCleanupCallback(
-+      std::shared_ptr<DartIsolate>* embedder_isolate);
- 
-   FML_DISALLOW_COPY_AND_ASSIGN(DartIsolate);
- };
-diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc
-index 555d0c9ee..903e74b15 100644
---- a/runtime/dart_vm.cc
-+++ b/runtime/dart_vm.cc
-@@ -366,13 +366,12 @@ DartVM::DartVM(std::shared_ptr<const DartVMData> vm_data,
-     params.vm_snapshot_data = vm_data_->GetVMSnapshot().GetDataMapping();
-     params.vm_snapshot_instructions =
-         vm_data_->GetVMSnapshot().GetInstructionsMapping();
--    params.create_group = reinterpret_cast<decltype(params.create_group)>(
--        DartIsolate::DartIsolateGroupCreateCallback);
--    params.shutdown_isolate =
--        reinterpret_cast<decltype(params.shutdown_isolate)>(
--            DartIsolate::DartIsolateShutdownCallback);
--    params.cleanup_group = reinterpret_cast<decltype(params.cleanup_group)>(
--        DartIsolate::DartIsolateGroupCleanupCallback);
-+    params.create = reinterpret_cast<decltype(params.create)>(
-+        DartIsolate::DartIsolateCreateCallback);
-+    params.shutdown = reinterpret_cast<decltype(params.shutdown)>(
-+        DartIsolate::DartIsolateShutdownCallback);
-+    params.cleanup = reinterpret_cast<decltype(params.cleanup)>(
-+        DartIsolate::DartIsolateCleanupCallback);
-     params.thread_exit = ThreadExitCallback;
-     params.get_service_assets = GetVMServiceAssetsArchiveCallback;
-     params.entropy_source = dart::bin::GetEntropy;
-diff --git a/shell/platform/fuchsia/dart/dart_component_controller.cc b/shell/platform/fuchsia/dart/dart_component_controller.cc
-index c8e7cc5ab..1c4f71050 100644
---- a/shell/platform/fuchsia/dart/dart_component_controller.cc
-+++ b/shell/platform/fuchsia/dart/dart_component_controller.cc
-@@ -324,13 +324,12 @@ bool DartComponentController::CreateIsolate(
-   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState(
-       namespace_fd, [this](Dart_Handle result) { MessageEpilogue(result); }));
- 
--  isolate_ = Dart_CreateIsolateGroup(
-+  isolate_ = Dart_CreateIsolate(
-       url_.c_str(), label_.c_str(), isolate_snapshot_data,
-       isolate_snapshot_instructions, shared_snapshot_data,
--      shared_snapshot_instructions, nullptr /* flags */,
--      state /* isolate_group_data */, state /* isolate_data */, &error);
-+      shared_snapshot_instructions, nullptr /* flags */, state, &error);
-   if (!isolate_) {
--    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", error);
-+    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", error);
-     return false;
-   }
- 
-diff --git a/shell/platform/fuchsia/dart/dart_runner.cc b/shell/platform/fuchsia/dart/dart_runner.cc
-index b9ded3ac4..200500d2c 100644
---- a/shell/platform/fuchsia/dart/dart_runner.cc
-+++ b/shell/platform/fuchsia/dart/dart_runner.cc
-@@ -61,13 +61,13 @@ const char* kDartVMArgs[] = {
-     // clang-format on
- };
- 
--Dart_Isolate IsolateGroupCreateCallback(const char* uri,
--                                        const char* name,
--                                        const char* package_root,
--                                        const char* package_config,
--                                        Dart_IsolateFlags* flags,
--                                        void* callback_data,
--                                        char** error) {
-+Dart_Isolate IsolateCreateCallback(const char* uri,
-+                                   const char* name,
-+                                   const char* package_root,
-+                                   const char* package_config,
-+                                   Dart_IsolateFlags* flags,
-+                                   void* callback_data,
-+                                   char** error) {
-   if (std::string(uri) == DART_VM_SERVICE_ISOLATE_NAME) {
- #if defined(DART_PRODUCT)
-     *error = strdup("The service isolate is not implemented in product mode");
-@@ -81,7 +81,7 @@ Dart_Isolate IsolateGroupCreateCallback(const char* uri,
-   return NULL;
- }
- 
--void IsolateShutdownCallback(void* isolate_group_data, void* isolate_data) {
-+void IsolateShutdownCallback(void* callback_data) {
-   // The service isolate (and maybe later the kernel isolate) doesn't have an
-   // async loop.
-   auto dispatcher = async_get_default_dispatcher();
-@@ -92,8 +92,8 @@ void IsolateShutdownCallback(void* isolate_group_data, void* isolate_data) {
-   }
- }
- 
--void IsolateGroupCleanupCallback(void* isolate_group_data) {
--  delete static_cast<std::shared_ptr<tonic::DartState>*>(isolate_group_data);
-+void IsolateCleanupCallback(void* callback_data) {
-+  delete static_cast<std::shared_ptr<tonic::DartState>*>(callback_data);
- }
- 
- void RunApplication(
-@@ -167,9 +167,9 @@ DartRunner::DartRunner() : context_(sys::ComponentContext::Create()) {
-   params.vm_snapshot_data = vm_snapshot_data_.address();
-   params.vm_snapshot_instructions = vm_snapshot_instructions_.address();
- #endif
--  params.create_group = IsolateGroupCreateCallback;
--  params.shutdown_isolate = IsolateShutdownCallback;
--  params.cleanup_group = IsolateGroupCleanupCallback;
-+  params.create = IsolateCreateCallback;
-+  params.shutdown = IsolateShutdownCallback;
-+  params.cleanup = IsolateCleanupCallback;
-   params.entropy_source = EntropySource;
- #if !defined(DART_PRODUCT)
-   params.get_service_assets = GetVMServiceAssetsArchiveCallback;
-diff --git a/shell/platform/fuchsia/dart/service_isolate.cc b/shell/platform/fuchsia/dart/service_isolate.cc
-index 5287d638f..2e6eda265 100644
---- a/shell/platform/fuchsia/dart/service_isolate.cc
-+++ b/shell/platform/fuchsia/dart/service_isolate.cc
-@@ -123,14 +123,14 @@ Dart_Isolate CreateServiceIsolate(const char* uri,
- #endif
- 
-   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState());
--  Dart_Isolate isolate = Dart_CreateIsolateGroup(
-+  Dart_Isolate isolate = Dart_CreateIsolate(
-       uri, DART_VM_SERVICE_ISOLATE_NAME, mapped_isolate_snapshot_data.address(),
-       mapped_isolate_snapshot_instructions.address(),
-       mapped_shared_snapshot_data.address(),
--      mapped_shared_snapshot_instructions.address(), nullptr /* flags */,
--      state /* isolate_group_data */, state /* isolate_data */, error);
-+      mapped_shared_snapshot_instructions.address(), nullptr /* flags */, state,
-+      error);
-   if (!isolate) {
--    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", *error);
-+    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", *error);
-     return nullptr;
-   }
- 
diff --git a/tools/patches/flutter-engine/6a65ea9cad4b014f88d2f1be1b321db493725a1c.patch b/tools/patches/flutter-engine/6a65ea9cad4b014f88d2f1be1b321db493725a1c.patch
deleted file mode 100644
index a565233..0000000
--- a/tools/patches/flutter-engine/6a65ea9cad4b014f88d2f1be1b321db493725a1c.patch
+++ /dev/null
@@ -1,622 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 3e0e5d6dc52a..50e2d0298e18 100644
---- a/DEPS
-+++ b/DEPS
-@@ -42,8 +42,8 @@ vars = {
-   'dart_async_tag': '2.0.8',
-   'dart_bazel_worker_tag': 'bazel_worker-v0.1.20',
-   'dart_boolean_selector_tag': '1.0.4',
--  'dart_boringssl_gen_rev': 'bbf52f18f425e29b1185f2f6753bec02ed8c5880',
--  'dart_boringssl_rev': '702e2b6d3831486535e958f262a05c75a5cb312e',
-+  'dart_boringssl_gen_rev': 'b9e27cff1ff0803e97ab1f88764a83be4aa94a6d',
-+  'dart_boringssl_rev': '4dfd5af70191b068aebe567b8e29ce108cee85ce',
-   'dart_charcode_tag': 'v1.1.2',
-   'dart_cli_util_rev': '4ad7ccbe3195fd2583b30f86a86697ef61e80f41',
-   'dart_collection_tag': '1.14.11',
-diff --git a/ci/licenses_golden/licenses_third_party b/ci/licenses_golden/licenses_third_party
-index 13daa0f54247..e516f2420475 100644
---- a/ci/licenses_golden/licenses_third_party
-+++ b/ci/licenses_golden/licenses_third_party
-@@ -1,4 +1,4 @@
--Signature: bc14a6c15e2ed1c6819d722a808248b9
-+Signature: 5f2b1df54ae6e4ec5836a1d12bf7c70e
- 
- UNUSED LICENSES:
- 
-@@ -3256,6 +3256,7 @@ FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/p256-x86_64.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/p256-x86_64.h
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/fips_shared.lds
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/intcheck1.png
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/intcheck2.png
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/intcheck3.png
-@@ -3280,6 +3281,32 @@ FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCryp
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20170615.docx!/word/styles.xml
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20170615.docx!/word/theme/theme1.xml
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20170615.docx!/word/webSettings.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/[Content_Types].xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/_rels/.rels
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/customXml/_rels/item1.xml.rels
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/customXml/item1.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/customXml/itemProps1.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/docProps/app.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/docProps/core.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/docProps/thumbnail.emf
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/_rels/document.xml.rels
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/document.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/endnotes.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/fontTable.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/footer1.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/footer2.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/footer3.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/footnotes.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/header1.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/header2.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/header3.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/media/image1.png
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/media/image2.png
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/numbering.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/settings.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/styles.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/theme/theme1.xml
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20180730.docx!/word/webSettings.xml
- FILE: ../../../third_party/boringssl/src/crypto/obj/obj_mac.num
- FILE: ../../../third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S
- FILE: ../../../third_party/boringssl/src/crypto/rsa_extra/rsa_print.c
-@@ -3293,9 +3320,9 @@ FILE: ../../../third_party/boringssl/src/crypto/x509/some_names2.pem
- FILE: ../../../third_party/boringssl/src/crypto/x509/some_names3.pem
- FILE: ../../../third_party/boringssl/src/crypto/x509/x509_time_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/x509v3/v3_ocsp.c
--FILE: ../../../third_party/boringssl/src/fipstools/run_cavp.go
--FILE: ../../../third_party/boringssl/src/infra/config/cq.cfg
-+FILE: ../../../third_party/boringssl/src/go.mod
- FILE: ../../../third_party/boringssl/src/ssl/bio_ssl.cc
-+FILE: ../../../third_party/boringssl/src/ssl/ssl_c_test.c
- FILE: ../../../third_party/boringssl/src/util/all_tests.json
- FILE: ../../../third_party/boringssl/src/util/bot/UPDATING
- FILE: ../../../third_party/boringssl/src/util/bot/cmake-linux64.tar.gz.sha1
-@@ -3304,10 +3331,19 @@ FILE: ../../../third_party/boringssl/src/util/bot/cmake-win32.zip.sha1
- FILE: ../../../third_party/boringssl/src/util/bot/nasm-win32.exe.sha1
- FILE: ../../../third_party/boringssl/src/util/bot/perl-win32.zip.sha1
- FILE: ../../../third_party/boringssl/src/util/bot/sde-linux64.tar.bz2.sha1
-+FILE: ../../../third_party/boringssl/src/util/bot/sde-win32.tar.bz2.sha1
- FILE: ../../../third_party/boringssl/src/util/bot/yasm-win32.exe.sha1
- FILE: ../../../third_party/boringssl/src/util/doc.config
- FILE: ../../../third_party/boringssl/src/util/doc.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/delocate.peg.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp/acvp.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/interactive.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/parser.peg
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/parser.peg.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/hash.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/run_cavp.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/delocate/delocate.peg.go
- FILE: ../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart
- FILE: ../../../third_party/dart/sdk_nnbd/lib/_internal/vm/lib/bigint_patch.dart
- ----------------------------------------------------------------------------------------------------
-@@ -3462,6 +3498,28 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- 
-+The code in third_party/sike also carries the MIT license:
-+
-+Copyright (c) Microsoft Corporation. All rights reserved.
-+
-+Permission is hereby granted, free of charge, to any person obtaining a copy
-+of this software and associated documentation files (the "Software"), to deal
-+in the Software without restriction, including without limitation the rights
-+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+copies of the Software, and to permit persons to whom the Software is
-+furnished to do so, subject to the following conditions:
-+
-+The above copyright notice and this permission notice shall be included in all
-+copies or substantial portions of the Software.
-+
-+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+SOFTWARE
-+
- Licenses for support code
- 
- Parts of the TLS test suite are under the Go license. This code is not included
-@@ -4049,7 +4107,6 @@ FILE: ../../../third_party/boringssl/src/include/openssl/chacha.h
- FILE: ../../../third_party/boringssl/src/include/openssl/crypto.h
- FILE: ../../../third_party/boringssl/src/include/openssl/engine.h
- FILE: ../../../third_party/boringssl/src/include/openssl/hkdf.h
--FILE: ../../../third_party/boringssl/src/include/openssl/lhash_macros.h
- FILE: ../../../third_party/boringssl/src/include/openssl/objects.h
- FILE: ../../../third_party/boringssl/src/include/openssl/opensslconf.h
- FILE: ../../../third_party/boringssl/src/include/openssl/opensslv.h
-@@ -4226,41 +4283,41 @@ FILE: ../../../third_party/boringssl/src/crypto/rand_extra/rand_extra.c
- FILE: ../../../third_party/boringssl/src/crypto/x509/make_many_constraints.go
- FILE: ../../../third_party/boringssl/src/decrepit/cfb/cfb.c
- FILE: ../../../third_party/boringssl/src/decrepit/cfb/cfb_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_aes_gcm_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_aes_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_ctr_drbg_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_ecdsa2_keypair_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_ecdsa2_pkv_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_ecdsa2_siggen_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_ecdsa2_sigver_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_hmac_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_keywrap_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_main.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_rsa2_keygen_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_rsa2_siggen_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_rsa2_sigver_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_sha_monte_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_sha_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_tdes_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_test_util.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_test_util.h
--FILE: ../../../third_party/boringssl/src/fipstools/test_fips.c
- FILE: ../../../third_party/boringssl/src/include/openssl/is_boringssl.h
- FILE: ../../../third_party/boringssl/src/include/openssl/span.h
- FILE: ../../../third_party/boringssl/src/ssl/span_test.cc
- FILE: ../../../third_party/boringssl/src/ssl/ssl_versions.cc
- FILE: ../../../third_party/boringssl/src/tool/file.cc
- FILE: ../../../third_party/boringssl/src/tool/sign.cc
-+FILE: ../../../third_party/boringssl/src/util/ar/ar.go
- FILE: ../../../third_party/boringssl/src/util/check_imported_libraries.go
- FILE: ../../../third_party/boringssl/src/util/convert_comments.go
- FILE: ../../../third_party/boringssl/src/util/embed_test_data.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/ar.go
- FILE: ../../../third_party/boringssl/src/util/fipstools/break-hash.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/const.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/delocate.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/delocate.peg
--FILE: ../../../third_party/boringssl/src/util/fipstools/delocate_test.go
--FILE: ../../../third_party/boringssl/src/util/fipstools/inject-hash.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_aes_gcm_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_aes_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_ctr_drbg_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_hmac_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_keywrap_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_main.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_rsa2_keygen_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_rsa2_siggen_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_rsa2_sigver_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_sha_monte_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_sha_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_tdes_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_test_util.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_test_util.h
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/test_fips.c
-+FILE: ../../../third_party/boringssl/src/util/fipstools/delocate/delocate.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/delocate/delocate.peg
-+FILE: ../../../third_party/boringssl/src/util/fipstools/delocate/delocate_test.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/fipscommon/const.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/inject_hash/inject_hash.go
- ----------------------------------------------------------------------------------------------------
- Copyright (c) 2017, Google Inc.
- 
-@@ -4281,26 +4338,48 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- LIBRARY: boringssl
- ORIGIN: ../../../third_party/boringssl/src/crypto/bytestring/unicode.c
- TYPE: LicenseType.unknown
-+FILE: ../../../third_party/boringssl/src/crypto/abi_self_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/bytestring/unicode.c
- FILE: ../../../third_party/boringssl/src/crypto/chacha/internal.h
- FILE: ../../../third_party/boringssl/src/crypto/cipher_extra/e_aesccm.c
- FILE: ../../../third_party/boringssl/src/crypto/cpu-aarch64-fuchsia.c
-+FILE: ../../../third_party/boringssl/src/crypto/cpu-arm-linux.h
-+FILE: ../../../third_party/boringssl/src/crypto/cpu-arm-linux_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/bn/div_extra.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/bn/gcd_extra.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/felem.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/make_p256-x86_64-table.go
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/make_p256-x86_64-tests.go
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/scalar.c
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/ec/simple_mul.c
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/md5/internal.h
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/md5/md5_test.cc
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/sha/internal.h
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/sha/sha_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/tls/internal.h
-+FILE: ../../../third_party/boringssl/src/crypto/hrss/hrss.c
-+FILE: ../../../third_party/boringssl/src/crypto/hrss/hrss_test.cc
-+FILE: ../../../third_party/boringssl/src/crypto/hrss/internal.h
-+FILE: ../../../third_party/boringssl/src/crypto/impl_dispatch_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/pem/pem_test.cc
-+FILE: ../../../third_party/boringssl/src/crypto/rand_extra/rand_test.cc
- FILE: ../../../third_party/boringssl/src/crypto/self_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_kas_test.cc
--FILE: ../../../third_party/boringssl/src/fipstools/cavp_tlskdf_test.cc
-+FILE: ../../../third_party/boringssl/src/crypto/stack/stack_test.cc
-+FILE: ../../../third_party/boringssl/src/crypto/x509v3/internal.h
- FILE: ../../../third_party/boringssl/src/include/openssl/e_os2.h
-+FILE: ../../../third_party/boringssl/src/include/openssl/hrss.h
- FILE: ../../../third_party/boringssl/src/ssl/handoff.cc
-+FILE: ../../../third_party/boringssl/src/third_party/sike/sike_test.cc
-+FILE: ../../../third_party/boringssl/src/util/ar/ar_test.go
- FILE: ../../../third_party/boringssl/src/util/check_filenames.go
- FILE: ../../../third_party/boringssl/src/util/convert_wycheproof.go
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_kas_test.cc
-+FILE: ../../../third_party/boringssl/src/util/fipstools/cavp/cavp_tlskdf_test.cc
-+FILE: ../../../third_party/boringssl/src/util/godeps.go
-+FILE: ../../../third_party/boringssl/src/util/make_prefix_headers.go
-+FILE: ../../../third_party/boringssl/src/util/read_symbols.go
-+FILE: ../../../third_party/boringssl/src/util/testresult/testresult.go
- ----------------------------------------------------------------------------------------------------
- Copyright (c) 2018, Google Inc.
- 
-@@ -5647,6 +5726,33 @@ in the file LICENSE in the source distribution or at
- https://www.openssl.org/source/license.html
- ====================================================================================================
- 
-+====================================================================================================
-+LIBRARY: boringssl
-+ORIGIN: ../../../third_party/boringssl/src/crypto/fipsmodule/fips_shared_support.c
-+TYPE: LicenseType.unknown
-+FILE: ../../../third_party/boringssl/src/crypto/fipsmodule/fips_shared_support.c
-+FILE: ../../../third_party/boringssl/src/crypto/siphash/siphash.c
-+FILE: ../../../third_party/boringssl/src/crypto/siphash/siphash_test.cc
-+FILE: ../../../third_party/boringssl/src/decrepit/blowfish/blowfish_test.cc
-+FILE: ../../../third_party/boringssl/src/decrepit/cast/cast_test.cc
-+FILE: ../../../third_party/boringssl/src/include/openssl/siphash.h
-+FILE: ../../../third_party/boringssl/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc
-+----------------------------------------------------------------------------------------------------
-+Copyright (c) 2019, Google Inc.
-+
-+Permission to use, copy, modify, and/or distribute this software for any
-+purpose with or without fee is hereby granted, provided that the above
-+copyright notice and this permission notice appear in all copies.
-+
-+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-+SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+====================================================================================================
-+
- ====================================================================================================
- LIBRARY: boringssl
- ORIGIN: ../../../third_party/boringssl/src/crypto/fipsmodule/modes/cbc.c
-@@ -5880,6 +5986,27 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- OF THE POSSIBILITY OF SUCH DAMAGE.
- ====================================================================================================
- 
-+====================================================================================================
-+LIBRARY: boringssl
-+ORIGIN: ../../../third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S
-+TYPE: LicenseType.unknown
-+FILE: ../../../third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S
-+----------------------------------------------------------------------------------------------------
-+Copyright (c) 2017, the HRSS authors.
-+
-+Permission to use, copy, modify, and/or distribute this software for any
-+purpose with or without fee is hereby granted, provided that the above
-+copyright notice and this permission notice appear in all copies.
-+
-+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-+SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-+====================================================================================================
-+
- ====================================================================================================
- LIBRARY: boringssl
- ORIGIN: ../../../third_party/boringssl/src/crypto/pem/pem_all.c
-@@ -6620,6 +6747,10 @@ LIBRARY: boringssl
- ORIGIN: ../../../third_party/boringssl/src/third_party/fiat/LICENSE
- TYPE: LicenseType.mit
- FILE: ../../../third_party/boringssl/src/third_party/fiat/METADATA
-+FILE: ../../../third_party/boringssl/src/third_party/fiat/curve25519_32.h
-+FILE: ../../../third_party/boringssl/src/third_party/fiat/curve25519_64.h
-+FILE: ../../../third_party/boringssl/src/third_party/fiat/p256_32.h
-+FILE: ../../../third_party/boringssl/src/third_party/fiat/p256_64.h
- ----------------------------------------------------------------------------------------------------
- The MIT License (MIT)
- 
-@@ -6705,17 +6836,17 @@ SOFTWARE.
- LIBRARY: boringssl
- ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/LICENSE
- TYPE: LicenseType.bsd
--FILE: ../../../third_party/boringssl/src/third_party/googletest/CHANGES
- FILE: ../../../third_party/boringssl/src/third_party/googletest/CONTRIBUTORS
- FILE: ../../../third_party/boringssl/src/third_party/googletest/METADATA
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/cmake/Config.cmake.in
- FILE: ../../../third_party/boringssl/src/third_party/googletest/cmake/gtest.pc.in
- FILE: ../../../third_party/boringssl/src/third_party/googletest/cmake/gtest_main.pc.in
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/cmake/libgtest.la.in
- FILE: ../../../third_party/boringssl/src/third_party/googletest/codegear/gtest.cbproj
- FILE: ../../../third_party/boringssl/src/third_party/googletest/codegear/gtest.groupproj
- FILE: ../../../third_party/boringssl/src/third_party/googletest/codegear/gtest_main.cbproj
- FILE: ../../../third_party/boringssl/src/third_party/googletest/codegear/gtest_unittest.cbproj
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-param-test.h
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-param-test.h.pump
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-test-part.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-filepath.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/msvc/2010/gtest-md.sln
-@@ -6823,10 +6954,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- ====================================================================================================
- LIBRARY: boringssl
--ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-printers.h
-+ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-matchers.h
- TYPE: LicenseType.bsd
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-matchers.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-printers.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-spi.h
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/src/gtest-matchers.cc
- FILE: ../../../third_party/boringssl/src/third_party/googletest/src/gtest-printers.cc
- ----------------------------------------------------------------------------------------------------
- Copyright 2007, Google Inc.
-@@ -6995,47 +7128,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- ====================================================================================================
- LIBRARY: boringssl
--ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-linked_ptr.h
--TYPE: LicenseType.bsd
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-linked_ptr.h
------------------------------------------------------------------------------------------------------
--Copyright 2003 Google Inc.
--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.
--====================================================================================================
--
--====================================================================================================
--LIBRARY: boringssl
--ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-param-util-generated.h
-+ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-param-util.h
- TYPE: LicenseType.bsd
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/gtest-typed-test.h
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-param-util-generated.h
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-param-util-generated.h.pump
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-param-util.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-type-util.h
- FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-type-util.h.pump
-@@ -7077,13 +7172,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- ====================================================================================================
- LIBRARY: boringssl
--ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-tuple.h
-+ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/samples/sample10_unittest.cc
- TYPE: LicenseType.bsd
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-tuple.h
--FILE: ../../../third_party/boringssl/src/third_party/googletest/include/gtest/internal/gtest-tuple.h.pump
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/samples/sample10_unittest.cc
-+FILE: ../../../third_party/boringssl/src/third_party/googletest/samples/sample9_unittest.cc
- ----------------------------------------------------------------------------------------------------
--Copyright 2009 Google Inc.
--All Rights Reserved.
-+Copyright 2009 Google Inc. All Rights Reserved.
- 
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
-@@ -7114,38 +7208,39 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- ====================================================================================================
- LIBRARY: boringssl
--ORIGIN: ../../../third_party/boringssl/src/third_party/googletest/samples/sample10_unittest.cc
--TYPE: LicenseType.bsd
--FILE: ../../../third_party/boringssl/src/third_party/googletest/samples/sample10_unittest.cc
--FILE: ../../../third_party/boringssl/src/third_party/googletest/samples/sample9_unittest.cc
-+ORIGIN: ../../../third_party/boringssl/src/third_party/sike/LICENSE
-+TYPE: LicenseType.mit
-+FILE: ../../../third_party/boringssl/src/third_party/sike/asm/fp_generic.c
-+FILE: ../../../third_party/boringssl/src/third_party/sike/curve_params.c
-+FILE: ../../../third_party/boringssl/src/third_party/sike/fpx.c
-+FILE: ../../../third_party/boringssl/src/third_party/sike/fpx.h
-+FILE: ../../../third_party/boringssl/src/third_party/sike/isogeny.c
-+FILE: ../../../third_party/boringssl/src/third_party/sike/isogeny.h
-+FILE: ../../../third_party/boringssl/src/third_party/sike/sike.c
-+FILE: ../../../third_party/boringssl/src/third_party/sike/sike.h
-+FILE: ../../../third_party/boringssl/src/third_party/sike/utils.h
- ----------------------------------------------------------------------------------------------------
--Copyright 2009 Google Inc. All Rights Reserved.
-+MIT License
- 
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
-+Copyright (c) Microsoft Corporation. All rights reserved.
- 
--    * 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.
-+Permission is hereby granted, free of charge, to any person obtaining a copy
-+of this software and associated documentation files (the "Software"), to deal
-+in the Software without restriction, including without limitation the rights
-+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-+copies of the Software, and to permit persons to whom the Software is
-+furnished to do so, subject to the following conditions:
- 
--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.
-+The above copyright notice and this permission notice shall be included in all
-+copies or substantial portions of the Software.
-+
-+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+SOFTWARE
- ====================================================================================================
- 
- ====================================================================================================
-@@ -7155,8 +7250,11 @@ TYPE: LicenseType.unknown
- FILE: ../../../third_party/boringssl/ios-aarch64/crypto/chacha/chacha-armv8.S
- FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/aesv8-armx64.S
- FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/armv8-mont.S
-+FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
- FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/ghashv8-armx64.S
- FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/sha1-armv8.S
-+FILE: ../../../third_party/boringssl/ios-aarch64/crypto/fipsmodule/vpaes-armv8.S
-+FILE: ../../../third_party/boringssl/ios-aarch64/crypto/third_party/sike/asm/fp-armv8.S
- FILE: ../../../third_party/boringssl/ios-arm/crypto/chacha/chacha-armv4.S
- FILE: ../../../third_party/boringssl/ios-arm/crypto/fipsmodule/aesv8-armx32.S
- FILE: ../../../third_party/boringssl/ios-arm/crypto/fipsmodule/armv4-mont.S
-@@ -7166,8 +7264,11 @@ FILE: ../../../third_party/boringssl/ios-arm/crypto/fipsmodule/sha1-armv4-large.
- FILE: ../../../third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S
- FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
- FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S
-+FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S
- FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S
- FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S
-+FILE: ../../../third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S
-+FILE: ../../../third_party/boringssl/linux-aarch64/crypto/third_party/sike/asm/fp-armv8.S
- FILE: ../../../third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S
- FILE: ../../../third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S
- FILE: ../../../third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S
-@@ -7181,6 +7282,7 @@ FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/aes-586.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S
-+FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S
- FILE: ../../../third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S
-@@ -7194,10 +7296,11 @@ FILE: ../../../third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_p
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/aes-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S
--FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S
-+FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
-+FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S
-@@ -7206,11 +7309,13 @@ FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_6
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S
- FILE: ../../../third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S
-+FILE: ../../../third_party/boringssl/linux-x86_64/crypto/third_party/sike/asm/fp-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/chacha/chacha-x86.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/aes-586.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/aesni-x86.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/bn-586.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/co-586.S
-+FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/ghash-x86.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/md5-586.S
- FILE: ../../../third_party/boringssl/mac-x86/crypto/fipsmodule/sha1-586.S
-@@ -7224,10 +7329,11 @@ FILE: ../../../third_party/boringssl/mac-x86_64/crypto/cipher_extra/chacha20_pol
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/aes-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
--FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/bsaes-x86_64.S
-+FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/ghash-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/md5-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S
-+FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/rsaz-avx2.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
-@@ -7236,11 +7342,13 @@ FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/sha512-x86_64.
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/x86_64-mont.S
- FILE: ../../../third_party/boringssl/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S
-+FILE: ../../../third_party/boringssl/mac-x86_64/crypto/third_party/sike/asm/fp-x86_64.S
- FILE: ../../../third_party/boringssl/win-x86/crypto/chacha/chacha-x86.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/aes-586.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/bn-586.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/co-586.asm
-+FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/md5-586.asm
- FILE: ../../../third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586.asm
-@@ -7254,10 +7362,11 @@ FILE: ../../../third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_pol
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/aes-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm
--FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/bsaes-x86_64.asm
-+FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm
-+FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm
-@@ -7266,6 +7375,7 @@ FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64.
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont.asm
- FILE: ../../../third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm
-+FILE: ../../../third_party/boringssl/win-x86_64/crypto/third_party/sike/asm/fp-x86_64.asm
- ----------------------------------------------------------------------------------------------------
- <THIS BLOCK INTENTIONALLY LEFT BLANK>
- ====================================================================================================
-@@ -23186,4 +23296,4 @@ freely, subject to the following restrictions:
-    misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- ====================================================================================================
--Total license count: 361
-+Total license count: 362
-diff --git a/tools/licenses/lib/main.dart b/tools/licenses/lib/main.dart
-index 19117b13b4fc..3088076b8661 100644
---- a/tools/licenses/lib/main.dart
-+++ b/tools/licenses/lib/main.dart
-@@ -1889,7 +1889,7 @@ class _RepositoryBoringSSLDirectory extends _RepositoryDirectory {
-   _RepositoryDirectory createSubdirectory(fs.Directory entry) {
-     if (entry.name == 'src')
-       return _RepositoryBoringSSLSourceDirectory(this, entry);
--    return super.createSubdirectory(entry);
-+    return _RepositoryBoringSSLDirectory(this, entry);
-   }
- }
- 
diff --git a/tools/patches/flutter-engine/6e2b3f0326bc15ad938319cbbb151f183d064609.patch b/tools/patches/flutter-engine/6e2b3f0326bc15ad938319cbbb151f183d064609.patch
deleted file mode 100644
index 2c8dada..0000000
--- a/tools/patches/flutter-engine/6e2b3f0326bc15ad938319cbbb151f183d064609.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 6205f1b6d..5c1cbf3bc 100644
---- a/DEPS
-+++ b/DEPS
-@@ -72,7 +72,7 @@ vars = {
-   'dart_mustache_tag': '5e81b12215566dbe2473b2afd01a8a8aedd56ad9',
-   'dart_oauth2_tag': '1.2.1',
-   'dart_observatory_pub_packages_rev': '0894122173b0f98eb08863a7712e78407d4477bc',
--  'dart_package_config_tag': '1.0.5',
-+  'dart_package_config_tag': '2453cd2e78c2db56ee2669ced17ce70dd00bf576',
-   'dart_package_resolver_tag': '1.0.10',
-   'dart_path_tag': '1.6.2',
-   'dart_pedantic_tag': 'v1.8.0',
diff --git a/tools/patches/flutter-engine/8ba6f7e2eb8ac44b6de3e87a3062d1c8e34b6cc1.patch b/tools/patches/flutter-engine/8ba6f7e2eb8ac44b6de3e87a3062d1c8e34b6cc1.patch
deleted file mode 100644
index 56ac868..0000000
--- a/tools/patches/flutter-engine/8ba6f7e2eb8ac44b6de3e87a3062d1c8e34b6cc1.patch
+++ /dev/null
@@ -1,330 +0,0 @@
-From 6fefdfc884fb7858bd8cd981e1fdb493da8088b4 Mon Sep 17 00:00:00 2001
-From: Alexander Aprelev <aam@google.com>
-Date: Mon, 7 Oct 2019 23:13:33 -0700
-Subject: [PATCH] 2
-
----
- BUILD.gn                                      |  2 +-
- ci/analyze.sh                                 |  6 +-
- .../.gitignore                                |  0
- flutter_frontend_server/BUILD.gn              | 63 +++++++++++++++++
- .../README.md                                 |  0
- .../bin/starter.dart                          |  2 +-
- .../lib/server.dart                           |  2 +-
- .../package_incremental.py                    |  8 +--
- .../pubspec.yaml                              |  0
- frontend_server/BUILD.gn                      | 68 ++-----------------
- tools/generate_package_files.py               |  2 +-
- 11 files changed, 80 insertions(+), 73 deletions(-)
- rename {frontend_server => flutter_frontend_server}/.gitignore (100%)
- create mode 100644 flutter_frontend_server/BUILD.gn
- rename {frontend_server => flutter_frontend_server}/README.md (100%)
- rename {frontend_server => flutter_frontend_server}/bin/starter.dart (76%)
- rename {frontend_server => flutter_frontend_server}/lib/server.dart (98%)
- rename {frontend_server => flutter_frontend_server}/package_incremental.py (94%)
- rename {frontend_server => flutter_frontend_server}/pubspec.yaml (100%)
-
-diff --git a/BUILD.gn b/BUILD.gn
-index b894fe26f..e4ce1dea1 100644
---- a/BUILD.gn
-+++ b/BUILD.gn
-@@ -42,7 +42,7 @@ group("flutter") {
-   if (!is_fuchsia && !is_fuchsia_host) {
-     if (current_toolchain == host_toolchain) {
-       public_deps += [
--        "$flutter_root/frontend_server",
-+        "$flutter_root/flutter_frontend_server:frontend_server",
-         "//third_party/dart:create_sdk",
-       ]
- 
-diff --git a/ci/analyze.sh b/ci/analyze.sh
-index 9ee12a913..6b48c9447 100755
---- a/ci/analyze.sh
-+++ b/ci/analyze.sh
-@@ -18,11 +18,11 @@ if [ -n "$RESULTS" ]; then
-   exit 1;
- fi
- 
--echo "Analyzing frontend_server..."
-+echo "Analyzing flutter_frontend_server..."
- RESULTS=`dartanalyzer                                                          \
--  --packages=flutter/frontend_server/.packages                                 \
-+  --packages=flutter/flutter_frontend_server/.packages                                 \
-   --options flutter/analysis_options.yaml                                      \
--  flutter/frontend_server                                                      \
-+  flutter/flutter_frontend_server                                                      \
-   2>&1                                                                         \
-   | grep -Ev "No issues found!"                                                \
-   | grep -Ev "Analyzing.+frontend_server"`
-diff --git a/frontend_server/.gitignore b/flutter_frontend_server/.gitignore
-similarity index 100%
-rename from frontend_server/.gitignore
-rename to flutter_frontend_server/.gitignore
-diff --git a/flutter_frontend_server/BUILD.gn b/flutter_frontend_server/BUILD.gn
-new file mode 100644
-index 000000000..37740acaa
---- /dev/null
-+++ b/flutter_frontend_server/BUILD.gn
-@@ -0,0 +1,63 @@
-+# Copyright 2013 The Flutter Authors. All rights reserved.
-+# Use of this source code is governed by a BSD-style license that can be
-+# found in the LICENSE file.
-+
-+if (!is_fuchsia_host && !is_fuchsia) {
-+  import("//third_party/dart/utils/application_snapshot.gni")
-+
-+  frontend_server_files =
-+      exec_script("//third_party/dart/tools/list_dart_files.py",
-+                  [
-+                    "absolute",
-+                    rebase_path("."),
-+                  ],
-+                  "list lines")
-+
-+  frontend_server_files +=
-+      exec_script("//third_party/dart/tools/list_dart_files.py",
-+                  [
-+                    "absolute",
-+                    rebase_path("../../third_party/dart/pkg"),
-+                  ],
-+                  "list lines")
-+
-+  application_snapshot("frontend_server") {
-+    main_dart = "bin/starter.dart"
-+    deps = [
-+      ":package_incremental_compiler",
-+      "$flutter_root/lib/snapshot:kernel_platform_files",
-+    ]
-+    dot_packages = rebase_path(".packages")
-+    flutter_patched_sdk = rebase_path("$root_out_dir/flutter_patched_sdk")
-+    training_args = [
-+      "--train",
-+      "--sdk-root=$flutter_patched_sdk",
-+      rebase_path(main_dart),
-+    ]
-+
-+    inputs = frontend_server_files
-+  }
-+
-+  # For flutter/flutter#36738 we make the source files available so that
-+  # we can generate a local frontend_server snapshot in the tools cache.
-+  action("package_incremental_compiler") {
-+    script = "$flutter_root/flutter_frontend_server/package_incremental.py"
-+
-+    inputs = frontend_server_files
-+
-+    outputs = [
-+      "$root_gen_dir/dart-pkg/frontend_server/pubspec.yaml",
-+      "$root_gen_dir/dart-pkg/vm/pubspec.yaml",
-+      "$root_gen_dir/dart-pkg/build_integration/pubspec.yaml",
-+      "$root_gen_dir/dart-pkg/front_end/pubspec.yaml",
-+      "$root_gen_dir/dart-pkg/kernel/pubspec.yaml",
-+      "$root_gen_dir/dart-pkg/dev_compiler/pubspec.yaml",
-+    ]
-+
-+    args = [
-+      "--input-root=" + rebase_path("//third_party/dart/pkg"),
-+      "--output-root=" + rebase_path("$root_gen_dir/dart-pkg"),
-+      "--frontend-server=" + rebase_path("$flutter_root"),
-+    ]
-+  }
-+}
-diff --git a/frontend_server/README.md b/flutter_frontend_server/README.md
-similarity index 100%
-rename from frontend_server/README.md
-rename to flutter_frontend_server/README.md
-diff --git a/frontend_server/bin/starter.dart b/flutter_frontend_server/bin/starter.dart
-similarity index 76%
-rename from frontend_server/bin/starter.dart
-rename to flutter_frontend_server/bin/starter.dart
-index da85e5575..862a8a7ea 100644
---- a/frontend_server/bin/starter.dart
-+++ b/flutter_frontend_server/bin/starter.dart
-@@ -2,7 +2,7 @@ library frontend_server;
- 
- import 'dart:io';
- 
--import 'package:frontend_server/server.dart';
-+import 'package:flutter_frontend_server/server.dart';
- 
- void main(List<String> args) async {
-   final int exitCode = await starter(args);
-diff --git a/frontend_server/lib/server.dart b/flutter_frontend_server/lib/server.dart
-similarity index 98%
-rename from frontend_server/lib/server.dart
-rename to flutter_frontend_server/lib/server.dart
-index 8e34efa93..24894c878 100644
---- a/frontend_server/lib/server.dart
-+++ b/flutter_frontend_server/lib/server.dart
-@@ -11,7 +11,7 @@ import 'package:args/args.dart';
- import 'package:path/path.dart' as path;
- 
- import 'package:vm/incremental_compiler.dart';
--import 'package:vm/frontend_server.dart' as frontend
-+import 'package:frontend_server/frontend_server.dart' as frontend
-     show
-         FrontendCompiler,
-         CompilerInterface,
-diff --git a/frontend_server/package_incremental.py b/flutter_frontend_server/package_incremental.py
-similarity index 94%
-rename from frontend_server/package_incremental.py
-rename to flutter_frontend_server/package_incremental.py
-index 63b019a33..a8b424260 100755
---- a/frontend_server/package_incremental.py
-+++ b/flutter_frontend_server/package_incremental.py
-@@ -15,7 +15,7 @@ PACKAGES = [
-   "kernel",
-   "front_end",
-   "dev_compiler",
--  "frontend_server",
-+  "flutter_frontend_server",
- ]
- 
- VM_PUBSPEC = r'''name: vm
-@@ -41,7 +41,7 @@ dependencies:
-   meta: any
- '''
- 
--FRONTEND_SERVER_PUBSPEC = r'''name: frontend_server
-+FLUTTER_FRONTEND_SERVER_PUBSPEC = r'''name: flutter_frontend_server
- version: 0.0.1
- environment:
-   sdk: ">=2.2.2 <3.0.0"
-@@ -87,7 +87,7 @@ dependencies:
- PUBSPECS = {
-   'vm': VM_PUBSPEC,
-   'build_integration': BUILD_INTEGRATION_PUBSPEC,
--  'frontend_server': FRONTEND_SERVER_PUBSPEC,
-+  'flutter_frontend_server': FLUTTER_FRONTEND_SERVER_PUBSPEC,
-   'kernel': KERNEL_PUBSPEC,
-   'front_end': FRONT_END_PUBSPEC,
-   'dev_compiler': DEV_COMPILER_PUBSPEC,
-@@ -103,7 +103,7 @@ def main():
-   for package in PACKAGES:
-     base = args.input
-     # Handle different path for frontend_server
--    if package == 'frontend_server':
-+    if package == 'flutter_frontend_server':
-       base = args.frontend
-     package_root = os.path.join(base, package)
-     for root, directories, files in os.walk(package_root):
-diff --git a/frontend_server/pubspec.yaml b/flutter_frontend_server/pubspec.yaml
-similarity index 100%
-rename from frontend_server/pubspec.yaml
-rename to flutter_frontend_server/pubspec.yaml
-diff --git a/frontend_server/BUILD.gn b/frontend_server/BUILD.gn
-index 330f1e394..6cb8ce88f 100644
---- a/frontend_server/BUILD.gn
-+++ b/frontend_server/BUILD.gn
-@@ -6,9 +6,9 @@ if (is_fuchsia_host || is_fuchsia) {
-   import("//build/dart/dart_library.gni")
-   import("//build/dart/dart_tool.gni")
- 
--  dart_library("frontend_server") {
-+  dart_library("flutter_frontend_server") {
-     disable_analysis = true
--    package_name = "frontend_server"
-+    package_name = "flutter_frontend_server"
- 
-     sources = [
-       "server.dart",
-@@ -19,6 +19,7 @@ if (is_fuchsia_host || is_fuchsia) {
-       "//third_party/dart-pkg/pub/path",
-       "//third_party/dart-pkg/pub/usage",
-       "//third_party/dart/pkg/build_integration",
-+      "//third_party/dart/pkg/frontend_server",
-       "//third_party/dart/pkg/front_end",
-       "//third_party/dart/pkg/kernel",
-       "//third_party/dart/pkg/vm",
-@@ -27,72 +28,15 @@ if (is_fuchsia_host || is_fuchsia) {
- 
-   dart_tool("frontend_server_tool") {
-     main_dart = "bin/starter.dart"
--    source_dir = "."
-+    source_dir = "../flutter_frontend_server"
-     disable_analysis = true
-     output_name = "frontend_server"
- 
-     sources = []
- 
-     deps = [
--      ":frontend_server",
--    ]
--  }
--} else {
--  import("//third_party/dart/utils/application_snapshot.gni")
--
--  frontend_server_files =
--      exec_script("//third_party/dart/tools/list_dart_files.py",
--                  [
--                    "absolute",
--                    rebase_path("."),
--                  ],
--                  "list lines")
--
--  frontend_server_files +=
--      exec_script("//third_party/dart/tools/list_dart_files.py",
--                  [
--                    "absolute",
--                    rebase_path("../../third_party/dart/pkg"),
--                  ],
--                  "list lines")
--
--  application_snapshot("frontend_server") {
--    main_dart = "bin/starter.dart"
--    deps = [
--      ":package_incremental_compiler",
--      "$flutter_root/lib/snapshot:kernel_platform_files",
--    ]
--    dot_packages = rebase_path(".packages")
--    flutter_patched_sdk = rebase_path("$root_out_dir/flutter_patched_sdk")
--    training_args = [
--      "--train",
--      "--sdk-root=$flutter_patched_sdk",
--      rebase_path(main_dart),
--    ]
--
--    inputs = frontend_server_files
--  }
--
--  # For flutter/flutter#36738 we make the source files available so that
--  # we can generate a local frontend_server snapshot in the tools cache.
--  action("package_incremental_compiler") {
--    script = "$flutter_root/frontend_server/package_incremental.py"
--
--    inputs = frontend_server_files
--
--    outputs = [
--      "$root_gen_dir/dart-pkg/frontend_server/pubspec.yaml",
--      "$root_gen_dir/dart-pkg/vm/pubspec.yaml",
--      "$root_gen_dir/dart-pkg/build_integration/pubspec.yaml",
--      "$root_gen_dir/dart-pkg/front_end/pubspec.yaml",
--      "$root_gen_dir/dart-pkg/kernel/pubspec.yaml",
--      "$root_gen_dir/dart-pkg/dev_compiler/pubspec.yaml",
--    ]
--
--    args = [
--      "--input-root=" + rebase_path("//third_party/dart/pkg"),
--      "--output-root=" + rebase_path("$root_gen_dir/dart-pkg"),
--      "--frontend-server=" + rebase_path("$flutter_root"),
-+      ":flutter_frontend_server",
-     ]
-   }
- }
-+
-diff --git a/tools/generate_package_files.py b/tools/generate_package_files.py
-index 13399b126..1eb1e6f6c 100644
---- a/tools/generate_package_files.py
-+++ b/tools/generate_package_files.py
-@@ -10,7 +10,7 @@ import os
- import shutil
- 
- ALL_PACKAGES = {
--  'frontend_server': [],
-+  'flutter_frontend_server': [],
- }
- 
- SRC_DIR = os.getcwd()
--- 
-2.23.0.581.g78d2f28ef7-goog
-
diff --git a/tools/patches/flutter-engine/a61c775db81ef2a389d5aee6236176362b082d58.patch b/tools/patches/flutter-engine/a61c775db81ef2a389d5aee6236176362b082d58.patch
deleted file mode 100644
index 8e96c95..0000000
--- a/tools/patches/flutter-engine/a61c775db81ef2a389d5aee6236176362b082d58.patch
+++ /dev/null
@@ -1,613 +0,0 @@
-diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc
-index 2db8ae2c7cd5..dcbe05f66691 100644
---- a/runtime/dart_isolate.cc
-+++ b/runtime/dart_isolate.cc
-@@ -32,7 +32,6 @@ namespace flutter {
- std::weak_ptr<DartIsolate> DartIsolate::CreateRootIsolate(
-     const Settings& settings,
-     fml::RefPtr<const DartSnapshot> isolate_snapshot,
--    fml::RefPtr<const DartSnapshot> shared_snapshot,
-     TaskRunners task_runners,
-     std::unique_ptr<Window> window,
-     fml::WeakPtr<IOManager> io_manager,
-@@ -58,7 +57,6 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRootIsolate(
-       std::shared_ptr<DartIsolate>(new DartIsolate(
-           settings,                     // settings
-           std::move(isolate_snapshot),  // isolate snapshot
--          std::move(shared_snapshot),   // shared snapshot
-           task_runners,                 // task runners
-           std::move(io_manager),        // IO manager
-           std::move(image_decoder),     // Image Decoder
-@@ -102,7 +100,6 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRootIsolate(
- 
- DartIsolate::DartIsolate(const Settings& settings,
-                          fml::RefPtr<const DartSnapshot> isolate_snapshot,
--                         fml::RefPtr<const DartSnapshot> shared_snapshot,
-                          TaskRunners task_runners,
-                          fml::WeakPtr<IOManager> io_manager,
-                          fml::WeakPtr<ImageDecoder> image_decoder,
-@@ -123,7 +120,6 @@ DartIsolate::DartIsolate(const Settings& settings,
-                   DartVMRef::GetIsolateNameServer()),
-       settings_(settings),
-       isolate_snapshot_(std::move(isolate_snapshot)),
--      shared_snapshot_(std::move(shared_snapshot)),
-       child_isolate_preparer_(std::move(child_isolate_preparer)),
-       isolate_create_callback_(isolate_create_callback),
-       isolate_shutdown_callback_(isolate_shutdown_callback) {
-@@ -592,7 +588,6 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate(
-       DartIsolate::CreateRootIsolate(
-           vm_data->GetSettings(),         // settings
-           vm_data->GetIsolateSnapshot(),  // isolate snapshot
--          vm_data->GetSharedSnapshot(),   // shared snapshot
-           null_task_runners,              // task runners
-           nullptr,                        // window
-           {},                             // IO Manager
-@@ -705,7 +700,6 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
-         std::shared_ptr<DartIsolate>(new DartIsolate(
-             (*raw_embedder_isolate)->GetSettings(),         // settings
-             (*raw_embedder_isolate)->GetIsolateSnapshot(),  // isolate_snapshot
--            (*raw_embedder_isolate)->GetSharedSnapshot(),   // shared_snapshot
-             null_task_runners,                              // task_runners
-             fml::WeakPtr<IOManager>{},                      // io_manager
-             fml::WeakPtr<ImageDecoder>{},                   // io_manager
-@@ -724,9 +718,7 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
-       advisory_script_uri,         //
-       advisory_script_entrypoint,  //
-       (*embedder_isolate)->GetIsolateSnapshot()->GetDataMapping(),
--      (*embedder_isolate)->GetIsolateSnapshot()->GetInstructionsMapping(),
--      (*embedder_isolate)->GetSharedSnapshot()->GetDataMapping(),
--      (*embedder_isolate)->GetSharedSnapshot()->GetInstructionsMapping(), flags,
-+      (*embedder_isolate)->GetIsolateSnapshot()->GetInstructionsMapping(), flags,
-       embedder_isolate.get(),  // isolate_group_data
-       embedder_isolate.get(),  // isolate_group
-       error);
-@@ -791,10 +783,6 @@ fml::RefPtr<const DartSnapshot> DartIsolate::GetIsolateSnapshot() const {
-   return isolate_snapshot_;
- }
- 
--fml::RefPtr<const DartSnapshot> DartIsolate::GetSharedSnapshot() const {
--  return shared_snapshot_;
--}
--
- std::weak_ptr<DartIsolate> DartIsolate::GetWeakIsolatePtr() {
-   return std::static_pointer_cast<DartIsolate>(shared_from_this());
- }
-diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h
-index e7ab9b30243c..2abaa11fe011 100644
---- a/runtime/dart_isolate.h
-+++ b/runtime/dart_isolate.h
-@@ -143,10 +143,6 @@ class DartIsolate : public UIDartState {
-   ///                                         usually obtained from the
-   ///                                         DartVMData associated with the
-   ///                                         running Dart VM instance.
--  /// @param[in]  shared_snapshot             The shared snapshot. This is
--  ///                                         usually obtained from the
--  ///                                         DartVMData associated with the
--  ///                                         running Dart VM instance.
-   /// @param[in]  task_runners                The task runners used by the
-   ///                                         isolate. Via UI bindings, the
-   ///                                         isolate will use the IO task
-@@ -192,7 +188,6 @@ class DartIsolate : public UIDartState {
-   static std::weak_ptr<DartIsolate> CreateRootIsolate(
-       const Settings& settings,
-       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--      fml::RefPtr<const DartSnapshot> shared_snapshot,
-       TaskRunners task_runners,
-       std::unique_ptr<Window> window,
-       fml::WeakPtr<IOManager> io_manager,
-@@ -385,14 +380,6 @@ class DartIsolate : public UIDartState {
-   ///
-   fml::RefPtr<const DartSnapshot> GetIsolateSnapshot() const;
- 
--  //----------------------------------------------------------------------------
--  /// @brief      Get the shared snapshot used to launch this isolate. This is
--  ///             referenced by any child isolates launched by the root isolate.
--  ///
--  /// @return     The shared snapshot.
--  ///
--  fml::RefPtr<const DartSnapshot> GetSharedSnapshot() const;
--
-   //----------------------------------------------------------------------------
-   /// @brief      A weak pointer to the Dart isolate instance. This instance may
-   ///             only be used on the task runner that created the root isolate.
-@@ -428,7 +415,6 @@ class DartIsolate : public UIDartState {
-   Phase phase_ = Phase::Unknown;
-   const Settings settings_;
-   const fml::RefPtr<const DartSnapshot> isolate_snapshot_;
--  const fml::RefPtr<const DartSnapshot> shared_snapshot_;
-   std::vector<std::shared_ptr<const fml::Mapping>> kernel_buffers_;
-   std::vector<std::unique_ptr<AutoFireClosure>> shutdown_callbacks_;
-   ChildIsolatePreparer child_isolate_preparer_ = nullptr;
-@@ -438,7 +424,6 @@ class DartIsolate : public UIDartState {
- 
-   DartIsolate(const Settings& settings,
-               fml::RefPtr<const DartSnapshot> isolate_snapshot,
--              fml::RefPtr<const DartSnapshot> shared_snapshot,
-               TaskRunners task_runners,
-               fml::WeakPtr<IOManager> io_manager,
-               fml::WeakPtr<ImageDecoder> image_decoder,
-diff --git a/runtime/dart_isolate_unittests.cc b/runtime/dart_isolate_unittests.cc
-index 83a140737324..4d860f82d781 100644
---- a/runtime/dart_isolate_unittests.cc
-+++ b/runtime/dart_isolate_unittests.cc
-@@ -38,7 +38,6 @@ TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) {
-   auto weak_isolate = DartIsolate::CreateRootIsolate(
-       vm_data->GetSettings(),             // settings
-       vm_data->GetIsolateSnapshot(),      // isolate snapshot
--      vm_data->GetSharedSnapshot(),       // shared snapshot
-       std::move(task_runners),            // task runners
-       nullptr,                            // window
-       {},                                 // io manager
-@@ -71,7 +70,6 @@ TEST_F(DartIsolateTest, IsolateShutdownCallbackIsInIsolateScope) {
-   auto weak_isolate = DartIsolate::CreateRootIsolate(
-       vm_data->GetSettings(),             // settings
-       vm_data->GetIsolateSnapshot(),      // isolate snapshot
--      vm_data->GetSharedSnapshot(),       // shared snapshot
-       std::move(task_runners),            // task runners
-       nullptr,                            // window
-       {},                                 // io manager
-@@ -181,7 +179,6 @@ static void RunDartCodeInIsolate(DartVMRef& vm_ref,
-   auto weak_isolate = DartIsolate::CreateRootIsolate(
-       vm_data->GetSettings(),             // settings
-       vm_data->GetIsolateSnapshot(),      // isolate snapshot
--      vm_data->GetSharedSnapshot(),       // shared snapshot
-       std::move(task_runners),            // task runners
-       nullptr,                            // window
-       {},                                 // io manager
-diff --git a/runtime/dart_lifecycle_unittests.cc b/runtime/dart_lifecycle_unittests.cc
-index 7a607b7be26f..7a35c96167e5 100644
---- a/runtime/dart_lifecycle_unittests.cc
-+++ b/runtime/dart_lifecycle_unittests.cc
-@@ -53,7 +53,6 @@ static std::shared_ptr<DartIsolate> CreateAndRunRootIsolate(
-   auto isolate_weak = DartIsolate::CreateRootIsolate(
-       vm.GetSettings(),                   // settings
-       vm.GetIsolateSnapshot(),            // isolate_snapshot
--      vm.GetSharedSnapshot(),             // shared_snapshot
-       runners,                            // task_runners
-       {},                                 // window
-       {},                                 // io_manager
-diff --git a/runtime/dart_snapshot.cc b/runtime/dart_snapshot.cc
-index acebcd3493d8..a5df79bb136c 100644
---- a/runtime/dart_snapshot.cc
-+++ b/runtime/dart_snapshot.cc
-@@ -181,10 +181,6 @@ fml::RefPtr<DartSnapshot> DartSnapshot::IsolateSnapshotFromSettings(
-   return nullptr;
- }
- 
--fml::RefPtr<DartSnapshot> DartSnapshot::Empty() {
--  return fml::MakeRefCounted<DartSnapshot>(nullptr, nullptr);
--}
--
- DartSnapshot::DartSnapshot(std::shared_ptr<const fml::Mapping> data,
-                            std::shared_ptr<const fml::Mapping> instructions)
-     : data_(std::move(data)), instructions_(std::move(instructions)) {}
-diff --git a/runtime/dart_snapshot.h b/runtime/dart_snapshot.h
-index 162710ff2a6a..97038aac4aee 100644
---- a/runtime/dart_snapshot.h
-+++ b/runtime/dart_snapshot.h
-@@ -102,17 +102,6 @@ class DartSnapshot : public fml::RefCountedThreadSafe<DartSnapshot> {
-   static fml::RefPtr<DartSnapshot> IsolateSnapshotFromSettings(
-       const Settings& settings);
- 
--  //----------------------------------------------------------------------------
--  /// @brief      An empty an invalid snapshot. This is used as a placeholder
--  ///             for certain optional snapshots.
--  ///
--  /// @bug        Now that shared snapshots are no longer required, consider
--  ///             removing this constructor.
--  ///
--  /// @return     An invalid empty snapshot.
--  ///
--  static fml::RefPtr<DartSnapshot> Empty();
--
-   //----------------------------------------------------------------------------
-   /// @brief      Determines if this snapshot contains a heap component. Since
-   ///             the instructions component is optional, the method does not
-diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc
-index 37f8e690f737..0c18ba8da702 100644
---- a/runtime/dart_vm.cc
-+++ b/runtime/dart_vm.cc
-@@ -232,12 +232,10 @@ std::shared_ptr<DartVM> DartVM::Create(
-     Settings settings,
-     fml::RefPtr<DartSnapshot> vm_snapshot,
-     fml::RefPtr<DartSnapshot> isolate_snapshot,
--    fml::RefPtr<DartSnapshot> shared_snapshot,
-     std::shared_ptr<IsolateNameServer> isolate_name_server) {
-   auto vm_data = DartVMData::Create(settings,                     //
-                                     std::move(vm_snapshot),       //
--                                    std::move(isolate_snapshot),  //
--                                    std::move(shared_snapshot)    //
-+                                    std::move(isolate_snapshot)   //
-   );
- 
-   if (!vm_data) {
-diff --git a/runtime/dart_vm.h b/runtime/dart_vm.h
-index 40b8dc4a242e..ac84fe77020d 100644
---- a/runtime/dart_vm.h
-+++ b/runtime/dart_vm.h
-@@ -162,7 +162,6 @@ class DartVM {
-       Settings settings,
-       fml::RefPtr<DartSnapshot> vm_snapshot,
-       fml::RefPtr<DartSnapshot> isolate_snapshot,
--      fml::RefPtr<DartSnapshot> shared_snapshot,
-       std::shared_ptr<IsolateNameServer> isolate_name_server);
- 
-   DartVM(std::shared_ptr<const DartVMData> data,
-diff --git a/runtime/dart_vm_data.cc b/runtime/dart_vm_data.cc
-index e14c998daa74..b93d9ba9ad03 100644
---- a/runtime/dart_vm_data.cc
-+++ b/runtime/dart_vm_data.cc
-@@ -9,8 +9,7 @@ namespace flutter {
- std::shared_ptr<const DartVMData> DartVMData::Create(
-     Settings settings,
-     fml::RefPtr<DartSnapshot> vm_snapshot,
--    fml::RefPtr<DartSnapshot> isolate_snapshot,
--    fml::RefPtr<DartSnapshot> shared_snapshot) {
-+    fml::RefPtr<DartSnapshot> isolate_snapshot) {
-   if (!vm_snapshot || !vm_snapshot->IsValid()) {
-     // Caller did not provide a valid VM snapshot. Attempt to infer one
-     // from the settings.
-@@ -33,30 +32,19 @@ std::shared_ptr<const DartVMData> DartVMData::Create(
-     }
-   }
- 
--  if (!shared_snapshot || !shared_snapshot->IsValid()) {
--    shared_snapshot = DartSnapshot::Empty();
--    if (!shared_snapshot) {
--      FML_LOG(ERROR) << "Shared snapshot invalid.";
--      return {};
--    }
--  }
--
-   return std::shared_ptr<const DartVMData>(new DartVMData(
-       std::move(settings),          //
-       std::move(vm_snapshot),       //
--      std::move(isolate_snapshot),  //
--      std::move(shared_snapshot)    //
-+      std::move(isolate_snapshot)   //
-       ));
- }
- 
- DartVMData::DartVMData(Settings settings,
-                        fml::RefPtr<const DartSnapshot> vm_snapshot,
--                       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--                       fml::RefPtr<const DartSnapshot> shared_snapshot)
-+                       fml::RefPtr<const DartSnapshot> isolate_snapshot)
-     : settings_(settings),
-       vm_snapshot_(vm_snapshot),
--      isolate_snapshot_(isolate_snapshot),
--      shared_snapshot_(shared_snapshot) {}
-+      isolate_snapshot_(isolate_snapshot) {}
- 
- DartVMData::~DartVMData() = default;
- 
-@@ -72,8 +60,4 @@ fml::RefPtr<const DartSnapshot> DartVMData::GetIsolateSnapshot() const {
-   return isolate_snapshot_;
- }
- 
--fml::RefPtr<const DartSnapshot> DartVMData::GetSharedSnapshot() const {
--  return shared_snapshot_;
--}
--
- }  // namespace flutter
-diff --git a/runtime/dart_vm_data.h b/runtime/dart_vm_data.h
-index 95c4565e2ef7..0f054bf55f3d 100644
---- a/runtime/dart_vm_data.h
-+++ b/runtime/dart_vm_data.h
-@@ -15,8 +15,7 @@ class DartVMData {
-   static std::shared_ptr<const DartVMData> Create(
-       Settings settings,
-       fml::RefPtr<DartSnapshot> vm_snapshot,
--      fml::RefPtr<DartSnapshot> isolate_snapshot,
--      fml::RefPtr<DartSnapshot> shared_snapshot);
-+      fml::RefPtr<DartSnapshot> isolate_snapshot);
- 
-   ~DartVMData();
- 
-@@ -26,18 +25,14 @@ class DartVMData {
- 
-   fml::RefPtr<const DartSnapshot> GetIsolateSnapshot() const;
- 
--  fml::RefPtr<const DartSnapshot> GetSharedSnapshot() const;
--
-  private:
-   const Settings settings_;
-   const fml::RefPtr<const DartSnapshot> vm_snapshot_;
-   const fml::RefPtr<const DartSnapshot> isolate_snapshot_;
--  const fml::RefPtr<const DartSnapshot> shared_snapshot_;
- 
-   DartVMData(Settings settings,
-              fml::RefPtr<const DartSnapshot> vm_snapshot,
--             fml::RefPtr<const DartSnapshot> isolate_snapshot,
--             fml::RefPtr<const DartSnapshot> shared_snapshot);
-+             fml::RefPtr<const DartSnapshot> isolate_snapshot);
- 
-   FML_DISALLOW_COPY_AND_ASSIGN(DartVMData);
- };
-diff --git a/runtime/dart_vm_lifecycle.cc b/runtime/dart_vm_lifecycle.cc
-index 717a0546a280..41a3da606abb 100644
---- a/runtime/dart_vm_lifecycle.cc
-+++ b/runtime/dart_vm_lifecycle.cc
-@@ -43,8 +43,7 @@ DartVMRef::~DartVMRef() {
- 
- DartVMRef DartVMRef::Create(Settings settings,
-                             fml::RefPtr<DartSnapshot> vm_snapshot,
--                            fml::RefPtr<DartSnapshot> isolate_snapshot,
--                            fml::RefPtr<DartSnapshot> shared_snapshot) {
-+                            fml::RefPtr<DartSnapshot> isolate_snapshot) {
-   std::scoped_lock lifecycle_lock(gVMMutex);
- 
-   if (!settings.leak_vm) {
-@@ -78,7 +77,6 @@ DartVMRef DartVMRef::Create(Settings settings,
-   auto vm = DartVM::Create(std::move(settings),          //
-                            std::move(vm_snapshot),       //
-                            std::move(isolate_snapshot),  //
--                           std::move(shared_snapshot),   //
-                            isolate_name_server           //
-   );
- 
-diff --git a/runtime/dart_vm_lifecycle.h b/runtime/dart_vm_lifecycle.h
-index 5ce6cf7a5777..d89b6d7cb43d 100644
---- a/runtime/dart_vm_lifecycle.h
-+++ b/runtime/dart_vm_lifecycle.h
-@@ -29,8 +29,7 @@ class DartVMRef {
-   FML_WARN_UNUSED_RESULT
-   static DartVMRef Create(Settings settings,
-                           fml::RefPtr<DartSnapshot> vm_snapshot = nullptr,
--                          fml::RefPtr<DartSnapshot> isolate_snapshot = nullptr,
--                          fml::RefPtr<DartSnapshot> shared_snapshot = nullptr);
-+                          fml::RefPtr<DartSnapshot> isolate_snapshot = nullptr);
- 
-   DartVMRef(DartVMRef&&);
- 
-diff --git a/runtime/runtime_controller.cc b/runtime/runtime_controller.cc
-index 61415ec4124c..a63843fedf66 100644
---- a/runtime/runtime_controller.cc
-+++ b/runtime/runtime_controller.cc
-@@ -18,7 +18,6 @@ RuntimeController::RuntimeController(
-     RuntimeDelegate& p_client,
-     DartVM* p_vm,
-     fml::RefPtr<const DartSnapshot> p_isolate_snapshot,
--    fml::RefPtr<const DartSnapshot> p_shared_snapshot,
-     TaskRunners p_task_runners,
-     fml::WeakPtr<IOManager> p_io_manager,
-     fml::WeakPtr<ImageDecoder> p_image_decoder,
-@@ -31,7 +30,6 @@ RuntimeController::RuntimeController(
-     : RuntimeController(p_client,
-                         p_vm,
-                         std::move(p_isolate_snapshot),
--                        std::move(p_shared_snapshot),
-                         std::move(p_task_runners),
-                         std::move(p_io_manager),
-                         std::move(p_image_decoder),
-@@ -47,7 +45,6 @@ RuntimeController::RuntimeController(
-     RuntimeDelegate& p_client,
-     DartVM* p_vm,
-     fml::RefPtr<const DartSnapshot> p_isolate_snapshot,
--    fml::RefPtr<const DartSnapshot> p_shared_snapshot,
-     TaskRunners p_task_runners,
-     fml::WeakPtr<IOManager> p_io_manager,
-     fml::WeakPtr<ImageDecoder> p_image_decoder,
-@@ -61,7 +58,6 @@ RuntimeController::RuntimeController(
-     : client_(p_client),
-       vm_(p_vm),
-       isolate_snapshot_(std::move(p_isolate_snapshot)),
--      shared_snapshot_(std::move(p_shared_snapshot)),
-       task_runners_(p_task_runners),
-       io_manager_(p_io_manager),
-       image_decoder_(p_image_decoder),
-@@ -78,7 +74,6 @@ RuntimeController::RuntimeController(
-   auto strong_root_isolate =
-       DartIsolate::CreateRootIsolate(vm_->GetVMData()->GetSettings(),  //
-                                      isolate_snapshot_,                //
--                                     shared_snapshot_,                 //
-                                      task_runners_,                    //
-                                      std::make_unique<Window>(this),   //
-                                      io_manager_,                      //
-@@ -139,7 +134,6 @@ std::unique_ptr<RuntimeController> RuntimeController::Clone() const {
-       client_,                      //
-       vm_,                          //
-       isolate_snapshot_,            //
--      shared_snapshot_,             //
-       task_runners_,                //
-       io_manager_,                  //
-       image_decoder_,               //
-diff --git a/runtime/runtime_controller.h b/runtime/runtime_controller.h
-index 665f0e17dbb5..98a87f6f5d09 100644
---- a/runtime/runtime_controller.h
-+++ b/runtime/runtime_controller.h
-@@ -32,7 +32,6 @@ class RuntimeController final : public WindowClient {
-       RuntimeDelegate& client,
-       DartVM* vm,
-       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--      fml::RefPtr<const DartSnapshot> shared_snapshot,
-       TaskRunners task_runners,
-       fml::WeakPtr<IOManager> io_manager,
-       fml::WeakPtr<ImageDecoder> iamge_decoder,
-@@ -128,7 +127,6 @@ class RuntimeController final : public WindowClient {
-   RuntimeDelegate& client_;
-   DartVM* const vm_;
-   fml::RefPtr<const DartSnapshot> isolate_snapshot_;
--  fml::RefPtr<const DartSnapshot> shared_snapshot_;
-   TaskRunners task_runners_;
-   fml::WeakPtr<IOManager> io_manager_;
-   fml::WeakPtr<ImageDecoder> image_decoder_;
-@@ -146,7 +144,6 @@ class RuntimeController final : public WindowClient {
-       RuntimeDelegate& client,
-       DartVM* vm,
-       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--      fml::RefPtr<const DartSnapshot> shared_snapshot,
-       TaskRunners task_runners,
-       fml::WeakPtr<IOManager> io_manager,
-       fml::WeakPtr<ImageDecoder> image_decoder,
-diff --git a/shell/common/engine.cc b/shell/common/engine.cc
-index fd424a369eeb..7ad3a432a52c 100644
---- a/shell/common/engine.cc
-+++ b/shell/common/engine.cc
-@@ -39,7 +39,6 @@ Engine::Engine(Delegate& delegate,
-                const PointerDataDispatcherMaker& dispatcher_maker,
-                DartVM& vm,
-                fml::RefPtr<const DartSnapshot> isolate_snapshot,
--               fml::RefPtr<const DartSnapshot> shared_snapshot,
-                TaskRunners task_runners,
-                Settings settings,
-                std::unique_ptr<Animator> animator,
-@@ -61,7 +60,6 @@ Engine::Engine(Delegate& delegate,
-       *this,                                 // runtime delegate
-       &vm,                                   // VM
-       std::move(isolate_snapshot),           // isolate snapshot
--      std::move(shared_snapshot),            // shared snapshot
-       task_runners_,                         // task runners
-       std::move(io_manager),                 // io manager
-       image_decoder_.GetWeakPtr(),           // image decoder
-diff --git a/shell/common/engine.h b/shell/common/engine.h
-index 2e4fd41964bb..dde92dbc6d26 100644
---- a/shell/common/engine.h
-+++ b/shell/common/engine.h
-@@ -249,8 +249,6 @@ class Engine final : public RuntimeDelegate, PointerDataDispatcher::Delegate {
-   ///                                created when the engine is created. This
-   ///                                requires access to the isolate snapshot
-   ///                                upfront.
--  /// @param[in]  shared_snapshot    The portion of the isolate snapshot shared
--  ///                                among multiple isolates.
-   //  TODO(chinmaygarde): This is probably redundant now that the IO manager is
-   //  it's own object.
-   /// @param[in]  task_runners       The task runners used by the shell that
-@@ -276,7 +274,6 @@ class Engine final : public RuntimeDelegate, PointerDataDispatcher::Delegate {
-          const PointerDataDispatcherMaker& dispatcher_maker,
-          DartVM& vm,
-          fml::RefPtr<const DartSnapshot> isolate_snapshot,
--         fml::RefPtr<const DartSnapshot> shared_snapshot,
-          TaskRunners task_runners,
-          Settings settings,
-          std::unique_ptr<Animator> animator,
-diff --git a/shell/common/shell.cc b/shell/common/shell.cc
-index bf185a6b3661..fbc2457d56bd 100644
---- a/shell/common/shell.cc
-+++ b/shell/common/shell.cc
-@@ -45,7 +45,6 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
-     TaskRunners task_runners,
-     Settings settings,
-     fml::RefPtr<const DartSnapshot> isolate_snapshot,
--    fml::RefPtr<const DartSnapshot> shared_snapshot,
-     Shell::CreateCallback<PlatformView> on_create_platform_view,
-     Shell::CreateCallback<Rasterizer> on_create_rasterizer) {
-   if (!task_runners.IsValid()) {
-@@ -124,7 +123,6 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
-                          shell = shell.get(),                             //
-                          &dispatcher_maker,                               //
-                          isolate_snapshot = std::move(isolate_snapshot),  //
--                         shared_snapshot = std::move(shared_snapshot),    //
-                          vsync_waiter = std::move(vsync_waiter),          //
-                          &weak_io_manager_future                          //
-   ]() mutable {
-@@ -141,7 +139,6 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
-             dispatcher_maker,             //
-             *shell->GetDartVM(),          //
-             std::move(isolate_snapshot),  //
--            std::move(shared_snapshot),   //
-             task_runners,                 //
-             shell->GetSettings(),         //
-             std::move(animator),          //
-@@ -227,7 +224,6 @@ std::unique_ptr<Shell> Shell::Create(
-   return Shell::Create(std::move(task_runners),             //
-                        std::move(settings),                 //
-                        vm_data->GetIsolateSnapshot(),       // isolate snapshot
--                       DartSnapshot::Empty(),               // shared snapshot
-                        std::move(on_create_platform_view),  //
-                        std::move(on_create_rasterizer),     //
-                        std::move(vm)                        //
-@@ -238,7 +234,6 @@ std::unique_ptr<Shell> Shell::Create(
-     TaskRunners task_runners,
-     Settings settings,
-     fml::RefPtr<const DartSnapshot> isolate_snapshot,
--    fml::RefPtr<const DartSnapshot> shared_snapshot,
-     Shell::CreateCallback<PlatformView> on_create_platform_view,
-     Shell::CreateCallback<Rasterizer> on_create_rasterizer,
-     DartVMRef vm) {
-@@ -262,7 +257,6 @@ std::unique_ptr<Shell> Shell::Create(
-                          task_runners = std::move(task_runners),          //
-                          settings,                                        //
-                          isolate_snapshot = std::move(isolate_snapshot),  //
--                         shared_snapshot = std::move(shared_snapshot),    //
-                          on_create_platform_view,                         //
-                          on_create_rasterizer                             //
-   ]() mutable {
-@@ -270,7 +264,6 @@ std::unique_ptr<Shell> Shell::Create(
-                                             std::move(task_runners),      //
-                                             settings,                     //
-                                             std::move(isolate_snapshot),  //
--                                            std::move(shared_snapshot),   //
-                                             on_create_platform_view,      //
-                                             on_create_rasterizer          //
-         );
-diff --git a/shell/common/shell.h b/shell/common/shell.h
-index e4ee6960389a..cc3ed8fdc448 100644
---- a/shell/common/shell.h
-+++ b/shell/common/shell.h
-@@ -139,9 +139,6 @@ class Shell final : public PlatformView::Delegate,
-   /// @param[in]  isolate_snapshot         A custom isolate snapshot. Takes
-   ///                                      precedence over any snapshots
-   ///                                      specified in the settings.
--  /// @param[in]  shared_snapshot          A custom shared snapshot. Takes
--  ///                                      precedence over any snapshots
--  ///                                      specified in the settings.
-   /// @param[in]  on_create_platform_view  The callback that must return a
-   ///                                      platform view. This will be called on
-   ///                                      the platform task runner before this
-@@ -164,7 +161,6 @@ class Shell final : public PlatformView::Delegate,
-       TaskRunners task_runners,
-       Settings settings,
-       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--      fml::RefPtr<const DartSnapshot> shared_snapshot,
-       CreateCallback<PlatformView> on_create_platform_view,
-       CreateCallback<Rasterizer> on_create_rasterizer,
-       DartVMRef vm);
-@@ -375,7 +371,6 @@ class Shell final : public PlatformView::Delegate,
-       TaskRunners task_runners,
-       Settings settings,
-       fml::RefPtr<const DartSnapshot> isolate_snapshot,
--      fml::RefPtr<const DartSnapshot> shared_snapshot,
-       Shell::CreateCallback<PlatformView> on_create_platform_view,
-       Shell::CreateCallback<Rasterizer> on_create_rasterizer);
- 
-diff --git a/shell/platform/fuchsia/dart_runner/dart_component_controller.cc b/shell/platform/fuchsia/dart_runner/dart_component_controller.cc
-index 37cef7bce6f7..e5bd774fc4e3 100644
---- a/shell/platform/fuchsia/dart_runner/dart_component_controller.cc
-+++ b/shell/platform/fuchsia/dart_runner/dart_component_controller.cc
-@@ -314,8 +314,7 @@ bool DartComponentController::CreateIsolate(
- 
-   isolate_ = Dart_CreateIsolateGroup(
-       url_.c_str(), label_.c_str(), isolate_snapshot_data,
--      isolate_snapshot_instructions, nullptr /* shared_snapshot_data */,
--      nullptr /* shared_snapshot_instructions */, nullptr /* flags */, state,
-+      isolate_snapshot_instructions, nullptr /* flags */, state,
-       state, &error);
-   if (!isolate_) {
-     FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", error);
-diff --git a/shell/platform/fuchsia/dart_runner/service_isolate.cc b/shell/platform/fuchsia/dart_runner/service_isolate.cc
-index d22c4df286b6..40719ab81c94 100644
---- a/shell/platform/fuchsia/dart_runner/service_isolate.cc
-+++ b/shell/platform/fuchsia/dart_runner/service_isolate.cc
-@@ -107,8 +107,7 @@ Dart_Isolate CreateServiceIsolate(const char* uri,
-   Dart_Isolate isolate = Dart_CreateIsolateGroup(
-       uri, DART_VM_SERVICE_ISOLATE_NAME, mapped_isolate_snapshot_data.address(),
-       mapped_isolate_snapshot_instructions.address(),
--      nullptr /* shared_snapshot_data */,
--      nullptr /* shared_snapshot_instructions */, nullptr /* flags */, state,
-+      nullptr /* flags */, state,
-       state, error);
-   if (!isolate) {
-     FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", *error);
-diff --git a/shell/platform/fuchsia/flutter/engine.cc b/shell/platform/fuchsia/flutter/engine.cc
-index 75dbf497b8d8..d002049996df 100644
---- a/shell/platform/fuchsia/flutter/engine.cc
-+++ b/shell/platform/fuchsia/flutter/engine.cc
-@@ -227,7 +227,6 @@ Engine::Engine(Delegate& delegate,
-         task_runners,                    // host task runners
-         settings_,                       // shell launch settings
-         std::move(isolate_snapshot),     // isolate snapshot
--        flutter::DartSnapshot::Empty(),  // shared snapshot
-         on_create_platform_view,         // platform view create callback
-         on_create_rasterizer,            // rasterizer create callback
-         std::move(vm)                    // vm reference
diff --git a/tools/patches/flutter-engine/b48c8b1d1c9050734c0491f4e36b7d61ef005233.patch b/tools/patches/flutter-engine/b48c8b1d1c9050734c0491f4e36b7d61ef005233.patch
deleted file mode 100644
index 1e357de..0000000
--- a/tools/patches/flutter-engine/b48c8b1d1c9050734c0491f4e36b7d61ef005233.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/frontend_server/lib/server.dart b/frontend_server/lib/server.dart
-index 44a3d69b9..9620a5de0 100644
---- a/frontend_server/lib/server.dart
-+++ b/frontend_server/lib/server.dart
-@@ -85,11 +85,6 @@ Future<int> starter(
-       StringSink output,
-     }) async {
-   ArgResults options;
--  frontend.argParser
--    ..addFlag('track-widget-creation',
--      help: 'Run a kernel transformer to track creation locations for widgets.',
--      defaultsTo: false);
--
-   try {
-     options = frontend.argParser.parse(args);
-   } catch (error) {
diff --git a/tools/patches/flutter-engine/cb80ea7ba9124fd42a34c1d021232113e20d21b1.patch b/tools/patches/flutter-engine/cb80ea7ba9124fd42a34c1d021232113e20d21b1.patch
deleted file mode 100644
index 6151279..0000000
--- a/tools/patches/flutter-engine/cb80ea7ba9124fd42a34c1d021232113e20d21b1.patch
+++ /dev/null
@@ -1,1305 +0,0 @@
-diff --git a/lib/snapshot/libraries.json b/lib/snapshot/libraries.json
-index b6ffcef58..c4783158b 100644
---- a/lib/snapshot/libraries.json
-+++ b/lib/snapshot/libraries.json
-@@ -4,69 +4,69 @@
-   "flutter": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../third_party/dart/runtime/lib/array.dart",
--          "../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../third_party/dart/runtime/lib/double.dart",
--          "../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../third_party/dart/runtime/lib/function.dart",
--          "../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-       "async": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -74,24 +74,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -100,48 +100,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-diff --git a/lib/snapshot/libraries.yaml b/lib/snapshot/libraries.yaml
-index 392e0500b..7269819f7 100644
---- a/lib/snapshot/libraries.yaml
-+++ b/lib/snapshot/libraries.yaml
-@@ -14,87 +14,87 @@
- flutter:
-   libraries:
-     _builtin:
--      uri: "../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ flutter:
-     io:
-       uri: "../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ flutter:
- 
-     typed_data:
-       uri: "../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     ui:
-       uri: "../../lib/ui/ui.dart"
-diff --git a/shell/platform/fuchsia/dart_runner/kernel/libraries.json b/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-index 0abe212e6..24c664852 100644
---- a/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-+++ b/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-@@ -1,43 +1,43 @@
- {
-   "comment:0": "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.",
--  "comment:1": "Instead modify 'shell/platform/fuchsia/dart_runner/kernel/libraries.yaml' and follow the instructions therein.",
-+  "comment:1": "Instead modify 'flutter/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml' and follow the instructions therein.",
-   "dart_runner": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/array.dart",
--          "../../../../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/double.dart",
--          "../../../../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/function.dart",
--          "../../../../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-@@ -46,30 +46,30 @@
-       },
-       "async": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -77,24 +77,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -103,48 +103,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-diff --git a/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml b/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-index cab901e60..5e1f638cd 100644
---- a/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-+++ b/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-@@ -14,87 +14,87 @@
- dart_runner:
-   libraries:
-     _builtin:
--      uri: "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ dart_runner:
-     io:
-       uri: "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ dart_runner:
- 
-     typed_data:
-       uri: "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     fuchsia.builtin:
-       uri: "../../../../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart"
-diff --git a/shell/platform/fuchsia/flutter/kernel/libraries.json b/shell/platform/fuchsia/flutter/kernel/libraries.json
-index 5a4602d8c..a8436200f 100644
---- a/shell/platform/fuchsia/flutter/kernel/libraries.json
-+++ b/shell/platform/fuchsia/flutter/kernel/libraries.json
-@@ -1,43 +1,43 @@
- {
-   "comment:0": "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.",
--  "comment:1": "Instead modify 'shell/platform/fuchsia/flutter/kernel/libraries.yaml' and follow the instructions therein.",
-+  "comment:1": "Instead modify 'flutter/shell/platform/fuchsia/flutter/kernel/libraries.yaml' and follow the instructions therein.",
-   "flutter_runner": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/array.dart",
--          "../../../../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/double.dart",
--          "../../../../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/function.dart",
--          "../../../../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-@@ -46,30 +46,30 @@
-       },
-       "async": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -77,24 +77,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -103,48 +103,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-@@ -160,7 +160,7 @@
-         "uri": "../../../../../../flutter/lib/ui/ui.dart"
-       },
-       "vmservice_io": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/vmservice/vmservice_io.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/vmservice/vmservice_io.dart"
-       }
-     }
-   }
-diff --git a/shell/platform/fuchsia/flutter/kernel/libraries.yaml b/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-index f8385ca29..05b7f4f9f 100644
---- a/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-+++ b/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-@@ -14,87 +14,87 @@
- flutter_runner:
-   libraries:
-     _builtin:
--      uri: "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ flutter_runner:
-     io:
-       uri: "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ flutter_runner:
- 
-     typed_data:
-       uri: "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     fuchsia.builtin:
-       uri: "../../../../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart"
-@@ -160,4 +160,4 @@ flutter_runner:
-       uri: "../../../../../../third_party/dart/sdk/lib/vmservice/vmservice.dart"
- 
-     vmservice_io:
--      uri: "../../../../../../third_party/dart/runtime/bin/vmservice/vmservice_io.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/vmservice/vmservice_io.dart"
diff --git a/tools/patches/flutter-engine/e7e45599cb1a74ff88d7d00a33f25029e42df757.patch b/tools/patches/flutter-engine/e7e45599cb1a74ff88d7d00a33f25029e42df757.patch
new file mode 100644
index 0000000..2ae1b31
--- /dev/null
+++ b/tools/patches/flutter-engine/e7e45599cb1a74ff88d7d00a33f25029e42df757.patch
@@ -0,0 +1,32 @@
+diff --git a/third_party/tonic/dart_persistent_value.cc b/third_party/tonic/dart_persistent_value.cc
+index 9ed6f70f3532..3bc46505d31f 100644
+--- a/third_party/tonic/dart_persistent_value.cc
++++ b/third_party/tonic/dart_persistent_value.cc
+@@ -43,8 +43,12 @@ void DartPersistentValue::Clear() {
+     return;
+   }
+ 
+-  DartIsolateScope scope(dart_state->isolate());
+-  Dart_DeletePersistentHandle(value_);
++  if (Dart_CurrentIsolateGroup()) {
++    Dart_DeletePersistentHandle(value_);
++  } else {
++    DartIsolateScope scope(dart_state->isolate());
++    Dart_DeletePersistentHandle(value_);
++  }
+   dart_state_.reset();
+   value_ = nullptr;
+ }
+diff --git a/third_party/tonic/dart_wrappable.cc b/third_party/tonic/dart_wrappable.cc
+index 42c8fff2805b..89064ac8eef7 100644
+--- a/third_party/tonic/dart_wrappable.cc
++++ b/third_party/tonic/dart_wrappable.cc
+@@ -37,7 +37,7 @@ void DartWrappable::ClearDartWrapper() {
+   TONIC_CHECK(!LogIfError(Dart_SetNativeInstanceField(wrapper, kPeerIndex, 0)));
+   TONIC_CHECK(
+       !LogIfError(Dart_SetNativeInstanceField(wrapper, kWrapperInfoIndex, 0)));
+-  Dart_DeleteWeakPersistentHandle(Dart_CurrentIsolate(), dart_wrapper_);
++  Dart_DeleteWeakPersistentHandle(dart_wrapper_);
+   dart_wrapper_ = nullptr;
+   this->ReleaseDartWrappableReference();
+ }
diff --git a/tools/patches/flutter-engine/ea969c358e24f71b865d5f720c0c1c8456a53bad.patch b/tools/patches/flutter-engine/ea969c358e24f71b865d5f720c0c1c8456a53bad.patch
deleted file mode 100644
index 6151279..0000000
--- a/tools/patches/flutter-engine/ea969c358e24f71b865d5f720c0c1c8456a53bad.patch
+++ /dev/null
@@ -1,1305 +0,0 @@
-diff --git a/lib/snapshot/libraries.json b/lib/snapshot/libraries.json
-index b6ffcef58..c4783158b 100644
---- a/lib/snapshot/libraries.json
-+++ b/lib/snapshot/libraries.json
-@@ -4,69 +4,69 @@
-   "flutter": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../third_party/dart/runtime/lib/array.dart",
--          "../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../third_party/dart/runtime/lib/double.dart",
--          "../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../third_party/dart/runtime/lib/function.dart",
--          "../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-       "async": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -74,24 +74,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -100,48 +100,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-diff --git a/lib/snapshot/libraries.yaml b/lib/snapshot/libraries.yaml
-index 392e0500b..7269819f7 100644
---- a/lib/snapshot/libraries.yaml
-+++ b/lib/snapshot/libraries.yaml
-@@ -14,87 +14,87 @@
- flutter:
-   libraries:
-     _builtin:
--      uri: "../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ flutter:
-     io:
-       uri: "../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ flutter:
- 
-     typed_data:
-       uri: "../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     ui:
-       uri: "../../lib/ui/ui.dart"
-diff --git a/shell/platform/fuchsia/dart_runner/kernel/libraries.json b/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-index 0abe212e6..24c664852 100644
---- a/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-+++ b/shell/platform/fuchsia/dart_runner/kernel/libraries.json
-@@ -1,43 +1,43 @@
- {
-   "comment:0": "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.",
--  "comment:1": "Instead modify 'shell/platform/fuchsia/dart_runner/kernel/libraries.yaml' and follow the instructions therein.",
-+  "comment:1": "Instead modify 'flutter/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml' and follow the instructions therein.",
-   "dart_runner": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/array.dart",
--          "../../../../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/double.dart",
--          "../../../../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/function.dart",
--          "../../../../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-@@ -46,30 +46,30 @@
-       },
-       "async": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -77,24 +77,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -103,48 +103,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-diff --git a/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml b/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-index cab901e60..5e1f638cd 100644
---- a/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-+++ b/shell/platform/fuchsia/dart_runner/kernel/libraries.yaml
-@@ -14,87 +14,87 @@
- dart_runner:
-   libraries:
-     _builtin:
--      uri: "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ dart_runner:
-     io:
-       uri: "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ dart_runner:
- 
-     typed_data:
-       uri: "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     fuchsia.builtin:
-       uri: "../../../../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart"
-diff --git a/shell/platform/fuchsia/flutter/kernel/libraries.json b/shell/platform/fuchsia/flutter/kernel/libraries.json
-index 5a4602d8c..a8436200f 100644
---- a/shell/platform/fuchsia/flutter/kernel/libraries.json
-+++ b/shell/platform/fuchsia/flutter/kernel/libraries.json
-@@ -1,43 +1,43 @@
- {
-   "comment:0": "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.",
--  "comment:1": "Instead modify 'shell/platform/fuchsia/flutter/kernel/libraries.yaml' and follow the instructions therein.",
-+  "comment:1": "Instead modify 'flutter/shell/platform/fuchsia/flutter/kernel/libraries.yaml' and follow the instructions therein.",
-   "flutter_runner": {
-     "libraries": {
-       "_builtin": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
-       },
-       "core": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/core_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/array.dart",
--          "../../../../../../third_party/dart/runtime/lib/array_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/bool_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/date_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/double.dart",
--          "../../../../../../third_party/dart/runtime/lib/double_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/errors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/expando_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/function.dart",
--          "../../../../../../third_party/dart/runtime/lib/function_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/growable_array.dart",
--          "../../../../../../third_party/dart/runtime/lib/identical_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/immutable_map.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers.dart",
--          "../../../../../../third_party/dart/runtime/lib/integers_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart",
--          "../../../../../../third_party/dart/runtime/lib/map_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/null_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/object_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/stacktrace.dart",
--          "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/string_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/uri_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       },
-@@ -46,30 +46,30 @@
-       },
-       "async": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/async_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       },
-       "collection": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/collection_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       },
-       "ffi": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       },
-       "typed_data": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
-       },
-       "nativewrappers": {
-@@ -77,24 +77,24 @@
-       },
-       "mirrors": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart",
--          "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       },
-       "developer": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/developer.dart",
--          "../../../../../../third_party/dart/runtime/lib/profiler.dart",
--          "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       },
-       "isolate": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       },
-@@ -103,48 +103,48 @@
-       },
-       "wasm": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       },
-       "io": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/bin/common_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/directory_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/filter_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/platform_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/process_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart",
--          "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       },
-       "_internal": {
-         "patches": [
--          "../../../../../../third_party/dart/runtime/lib/internal_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart",
--          "../../../../../../third_party/dart/runtime/lib/print_patch.dart",
--          "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart",
-+          "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart",
-           "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
-         ],
-         "uri": "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       },
-       "convert": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/convert_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
-       },
-       "profiler": {
-         "uri": "../../../../../../third_party/dart/sdk/lib/profiler/profiler.dart"
-       },
-       "math": {
--        "patches": "../../../../../../third_party/dart/runtime/lib/math_patch.dart",
-+        "patches": "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart",
-         "uri": "../../../../../../third_party/dart/sdk/lib/math/math.dart"
-       },
-       "_http": {
-@@ -160,7 +160,7 @@
-         "uri": "../../../../../../flutter/lib/ui/ui.dart"
-       },
-       "vmservice_io": {
--        "uri": "../../../../../../third_party/dart/runtime/bin/vmservice/vmservice_io.dart"
-+        "uri": "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/vmservice/vmservice_io.dart"
-       }
-     }
-   }
-diff --git a/shell/platform/fuchsia/flutter/kernel/libraries.yaml b/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-index f8385ca29..05b7f4f9f 100644
---- a/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-+++ b/shell/platform/fuchsia/flutter/kernel/libraries.yaml
-@@ -14,87 +14,87 @@
- flutter_runner:
-   libraries:
-     _builtin:
--      uri: "../../../../../../third_party/dart/runtime/bin/builtin.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/builtin.dart"
- 
-     _internal:
-       uri: "../../../../../../third_party/dart/sdk/lib/internal/internal.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/internal_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/class_id_fasta.dart"
--        - "../../../../../../third_party/dart/runtime/lib/print_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/symbol_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/internal_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/class_id_fasta.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/print_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/symbol_patch.dart"
-         - "../../../../../../third_party/dart/sdk/lib/internal/patch.dart"
- 
-     async:
-       uri: "../../../../../../third_party/dart/sdk/lib/async/async.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/async_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/deferred_load_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/schedule_microtask_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/async_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/deferred_load_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_patch.dart"
- 
-     collection:
-       uri: "../../../../../../third_party/dart/sdk/lib/collection/collection.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/collection_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/compact_hash.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/collection_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/compact_hash.dart"
- 
-     convert:
-       uri: "../../../../../../third_party/dart/sdk/lib/convert/convert.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/convert_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/convert_patch.dart"
- 
-     core:
-       uri: "../../../../../../third_party/dart/sdk/lib/core/core.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/core_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/array_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bigint_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/bool_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/date_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double.dart"
--        - "../../../../../../third_party/dart/runtime/lib/double_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/errors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/expando_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function.dart"
--        - "../../../../../../third_party/dart/runtime/lib/function_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/growable_array.dart"
--        - "../../../../../../third_party/dart/runtime/lib/identical_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/immutable_map.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers.dart"
--        - "../../../../../../third_party/dart/runtime/lib/integers_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/invocation_mirror_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/lib_prefix.dart"
--        - "../../../../../../third_party/dart/runtime/lib/map_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/null_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/object_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/regexp_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stacktrace.dart"
--        - "../../../../../../third_party/dart/runtime/lib/stopwatch_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_buffer_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/string_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/uri_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/weak_property.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/core_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/array_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bigint_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/bool_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/date_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/double_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/errors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/expando_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/function_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/identical_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/immutable_map.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/integers_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/invocation_mirror_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/lib_prefix.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/map_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/null_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/object_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/regexp_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stacktrace.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/stopwatch_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_buffer_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/string_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/uri_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/weak_property.dart"
- 
-     developer:
-       uri: "../../../../../../third_party/dart/sdk/lib/developer/developer.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/developer.dart"
--        - "../../../../../../third_party/dart/runtime/lib/profiler.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timeline.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/developer.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/profiler.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timeline.dart"
- 
-     ffi:
-       uri: "../../../../../../third_party/dart/sdk/lib/ffi/ffi.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/ffi_dynamic_library_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_native_type_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/ffi_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/ffi_patch.dart"
- 
-     wasm:
-       uri: "../../../../../../third_party/dart/sdk/lib/wasm/wasm.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/wasm_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/wasm_patch.dart"
- 
-     _http:
-       uri: "../../../../../../third_party/dart/sdk/lib/_http/http.dart"
-@@ -102,37 +102,37 @@ flutter_runner:
-     io:
-       uri: "../../../../../../third_party/dart/sdk/lib/io/io.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/bin/common_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/directory_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/eventhandler_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/file_system_entity_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/filter_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/io_service_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/namespace_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/platform_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/process_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/stdio_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/secure_socket_patch.dart"
--        - "../../../../../../third_party/dart/runtime/bin/sync_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/common_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/directory_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/eventhandler_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/file_system_entity_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/filter_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/io_service_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/namespace_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/platform_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/process_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/stdio_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/secure_socket_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/sync_socket_patch.dart"
- 
-     isolate:
-       uri: "../../../../../../third_party/dart/sdk/lib/isolate/isolate.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/isolate_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/timer_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/isolate_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/timer_impl.dart"
- 
-     math:
-       uri: "../../../../../../third_party/dart/sdk/lib/math/math.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/math_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/math_patch.dart"
- 
-     mirrors:
-       uri: "../../../../../../third_party/dart/sdk/lib/mirrors/mirrors.dart"
-       patches:
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_patch.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirrors_impl.dart"
--        - "../../../../../../third_party/dart/runtime/lib/mirror_reference.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_patch.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirrors_impl.dart"
-+        - "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/mirror_reference.dart"
- 
-     nativewrappers:
-       uri: "../../../../../../third_party/dart/sdk/lib/html/dartium/nativewrappers.dart"
-@@ -142,7 +142,7 @@ flutter_runner:
- 
-     typed_data:
-       uri: "../../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart"
--      patches: "../../../../../../third_party/dart/runtime/lib/typed_data_patch.dart"
-+      patches: "../../../../../../third_party/dart/sdk/lib/_internal/vm/lib/typed_data_patch.dart"
- 
-     fuchsia.builtin:
-       uri: "../../../../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart"
-@@ -160,4 +160,4 @@ flutter_runner:
-       uri: "../../../../../../third_party/dart/sdk/lib/vmservice/vmservice.dart"
- 
-     vmservice_io:
--      uri: "../../../../../../third_party/dart/runtime/bin/vmservice/vmservice_io.dart"
-+      uri: "../../../../../../third_party/dart/sdk/lib/_internal/vm/bin/vmservice/vmservice_io.dart"
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index ad4aec0..7878730 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -299,8 +299,7 @@
         _toUri(parsedArgs['dart-sdk-summary']),
         _toUri(parsedArgs['libraries-file']),
         _toUri(parsedArgs['packages-file']),
-        summaryInputs,
-        linkedInputs,
+        [...summaryInputs, ...linkedInputs],
         target,
         fileSystem,
         parsedArgs['enable-experiment'] as List<String>,
diff --git a/utils/dartdev/BUILD.gn b/utils/dartdev/BUILD.gn
index e41e7a4..495643d 100644
--- a/utils/dartdev/BUILD.gn
+++ b/utils/dartdev/BUILD.gn
@@ -11,8 +11,15 @@
                             ],
                             "list lines")
 
+dartfix_files = exec_script("../../tools/list_dart_files.py",
+                            [
+                              "absolute",
+                              rebase_path("../../pkg/dartfix"),
+                            ],
+                            "list lines")
+
 application_snapshot("dartdev") {
   main_dart = "../../pkg/dartdev/bin/dartdev.dart"
   training_args = [ "--help" ]
-  inputs = dartdev_files
+  inputs = dartdev_files + dartfix_files
 }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 221f9f1..ec13940 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -370,7 +370,7 @@
 
   # TODO(38701): Cleanup after merging the forked SDK into mainline.
   if (use_nnbd) {
-    args += [ "--enable-experiment=non-nullable" ]
+    args += [ "--enable-experiment=non-nullable", "--force-nnbd-checks" ]
   }
 }